Thu, 30 Dec 2021 11:17:58 +0100
Updated copyright for 2022.
7335 | 1 | # -*- coding: utf-8 -*- |
2 | ||
8881
54e42bc2437a
Updated copyright for 2022.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
8650
diff
changeset
|
3 | # Copyright (c) 2020 - 2022 Detlev Offenbach <detlev@die-offenbachs.de> |
7335 | 4 | # |
5 | ||
6 | """ | |
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
7 | Module implementing the syntax check for TOML. |
7335 | 8 | """ |
9 | ||
10 | import queue | |
11 | import multiprocessing | |
12 | ||
13 | ||
14 | def initService(): | |
15 | """ | |
16 | Initialize the service and return the entry point. | |
17 | ||
18 | @return the entry point for the background client | |
19 | @rtype func | |
20 | """ | |
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
21 | return tomlSyntaxCheck |
7335 | 22 | |
23 | ||
24 | def initBatchService(): | |
25 | """ | |
26 | Initialize the batch service and return the entry point. | |
27 | ||
28 | @return the entry point for the background client | |
29 | @rtype func | |
30 | """ | |
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
31 | return tomlSyntaxBatchCheck |
7335 | 32 | |
33 | ||
34 | def normalizeCode(codestring): | |
35 | """ | |
36 | Function to normalize the given code. | |
37 | ||
38 | @param codestring code to be normalized | |
39 | @type str | |
40 | @return normalized code | |
41 | @rtype str | |
42 | """ | |
43 | codestring = codestring.replace("\r\n", "\n").replace("\r", "\n") | |
44 | ||
45 | if codestring and codestring[-1] != '\n': | |
8217
385f60c94548
Applied some more code simplifications suggested by the new Simplify checker.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7923
diff
changeset
|
46 | codestring += '\n' |
7335 | 47 | |
48 | return codestring | |
49 | ||
50 | ||
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
51 | def tomlSyntaxCheck(file, codestring): |
7335 | 52 | """ |
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
53 | Function to check a TOML source file for syntax errors. |
7335 | 54 | |
55 | @param file source filename | |
56 | @type str | |
57 | @param codestring string containing the code to check | |
58 | @type str | |
59 | @return dictionary with the keys 'error' and 'warnings' which | |
60 | hold a list containing details about the error/ warnings | |
61 | (file name, line number, column, codestring (only at syntax | |
62 | errors), the message, a list with arguments for the message) | |
63 | @rtype dict | |
64 | """ | |
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
65 | return __tomlSyntaxCheck(file, codestring) |
7335 | 66 | |
67 | ||
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
68 | def tomlSyntaxBatchCheck(argumentsList, send, fx, cancelled, maxProcesses=0): |
7335 | 69 | """ |
70 | Module function to check syntax for a batch of files. | |
71 | ||
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
72 | @param argumentsList list of arguments tuples as given for tomlSyntaxCheck |
7335 | 73 | @type list |
74 | @param send reference to send function | |
75 | @type func | |
76 | @param fx registered service name | |
77 | @type str | |
78 | @param cancelled reference to function checking for a cancellation | |
79 | @type func | |
80 | @param maxProcesses number of processes to be used | |
81 | @type int | |
82 | """ | |
83 | if maxProcesses == 0: | |
84 | # determine based on CPU count | |
85 | try: | |
86 | NumberOfProcesses = multiprocessing.cpu_count() | |
87 | if NumberOfProcesses >= 1: | |
88 | NumberOfProcesses -= 1 | |
89 | except NotImplementedError: | |
90 | NumberOfProcesses = 1 | |
91 | else: | |
92 | NumberOfProcesses = maxProcesses | |
93 | ||
94 | # Create queues | |
95 | taskQueue = multiprocessing.Queue() | |
96 | doneQueue = multiprocessing.Queue() | |
97 | ||
98 | # Submit tasks (initially two time number of processes | |
99 | initialTasks = 2 * NumberOfProcesses | |
100 | for task in argumentsList[:initialTasks]: | |
101 | taskQueue.put(task) | |
102 | ||
103 | # 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
|
104 | workers = [ |
7335 | 105 | multiprocessing.Process( |
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
|
106 | target=workerTask, args=(taskQueue, doneQueue) |
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
|
107 | ) for _ in range(NumberOfProcesses) |
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
|
108 | ] |
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
|
109 | 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
|
110 | worker.start() |
7335 | 111 | |
112 | # Get and send results | |
113 | endIndex = len(argumentsList) - initialTasks | |
114 | for i in range(len(argumentsList)): | |
115 | resultSent = False | |
116 | wasCancelled = False | |
117 | ||
118 | while not resultSent: | |
119 | try: | |
120 | # get result (waiting max. 3 seconds and send it to frontend | |
121 | filename, result = doneQueue.get() | |
122 | send(fx, filename, result) | |
123 | resultSent = True | |
124 | except queue.Empty: | |
125 | # ignore empty queue, just carry on | |
126 | if cancelled(): | |
127 | wasCancelled = True | |
128 | break | |
129 | ||
130 | if wasCancelled or cancelled(): | |
131 | # just exit the loop ignoring the results of queued tasks | |
132 | break | |
133 | ||
134 | if i < endIndex: | |
135 | taskQueue.put(argumentsList[i + initialTasks]) | |
136 | ||
137 | # Tell child processes to stop | |
138 | for _ in range(NumberOfProcesses): | |
139 | taskQueue.put('STOP') | |
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
|
140 | |
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
|
141 | 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
|
142 | 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
|
143 | worker.close() |
7335 | 144 | |
145 | ||
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
|
146 | def workerTask(inputQueue, outputQueue): |
7335 | 147 | """ |
148 | Module function acting as the parallel worker for the syntax check. | |
149 | ||
150 | @param inputQueue input queue | |
151 | @type multiprocessing.Queue | |
152 | @param outputQueue output queue | |
153 | @type multiprocessing.Queue | |
154 | """ | |
155 | for filename, args in iter(inputQueue.get, 'STOP'): | |
156 | source = args[0] | |
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
157 | result = __tomlSyntaxCheck(filename, source) |
7335 | 158 | outputQueue.put((filename, result)) |
159 | ||
160 | ||
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
161 | def __tomlSyntaxCheck(file, codestring): |
7335 | 162 | """ |
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
163 | Function to check a TOML source file for syntax errors. |
7335 | 164 | |
165 | @param file source filename | |
166 | @type str | |
167 | @param codestring string containing the code to check | |
168 | @type str | |
169 | @return dictionary with the keys 'error' and 'warnings' which | |
170 | hold a list containing details about the error/ warnings | |
171 | (file name, line number, column, codestring (only at syntax | |
172 | errors), the message, a list with arguments for the message) | |
173 | @rtype dict | |
174 | """ | |
175 | try: | |
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
176 | import toml |
7335 | 177 | except ImportError: |
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
178 | error = "toml not available. Install it via the PyPI interface." |
7335 | 179 | return [{'error': (file, 0, 0, '', error)}] |
180 | ||
181 | codestring = normalizeCode(codestring) | |
182 | ||
183 | try: | |
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
184 | toml.loads(codestring) |
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
185 | except toml.TomlDecodeError as exc: |
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
186 | line = exc.lineno |
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
187 | column = exc.colno |
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
188 | error = exc.msg |
7755
1f0a5024360c
JSON, YAML Syntax Check: formatted the syntax checker code for better readability.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7360
diff
changeset
|
189 | |
7335 | 190 | cline = min(len(codestring.splitlines()), int(line)) - 1 |
191 | code = codestring.splitlines()[cline] | |
7755
1f0a5024360c
JSON, YAML Syntax Check: formatted the syntax checker code for better readability.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7360
diff
changeset
|
192 | |
7335 | 193 | return [{'error': (file, line, column, code, error)}] |
194 | ||
195 | return [{}] |