src/eric7/Plugins/CheckerPlugins/CodeStyleChecker/pycodestyle.py

Sat, 05 Nov 2022 13:03:31 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 05 Nov 2022 13:03:31 +0100
branch
eric7
changeset 9477
903ee653bf23
parent 9375
e21b51a3d990
child 9592
2b3802c3c6d2
permissions
-rw-r--r--

Changed the imports style checker to be in sync with some isort options.

3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1 #!/usr/bin/env python
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
3
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
4 # pycodestyle.py - Check Python source code formatting, according to
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
5 # PEP 8
5288
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
6 #
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
7 # Copyright (C) 2006-2009 Johann C. Rocholl <johann@rocholl.net>
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
8 # Copyright (C) 2009-2014 Florent Xicluna <florent.xicluna@gmail.com>
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
9 # Copyright (C) 2014-2016 Ian Lee <ianlee1521@gmail.com>
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 #
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 # Permission is hereby granted, free of charge, to any person
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 # obtaining a copy of this software and associated documentation files
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 # (the "Software"), to deal in the Software without restriction,
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14 # including without limitation the rights to use, copy, modify, merge,
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15 # publish, distribute, sublicense, and/or sell copies of the Software,
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16 # and to permit persons to whom the Software is furnished to do so,
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 # subject to the following conditions:
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 #
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 # The above copyright notice and this permission notice shall be
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 # included in all copies or substantial portions of the Software.
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 #
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28 # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 # SOFTWARE.
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
31 r"""
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
32 Check Python source code formatting, according to PEP 8.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 For usage and a list of options, try this:
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
35 $ python pycodestyle.py -h
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37 This program and its regression test suite live here:
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
38 https://github.com/pycqa/pycodestyle
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 Groups of errors and warnings:
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 E errors
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42 W warnings
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 100 indentation
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44 200 whitespace
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 300 blank lines
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 400 imports
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47 500 line length
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48 600 deprecation
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 700 statements
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
50 900 syntax error
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 """
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53 #
6733
519422827ace Some minor modifications to Tobias' contribution.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6732
diff changeset
54 # This is a modified version to make the original pycodestyle.py better
7960
e8fc383322f7 Harmonized some user visible strings and changed the term 'eric6' to the more generic 'eric'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7923
diff changeset
55 # suitable for being called from within the eric IDE. The modifications
6733
519422827ace Some minor modifications to Tobias' contribution.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6732
diff changeset
56 # are as follows:
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 #
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 # - made messages translatable via Qt
7960
e8fc383322f7 Harmonized some user visible strings and changed the term 'eric6' to the more generic 'eric'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7923
diff changeset
59 # - added code for eric integration
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 #
8881
54e42bc2437a Updated copyright for 2022.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8682
diff changeset
61 # Copyright (c) 2011 - 2022 Detlev Offenbach <detlev@die-offenbachs.de>
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62 #
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63
8682
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
64 import bisect
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 import inspect
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 import keyword
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
67 import os
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
68 import re
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
69 import sys
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
70 import time
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 import tokenize
5288
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
72 import warnings
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
73
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
74 from fnmatch import fnmatch
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
75 from functools import lru_cache
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 from optparse import OptionParser
5288
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
77
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 try:
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
79 from configparser import RawConfigParser
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
80 from io import TextIOWrapper
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
81 except ImportError:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
82 from ConfigParser import RawConfigParser # __IGNORE_WARNING__
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83
8682
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
84 # this is a performance hack. see https://bugs.python.org/issue43014
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
85 if (
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
86 sys.version_info < (3, 10) and
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
87 callable(getattr(tokenize, '_compile', None))
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
88 ): # pragma: no cover (<py310)
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
89 tokenize._compile = lru_cache()(tokenize._compile) # type: ignore
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
90
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
91 __version__ = '2.9.1-eric'
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
92
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
93 DEFAULT_EXCLUDE = '.svn,CVS,.bzr,.hg,.git,__pycache__,.tox'
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
94 DEFAULT_IGNORE = 'E121,E123,E126,E226,E24,E704,W503,W504'
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
95 try:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
96 if sys.platform == 'win32':
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
97 USER_CONFIG = os.path.expanduser(r'~\.pycodestyle')
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
98 else:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
99 USER_CONFIG = os.path.join(
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
100 os.getenv('XDG_CONFIG_HOME') or os.path.expanduser('~/.config'),
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
101 'pycodestyle'
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
102 )
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
103 except ImportError:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
104 USER_CONFIG = None
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
105
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
106 PROJECT_CONFIG = ('setup.cfg', 'tox.ini')
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
107 TESTSUITE_PATH = os.path.join(os.path.dirname(__file__), 'testsuite')
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 MAX_LINE_LENGTH = 79
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
109 # Number of blank lines between various code parts.
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
110 BLANK_LINES_CONFIG = {
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
111 # Top level class and function.
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
112 'top_level': 2,
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
113 # Methods and nested class and function.
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
114 'method': 1,
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
115 }
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
116 MAX_DOC_LENGTH = 72
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
117 INDENT_SIZE = 4
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
118 REPORT_FORMAT = {
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
119 'default': '%(path)s:%(row)d:%(col)d: %(code)s %(text)s',
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
120 'pylint': '%(path)s:%(row)d: [%(code)s] %(text)s',
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
121 }
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
122
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
123 PyCF_ONLY_AST = 1024
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
124 SINGLETONS = frozenset(['False', 'None', 'True'])
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
125 KEYWORDS = frozenset(keyword.kwlist + ['print', 'async']) - SINGLETONS
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
126 UNARY_OPERATORS = frozenset(['>>', '**', '*', '+', '-'])
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
127 ARITHMETIC_OP = frozenset(['**', '*', '/', '//', '+', '-', '@'])
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
128 WS_OPTIONAL_OPERATORS = ARITHMETIC_OP.union(['^', '&', '|', '<<', '>>', '%'])
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
129 ASSIGNMENT_EXPRESSION_OP = [':='] if sys.version_info >= (3, 8) else []
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
130 WS_NEEDED_OPERATORS = frozenset([
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
131 '**=', '*=', '/=', '//=', '+=', '-=', '!=', '<>', '<', '>',
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
132 '%=', '^=', '&=', '|=', '==', '<=', '>=', '<<=', '>>=', '=',
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
133 'and', 'in', 'is', 'or', '->'] +
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
134 ASSIGNMENT_EXPRESSION_OP)
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
135 WHITESPACE = frozenset(' \t\xa0')
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
136 NEWLINE = frozenset([tokenize.NL, tokenize.NEWLINE])
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
137 SKIP_TOKENS = NEWLINE.union([tokenize.INDENT, tokenize.DEDENT])
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
138 # ERRORTOKEN is triggered by backticks in Python 3
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
139 SKIP_COMMENTS = SKIP_TOKENS.union([tokenize.COMMENT, tokenize.ERRORTOKEN])
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
140 BENCHMARK_KEYS = ['directories', 'files', 'logical lines', 'physical lines']
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142 INDENT_REGEX = re.compile(r'([ \t]*)')
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
143 RAISE_COMMA_REGEX = re.compile(r'raise\s+\w+\s*,')
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
144 RERAISE_COMMA_REGEX = re.compile(r'raise\s+\w+\s*,.*,\s*\w+\s*$')
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
145 ERRORCODE_REGEX = re.compile(r'\b[A-Z]\d{3}\b')
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 DOCSTRING_REGEX = re.compile(r'u?r?["\']')
8682
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
147 EXTRANEOUS_WHITESPACE_REGEX = re.compile(r'[\[({][ \t]|[ \t][\]}),;:](?!=)')
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
148 WHITESPACE_AFTER_COMMA_REGEX = re.compile(r'[,;:]\s*(?: |\t)')
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
149 COMPARE_SINGLETON_REGEX = re.compile(r'(\bNone|\bFalse|\bTrue)?\s*([=!]=)'
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
150 r'\s*(?(1)|(None|False|True))\b')
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
151 COMPARE_NEGATIVE_REGEX = re.compile(r'\b(?<!is\s)(not)\s+[^][)(}{ ]+\s+'
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
152 r'(in|is)\s')
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
153 COMPARE_TYPE_REGEX = re.compile(r'(?:[=!]=|is(?:\s+not)?)\s+type(?:s.\w+Type'
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
154 r'|\s*\(\s*([^)]*[^ )])\s*\))')
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
155 KEYWORD_REGEX = re.compile(r'(\s*)\b(?:%s)\b(\s*)' % r'|'.join(KEYWORDS))
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
156 OPERATOR_REGEX = re.compile(r'(?:[^,\s])(\s*)(?:[-+*/|!<=>%&^]+|:=)(\s*)')
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
157 LAMBDA_REGEX = re.compile(r'\blambda\b')
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
158 HUNK_REGEX = re.compile(r'^@@ -\d+(?:,\d+)? \+(\d+)(?:,(\d+))? @@.*$')
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
159 STARTSWITH_DEF_REGEX = re.compile(r'^(async\s+def|def)\b')
5509
d4c4763b46ee Upgraded pycodestyle to version 2.3.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5435
diff changeset
160 STARTSWITH_TOP_LEVEL_REGEX = re.compile(r'^(async\s+def\s+|def\s+|class\s+|@)')
d4c4763b46ee Upgraded pycodestyle to version 2.3.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5435
diff changeset
161 STARTSWITH_INDENT_STATEMENT_REGEX = re.compile(
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
162 r'^\s*({})\b'.format('|'.join(s.replace(' ', r'\s+') for s in (
5509
d4c4763b46ee Upgraded pycodestyle to version 2.3.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5435
diff changeset
163 'def', 'async def',
d4c4763b46ee Upgraded pycodestyle to version 2.3.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5435
diff changeset
164 'for', 'async for',
d4c4763b46ee Upgraded pycodestyle to version 2.3.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5435
diff changeset
165 'if', 'elif', 'else',
d4c4763b46ee Upgraded pycodestyle to version 2.3.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5435
diff changeset
166 'try', 'except', 'finally',
d4c4763b46ee Upgraded pycodestyle to version 2.3.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5435
diff changeset
167 'with', 'async with',
d4c4763b46ee Upgraded pycodestyle to version 2.3.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5435
diff changeset
168 'class',
d4c4763b46ee Upgraded pycodestyle to version 2.3.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5435
diff changeset
169 'while',
d4c4763b46ee Upgraded pycodestyle to version 2.3.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5435
diff changeset
170 )))
d4c4763b46ee Upgraded pycodestyle to version 2.3.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5435
diff changeset
171 )
8682
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
172 DUNDER_REGEX = re.compile(r"^__([^\s]+)__(?::\s*[a-zA-Z.0-9_\[\]\"]+)? = ")
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
173 BLANK_EXCEPT_REGEX = re.compile(r"except\s*:")
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
175 _checks = {'physical_line': {}, 'logical_line': {}, 'tree': {}}
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
176
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
177
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
178 def _get_parameters(function):
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
179 return [parameter.name
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
180 for parameter
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
181 in inspect.signature(function).parameters.values()
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
182 if parameter.kind == parameter.POSITIONAL_OR_KEYWORD]
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
183
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
184
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
185 def register_check(check, codes=None):
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
186 """Register a new check object."""
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
187 def _add_check(check, kind, codes, args):
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
188 if check in _checks[kind]:
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
189 _checks[kind][check][0].extend(codes or [])
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
190 else:
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
191 _checks[kind][check] = (codes or [''], args)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
192 if inspect.isfunction(check):
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
193 args = _get_parameters(check)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
194 if args and args[0] in ('physical_line', 'logical_line'):
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
195 if codes is None:
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
196 codes = ERRORCODE_REGEX.findall(check.__doc__ or '')
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
197 _add_check(check, args[0], codes, args)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
198 elif inspect.isclass(check):
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
199 if _get_parameters(check.__init__)[:2] == ['self', 'tree']:
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
200 _add_check(check, 'tree', codes, None)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
201 return check
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
202
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
203
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
204 ########################################################################
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205 # Plugins (check functions) for physical lines
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
206 ########################################################################
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
208 @register_check
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 def tabs_or_spaces(physical_line, indent_char):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
210 r"""Never mix tabs and spaces.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212 The most popular way of indenting Python is with spaces only. The
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
213 second-most popular way is with tabs only. Code indented with a
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
214 mixture of tabs and spaces should be converted to using spaces
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
215 exclusively. When invoking the Python command line interpreter with
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
216 the -t option, it issues warnings about code that illegally mixes
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
217 tabs and spaces. When using -tt these warnings become errors.
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
218 These options are highly recommended!
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
220 Okay: if a == 0:\n a = 1\n b = 1
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 E101: if a == 0:\n a = 1\n\tb = 1
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
222 """
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
223 indent = INDENT_REGEX.match(physical_line).group(1)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 for offset, char in enumerate(indent):
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225 if char != indent_char:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
226 return offset, "E101 indentation contains mixed spaces and tabs"
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
228
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
229 @register_check
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230 def tabs_obsolete(physical_line):
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
231 r"""On new projects, spaces-only are strongly recommended over tabs.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
232
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
233 Okay: if True:\n return
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
234 W191: if True:\n\treturn
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
235 """
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
236 indent = INDENT_REGEX.match(physical_line).group(1)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
237 if '\t' in indent:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
238 return indent.index('\t'), "W191 indentation contains tabs"
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
241 @register_check
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
242 def trailing_whitespace(physical_line):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
243 r"""Trailing whitespace is superfluous.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
244
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
245 The warning returned varies on whether the line itself is blank,
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
246 for easier filtering for those who want to indent their blank lines.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
247
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
248 Okay: spam(1)\n#
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
249 W291: spam(1) \n#
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250 W293: class Foo(object):\n \n bang = 12
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
251 """
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
252 physical_line = physical_line.rstrip('\n') # chr(10), newline
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
253 physical_line = physical_line.rstrip('\r') # chr(13), carriage return
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254 physical_line = physical_line.rstrip('\x0c') # chr(12), form feed, ^L
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
255 stripped = physical_line.rstrip(' \t\v')
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256 if physical_line != stripped:
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
257 if stripped:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
258 return len(stripped), "W291 trailing whitespace"
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
259 else:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
260 return 0, "W293 blank line contains whitespace"
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
262
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
263 @register_check
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
264 def trailing_blank_lines(physical_line, lines, line_number, total_lines):
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
265 r"""Trailing blank lines are superfluous.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
266
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
267 Okay: spam(1)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
268 W391: spam(1)\n
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
269
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
270 However the last line should end with a new line (warning W292).
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
271 """
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
272 if line_number == total_lines:
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
273 stripped_last_line = physical_line.rstrip('\r\n')
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
274 if physical_line and not stripped_last_line:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
275 return 0, "W391 blank line at end of file"
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
276 if stripped_last_line == physical_line:
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
277 return len(lines[-1]), "W292 no newline at end of file"
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
278
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
279
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
280 @register_check
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
281 def maximum_line_length(physical_line, max_line_length, multiline,
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
282 line_number, noqa):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
283 r"""Limit all lines to a maximum of 79 characters.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
284
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285 There are still many devices around that are limited to 80 character
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
286 lines; plus, limiting windows to 80 characters makes it possible to
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
287 have several windows side-by-side. The default wrapping on such
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
288 devices looks ugly. Therefore, please limit all lines to a maximum
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
289 of 79 characters. For flowing long blocks of text (docstrings or
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
290 comments), limiting the length to 72 characters is recommended.
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
291
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
292 Reports error E501.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
293 """
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
294 line = physical_line.rstrip()
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
295 length = len(line)
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
296 if length > max_line_length and not noqa:
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
297 # Special case: ignore long shebang lines.
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
298 if line_number == 1 and line.startswith('#!'):
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
299 return
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
300 # Special case for long URLs in multi-line docstrings or
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
301 # comments, but still report the error when the 72 first chars
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
302 # are whitespaces.
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
303 chunks = line.split()
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
304 if ((len(chunks) == 1 and multiline) or
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
305 (len(chunks) == 2 and chunks[0] == '#')) and \
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
306 len(line) - len(chunks[-1]) < max_line_length - 7:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
307 return
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
308 if length > max_line_length:
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
309 return (max_line_length, "E501 line too long "
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
310 "(%d > %d characters)" % (length, max_line_length),
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
311 length, max_line_length)
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
312
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
313
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
314 ########################################################################
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
315 # Plugins (check functions) for logical lines
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
316 ########################################################################
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
317
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
318
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
319 def _is_one_liner(logical_line, indent_level, lines, line_number):
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
320 if not STARTSWITH_TOP_LEVEL_REGEX.match(logical_line):
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
321 return False
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
322
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
323 line_idx = line_number - 1
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
324
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
325 if line_idx < 1:
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
326 prev_indent = 0
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
327 else:
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
328 prev_indent = expand_indent(lines[line_idx - 1])
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
329
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
330 if prev_indent > indent_level:
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
331 return False
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
332
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
333 while line_idx < len(lines):
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
334 line = lines[line_idx].strip()
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
335 if not line.startswith('@') and STARTSWITH_TOP_LEVEL_REGEX.match(line):
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
336 break
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
337 else:
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
338 line_idx += 1
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
339 else:
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
340 return False # invalid syntax: EOF while searching for def/class
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
341
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
342 next_idx = line_idx + 1
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
343 while next_idx < len(lines):
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
344 if lines[next_idx].strip():
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
345 break
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
346 else:
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
347 next_idx += 1
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
348 else:
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
349 return True # line is last in the file
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
350
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
351 return expand_indent(lines[next_idx]) <= indent_level
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
352
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
353
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
354 @register_check
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
355 def blank_lines(logical_line, blank_lines, indent_level, line_number,
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
356 blank_before, previous_logical,
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
357 previous_unindented_logical_line, previous_indent_level,
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
358 lines):
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
359 r"""Separate top-level function and class definitions with two blank
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
360 lines.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
361
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
362 Method definitions inside a class are separated by a single blank
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
363 line.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
364
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
365 Extra blank lines may be used (sparingly) to separate groups of
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
366 related functions. Blank lines may be omitted between a bunch of
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
367 related one-liners (e.g. a set of dummy implementations).
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
368
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
369 Use blank lines in functions, sparingly, to indicate logical
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
370 sections.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
371
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
372 Okay: def a():\n pass\n\n\ndef b():\n pass
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
373 Okay: def a():\n pass\n\n\nasync def b():\n pass
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
374 Okay: def a():\n pass\n\n\n# Foo\n# Bar\n\ndef b():\n pass
5303
83ab5275f255 Take over pull request #593 to ignore variables starting with "def" or "class" on code E305.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5290
diff changeset
375 Okay: default = 1\nfoo = 1
83ab5275f255 Take over pull request #593 to ignore variables starting with "def" or "class" on code E305.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5290
diff changeset
376 Okay: classify = 1\nfoo = 1
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
377
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
378 E301: class Foo:\n b = 0\n def bar():\n pass
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
379 E302: def a():\n pass\n\ndef b(n):\n pass
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
380 E302: def a():\n pass\n\nasync def b(n):\n pass
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
381 E303: def a():\n pass\n\n\n\ndef b(n):\n pass
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
382 E303: def a():\n\n\n\n pass
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
383 E304: @decorator\n\ndef a():\n pass
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
384 E305: def a():\n pass\na()
5509
d4c4763b46ee Upgraded pycodestyle to version 2.3.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5435
diff changeset
385 E306: def a():\n def b():\n pass\n def c():\n pass
6263
4dd53711d869 pycodestyle.py: enhanced the 'blank lines before' test to make the reported errors more specific (introduced new error codes E307 and E308)
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6246
diff changeset
386 E307: def a():\n def b():\n pass\n\n\n def c():\n pass
4dd53711d869 pycodestyle.py: enhanced the 'blank lines before' test to make the reported errors more specific (introduced new error codes E307 and E308)
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6246
diff changeset
387 E308: def a():\n\n\n\n pass
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
388 """ # noqa
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
389 top_level_lines = BLANK_LINES_CONFIG['top_level']
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
390 method_lines = BLANK_LINES_CONFIG['method']
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
391
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
392 if not previous_logical and blank_before < top_level_lines:
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
393 return # Don't expect blank lines before the first line
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
394 if previous_logical.startswith('@'):
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
395 if blank_lines:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
396 yield 0, "E304 blank lines found after function decorator"
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
397 elif (blank_lines > top_level_lines or
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
398 (indent_level and blank_lines == method_lines + 1)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
399 ):
6263
4dd53711d869 pycodestyle.py: enhanced the 'blank lines before' test to make the reported errors more specific (introduced new error codes E307 and E308)
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6246
diff changeset
400 if indent_level:
4dd53711d869 pycodestyle.py: enhanced the 'blank lines before' test to make the reported errors more specific (introduced new error codes E307 and E308)
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6246
diff changeset
401 if previous_logical.strip().startswith(('def ', 'class ')):
4dd53711d869 pycodestyle.py: enhanced the 'blank lines before' test to make the reported errors more specific (introduced new error codes E307 and E308)
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6246
diff changeset
402 yield (0, "E308 too many blank lines (%d)", blank_lines)
4dd53711d869 pycodestyle.py: enhanced the 'blank lines before' test to make the reported errors more specific (introduced new error codes E307 and E308)
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6246
diff changeset
403 else:
4dd53711d869 pycodestyle.py: enhanced the 'blank lines before' test to make the reported errors more specific (introduced new error codes E307 and E308)
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6246
diff changeset
404 yield (0, "E307 too many blank lines (%d) in a nested "
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
405 "scope, expected %d", blank_lines, method_lines)
6263
4dd53711d869 pycodestyle.py: enhanced the 'blank lines before' test to make the reported errors more specific (introduced new error codes E307 and E308)
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6246
diff changeset
406 else:
4dd53711d869 pycodestyle.py: enhanced the 'blank lines before' test to make the reported errors more specific (introduced new error codes E307 and E308)
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6246
diff changeset
407 yield (0, "E303 too many blank lines (%d), expected %d",
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
408 blank_lines, top_level_lines)
5509
d4c4763b46ee Upgraded pycodestyle to version 2.3.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5435
diff changeset
409 elif STARTSWITH_TOP_LEVEL_REGEX.match(logical_line):
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
410 # allow a group of one-liners
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
411 if (
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
412 _is_one_liner(logical_line, indent_level, lines, line_number) and
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
413 blank_before == 0
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
414 ):
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
415 return
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
416 if indent_level:
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
417 if not (blank_before == method_lines or
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
418 previous_indent_level < indent_level or
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
419 DOCSTRING_REGEX.match(previous_logical)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
420 ):
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
421 ancestor_level = indent_level
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
422 nested = False
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
423 # Search backwards for a def ancestor or tree root
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
424 # (top level).
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
425 for line in lines[line_number - top_level_lines::-1]:
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
426 if line.strip() and expand_indent(line) < ancestor_level:
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
427 ancestor_level = expand_indent(line)
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
428 nested = STARTSWITH_DEF_REGEX.match(line.lstrip())
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
429 if nested or ancestor_level == 0:
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
430 break
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
431 if nested:
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
432 yield (0, "E306 expected {} blank lines before a "
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
433 "nested definition, found {}", method_lines,
6263
4dd53711d869 pycodestyle.py: enhanced the 'blank lines before' test to make the reported errors more specific (introduced new error codes E307 and E308)
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6246
diff changeset
434 blank_before)
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
435 else:
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
436 yield (0, "E301 expected {} blank lines, found %d",
6263
4dd53711d869 pycodestyle.py: enhanced the 'blank lines before' test to make the reported errors more specific (introduced new error codes E307 and E308)
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6246
diff changeset
437 method_lines, blank_before)
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
438 elif blank_before != top_level_lines:
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
439 yield (0, "E302 expected {} blank lines, found {}",
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
440 top_level_lines, blank_before)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
441 elif (logical_line and
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
442 not indent_level and
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
443 blank_before != top_level_lines and
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
444 previous_unindented_logical_line.startswith(('def ', 'class '))
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
445 ):
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
446 yield (0, "E305 expected {} blank lines after " \
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
447 "class or function definition, found {}",
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
448 top_level_lines, blank_before)
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
449
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
450
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
451 @register_check
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
452 def extraneous_whitespace(logical_line):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
453 r"""Avoid extraneous whitespace.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
454
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
455 Avoid extraneous whitespace in these situations:
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
456 - Immediately inside parentheses, brackets or braces.
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
457 - Immediately before a comma, semicolon, or colon.
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
458
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
459 Okay: spam(ham[1], {eggs: 2})
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
460 E201: spam( ham[1], {eggs: 2})
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
461 E201: spam(ham[ 1], {eggs: 2})
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
462 E201: spam(ham[1], { eggs: 2})
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
463 E202: spam(ham[1], {eggs: 2} )
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
464 E202: spam(ham[1 ], {eggs: 2})
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
465 E202: spam(ham[1], {eggs: 2 })
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
466
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
467 E203: if x == 4: print x, y; x, y = y , x
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
468 E203: if x == 4: print x, y ; x, y = y, x
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
469 E203: if x == 4 : print x, y; x, y = y, x
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
470 """
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
471 line = logical_line
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
472 for match in EXTRANEOUS_WHITESPACE_REGEX.finditer(line):
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
473 text = match.group()
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
474 char = text.strip()
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
475 found = match.start()
8682
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
476 if text[-1].isspace():
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
477 # assert char in '([{'
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
478 yield found + 1, "E201 whitespace after '%s'", char
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
479 elif line[found - 1] != ',':
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
480 code = ('E202' if char in '}])' else 'E203') # if char in ',;:'
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
481 yield found, f"{code} whitespace before '{char}'", char
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
482
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
483
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
484 @register_check
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
485 def whitespace_around_keywords(logical_line):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
486 r"""Avoid extraneous whitespace around keywords.
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
487
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
488 Okay: True and False
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
489 E271: True and False
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
490 E272: True and False
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
491 E273: True and\tFalse
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
492 E274: True\tand False
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
493 """
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
494 for match in KEYWORD_REGEX.finditer(logical_line):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
495 before, after = match.groups()
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
496
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
497 if '\t' in before:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
498 yield match.start(1), "E274 tab before keyword"
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
499 elif len(before) > 1:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
500 yield match.start(1), "E272 multiple spaces before keyword"
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
501
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
502 if '\t' in after:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
503 yield match.start(2), "E273 tab after keyword"
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
504 elif len(after) > 1:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
505 yield match.start(2), "E271 multiple spaces after keyword"
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
506
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
507
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
508 @register_check
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
509 def missing_whitespace_after_keyword(logical_line, tokens):
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
510 r"""Keywords should be followed by whitespace.
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
511
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
512 Okay: from foo import (bar, baz)
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
513 E275: from foo import(bar, baz)
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
514 E275: from importable.module import(bar, baz)
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
515 E275: if(foo): bar
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
516 """
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
517 for tok0, tok1 in zip(tokens, tokens[1:]):
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
518 # This must exclude the True/False/None singletons, which can
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
519 # appear e.g. as "if x is None:", and async/await, which were
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
520 # valid identifier names in old Python versions.
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
521 if (tok0.end == tok1.start and
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
522 keyword.iskeyword(tok0.string) and
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
523 tok0.string not in SINGLETONS and
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
524 tok0.string not in ('async', 'await') and
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
525 not (tok0.string == 'except' and tok1.string == '*') and
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
526 not (tok0.string == 'yield' and tok1.string == ')') and
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
527 tok1.string not in ':\n'):
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
528 yield tok0.end, "E275 missing whitespace after keyword"
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
529
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
530
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
531 @register_check
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
532 def missing_whitespace(logical_line):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
533 r"""Each comma, semicolon or colon should be followed by whitespace.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
534
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
535 Okay: [a, b]
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
536 Okay: (3,)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
537 Okay: a[1:4]
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
538 Okay: a[:4]
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
539 Okay: a[1:]
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
540 Okay: a[1:4:2]
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
541 E231: ['a','b']
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
542 E231: foo(bar,baz)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
543 E231: [{'a':'b'}]
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
544 """
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
545 line = logical_line
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
546 for index in range(len(line) - 1):
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
547 char = line[index]
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
548 next_char = line[index + 1]
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
549 if char in ',;:' and next_char not in WHITESPACE:
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
550 before = line[:index]
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
551 if char == ':' and before.count('[') > before.count(']') and \
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
552 before.rfind('{') < before.rfind('['):
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
553 continue # Slice syntax, no space required
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
554 if char == ',' and next_char == ')':
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
555 continue # Allow tuple with only one element: (3,)
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
556 if char == ':' and next_char == '=' and sys.version_info >= (3, 8):
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
557 continue # Allow assignment expression
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
558 yield index, "E231 missing whitespace after '%s'", char
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
559
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
560
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
561 @register_check
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
562 def indentation(logical_line, previous_logical, indent_char,
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
563 indent_level, previous_indent_level,
8682
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
564 indent_size):
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
565 r"""Use indent_size (PEP8 says 4) spaces per indentation level.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
566
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
567 For really old code that you don't want to mess up, you can continue
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
568 to use 8-space tabs.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
569
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
570 Okay: a = 1
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
571 Okay: if a == 0:\n a = 1
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
572 E111: a = 1
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
573 E114: # a = 1
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
574
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
575 Okay: for item in items:\n pass
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
576 E112: for item in items:\npass
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
577 E115: for item in items:\n# Hi\n pass
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
578
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
579 Okay: a = 1\nb = 2
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
580 E113: a = 1\n b = 2
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
581 E116: a = 1\n # b = 2
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
582 """
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
583 c = 0 if logical_line else 3
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
584 tmpl = "E11%d %s" if logical_line else "E11%d %s (comment)"
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
585 if indent_level % indent_size:
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
586 yield 0, tmpl % (
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
587 1 + c,
8682
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
588 "indentation is not a multiple of " + str(indent_size),
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
589 )
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
590 indent_expect = previous_logical.endswith(':')
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
591 if indent_expect and indent_level <= previous_indent_level:
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
592 yield 0, tmpl % (2 + c, "expected an indented block")
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
593 elif not indent_expect and indent_level > previous_indent_level:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
594 yield 0, tmpl % (3 + c, "unexpected indentation")
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
595
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
596 if indent_expect:
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
597 expected_indent_amount = 8 if indent_char == '\t' else 4
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
598 expected_indent_level = previous_indent_level + expected_indent_amount
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
599 if indent_level > expected_indent_level:
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
600 yield 0, tmpl % (7, 'over-indented')
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
601
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
602
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
603 @register_check
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
604 def continued_indentation(logical_line, tokens, indent_level, hang_closing,
8682
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
605 indent_char, indent_size, noqa, verbose):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
606 r"""Continuation lines indentation.
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
607
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
608 Continuation lines should align wrapped elements either vertically
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
609 using Python's implicit line joining inside parentheses, brackets
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
610 and braces, or using a hanging indent.
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
611
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
612 When using a hanging indent these considerations should be applied:
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
613 - there should be no arguments on the first line, and
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
614 - further indentation should be used to clearly distinguish itself
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
615 as a continuation line.
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
616
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
617 Okay: a = (\n)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
618 E123: a = (\n )
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
619
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
620 Okay: a = (\n 42)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
621 E121: a = (\n 42)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
622 E122: a = (\n42)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
623 E123: a = (\n 42\n )
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
624 E124: a = (24,\n 42\n)
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
625 E125: if (\n b):\n pass
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
626 E126: a = (\n 42)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
627 E127: a = (24,\n 42)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
628 E128: a = (24,\n 42)
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
629 E129: if (a or\n b):\n pass
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
630 E131: a = (\n 42\n 24)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
631 """
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
632 first_row = tokens[0][2][0]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
633 nrows = 1 + tokens[-1][2][0] - first_row
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
634 if noqa or nrows == 1:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
635 return
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
636
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
637 # indent_next tells us whether the next block is indented; assuming
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
638 # that it is indented by 4 spaces, then we should not allow 4-space
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
639 # indents on the final continuation line; in turn, some other
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
640 # indents are allowed to have an extra 4 spaces.
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
641 indent_next = logical_line.endswith(':')
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
642
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
643 row = depth = 0
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
644 valid_hangs = (indent_size,) if indent_char != '\t' \
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
645 else (indent_size, indent_size * 2)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
646 # remember how many brackets were opened on each line
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
647 parens = [0] * nrows
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
648 # relative indents of physical lines
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
649 rel_indent = [0] * nrows
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
650 # for each depth, collect a list of opening rows
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
651 open_rows = [[0]]
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
652 # for each depth, memorize the hanging indentation
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
653 hangs = [None]
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
654 # visual indents
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
655 indent_chances = {}
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
656 last_indent = tokens[0][2]
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
657 visual_indent = None
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
658 last_token_multiline = False
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
659 # for each depth, memorize the visual indent column
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
660 indent = [last_indent[1]]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
661 if verbose >= 3:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
662 print(">>> " + tokens[0][4].rstrip())
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
663
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
664 for token_type, text, start, end, line in tokens:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
665
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
666 newline = row < start[0] - first_row
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
667 if newline:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
668 row = start[0] - first_row
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
669 newline = not last_token_multiline and token_type not in NEWLINE
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
670
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
671 if newline:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
672 # this is the beginning of a continuation line.
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
673 last_indent = start
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
674 if verbose >= 3:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
675 print("... " + line.rstrip())
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
676
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
677 # record the initial indent.
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
678 rel_indent[row] = expand_indent(line) - indent_level
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
679
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
680 # identify closing bracket
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
681 close_bracket = (token_type == tokenize.OP and text in ']})')
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
682
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
683 # is the indent relative to an opening bracket line?
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
684 for open_row in reversed(open_rows[depth]):
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
685 hang = rel_indent[row] - rel_indent[open_row]
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
686 hanging_indent = hang in valid_hangs
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
687 if hanging_indent:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
688 break
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
689 if hangs[depth]:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
690 hanging_indent = (hang == hangs[depth])
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
691 # is there any chance of visual indent?
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
692 visual_indent = (not close_bracket and hang > 0 and
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
693 indent_chances.get(start[1]))
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
694
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
695 if close_bracket and indent[depth]:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
696 # closing bracket for visual indent
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
697 if start[1] != indent[depth]:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
698 yield (start, "E124 closing bracket does not match "
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
699 "visual indentation")
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
700 elif close_bracket and not hang:
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
701 # closing bracket matches indentation of opening
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
702 # bracket's line
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
703 if hang_closing:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
704 yield start, "E133 closing bracket is missing indentation"
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
705 elif indent[depth] and start[1] < indent[depth]:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
706 if visual_indent is not True:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
707 # visual indent is broken
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
708 yield (start, "E128 continuation line "
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
709 "under-indented for visual indent")
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
710 elif hanging_indent or (indent_next and
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
711 rel_indent[row] == 2 * indent_size):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
712 # hanging indent is verified
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
713 if close_bracket and not hang_closing:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
714 yield (start, "E123 closing bracket does not match "
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
715 "indentation of opening bracket's line")
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
716 hangs[depth] = hang
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
717 elif visual_indent is True:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
718 # visual indent is verified
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
719 indent[depth] = start[1]
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
720 elif visual_indent in (text, str):
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
721 # ignore token lined up with matching one from a
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
722 # previous line
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
723 pass
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
724 else:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
725 # indent is broken
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
726 if hang <= 0:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
727 error = "E122", "missing indentation or outdented"
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
728 elif indent[depth]:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
729 error = "E127", "over-indented for visual indent"
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
730 elif not close_bracket and hangs[depth]:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
731 error = "E131", "unaligned for hanging indent"
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
732 else:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
733 hangs[depth] = hang
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
734 if hang > indent_size:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
735 error = "E126", "over-indented for hanging indent"
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
736 else:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
737 error = "E121", "under-indented for hanging indent"
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
738 yield start, "%s continuation line %s" % error
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
739
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
740 # look for visual indenting
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
741 if (parens[row] and
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
742 token_type not in (tokenize.NL, tokenize.COMMENT) and
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
743 not indent[depth]):
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
744 indent[depth] = start[1]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
745 indent_chances[start[1]] = True
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
746 if verbose >= 4:
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
747 print(f"bracket depth {depth} indent to {start[1]}")
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
748 # deal with implicit string concatenation
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
749 elif (token_type in (tokenize.STRING, tokenize.COMMENT) or
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
750 text in ('u', 'ur', 'b', 'br')):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
751 indent_chances[start[1]] = str
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
752 # visual indent after assert/raise/with
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
753 elif not row and not depth and text in ["assert", "raise", "with"]:
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
754 indent_chances[end[1] + 1] = True
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
755 # special case for the "if" statement because len("if (") == 4
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
756 elif not indent_chances and not row and not depth and text == 'if':
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
757 indent_chances[end[1] + 1] = True
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
758 elif text == ':' and line[end[1]:].isspace():
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
759 open_rows[depth].append(row)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
760
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
761 # keep track of bracket depth
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
762 if token_type == tokenize.OP:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
763 if text in '([{':
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
764 depth += 1
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
765 indent.append(0)
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
766 hangs.append(None)
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
767 if len(open_rows) == depth:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
768 open_rows.append([])
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
769 open_rows[depth].append(row)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
770 parens[row] += 1
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
771 if verbose >= 4:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
772 print("bracket depth %s seen, col %s, visual min = %s" %
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
773 (depth, start[1], indent[depth]))
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
774 elif text in ')]}' and depth > 0:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
775 # parent indents should not be more than this one
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
776 prev_indent = indent.pop() or last_indent[1]
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
777 hangs.pop()
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
778 for d in range(depth):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
779 if indent[d] > prev_indent:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
780 indent[d] = 0
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
781 for ind in list(indent_chances):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
782 if ind >= prev_indent:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
783 del indent_chances[ind]
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
784 del open_rows[depth + 1:]
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
785 depth -= 1
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
786 if depth:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
787 indent_chances[indent[depth]] = True
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
788 for idx in range(row, -1, -1):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
789 if parens[idx]:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
790 parens[idx] -= 1
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
791 break
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
792 assert len(indent) == depth + 1
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
793 if start[1] not in indent_chances:
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
794 # allow lining up tokens
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
795 indent_chances[start[1]] = text
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
796
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
797 last_token_multiline = (start[0] != end[0])
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
798 if last_token_multiline:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
799 rel_indent[end[0] - first_row] = rel_indent[row]
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
800
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
801 if indent_next and expand_indent(line) == indent_level + indent_size:
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
802 pos = (start[0], indent[0] + indent_size)
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
803 if visual_indent:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
804 code = "E129 visually indented line"
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
805 else:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
806 code = "E125 continuation line"
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
807 yield pos, "%s with same indent as next logical line" % code
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
808
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
809
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
810 @register_check
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
811 def whitespace_before_parameters(logical_line, tokens):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
812 r"""Avoid extraneous whitespace.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
813
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
814 Avoid extraneous whitespace in the following situations:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
815 - before the open parenthesis that starts the argument list of a
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
816 function call.
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
817 - before the open parenthesis that starts an indexing or slicing.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
818
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
819 Okay: spam(1)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
820 E211: spam (1)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
821
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
822 Okay: dict['key'] = list[index]
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
823 E211: dict ['key'] = list[index]
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
824 E211: dict['key'] = list [index]
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
825 """
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
826 prev_type, prev_text, __, prev_end, __ = tokens[0]
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
827 for index in range(1, len(tokens)):
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
828 token_type, text, start, end, __ = tokens[index]
8682
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
829 if (
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
830 token_type == tokenize.OP and
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
831 text in '([' and
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
832 start != prev_end and
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
833 (prev_type == tokenize.NAME or prev_text in '}])') and
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
834 # Syntax "class A (B):" is allowed, but avoid it
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
835 (index < 2 or tokens[index - 2][1] != 'class') and
8682
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
836 # Allow "return (a.foo for a in range(5))"
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
837 not keyword.iskeyword(prev_text) and
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
838 # 'match' and 'case' are only soft keywords
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
839 (
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
840 sys.version_info < (3, 9) or
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
841 not keyword.issoftkeyword(prev_text)
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
842 )
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
843 ):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
844 yield prev_end, "E211 whitespace before '%s'", text
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
845 prev_type = token_type
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
846 prev_text = text
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
847 prev_end = end
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
848
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
849
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
850 @register_check
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
851 def whitespace_around_operator(logical_line):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
852 r"""Avoid extraneous whitespace around an operator.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
853
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
854 Okay: a = 12 + 3
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
855 E221: a = 4 + 5
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
856 E222: a = 4 + 5
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
857 E223: a = 4\t+ 5
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
858 E224: a = 4 +\t5
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
859 """
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
860 for match in OPERATOR_REGEX.finditer(logical_line):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
861 before, after = match.groups()
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
862
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
863 if '\t' in before:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
864 yield match.start(1), "E223 tab before operator"
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
865 elif len(before) > 1:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
866 yield match.start(1), "E221 multiple spaces before operator"
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
867
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
868 if '\t' in after:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
869 yield match.start(2), "E224 tab after operator"
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
870 elif len(after) > 1:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
871 yield match.start(2), "E222 multiple spaces after operator"
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
872
3209
c5432abceb25 CodeStyleChecker moved to background service and done a little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3145
diff changeset
873
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
874 @register_check
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
875 def missing_whitespace_around_operator(logical_line, tokens):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
876 r"""Surround operators with a single space on either side.
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
877
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
878 - Always surround these binary operators with a single space on
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
879 either side: assignment (=), augmented assignment (+=, -= etc.),
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
880 comparisons (==, <, >, !=, <=, >=, in, not in, is, is not),
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
881 Booleans (and, or, not).
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
882
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
883 - If operators with different priorities are used, consider adding
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
884 whitespace around the operators with the lowest priorities.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
885
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
886 Okay: i = i + 1
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
887 Okay: submitted += 1
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
888 Okay: x = x * 2 - 1
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
889 Okay: hypot2 = x * x + y * y
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
890 Okay: c = (a + b) * (a - b)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
891 Okay: foo(bar, key='word', *args, **kwargs)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
892 Okay: alpha[:-i]
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
893
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
894 E225: i=i+1
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
895 E225: submitted +=1
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
896 E225: x = x /2 - 1
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
897 E225: z = x **y
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
898 E225: z = 1and 1
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
899 E226: c = (a+b) * (a-b)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
900 E226: hypot2 = x*x + y*y
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
901 E227: c = a|b
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
902 E228: msg = fmt%(errno, errmsg)
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
903 """
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
904 parens = 0
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
905 need_space = False
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
906 prev_type = tokenize.OP
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
907 prev_text = prev_end = None
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
908 operator_types = (tokenize.OP, tokenize.NAME)
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
909 for token_type, text, start, end, line in tokens:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
910 if token_type in SKIP_COMMENTS:
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
911 continue
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
912 if text in ('(', 'lambda'):
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
913 parens += 1
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
914 elif text == ')':
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
915 parens -= 1
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
916 if need_space:
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
917 if start != prev_end:
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
918 # Found a (probably) needed space
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
919 if need_space is not True and not need_space[1]:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
920 yield (need_space[0],
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
921 "E225 missing whitespace around operator")
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
922 need_space = False
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
923 elif text == '>' and prev_text in ('<', '-'):
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
924 # Tolerate the "<>" operator, even if running Python 3
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
925 # Deal with Python 3's annotated return value "->"
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
926 pass
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
927 elif (
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
928 # def f(a, /, b):
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
929 # ^
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
930 # def f(a, b, /):
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
931 # ^
8682
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
932 # f = lambda a, /:
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
933 # ^
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
934 prev_text == '/' and text in {',', ')', ':'} or
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
935 # def f(a, b, /):
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
936 # ^
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
937 prev_text == ')' and text == ':'
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
938 ):
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
939 # Tolerate the "/" operator in function definition
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
940 # For more info see PEP570
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
941 pass
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
942 else:
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
943 if need_space is True or need_space[1]:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
944 # A needed trailing space was not found
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
945 yield prev_end, "E225 missing whitespace around operator"
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
946 elif prev_text != '**':
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
947 code, optype = 'E226', 'arithmetic'
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
948 if prev_text == '%':
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
949 code, optype = 'E228', 'modulo'
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
950 elif prev_text not in ARITHMETIC_OP:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
951 code, optype = 'E227', 'bitwise or shift'
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
952 yield (need_space[0], "%s missing whitespace "
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
953 "around %s operator" % (code, optype))
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
954 need_space = False
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
955 elif token_type in operator_types and prev_end is not None:
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
956 if text == '=' and parens:
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
957 # Allow keyword args or defaults: foo(bar=None).
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
958 pass
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
959 elif text in WS_NEEDED_OPERATORS:
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
960 need_space = True
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
961 elif text in UNARY_OPERATORS:
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
962 # Check if the operator is used as a binary operator
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
963 # Allow unary operators: -123, -x, +1.
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
964 # Allow argument unpacking: foo(*args, **kwargs).
8682
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
965 if prev_type == tokenize.OP and prev_text in '}])' or (
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
966 prev_type != tokenize.OP and
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
967 prev_text not in KEYWORDS and (
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
968 sys.version_info < (3, 9) or
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
969 not keyword.issoftkeyword(prev_text)
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
970 )
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
971 ):
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
972 need_space = None
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
973 elif text in WS_OPTIONAL_OPERATORS:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
974 need_space = None
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
975
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
976 if need_space is None:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
977 # Surrounding space is optional, but ensure that
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
978 # trailing space matches opening space
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
979 need_space = (prev_end, start != prev_end)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
980 elif need_space and start == prev_end:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
981 # A needed opening space was not found
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
982 yield prev_end, "E225 missing whitespace around operator"
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
983 need_space = False
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
984 prev_type = token_type
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
985 prev_text = text
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
986 prev_end = end
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
987
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
988
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
989 @register_check
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
990 def whitespace_around_comma(logical_line):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
991 r"""Avoid extraneous whitespace after a comma or a colon.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
992
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
993 Note: these checks are disabled by default
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
994
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
995 Okay: a = (1, 2)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
996 E241: a = (1, 2)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
997 E242: a = (1,\t2)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
998 """
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
999 line = logical_line
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1000 for m in WHITESPACE_AFTER_COMMA_REGEX.finditer(line):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1001 found = m.start() + 1
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1002 if '\t' in m.group():
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1003 yield found, "E242 tab after '%s'", m.group()[0]
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1004 else:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1005 yield found, "E241 multiple spaces after '%s'", m.group()[0]
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1006
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1007
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1008 @register_check
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1009 def whitespace_around_named_parameter_equals(logical_line, tokens):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1010 r"""Don't use spaces around the '=' sign in function arguments.
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1011
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1012 Don't use spaces around the '=' sign when used to indicate a
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1013 keyword argument or a default parameter value, except when
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1014 using a type annotation.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1015
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1016 Okay: def complex(real, imag=0.0):
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1017 Okay: return magic(r=real, i=imag)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1018 Okay: boolean(a == b)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1019 Okay: boolean(a != b)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1020 Okay: boolean(a <= b)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1021 Okay: boolean(a >= b)
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1022 Okay: def foo(arg: int = 42):
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1023 Okay: async def foo(arg: int = 42):
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1024
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1025 E251: def complex(real, imag = 0.0):
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1026 E251: return magic(r = real, i = imag)
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1027 E252: def complex(real, image: float=0.0):
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1028 """
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1029 parens = 0
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1030 no_space = False
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1031 require_space = False
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1032 prev_end = None
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1033 annotated_func_arg = False
5509
d4c4763b46ee Upgraded pycodestyle to version 2.3.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5435
diff changeset
1034 in_def = bool(STARTSWITH_DEF_REGEX.match(logical_line))
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1035
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1036 message = "E251 unexpected spaces around keyword / parameter equals"
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1037 missing_message = "E252 missing whitespace around parameter equals"
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1038
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1039 for token_type, text, start, end, line in tokens:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1040 if token_type == tokenize.NL:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1041 continue
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1042 if no_space:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1043 no_space = False
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1044 if start != prev_end:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1045 yield (prev_end, message)
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1046 if require_space:
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1047 require_space = False
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1048 if start == prev_end:
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1049 yield (prev_end, missing_message)
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1050 if token_type == tokenize.OP:
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1051 if text in '([':
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1052 parens += 1
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1053 elif text in ')]':
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1054 parens -= 1
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1055 elif in_def and text == ':' and parens == 1:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1056 annotated_func_arg = True
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1057 elif parens == 1 and text == ',':
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1058 annotated_func_arg = False
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1059 elif parens and text == '=':
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1060 if annotated_func_arg and parens == 1:
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1061 require_space = True
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1062 if start == prev_end:
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1063 yield (prev_end, missing_message)
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1064 else:
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1065 no_space = True
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1066 if start != prev_end:
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1067 yield (prev_end, message)
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1068 if not parens:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1069 annotated_func_arg = False
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1070
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1071 prev_end = end
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1072
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1073
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1074 @register_check
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1075 def whitespace_before_comment(logical_line, tokens):
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1076 """Separate inline comments by at least two spaces.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1077
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1078 An inline comment is a comment on the same line as a statement.
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1079 Inline comments should be separated by at least two spaces from the
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1080 statement. They should start with a # and a single space.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1081
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1082 Each line of a block comment starts with a # and one or multiple
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1083 spaces as there can be indented text inside the comment.
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1084
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1085 Okay: x = x + 1 # Increment x
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1086 Okay: x = x + 1 # Increment x
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1087 Okay: # Block comments:
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1088 Okay: # - Block comment list
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1089 Okay: # \xa0- Block comment list
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1090 E261: x = x + 1 # Increment x
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1091 E262: x = x + 1 #Increment x
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1092 E262: x = x + 1 # Increment x
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1093 E262: x = x + 1 # \xa0Increment x
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1094 E265: #Block comment
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1095 E266: ### Block comment
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1096 """
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1097 prev_end = (0, 0)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1098 for token_type, text, start, end, line in tokens:
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1099 if token_type == tokenize.COMMENT:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1100 inline_comment = line[:start[1]].strip()
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1101 if inline_comment:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1102 if prev_end[0] == start[0] and start[1] < prev_end[1] + 2:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1103 yield (prev_end,
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1104 "E261 at least two spaces before inline comment")
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1105 symbol, sp, comment = text.partition(' ')
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1106 bad_prefix = symbol not in '#:' and (symbol.lstrip('#')[:1] or '#')
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1107 if inline_comment:
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1108 if bad_prefix or comment[:1] in WHITESPACE:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1109 yield start, "E262 inline comment should start with '# '"
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1110 elif bad_prefix and (bad_prefix != '!' or start[0] > 1):
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1111 if bad_prefix != '#':
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1112 yield start, "E265 block comment should start with '# '"
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1113 elif comment:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1114 yield start, "E266 too many leading '#' for block comment"
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1115 elif token_type != tokenize.NL:
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1116 prev_end = end
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1117
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1118
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1119 @register_check
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1120 def imports_on_separate_lines(logical_line):
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1121 r"""Place imports on separate lines.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1122
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1123 Okay: import os\nimport sys
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1124 E401: import sys, os
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1125
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1126 Okay: from subprocess import Popen, PIPE
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1127 Okay: from myclas import MyClass
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1128 Okay: from foo.bar.yourclass import YourClass
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1129 Okay: import myclass
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1130 Okay: import foo.bar.yourclass
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1131 """
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1132 line = logical_line
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1133 if line.startswith('import '):
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1134 found = line.find(',')
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1135 if -1 < found and ';' not in line[:found]:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1136 yield found, "E401 multiple imports on one line"
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1137
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1138
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1139 @register_check
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1140 def module_imports_on_top_of_file(
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1141 logical_line, indent_level, checker_state, noqa):
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1142 r"""Place imports at the top of the file.
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1143
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1144 Always put imports at the top of the file, just after any module
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1145 comments and docstrings, and before module globals and constants.
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1146
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1147 Okay: import os
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1148 Okay: # this is a comment\nimport os
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1149 Okay: '''this is a module docstring'''\nimport os
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1150 Okay: r'''this is a module docstring'''\nimport os
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
1151 Okay:
5435
44a6fc2828bc Upgraded pycodestyle to version 2.2.0+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
1152 try:\n\timport x\nexcept ImportError:\n\tpass\nelse:\n\tpass\nimport y
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
1153 Okay:
5435
44a6fc2828bc Upgraded pycodestyle to version 2.2.0+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
1154 try:\n\timport x\nexcept ImportError:\n\tpass\nfinally:\n\tpass\nimport y
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1155 E402: a=1\nimport os
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1156 E402: 'One string'\n"Two string"\nimport os
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1157 E402: a=1\nfrom sys import x
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1158
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1159 Okay: if x:\n import os
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1160 """ # noqa
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1161 def is_string_literal(line):
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1162 if line[0] in 'uUbB':
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1163 line = line[1:]
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1164 if line and line[0] in 'rR':
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1165 line = line[1:]
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1166 return line and (line[0] == '"' or line[0] == "'")
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1167
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1168 allowed_keywords = (
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1169 'try', 'except', 'else', 'finally', 'with', 'if', 'elif')
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1170
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1171 if indent_level: # Allow imports in conditional statement/function
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1172 return
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1173 if not logical_line: # Allow empty lines or comments
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1174 return
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1175 if noqa:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1176 return
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1177 line = logical_line
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1178 if line.startswith('import ') or line.startswith('from '):
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1179 if checker_state.get('seen_non_imports', False):
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1180 yield 0, "E402 module level import not at top of file"
5509
d4c4763b46ee Upgraded pycodestyle to version 2.3.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5435
diff changeset
1181 elif re.match(DUNDER_REGEX, line):
d4c4763b46ee Upgraded pycodestyle to version 2.3.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5435
diff changeset
1182 return
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1183 elif any(line.startswith(kw) for kw in allowed_keywords):
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1184 # Allow certain keywords intermixed with imports in order to
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1185 # support conditional or filtered importing
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1186 return
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1187 elif is_string_literal(line):
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1188 # The first literal is a docstring, allow it. Otherwise, report
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1189 # error.
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1190 if checker_state.get('seen_docstring', False):
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1191 checker_state['seen_non_imports'] = True
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1192 else:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1193 checker_state['seen_docstring'] = True
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1194 else:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1195 checker_state['seen_non_imports'] = True
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1196
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1197
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1198 @register_check
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1199 def compound_statements(logical_line):
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1200 r"""Compound statements (on the same line) are generally
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1201 discouraged.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1202
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1203 While sometimes it's okay to put an if/for/while with a small body
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1204 on the same line, never do this for multi-clause statements.
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1205 Also avoid folding such long lines!
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1206
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1207 Always use a def statement instead of an assignment statement that
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1208 binds a lambda expression directly to a name.
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1209
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1210 Okay: if foo == 'blah':\n do_blah_thing()
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1211 Okay: do_one()
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1212 Okay: do_two()
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1213 Okay: do_three()
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1214
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1215 E701: if foo == 'blah': do_blah_thing()
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1216 E701: for x in lst: total += x
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1217 E701: while t < 10: t = delay()
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1218 E701: if foo == 'blah': do_blah_thing()
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1219 E701: else: do_non_blah_thing()
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1220 E701: try: something()
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1221 E701: finally: cleanup()
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1222 E701: if foo == 'blah': one(); two(); three()
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1223 E702: do_one(); do_two(); do_three()
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1224 E703: do_four(); # useless semicolon
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1225 E704: def f(x): return 2*x
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1226 E731: f = lambda x: 2*x
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1227 """
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1228 line = logical_line
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1229 last_char = len(line) - 1
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1230 found = line.find(':')
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1231 prev_found = 0
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1232 counts = {char: 0 for char in '{}[]()'}
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1233 while -1 < found < last_char:
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1234 update_counts(line[prev_found:found], counts)
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1235 if ((counts['{'] <= counts['}'] and # {'a': 1} (dict)
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1236 counts['['] <= counts[']'] and # [1:2] (slice)
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1237 counts['('] <= counts[')']) and # (annotation)
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1238 not (sys.version_info >= (3, 8) and
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1239 line[found + 1] == '=')): # assignment expression
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1240 lambda_kw = LAMBDA_REGEX.search(line, 0, found)
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1241 if lambda_kw:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1242 before = line[:lambda_kw.start()].rstrip()
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1243 if before[-1:] == '=' and before[:-1].strip().isidentifier():
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1244 yield 0, ("E731 do not assign a lambda expression, use a "
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1245 "def")
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1246 break
5509
d4c4763b46ee Upgraded pycodestyle to version 2.3.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5435
diff changeset
1247 if STARTSWITH_DEF_REGEX.match(line):
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1248 yield 0, "E704 multiple statements on one line (def)"
5509
d4c4763b46ee Upgraded pycodestyle to version 2.3.1
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5435
diff changeset
1249 elif STARTSWITH_INDENT_STATEMENT_REGEX.match(line):
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1250 yield found, "E701 multiple statements on one line (colon)"
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1251 prev_found = found
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1252 found = line.find(':', found + 1)
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1253 found = line.find(';')
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1254 while -1 < found:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1255 if found < last_char:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1256 yield found, "E702 multiple statements on one line (semicolon)"
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1257 else:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1258 yield found, "E703 statement ends with a semicolon"
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1259 found = line.find(';', found + 1)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1260
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1261
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1262 @register_check
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1263 def explicit_line_join(logical_line, tokens):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1264 r"""Avoid explicit line join between brackets.
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1265
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1266 The preferred way of wrapping long lines is by using Python's
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1267 implied line continuation inside parentheses, brackets and braces.
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1268 Long lines can be broken over multiple lines by wrapping expressions
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1269 in parentheses. These should be used in preference to using a
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1270 backslash for line continuation.
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1271
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1272 E502: aaa = [123, \\n 123]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1273 E502: aaa = ("bbb " \\n "ccc")
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1274
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1275 Okay: aaa = [123,\n 123]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1276 Okay: aaa = ("bbb "\n "ccc")
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1277 Okay: aaa = "bbb " \\n "ccc"
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1278 Okay: aaa = 123 # \\
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1279 """
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1280 prev_start = prev_end = parens = 0
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1281 comment = False
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1282 backslash = None
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1283 for token_type, text, start, end, line in tokens:
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1284 if token_type == tokenize.COMMENT:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1285 comment = True
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1286 if start[0] != prev_start and parens and backslash and not comment:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1287 yield backslash, "E502 the backslash is redundant between brackets"
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1288 if end[0] != prev_end:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1289 if line.rstrip('\r\n').endswith('\\'):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1290 backslash = (end[0], len(line.splitlines()[-1]) - 1)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1291 else:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1292 backslash = None
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1293 prev_start = prev_end = end[0]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1294 else:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1295 prev_start = start[0]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1296 if token_type == tokenize.OP:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1297 if text in '([{':
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1298 parens += 1
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1299 elif text in ')]}':
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1300 parens -= 1
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1301
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1302
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1303 # The % character is strictly speaking a binary operator, but the
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1304 # common usage seems to be to put it next to the format parameters,
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1305 # after a line break.
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1306 _SYMBOLIC_OPS = frozenset("()[]{},:.;@=%~") | frozenset(("...",))
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1307
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1308
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1309 def _is_binary_operator(token_type, text):
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1310 return (
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1311 token_type == tokenize.OP or
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1312 text in {'and', 'or'}
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1313 ) and (
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1314 text not in _SYMBOLIC_OPS
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1315 )
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1316
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1317
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1318 def _break_around_binary_operators(tokens):
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1319 """Private function to reduce duplication.
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1320
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1321 This factors out the shared details between
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1322 :func:`break_before_binary_operator` and
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1323 :func:`break_after_binary_operator`.
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1324 """
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1325 line_break = False
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1326 unary_context = True
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1327 # Previous non-newline token types and text
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1328 previous_token_type = None
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1329 previous_text = None
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1330 for token_type, text, start, end, line in tokens:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1331 if token_type == tokenize.COMMENT:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1332 continue
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1333 if ('\n' in text or '\r' in text) and token_type != tokenize.STRING:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1334 line_break = True
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1335 else:
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1336 yield (token_type, text, previous_token_type, previous_text,
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1337 line_break, unary_context, start)
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1338 unary_context = text in '([{,;'
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1339 line_break = False
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1340 previous_token_type = token_type
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1341 previous_text = text
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1342
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1343
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1344 @register_check
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1345 def break_before_binary_operator(logical_line, tokens):
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1346 r"""
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1347 Avoid breaks before binary operators.
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1348
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1349 The preferred place to break around a binary operator is after the
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1350 operator, not before it.
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1351
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1352 W503: (width == 0\n + height == 0)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1353 W503: (width == 0\n and height == 0)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1354 W503: var = (1\n & ~2)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1355 W503: var = (1\n / -2)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1356 W503: var = (1\n + -1\n + -2)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1357
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1358 Okay: foo(\n -x)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1359 Okay: foo(x\n [])
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1360 Okay: x = '''\n''' + ''
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1361 Okay: foo(x,\n -y)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1362 Okay: foo(x, # comment\n -y)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1363 """
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1364 for context in _break_around_binary_operators(tokens):
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1365 (token_type, text, previous_token_type, previous_text,
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1366 line_break, unary_context, start) = context
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1367 if (_is_binary_operator(token_type, text) and line_break and
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1368 not unary_context and
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1369 not _is_binary_operator(previous_token_type,
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1370 previous_text)):
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1371 yield start, "W503 line break before binary operator"
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1372
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1373
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1374 @register_check
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1375 def break_after_binary_operator(logical_line, tokens):
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1376 r"""
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1377 Avoid breaks after binary operators.
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1378
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1379 The preferred place to break around a binary operator is before the
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1380 operator, not after it.
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1381
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1382 W504: (width == 0 +\n height == 0)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1383 W504: (width == 0 and\n height == 0)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1384 W504: var = (1 &\n ~2)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1385
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1386 Okay: foo(\n -x)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1387 Okay: foo(x\n [])
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1388 Okay: x = '''\n''' + ''
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1389 Okay: x = '' + '''\n'''
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1390 Okay: foo(x,\n -y)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1391 Okay: foo(x, # comment\n -y)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1392
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1393 The following should be W504 but unary_context is tricky with these
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1394 Okay: var = (1 /\n -2)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1395 Okay: var = (1 +\n -1 +\n -2)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1396 """
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1397 prev_start = None
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1398 for context in _break_around_binary_operators(tokens):
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1399 (token_type, text, previous_token_type, previous_text,
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1400 line_break, unary_context, start) = context
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1401 if (_is_binary_operator(previous_token_type, previous_text) and
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1402 line_break and
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1403 not unary_context and
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1404 not _is_binary_operator(token_type, text)):
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1405 yield prev_start, "W504 line break after binary operator"
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1406 prev_start = start
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1407
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1408
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1409 @register_check
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1410 def comparison_to_singleton(logical_line, noqa):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1411 r"""Comparison to singletons should use "is" or "is not".
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1412
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1413 Comparisons to singletons like None should always be done
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1414 with "is" or "is not", never the equality operators.
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1415
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1416 Okay: if arg is not None:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1417 E711: if arg != None:
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1418 E711: if None == arg:
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1419 E712: if arg == True:
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1420 E712: if False == arg:
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1421
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1422 Also, beware of writing if x when you really mean if x is not None
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1423 -- e.g. when testing whether a variable or argument that defaults to
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1424 None was set to some other value. The other value might have a type
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1425 (such as a container) that could be false in a boolean context!
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1426 """
8682
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
1427 if noqa:
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
1428 return
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
1429
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
1430 for match in COMPARE_SINGLETON_REGEX.finditer(logical_line):
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1431 singleton = match.group(1) or match.group(3)
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1432 same = (match.group(2) == '==')
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1433
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1434 msg = "'if cond is %s:'" % (('' if same else 'not ') + singleton)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1435 if singleton in ('None',):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1436 code = 'E711'
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1437 else:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1438 code = 'E712'
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1439 nonzero = ((singleton == 'True' and same) or
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1440 (singleton == 'False' and not same))
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1441 msg += " or 'if %scond:'" % ('' if nonzero else 'not ')
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1442 yield (match.start(2), ("%s comparison to %s should be %s" %
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1443 (code, singleton, msg)), singleton, msg)
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1444
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1445
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1446 @register_check
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1447 def comparison_negative(logical_line):
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1448 r"""Negative comparison should be done using "not in" and "is not".
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1449
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1450 Okay: if x not in y:\n pass
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1451 Okay: assert (X in Y or X is Z)
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1452 Okay: if not (X in Y):\n pass
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1453 Okay: zz = x is not y
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1454 E713: Z = not X in Y
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1455 E713: if not X.B in Y:\n pass
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1456 E714: if not X is Y:\n pass
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1457 E714: Z = not X.B is Y
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1458 """
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1459 match = COMPARE_NEGATIVE_REGEX.search(logical_line)
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1460 if match:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1461 pos = match.start(1)
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1462 if match.group(2) == 'in':
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1463 yield pos, "E713 test for membership should be 'not in'"
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1464 else:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1465 yield pos, "E714 test for object identity should be 'is not'"
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1466
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1467
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1468 @register_check
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1469 def comparison_type(logical_line, noqa):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1470 r"""Object type comparisons should always use isinstance().
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1471
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1472 Do not compare types directly.
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1473
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1474 Okay: if isinstance(obj, int):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1475 E721: if type(obj) is type(1):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1476
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1477 When checking if an object is a string, keep in mind that it might
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1478 be a unicode string too! In Python 2.3, str and unicode have a
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1479 common base class, basestring, so you can do:
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1480
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1481 Okay: if isinstance(obj, basestring):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1482 Okay: if type(a1) is type(b1):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1483 """
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1484 match = COMPARE_TYPE_REGEX.search(logical_line)
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1485 if match and not noqa:
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1486 inst = match.group(1)
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1487 if inst and inst.isidentifier() and inst not in SINGLETONS:
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1488 return # Allow comparison for types which are not obvious
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1489 yield match.start(), "E721 do not compare types, use 'isinstance()'"
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1490
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1491
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1492 @register_check
5435
44a6fc2828bc Upgraded pycodestyle to version 2.2.0+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
1493 def bare_except(logical_line, noqa):
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1494 r"""When catching exceptions, mention specific exceptions when
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1495 possible.
5435
44a6fc2828bc Upgraded pycodestyle to version 2.2.0+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
1496
44a6fc2828bc Upgraded pycodestyle to version 2.2.0+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
1497 Okay: except Exception:
44a6fc2828bc Upgraded pycodestyle to version 2.2.0+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
1498 Okay: except BaseException:
44a6fc2828bc Upgraded pycodestyle to version 2.2.0+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
1499 E722: except:
44a6fc2828bc Upgraded pycodestyle to version 2.2.0+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
1500 """
44a6fc2828bc Upgraded pycodestyle to version 2.2.0+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
1501 if noqa:
44a6fc2828bc Upgraded pycodestyle to version 2.2.0+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
1502 return
44a6fc2828bc Upgraded pycodestyle to version 2.2.0+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
1503
8682
04e80d1aaebf Updated pyflakes to 2.4.0 and pycodestyle to 2.8.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 8312
diff changeset
1504 match = BLANK_EXCEPT_REGEX.match(logical_line)
5435
44a6fc2828bc Upgraded pycodestyle to version 2.2.0+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
1505 if match:
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1506 yield match.start(), "E722 do not use bare 'except'"
5435
44a6fc2828bc Upgraded pycodestyle to version 2.2.0+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
1507
44a6fc2828bc Upgraded pycodestyle to version 2.2.0+.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
1508
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1509 @register_check
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1510 def ambiguous_identifier(logical_line, tokens):
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1511 r"""Never use the characters 'l', 'O', or 'I' as variable names.
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1512
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1513 In some fonts, these characters are indistinguishable from the
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1514 numerals one and zero. When tempted to use 'l', use 'L' instead.
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1515
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1516 Okay: L = 0
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1517 Okay: o = 123
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1518 Okay: i = 42
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1519 E741: l = 0
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1520 E741: O = 123
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1521 E741: I = 42
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1522
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1523 Variables can be bound in several other contexts, including class
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1524 and function definitions, 'global' and 'nonlocal' statements,
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1525 exception handlers, and 'with' and 'for' statements.
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1526 In addition, we have a special handling for function parameters.
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1527
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1528 Okay: except AttributeError as o:
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1529 Okay: with lock as L:
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1530 Okay: foo(l=12)
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1531 Okay: for a in foo(l=12):
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1532 E741: except AttributeError as O:
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1533 E741: with lock as l:
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1534 E741: global I
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1535 E741: nonlocal l
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1536 E741: def foo(l):
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1537 E741: def foo(l=12):
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1538 E741: l = foo(l=12)
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1539 E741: for l in range(10):
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1540 E742: class I(object):
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1541 E743: def l(x):
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1542 """
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1543 is_func_def = False # Set to true if 'def' is found
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1544 parameter_parentheses_level = 0
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1545 idents_to_avoid = ('l', 'O', 'I')
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1546 prev_type, prev_text, prev_start, prev_end, __ = tokens[0]
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1547 for token_type, text, start, end, line in tokens[1:]:
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1548 ident = pos = None
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1549 # find function definitions
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1550 if prev_text == 'def':
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1551 is_func_def = True
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1552 # update parameter parentheses level
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1553 if parameter_parentheses_level == 0 and \
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1554 prev_type == tokenize.NAME and \
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1555 token_type == tokenize.OP and text == '(':
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1556 parameter_parentheses_level = 1
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1557 elif parameter_parentheses_level > 0 and \
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1558 token_type == tokenize.OP:
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1559 if text == '(':
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1560 parameter_parentheses_level += 1
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1561 elif text == ')':
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1562 parameter_parentheses_level -= 1
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1563 # identifiers on the lhs of an assignment operator
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1564 if token_type == tokenize.OP and '=' in text and \
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1565 parameter_parentheses_level == 0:
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1566 if prev_text in idents_to_avoid:
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1567 ident = prev_text
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1568 pos = prev_start
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1569 # identifiers bound to values with 'as', 'for',
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1570 # 'global', or 'nonlocal'
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1571 if prev_text in ('as', 'for', 'global', 'nonlocal'):
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1572 if text in idents_to_avoid:
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1573 ident = text
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1574 pos = start
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1575 # function parameter definitions
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1576 if is_func_def:
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1577 if text in idents_to_avoid:
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1578 ident = text
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1579 pos = start
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1580 if prev_text == 'class':
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1581 if text in idents_to_avoid:
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1582 yield start, "E742 ambiguous class definition '%s'", text
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1583 if prev_text == 'def':
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1584 if text in idents_to_avoid:
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1585 yield start, "E743 ambiguous function definition '%s'", text
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1586 if ident:
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1587 yield pos, "E741 ambiguous variable name '%s'", ident
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
1588 prev_type = token_type
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1589 prev_text = text
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1590 prev_start = start
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1591
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1592
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1593 @register_check
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1594 def python_3000_has_key(logical_line, noqa):
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1595 r"""The {}.has_key() method is removed in Python 3: use the 'in'
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1596 operator.
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1597
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1598 Okay: if "alph" in d:\n print d["alph"]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1599 W601: assert d.has_key('alph')
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1600 """
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1601 pos = logical_line.find('.has_key(')
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1602 if pos > -1 and not noqa:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1603 yield pos, "W601 .has_key() is deprecated, use 'in'"
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1604
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1605
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1606 @register_check
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1607 def python_3000_raise_comma(logical_line):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1608 r"""When raising an exception, use "raise ValueError('message')".
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1609
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1610 The older form is removed in Python 3.
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1611
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1612 Okay: raise DummyError("Message")
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1613 W602: raise DummyError, "Message"
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1614 """
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1615 match = RAISE_COMMA_REGEX.match(logical_line)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1616 if match and not RERAISE_COMMA_REGEX.match(logical_line):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1617 yield match.end() - 1, "W602 deprecated form of raising exception"
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1618
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1619
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1620 @register_check
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1621 def python_3000_not_equal(logical_line):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1622 r"""New code should always use != instead of <>.
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1623
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1624 The older syntax is removed in Python 3.
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1625
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1626 Okay: if a != 'no':
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1627 W603: if a <> 'no':
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1628 """
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1629 pos = logical_line.find('<>')
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1630 if pos > -1:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1631 yield pos, "W603 '<>' is deprecated, use '!='"
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1632
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1633
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1634 @register_check
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1635 def python_3000_backticks(logical_line):
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1636 r"""Use repr() instead of backticks in Python 3.
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1637
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1638 Okay: val = repr(1 + 2)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1639 W604: val = `1 + 2`
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1640 """
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1641 pos = logical_line.find('`')
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1642 if pos > -1:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1643 yield pos, "W604 backticks are deprecated, use 'repr()'"
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1644
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1645
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1646 @register_check
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1647 def python_3000_invalid_escape_sequence(logical_line, tokens, noqa):
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1648 r"""Invalid escape sequences are deprecated in Python 3.6.
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1649
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1650 Okay: regex = r'\.png$'
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1651 W605: regex = '\.png$'
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1652 """
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1653 if noqa:
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1654 return
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1655
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1656 # https://docs.python.org/3/reference/lexical_analysis.html#string-and-bytes-literals
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1657 valid = [
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1658 '\n',
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1659 '\\',
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1660 '\'',
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1661 '"',
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1662 'a',
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1663 'b',
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1664 'f',
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1665 'n',
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1666 'r',
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1667 't',
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1668 'v',
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1669 '0', '1', '2', '3', '4', '5', '6', '7',
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1670 'x',
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1671
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1672 # Escape sequences only recognized in string literals
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1673 'N',
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1674 'u',
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1675 'U',
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1676 ]
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1677
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1678 for token_type, text, start, end, line in tokens:
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1679 if token_type == tokenize.STRING:
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1680 start_line, start_col = start
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1681 quote = text[-3:] if text[-3:] in ('"""', "'''") else text[-1]
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1682 # Extract string modifiers (e.g. u or r)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1683 quote_pos = text.index(quote)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1684 prefix = text[:quote_pos].lower()
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1685 start = quote_pos + len(quote)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1686 string = text[start:-len(quote)]
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1687
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1688 if 'r' not in prefix:
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1689 pos = string.find('\\')
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1690 while pos >= 0:
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1691 pos += 1
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1692 if string[pos] not in valid:
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1693 line = start_line + string.count('\n', 0, pos)
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1694 if line == start_line:
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1695 col = start_col + len(prefix) + len(quote) + pos
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1696 else:
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1697 col = pos - string.rfind('\n', 0, pos) - 1
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1698 yield (
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1699 (line, col - 1),
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1700 "W605 invalid escape sequence '\\%s'",
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1701 string[pos],
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1702 )
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1703 pos = string.find('\\', pos + 1)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1704
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1705
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1706 @register_check
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1707 def python_3000_async_await_keywords(logical_line, tokens):
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1708 """'async' and 'await' are reserved keywords starting at Python 3.7.
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1709
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1710 W606: async = 42
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1711 W606: await = 42
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1712 Okay: async def read(db):\n data = await db.fetch('SELECT ...')
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1713 """
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1714 # The Python tokenize library before Python 3.5 recognizes
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1715 # async/await as a NAME token. Therefore, use a state machine to
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1716 # look for the possible async/await constructs as defined by the
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1717 # Python grammar:
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1718 # https://docs.python.org/3/reference/grammar.html
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1719
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1720 state = None
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1721 for token_type, text, start, end, line in tokens:
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1722 error = False
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1723
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1724 if token_type == tokenize.NL:
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1725 continue
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1726
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1727 if state is None:
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1728 if token_type == tokenize.NAME:
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1729 if text == 'async':
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1730 state = ('async_stmt', start)
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1731 elif text == 'await':
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1732 state = ('await', start)
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1733 elif (token_type == tokenize.NAME and
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1734 text in ('def', 'for')):
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1735 state = ('define', start)
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1736
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1737 elif state[0] == 'async_stmt':
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1738 if token_type == tokenize.NAME and text in ('def', 'with', 'for'):
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1739 # One of funcdef, with_stmt, or for_stmt. Return to
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1740 # looking for async/await names.
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1741 state = None
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1742 else:
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1743 error = True
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1744 elif state[0] == 'await':
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1745 if token_type == tokenize.NAME:
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1746 # An await expression. Return to looking for async/await
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1747 # names.
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1748 state = None
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1749 elif token_type == tokenize.OP and text == '(':
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1750 state = None
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1751 else:
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1752 error = True
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1753 elif state[0] == 'define':
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1754 if token_type == tokenize.NAME and text in ('async', 'await'):
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1755 error = True
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1756 else:
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1757 state = None
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1758
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1759 if error:
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1760 yield (
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1761 state[1],
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1762 "W606 'async' and 'await' are reserved keywords starting with "
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1763 "Python 3.7",
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1764 )
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1765 state = None
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1766
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1767 # Last token
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1768 if state is not None:
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1769 yield (
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1770 state[1],
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1771 "W606 'async' and 'await' are reserved keywords starting with "
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1772 "Python 3.7",
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1773 )
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1774
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1775
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1776 ########################################################################
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1777 @register_check
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1778 def maximum_doc_length(logical_line, max_doc_length, noqa, tokens):
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1779 r"""Limit all doc lines to a maximum of 72 characters.
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1780
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1781 For flowing long blocks of text (docstrings or comments), limiting
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1782 the length to 72 characters is recommended.
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1783
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1784 Reports warning W505
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1785 """
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1786 if max_doc_length is None or noqa:
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1787 return
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1788
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1789 prev_token = None
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1790 skip_lines = set()
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1791 # Skip lines that
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1792 for token_type, text, start, end, line in tokens:
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1793 if token_type not in SKIP_COMMENTS.union([tokenize.STRING]):
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1794 skip_lines.add(line)
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1795
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1796 for token_type, text, start, end, line in tokens:
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1797 # Skip lines that aren't pure strings
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1798 if token_type == tokenize.STRING and skip_lines:
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1799 continue
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1800 if token_type in (tokenize.STRING, tokenize.COMMENT):
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1801 # Only check comment-only lines
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1802 if prev_token is None or prev_token in SKIP_TOKENS:
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1803 lines = line.splitlines()
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1804 for line_num, physical_line in enumerate(lines):
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1805 if start[0] + line_num == 1 and line.startswith('#!'):
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1806 return
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1807 length = len(physical_line)
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1808 chunks = physical_line.split()
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1809 if token_type == tokenize.COMMENT:
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1810 if (len(chunks) == 2 and
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1811 length - len(chunks[-1]) < MAX_DOC_LENGTH):
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1812 continue
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1813 if len(chunks) == 1 and line_num + 1 < len(lines):
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1814 if (len(chunks) == 1 and
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1815 length - len(chunks[-1]) < MAX_DOC_LENGTH):
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1816 continue
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1817 if length > max_doc_length:
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1818 doc_error = (start[0] + line_num, max_doc_length)
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1819 yield (doc_error, "W505 doc line too long "
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1820 "(%d > %d characters)",
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1821 length, max_doc_length)
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1822 prev_token = token_type
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1823
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1824
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1825 ########################################################################
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1826 # Helper functions
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1827 ########################################################################
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1828
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1829
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1830 def readlines(filename):
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1831 """Read the source code."""
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1832 try:
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1833 with tokenize.open(filename) as f:
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1834 return f.readlines()
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1835 except (LookupError, SyntaxError, UnicodeError):
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1836 # Fall back if file encoding is improperly declared
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1837 with open(filename, encoding='latin-1') as f:
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1838 return f.readlines()
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1839
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1840 def stdin_get_value():
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1841 """Read the value from stdin."""
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1842 return TextIOWrapper(sys.stdin.buffer, errors='ignore').read()
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1843
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1844 noqa = lru_cache(512)(re.compile(r'# no(?:qa|pep8)\b', re.I).search)
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1845
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1846
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1847 def expand_indent(line):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1848 r"""Return the amount of indentation.
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1849
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1850 Tabs are expanded to the next multiple of 8.
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1851
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1852 >>> expand_indent(' ')
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1853 4
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1854 >>> expand_indent('\t')
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1855 8
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1856 >>> expand_indent(' \t')
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1857 8
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1858 >>> expand_indent(' \t')
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1859 16
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1860 """
7620
52c2fe0308fd Code Style Checker: updated pycodestyle to version 2.6.0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7360
diff changeset
1861 line = line.rstrip('\n\r')
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1862 if '\t' not in line:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1863 return len(line) - len(line.lstrip())
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1864 result = 0
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1865 for char in line:
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1866 if char == '\t':
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1867 result = result // 8 * 8 + 8
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1868 elif char == ' ':
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1869 result += 1
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1870 else:
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1871 break
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1872 return result
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1873
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1874
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1875 def mute_string(text):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1876 """Replace contents with 'xxx' to prevent syntax matching.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1877
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1878 >>> mute_string('"abc"')
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1879 '"xxx"'
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1880 >>> mute_string("'''abc'''")
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1881 "'''xxx'''"
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1882 >>> mute_string("r'abc'")
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1883 "r'xxx'"
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1884 """
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1885 # String modifiers (e.g. u or r)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1886 start = text.index(text[-1]) + 1
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1887 end = len(text) - 1
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1888 # Triple quotes
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1889 if text[-3:] in ('"""', "'''"):
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1890 start += 2
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1891 end -= 2
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1892 return text[:start] + 'x' * (end - start) + text[end:]
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1893
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1894
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1895 def parse_udiff(diff, patterns=None, parent='.'):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1896 """Return a dictionary of matching lines."""
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1897 # For each file of the diff, the entry key is the filename,
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1898 # and the value is a set of row numbers to consider.
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1899 rv = {}
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1900 path = nrows = None
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1901 for line in diff.splitlines():
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1902 if nrows:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1903 if line[:1] != '-':
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1904 nrows -= 1
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1905 continue
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1906 if line[:3] == '@@ ':
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1907 hunk_match = HUNK_REGEX.match(line)
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1908 (row, nrows) = (int(g or '1') for g in hunk_match.groups())
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1909 rv[path].update(range(row, row + nrows))
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1910 elif line[:3] == '+++':
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1911 path = line[4:].split('\t', 1)[0]
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1912 # Git diff will use (i)ndex, (w)ork tree, (c)ommit and
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1913 # (o)bject instead of a/b/c/d as prefixes for patches
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
1914 if path[:2] in ('b/', 'w/', 'i/'):
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1915 path = path[2:]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1916 rv[path] = set()
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1917 return {
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1918 os.path.join(parent, filepath): rows
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1919 for (filepath, rows) in rv.items()
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1920 if rows and filename_match(filepath, patterns)
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1921 }
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1922
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1923
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1924 def normalize_paths(value, parent=os.curdir):
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1925 """Parse a comma-separated list of paths.
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1926
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1927 Return a list of absolute paths.
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1928 """
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1929 if not value:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1930 return []
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1931 if isinstance(value, list):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1932 return value
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1933 paths = []
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1934 for path in value.split(','):
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1935 path = path.strip()
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1936 if '/' in path:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1937 path = os.path.abspath(os.path.join(parent, path))
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1938 paths.append(path.rstrip('/'))
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1939 return paths
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1940
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1941
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1942 def filename_match(filename, patterns, default=True):
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1943 """Check if patterns contains a pattern that matches filename.
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1944
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1945 If patterns is unspecified, this always returns True.
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1946 """
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1947 if not patterns:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1948 return default
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1949 return any(fnmatch(filename, pattern) for pattern in patterns)
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1950
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1951
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1952 def update_counts(s, counts):
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1953 r"""Adds one to the counts of each appearance of characters in s,
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1954 for characters in counts"""
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1955 for char in s:
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1956 if char in counts:
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1957 counts[char] += 1
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1958
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1959
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1960 def _is_eol_token(token):
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1961 return token[0] in NEWLINE or token[4][token[3][1]:].lstrip() == '\\\n'
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1962
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
1963
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1964 ########################################################################
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1965 # Framework to run all checks
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1966 ########################################################################
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1967
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1968
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
1969 class Checker:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1970 """Load a Python source file, tokenize it, check coding style."""
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1971
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1972 def __init__(self, filename=None, lines=None,
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1973 options=None, report=None, **kwargs):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1974 if options is None:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1975 options = StyleGuide(kwargs).options
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1976 else:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1977 assert not kwargs
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1978 self._io_error = None
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1979 self._physical_checks = options.physical_checks
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1980 self._logical_checks = options.logical_checks
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1981 self._ast_checks = options.ast_checks
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1982 self.max_line_length = options.max_line_length
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
1983 self.max_doc_length = options.max_doc_length
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
1984 self.indent_size = options.indent_size
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
1985 self.multiline = False # in a multiline string?
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1986 self.hang_closing = options.hang_closing
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
1987 self.indent_size = options.indent_size
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1988 self.verbose = options.verbose
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1989 self.filename = filename
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1990 # Dictionary where a checker can store its custom state.
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
1991 self._checker_states = {}
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1992 if filename is None:
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1993 self.filename = 'stdin'
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1994 self.lines = lines or []
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1995 elif filename == '-':
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1996 self.filename = 'stdin'
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1997 self.lines = stdin_get_value().splitlines(True)
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1998 elif lines is None:
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
1999 try:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2000 self.lines = readlines(filename)
7836
2f0d208b8137 Changed code to not use the OSError aliases (IOError, EnvironmentError, socket.error and select.error) anymore.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7639
diff changeset
2001 except OSError:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2002 (exc_type, exc) = sys.exc_info()[:2]
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
2003 self._io_error = f'{exc_type.__name__}: {exc}'
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2004 self.lines = []
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2005 else:
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2006 self.lines = lines
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2007 if self.lines:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2008 ord0 = ord(self.lines[0][0])
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2009 if ord0 in (0xef, 0xfeff): # Strip the UTF-8 BOM
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2010 if ord0 == 0xfeff:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2011 self.lines[0] = self.lines[0][1:]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2012 elif self.lines[0][:3] == '\xef\xbb\xbf':
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2013 self.lines[0] = self.lines[0][3:]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2014 self.report = report or options.report
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2015 self.report_error = self.report.error
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2016 self.report_error_args = self.report.error_args
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
2017 self.noqa = False
2910
cdc56e9d9f12 Optimized the PEP-8 naming checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2899
diff changeset
2018
7960
e8fc383322f7 Harmonized some user visible strings and changed the term 'eric6' to the more generic 'eric'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7923
diff changeset
2019 # added for eric integration
2910
cdc56e9d9f12 Optimized the PEP-8 naming checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2899
diff changeset
2020 self.options = options
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2021
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2022 def report_invalid_syntax(self):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2023 """Check if the syntax is valid."""
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2024 (exc_type, exc) = sys.exc_info()[:2]
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2025 if len(exc.args) > 1:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2026 offset = exc.args[1]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2027 if len(offset) > 2:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2028 offset = offset[1:3]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2029 else:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2030 offset = (1, 0)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2031 self.report_error_args(offset[0], offset[1] or 0,
2899
88d2458a4739 Fixed an issue in the pep8.py checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2866
diff changeset
2032 'E901', self.report_invalid_syntax,
88d2458a4739 Fixed an issue in the pep8.py checkers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2866
diff changeset
2033 exc_type.__name__, exc.args[0])
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2034
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2035 def readline(self):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2036 """Get the next line from the input buffer."""
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2037 if self.line_number >= self.total_lines:
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2038 return ''
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2039 line = self.lines[self.line_number]
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2040 self.line_number += 1
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2041 if self.indent_char is None and line[:1] in WHITESPACE:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2042 self.indent_char = line[0]
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2043 return line
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2044
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2045 def run_check(self, check, argument_names):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2046 """Run a check plugin."""
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2047 arguments = []
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2048 for name in argument_names:
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2049 arguments.append(getattr(self, name))
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2050 return check(*arguments)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2051
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2052 def init_checker_state(self, name, argument_names):
5288
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
2053 """Prepare custom state for the specific checker plugin."""
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2054 if 'checker_state' in argument_names:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2055 self.checker_state = self._checker_states.setdefault(name, {})
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2056
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2057 def check_physical(self, line):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2058 """Run all physical checks on a raw input line."""
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2059 self.physical_line = line
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2060 for name, check, argument_names in self._physical_checks:
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2061 self.init_checker_state(name, argument_names)
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2062 result = self.run_check(check, argument_names)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2063 if result is not None:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2064 (offset, text) = result[:2]
2607
e5115553185a Fixes and consolidation for PEP8-checker.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 2302
diff changeset
2065 args = result[2:]
3209
c5432abceb25 CodeStyleChecker moved to background service and done a little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3145
diff changeset
2066 self.report_error_args(
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2067 self.line_number, offset, text, check, *args)
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2068 if text[:4] == 'E101':
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2069 self.indent_char = line[0]
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2070
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2071 def build_tokens_line(self):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2072 """Build a logical line from tokens."""
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2073 logical = []
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2074 comments = []
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2075 length = 0
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2076 prev_row = prev_col = mapping = None
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2077 for token_type, text, start, end, line in self.tokens:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2078 if token_type in SKIP_TOKENS:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2079 continue
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2080 if not mapping:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2081 mapping = [(0, start)]
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2082 if token_type == tokenize.COMMENT:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2083 comments.append(text)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2084 continue
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2085 if token_type == tokenize.STRING:
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2086 text = mute_string(text)
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2087 if prev_row:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2088 (start_row, start_col) = start
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2089 if prev_row != start_row: # different row
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2090 prev_text = self.lines[prev_row - 1][prev_col - 1]
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2091 if prev_text == ',' or (prev_text not in '{[(' and
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2092 text not in '}])'):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2093 text = ' ' + text
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2094 elif prev_col != start_col: # different column
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2095 text = line[prev_col:start_col] + text
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2096 logical.append(text)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2097 length += len(text)
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2098 mapping.append((length, end))
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2099 (prev_row, prev_col) = end
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2100 self.logical_line = ''.join(logical)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2101 self.noqa = comments and noqa(''.join(comments))
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2102 return mapping
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2103
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2104 def check_logical(self):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2105 """Build a line from tokens and run all logical checks on it."""
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2106 self.report.increment_logical_line()
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2107 mapping = self.build_tokens_line()
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2108 if not mapping:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2109 return
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2110
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
2111 mapping_offsets = [offset for offset, _ in mapping]
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2112 (start_row, start_col) = mapping[0][1]
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2113 start_line = self.lines[start_row - 1]
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2114 self.indent_level = expand_indent(start_line[:start_col])
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2115 if self.blank_before < self.blank_lines:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2116 self.blank_before = self.blank_lines
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2117 if self.verbose >= 2:
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2118 print(self.logical_line[:80].rstrip())
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2119 for name, check, argument_names in self._logical_checks:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2120 if self.verbose >= 4:
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2121 print(' ' + name)
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2122 self.init_checker_state(name, argument_names)
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2123 for result in self.run_check(check, argument_names) or ():
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2124 offset, text = result[:2]
2607
e5115553185a Fixes and consolidation for PEP8-checker.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 2302
diff changeset
2125 args = result[2:]
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2126 if not isinstance(offset, tuple):
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
2127 # As mappings are ordered, bisecting is a fast way
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
2128 # to find a given offset in them.
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
2129 token_offset, pos = mapping[bisect.bisect_left(
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
2130 mapping_offsets, offset)]
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2131 offset = (pos[0], pos[1] + offset - token_offset)
3209
c5432abceb25 CodeStyleChecker moved to background service and done a little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3145
diff changeset
2132 self.report_error_args(
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2133 offset[0], offset[1], text, check, *args)
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2134 if self.logical_line:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2135 self.previous_indent_level = self.indent_level
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2136 self.previous_logical = self.logical_line
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
2137 if not self.indent_level:
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
2138 self.previous_unindented_logical_line = self.logical_line
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2139 self.blank_lines = 0
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2140 self.tokens = []
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2141
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2142 def check_ast(self):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2143 """Build the file's AST and run all AST checks."""
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2144 try:
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
2145 tree = compile(''.join(self.lines), '', 'exec', PyCF_ONLY_AST)
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2146 except (ValueError, SyntaxError, TypeError):
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2147 return self.report_invalid_syntax()
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2148 for name, cls, __ in self._ast_checks:
7960
e8fc383322f7 Harmonized some user visible strings and changed the term 'eric6' to the more generic 'eric'.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7923
diff changeset
2149 # extended API for eric integration
2910
cdc56e9d9f12 Optimized the PEP-8 naming checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2899
diff changeset
2150 checker = cls(tree, self.filename, self.options)
2911
ce77f0b1ee67 Merge with default branch.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 2847 2866
diff changeset
2151 for args in checker.run():
3056
9986ec0e559a Merge with default branch before style changes.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 2911 2910
diff changeset
2152 lineno = args[0]
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2153 if not self.lines or not noqa(self.lines[lineno - 1]):
3056
9986ec0e559a Merge with default branch before style changes.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 2911 2910
diff changeset
2154 self.report_error_args(lineno, *args[1:])
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2155
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2156 def generate_tokens(self):
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2157 """Tokenize file, run physical line checks and yield tokens."""
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2158 if self._io_error:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2159 self.report_error_args(1, 0, 'E902', self._io_error, readlines)
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2160 tokengen = tokenize.generate_tokens(self.readline)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2161 try:
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2162 prev_physical = ''
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2163 for token in tokengen:
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2164 if token[2][0] > self.total_lines:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2165 return
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
2166 self.noqa = token[4] and noqa(token[4])
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2167 self.maybe_check_physical(token, prev_physical)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2168 yield token
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2169 prev_physical = token[4]
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2170 except (SyntaxError, tokenize.TokenError):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2171 self.report_invalid_syntax()
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2172
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2173 def maybe_check_physical(self, token, prev_physical):
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2174 """If appropriate for token, check current physical line(s)."""
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2175 # Called after every token, but act only on end of line.
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2176
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2177 # a newline token ends a single physical line.
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2178 if _is_eol_token(token):
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2179 # if the file does not end with a newline, the NEWLINE
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2180 # token is inserted by the parser, but it does not contain
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2181 # the previous physical line in `token[4]`
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2182 if token[4] == '':
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2183 self.check_physical(prev_physical)
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2184 else:
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2185 self.check_physical(token[4])
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2186 elif token[0] == tokenize.STRING and '\n' in token[1]:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2187 # Less obviously, a string that contains newlines is a
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2188 # multiline string, either triple-quoted or with internal
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2189 # newlines backslash-escaped. Check every physical line in
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2190 # the string *except* for the last one: its newline is
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2191 # outside of the multiline string, so we consider it a
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2192 # regular physical line, and will check it like any other
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2193 # physical line.
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2194 #
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2195 # Subtleties:
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2196 # - we don't *completely* ignore the last line; if it
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2197 # contains the magical "# noqa" comment, we disable all
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2198 # physical checks for the entire multiline string
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2199 # - have to wind self.line_number back because initially it
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2200 # points to the last line of the string, and we want
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2201 # check_physical() to give accurate feedback
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2202 if noqa(token[4]):
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2203 return
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2204 self.multiline = True
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2205 self.line_number = token[2][0]
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
2206 _, src, (_, offset), _, _ = token
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
2207 src = self.lines[self.line_number - 1][:offset] + src
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
2208 for line in src.split('\n')[:-1]:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2209 self.check_physical(line + '\n')
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2210 self.line_number += 1
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2211 self.multiline = False
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2212
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2213 def check_all(self, expected=None, line_offset=0):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2214 """Run all checks on the input file."""
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2215 self.report.init_file(self.filename, self.lines, expected, line_offset)
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2216 self.total_lines = len(self.lines)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2217 if self._ast_checks:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2218 self.check_ast()
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2219 self.line_number = 0
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2220 self.indent_char = None
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2221 self.indent_level = self.previous_indent_level = 0
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2222 self.previous_logical = ''
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
2223 self.previous_unindented_logical_line = ''
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2224 self.tokens = []
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2225 self.blank_lines = self.blank_before = 0
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2226 parens = 0
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2227 for token in self.generate_tokens():
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2228 self.tokens.append(token)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2229 token_type, text = token[0:2]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2230 if self.verbose >= 3:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2231 if token[2][0] == token[3][0]:
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
2232 pos = '[{}:{}]'.format(token[2][1] or '', token[3][1])
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2233 else:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2234 pos = 'l.%s' % token[3][0]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2235 print('l.%s\t%s\t%s\t%r' %
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2236 (token[2][0], pos, tokenize.tok_name[token[0]], text))
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2237 if token_type == tokenize.OP:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2238 if text in '([{':
2799
ec8c717e80f5 Fixed an issue in the pep8 checker tokenising a bad file.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2302
diff changeset
2239 parens += 1
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2240 elif text in '}])':
2799
ec8c717e80f5 Fixed an issue in the pep8 checker tokenising a bad file.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2302
diff changeset
2241 parens -= 1
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2242 elif not parens:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2243 if token_type in NEWLINE:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2244 if token_type == tokenize.NEWLINE:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2245 self.check_logical()
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2246 self.blank_before = 0
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2247 elif len(self.tokens) == 1:
2799
ec8c717e80f5 Fixed an issue in the pep8 checker tokenising a bad file.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2302
diff changeset
2248 # The physical line contains only this token.
ec8c717e80f5 Fixed an issue in the pep8 checker tokenising a bad file.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2302
diff changeset
2249 self.blank_lines += 1
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2250 del self.tokens[0]
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2251 else:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2252 self.check_logical()
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2253 if self.tokens:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2254 self.check_physical(self.lines[-1])
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2255 self.check_logical()
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2256 return self.report.get_file_results()
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2257
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2258
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
2259 class BaseReport:
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2260 """Collect the results of the checks."""
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2261
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2262 print_filename = False
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2263
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2264 def __init__(self, options):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2265 self._benchmark_keys = options.benchmark_keys
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2266 self._ignore_code = options.ignore_code
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2267 # Results
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2268 self.elapsed = 0
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2269 self.total_errors = 0
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2270 self.counters = dict.fromkeys(self._benchmark_keys, 0)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2271 self.messages = {}
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2272
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2273 def start(self):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2274 """Start the timer."""
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2275 self._start_time = time.time()
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2276
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2277 def stop(self):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2278 """Stop the timer."""
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2279 self.elapsed = time.time() - self._start_time
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2280
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2281 def init_file(self, filename, lines, expected, line_offset):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2282 """Signal a new file."""
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2283 self.filename = filename
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2284 self.lines = lines
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2285 self.expected = expected or ()
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2286 self.line_offset = line_offset
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2287 self.file_errors = 0
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2288 self.counters['files'] += 1
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2289 self.counters['physical lines'] += len(lines)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2290
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2291 def increment_logical_line(self):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2292 """Signal a new logical line."""
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2293 self.counters['logical lines'] += 1
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2294
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2295 def error(self, line_number, offset, text, check):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2296 """Report an error, according to options."""
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2297 code = text[:4]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2298 if self._ignore_code(code):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2299 return
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2300 if code in self.counters:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2301 self.counters[code] += 1
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2302 else:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2303 self.counters[code] = 1
3413
5e63f809732a Code style checker: Translations extracted and refactored.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3209
diff changeset
2304 self.messages[code] = []
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2305 # Don't care about expected errors or warnings
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2306 if code in self.expected:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2307 return
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2308 if self.print_filename and not self.file_errors:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2309 print(self.filename)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2310 self.file_errors += 1
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2311 self.total_errors += 1
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2312 return code
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2313
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2314 def error_args(self, line_number, offset, text, check, *args):
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2315 """Report an error, according to options."""
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2316 code = text[:4]
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2317 if self._ignore_code(code):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2318 return
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2319 if code in self.counters:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2320 self.counters[code] += 1
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2321 else:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2322 self.counters[code] = 1
3413
5e63f809732a Code style checker: Translations extracted and refactored.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3209
diff changeset
2323 self.messages[code] = args
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2324 # Don't care about expected errors or warnings
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2325 if code in self.expected:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2326 return
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2327 if self.print_filename and not self.file_errors:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2328 print(self.filename)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2329 self.file_errors += 1
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2330 self.total_errors += 1
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2331 return code
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2332
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2333 def get_file_results(self):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2334 """Return the count of errors and warnings for this file."""
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2335 return self.file_errors
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2336
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2337 def get_count(self, prefix=''):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2338 """Return the total count of errors and warnings."""
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2339 return sum(self.counters[key]
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2340 for key in self.messages if key.startswith(prefix))
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2341
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2342 def get_statistics(self, prefix=''):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2343 """Get statistics for message codes that start with the prefix.
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2344
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2345 prefix='' matches all errors and warnings
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2346 prefix='E' matches all errors
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2347 prefix='W' matches all warnings
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2348 prefix='E4' matches all errors that have to do with imports
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2349 """
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2350 return ['%-7s %s %s' % (self.counters[key], key, self.messages[key])
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2351 for key in sorted(self.messages) if key.startswith(prefix)]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2352
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2353 def print_statistics(self, prefix=''):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2354 """Print overall statistics (number of errors and warnings)."""
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2355 for line in self.get_statistics(prefix):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2356 print(line)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2357
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2358 def print_benchmark(self):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2359 """Print benchmark numbers."""
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
2360 print('{:<7.2f} {}'.format(self.elapsed, 'seconds elapsed'))
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2361 if self.elapsed:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2362 for key in self._benchmark_keys:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2363 print('%-7d %s per second (%d total)' %
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2364 (self.counters[key] / self.elapsed, key,
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2365 self.counters[key]))
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2366
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2367
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2368 class FileReport(BaseReport):
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2369 """Collect the results of the checks and print the filenames."""
5288
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
2370
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2371 print_filename = True
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2372
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2373
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2374 class StandardReport(BaseReport):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2375 """Collect and print the results of the checks."""
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2376
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2377 def __init__(self, options):
8218
7c09585bd960 Applied some more code simplifications suggested by the new Simplify checker (super(Foo, self) => super()).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8208
diff changeset
2378 super().__init__(options)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2379 self._fmt = REPORT_FORMAT.get(options.format.lower(),
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2380 options.format)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2381 self._repeat = options.repeat
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2382 self._show_source = options.show_source
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2383 self._show_pep8 = options.show_pep8
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2384
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2385 def init_file(self, filename, lines, expected, line_offset):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2386 """Signal a new file."""
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2387 self._deferred_print = []
8218
7c09585bd960 Applied some more code simplifications suggested by the new Simplify checker (super(Foo, self) => super()).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8208
diff changeset
2388 return super().init_file(
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2389 filename, lines, expected, line_offset)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2390
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2391 def error(self, line_number, offset, text, check):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2392 """Report an error, according to options."""
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
2393 code = super().error(line_number, offset, text, check)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2394 if code and (self.counters[code] == 1 or self._repeat):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2395 self._deferred_print.append(
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2396 (line_number, offset, code, text[5:], check.__doc__))
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2397 return code
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2398
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2399 def error_args(self, line_number, offset, code, check, *args):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2400 """Report an error, according to options."""
8218
7c09585bd960 Applied some more code simplifications suggested by the new Simplify checker (super(Foo, self) => super()).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8208
diff changeset
2401 code = super().error_args(line_number, offset,
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2402 code, check, *args)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2403 if code and (self.counters[code] == 1 or self._repeat):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2404 self._deferred_print.append(
3413
5e63f809732a Code style checker: Translations extracted and refactored.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3209
diff changeset
2405 (line_number, offset, code, args, check.__doc__))
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2406 return code
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2407
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2408 def get_file_results(self):
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2409 """Print results and return the overall count for this file."""
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2410 self._deferred_print.sort()
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2411 for line_number, offset, code, text, doc in self._deferred_print:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2412 print(self._fmt % {
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2413 'path': self.filename,
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2414 'row': self.line_offset + line_number, 'col': offset + 1,
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2415 'code': code, 'text': text,
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2416 })
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2417 if self._show_source:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2418 if line_number > len(self.lines):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2419 line = ''
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2420 else:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2421 line = self.lines[line_number - 1]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2422 print(line.rstrip())
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2423 print(re.sub(r'\S', ' ', line[:offset]) + '^')
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2424 if self._show_pep8 and doc:
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2425 print(' ' + doc.strip())
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2426
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2427 # stdout is block buffered when not stdout.isatty().
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2428 # line can be broken where buffer boundary since other
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2429 # processes write to same file.
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2430 # flush() after print() to avoid buffer boundary.
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2431 # Typical buffer size is 8192. line written safely when
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2432 # len(line) < 8192.
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2433 sys.stdout.flush()
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2434 return self.file_errors
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2435
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2436
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2437 class DiffReport(StandardReport):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2438 """Collect and print the results for the changed lines only."""
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2439
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2440 def __init__(self, options):
8218
7c09585bd960 Applied some more code simplifications suggested by the new Simplify checker (super(Foo, self) => super()).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8208
diff changeset
2441 super().__init__(options)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2442 self._selected = options.selected_lines
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2443
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2444 def error(self, line_number, offset, text, check):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2445 if line_number not in self._selected[self.filename]:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2446 return
8218
7c09585bd960 Applied some more code simplifications suggested by the new Simplify checker (super(Foo, self) => super()).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8208
diff changeset
2447 return super().error(line_number, offset, text, check)
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2448
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2449
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
2450 class StyleGuide:
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2451 """Initialize a PEP-8 instance with few options."""
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2452
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2453 def __init__(self, *args, **kwargs):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2454 # build options from the command line
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2455 self.checker_class = kwargs.pop('checker_class', Checker)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2456 parse_argv = kwargs.pop('parse_argv', False)
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2457 config_file = kwargs.pop('config_file', False)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2458 parser = kwargs.pop('parser', None)
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2459 # build options from dict
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2460 options_dict = dict(*args, **kwargs)
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2461 arglist = None if parse_argv else options_dict.get('paths', None)
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
2462 verbose = options_dict.get('verbose', None)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2463 options, self.paths = process_options(
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
2464 arglist, parse_argv, config_file, parser, verbose)
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2465 if options_dict:
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2466 options.__dict__.update(options_dict)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2467 if 'paths' in options_dict:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2468 self.paths = options_dict['paths']
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2469
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2470 self.runner = self.input_file
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2471 self.options = options
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2472
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2473 if not options.reporter:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2474 options.reporter = BaseReport if options.quiet else StandardReport
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2475
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2476 options.select = tuple(options.select or ())
3617
2f859c5dcfb4 Avoid fallback to default ignore list if not messages explicitly selected or ignored
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3616
diff changeset
2477 # if not (options.select or options.ignore or
2f859c5dcfb4 Avoid fallback to default ignore list if not messages explicitly selected or ignored
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3616
diff changeset
2478 # options.testsuite or options.doctest) and DEFAULT_IGNORE:
2f859c5dcfb4 Avoid fallback to default ignore list if not messages explicitly selected or ignored
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3616
diff changeset
2479 # # The default choice: ignore controversial checks
2f859c5dcfb4 Avoid fallback to default ignore list if not messages explicitly selected or ignored
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3616
diff changeset
2480 # options.ignore = tuple(DEFAULT_IGNORE.split(','))
2f859c5dcfb4 Avoid fallback to default ignore list if not messages explicitly selected or ignored
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3616
diff changeset
2481 # else:
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
2482 # # Ignore all checks which are not explicitly selected or all if no
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
2483 # options.ignore = ('',) if options.select else tuple(options.ignore)
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2484
3617
2f859c5dcfb4 Avoid fallback to default ignore list if not messages explicitly selected or ignored
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3616
diff changeset
2485 # check is ignored or explicitly selected
2f859c5dcfb4 Avoid fallback to default ignore list if not messages explicitly selected or ignored
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3616
diff changeset
2486 options.ignore = ('',) if options.select else tuple(options.ignore)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2487 options.benchmark_keys = BENCHMARK_KEYS[:]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2488 options.ignore_code = self.ignore_code
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2489 options.physical_checks = self.get_checks('physical_line')
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2490 options.logical_checks = self.get_checks('logical_line')
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2491 options.ast_checks = self.get_checks('tree')
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2492 self.init_report()
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2493
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2494 def init_report(self, reporter=None):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2495 """Initialize the report instance."""
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2496 self.options.report = (reporter or self.options.reporter)(self.options)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2497 return self.options.report
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2498
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2499 def check_files(self, paths=None):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2500 """Run all checks on the paths."""
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2501 if paths is None:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2502 paths = self.paths
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2503 report = self.options.report
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2504 runner = self.runner
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2505 report.start()
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2506 try:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2507 for path in paths:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2508 if os.path.isdir(path):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2509 self.input_dir(path)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2510 elif not self.excluded(path):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2511 runner(path)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2512 except KeyboardInterrupt:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2513 print('... stopped')
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2514 report.stop()
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2515 return report
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2516
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2517 def input_file(self, filename, lines=None, expected=None, line_offset=0):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2518 """Run all checks on a Python source file."""
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2519 if self.options.verbose:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2520 print('checking %s' % filename)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2521 fchecker = self.checker_class(
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2522 filename, lines=lines, options=self.options)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2523 return fchecker.check_all(expected=expected, line_offset=line_offset)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2524
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2525 def input_dir(self, dirname):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2526 """Check all files in this directory and all subdirectories."""
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2527 dirname = dirname.rstrip('/')
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2528 if self.excluded(dirname):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2529 return 0
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2530 counters = self.options.report.counters
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2531 verbose = self.options.verbose
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2532 filepatterns = self.options.filename
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2533 runner = self.runner
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2534 for root, dirs, files in os.walk(dirname):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2535 if verbose:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2536 print('directory ' + root)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2537 counters['directories'] += 1
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2538 for subdir in sorted(dirs):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2539 if self.excluded(subdir, root):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2540 dirs.remove(subdir)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2541 for filename in sorted(files):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2542 # contain a pattern that matches?
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
2543 if (
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
2544 filename_match(filename, filepatterns) and
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
2545 not self.excluded(filename, root)
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
2546 ):
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2547 runner(os.path.join(root, filename))
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2548
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2549 def excluded(self, filename, parent=None):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2550 """Check if the file should be excluded.
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2551
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2552 Check if 'options.exclude' contains a pattern matching filename.
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2553 """
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2554 if not self.options.exclude:
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2555 return False
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2556 basename = os.path.basename(filename)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2557 if filename_match(basename, self.options.exclude):
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2558 return True
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2559 if parent:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2560 filename = os.path.join(parent, filename)
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2561 filename = os.path.abspath(filename)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2562 return filename_match(filename, self.options.exclude)
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2563
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2564 def ignore_code(self, code):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2565 """Check if the error code should be ignored.
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2566
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2567 If 'options.select' contains a prefix of the error code,
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2568 return False. Else, if 'options.ignore' contains a prefix of
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2569 the error code, return True.
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2570 """
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2571 if len(code) < 4 and any(s.startswith(code)
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2572 for s in self.options.select):
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2573 return False
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2574 return (code.startswith(self.options.ignore) and
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2575 not code.startswith(self.options.select))
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2576
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2577 def get_checks(self, argument_name):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2578 """Get all the checks for this category.
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2579
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2580 Find all globally visible functions where the first argument
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2581 name starts with argument_name and which contain selected tests.
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2582 """
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2583 checks = []
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2584 for check, attrs in _checks[argument_name].items():
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2585 (codes, args) = attrs
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2586 if any(not (code and self.ignore_code(code)) for code in codes):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2587 checks.append((check.__name__, check, args))
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2588 return sorted(checks)
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2589
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2590
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
2591 def get_parser(prog='pycodestyle', version=__version__):
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
2592 """Create the parser for the program."""
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2593 parser = OptionParser(prog=prog, version=version,
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2594 usage="%prog [options] input ...")
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2595 parser.config_options = [
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2596 'exclude', 'filename', 'select', 'ignore', 'max-line-length',
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2597 'max-doc-length', 'indent-size', 'hang-closing', 'count', 'format',
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2598 'quiet', 'show-pep8', 'show-source', 'statistics', 'verbose']
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2599 parser.add_option('-v', '--verbose', default=0, action='count',
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2600 help="print status messages, or debug with -vv")
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2601 parser.add_option('-q', '--quiet', default=0, action='count',
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2602 help="report only file names, or nothing with -qq")
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2603 parser.add_option('-r', '--repeat', default=True, action='store_true',
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2604 help="(obsolete) show all occurrences of the same error")
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2605 parser.add_option('--first', action='store_false', dest='repeat',
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2606 help="show first occurrence of each error")
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2607 parser.add_option('--exclude', metavar='patterns', default=DEFAULT_EXCLUDE,
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2608 help="exclude files or directories which match these "
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2609 "comma separated patterns (default: %default)")
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2610 parser.add_option('--filename', metavar='patterns', default='*.py',
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2611 help="when parsing directories, only check filenames "
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2612 "matching these comma separated patterns "
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2613 "(default: %default)")
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2614 parser.add_option('--select', metavar='errors', default='',
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2615 help="select errors and warnings (e.g. E,W6)")
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2616 parser.add_option('--ignore', metavar='errors', default='',
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2617 help="skip errors and warnings (e.g. E4,W) "
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2618 "(default: %s)" % DEFAULT_IGNORE)
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2619 parser.add_option('--show-source', action='store_true',
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2620 help="show source code for each error")
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2621 parser.add_option('--show-pep8', action='store_true',
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2622 help="show text of PEP 8 for each error "
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2623 "(implies --first)")
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2624 parser.add_option('--statistics', action='store_true',
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2625 help="count errors and warnings")
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2626 parser.add_option('--count', action='store_true',
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2627 help="print total number of errors and warnings "
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2628 "to standard error and set exit code to 1 if "
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2629 "total is not null")
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2630 parser.add_option('--max-line-length', type='int', metavar='n',
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2631 default=MAX_LINE_LENGTH,
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2632 help="set maximum allowed line length "
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2633 "(default: %default)")
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2634 parser.add_option('--max-doc-length', type='int', metavar='n',
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2635 default=None,
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2636 help="set maximum allowed doc line length and perform "
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2637 "these checks (unchecked if not set)")
8208
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2638 parser.add_option('--indent-size', type='int', metavar='n',
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2639 default=INDENT_SIZE,
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2640 help="set how many spaces make up an indent "
37836fa8e4ea Updated pyflakes to 2.3.1 and pycodestyle to 2.7.0.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 7960
diff changeset
2641 "(default: %default)")
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2642 parser.add_option('--hang-closing', action='store_true',
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2643 help="hang closing bracket instead of matching "
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2644 "indentation of opening bracket's line")
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2645 parser.add_option('--format', metavar='format', default='default',
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2646 help="set the error format [default|pylint|<custom>]")
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2647 parser.add_option('--diff', action='store_true',
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2648 help="report changes only within line number ranges in "
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2649 "the unified diff received on STDIN")
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2650 group = parser.add_option_group("Testing Options")
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2651 if os.path.exists(TESTSUITE_PATH):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2652 group.add_option('--testsuite', metavar='dir',
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2653 help="run regression tests from dir")
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2654 group.add_option('--doctest', action='store_true',
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2655 help="run doctest on myself")
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2656 group.add_option('--benchmark', action='store_true',
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2657 help="measure processing speed")
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2658 return parser
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2659
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2660
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2661 def read_config(options, args, arglist, parser):
5288
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
2662 """Read and parse configurations.
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2663
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2664 If a config file is specified on the command line with the
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2665 "--config" option, then only it is used for configuration.
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2666
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2667 Otherwise, the user configuration (~/.config/pycodestyle) and any
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2668 local configurations in the current directory or above will be
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2669 merged together (in that order) using the read method of
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2670 ConfigParser.
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2671 """
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2672 config = RawConfigParser()
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2673
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2674 cli_conf = options.config
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2675
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2676 local_dir = os.curdir
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2677
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2678 if USER_CONFIG and os.path.isfile(USER_CONFIG):
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2679 if options.verbose:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2680 print('user configuration: %s' % USER_CONFIG)
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2681 config.read(USER_CONFIG)
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2682
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2683 parent = tail = args and os.path.abspath(os.path.commonprefix(args))
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2684 while tail:
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2685 if config.read(os.path.join(parent, fn) for fn in PROJECT_CONFIG):
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2686 local_dir = parent
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2687 if options.verbose:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2688 print('local configuration: in %s' % parent)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2689 break
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2690 (parent, tail) = os.path.split(parent)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2691
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2692 if cli_conf and os.path.isfile(cli_conf):
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2693 if options.verbose:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2694 print('cli configuration: %s' % cli_conf)
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2695 config.read(cli_conf)
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2696
5288
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
2697 pycodestyle_section = None
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
2698 if config.has_section(parser.prog):
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
2699 pycodestyle_section = parser.prog
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
2700 elif config.has_section('pep8'):
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
2701 pycodestyle_section = 'pep8' # Deprecated
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
2702 warnings.warn('[pep8] section is deprecated. Use [pycodestyle].')
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
2703
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
2704 if pycodestyle_section:
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2705 option_list = {o.dest: o.type or o.action for o in parser.option_list}
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2706
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2707 # First, read the default values
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2708 (new_options, __) = parser.parse_args([])
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2709
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2710 # Second, parse the configuration
5288
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
2711 for opt in config.options(pycodestyle_section):
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2712 if opt.replace('_', '-') not in parser.config_options:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2713 print(" unknown option '%s' ignored" % opt)
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2714 continue
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2715 if options.verbose > 1:
9375
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
2716 print(" {} = {}".format(opt,
e21b51a3d990 Third Party packages
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
2717 config.get(pycodestyle_section, opt)))
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2718 normalized_opt = opt.replace('-', '_')
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2719 opt_type = option_list[normalized_opt]
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2720 if opt_type in ('int', 'count'):
5288
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
2721 value = config.getint(pycodestyle_section, opt)
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
2722 elif opt_type in ('store_true', 'store_false'):
5288
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
2723 value = config.getboolean(pycodestyle_section, opt)
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
2724 else:
5288
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
2725 value = config.get(pycodestyle_section, opt)
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2726 if normalized_opt == 'exclude':
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2727 value = normalize_paths(value, local_dir)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2728 setattr(new_options, normalized_opt, value)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2729
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2730 # Third, overwrite with the command-line options
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2731 (options, __) = parser.parse_args(arglist, values=new_options)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2732 options.doctest = options.testsuite = False
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2733 return options
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2734
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2735
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2736 def process_options(arglist=None, parse_argv=False, config_file=None,
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
2737 parser=None, verbose=None):
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2738 """Process options passed either via arglist or command line args.
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2739
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2740 Passing in the ``config_file`` parameter allows other tools, such as
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2741 flake8 to specify their own options to be processed in pycodestyle.
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2742 """
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2743 if not parser:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2744 parser = get_parser()
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2745 if not parser.has_option('--config'):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2746 group = parser.add_option_group("Configuration", description=(
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2747 "The project options are read from the [%s] section of the "
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2748 "tox.ini file or the setup.cfg file located in any parent folder "
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2749 "of the path(s) being processed. Allowed options are: %s." %
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2750 (parser.prog, ', '.join(parser.config_options))))
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2751 group.add_option('--config', metavar='path', default=config_file,
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2752 help="user config file location")
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2753 # Don't read the command line if the module is used as a library.
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2754 if not arglist and not parse_argv:
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2755 arglist = []
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2756 # If parse_argv is True and arglist is None, arguments are
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2757 # parsed from the command line (sys.argv)
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2758 (options, args) = parser.parse_args(arglist)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2759 options.reporter = None
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2760
6732
1a4758379c45 Updated pycodestyle to 2.5.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6645
diff changeset
2761 # If explicitly specified verbosity, override any `-v` CLI flag
6246
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
2762 if verbose is not None:
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
2763 options.verbose = verbose
fe07a9f16f23 Updated pycodestyle to 2.4.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 6048
diff changeset
2764
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2765 if options.ensure_value('testsuite', False):
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2766 args.append(options.testsuite)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2767 elif not options.ensure_value('doctest', False):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2768 if parse_argv and not args:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2769 if options.diff or any(os.path.exists(name)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2770 for name in PROJECT_CONFIG):
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2771 args = ['.']
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2772 else:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2773 parser.error('input not specified')
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2774 options = read_config(options, args, arglist, parser)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2775 options.reporter = parse_argv and options.quiet == 1 and FileReport
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2776
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2777 options.filename = _parse_multi_options(options.filename)
3616
081b69e00f3e updated pep8 to 1.5.6
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3484
diff changeset
2778 options.exclude = normalize_paths(options.exclude)
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2779 options.select = _parse_multi_options(options.select)
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2780 options.ignore = _parse_multi_options(options.ignore)
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2781
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2782 if options.diff:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2783 options.reporter = DiffReport
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2784 stdin = stdin_get_value()
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2785 options.selected_lines = parse_udiff(stdin, options.filename, args[0])
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2786 args = sorted(options.selected_lines)
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2787
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2788 return options, args
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2789
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2790
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2791 def _parse_multi_options(options, split_token=','):
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2792 r"""Split and strip and discard empties.
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2793
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2794 Turns the following:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2795
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2796 A,
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2797 B,
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2798
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2799 into ["A", "B"]
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2800 """
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2801 if options:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2802 return [o.strip() for o in options.split(split_token) if o.strip()]
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2803 else:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2804 return options
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2805
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2806
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2807 def _main():
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2808 """Parse options and run checks on Python source."""
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2809 import signal
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2810
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2811 # Handle "Broken pipe" gracefully
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2812 try:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2813 signal.signal(signal.SIGPIPE, lambda signum, frame: sys.exit(1))
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2814 except AttributeError:
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2815 pass # not supported on Windows
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2816
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
2817 style_guide = StyleGuide(parse_argv=True)
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
2818 options = style_guide.options
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2819
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2820 if options.doctest or options.testsuite:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2821 from testsuite.support import run_tests
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
2822 report = run_tests(style_guide)
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2823 else:
5146
f96c32abd120 Updated the pep8 checker to version 2.1.0dev0.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4828
diff changeset
2824 report = style_guide.check_files()
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2825
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2826 if options.statistics:
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2827 report.print_statistics()
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2828
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2829 if options.benchmark:
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2830 report.print_benchmark()
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2831
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2832 if options.testsuite and not options.quiet:
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2833 report.print_results()
4828
b313794f46a2 updated pep8 to 1.7.0
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4631
diff changeset
2834
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2835 if report.total_errors:
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2836 if options.count:
2862
a1448560d7dc Started upgrading the pep8 checker to the latest release.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 2861
diff changeset
2837 sys.stderr.write(str(report.total_errors) + '\n')
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2838 sys.exit(1)
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2839
5288
ff831e3e383e Update pycodestyle to official 2.1.0 version.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 5147
diff changeset
2840
832
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2841 if __name__ == '__main__':
eb5ff61f927b Added a checker for PEP 8 compliance.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2842 _main()
4555
861e1741985c Adjustments to future imports for Python 2 compatibility.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 4331
diff changeset
2843 #
7639
422fd05e9c91 Removed some more Python2 related code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7620
diff changeset
2844 # eflag: noqa = D2, M601, M801

eric ide

mercurial