@@ -31,7 +31,6 @@ class LanguageTool:
3131 _PORT_RE = re.compile(r"(?:https?://.*:|port\s+)(\d+)", re.I)
3232
3333 def __init__(self, language=None, motherTongue=None, remote_server=None):
34- print('__init__', remote_server)
3534 if remote_server is not None:
3635 self._remote = True
3736 if remote_server[-1] == '/': remote_server = remote_server[:-1]
@@ -135,38 +134,42 @@ def disable_spellchecking(self):
135134 """Disable spell-checking rules."""
136135 self.disabled_rules.update(self._spell_checking_rules)
137136
138- def _get_languages(self) -> set:
137+ @classmethod
138+ def _get_languages(cls) -> set:
139139 """Get supported languages (by querying the server)."""
140- import pdb; pdb.set_trace()
141- self._start_server_if_needed()
142- url = urllib.parse.urljoin(self._url, 'languages')
140+ cls._start_server_if_needed()
141+ url = urllib.parse.urljoin(cls._url, 'languages')
143142 languages = set()
144- for e in self ._get_root(url, num_tries=1):
143+ for e in cls ._get_root(url, num_tries=1):
145144 languages.add(e.get('code'))
146145 languages.add(e.get('longCode'))
147146 return languages
148147
149- def _get_attrib(self):
148+ @classmethod
149+ def _get_attrib(cls):
150150 """Get matches element attributes."""
151- self ._start_server_if_needed()
151+ cls ._start_server_if_needed()
152152 params = {'language': FAILSAFE_LANGUAGE, 'text': ''}
153153 data = urllib.parse.urlencode(params).encode()
154- root = self ._get_root(self ._url, data, num_tries=1)
154+ root = cls ._get_root(cls ._url, data, num_tries=1)
155155 return root.attrib
156156
157- def _start_server_if_needed(self):
157+ @classmethod
158+ def _start_server_if_needed(cls):
158159 # Start server.
159- if not self ._server_is_alive() and self ._remote is False:
160- self ._start_server_on_free_port()
160+ if not cls ._server_is_alive() and cls ._remote is False:
161+ cls ._start_server_on_free_port()
161162
162- def _update_remote_server_config(self, url):
163- self._url = url
164- self._remote = True
163+ @classmethod
164+ def _update_remote_server_config(cls, url):
165+ cls._url = url
166+ cls._remote = True
165167
166- def _get_root(self, url, data=None, num_tries=2):
168+ @classmethod
169+ def _get_root(cls, url, data=None, num_tries=2):
167170 for n in range(num_tries):
168171 try:
169- with urlopen(url, data, self ._TIMEOUT) as f:
172+ with urlopen(url, data, cls ._TIMEOUT) as f:
170173 raw_data = f.read().decode('utf-8')
171174 try:
172175 return json.loads(raw_data)
@@ -175,38 +178,39 @@ def _get_root(self, url, data=None, num_tries=2):
175178 print(raw_data)
176179 raise e
177180 except (IOError, http.client.HTTPException) as e:
178- if self ._remote is False:
179- self ._terminate_server()
180- self ._start_local_server()
181+ if cls ._remote is False:
182+ cls ._terminate_server()
183+ cls ._start_local_server()
181184 if n + 1 >= num_tries:
182- raise LanguageToolError('{}: {}'.format(self ._url, e))
185+ raise LanguageToolError('{}: {}'.format(cls ._url, e))
183186
184- def _start_server_on_free_port(self):
187+ @classmethod
188+ def _start_server_on_free_port(cls):
185189 while True:
186- self ._url = 'http://{}:{}/v2/'.format(self ._HOST, self ._port)
190+ cls ._url = 'http://{}:{}/v2/'.format(cls ._HOST, cls ._port)
187191 try:
188- self ._start_local_server()
192+ cls ._start_local_server()
189193 break
190194 except ServerError:
191- if self ._MIN_PORT <= self ._port < self ._MAX_PORT:
192- self ._port += 1
195+ if cls ._MIN_PORT <= cls ._port < cls ._MAX_PORT:
196+ cls ._port += 1
193197 else:
194198 raise
195199
196-
197- def _start_local_server(self ):
200+ @classmethod
201+ def _start_local_server(cls ):
198202 # Before starting local server, download language tool if needed.
199203 download_lt()
200204
201205 err = None
202206 try:
203- server_cmd = get_server_cmd(self ._port)
207+ server_cmd = get_server_cmd(cls ._port)
204208 except PathError as e:
205209 # Can't find path to LanguageTool.
206210 err = e
207211 else:
208212 # Need to PIPE all handles: http://bugs.python.org/issue3905
209- self ._server = subprocess.Popen(
213+ cls ._server = subprocess.Popen(
210214 server_cmd,
211215 stdin=subprocess.PIPE,
212216 stdout=subprocess.PIPE,
@@ -215,84 +219,86 @@ def _start_local_server(self):
215219 startupinfo=startupinfo
216220 )
217221 # Python 2.7 compatibility
218- # for line in self ._server.stdout:
222+ # for line in cls ._server.stdout:
219223 match = None
220224 while True:
221- line = self ._server.stdout.readline()
225+ line = cls ._server.stdout.readline()
222226 if not line:
223227 break
224- match = self ._PORT_RE.search(line)
228+ match = cls ._PORT_RE.search(line)
225229 if match:
226230 port = int(match.group(1))
227- if port != self ._port:
231+ if port != cls ._port:
228232 raise LanguageToolError('requested port {}, but got {}'.format(
229- self ._port, port))
233+ cls ._port, port))
230234 break
231235 if not match:
232- err_msg = self ._terminate_server()
233- match = self ._PORT_RE.search(err_msg)
236+ err_msg = cls ._terminate_server()
237+ match = cls ._PORT_RE.search(err_msg)
234238 if not match:
235239 raise LanguageToolError(err_msg)
236240 port = int(match.group(1))
237- if port != self ._port:
241+ if port != cls ._port:
238242 raise LanguageToolError(err_msg)
239243
240- if self ._server:
241- self ._consumer_thread = threading.Thread(
242- target=lambda: _consume(self ._server.stdout))
243- self ._consumer_thread.daemon = True
244- self ._consumer_thread.start()
244+ if cls ._server:
245+ cls ._consumer_thread = threading.Thread(
246+ target=lambda: _consume(cls ._server.stdout))
247+ cls ._consumer_thread.daemon = True
248+ cls ._consumer_thread.start()
245249 else:
246250 # Couldn't start the server, so maybe there is already one running.
247251 params = {'language': FAILSAFE_LANGUAGE, 'text': ''}
248252 data = urllib.parse.urlencode(params).encode()
249253 try:
250- with urlopen(self ._url, data, self ._TIMEOUT) as f:
254+ with urlopen(cls ._url, data, cls ._TIMEOUT) as f:
251255 tree = ElementTree.parse(f)
252256 except (IOError, http.client.HTTPException) as e:
253257 if err:
254258 raise err
255- raise ServerError('{}: {}'.format(self ._url, e))
259+ raise ServerError('{}: {}'.format(cls ._url, e))
256260 root = tree.getroot()
257261
258262 # LanguageTool 1.9+
259263 if root.get('software') != 'LanguageTool':
260264 raise ServerError('unexpected software from {}: {!r}'
261- .format(self ._url, root.get('software')))
265+ .format(cls ._url, root.get('software')))
262266 raise ServerError('Server running; don\'t start a server here.')
263267
264- def _server_is_alive(self):
265- return self._server and self._server.poll() is None
268+ @classmethod
269+ def _server_is_alive(cls):
270+ return cls._server and cls._server.poll() is None
266271
267- def _terminate_server(self):
272+ @classmethod
273+ def _terminate_server(cls):
268274 LanguageToolError_message = ''
269275
270276 try:
271- self ._server.terminate()
277+ cls ._server.terminate()
272278 except OSError:
273279 pass
274280
275281 try:
276- LanguageToolError_message = self ._server.communicate()[1].strip()
282+ LanguageToolError_message = cls ._server.communicate()[1].strip()
277283 except (IOError, ValueError):
278284 pass
279285
280286 try:
281- self ._server.stdout.close()
287+ cls ._server.stdout.close()
282288 except IOError:
283289 pass
284290
285291 try:
286- self ._server.stdin.close()
292+ cls ._server.stdin.close()
287293 except IOError:
288294 pass
289295
290296 try:
291- self ._server.stderr.close()
297+ cls ._server.stderr.close()
292298 except IOError:
293299 pass
294300
295- self ._server = None
301+ cls ._server = None
296302
297303 return LanguageToolError_message
298304
@@ -302,11 +308,11 @@ class LanguageToolPublicAPI(LanguageTool):
302308 def __init__(self, *args, **kwargs):
303309 super().__init__(*args, remote_server='https://api.languagetool.org', **kwargs)
304310
305- # @atexit.register
306- # def terminate_server():
307- # """Terminate the server."""
308- # if LanguageTool._server_is_alive():
309- # LanguageTool._terminate_server()
311+ @atexit.register
312+ def terminate_server():
313+ """Terminate the server."""
314+ if LanguageTool._server_is_alive():
315+ LanguageTool._terminate_server()
310316
311317
312318
0 commit comments