Mon, 19 Feb 2024 15:33:33 +0100
Added methods to read and write files with a given encoding to the eric-ide server file system interface and adapted the code accordingly.
7335 | 1 | # -*- coding: utf-8 -*- |
2 | ||
10439
21c28b0f9e41
Updated copyright for 2024.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10341
diff
changeset
|
3 | # Copyright (c) 2020 - 2024 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 | ||
9473
3f23dbf37dbe
Resorted the import statements using isort.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9467
diff
changeset
|
10 | import multiprocessing |
7335 | 11 | import queue |
12 | ||
13 | ||
14 | def initService(): | |
15 | """ | |
16 | 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
|
17 | |
7335 | 18 | @return the entry point for the background client |
10341
3fdffd9cc21d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10111
diff
changeset
|
19 | @rtype function |
7335 | 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. | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
27 | |
7335 | 28 | @return the entry point for the background client |
10341
3fdffd9cc21d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10111
diff
changeset
|
29 | @rtype function |
7335 | 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 | ||
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
34 | def tomlSyntaxCheck(file, codestring): |
7335 | 35 | """ |
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
36 | Function to check a TOML source file for syntax errors. |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
37 | |
7335 | 38 | @param file source filename |
39 | @type str | |
40 | @param codestring string containing the code to check | |
41 | @type str | |
10341
3fdffd9cc21d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10111
diff
changeset
|
42 | @return list of dictionaries with the key 'error' which contain a tuple with |
3fdffd9cc21d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10111
diff
changeset
|
43 | details about the syntax error. Each tuple contains the file name, line |
3fdffd9cc21d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10111
diff
changeset
|
44 | number, column, code string and the error message. |
3fdffd9cc21d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10111
diff
changeset
|
45 | @rtype list of dict |
7335 | 46 | """ |
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
47 | return __tomlSyntaxCheck(file, codestring) |
7335 | 48 | |
49 | ||
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
50 | def tomlSyntaxBatchCheck(argumentsList, send, fx, cancelled, maxProcesses=0): |
7335 | 51 | """ |
52 | 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
|
53 | |
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
54 | @param argumentsList list of arguments tuples as given for tomlSyntaxCheck |
7335 | 55 | @type list |
56 | @param send reference to send function | |
10341
3fdffd9cc21d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10111
diff
changeset
|
57 | @type function |
7335 | 58 | @param fx registered service name |
59 | @type str | |
60 | @param cancelled reference to function checking for a cancellation | |
10341
3fdffd9cc21d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10111
diff
changeset
|
61 | @type function |
7335 | 62 | @param maxProcesses number of processes to be used |
63 | @type int | |
64 | """ | |
65 | if maxProcesses == 0: | |
66 | # determine based on CPU count | |
67 | try: | |
68 | NumberOfProcesses = multiprocessing.cpu_count() | |
69 | if NumberOfProcesses >= 1: | |
70 | NumberOfProcesses -= 1 | |
71 | except NotImplementedError: | |
72 | NumberOfProcesses = 1 | |
73 | else: | |
74 | NumberOfProcesses = maxProcesses | |
75 | ||
76 | # Create queues | |
77 | taskQueue = multiprocessing.Queue() | |
78 | doneQueue = multiprocessing.Queue() | |
79 | ||
9289
ba49c41e8f63
Did some optimizations in the multiprocessing code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9284
diff
changeset
|
80 | # 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
|
81 | 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
|
82 | initialTasks = min(2 * NumberOfProcesses, tasks) |
9289
ba49c41e8f63
Did some optimizations in the multiprocessing code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9284
diff
changeset
|
83 | for _ in range(initialTasks): |
ba49c41e8f63
Did some optimizations in the multiprocessing code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9284
diff
changeset
|
84 | taskQueue.put(argumentsList.pop(0)) |
7335 | 85 | |
86 | # 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
|
87 | workers = [ |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
88 | 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
|
89 | 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
|
90 | ] |
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
|
91 | 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
|
92 | worker.start() |
7335 | 93 | |
94 | # Get and send results | |
9289
ba49c41e8f63
Did some optimizations in the multiprocessing code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9284
diff
changeset
|
95 | for _ in range(tasks): |
7335 | 96 | resultSent = False |
97 | wasCancelled = False | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
98 | |
7335 | 99 | while not resultSent: |
100 | try: | |
101 | # get result (waiting max. 3 seconds and send it to frontend | |
102 | filename, result = doneQueue.get() | |
103 | send(fx, filename, result) | |
104 | resultSent = True | |
105 | except queue.Empty: | |
106 | # ignore empty queue, just carry on | |
107 | if cancelled(): | |
108 | wasCancelled = True | |
109 | break | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
110 | |
7335 | 111 | if wasCancelled or cancelled(): |
112 | # just exit the loop ignoring the results of queued tasks | |
113 | break | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
114 | |
9289
ba49c41e8f63
Did some optimizations in the multiprocessing code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9284
diff
changeset
|
115 | if argumentsList: |
ba49c41e8f63
Did some optimizations in the multiprocessing code.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9284
diff
changeset
|
116 | taskQueue.put(argumentsList.pop(0)) |
7335 | 117 | |
118 | # Tell child processes to stop | |
119 | for _ in range(NumberOfProcesses): | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
120 | taskQueue.put("STOP") |
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
121 | |
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
|
122 | 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
|
123 | 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
|
124 | worker.close() |
9284
3b3a4f659782
"Blacked" the sources.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9279
diff
changeset
|
125 | |
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
|
126 | 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
|
127 | doneQueue.close() |
7335 | 128 | |
129 | ||
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
|
130 | def workerTask(inputQueue, outputQueue): |
7335 | 131 | """ |
132 | 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
|
133 | |
7335 | 134 | @param inputQueue input queue |
135 | @type multiprocessing.Queue | |
136 | @param outputQueue output queue | |
137 | @type multiprocessing.Queue | |
138 | """ | |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
139 | for filename, args in iter(inputQueue.get, "STOP"): |
7335 | 140 | source = args[0] |
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
141 | result = __tomlSyntaxCheck(filename, source) |
7335 | 142 | outputQueue.put((filename, result)) |
143 | ||
144 | ||
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
145 | def __tomlSyntaxCheck(file, codestring): |
7335 | 146 | """ |
7756
c23a94f7e2e5
Syntax Checker: added a syntax checker for TOML files.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
7755
diff
changeset
|
147 | Function to check a TOML source file for syntax errors. |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
148 | |
7335 | 149 | @param file source filename |
150 | @type str | |
151 | @param codestring string containing the code to check | |
152 | @type str | |
10341
3fdffd9cc21d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10111
diff
changeset
|
153 | @return list of dictionaries with the key 'error' which contain a tuple with |
3fdffd9cc21d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10111
diff
changeset
|
154 | details about the syntax error. Each tuple contains the file name, line |
3fdffd9cc21d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10111
diff
changeset
|
155 | number, column, code string and the error message. |
3fdffd9cc21d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
10111
diff
changeset
|
156 | @rtype list of dict |
7335 | 157 | """ |
10111
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
158 | if codestring: |
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
159 | try: |
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
160 | import tomlkit # __IGNORE_WARNING_I10__ |
9473
3f23dbf37dbe
Resorted the import statements using isort.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9467
diff
changeset
|
161 | |
10111
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
162 | from tomlkit.exceptions import ( # __IGNORE_WARNING_I10__ |
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
163 | KeyAlreadyPresent, |
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
164 | ParseError, |
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
165 | ) |
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
166 | except ImportError: |
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
167 | error = "tomlkit not available. Install it via the PyPI interface." |
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
168 | return [{"error": (file, 0, 0, "", error)}] |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
169 | |
10111
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
170 | try: |
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
171 | tomlkit.parse(codestring) |
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
172 | except ParseError as exc: |
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
173 | line = exc.line |
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
174 | column = exc.col |
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
175 | error = str(exc).split(" at ", 1)[0].strip() |
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
176 | # get error message without location |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
177 | |
10111
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
178 | cline = min(len(codestring.splitlines()), int(line)) - 1 |
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
179 | code = codestring.splitlines()[cline] |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
180 | |
10111
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
181 | return [{"error": (file, line, column, code, error)}] |
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
182 | except KeyAlreadyPresent as exc: |
049fbbd2253d
Syntax Checker
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9653
diff
changeset
|
183 | return [{"error": (file, 0, 0, "", str(exc))}] |
9221
bf71ee032bb4
Reformatted the source code using the 'Black' utility.
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
9209
diff
changeset
|
184 | |
7335 | 185 | return [{}] |