Skip to content

Commit fb3db0f

Browse files
authored
Merge pull request #6 from youknowone/by-cpython
how to contribute by cpython unittest
2 parents c898e91 + 2805ff2 commit fb3db0f

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
---
2+
layout: post
3+
title: "How to contribute to RustPython by CPython unittest"
4+
date: 2020-04-05 01:45:00 +0900
5+
categories: guideline
6+
---
7+
8+
At the very end of 2019, we finally reached one of the short-term goals: CPython unittest support. Due to this enhancement, finding CPython compatibility is easier than before.
9+
Probably this will be the major source of contribution spots for the new contributors this year. Here is a simple guideline.
10+
11+
## Fix known compatibility bugs
12+
Let's find an incompatibility issue and fix it.
13+
14+
1. See `Lib/test` directory of the project. There are many `test_` prefixed files like `test_unicode.py`.
15+
2. Try to open one of them. It might look just fine at a glance - but search for `TODO: RUSTPYTHON` in the files. There are tons of skipped, marked as an expected failure or commented out tests.
16+
3. Choose one or two interesting bugs. Remove the test blocker - skip, expectedFailure or comments.
17+
4. Try to fix them.
18+
19+
Here is a quick tip to run single unittest file.
20+
21+
```sh
22+
$ RUSTPYTHONPATH=Lib cargo run --release Lib/test/test_unicode.py
23+
```
24+
25+
## Add a new unittest file
26+
Because CPython unittest is not perfectly working in RustPython, we are doing this one by one with editings.
27+
1. Download CPython source code.
28+
2. Check out a specific version of CPython. For now, 3.8.2 is recommended. (We are testing against CPython 3.8 and 3.8.2 is the most recent version for now)
29+
3. Copy a file from CPython `Lib/test`
30+
4. Commit the file without editing. Specify copied CPython version to commit message.
31+
5. Try to edit it until it runs without a crash or failure.
32+
6. Commit the changes to make it run. This is the core contribution.
33+
34+
Because RustPython is not perfect, "try to edit it until it runs" doesn't mean to make 100% successful running. The common editing methods here:
35+
1. At least it must be able to start to run the test. Fix the test code or bug until it runs at least a single unit of the test. Typically, unimplemented stdlib or missing files of unittest can make issues. Sometimes RustPython bugs make issues too.
36+
2. If any test is not loadable by `SyntaxError`, that part is required to be commented out.
37+
3. If any test leads to a crash of RustPython, this code is not possible to run. Mark the test to skip.
38+
4. If any test is run but fails, this is an incompatibility issue. Mark the test as an expected failure.
39+
40+
We prefer the reversed order of upper methods. The later the more strict so easy to detect any progress or regression.
41+
When we temporarily disable parts of unittest due to RustPython caveats, we mark them to find it out easily later. Please check the examples below or search for `TODO: RUSTPYTHON` in `Lib/test` directory to check actual usage.
42+
43+
Comment out:
44+
```python
45+
# TODO: RUSTPYTHON
46+
#
47+
# def ... # commented out tests
48+
```
49+
50+
skip:
51+
```python
52+
@unittest.skip("TODO: RUSTPYTHON")
53+
def ... # skipped tests
54+
```
55+
56+
expectedFailure:
57+
```python
58+
# TODO: RUSTPYTHON
59+
@unittest.expectedFailure
60+
def ... # failed tests
61+
```
62+
63+
## Development guide
64+
For the general source of the development, please visit the [RustPython development guide](https://github.com/RustPython/RustPython/blob/master/DEVELOPMENT.md)

0 commit comments

Comments
 (0)