Linter/formatter support is implemented in separate backends so that they are easy to opt in to individually:
Bandit: security linter
Black: code formatter
Docformatter: docstring formatter
Flake8: style and bug linter
isort: import statement formatter
Pylint: style and bug linter
Yapf: code formatter
To enable, add the appropriate backends in
[GLOBAL] ... backend_packages = [ 'pants.backend.python', 'pants.backend.python.lint.black', 'pants.backend.python.lint.isort', ]
You should now be able to run
./pants lint, and possibly
$ ./pants lint src/py/project.py 17:54:32.51 [INFO] Completed: lint - Flake8 succeeded. 17:54:32.70 [INFO] Completed: lint - Black succeeded. All done! ✨ 🍰 ✨ 1 file would be left unchanged. 17:54:33.91 [INFO] Completed: lint - isort succeeded. ✓ Black succeeded. ✓ Flake8 succeeded. ✓ isort succeeded.
How to activate MyPy
MyPy is run with the typecheck goal, rather than
Most of the formatters and linters allow you to configure
What it does
Any additional dependencies to install, such as any plugins.
What interpreter to run the tool with. (
Any command-line arguments you want to pass to the tool.
Path to a config file. Useful if the file is in a non-standard location such that it cannot be auto-discovered.
Path to a custom lockfile if the default does not work, or
[docformatter] args = ["--wrap-summaries=100", "--wrap-descriptions=100"] [flake8] # Load a config file in a non-standard location. config = "build-support/flake8" # Change the version and add a custom plugin. Because we do this, we # use a custom lockfile. version = "flake8==3.8.0" extra_requirements.add = ["flake8-2020"] lockfile = "3rdparty/flake8_lockfile.txt"
./pants help-advanced black,
./pants help-advanced flake8, and so on for more information.
Config files are normally auto-discovered
For tools that autodiscover config files—such as Black, isort, Flake8, and Pylint—Pants will include any relevant config files in the process's sandbox when running the tool.
If your config file is in a non-standard location, you must instead set the
[isort].config. This will ensure that the config file is included in the process's sandbox and Pants will instruct the tool to load the config.
To temporarily skip a tool, use the
--skip option. For example, run:
$ ./pants --black-skip --flake8-skip lint ::
You can also skip on a per-target basis, which can be useful for incrementally adopting new tools. For example:
# Skip Black and Flake8 for all the non-test files in this folder. python_library(skip_black=True, skip_flake8=True) # Skip isort for all the test files in this folder. python_tests(name="tests", skip_isort=True)
When you run
./pants fmt and
./pants lint, Pants will ignore any files belonging to skipped targets.
With formatters and linters, there is usually no need to rerun on files that have not changed.
Use the option
--changed-since to get much better performance, like this:
$ ./pants --changed-since=HEAD fmt
$ ./pants --changed-since=main lint
Pants will find which files have changed and only run over those files. See Advanced target selection for more information.
Flake8 and Bandit can both generate report files saved to disk.
For Pants to properly preserve the reports, instruct both tools to write to the
reports/ folder by updating their config files or
--bandit-args. For example, in your
[bandit] args = ["--output=reports/report.txt"] [flake8] args = ["----output-file=reports/report.txt"]
Pants will copy all reports into the folder
./pants help-advanced pylint for instructions to add plugins written by you with the
If you want to write first-party plugins for other linters like Flake8, let us know on Slack.
Bandit output can be extremely verbose, including on successful runs. You may want to use its
--quiet option, which will turn off output for successful runs but keep it for failures.
For example, you can set this in your
[bandit] args = ["--quiet"]
Some Pants users had to explicitly set
default_section = "THIRDPARTY" to get iSort 5 to correctly classify their first-party imports, even though this is the default value.
They report that this config works for them:
# pyproject.toml [tool.isort] known_first_party = ["my_org"] default_section = "THIRDPARTY"
You may also want to try downgrading to iSort 4.x by setting
version = "isort>=4.6,<5" in the
[isort] options scope.
Updated 23 days ago