More and more, I am using Python tools like Poetry and Black that use pyproject.toml
as a central configuration file for packaging and tools. The finalized PEP 518 defined the specification for pyproject.toml
, and many tools have adopted it.
Unfortunately, two tools I use frequently do not yet support configuration through pyproject.toml
: Flake8 and Mypy.
Thus far, I have not found any option for Mypy other than setup.cfg
or mypy.ini
, but I have found a solution for Flake8.
Enter FlakeHell.
FlakeHell is a Flake8 wrapper. Configuration is handled in pyproject.toml
and can enable/disable specific Flake8 plugins, ignore specific errors, and handle files differently.
Example configuration
Here is my current configuration in pyproject.toml
:
[tool.flakehell]
exclude = ["README.rst", "README.md"]
format = "colored"
max_line_length = 88
show_source = true
whitelist = "../../allowlist.txt"
[tool.flakehell.plugins]
flake8-bandit = ["+*", "-S322"]
flake8-bugbear = ["+*"]
flake8-builtins = ["+*"]
flake8-comprehensions = ["+*"]
flake8-darglint = ["+*"]
flake8-docstrings = ["+*"]
flake8-eradicate = ["+*"]
flake8-isort = ["+*"]
flake8-mutable = ["+*"]
flake8-pytest-style = ["+*"]
flake8-spellcheck = ["+*"]
mccabe = ["+*"]
pep8-naming = ["+*"]
pycodestyle = ["+*"]
pyflakes = ["+*"]
pylint = ["+*"]
Configure plugins
The above demonstrates that configuration can be passed from FlakeHell to the relevant plugin, such as the whitelist
variable, a part of flake8-spellcheck.
Ignore specific warnings
Also note that certain codes (such as Bandit's S322 warning about input()
that is not relevant in Python 3) can be ignored by prefixing them with a -
and adding them to the list.
Pretty output
FlakeHell can format the output in various ways, including colorizing, grouping, or JSON-formatting.
Drop-in replacement for flake8
Thankfully, there is flake8helled
, a command that replaces flake8
, making it easy to configure your editor to use FlakeHell in place of Flake8.
Useful commands
When using FlakeHell, I frequently use the following commands:
-
flakehell lint
runs the linter, similar to theflake8
command -
flakehell plugins
lists all the plugins used, and their configuration status -
flakehell missed
shows any plugins that are in the configuration but not installed properly (such as withpip
orpoetry add -D
) -
flakehell code S322
(or any other code) shows the explanation for that specific warning code.
See FlakeHell's documentation for more direction and ideas.
Happy linting.
Top comments (4)
Thanks for the helpful article!
For anyone reading now, note that FlakeHell is no longer being maintained.
FlakeHeaven seems to be the most actively maintained fork, so I'm using it instead: github.com/flakeheaven/flakeheaven
Wow, thank you so much for noticing this! I will update the article shortly.
Ok now this is confusing:
github.com/flakehell/flakehell
github.com/flakeheaven/flakeheaven
Both seem to be actively maintained and were both forked from the same older project. I think I like the name
flakeheaven
better thanflakehell
, so I will go ahead to heavenJust wanted to leave a comment for future readers that mypy already supports pyproject.toml.
See here: mypy.readthedocs.io/en/stable/conf...