====== Flake8 ====== Flake8 is a wrapper around these tools: - PyFlakes - pep8 - Ned's MacCabe script Flake8 runs all tools by launching the single 'flake8' script, but ignores pep8 and PyFlakes extended options and just uses defaults. It displays the warnings in a per-file, merged output. It also adds a few features: - files that contains with this header are skipped:: # flake8: noqa - lines that contains a "# NOQA" comment at the end will not issue a warning. - a Mercurial hook. - a McCabe complexity checker. QuickStart ========== To run flake8 just invoke it against any directory or Python module:: $ flake8 coolproject coolproject/mod.py:1027: local variable 'errors' is assigned to but never used coolproject/mod.py:97: 'shutil' imported but unused coolproject/mod.py:729: redefinition of function 'readlines' from line 723 coolproject/mod.py:1028: local variable 'errors' is assigned to but never used coolproject/mod.py:625:17: E225 missing whitespace around operato The output of PyFlakes *and* pep8 is merged and returned. flake8 offers an extra option: --max-complexity, which will emit a warning if the McCabe complexityu of a function is higher that the value. By default it's deactivated:: $ bin/flake8 --max-complexity 12 flake8 coolproject/mod.py:97: 'shutil' imported but unused coolproject/mod.py:729: redefinition of function 'readlines' from line 723 coolproject/mod.py:1028: local variable 'errors' is assigned to but never used coolproject/mod.py:625:17: E225 missing whitespace around operator coolproject/mod.py:452:1: 'missing_whitespace_around_operator' is too complex (18) coolproject/mod.py:939:1: 'Checker.check_all' is too complex (12) coolproject/mod.py:1204:1: 'selftest' is too complex (14) This feature is quite useful to detect over-complex code. According to McCabe, anything that goes beyond 10 is too complex. See https://en.wikipedia.org/wiki/Cyclomatic_complexity. Mercurial hook ============== To use the Mercurial hook on any *commit* or *qrefresh*, change your .hg/rc file like this:: [hooks] commit = python:flake8.run.hg_hook qrefresh = python:flake8.run.hg_hook [flake8] strict = 0 complexity = 12 If *strict* option is set to **1**, any warning will block the commit. When *strict* is set to **0**, warnings are just displayed in the standard output. *complexity* defines the maximum McCabe complexity allowed before a warning is emited. If you don't specify it it's just ignored. If specified, must be a positive value. 12 is usually a good value. Buildout integration ===================== In order to use Flake8 inside a buildout, edit your buildout.cfg and add this:: [buildout] parts += ... flake8 [flake8] recipe = zc.recipe.egg eggs = flake8 ${buildout:eggs} entry-points = flake8=flake8.run:main Original projects ================= Flake8 is just a glue project, all the merits go to the creators of the original projects: - pep8: http://github.com/jcrocholl/pep8/ - PyFlakes: http://divmod.org/trac/wiki/DivmodPyflakes - McCabe: http://nedbatchelder.com/blog/200803/python_code_complexity_microtool.html CHANGES ======= 1.1 - 2012-02-14 ---------------- - fixed the value returned by --version - allow the flake8: header to be more generic - fixed the "hg hook raises 'physical lines'" bug - allow three argument form of raise - now uses setuptools if available, for 'develop' command 1.0 - 2011-11-29 ---------------- - Deactivates by default the complexity checker - Introduces the complexity option in the HG hook and the command line. 0.9 - 2011-11-09 ---------------- - update pep8 version to 0.6.1 - mccabe check: gracefully handle compile failure 0.8 - 2011-02-27 ---------------- - fixed hg hook - discard unexisting files on hook check 0.7 - 2010-02-18 ---------------- - Fix pep8 intialization when run through Hg - Make pep8 short options work when run throug the command line - skip duplicates when controlling files via Hg 0.6 - 2010-02-15 ---------------- - Fix the McCabe metric on some loops