Tarek Ziadé avatar Tarek Ziadé committed f49f8af

made complexity an option (deactivated by default)

Comments (0)

Files changed (4)

 
     # flake8: noqa
 
-- lines that contains a "# NOQA" comment at the end will not issue a warning
-- a Mercurial hook
-- more things to come..
+- lines that contains a "# NOQA" comment at the end will not issue a warning.
+- a Mercurial hook.
+- a McCabe complexity checker.
 
-Original projects:
+QuickStart
+==========
 
-- pep8: http://github.com/jcrocholl/pep8/
-- PyFlakes: http://divmod.org/trac/wiki/DivmodPyflakes
-- McCabe: http://nedbatchelder.com/blog/200803/python_code_complexity_microtool.html
+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
 
     [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.
+
+
+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.0 - ?
--------
+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
 ----------------
-#!/home/tarek/dev/bitbucket.org/flk8/bin/python
+#!/home/tarek/dev/bitbucket.org/flake8-clean/bin/python
 from flake8.run import main
 
 if __name__ == '__main__':
     global options, args
     parser = OptionParser(version=__version__,
                           usage="%prog [options] input ...")
+    parser.add_option('--max-complexity', default=-1, action='store',
+                      type='int', help="McCabe complexity treshold")
     parser.add_option('-v', '--verbose', default=0, action='count',
                       help="print status messages, or debug with -vv")
     parser.add_option('-q', '--quiet', default=0, action='count',
 from flake8 import mccabe
 
 
-def check_file(path, complexity=10):
+def check_file(path, complexity=-1):
     warnings = pyflakes.checkPath(path)
     warnings += pep8.input_file(path)
-    warnings += mccabe.get_module_complexity(path, complexity)
+    if complexity > -1:
+        warnings += mccabe.get_module_complexity(path, complexity)
     return warnings
 
 
-def check_code(code, complexity=10):
+def check_code(code, complexity=-1):
     warnings = pyflakes.check(code, '<stdin>')
-    warnings += mccabe.get_code_complexity(code, complexity)
+    if complexity > -1:
+        warnings += mccabe.get_code_complexity(code, complexity)
     return warnings
 
 
 
 def main():
     options, args = pep8.process_options()
+    complexity = options.max_complexity
     warnings = 0
     if args:
         for path in _get_python_files(args):
-            warnings += check_file(path)
+            warnings += check_file(path, complexity)
     else:
         stdin = sys.stdin.read()
-        warnings += check_code(stdin)
+        warnings += check_code(stdin, complexity)
 
     raise SystemExit(warnings > 0)
 
     pep8.options.physical_checks = pep8.find_checks('physical_line')
     pep8.options.logical_checks = pep8.find_checks('logical_line')
     pep8.args = []
+    complexity = ui.configint('flake8', 'complexity', default=-1)
+    warnings = 0
 
-    warnings = 0
     for file_ in _get_files(repo, **kwargs):
-        warnings += check_file(file_)
+        warnings += check_file(file_, complexity)
 
     strict = ui.configbool('flake8', 'strict', default=True)
 
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.