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

Thu, 08 Dec 2022 15:10:49 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Thu, 08 Dec 2022 15:10:49 +0100
branch
eric7
changeset 9592
2b3802c3c6d2
parent 9375
e21b51a3d990
child 9653
e67609152c5e
permissions
-rw-r--r--

Third Party packages
- Upgraded pycodestyle to version 2.10.0.

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

eric ide

mercurial