src/eric7/Plugins/CheckerPlugins/SyntaxChecker/pyCheckSyntax.py

Sat, 02 Sep 2023 15:50:01 +0200

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sat, 02 Sep 2023 15:50:01 +0200
branch
eric7
changeset 10188
0f873791d67e
parent 10162
e7040c88b39e
child 10341
3fdffd9cc21d
permissions
-rw-r--r--

Syntax Checker
- Added code to the Python syntax checker to report Python Warnings.

2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
2
9653
e67609152c5e Updated copyright for 2023.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9591
diff changeset
3 # Copyright (c) 2011 - 2023 Detlev Offenbach <detlev@die-offenbachs.de>
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
4 #
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
5
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
6 """
7639
422fd05e9c91 Removed some more Python2 related code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7637
diff changeset
7 Module implementing the syntax check for Python 3.
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
8 """
4543
2e6a880670e9 Fixed a few code style issues (forgotten future imports, copyrights,...).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4385
diff changeset
9
9473
3f23dbf37dbe Resorted the import statements using isort.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9462
diff changeset
10 import ast
9482
a2bc06a54d9d Corrected/acknowledged some bad import style and removed some obsolete code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9473
diff changeset
11 import builtins
9473
3f23dbf37dbe Resorted the import statements using isort.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9462
diff changeset
12 import contextlib
3f23dbf37dbe Resorted the import statements using isort.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9462
diff changeset
13 import multiprocessing
7637
c878e8255972 Removed some more Python2 related code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7635
diff changeset
14 import queue
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
15 import re
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
16 import traceback
10162
e7040c88b39e Made some modification in preparation for Python 3.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10111
diff changeset
17 import warnings
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
18
8243
cc717c2ae956 Applied some more code simplifications suggested by the new Simplify checker (Y105: use contextlib.suppress) (batch 2).
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8234
diff changeset
19 with contextlib.suppress(ImportError):
3173
1fb284abe46e Interface to add user-defined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
20 from pyflakes.checker import Checker
9473
3f23dbf37dbe Resorted the import statements using isort.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9462
diff changeset
21 from pyflakes.messages import ImportStarUsage, ImportStarUsed
3173
1fb284abe46e Interface to add user-defined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
22
6107
78dabf542c6b Extended the check for VCS conflict markers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6048
diff changeset
23 VcsConflictMarkerRegExpList = (
78dabf542c6b Extended the check for VCS conflict markers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6048
diff changeset
24 re.compile(
6109
041715a2f703 Another fix for the VCS conflict markers regexp.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6108
diff changeset
25 r"""^<<<<<<< .*?\|\|\|\|\|\|\| .*?=======.*?>>>>>>> .*?$""",
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
26 re.MULTILINE | re.DOTALL,
6107
78dabf542c6b Extended the check for VCS conflict markers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6048
diff changeset
27 ),
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
28 re.compile(r"""^<<<<<<< .*?=======.*?>>>>>>> .*?$""", re.MULTILINE | re.DOTALL),
6107
78dabf542c6b Extended the check for VCS conflict markers.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6048
diff changeset
29 )
3173
1fb284abe46e Interface to add user-defined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
30
6119
18fb5d765f3a Fixed some code style issues.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6109
diff changeset
31
3173
1fb284abe46e Interface to add user-defined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
32 def initService():
1fb284abe46e Interface to add user-defined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
33 """
1fb284abe46e Interface to add user-defined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
34 Initialize the service and return the entry point.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
35
9508
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
36 @return the entry point for the background client
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
37 @rtype function
3173
1fb284abe46e Interface to add user-defined services, e.g. in plugins. Auto syntax check working. Little cleanup.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 3159
diff changeset
38 """
9508
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
39 return pySyntaxAndPyflakesCheck
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
40
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
41
4231
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
42 def initBatchService():
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
43 """
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
44 Initialize the batch service and return the entry point.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
45
9508
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
46 @return the entry point for the background client
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
47 @rtype function
4231
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
48 """
9508
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
49 return pySyntaxAndPyflakesBatchCheck
4231
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
50
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
51
5586
0e5421d679e7 Added capability to place line flags (e.g. __IGNORE...) on the line following the one to be ignored.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
52 def extractLineFlags(line, startComment="#", endComment="", flagsLine=False):
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
53 """
3065
070b35dde35e Fixed a bunch of indentation issues.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 2571
diff changeset
54 Function to extract flags starting and ending with '__' from a line
070b35dde35e Fixed a bunch of indentation issues.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents: 2571
diff changeset
55 comment.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
56
9508
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
57 @param line line to extract flags from
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
58 @type str
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
59 @param startComment string identifying the start of the comment
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
60 @type str
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
61 @param endComment string identifying the end of a comment
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
62 @type str
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
63 @param flagsLine flag indicating to check for a flags only line
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
64 @type bool
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
65 @return list containing the extracted flags
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
66 @rtype list of str
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
67 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
68 flags = []
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
69
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
70 if not flagsLine or (flagsLine and line.strip().startswith(startComment)):
5586
0e5421d679e7 Added capability to place line flags (e.g. __IGNORE...) on the line following the one to be ignored.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
71 pos = line.rfind(startComment)
0e5421d679e7 Added capability to place line flags (e.g. __IGNORE...) on the line following the one to be ignored.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
72 if pos >= 0:
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
73 comment = line[pos + len(startComment) :].strip()
5586
0e5421d679e7 Added capability to place line flags (e.g. __IGNORE...) on the line following the one to be ignored.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
74 if endComment:
0e5421d679e7 Added capability to place line flags (e.g. __IGNORE...) on the line following the one to be ignored.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
75 endPos = line.rfind(endComment)
0e5421d679e7 Added capability to place line flags (e.g. __IGNORE...) on the line following the one to be ignored.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
76 if endPos >= 0:
0e5421d679e7 Added capability to place line flags (e.g. __IGNORE...) on the line following the one to be ignored.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5389
diff changeset
77 comment = comment[:endPos]
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
78 flags = [
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
79 f.strip()
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
80 for f in comment.split()
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
81 if (f.startswith("__") and f.endswith("__"))
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
82 ]
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
83 flags += [
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
84 f.strip().lower() for f in comment.split() if f in ("noqa", "NOQA")
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
85 ]
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
86 return flags
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
87
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
88
9508
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
89 def pySyntaxAndPyflakesCheck(
9924
b41c9a7bcbbb Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
90 filename,
b41c9a7bcbbb Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
91 codestring,
b41c9a7bcbbb Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
92 checkFlakes=True,
b41c9a7bcbbb Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
93 ignoreStarImportWarnings=False,
b41c9a7bcbbb Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
94 additionalBuiltins=None,
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
95 ):
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
96 """
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
97 Function to compile one Python source file to Python bytecode
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
98 and to perform a pyflakes check.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
99
9508
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
100 @param filename source filename
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
101 @type str
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
102 @param codestring string containing the code to compile
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
103 @type str
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
104 @param checkFlakes flag indicating to do a pyflakes check
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
105 @type bool
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
106 @param ignoreStarImportWarnings flag indicating to ignore 'star import' warnings
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
107 @type bool
9924
b41c9a7bcbbb Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
108 @param additionalBuiltins list of names pyflakes should consider as builtins
b41c9a7bcbbb Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
109 @type list of str
10188
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
110 @return dictionary with the keys 'error', 'py_warnings' and 'warnings' which
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
111 hold a list containing details about the syntax error, Python warnings
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
112 and PyFlakes warnings (file name, line number, column, codestring (only
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
113 for syntax errors), the message and an optional list with arguments for
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
114 the message)
9508
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
115 @rtype dict
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
116 """
9508
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
117 return __pySyntaxAndPyflakesCheck(
9924
b41c9a7bcbbb Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
118 filename, codestring, checkFlakes, ignoreStarImportWarnings, additionalBuiltins
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
119 )
4231
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
120
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
121
9508
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
122 def pySyntaxAndPyflakesBatchCheck(argumentsList, send, fx, cancelled, maxProcesses=0):
4231
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
123 """
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
124 Module function to check syntax for a batch of files.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
125
9508
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
126 @param argumentsList list of arguments tuples as given for pySyntaxAndPyflakesCheck
5762
76ef5f340007 Added functionality to limit the number of processes used for bachground services.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5683
diff changeset
127 @type list
76ef5f340007 Added functionality to limit the number of processes used for bachground services.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5683
diff changeset
128 @param send reference to send function
76ef5f340007 Added functionality to limit the number of processes used for bachground services.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5683
diff changeset
129 @type func
76ef5f340007 Added functionality to limit the number of processes used for bachground services.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5683
diff changeset
130 @param fx registered service name
76ef5f340007 Added functionality to limit the number of processes used for bachground services.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5683
diff changeset
131 @type str
4231
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
132 @param cancelled reference to function checking for a cancellation
5762
76ef5f340007 Added functionality to limit the number of processes used for bachground services.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5683
diff changeset
133 @type func
76ef5f340007 Added functionality to limit the number of processes used for bachground services.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5683
diff changeset
134 @param maxProcesses number of processes to be used
76ef5f340007 Added functionality to limit the number of processes used for bachground services.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5683
diff changeset
135 @type int
4231
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
136 """
5762
76ef5f340007 Added functionality to limit the number of processes used for bachground services.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5683
diff changeset
137 if maxProcesses == 0:
76ef5f340007 Added functionality to limit the number of processes used for bachground services.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5683
diff changeset
138 # determine based on CPU count
76ef5f340007 Added functionality to limit the number of processes used for bachground services.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5683
diff changeset
139 try:
76ef5f340007 Added functionality to limit the number of processes used for bachground services.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5683
diff changeset
140 NumberOfProcesses = multiprocessing.cpu_count()
76ef5f340007 Added functionality to limit the number of processes used for bachground services.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5683
diff changeset
141 if NumberOfProcesses >= 1:
76ef5f340007 Added functionality to limit the number of processes used for bachground services.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5683
diff changeset
142 NumberOfProcesses -= 1
76ef5f340007 Added functionality to limit the number of processes used for bachground services.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5683
diff changeset
143 except NotImplementedError:
76ef5f340007 Added functionality to limit the number of processes used for bachground services.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5683
diff changeset
144 NumberOfProcesses = 1
76ef5f340007 Added functionality to limit the number of processes used for bachground services.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5683
diff changeset
145 else:
76ef5f340007 Added functionality to limit the number of processes used for bachground services.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5683
diff changeset
146 NumberOfProcesses = maxProcesses
4231
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
147
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
148 # Create queues
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
149 taskQueue = multiprocessing.Queue()
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
150 doneQueue = multiprocessing.Queue()
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
151
9289
ba49c41e8f63 Did some optimizations in the multiprocessing code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9284
diff changeset
152 # Submit tasks (initially two times the number of processes)
ba49c41e8f63 Did some optimizations in the multiprocessing code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9284
diff changeset
153 tasks = len(argumentsList)
9292
a5c8a0213fe3 Fixed an issue in the multiprocessing usage causing a traceback when then number of tasks is smaller than the number of worker processes.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9289
diff changeset
154 initialTasks = min(2 * NumberOfProcesses, tasks)
9289
ba49c41e8f63 Did some optimizations in the multiprocessing code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9284
diff changeset
155 for _ in range(initialTasks):
ba49c41e8f63 Did some optimizations in the multiprocessing code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9284
diff changeset
156 taskQueue.put(argumentsList.pop(0))
4231
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
157
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
158 # Start worker processes
8650
100726f55a9a Changed the 'multiprocessing.Process()' code of the background batch services to (hopefully) cure the slow down when used multiple times.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
159 workers = [
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
160 multiprocessing.Process(target=workerTask, args=(taskQueue, doneQueue))
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
161 for _ in range(NumberOfProcesses)
8650
100726f55a9a Changed the 'multiprocessing.Process()' code of the background batch services to (hopefully) cure the slow down when used multiple times.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
162 ]
100726f55a9a Changed the 'multiprocessing.Process()' code of the background batch services to (hopefully) cure the slow down when used multiple times.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
163 for worker in workers:
100726f55a9a Changed the 'multiprocessing.Process()' code of the background batch services to (hopefully) cure the slow down when used multiple times.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
164 worker.start()
4231
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
165
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
166 # Get and send results
9289
ba49c41e8f63 Did some optimizations in the multiprocessing code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9284
diff changeset
167 for _ in range(tasks):
5672
495b53f37f6c Corrected an issue in various checker services that caused them to block, if an exception was thrown in a checker class.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5616
diff changeset
168 resultSent = False
495b53f37f6c Corrected an issue in various checker services that caused them to block, if an exception was thrown in a checker class.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5616
diff changeset
169 wasCancelled = False
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
170
5672
495b53f37f6c Corrected an issue in various checker services that caused them to block, if an exception was thrown in a checker class.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5616
diff changeset
171 while not resultSent:
495b53f37f6c Corrected an issue in various checker services that caused them to block, if an exception was thrown in a checker class.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5616
diff changeset
172 try:
495b53f37f6c Corrected an issue in various checker services that caused them to block, if an exception was thrown in a checker class.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5616
diff changeset
173 # get result (waiting max. 3 seconds and send it to frontend
495b53f37f6c Corrected an issue in various checker services that caused them to block, if an exception was thrown in a checker class.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5616
diff changeset
174 filename, result = doneQueue.get()
495b53f37f6c Corrected an issue in various checker services that caused them to block, if an exception was thrown in a checker class.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5616
diff changeset
175 send(fx, filename, result)
495b53f37f6c Corrected an issue in various checker services that caused them to block, if an exception was thrown in a checker class.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5616
diff changeset
176 resultSent = True
495b53f37f6c Corrected an issue in various checker services that caused them to block, if an exception was thrown in a checker class.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5616
diff changeset
177 except queue.Empty:
495b53f37f6c Corrected an issue in various checker services that caused them to block, if an exception was thrown in a checker class.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5616
diff changeset
178 # ignore empty queue, just carry on
495b53f37f6c Corrected an issue in various checker services that caused them to block, if an exception was thrown in a checker class.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5616
diff changeset
179 if cancelled():
495b53f37f6c Corrected an issue in various checker services that caused them to block, if an exception was thrown in a checker class.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5616
diff changeset
180 wasCancelled = True
495b53f37f6c Corrected an issue in various checker services that caused them to block, if an exception was thrown in a checker class.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5616
diff changeset
181 break
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
182
5672
495b53f37f6c Corrected an issue in various checker services that caused them to block, if an exception was thrown in a checker class.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5616
diff changeset
183 if wasCancelled or cancelled():
4231
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
184 # just exit the loop ignoring the results of queued tasks
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
185 break
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
186
9289
ba49c41e8f63 Did some optimizations in the multiprocessing code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9284
diff changeset
187 if argumentsList:
ba49c41e8f63 Did some optimizations in the multiprocessing code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9284
diff changeset
188 taskQueue.put(argumentsList.pop(0))
4231
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
189
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
190 # Tell child processes to stop
6188
5a6ae3be31e6 Fixed some loop related coding issues detected by the extended code style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 6119
diff changeset
191 for _ in range(NumberOfProcesses):
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
192 taskQueue.put("STOP")
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
193
8650
100726f55a9a Changed the 'multiprocessing.Process()' code of the background batch services to (hopefully) cure the slow down when used multiple times.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
194 for worker in workers:
100726f55a9a Changed the 'multiprocessing.Process()' code of the background batch services to (hopefully) cure the slow down when used multiple times.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
195 worker.join()
100726f55a9a Changed the 'multiprocessing.Process()' code of the background batch services to (hopefully) cure the slow down when used multiple times.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
196 worker.close()
9284
3b3a4f659782 "Blacked" the sources.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9279
diff changeset
197
9279
e252f827aaa7 Added code to explicitly close the queues to/from the workers at the end of a batch check.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
198 taskQueue.close()
e252f827aaa7 Added code to explicitly close the queues to/from the workers at the end of a batch check.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9221
diff changeset
199 doneQueue.close()
4231
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
200
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
201
8650
100726f55a9a Changed the 'multiprocessing.Process()' code of the background batch services to (hopefully) cure the slow down when used multiple times.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 8312
diff changeset
202 def workerTask(inputQueue, outputQueue):
4231
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
203 """
7335
07ed3d73bf58 Syntax Checker:
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7256
diff changeset
204 Module function acting as the parallel worker for the syntax check.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
205
9508
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
206 @param inputQueue input queue
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
207 @type multiprocessing.Queue
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
208 @param outputQueue output queue
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
209 @type multiprocessing.Queue
4231
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
210 """
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
211 for filename, args in iter(inputQueue.get, "STOP"):
9924
b41c9a7bcbbb Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
212 source, checkFlakes, ignoreStarImportWarnings, additionalBuiltins = args
9508
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
213 result = __pySyntaxAndPyflakesCheck(
9924
b41c9a7bcbbb Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
214 filename, source, checkFlakes, ignoreStarImportWarnings, additionalBuiltins
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
215 )
5588
6ba512d9f46a Continued fixing code style issues detected by the extended style checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 5586
diff changeset
216 outputQueue.put((filename, result))
4231
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
217
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
218
9508
5a02bdb1dcba Harmonized the naming of some code in the syntax checker plugin.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9507
diff changeset
219 def __pySyntaxAndPyflakesCheck(
9924
b41c9a7bcbbb Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
220 filename,
b41c9a7bcbbb Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
221 codestring,
b41c9a7bcbbb Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
222 checkFlakes=True,
b41c9a7bcbbb Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
223 ignoreStarImportWarnings=False,
b41c9a7bcbbb Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
224 additionalBuiltins=None,
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
225 ):
4231
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
226 """
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
227 Function to compile one Python source file to Python bytecode
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
228 and to perform a pyflakes check.
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
229
8205
4a0f1f896341 Applied some code simplifications suggested by the new Simplify checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7923
diff changeset
230 @param filename source filename
4a0f1f896341 Applied some code simplifications suggested by the new Simplify checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7923
diff changeset
231 @type str
4a0f1f896341 Applied some code simplifications suggested by the new Simplify checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7923
diff changeset
232 @param codestring string containing the code to compile
4a0f1f896341 Applied some code simplifications suggested by the new Simplify checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7923
diff changeset
233 @type str
4a0f1f896341 Applied some code simplifications suggested by the new Simplify checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7923
diff changeset
234 @param checkFlakes flag indicating to do a pyflakes check
4a0f1f896341 Applied some code simplifications suggested by the new Simplify checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7923
diff changeset
235 @type bool
7900
72b88fb20261 Corrected the use of '@keyparam' in the source documentation.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7639
diff changeset
236 @param ignoreStarImportWarnings flag indicating to
8205
4a0f1f896341 Applied some code simplifications suggested by the new Simplify checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7923
diff changeset
237 ignore 'star import' warnings
4a0f1f896341 Applied some code simplifications suggested by the new Simplify checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7923
diff changeset
238 @type bool
9924
b41c9a7bcbbb Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
239 @param additionalBuiltins list of names pyflakes should consider as builtins
b41c9a7bcbbb Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9653
diff changeset
240 @type list of str
10188
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
241 @return dictionary with the keys 'error', 'py_warnings' and 'warnings' which
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
242 hold a list containing details about the syntax error, Python warnings
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
243 and PyFlakes warnings (file name, line number, column, codestring (only
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
244 for syntax errors), the message and an optional list with arguments for
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
245 the message)
8205
4a0f1f896341 Applied some code simplifications suggested by the new Simplify checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 7923
diff changeset
246 @rtype dict
4231
0b38613388c9 Implemented the batch check mode for the syntax checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 4207
diff changeset
247 """
10111
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
248 if codestring:
10162
e7040c88b39e Made some modification in preparation for Python 3.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10111
diff changeset
249 errorDict = {}
10188
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
250 pyWarnings = []
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
251
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
252 def showwarning(
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
253 message,
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
254 category,
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
255 filename,
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
256 lineno,
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
257 file=None, # noqa: U100
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
258 line=None, # noqa: U100
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
259 ):
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
260 pyWarnings.append(
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
261 (
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
262 filename,
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
263 lineno,
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
264 0,
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
265 "",
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
266 "{0}: {1}".format(category.__name__, message),
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
267 )
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
268 )
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
269
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
270 warnings.showwarning = showwarning
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
271 warnings.filterwarnings("always")
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
272
2571
e6bb19eb87ea Fixes for autocodecheck with pyflakes and update of py2flakes to 0.6.1.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff changeset
273 try:
10111
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
274 # Check for VCS conflict markers
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
275 for conflictMarkerRe in VcsConflictMarkerRegExpList:
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
276 conflict = conflictMarkerRe.search(codestring)
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
277 if conflict is not None:
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
278 start, i = conflict.span()
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
279 lineindex = 1 + codestring.count("\n", 0, start)
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
280 return [
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
281 {
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
282 "error": (
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
283 filename,
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
284 lineindex,
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
285 0,
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
286 "",
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
287 "VCS conflict marker found",
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
288 )
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
289 }
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
290 ]
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
291
10111
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
292 if filename.endswith(".ptl"):
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
293 try:
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
294 import quixote.ptl_compile # __IGNORE_WARNING_I10__
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
295 except ImportError:
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
296 return [
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
297 {"error": (filename, 0, 0, "", "Quixote plugin not found.")}
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
298 ]
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
299 template = quixote.ptl_compile.Template(codestring, filename)
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
300 template.compile()
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
301 else:
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
302 module = builtins.compile(
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
303 codestring, filename, "exec", ast.PyCF_ONLY_AST
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
304 )
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
305 except SyntaxError as detail:
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
306 index = 0
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
307 code = ""
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
308 error = ""
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
309 lines = traceback.format_exception_only(SyntaxError, detail)
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
310 match = re.match(
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
311 r'\s*File "(.+)", line (\d+)', lines[0].replace("<string>", filename)
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
312 )
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
313 if match is not None:
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
314 fn, line = match.group(1, 2)
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
315 if lines[1].startswith("SyntaxError:"):
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
316 error = re.match("SyntaxError: (.+)", lines[1]).group(1)
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
317 else:
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
318 code = re.match("(.+)", lines[1]).group(1)
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
319 for seLine in lines[2:]:
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
320 if seLine.startswith("SyntaxError:"):
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
321 error = re.match("SyntaxError: (.+)", seLine).group(1)
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
322 elif seLine.rstrip().endswith("^"):
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
323 index = len(seLine.rstrip()) - 4
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
324 else:
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
325 fn = detail.filename
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
326 line = detail.lineno or 1
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
327 error = detail.msg
10162
e7040c88b39e Made some modification in preparation for Python 3.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10111
diff changeset
328 errorDict = {"error": (fn, int(line), index, code.strip(), error)}
10111
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
329 except ValueError as detail:
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
330 try:
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
331 fn = detail.filename
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
332 line = detail.lineno
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
333 error = detail.msg
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
334 except AttributeError:
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
335 fn = filename
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
336 line = 1
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
337 error = str(detail)
10162
e7040c88b39e Made some modification in preparation for Python 3.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10111
diff changeset
338 errorDict = {"error": (fn, line, 0, "", error)}
10111
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
339 except Exception as detail:
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
340 with contextlib.suppress(AttributeError):
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
341 fn = detail.filename
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
342 line = detail.lineno
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
343 error = detail.msg
10162
e7040c88b39e Made some modification in preparation for Python 3.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10111
diff changeset
344 errorDict = {"error": (fn, line, 0, "", error)}
e7040c88b39e Made some modification in preparation for Python 3.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10111
diff changeset
345 finally:
e7040c88b39e Made some modification in preparation for Python 3.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10111
diff changeset
346 warnings.resetwarnings()
e7040c88b39e Made some modification in preparation for Python 3.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10111
diff changeset
347
10188
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
348 # return the syntax error, if one was detected
10162
e7040c88b39e Made some modification in preparation for Python 3.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10111
diff changeset
349 if errorDict:
e7040c88b39e Made some modification in preparation for Python 3.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10111
diff changeset
350 return [errorDict]
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
351
10111
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
352 # pyflakes
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
353 results = []
10188
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
354 if checkFlakes:
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
355 lines = codestring.splitlines()
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
356 try:
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
357 flakesWarnings = Checker(
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
358 module, filename, builtins=additionalBuiltins, withDoctest=True
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
359 )
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
360 flakesWarnings.messages.sort(key=lambda a: a.lineno)
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
361 for flakesWarning in flakesWarnings.messages:
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
362 if ignoreStarImportWarnings and isinstance(
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
363 flakesWarning, (ImportStarUsed, ImportStarUsage)
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
364 ):
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
365 continue
9221
bf71ee032bb4 Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9209
diff changeset
366
10188
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
367 _fn, lineno, col, message, msg_args = flakesWarning.getMessageData()
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
368 lineFlags = extractLineFlags(lines[lineno - 1].strip())
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
369 with contextlib.suppress(IndexError):
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
370 lineFlags += extractLineFlags(
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
371 lines[lineno].strip(), flagsLine=True
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
372 )
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
373 if (
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
374 "__IGNORE_WARNING__" not in lineFlags
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
375 and "__IGNORE_FLAKES_WARNING__" not in lineFlags
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
376 and "noqa" not in lineFlags
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
377 ):
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
378 results.append((_fn, lineno, col, "", message, msg_args))
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
379 except SyntaxError as err:
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
380 msg = err.text.strip() if err.text.strip() else err.msg
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
381 results.append((filename, err.lineno, 0, "FLAKES_ERROR", msg, []))
10111
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
382
10188
0f873791d67e Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 10162
diff changeset
383 return [{"py_warnings": pyWarnings, "warnings": results}]
10111
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
384
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
385 else:
049fbbd2253d Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9924
diff changeset
386 return [{}]

eric ide

mercurial