CONTRIBUTING.rst (20364B)
1 ============================ 2 Contribution getting started 3 ============================ 4 5 Contributions are highly welcomed and appreciated. Every little bit of help counts, 6 so do not hesitate! 7 8 .. contents:: 9 :depth: 2 10 :backlinks: none 11 12 13 .. _submitfeedback: 14 15 Feature requests and feedback 16 ----------------------------- 17 18 Do you like pytest? Share some love on Twitter or in your blog posts! 19 20 We'd also like to hear about your propositions and suggestions. Feel free to 21 `submit them as issues <https://github.com/pytest-dev/pytest/issues>`_ and: 22 23 * Explain in detail how they should work. 24 * Keep the scope as narrow as possible. This will make it easier to implement. 25 26 27 .. _reportbugs: 28 29 Report bugs 30 ----------- 31 32 Report bugs for pytest in the `issue tracker <https://github.com/pytest-dev/pytest/issues>`_. 33 34 If you are reporting a bug, please include: 35 36 * Your operating system name and version. 37 * Any details about your local setup that might be helpful in troubleshooting, 38 specifically the Python interpreter version, installed libraries, and pytest 39 version. 40 * Detailed steps to reproduce the bug. 41 42 If you can write a demonstration test that currently fails but should pass 43 (xfail), that is a very useful commit to make as well, even if you cannot 44 fix the bug itself. 45 46 47 .. _fixbugs: 48 49 Fix bugs 50 -------- 51 52 Look through the `GitHub issues for bugs <https://github.com/pytest-dev/pytest/labels/type:%20bug>`_. 53 See also the `"good first issue" issues <https://github.com/pytest-dev/pytest/labels/good%20first%20issue>`_ 54 that are friendly to new contributors. 55 56 :ref:`Talk <contact>` to developers to find out how you can fix specific bugs. To indicate that you are going 57 to work on a particular issue, add a comment to that effect on the specific issue. 58 59 Don't forget to check the issue trackers of your favourite plugins, too! 60 61 .. _writeplugins: 62 63 Implement features 64 ------------------ 65 66 Look through the `GitHub issues for enhancements <https://github.com/pytest-dev/pytest/labels/type:%20enhancement>`_. 67 68 :ref:`Talk <contact>` to developers to find out how you can implement specific 69 features. 70 71 Write documentation 72 ------------------- 73 74 Pytest could always use more documentation. What exactly is needed? 75 76 * More complementary documentation. Have you perhaps found something unclear? 77 * Documentation translations. We currently have only English. 78 * Docstrings. There can never be too many of them. 79 * Blog posts, articles and such -- they're all very appreciated. 80 81 You can also edit documentation files directly in the GitHub web interface, 82 without using a local copy. This can be convenient for small fixes. 83 84 .. note:: 85 Build the documentation locally with the following command: 86 87 .. code:: bash 88 89 $ tox -e docs 90 91 The built documentation should be available in ``doc/en/_build/html``, 92 where 'en' refers to the documentation language. 93 94 Pytest has an API reference which in large part is 95 `generated automatically <https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html>`_ 96 from the docstrings of the documented items. Pytest uses the 97 `Sphinx docstring format <https://sphinx-rtd-tutorial.readthedocs.io/en/latest/docstrings.html>`_. 98 For example: 99 100 .. code-block:: python 101 102 def my_function(arg: ArgType) -> Foo: 103 """Do important stuff. 104 105 More detailed info here, in separate paragraphs from the subject line. 106 Use proper sentences -- start sentences with capital letters and end 107 with periods. 108 109 Can include annotated documentation: 110 111 :param short_arg: An argument which determines stuff. 112 :param long_arg: 113 A long explanation which spans multiple lines, overflows 114 like this. 115 :returns: The result. 116 :raises ValueError: 117 Detailed information when this can happen. 118 119 .. versionadded:: 6.0 120 121 Including types into the annotations above is not necessary when 122 type-hinting is being used (as in this example). 123 """ 124 125 126 .. _submitplugin: 127 128 Submitting Plugins to pytest-dev 129 -------------------------------- 130 131 Pytest development of the core, some plugins and support code happens 132 in repositories living under the ``pytest-dev`` organisations: 133 134 - `pytest-dev on GitHub <https://github.com/pytest-dev>`_ 135 136 All pytest-dev Contributors team members have write access to all contained 137 repositories. Pytest core and plugins are generally developed 138 using `pull requests`_ to respective repositories. 139 140 The objectives of the ``pytest-dev`` organisation are: 141 142 * Having a central location for popular pytest plugins 143 * Sharing some of the maintenance responsibility (in case a maintainer no 144 longer wishes to maintain a plugin) 145 146 You can submit your plugin by subscribing to the `pytest-dev mail list 147 <https://mail.python.org/mailman/listinfo/pytest-dev>`_ and writing a 148 mail pointing to your existing pytest plugin repository which must have 149 the following: 150 151 - PyPI presence with packaging metadata that contains a ``pytest-`` 152 prefixed name, version number, authors, short and long description. 153 154 - a `tox configuration <https://tox.readthedocs.io/en/latest/config.html#configuration-discovery>`_ 155 for running tests using `tox <https://tox.readthedocs.io>`_. 156 157 - a ``README`` describing how to use the plugin and on which 158 platforms it runs. 159 160 - a ``LICENSE`` file containing the licensing information, with 161 matching info in its packaging metadata. 162 163 - an issue tracker for bug reports and enhancement requests. 164 165 - a `changelog <https://keepachangelog.com/>`_. 166 167 If no contributor strongly objects and two agree, the repository can then be 168 transferred to the ``pytest-dev`` organisation. 169 170 Here's a rundown of how a repository transfer usually proceeds 171 (using a repository named ``joedoe/pytest-xyz`` as example): 172 173 * ``joedoe`` transfers repository ownership to ``pytest-dev`` administrator ``calvin``. 174 * ``calvin`` creates ``pytest-xyz-admin`` and ``pytest-xyz-developers`` teams, inviting ``joedoe`` to both as **maintainer**. 175 * ``calvin`` transfers repository to ``pytest-dev`` and configures team access: 176 177 - ``pytest-xyz-admin`` **admin** access; 178 - ``pytest-xyz-developers`` **write** access; 179 180 The ``pytest-dev/Contributors`` team has write access to all projects, and 181 every project administrator is in it. We recommend that each plugin has at least three 182 people who have the right to release to PyPI. 183 184 Repository owners can rest assured that no ``pytest-dev`` administrator will ever make 185 releases of your repository or take ownership in any way, except in rare cases 186 where someone becomes unresponsive after months of contact attempts. 187 As stated, the objective is to share maintenance and avoid "plugin-abandon". 188 189 190 .. _`pull requests`: 191 .. _pull-requests: 192 193 Preparing Pull Requests 194 ----------------------- 195 196 Short version 197 ~~~~~~~~~~~~~ 198 199 #. Fork the repository. 200 #. Fetch tags from upstream if necessary (if you cloned only main `git fetch --tags https://github.com/pytest-dev/pytest`). 201 #. Enable and install `pre-commit <https://pre-commit.com>`_ to ensure style-guides and code checks are followed. 202 #. Follow `PEP-8 <https://www.python.org/dev/peps/pep-0008/>`_ for naming. 203 #. Tests are run using ``tox``:: 204 205 tox -e linting,py39 206 207 The test environments above are usually enough to cover most cases locally. 208 209 #. Write a ``changelog`` entry: ``changelog/2574.bugfix.rst``, use issue id number 210 and one of ``feature``, ``improvement``, ``bugfix``, ``doc``, ``deprecation``, 211 ``breaking``, ``vendor`` or ``trivial`` for the issue type. 212 213 214 #. Unless your change is a trivial or a documentation fix (e.g., a typo or reword of a small section) please 215 add yourself to the ``AUTHORS`` file, in alphabetical order. 216 217 218 Long version 219 ~~~~~~~~~~~~ 220 221 What is a "pull request"? It informs the project's core developers about the 222 changes you want to review and merge. Pull requests are stored on 223 `GitHub servers <https://github.com/pytest-dev/pytest/pulls>`_. 224 Once you send a pull request, we can discuss its potential modifications and 225 even add more commits to it later on. There's an excellent tutorial on how Pull 226 Requests work in the 227 `GitHub Help Center <https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests>`_. 228 229 Here is a simple overview, with pytest-specific bits: 230 231 #. Fork the 232 `pytest GitHub repository <https://github.com/pytest-dev/pytest>`__. It's 233 fine to use ``pytest`` as your fork repository name because it will live 234 under your user. 235 236 #. Clone your fork locally using `git <https://git-scm.com/>`_ and create a branch:: 237 238 $ git clone git@github.com:YOUR_GITHUB_USERNAME/pytest.git 239 $ cd pytest 240 $ git fetch --tags https://github.com/pytest-dev/pytest 241 # now, create your own branch off "main": 242 243 $ git checkout -b your-bugfix-branch-name main 244 245 Given we have "major.minor.micro" version numbers, bug fixes will usually 246 be released in micro releases whereas features will be released in 247 minor releases and incompatible changes in major releases. 248 249 You will need the tags to test locally, so be sure you have the tags from the main repository. If you suspect you don't, set the main repository as upstream and fetch the tags:: 250 251 $ git remote add upstream https://github.com/pytest-dev/pytest 252 $ git fetch upstream --tags 253 254 If you need some help with Git, follow this quick start 255 guide: https://git.wiki.kernel.org/index.php/QuickStart 256 257 #. Install `pre-commit <https://pre-commit.com>`_ and its hook on the pytest repo:: 258 259 $ pip install --user pre-commit 260 $ pre-commit install 261 262 Afterwards ``pre-commit`` will run whenever you commit. 263 264 https://pre-commit.com/ is a framework for managing and maintaining multi-language pre-commit hooks 265 to ensure code-style and code formatting is consistent. 266 267 #. Install tox 268 269 Tox is used to run all the tests and will automatically setup virtualenvs 270 to run the tests in. 271 (will implicitly use https://virtualenv.pypa.io/en/latest/):: 272 273 $ pip install tox 274 275 #. Run all the tests 276 277 You need to have Python 3.8 or later available in your system. Now 278 running tests is as simple as issuing this command:: 279 280 $ tox -e linting,py39 281 282 This command will run tests via the "tox" tool against Python 3.9 283 and also perform "lint" coding-style checks. 284 285 #. You can now edit your local working copy and run the tests again as necessary. Please follow `PEP-8 <https://www.python.org/dev/peps/pep-0008/>`_ for naming. 286 287 You can pass different options to ``tox``. For example, to run tests on Python 3.9 and pass options to pytest 288 (e.g. enter pdb on failure) to pytest you can do:: 289 290 $ tox -e py39 -- --pdb 291 292 Or to only run tests in a particular test module on Python 3.9:: 293 294 $ tox -e py39 -- testing/test_config.py 295 296 297 When committing, ``pre-commit`` will re-format the files if necessary. 298 299 #. If instead of using ``tox`` you prefer to run the tests directly, then we suggest to create a virtual environment and use 300 an editable install with the ``dev`` extra:: 301 302 $ python3 -m venv .venv 303 $ source .venv/bin/activate # Linux 304 $ .venv/Scripts/activate.bat # Windows 305 $ pip install -e ".[dev]" 306 307 Afterwards, you can edit the files and run pytest normally:: 308 309 $ pytest testing/test_config.py 310 311 #. Create a new changelog entry in ``changelog``. The file should be named ``<issueid>.<type>.rst``, 312 where *issueid* is the number of the issue related to the change and *type* is one of 313 ``feature``, ``improvement``, ``bugfix``, ``doc``, ``deprecation``, ``breaking``, ``vendor`` 314 or ``trivial``. You may skip creating the changelog entry if the change doesn't affect the 315 documented behaviour of pytest. 316 317 #. Add yourself to ``AUTHORS`` file if not there yet, in alphabetical order. 318 319 #. Commit and push once your tests pass and you are happy with your change(s):: 320 321 $ git commit -a -m "<commit message>" 322 $ git push -u 323 324 #. Finally, submit a pull request through the GitHub website using this data:: 325 326 head-fork: YOUR_GITHUB_USERNAME/pytest 327 compare: your-branch-name 328 329 base-fork: pytest-dev/pytest 330 base: main 331 332 333 Writing Tests 334 ~~~~~~~~~~~~~ 335 336 Writing tests for plugins or for pytest itself is often done using the `pytester fixture <https://docs.pytest.org/en/stable/reference/reference.html#pytester>`_, as a "black-box" test. 337 338 For example, to ensure a simple test passes you can write: 339 340 .. code-block:: python 341 342 def test_true_assertion(pytester): 343 pytester.makepyfile( 344 """ 345 def test_foo(): 346 assert True 347 """ 348 ) 349 result = pytester.runpytest() 350 result.assert_outcomes(failed=0, passed=1) 351 352 353 Alternatively, it is possible to make checks based on the actual output of the termal using 354 *glob-like* expressions: 355 356 .. code-block:: python 357 358 def test_true_assertion(pytester): 359 pytester.makepyfile( 360 """ 361 def test_foo(): 362 assert False 363 """ 364 ) 365 result = pytester.runpytest() 366 result.stdout.fnmatch_lines(["*assert False*", "*1 failed*"]) 367 368 When choosing a file where to write a new test, take a look at the existing files and see if there's 369 one file which looks like a good fit. For example, a regression test about a bug in the ``--lf`` option 370 should go into ``test_cacheprovider.py``, given that this option is implemented in ``cacheprovider.py``. 371 If in doubt, go ahead and open a PR with your best guess and we can discuss this over the code. 372 373 Joining the Development Team 374 ---------------------------- 375 376 Anyone who has successfully seen through a pull request which did not 377 require any extra work from the development team to merge will 378 themselves gain commit access if they so wish (if we forget to ask please send a friendly 379 reminder). This does not mean there is any change in your contribution workflow: 380 everyone goes through the same pull-request-and-review process and 381 no-one merges their own pull requests unless already approved. It does however mean you can 382 participate in the development process more fully since you can merge 383 pull requests from other contributors yourself after having reviewed 384 them. 385 386 387 Backporting bug fixes for the next patch release 388 ------------------------------------------------ 389 390 Pytest makes a feature release every few weeks or months. In between, patch releases 391 are made to the previous feature release, containing bug fixes only. The bug fixes 392 usually fix regressions, but may be any change that should reach users before the 393 next feature release. 394 395 Suppose for example that the latest release was 1.2.3, and you want to include 396 a bug fix in 1.2.4 (check https://github.com/pytest-dev/pytest/releases for the 397 actual latest release). The procedure for this is: 398 399 #. First, make sure the bug is fixed in the ``main`` branch, with a regular pull 400 request, as described above. An exception to this is if the bug fix is not 401 applicable to ``main`` anymore. 402 403 Automatic method: 404 405 Add a ``backport 1.2.x`` label to the PR you want to backport. This will create 406 a backport PR against the ``1.2.x`` branch. 407 408 Manual method: 409 410 #. ``git checkout origin/1.2.x -b backport-XXXX`` # use the main PR number here 411 412 #. Locate the merge commit on the PR, in the *merged* message, for example: 413 414 nicoddemus merged commit 0f8b462 into pytest-dev:main 415 416 #. ``git cherry-pick -x -m1 REVISION`` # use the revision you found above (``0f8b462``). 417 418 #. Open a PR targeting ``1.2.x``: 419 420 * Prefix the message with ``[1.2.x]``. 421 * Delete the PR body, it usually contains a duplicate commit message. 422 423 424 Who does the backporting 425 ~~~~~~~~~~~~~~~~~~~~~~~~ 426 427 As mentioned above, bugs should first be fixed on ``main`` (except in rare occasions 428 that a bug only happens in a previous release). So, who should do the backport procedure described 429 above? 430 431 1. If the bug was fixed by a core developer, it is the main responsibility of that core developer 432 to do the backport. 433 2. However, often the merge is done by another maintainer, in which case it is nice of them to 434 do the backport procedure if they have the time. 435 3. For bugs submitted by non-maintainers, it is expected that a core developer will to do 436 the backport, normally the one that merged the PR on ``main``. 437 4. If a non-maintainers notices a bug which is fixed on ``main`` but has not been backported 438 (due to maintainers forgetting to apply the *needs backport* label, or just plain missing it), 439 they are also welcome to open a PR with the backport. The procedure is simple and really 440 helps with the maintenance of the project. 441 442 All the above are not rules, but merely some guidelines/suggestions on what we should expect 443 about backports. 444 445 Handling stale issues/PRs 446 ------------------------- 447 448 Stale issues/PRs are those where pytest contributors have asked for questions/changes 449 and the authors didn't get around to answer/implement them yet after a somewhat long time, or 450 the discussion simply died because people seemed to lose interest. 451 452 There are many reasons why people don't answer questions or implement requested changes: 453 they might get busy, lose interest, or just forget about it, 454 but the fact is that this is very common in open source software. 455 456 The pytest team really appreciates every issue and pull request, but being a high-volume project 457 with many issues and pull requests being submitted daily, we try to reduce the number of stale 458 issues and PRs by regularly closing them. When an issue/pull request is closed in this manner, 459 it is by no means a dismissal of the topic being tackled by the issue/pull request, but it 460 is just a way for us to clear up the queue and make the maintainers' work more manageable. Submitters 461 can always reopen the issue/pull request in their own time later if it makes sense. 462 463 When to close 464 ~~~~~~~~~~~~~ 465 466 Here are a few general rules the maintainers use deciding when to close issues/PRs because 467 of lack of inactivity: 468 469 * Issues labeled ``question`` or ``needs information``: closed after 14 days inactive. 470 * Issues labeled ``proposal``: closed after six months inactive. 471 * Pull requests: after one month, consider pinging the author, update linked issue, or consider closing. For pull requests which are nearly finished, the team should consider finishing it up and merging it. 472 473 The above are **not hard rules**, but merely **guidelines**, and can be (and often are!) reviewed on a case-by-case basis. 474 475 Closing pull requests 476 ~~~~~~~~~~~~~~~~~~~~~ 477 478 When closing a Pull Request, it needs to be acknowledging the time, effort, and interest demonstrated by the person which submitted it. As mentioned previously, it is not the intent of the team to dismiss a stalled pull request entirely but to merely to clear up our queue, so a message like the one below is warranted when closing a pull request that went stale: 479 480 Hi <contributor>, 481 482 First of all, we would like to thank you for your time and effort on working on this, the pytest team deeply appreciates it. 483 484 We noticed it has been awhile since you have updated this PR, however. pytest is a high activity project, with many issues/PRs being opened daily, so it is hard for us maintainers to track which PRs are ready for merging, for review, or need more attention. 485 486 So for those reasons we, think it is best to close the PR for now, but with the only intention to clean up our queue, it is by no means a rejection of your changes. We still encourage you to re-open this PR (it is just a click of a button away) when you are ready to get back to it. 487 488 Again we appreciate your time for working on this, and hope you might get back to this at a later time! 489 490 <bye> 491 492 Closing Issues 493 -------------- 494 495 When a pull request is submitted to fix an issue, add text like ``closes #XYZW`` to the PR description and/or commits (where ``XYZW`` is the issue number). See the `GitHub docs <https://help.github.com/en/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue#linking-a-pull-request-to-an-issue-using-a-keyword>`_ for more information. 496 497 When an issue is due to user error (e.g. misunderstanding of a functionality), please politely explain to the user why the issue raised is really a non-issue and ask them to close the issue if they have no further questions. If the original requestor is unresponsive, the issue will be handled as described in the section `Handling stale issues/PRs`_ above.