diff options
author | Marcus Müller <marcus@hostalia.de> | 2018-09-21 00:00:57 +0200 |
---|---|---|
committer | Marcus Müller <marcus@hostalia.de> | 2018-09-21 00:00:57 +0200 |
commit | 267d669eb21c514c18a6ee979f5cf247d251f1ad (patch) | |
tree | c6120f5993f82daf13894e8bf905c4169493152e /grc/core/utils/extract_docs.py | |
parent | 896d1c9da31963ecf5b0d90942c2af51ca998a69 (diff) | |
parent | 7b20b28a9e5aa4e32ee37e89e7f80d74485344e8 (diff) |
Merge branch 'merge_next' (which merges next)
This has been in the making far too long.
We finally merge the next branch into master, in preparation of
releasing GNU Radio 3.8.
There will be breakage.
There will be awesomeness.
There will be progress in the greatest SDR framework to ever grace the
surface of the earth.
Hold tight for now.
Diffstat (limited to 'grc/core/utils/extract_docs.py')
-rw-r--r-- | grc/core/utils/extract_docs.py | 60 |
1 files changed, 35 insertions, 25 deletions
diff --git a/grc/core/utils/extract_docs.py b/grc/core/utils/extract_docs.py index a6e0bc971e..39cb6ec096 100644 --- a/grc/core/utils/extract_docs.py +++ b/grc/core/utils/extract_docs.py @@ -17,15 +17,19 @@ along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA """ +from __future__ import absolute_import, print_function + import sys import re import subprocess import threading import json -import Queue import random import itertools +import six +from six.moves import queue, filter, range + ############################################################################### # The docstring extraction @@ -94,8 +98,7 @@ def docstring_from_make(key, imports, make): if '$' in blk_cls: raise ValueError('Not an identifier') ns = dict() - for _import in imports: - exec(_import.strip(), ns) + exec(imports.strip(), ns) blk = eval(blk_cls, ns) doc_strings = {key: blk.__doc__} @@ -124,7 +127,7 @@ class SubprocessLoader(object): self.callback_query_result = callback_query_result self.callback_finished = callback_finished or (lambda: None) - self._queue = Queue.Queue() + self._queue = queue.Queue() self._thread = None self._worker = None self._shutdown = threading.Event() @@ -157,21 +160,22 @@ class SubprocessLoader(object): cmd, args = self._last_cmd if cmd == 'query': msg += " (crashed while loading {0!r})".format(args[0]) - print >> sys.stderr, msg + print(msg, file=sys.stderr) continue # restart else: break # normal termination, return finally: - self._worker.terminate() + if self._worker: + self._worker.terminate() else: - print >> sys.stderr, "Warning: docstring loader crashed too often" + print("Warning: docstring loader crashed too often", file=sys.stderr) self._thread = None self._worker = None self.callback_finished() def _handle_worker(self): """ Send commands and responses back from worker. """ - assert '1' == self._worker.stdout.read(1) + assert '1' == self._worker.stdout.read(1).decode('utf-8') for cmd, args in iter(self._queue.get, self.DONE): self._last_cmd = cmd, args self._send(cmd, args) @@ -181,14 +185,16 @@ class SubprocessLoader(object): def _send(self, cmd, args): """ Send a command to worker's stdin """ fd = self._worker.stdin - json.dump((self.AUTH_CODE, cmd, args), fd) - fd.write('\n'.encode()) + query = json.dumps((self.AUTH_CODE, cmd, args)) + fd.write(query.encode('utf-8')) + fd.write(b'\n') + fd.flush() def _receive(self): """ Receive response from worker's stdout """ for line in iter(self._worker.stdout.readline, ''): try: - key, cmd, args = json.loads(line, encoding='utf-8') + key, cmd, args = json.loads(line.decode('utf-8'), encoding='utf-8') if key != self.AUTH_CODE: raise ValueError('Got wrong auth code') return cmd, args @@ -203,9 +209,9 @@ class SubprocessLoader(object): key, docs = args self.callback_query_result(key, docs) elif cmd == 'error': - print args + print(args) else: - print >> sys.stderr, "Unknown response:", cmd, args + print("Unknown response:", cmd, args, file=sys.stderr) def query(self, key, imports=None, make=None): """ Request docstring extraction for a certain key """ @@ -242,27 +248,31 @@ class SubprocessLoader(object): def worker_main(): """ Main entry point for the docstring extraction process. - Manages RPC with main process through. + Manages RPC with main process through stdin/stdout. Runs a docstring extraction for each key it read on stdin. """ - def send(cmd, args): + def send(code, cmd, args): json.dump((code, cmd, args), sys.stdout) - sys.stdout.write('\n'.encode()) + sys.stdout.write('\n') + # fluh out to get new commands from the queue into stdin + sys.stdout.flush() sys.stdout.write('1') + # flush out to signal the main process we are ready for new commands + sys.stdout.flush() for line in iter(sys.stdin.readline, ''): code, cmd, args = json.loads(line, encoding='utf-8') try: if cmd == 'query': key, imports, make = args - send('result', (key, docstring_from_make(key, imports, make))) + send(code, 'result', (key, docstring_from_make(key, imports, make))) elif cmd == 'query_key_only': key, = args - send('result', (key, docstring_guess_from_key(key))) + send(code, 'result', (key, docstring_guess_from_key(key))) elif cmd == 'exit': break except Exception as e: - send('error', repr(e)) + send(code, 'error', repr(e)) if __name__ == '__worker__': @@ -270,12 +280,12 @@ if __name__ == '__worker__': elif __name__ == '__main__': def callback(key, docs): - print key - for match, doc in docs.iteritems(): - print '-->', match - print doc.strip() - print - print + print(key) + for match, doc in six.iteritems(docs): + print('-->', match) + print(str(doc).strip()) + print() + print() r = SubprocessLoader(callback) |