| .. -*- coding: utf-8 -*- |
| |
| ============== |
| Contributing |
| ============== |
| |
| .. _bug reports, feedback: |
| |
| Bug reports, feedback |
| --------------------- |
| |
| You think you have found a bug in Pylint? Well, this may be the case |
| since Pylint is under heavy development! |
| |
| Please take the time to check if it is already in the issue tracker at |
| https://github.com/PyCQA/pylint |
| |
| If you cannot find it in the tracker, create a new issue there or discuss your |
| problem on the code-quality@python.org mailing list or using the discord |
| server https://discord.gg/Egy6P8AMB5. |
| |
| The code-quality mailing list is also a nice place to provide feedback about |
| Pylint, since it is shared with other tools that aim at improving the quality of |
| python code. |
| |
| Note that if you don't find something you have expected in Pylint's issue |
| tracker, it may be because it is an issue with one of its dependencies, namely |
| astroid: |
| |
| * https://github.com/PyCQA/astroid |
| |
| .. _Mailing lists: |
| |
| Discord server |
| -------------- |
| |
| https://discord.gg/Egy6P8AMB5 |
| |
| Mailing lists |
| ------------- |
| |
| You can subscribe to this mailing list at |
| https://mail.python.org/mailman/listinfo/code-quality |
| |
| Archives are available at |
| https://mail.python.org/pipermail/code-quality/ |
| |
| Archives before April 2013 are available at |
| https://lists.logilab.org/pipermail/python-projects/ |
| |
| |
| .. _repository: |
| |
| Repository |
| ---------- |
| |
| Pylint is developed using the git_ distributed version control system. |
| |
| You can clone Pylint and its dependencies from :: |
| |
| git clone https://github.com/PyCQA/pylint |
| git clone https://github.com/PyCQA/astroid |
| |
| .. _git: https://git-scm.com/ |
| |
| Got a change for Pylint? Below are a few steps you should take to make sure |
| your patch gets accepted. |
| |
| - Test your code |
| |
| * Pylint is very well tested, with a high code coverage. |
| It has two types of tests, usual unittests and functional tests. |
| |
| The usual unittests can be found under `/pylint/test` directory and they can |
| be used for testing almost anything Pylint related. But for the ease |
| of testing Pylint's messages, we also have the concept of functional tests. |
| |
| * You should also run all the tests to ensure that your change isn't a |
| breaking one. You can run the tests using the tox_ package, as in:: |
| |
| python -m tox |
| python -m tox -epy36 # for Python 3.6 suite only |
| python -m tox -epylint # for running Pylint over Pylint's codebase |
| python -m tox -eformatting # for running formatting checks over Pylint's codebase |
| |
| * It's usually a good idea to run tox_ with ``--recreate``. This is needed because |
| the tox environment might use an older version of astroid_, which can cause various failures |
| when you are running against the latest pylint:: |
| |
| python -m tox --recreate # The entire tox environment is going to be recreated |
| |
| |
| * To run only a specific test suite, use a pattern for the test filename |
| (**without** the ``.py`` extension), as in:: |
| |
| python -m tox -e py36 -- -k test_functional |
| python -m tox -e py36 -- -k \*func\* |
| |
| * Since we just use pytest_ to run the tests, you can also use it as well, |
| although we highly recommend using tox_ instead:: |
| |
| pytest pylint -k test_functional |
| |
| * ``pylint`` uses black_ and isort_ among other Python autoformatters. |
| We have a pre-commit hook which should take care of the autoformatting for |
| you. To enable it, do the following: |
| |
| * install ``pre-commit`` using ``pip install pre-commit`` |
| |
| * then run ``pre-commit install`` in the ``pylint`` root directory to enable the git hooks. |
| |
| - Add a short entry to the ChangeLog describing the change, except for internal |
| implementation only changes. Not usually required, but for changes other than small |
| bugs we also add a couple of sentences in the release document for that release, |
| (`What's New` section). For the release document we usually write some more details, |
| and it is also a good place to offer examples on how the new change is supposed to work. |
| |
| - Add a short entry in :file:`doc/whatsnew/VERSION.rst`. |
| |
| - Add yourself to the `CONTRIBUTORS` file, flag yourself appropriately |
| (if in doubt, you're a ``contributor``). |
| |
| - Write a comprehensive commit message |
| |
| - Relate your change to an issue in the tracker if such an issue exists (see |
| `Closing issues via commit messages`_ of the GitHub documentation for more |
| information on this) |
| |
| - Document your change, if it is a non-trivial one. |
| |
| - Send a pull request from GitHub (see `About pull requests`_ for more insight |
| about this topic) |
| |
| |
| .. _functional_tests: |
| |
| Functional Tests |
| ---------------- |
| |
| These are residing under '/pylint/test/functional' and they are formed of multiple |
| components. First, each Python file is considered to be a test case and it |
| should be accompanied by a .txt file, having the same name, with the messages |
| that are supposed to be emitted by the given test file. |
| |
| In the Python file, each line for which Pylint is supposed to emit a message |
| has to be annotated with a comment in the form ``# [message_symbol]``, as in:: |
| |
| a, b, c = 1 # [unbalanced-tuple-unpacking] |
| |
| If multiple messages are expected on the same line, then this syntax can be used:: |
| |
| a, b, c = 1.test # [unbalanced-tuple-unpacking, no-member] |
| |
| You can also use ``# +n: [`` with n an integer if the above syntax would make the line too long or other reasons:: |
| |
| # +1: [empty-comment] |
| # |
| |
| If you need special control over Pylint's flag, you can also create a .rc file, which |
| can have sections of Pylint's configuration. |
| |
| During development, it's sometimes helpful to run all functional tests in your |
| current environment in order to have faster feedback. Run from Pylint root directory with:: |
| |
| python tests/test_functional.py |
| |
| You can use all the options you would use for pytest, for example `-k "test_functional[len_checks]"`. |
| If required the .txt file can be re-generated from the current output by appending |
| `--update-functional-output` to the command line:: |
| |
| python tests/test_functional.py --update-functional-output -k "test_functional[len_checks]" |
| |
| .. _`Closing issues via commit messages`: https://help.github.com/articles/closing-issues-via-commit-messages/ |
| .. _`About pull requests`: https://help.github.com/articles/using-pull-requests/ |
| .. _tox: https://tox.readthedocs.io/en/latest/ |
| .. _pytest: https://pytest.readthedocs.io/en/latest/ |
| .. _black: https://github.com/ambv/black |
| .. _isort: https://github.com/timothycrosley/isort |
| .. _astroid: https://github.com/pycqa/astroid |
| |
| |
| Tips for Getting Started with Pylint Development |
| ------------------------------------------------ |
| * Read the :ref:`technical-reference`. It gives a short walk through of the pylint |
| codebase and will help you identify where you will need to make changes |
| for what you are trying to implement. |
| |
| * :func:`astroid.extract_node` is your friend. Most checkers are AST based, |
| so you will likely need to interact with :mod:`astroid`. |
| A short example of how to use :func:`astroid.extract_node` is given |
| :ref:`here <astroid_extract_node>`. |
| |
| * When fixing a bug for a specific check, search the code for the warning |
| message to find where the warning is raised, |
| and therefore where the logic for that code exists. |
| |
| |
| Building the documentation |
| ---------------------------- |
| |
| We use **tox** for building the documentation:: |
| |
| $ tox -e docs |