The branch, master has been updated via 0c2c75a filter-subunit: Drop support for allow_empty_output hack. via 77b72d4 samba3dump: Add subunit-enabled test for samba3dump. via 23ac8d1 urgent_replication: Use subunit reporting, remove allow_empty_output. via 7043a8b testr: Use waf testonly and create a custom directory for new workers. via edc1ced selftest: Actually honor --with-selftest-prefix. via b2e4f31 Don't import into testr when --load-list was specified, as testr will take care of that itself. via 7cc7093 Don't ignore testsuites without --list support, but consider them as atomic entities. via c7b6897 Run duplicate symbol check as just another test, rather than as part of "waf test". via d9458aa samba.tests.unicodenames: Fix docstring formatting so pydoctor understands it. via 08ca688 py_net: Fix typo in change_password docstring, and indentation in set_password docstring. via eef3a7b samba_tool_drs: Fix docstring formatting so pydoctor groks it. via 8bf6036 Fix pydoctor invocation. via 2cdf553 samba.tests.source: Fix lint. via 997ee57 Remove obsolete pep8 test. via 0c24085 Fix more pep8 issues in code I touched recently. via 9a014d2 Remove last instances of pep8 error E602 (old style exceptions). via bd6faaf Remove last instances of pep8 error E712 (use 'is' rather than '==' for booleans) via b605d15 pep8: Import new version. via 2553714 Remove last instance of pep8 error E701 (more statements on one line). via bbaa739 Remove remaining instance of pep8 E211 (too many spaces before operator). from bcf298e lib/util: Add RFC3339 timestamp support to timeval_str_buf()
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 0c2c75a2d7afdb3e08aa29f6b996d953dcc3b5a1 Author: Jelmer Vernooij <jel...@samba.org> Date: Sun Oct 12 21:18:08 2014 -0700 filter-subunit: Drop support for allow_empty_output hack. Change-Id: If4f336ef770202dcf69484b9bccc6c0c80bd5f9b Signed-Off-By: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> Autobuild-User(master): Andrew Bartlett <abart...@samba.org> Autobuild-Date(master): Tue Oct 14 09:06:05 CEST 2014 on sn-devel-104 commit 77b72d4c8e02e6bba9ef8c90287455a784afe9d8 Author: Jelmer Vernooij <jel...@samba.org> Date: Sun Oct 12 21:17:05 2014 -0700 samba3dump: Add subunit-enabled test for samba3dump. Change-Id: Ie9682c715fc91d923dcd1951236f8b36fa519327 Signed-Off-By: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 23ac8d130c1f476fda5d984531266a6c210c2982 Author: Jelmer Vernooij <jel...@samba.org> Date: Sun Oct 12 21:11:22 2014 -0700 urgent_replication: Use subunit reporting, remove allow_empty_output. Change-Id: I6d479b218eff6c4292fbb99e4760bbd62ce1f380 Signed-Off-By: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 7043a8b62a7093764f92bcd098df72a844139f7d Author: Jelmer Vernooij <jel...@samba.org> Date: Sun Oct 12 19:53:35 2014 -0700 testr: Use waf testonly and create a custom directory for new workers. Using waf testonly helps speed up test runs, and the custom directory is required to run multiple workers in parallel. Change-Id: I339420c5c503c270a04888a1c990836cb0c91e94 Signed-Off-By: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit edc1cedf932de2bc068da9a5db844ac4c48f4324 Author: Jelmer Vernooij <jel...@samba.org> Date: Sun Oct 12 19:52:49 2014 -0700 selftest: Actually honor --with-selftest-prefix. Change-Id: Ie8c995a273781309224e17b8970a864479444036 Signed-Off-By: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit b2e4f312a2680f314ccd9a9d294e50035f117e07 Author: Jelmer Vernooij <jel...@samba.org> Date: Sun Oct 12 17:58:41 2014 -0700 Don't import into testr when --load-list was specified, as testr will take care of that itself. Change-Id: I3d57f4cfafdd48751dfbd145f220dc5cf000ec3f Signed-Off-By: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 7cc7093fb3f52e438239578e70aaee6c3ef12cda Author: Jelmer Vernooij <jel...@samba.org> Date: Sun Oct 12 17:49:39 2014 -0700 Don't ignore testsuites without --list support, but consider them as atomic entities. This prevents any such testsuites from being skipped when run using testr. Bug: https://bugzilla.samba.org/show_bug.cgi?id=10874 Change-Id: I6ae8c92bb70e86a3b848b9cb3a53e2af466c3fe3 Signed-Off-By: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit c7b6897b80e724023c3b092d086ab574bff564e1 Author: Jelmer Vernooij <jel...@samba.org> Date: Sun Oct 12 17:48:10 2014 -0700 Run duplicate symbol check as just another test, rather than as part of "waf test". This allows it to be scheduled independently as part of a parallel test run, and reduces the overhead of "waf test". Change-Id: I780fd2c4dd711ed27df73f56de98e7f1ffd53aaf Signed-Off-By: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> Bug: https://bugzilla.samba.org/show_bug.cgi?id=10875 commit d9458aa2d9be1ddd7c6d6edd993e12973195e307 Author: Jelmer Vernooij <jel...@samba.org> Date: Sun Oct 12 16:08:15 2014 -0700 samba.tests.unicodenames: Fix docstring formatting so pydoctor understands it. Change-Id: I8983cd4483c380fd0c9e4da843eb70750450a0fa Signed-Off-By: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 08ca688d4ec126ff72ffb46de2d764ae890401ad Author: Jelmer Vernooij <jel...@samba.org> Date: Sun Oct 12 16:07:41 2014 -0700 py_net: Fix typo in change_password docstring, and indentation in set_password docstring. Change-Id: I93e9ed79ee43233fc3c1bb69d8eb0a5c6e0e3940 Signed-off-by: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit eef3a7be2d07771115e3fb0b3cfd6bcfb4061aaa Author: Jelmer Vernooij <jel...@samba.org> Date: Sun Oct 12 16:07:34 2014 -0700 samba_tool_drs: Fix docstring formatting so pydoctor groks it. Change-Id: I827044ef876118935b0f91e318d3c815326a2f01 Signed-off-by: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 8bf60364828c7b3b1d8f6d79b6834bc5a8ed4339 Author: Jelmer Vernooij <jel...@samba.org> Date: Sun Oct 12 15:48:53 2014 -0700 Fix pydoctor invocation. Signed-Off-By: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> Bug: https://bugzilla.samba.org/show_bug.cgi?id=10754 Change-Id: I1ca311dcba52350dc284439119a8166dee1de50a commit 2cdf55354593dd96120ea34929f4be7133f0e230 Author: Jelmer Vernooij <jel...@samba.org> Date: Sat Sep 27 18:03:04 2014 +0200 samba.tests.source: Fix lint. Change-Id: I3dc614c34aa2c4fca6f2ca68196e71b9129b5b76 Signed-off-by: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> commit 997ee574a3d1976b132bf2478d9f8f49d70d3e07 Author: Jelmer Vernooij <jel...@samba.org> Date: Mon Jun 2 03:12:52 2014 +0200 Remove obsolete pep8 test. Signed-Off-By: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> Change-Id: I7f6634a035e9c93820cd4eef0261ecd5dd3865ab commit 0c2408531709eb720a2e96f72afbc2ecbfe6b06d Author: Jelmer Vernooij <jel...@samba.org> Date: Mon Jun 2 02:53:01 2014 +0200 Fix more pep8 issues in code I touched recently. Signed-Off-By: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> Change-Id: I35f3204bdf5d00b3280d703427ded2fa2163a6f7 commit 9a014d265b4e134fb5cea12aaca88ba5eb91cc05 Author: Jelmer Vernooij <jel...@samba.org> Date: Mon Jun 2 02:37:11 2014 +0200 Remove last instances of pep8 error E602 (old style exceptions). Signed-Off-By: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> Change-Id: If709757643e6eed8cffa8950170c337f51edb9d9 commit bd6faaf56a6237874cc84ddb8be0f09a9b742a54 Author: Jelmer Vernooij <jel...@samba.org> Date: Mon Jun 2 02:36:13 2014 +0200 Remove last instances of pep8 error E712 (use 'is' rather than '==' for booleans) Signed-Off-By: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> Change-Id: I43b394a6225b4c2049d979fda75548c82d781f67 commit b605d152de80889925c7b7a3e723a3581fe5e21a Author: Jelmer Vernooij <jel...@samba.org> Date: Mon Jun 2 02:24:06 2014 +0200 pep8: Import new version. Signed-Off-By: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> Change-Id: I22d897a8f46a4ac57a91db3ad05286d9d0066806 commit 2553714004cb1d6b5889fa81cd6b0ef9c1be9608 Author: Jelmer Vernooij <jel...@samba.org> Date: Mon Jun 2 01:34:47 2014 +0200 Remove last instance of pep8 error E701 (more statements on one line). Signed-Off-By: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> Change-Id: I419f0536b43d98ce6bb52c5907413a02ea1a6937 commit bbaa739bbda4685fa5e38ea0d939496398e11ebf Author: Jelmer Vernooij <jel...@samba.org> Date: Mon Jun 2 01:33:43 2014 +0200 Remove remaining instance of pep8 E211 (too many spaces before operator). Signed-Off-By: Jelmer Vernooij <jel...@samba.org> Reviewed-by: Andrew Bartlett <abart...@samba.org> Change-Id: I9af3bf582bba8fc1094addb12cd0a5ce04406b5b ----------------------------------------------------------------------- Summary of changes: .testr.conf | 2 +- buildtools/wafsamba/samba3.py | 13 +- buildtools/wafsamba/test_duplicate_symbol.sh | 12 + buildtools/wafsamba/wafsamba.py | 7 +- lib/pep8/pep8.py | 2167 +++++++++++++++-------- python/samba/drs_utils.py | 31 +- python/samba/kcc_utils.py | 6 +- python/samba/provision/backend.py | 20 +- python/samba/schema.py | 17 +- python/samba/tests/__init__.py | 7 +- python/samba/tests/blackbox/samba_tool_drs.py | 51 +- python/samba/tests/dns.py | 14 +- python/samba/tests/samba3.py | 2 +- python/samba/tests/samba3sam.py | 6 +- python/samba/tests/source.py | 65 +- python/samba/tests/unicodenames.py | 5 +- selftest/selftest.pl | 3 + selftest/selftesthelpers.py | 9 +- selftest/tests.py | 38 +- selftest/wscript | 25 +- source4/dsdb/tests/python/urgent_replication.py | 116 +- source4/libnet/py_net.c | 6 +- source4/scripting/bin/samba_kcc | 4 +- source4/scripting/bin/samba_upgradeprovision | 2 +- source4/selftest/test_samba3dump.sh | 14 + source4/selftest/tests.py | 4 +- wscript | 10 +- 27 files changed, 1625 insertions(+), 1031 deletions(-) create mode 100755 buildtools/wafsamba/test_duplicate_symbol.sh create mode 100755 source4/selftest/test_samba3dump.sh Changeset truncated at 500 lines: diff --git a/.testr.conf b/.testr.conf index 00d0857..5a181e3 100644 --- a/.testr.conf +++ b/.testr.conf @@ -1,4 +1,4 @@ [DEFAULT] -test_command=./buildtools/bin/waf test --filtered-subunit $IDOPTION $LISTOPT +test_command=./buildtools/bin/waf testonly --filtered-subunit $IDOPTION $LISTOPT --with-selftest-prefix=$(mktemp -d) test_id_option=--load-list $IDFILE test_list_option=--list diff --git a/buildtools/wafsamba/samba3.py b/buildtools/wafsamba/samba3.py index 64cd8c7..ffe6784 100644 --- a/buildtools/wafsamba/samba3.py +++ b/buildtools/wafsamba/samba3.py @@ -6,16 +6,17 @@ from optparse import SUPPRESS_HELP from samba_utils import os_path_relpath, TO_LIST from samba_autoconf import library_flags + def SAMBA3_ADD_OPTION(opt, option, help=(), dest=None, default=True, with_name="with", without_name="without"): if default is None: - default_str="auto" - elif default == True: - default_str="yes" - elif default == False: - default_str="no" + default_str = "auto" + elif default is True: + default_str = "yes" + elif default is False: + default_str = "no" else: - default_str=str(default) + default_str = str(default) if help == (): help = ("Build with %s support (default=%s)" % (option, default_str)) diff --git a/buildtools/wafsamba/test_duplicate_symbol.sh b/buildtools/wafsamba/test_duplicate_symbol.sh new file mode 100755 index 0000000..712c7e6 --- /dev/null +++ b/buildtools/wafsamba/test_duplicate_symbol.sh @@ -0,0 +1,12 @@ +#!/bin/sh +# Run the waf duplicate symbol check, wrapped in subunit. + +. lib/subunit/shell/share/subunit.sh + +subunit_start_test duplicate_symbols + +if ./buildtools/bin/waf build --dup-symbol-check; then + subunit_pass_test duplicate_symbols +else + echo | subunit_fail_test duplicate_symbols +fi diff --git a/buildtools/wafsamba/wafsamba.py b/buildtools/wafsamba/wafsamba.py index f86ac61..b68b9d2 100644 --- a/buildtools/wafsamba/wafsamba.py +++ b/buildtools/wafsamba/wafsamba.py @@ -349,10 +349,10 @@ def SAMBA_BINARY(bld, binname, source, # only specify PIE flags for binaries pie_cflags = cflags pie_ldflags = TO_LIST(ldflags) - if bld.env['ENABLE_PIE'] == True: + if bld.env['ENABLE_PIE'] is True: pie_cflags += ' -fPIE' pie_ldflags.extend(TO_LIST('-pie')) - if bld.env['ENABLE_RELRO'] == True: + if bld.env['ENABLE_RELRO'] is True: pie_ldflags.extend(TO_LIST('-Wl,-z,relro,-z,now')) # first create a target for building the object files for this binary @@ -726,7 +726,8 @@ sys.path.insert(1, "%s")""" % (task.env["PYTHONARCHDIR"], task.env["PYTHONDIR"]) lineno = 0 for line in source_file: newline = line - if lineno == 0 and task.env["PYTHON_SPECIFIED"] == True and line[:2] == "#!": + if (lineno == 0 and task.env["PYTHON_SPECIFIED"] is True and + line[:2] == "#!"): newline = replacement_shebang elif pattern in line: newline = line.replace(pattern, replacement) diff --git a/lib/pep8/pep8.py b/lib/pep8/pep8.py index 227a9a3..b31a978 100755 --- a/lib/pep8/pep8.py +++ b/lib/pep8/pep8.py @@ -1,6 +1,7 @@ -#!/usr/bin/python +#!/usr/bin/env python # pep8.py - Check Python source code formatting, according to PEP 8 -# Copyright (C) 2006 Johann C. Rocholl <joh...@rocholl.net> +# Copyright (C) 2006-2009 Johann C. Rocholl <joh...@rocholl.net> +# Copyright (C) 2009-2014 Florent Xicluna <florent.xicl...@gmail.com> # # Permission is hereby granted, free of charge, to any person # obtaining a copy of this software and associated documentation files @@ -22,9 +23,8 @@ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -""" -Check Python source code formatting, according to PEP 8: -http://www.python.org/dev/peps/pep-0008/ +r""" +Check Python source code formatting, according to PEP 8. For usage and a list of options, try this: $ python pep8.py -h @@ -42,57 +42,11 @@ W warnings 500 line length 600 deprecation 700 statements - -You can add checks to this program by writing plugins. Each plugin is -a simple function that is called for each line of source code, either -physical or logical. - -Physical line: -- Raw line of text from the input file. - -Logical line: -- Multi-line statements converted to a single line. -- Stripped left and right. -- Contents of strings replaced with 'xxx' of same length. -- Comments removed. - -The check function requests physical or logical lines by the name of -the first argument: - -def maximum_line_length(physical_line) -def extraneous_whitespace(logical_line) -def blank_lines(logical_line, blank_lines, indent_level, line_number) - -The last example above demonstrates how check plugins can request -additional information with extra arguments. All attributes of the -Checker object are available. Some examples: - -lines: a list of the raw lines from the input file -tokens: the tokens that contribute to this logical line -line_number: line number in the input file -blank_lines: blank lines before this one -indent_char: first indentation character in this file (' ' or '\t') -indent_level: indentation (with tabs expanded to multiples of 8) -previous_indent_level: indentation on previous line -previous_logical: previous logical line - -The docstring of each check function shall be the relevant part of -text from PEP 8. It is printed if the user enables --show-pep8. -Several docstrings contain examples directly from the PEP 8 document. - -Okay: spam(ham[1], {eggs: 2}) -E201: spam( ham[1], {eggs: 2}) - -These examples are verified automatically when pep8.py is run with the ---doctest option. You can add examples for your own check functions. -The format is simple: "Okay" or error/warning code followed by colon -and space, the rest of the line is example source code. If you put 'r' -before the docstring, you can use \n for newline, \t for tab and \s -for space. - +900 syntax error """ +from __future__ import with_statement -__version__ = '0.5.1dev' +__version__ = '1.6.0a0' import os import sys @@ -104,42 +58,61 @@ import tokenize from optparse import OptionParser from fnmatch import fnmatch try: - frozenset -except NameError: - from sets import ImmutableSet as frozenset - - -DEFAULT_EXCLUDE = '.svn,CVS,.bzr,.hg,.git' -DEFAULT_IGNORE = 'E24' + from configparser import RawConfigParser + from io import TextIOWrapper +except ImportError: + from ConfigParser import RawConfigParser + +DEFAULT_EXCLUDE = '.svn,CVS,.bzr,.hg,.git,__pycache__' +DEFAULT_IGNORE = 'E123,E226,E24,E704' +if sys.platform == 'win32': + DEFAULT_CONFIG = os.path.expanduser(r'~\.pep8') +else: + DEFAULT_CONFIG = os.path.join(os.getenv('XDG_CONFIG_HOME') or + os.path.expanduser('~/.config'), 'pep8') +PROJECT_CONFIG = ('setup.cfg', 'tox.ini', '.pep8') +TESTSUITE_PATH = os.path.join(os.path.dirname(__file__), 'testsuite') MAX_LINE_LENGTH = 79 +REPORT_FORMAT = { + 'default': '%(path)s:%(row)d:%(col)d: %(code)s %(text)s', + 'pylint': '%(path)s:%(row)d: [%(code)s] %(text)s', +} + +PyCF_ONLY_AST = 1024 +SINGLETONS = frozenset(['False', 'None', 'True']) +KEYWORDS = frozenset(keyword.kwlist + ['print']) - SINGLETONS +UNARY_OPERATORS = frozenset(['>>', '**', '*', '+', '-']) +ARITHMETIC_OP = frozenset(['**', '*', '/', '//', '+', '-']) +WS_OPTIONAL_OPERATORS = ARITHMETIC_OP.union(['^', '&', '|', '<<', '>>', '%']) +WS_NEEDED_OPERATORS = frozenset([ + '**=', '*=', '/=', '//=', '+=', '-=', '!=', '<>', '<', '>', + '%=', '^=', '&=', '|=', '==', '<=', '>=', '<<=', '>>=', '=']) +WHITESPACE = frozenset(' \t') +NEWLINE = frozenset([tokenize.NL, tokenize.NEWLINE]) +SKIP_TOKENS = NEWLINE.union([tokenize.INDENT, tokenize.DEDENT]) +# ERRORTOKEN is triggered by backticks in Python 3 +SKIP_COMMENTS = SKIP_TOKENS.union([tokenize.COMMENT, tokenize.ERRORTOKEN]) +BENCHMARK_KEYS = ['directories', 'files', 'logical lines', 'physical lines'] INDENT_REGEX = re.compile(r'([ \t]*)') -RAISE_COMMA_REGEX = re.compile(r'raise\s+\w+\s*(,)') -SELFTEST_REGEX = re.compile(r'(Okay|[EW]\d{3}):\s(.*)') -ERRORCODE_REGEX = re.compile(r'[EW]\d{3}') +RAISE_COMMA_REGEX = re.compile(r'raise\s+\w+\s*,') +RERAISE_COMMA_REGEX = re.compile(r'raise\s+\w+\s*,.*,\s*\w+\s*$') +ERRORCODE_REGEX = re.compile(r'\b[A-Z]\d{3}\b') DOCSTRING_REGEX = re.compile(r'u?r?["\']') -WHITESPACE_AROUND_OPERATOR_REGEX = \ - re.compile('([^\w\s]*)\s*(\t| )\s*([^\w\s]*)') EXTRANEOUS_WHITESPACE_REGEX = re.compile(r'[[({] | []}),;:]') -WHITESPACE_AROUND_NAMED_PARAMETER_REGEX = \ - re.compile(r'[()]|\s=[^=]|[^=!<>]=\s') - - -WHITESPACE = ' \t' +WHITESPACE_AFTER_COMMA_REGEX = re.compile(r'[,;:]\s*(?: |\t)') +COMPARE_SINGLETON_REGEX = re.compile(r'([=!]=)\s*(None|False|True)') +COMPARE_NEGATIVE_REGEX = re.compile(r'\b(not)\s+[^[({ ]+\s+(in|is)\s') +COMPARE_TYPE_REGEX = re.compile(r'(?:[=!]=|is(?:\s+not)?)\s*type(?:s.\w+Type' + r'|\s*\(\s*([^)]*[^ )])\s*\))') +KEYWORD_REGEX = re.compile(r'(\s*)\b(?:%s)\b(\s*)' % r'|'.join(KEYWORDS)) +OPERATOR_REGEX = re.compile(r'(?:[^,\s])(\s*)(?:[-+*/|!<=>%&^]+)(\s*)') +LAMBDA_REGEX = re.compile(r'\blambda\b') +HUNK_REGEX = re.compile(r'^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@.*$') -BINARY_OPERATORS = frozenset(['**=', '*=', '+=', '-=', '!=', '<>', - '%=', '^=', '&=', '|=', '==', '/=', '//=', '<=', '>=', '<<=', '>>=', - '%', '^', '&', '|', '=', '/', '//', '<', '>', '<<']) -UNARY_OPERATORS = frozenset(['>>', '**', '*', '+', '-']) -OPERATORS = BINARY_OPERATORS | UNARY_OPERATORS -SKIP_TOKENS = frozenset([tokenize.COMMENT, tokenize.NL, tokenize.INDENT, - tokenize.DEDENT, tokenize.NEWLINE]) -E225NOT_KEYWORDS = (frozenset(keyword.kwlist + ['print']) - - frozenset(['False', 'None', 'True'])) -BENCHMARK_KEYS = ('directories', 'files', 'logical lines', 'physical lines') - -options = None -args = None +# Work around Python < 2.6 behaviour, which does not generate NL after +# a comment which is on a line by itself. +COMMENT_WITH_NL = tokenize.generate_tokens(['#\n'].pop).send(None)[1] == '#\n' ############################################################################## @@ -148,8 +121,7 @@ args = None def tabs_or_spaces(physical_line, indent_char): - r""" - Never mix tabs and spaces. + r"""Never mix tabs and spaces. The most popular way of indenting Python is with spaces only. The second-most popular way is with tabs only. Code indented with a mixture @@ -168,41 +140,30 @@ def tabs_or_spaces(physical_line, indent_char): def tabs_obsolete(physical_line): - r""" - For new projects, spaces-only are strongly recommended over tabs. Most - editors have features that make this easy to do. + r"""For new projects, spaces-only are strongly recommended over tabs. Okay: if True:\n return W191: if True:\n\treturn """ indent = INDENT_REGEX.match(physical_line).group(1) - if indent.count('\t'): + if '\t' in indent: return indent.index('\t'), "W191 indentation contains tabs" def trailing_whitespace(physical_line): - r""" - JCR: Trailing whitespace is superfluous. - FBM: Except when it occurs as part of a blank line (i.e. the line is - nothing but whitespace). According to Python docs[1] a line with only - whitespace is considered a blank line, and is to be ignored. However, - matching a blank line to its indentation level avoids mistakenly - terminating a multi-line statement (e.g. class declaration) when - pasting code into the standard Python interpreter. - - [1] http://docs.python.org/reference/lexical_analysis.html#blank-lines + r"""Trailing whitespace is superfluous. The warning returned varies on whether the line itself is blank, for easier filtering for those who want to indent their blank lines. - Okay: spam(1) - W291: spam(1)\s + Okay: spam(1)\n# + W291: spam(1) \n# W293: class Foo(object):\n \n bang = 12 """ physical_line = physical_line.rstrip('\n') # chr(10), newline physical_line = physical_line.rstrip('\r') # chr(13), carriage return physical_line = physical_line.rstrip('\x0c') # chr(12), form feed, ^L - stripped = physical_line.rstrip() + stripped = physical_line.rstrip(' \t\v') if physical_line != stripped: if stripped: return len(stripped), "W291 trailing whitespace" @@ -210,28 +171,24 @@ def trailing_whitespace(physical_line): return 0, "W293 blank line contains whitespace" -def trailing_blank_lines(physical_line, lines, line_number): - r""" - JCR: Trailing blank lines are superfluous. +def trailing_blank_lines(physical_line, lines, line_number, total_lines): + r"""Trailing blank lines are superfluous. Okay: spam(1) W391: spam(1)\n - """ - if physical_line.strip() == '' and line_number == len(lines): - return 0, "W391 blank line at end of file" - -def missing_newline(physical_line): - """ - JCR: The last line should have a newline. + However the last line should end with a new line (warning W292). """ - if physical_line.rstrip() == physical_line: - return len(physical_line), "W292 no newline at end of file" + if line_number == total_lines: + stripped_last_line = physical_line.rstrip() + if not stripped_last_line: + return 0, "W391 blank line at end of file" + if stripped_last_line == physical_line: + return len(physical_line), "W292 no newline at end of file" -def maximum_line_length(physical_line): - """ - Limit all lines to a maximum of 79 characters. +def maximum_line_length(physical_line, max_line_length, multiline): + r"""Limit all lines to a maximum of 79 characters. There are still many devices around that are limited to 80 character lines; plus, limiting windows to 80 characters makes it possible to have @@ -239,19 +196,28 @@ def maximum_line_length(physical_line): ugly. Therefore, please limit all lines to a maximum of 79 characters. For flowing long blocks of text (docstrings or comments), limiting the length to 72 characters is recommended. + + Reports error E501. """ line = physical_line.rstrip() length = len(line) - if length > MAX_LINE_LENGTH: - try: + if length > max_line_length and not noqa(line): + # Special case for long URLs in multi-line docstrings or comments, + # but still report the error when the 72 first chars are whitespaces. + chunks = line.split() + if ((len(chunks) == 1 and multiline) or + (len(chunks) == 2 and chunks[0] == '#')) and \ + len(line) - len(chunks[-1]) < max_line_length - 7: + return + if hasattr(line, 'decode'): # Python 2 # The line could contain multi-byte characters - if not hasattr(line, 'decode'): # Python 3 - line = line.encode('latin-1') - length = len(line.decode('utf-8')) - except UnicodeDecodeError: - pass - if length > MAX_LINE_LENGTH: - return MAX_LINE_LENGTH, "E501 line too long (%d characters)" % length + try: + length = len(line.decode('utf-8')) + except UnicodeError: + pass + if length > max_line_length: + return (max_line_length, "E501 line too long " + "(%d > %d characters)" % (length, max_line_length)) ############################################################################## @@ -260,10 +226,8 @@ def maximum_line_length(physical_line): def blank_lines(logical_line, blank_lines, indent_level, line_number, - previous_logical, previous_indent_level, - blank_lines_before_comment): - r""" - Separate top-level function and class definitions with two blank lines. + blank_before, previous_logical, previous_indent_level): + r"""Separate top-level function and class definitions with two blank lines. Method definitions inside a class are separated by a single blank line. @@ -282,31 +246,27 @@ def blank_lines(logical_line, blank_lines, indent_level, line_number, E303: def a():\n\n\n\n pass E304: @decorator\n\ndef a():\n pass """ - if line_number == 1: + if line_number < 3 and not previous_logical: return # Don't expect blank lines before the first line - max_blank_lines = max(blank_lines, blank_lines_before_comment) if previous_logical.startswith('@'): - if max_blank_lines: - return 0, "E304 blank lines found after function decorator" - elif max_blank_lines > 2 or (indent_level and max_blank_lines == 2): - return 0, "E303 too many blank lines (%d)" % max_blank_lines - elif (logical_line.startswith('def ') or - logical_line.startswith('class ') or - logical_line.startswith('@')): + if blank_lines: + yield 0, "E304 blank lines found after function decorator" + elif blank_lines > 2 or (indent_level and blank_lines == 2): + yield 0, "E303 too many blank lines (%d)" % blank_lines + elif logical_line.startswith(('def ', 'class ', '@')): if indent_level: - if not (max_blank_lines or previous_indent_level < indent_level or + if not (blank_before or previous_indent_level < indent_level or DOCSTRING_REGEX.match(previous_logical)): - return 0, "E301 expected 1 blank line, found 0" - elif max_blank_lines != 2: - return 0, "E302 expected 2 blank lines, found %d" % max_blank_lines + yield 0, "E301 expected 1 blank line, found 0" + elif blank_before != 2: + yield 0, "E302 expected 2 blank lines, found %d" % blank_before def extraneous_whitespace(logical_line): - """ - Avoid extraneous whitespace in the following situations: + r"""Avoid extraneous whitespace. + Avoid extraneous whitespace in these situations: - Immediately inside parentheses, brackets or braces. - - Immediately before a comma, semicolon, or colon. Okay: spam(ham[1], {eggs: 2}) @@ -326,18 +286,39 @@ def extraneous_whitespace(logical_line): text = match.group() char = text.strip() found = match.start() - if text == char + ' ' and char in '([{': - return found + 1, "E201 whitespace after '%s'" % char - if text == ' ' + char and line[found - 1] != ',': - if char in '}])': - return found, "E202 whitespace before '%s'" % char - if char in ',;:': - return found, "E203 whitespace before '%s'" % char + if text == char + ' ': + # assert char in '([{' + yield found + 1, "E201 whitespace after '%s'" % char + elif line[found - 1] != ',': + code = ('E202' if char in '}])' else 'E203') # if char in ',;:' + yield found, "%s whitespace before '%s'" % (code, char) -def missing_whitespace(logical_line): +def whitespace_around_keywords(logical_line): + r"""Avoid extraneous whitespace around keywords. + + Okay: True and False + E271: True and False + E272: True and False + E273: True and\tFalse + E274: True\tand False """ - JCR: Each comma, semicolon or colon should be followed by whitespace. + for match in KEYWORD_REGEX.finditer(logical_line): + before, after = match.groups() + + if '\t' in before: + yield match.start(1), "E274 tab before keyword" + elif len(before) > 1: + yield match.start(1), "E272 multiple spaces before keyword" + + if '\t' in after: + yield match.start(2), "E273 tab after keyword" + elif len(after) > 1: + yield match.start(2), "E271 multiple spaces after keyword" + + +def missing_whitespace(logical_line): -- Samba Shared Repository