diff options
author | Andrej Rode <mail@andrejro.de> | 2018-06-23 23:41:42 +0200 |
---|---|---|
committer | Andrej Rode <mail@andrejro.de> | 2018-06-24 00:03:35 +0200 |
commit | 167a6152bad060fc53dd29e0fa79ef83eff1be5b (patch) | |
tree | a01049672d9d7d1bf3d295ed96698a323941f8e8 /docs | |
parent | 3c8e6008b092287246234001db7cf1a4038300da (diff) | |
parent | fcd002b6ac82e1e0c1224e24506410ff0833e1aa (diff) |
Merge branch 'python3_fix' into next
Manual merge conflict resolution has been applied to following
conflicts:
* Typos:
* gnuradio-runtime/python/gnuradio/ctrlport/GrDataPlotter.py
* gr-blocks/python/blocks/qa_wavfile.py
* gr-filter/examples/gr_filtdes_api.py
* grc/blocks/parameter.xml
* gr-uhd/python/uhd/__init__.py
* ValueError -> RuntimeError:
* gr-blocks/python/blocks/qa_hier_block2.py
* relative Imports & other Py3k:
* gr-digital/python/digital/psk_constellations.py
* gr-digital/python/digital/qam_constellations.py
* gr-digital/python/digital/test_soft_decisions.py
* gr-digital/python/digital/gfsk.py
* SequenceCompleter:
* gr-utils/python/modtool/modtool_add.py
* gr-utils/python/modtool/modtool_rename.py
* gr-utils/python/modtool/modtool_rm.py
* Updated API on next:
* gr-blocks/grc/blocks_file_source.xml
* gr-blocks/python/blocks/qa_file_source_sink.py
* gr-qtgui/grc/qtgui_time_sink_x.xml
* GRC Py3k Updates:
* grc/core/Block.py
* grc/core/Constants.py
* grc/core/Platform.py
* grc/core/utils/odict.py
* grc/gui/Actions.py
* grc/gui/Block.py
* grc/gui/Executor.py
* grc/gui/Port.py
Diffstat (limited to 'docs')
23 files changed, 446 insertions, 415 deletions
diff --git a/docs/doxygen/doxyxml/__init__.py b/docs/doxygen/doxyxml/__init__.py index 5cd0b3c6c5..b7a8884519 100644 --- a/docs/doxygen/doxyxml/__init__.py +++ b/docs/doxygen/doxyxml/__init__.py @@ -63,8 +63,9 @@ This line is uninformative and is only to test line breaks in the comments. u'Outputs the vital aadvark statistics.' """ +from __future__ import unicode_literals -from doxyindex import DoxyIndex, DoxyFunction, DoxyParam, DoxyClass, DoxyFile, DoxyNamespace, DoxyGroup, DoxyFriend, DoxyOther +from .doxyindex import DoxyIndex, DoxyFunction, DoxyParam, DoxyClass, DoxyFile, DoxyNamespace, DoxyGroup, DoxyFriend, DoxyOther def _test(): import os diff --git a/docs/doxygen/doxyxml/base.py b/docs/doxygen/doxyxml/base.py index e8f026ab90..f6f2b8e195 100644 --- a/docs/doxygen/doxyxml/base.py +++ b/docs/doxygen/doxyxml/base.py @@ -25,23 +25,26 @@ Classes based upon this are used to make more user-friendly interfaces to the doxygen xml docs than the generated classes provide. """ +from __future__ import print_function +from __future__ import unicode_literals + import os import pdb from xml.parsers.expat import ExpatError -from generated import compound +from .generated import compound class Base(object): - class Duplicate(StandardError): + class Duplicate(Exception): pass - class NoSuchMember(StandardError): + class NoSuchMember(Exception): pass - class ParsingError(StandardError): + class ParsingError(Exception): pass def __init__(self, parse_data, top=None): @@ -94,7 +97,7 @@ class Base(object): for cls in self.mem_classes: if cls.can_parse(mem): return cls - raise StandardError(("Did not find a class for object '%s'." \ + raise Exception(("Did not find a class for object '%s'." \ % (mem.get_name()))) def convert_mem(self, mem): @@ -102,11 +105,11 @@ class Base(object): cls = self.get_cls(mem) converted = cls.from_parse_data(mem, self.top) if converted is None: - raise StandardError('No class matched this object.') + raise Exception('No class matched this object.') self.add_ref(converted) return converted - except StandardError, e: - print e + except Exception as e: + print(e) @classmethod def includes(cls, inst): diff --git a/docs/doxygen/doxyxml/doxyindex.py b/docs/doxygen/doxyxml/doxyindex.py index e039737714..083550bdf8 100644 --- a/docs/doxygen/doxyxml/doxyindex.py +++ b/docs/doxygen/doxyxml/doxyindex.py @@ -22,12 +22,13 @@ Classes providing more user-friendly interfaces to the doxygen xml docs than the generated classes provide. """ +from __future__ import unicode_literals import os -from generated import index -from base import Base -from text import description +from .generated import index +from .base import Base +from .text import description class DoxyIndex(Base): """ diff --git a/docs/doxygen/doxyxml/generated/__init__.py b/docs/doxygen/doxyxml/generated/__init__.py index 39823979f6..23095c1f34 100644 --- a/docs/doxygen/doxyxml/generated/__init__.py +++ b/docs/doxygen/doxyxml/generated/__init__.py @@ -5,3 +5,4 @@ These do the real work of parsing the doxygen xml files but the resultant classes are not very friendly to navigate so the rest of the doxyxml module processes them further. """ +from __future__ import unicode_literals diff --git a/docs/doxygen/doxyxml/generated/compound.py b/docs/doxygen/doxyxml/generated/compound.py index 1522ac23f1..cd3cd1f96b 100644 --- a/docs/doxygen/doxyxml/generated/compound.py +++ b/docs/doxygen/doxyxml/generated/compound.py @@ -3,15 +3,16 @@ """ Generated Mon Feb 9 19:08:05 2009 by generateDS.py. """ +from __future__ import unicode_literals + -from string import lower as str_lower from xml.dom import minidom from xml.dom import Node import sys -import compoundsuper as supermod -from compoundsuper import MixedContainer +from . import compoundsuper as supermod +from .compoundsuper import MixedContainer class DoxygenTypeSub(supermod.DoxygenType): @@ -499,5 +500,3 @@ def parse(inFilename): rootObj = supermod.DoxygenType.factory() rootObj.build(rootNode) return rootObj - - diff --git a/docs/doxygen/doxyxml/generated/compoundsuper.py b/docs/doxygen/doxyxml/generated/compoundsuper.py index 6255dda163..f18ec6cda9 100644 --- a/docs/doxygen/doxyxml/generated/compoundsuper.py +++ b/docs/doxygen/doxyxml/generated/compoundsuper.py @@ -4,12 +4,16 @@ # Generated Thu Jun 11 18:44:25 2009 by generateDS.py. # +from __future__ import print_function +from __future__ import unicode_literals + import sys -import getopt -from string import lower as str_lower + from xml.dom import minidom from xml.dom import Node +import six + # # User methods # @@ -19,9 +23,9 @@ from xml.dom import Node try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: - class GeneratedsSuper: + class GeneratedsSuper(object): def format_string(self, input_data, input_name=''): return input_data def format_integer(self, input_data, input_name=''): @@ -64,7 +68,7 @@ def showIndent(outfile, level): outfile.write(' ') def quote_xml(inStr): - s1 = (isinstance(inStr, basestring) and inStr or + s1 = (isinstance(inStr, six.string_types) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') @@ -72,7 +76,7 @@ def quote_xml(inStr): return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or + s1 = (isinstance(inStr, six.string_types) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') @@ -102,7 +106,7 @@ def quote_python(inStr): return '"""%s"""' % s1 -class MixedContainer: +class MixedContainer(object): # Constants for category: CategoryNone = 0 CategoryText = 1 @@ -4221,7 +4225,7 @@ class codelineType(GeneratedsSuper): if attrs.get('lineno'): try: self.lineno = int(attrs.get('lineno').value) - except ValueError, exp: + except ValueError as exp: raise ValueError('Bad integer attribute (lineno): %s' % exp) if attrs.get('refkind'): self.refkind = attrs.get('refkind').value @@ -4504,12 +4508,12 @@ class referenceType(GeneratedsSuper): if attrs.get('endline'): try: self.endline = int(attrs.get('endline').value) - except ValueError, exp: + except ValueError as exp: raise ValueError('Bad integer attribute (endline): %s' % exp) if attrs.get('startline'): try: self.startline = int(attrs.get('startline').value) - except ValueError, exp: + except ValueError as exp: raise ValueError('Bad integer attribute (startline): %s' % exp) if attrs.get('refid'): self.refid = attrs.get('refid').value @@ -4627,17 +4631,17 @@ class locationType(GeneratedsSuper): if attrs.get('bodystart'): try: self.bodystart = int(attrs.get('bodystart').value) - except ValueError, exp: + except ValueError as exp: raise ValueError('Bad integer attribute (bodystart): %s' % exp) if attrs.get('line'): try: self.line = int(attrs.get('line').value) - except ValueError, exp: + except ValueError as exp: raise ValueError('Bad integer attribute (line): %s' % exp) if attrs.get('bodyend'): try: self.bodyend = int(attrs.get('bodyend').value) - except ValueError, exp: + except ValueError as exp: raise ValueError('Bad integer attribute (bodyend): %s' % exp) if attrs.get('bodyfile'): self.bodyfile = attrs.get('bodyfile').value @@ -6778,12 +6782,12 @@ class docTableType(GeneratedsSuper): if attrs.get('rows'): try: self.rows = int(attrs.get('rows').value) - except ValueError, exp: + except ValueError as exp: raise ValueError('Bad integer attribute (rows): %s' % exp) if attrs.get('cols'): try: self.cols = int(attrs.get('cols').value) - except ValueError, exp: + except ValueError as exp: raise ValueError('Bad integer attribute (cols): %s' % exp) def buildChildren(self, child_, nodeName_): if child_.nodeType == Node.ELEMENT_NODE and \ @@ -7108,7 +7112,7 @@ class docHeadingType(GeneratedsSuper): if attrs.get('level'): try: self.level = int(attrs.get('level').value) - except ValueError, exp: + except ValueError as exp: raise ValueError('Bad integer attribute (level): %s' % exp) def buildChildren(self, child_, nodeName_): if child_.nodeType == Node.TEXT_NODE: @@ -8283,7 +8287,7 @@ Options: """ def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -8339,4 +8343,3 @@ if __name__ == '__main__': main() #import pdb #pdb.run('main()') - diff --git a/docs/doxygen/doxyxml/generated/index.py b/docs/doxygen/doxyxml/generated/index.py index 7a70e14a1a..eb9a9048b2 100644 --- a/docs/doxygen/doxyxml/generated/index.py +++ b/docs/doxygen/doxyxml/generated/index.py @@ -3,14 +3,15 @@ """ Generated Mon Feb 9 19:08:05 2009 by generateDS.py. """ +from __future__ import unicode_literals from xml.dom import minidom import os import sys -import compound +from . import compound -import indexsuper as supermod +from . import indexsuper as supermod class DoxygenTypeSub(supermod.DoxygenType): def __init__(self, version=None, compound=None): diff --git a/docs/doxygen/doxyxml/generated/indexsuper.py b/docs/doxygen/doxyxml/generated/indexsuper.py index a991530198..11312db635 100644 --- a/docs/doxygen/doxyxml/generated/indexsuper.py +++ b/docs/doxygen/doxyxml/generated/indexsuper.py @@ -4,12 +4,16 @@ # Generated Thu Jun 11 18:43:54 2009 by generateDS.py. # +from __future__ import print_function +from __future__ import unicode_literals + import sys -import getopt -from string import lower as str_lower + from xml.dom import minidom from xml.dom import Node +import six + # # User methods # @@ -19,9 +23,9 @@ from xml.dom import Node try: from generatedssuper import GeneratedsSuper -except ImportError, exp: +except ImportError as exp: - class GeneratedsSuper: + class GeneratedsSuper(object): def format_string(self, input_data, input_name=''): return input_data def format_integer(self, input_data, input_name=''): @@ -64,7 +68,7 @@ def showIndent(outfile, level): outfile.write(' ') def quote_xml(inStr): - s1 = (isinstance(inStr, basestring) and inStr or + s1 = (isinstance(inStr, six.string_types) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') @@ -72,7 +76,7 @@ def quote_xml(inStr): return s1 def quote_attrib(inStr): - s1 = (isinstance(inStr, basestring) and inStr or + s1 = (isinstance(inStr, six.string_types) and inStr or '%s' % inStr) s1 = s1.replace('&', '&') s1 = s1.replace('<', '<') @@ -102,7 +106,7 @@ def quote_python(inStr): return '"""%s"""' % s1 -class MixedContainer: +class MixedContainer(object): # Constants for category: CategoryNone = 0 CategoryText = 1 @@ -462,7 +466,7 @@ Options: """ def usage(): - print USAGE_TEXT + print(USAGE_TEXT) sys.exit(1) @@ -520,4 +524,3 @@ if __name__ == '__main__': main() #import pdb #pdb.run('main()') - diff --git a/docs/doxygen/doxyxml/text.py b/docs/doxygen/doxyxml/text.py index 629edd180d..f0322f6237 100644 --- a/docs/doxygen/doxyxml/text.py +++ b/docs/doxygen/doxyxml/text.py @@ -21,6 +21,7 @@ """ Utilities for extracting text from generated classes. """ +from __future__ import unicode_literals def is_string(txt): if isinstance(txt, str): @@ -49,7 +50,7 @@ def description_bit(obj): elif is_string(obj): return obj else: - raise StandardError('Expecting a string or something with content, content_ or value attribute') + raise Exception('Expecting a string or something with content, content_ or value attribute') # If this bit is a paragraph then add one some line breaks. if hasattr(obj, 'name') and obj.name == 'para': result += "\n\n" diff --git a/docs/doxygen/other/doxypy.py b/docs/doxygen/other/doxypy.py index a9af32ab53..e474a9694f 100755..100644 --- a/docs/doxygen/other/doxypy.py +++ b/docs/doxygen/other/doxypy.py @@ -1,5 +1,8 @@ #!/usr/bin/env python +from __future__ import print_function +from __future__ import unicode_literals + __applicationName__ = "doxypy" __blurb__ = """ doxypy is an input filter for Doxygen. It preprocesses python @@ -11,8 +14,8 @@ __doc__ = __blurb__ + \ """ In order to make Doxygen preprocess files through doxypy, simply add the following lines to your Doxyfile: - FILTER_SOURCE_FILES = YES - INPUT_FILTER = "python /path/to/doxypy.py" + FILTER_SOURCE_FILES = YES + INPUT_FILTER = "python /path/to/doxypy.py" """ __version__ = "0.4.2" @@ -20,8 +23,8 @@ __date__ = "5th December 2008" __website__ = "http://code.foosel.org/doxypy" __author__ = ( - "Philippe 'demod' Neumann (doxypy at demod dot org)", - "Gina 'foosel' Haeussge (gina at foosel dot net)" + "Philippe 'demod' Neumann (doxypy at demod dot org)", + "Gina 'foosel' Haeussge (gina at foosel dot net)" ) __licenseName__ = "GPL v2" @@ -45,364 +48,364 @@ import re from argparse import ArgumentParser class FSM(object): - """Implements a finite state machine. - - Transitions are given as 4-tuples, consisting of an origin state, a target - state, a condition for the transition (given as a reference to a function - which gets called with a given piece of input) and a pointer to a function - to be called upon the execution of the given transition. - """ - - """ - @var transitions holds the transitions - @var current_state holds the current state - @var current_input holds the current input - @var current_transition hold the currently active transition - """ - - def __init__(self, start_state=None, transitions=[]): - self.transitions = transitions - self.current_state = start_state - self.current_input = None - self.current_transition = None - - def setStartState(self, state): - self.current_state = state - - def addTransition(self, from_state, to_state, condition, callback): - self.transitions.append([from_state, to_state, condition, callback]) - - def makeTransition(self, input): - """ Makes a transition based on the given input. - - @param input input to parse by the FSM - """ - for transition in self.transitions: - [from_state, to_state, condition, callback] = transition - if from_state == self.current_state: - match = condition(input) - if match: - self.current_state = to_state - self.current_input = input - self.current_transition = transition - if args.debug: - print >>sys.stderr, "# FSM: executing (%s -> %s) for line '%s'" % (from_state, to_state, input) - callback(match) - return + """Implements a finite state machine. + + Transitions are given as 4-tuples, consisting of an origin state, a target + state, a condition for the transition (given as a reference to a function + which gets called with a given piece of input) and a pointer to a function + to be called upon the execution of the given transition. + """ + + """ + @var transitions holds the transitions + @var current_state holds the current state + @var current_input holds the current input + @var current_transition hold the currently active transition + """ + + def __init__(self, start_state=None, transitions=[]): + self.transitions = transitions + self.current_state = start_state + self.current_input = None + self.current_transition = None + + def setStartState(self, state): + self.current_state = state + + def addTransition(self, from_state, to_state, condition, callback): + self.transitions.append([from_state, to_state, condition, callback]) + + def makeTransition(self, input): + """ Makes a transition based on the given input. + + @param input input to parse by the FSM + """ + for transition in self.transitions: + [from_state, to_state, condition, callback] = transition + if from_state == self.current_state: + match = condition(input) + if match: + self.current_state = to_state + self.current_input = input + self.current_transition = transition + if args.debug: + print("# FSM: executing (%s -> %s) for line '%s'" % (from_state, to_state, input), file=sys.stderr) + callback(match) + return class Doxypy(object): - def __init__(self): - string_prefixes = "[uU]?[rR]?" - - self.start_single_comment_re = re.compile("^\s*%s(''')" % string_prefixes) - self.end_single_comment_re = re.compile("(''')\s*$") - - self.start_double_comment_re = re.compile("^\s*%s(\"\"\")" % string_prefixes) - self.end_double_comment_re = re.compile("(\"\"\")\s*$") - - self.single_comment_re = re.compile("^\s*%s(''').*(''')\s*$" % string_prefixes) - self.double_comment_re = re.compile("^\s*%s(\"\"\").*(\"\"\")\s*$" % string_prefixes) - - self.defclass_re = re.compile("^(\s*)(def .+:|class .+:)") - self.empty_re = re.compile("^\s*$") - self.hashline_re = re.compile("^\s*#.*$") - self.importline_re = re.compile("^\s*(import |from .+ import)") - - self.multiline_defclass_start_re = re.compile("^(\s*)(def|class)(\s.*)?$") - self.multiline_defclass_end_re = re.compile(":\s*$") - - ## Transition list format - # ["FROM", "TO", condition, action] - transitions = [ - ### FILEHEAD - - # single line comments - ["FILEHEAD", "FILEHEAD", self.single_comment_re.search, self.appendCommentLine], - ["FILEHEAD", "FILEHEAD", self.double_comment_re.search, self.appendCommentLine], - - # multiline comments - ["FILEHEAD", "FILEHEAD_COMMENT_SINGLE", self.start_single_comment_re.search, self.appendCommentLine], - ["FILEHEAD_COMMENT_SINGLE", "FILEHEAD", self.end_single_comment_re.search, self.appendCommentLine], - ["FILEHEAD_COMMENT_SINGLE", "FILEHEAD_COMMENT_SINGLE", self.catchall, self.appendCommentLine], - ["FILEHEAD", "FILEHEAD_COMMENT_DOUBLE", self.start_double_comment_re.search, self.appendCommentLine], - ["FILEHEAD_COMMENT_DOUBLE", "FILEHEAD", self.end_double_comment_re.search, self.appendCommentLine], - ["FILEHEAD_COMMENT_DOUBLE", "FILEHEAD_COMMENT_DOUBLE", self.catchall, self.appendCommentLine], - - # other lines - ["FILEHEAD", "FILEHEAD", self.empty_re.search, self.appendFileheadLine], - ["FILEHEAD", "FILEHEAD", self.hashline_re.search, self.appendFileheadLine], - ["FILEHEAD", "FILEHEAD", self.importline_re.search, self.appendFileheadLine], - ["FILEHEAD", "DEFCLASS", self.defclass_re.search, self.resetCommentSearch], - ["FILEHEAD", "DEFCLASS_MULTI", self.multiline_defclass_start_re.search, self.resetCommentSearch], - ["FILEHEAD", "DEFCLASS_BODY", self.catchall, self.appendFileheadLine], - - ### DEFCLASS - - # single line comments - ["DEFCLASS", "DEFCLASS_BODY", self.single_comment_re.search, self.appendCommentLine], - ["DEFCLASS", "DEFCLASS_BODY", self.double_comment_re.search, self.appendCommentLine], - - # multiline comments - ["DEFCLASS", "COMMENT_SINGLE", self.start_single_comment_re.search, self.appendCommentLine], - ["COMMENT_SINGLE", "DEFCLASS_BODY", self.end_single_comment_re.search, self.appendCommentLine], - ["COMMENT_SINGLE", "COMMENT_SINGLE", self.catchall, self.appendCommentLine], - ["DEFCLASS", "COMMENT_DOUBLE", self.start_double_comment_re.search, self.appendCommentLine], - ["COMMENT_DOUBLE", "DEFCLASS_BODY", self.end_double_comment_re.search, self.appendCommentLine], - ["COMMENT_DOUBLE", "COMMENT_DOUBLE", self.catchall, self.appendCommentLine], - - # other lines - ["DEFCLASS", "DEFCLASS", self.empty_re.search, self.appendDefclassLine], - ["DEFCLASS", "DEFCLASS", self.defclass_re.search, self.resetCommentSearch], - ["DEFCLASS", "DEFCLASS_MULTI", self.multiline_defclass_start_re.search, self.resetCommentSearch], - ["DEFCLASS", "DEFCLASS_BODY", self.catchall, self.stopCommentSearch], - - ### DEFCLASS_BODY - - ["DEFCLASS_BODY", "DEFCLASS", self.defclass_re.search, self.startCommentSearch], - ["DEFCLASS_BODY", "DEFCLASS_MULTI", self.multiline_defclass_start_re.search, self.startCommentSearch], - ["DEFCLASS_BODY", "DEFCLASS_BODY", self.catchall, self.appendNormalLine], - - ### DEFCLASS_MULTI - ["DEFCLASS_MULTI", "DEFCLASS", self.multiline_defclass_end_re.search, self.appendDefclassLine], - ["DEFCLASS_MULTI", "DEFCLASS_MULTI", self.catchall, self.appendDefclassLine], - ] - - self.fsm = FSM("FILEHEAD", transitions) - self.outstream = sys.stdout - - self.output = [] - self.comment = [] - self.filehead = [] - self.defclass = [] - self.indent = "" - - def __closeComment(self): - """Appends any open comment block and triggering block to the output.""" - - if args.autobrief: - if len(self.comment) == 1 \ - or (len(self.comment) > 2 and self.comment[1].strip() == ''): - self.comment[0] = self.__docstringSummaryToBrief(self.comment[0]) - - if self.comment: - block = self.makeCommentBlock() - self.output.extend(block) - - if self.defclass: - self.output.extend(self.defclass) - - def __docstringSummaryToBrief(self, line): - """Adds \\brief to the docstrings summary line. - - A \\brief is prepended, provided no other doxygen command is at the - start of the line. - """ - stripped = line.strip() - if stripped and not stripped[0] in ('@', '\\'): - return "\\brief " + line - else: - return line - - def __flushBuffer(self): - """Flushes the current outputbuffer to the outstream.""" - if self.output: - try: - if args.debug: - print >>sys.stderr, "# OUTPUT: ", self.output - print >>self.outstream, "\n".join(self.output) - self.outstream.flush() - except IOError: - # Fix for FS#33. Catches "broken pipe" when doxygen closes - # stdout prematurely upon usage of INPUT_FILTER, INLINE_SOURCES - # and FILTER_SOURCE_FILES. - pass - self.output = [] - - def catchall(self, input): - """The catchall-condition, always returns true.""" - return True - - def resetCommentSearch(self, match): - """Restarts a new comment search for a different triggering line. - - Closes the current commentblock and starts a new comment search. - """ - if args.debug: - print >>sys.stderr, "# CALLBACK: resetCommentSearch" - self.__closeComment() - self.startCommentSearch(match) - - def startCommentSearch(self, match): - """Starts a new comment search. - - Saves the triggering line, resets the current comment and saves - the current indentation. - """ - if args.debug: - print >>sys.stderr, "# CALLBACK: startCommentSearch" - self.defclass = [self.fsm.current_input] - self.comment = [] - self.indent = match.group(1) - - def stopCommentSearch(self, match): - """Stops a comment search. - - Closes the current commentblock, resets the triggering line and - appends the current line to the output. - """ - if args.debug: - print >>sys.stderr, "# CALLBACK: stopCommentSearch" - self.__closeComment() - - self.defclass = [] - self.output.append(self.fsm.current_input) - - def appendFileheadLine(self, match): - """Appends a line in the FILEHEAD state. - - Closes the open comment block, resets it and appends the current line. - """ - if args.debug: - print >>sys.stderr, "# CALLBACK: appendFileheadLine" - self.__closeComment() - self.comment = [] - self.output.append(self.fsm.current_input) - - def appendCommentLine(self, match): - """Appends a comment line. - - The comment delimiter is removed from multiline start and ends as - well as singleline comments. - """ - if args.debug: - print >>sys.stderr, "# CALLBACK: appendCommentLine" - (from_state, to_state, condition, callback) = self.fsm.current_transition - - # single line comment - if (from_state == "DEFCLASS" and to_state == "DEFCLASS_BODY") \ - or (from_state == "FILEHEAD" and to_state == "FILEHEAD"): - # remove comment delimiter from begin and end of the line - activeCommentDelim = match.group(1) - line = self.fsm.current_input - self.comment.append(line[line.find(activeCommentDelim)+len(activeCommentDelim):line.rfind(activeCommentDelim)]) - - if (to_state == "DEFCLASS_BODY"): - self.__closeComment() - self.defclass = [] - # multiline start - elif from_state == "DEFCLASS" or from_state == "FILEHEAD": - # remove comment delimiter from begin of the line - activeCommentDelim = match.group(1) - line = self.fsm.current_input - self.comment.append(line[line.find(activeCommentDelim)+len(activeCommentDelim):]) - # multiline end - elif to_state == "DEFCLASS_BODY" or to_state == "FILEHEAD": - # remove comment delimiter from end of the line - activeCommentDelim = match.group(1) - line = self.fsm.current_input - self.comment.append(line[0:line.rfind(activeCommentDelim)]) - if (to_state == "DEFCLASS_BODY"): - self.__closeComment() - self.defclass = [] - # in multiline comment - else: - # just append the comment line - self.comment.append(self.fsm.current_input) - - def appendNormalLine(self, match): - """Appends a line to the output.""" - if args.debug: - print >>sys.stderr, "# CALLBACK: appendNormalLine" - self.output.append(self.fsm.current_input) - - def appendDefclassLine(self, match): - """Appends a line to the triggering block.""" - if args.debug: - print >>sys.stderr, "# CALLBACK: appendDefclassLine" - self.defclass.append(self.fsm.current_input) - - def makeCommentBlock(self): - """Indents the current comment block with respect to the current - indentation level. - - @returns a list of indented comment lines - """ - doxyStart = "##" - commentLines = self.comment - - commentLines = map(lambda x: "%s# %s" % (self.indent, x), commentLines) - l = [self.indent + doxyStart] - l.extend(commentLines) - - return l - - def parse(self, input): - """Parses a python file given as input string and returns the doxygen- - compatible representation. - - @param input the python code to parse - @returns the modified python code - """ - lines = input.split("\n") - - for line in lines: - self.fsm.makeTransition(line) - - if self.fsm.current_state == "DEFCLASS": - self.__closeComment() - - return "\n".join(self.output) - - def parseFile(self, filename): - """Parses a python file given as input string and returns the doxygen- - compatible representation. - - @param input the python code to parse - @returns the modified python code - """ - f = open(filename, 'r') - - for line in f: - self.parseLine(line.rstrip('\r\n')) - if self.fsm.current_state == "DEFCLASS": - self.__closeComment() - self.__flushBuffer() - f.close() - - def parseLine(self, line): - """Parse one line of python and flush the resulting output to the - outstream. - - @param line the python code line to parse - """ - self.fsm.makeTransition(line) - self.__flushBuffer() + def __init__(self): + string_prefixes = "[uU]?[rR]?" + + self.start_single_comment_re = re.compile("^\s*%s(''')" % string_prefixes) + self.end_single_comment_re = re.compile("(''')\s*$") + + self.start_double_comment_re = re.compile("^\s*%s(\"\"\")" % string_prefixes) + self.end_double_comment_re = re.compile("(\"\"\")\s*$") + + self.single_comment_re = re.compile("^\s*%s(''').*(''')\s*$" % string_prefixes) + self.double_comment_re = re.compile("^\s*%s(\"\"\").*(\"\"\")\s*$" % string_prefixes) + + self.defclass_re = re.compile("^(\s*)(def .+:|class .+:)") + self.empty_re = re.compile("^\s*$") + self.hashline_re = re.compile("^\s*#.*$") + self.importline_re = re.compile("^\s*(import |from .+ import)") + + self.multiline_defclass_start_re = re.compile("^(\s*)(def|class)(\s.*)?$") + self.multiline_defclass_end_re = re.compile(":\s*$") + + ## Transition list format + # ["FROM", "TO", condition, action] + transitions = [ + ### FILEHEAD + + # single line comments + ["FILEHEAD", "FILEHEAD", self.single_comment_re.search, self.appendCommentLine], + ["FILEHEAD", "FILEHEAD", self.double_comment_re.search, self.appendCommentLine], + + # multiline comments + ["FILEHEAD", "FILEHEAD_COMMENT_SINGLE", self.start_single_comment_re.search, self.appendCommentLine], + ["FILEHEAD_COMMENT_SINGLE", "FILEHEAD", self.end_single_comment_re.search, self.appendCommentLine], + ["FILEHEAD_COMMENT_SINGLE", "FILEHEAD_COMMENT_SINGLE", self.catchall, self.appendCommentLine], + ["FILEHEAD", "FILEHEAD_COMMENT_DOUBLE", self.start_double_comment_re.search, self.appendCommentLine], + ["FILEHEAD_COMMENT_DOUBLE", "FILEHEAD", self.end_double_comment_re.search, self.appendCommentLine], + ["FILEHEAD_COMMENT_DOUBLE", "FILEHEAD_COMMENT_DOUBLE", self.catchall, self.appendCommentLine], + + # other lines + ["FILEHEAD", "FILEHEAD", self.empty_re.search, self.appendFileheadLine], + ["FILEHEAD", "FILEHEAD", self.hashline_re.search, self.appendFileheadLine], + ["FILEHEAD", "FILEHEAD", self.importline_re.search, self.appendFileheadLine], + ["FILEHEAD", "DEFCLASS", self.defclass_re.search, self.resetCommentSearch], + ["FILEHEAD", "DEFCLASS_MULTI", self.multiline_defclass_start_re.search, self.resetCommentSearch], + ["FILEHEAD", "DEFCLASS_BODY", self.catchall, self.appendFileheadLine], + + ### DEFCLASS + + # single line comments + ["DEFCLASS", "DEFCLASS_BODY", self.single_comment_re.search, self.appendCommentLine], + ["DEFCLASS", "DEFCLASS_BODY", self.double_comment_re.search, self.appendCommentLine], + + # multiline comments + ["DEFCLASS", "COMMENT_SINGLE", self.start_single_comment_re.search, self.appendCommentLine], + ["COMMENT_SINGLE", "DEFCLASS_BODY", self.end_single_comment_re.search, self.appendCommentLine], + ["COMMENT_SINGLE", "COMMENT_SINGLE", self.catchall, self.appendCommentLine], + ["DEFCLASS", "COMMENT_DOUBLE", self.start_double_comment_re.search, self.appendCommentLine], + ["COMMENT_DOUBLE", "DEFCLASS_BODY", self.end_double_comment_re.search, self.appendCommentLine], + ["COMMENT_DOUBLE", "COMMENT_DOUBLE", self.catchall, self.appendCommentLine], + + # other lines + ["DEFCLASS", "DEFCLASS", self.empty_re.search, self.appendDefclassLine], + ["DEFCLASS", "DEFCLASS", self.defclass_re.search, self.resetCommentSearch], + ["DEFCLASS", "DEFCLASS_MULTI", self.multiline_defclass_start_re.search, self.resetCommentSearch], + ["DEFCLASS", "DEFCLASS_BODY", self.catchall, self.stopCommentSearch], + + ### DEFCLASS_BODY + + ["DEFCLASS_BODY", "DEFCLASS", self.defclass_re.search, self.startCommentSearch], + ["DEFCLASS_BODY", "DEFCLASS_MULTI", self.multiline_defclass_start_re.search, self.startCommentSearch], + ["DEFCLASS_BODY", "DEFCLASS_BODY", self.catchall, self.appendNormalLine], + + ### DEFCLASS_MULTI + ["DEFCLASS_MULTI", "DEFCLASS", self.multiline_defclass_end_re.search, self.appendDefclassLine], + ["DEFCLASS_MULTI", "DEFCLASS_MULTI", self.catchall, self.appendDefclassLine], + ] + + self.fsm = FSM("FILEHEAD", transitions) + self.outstream = sys.stdout + + self.output = [] + self.comment = [] + self.filehead = [] + self.defclass = [] + self.indent = "" + + def __closeComment(self): + """Appends any open comment block and triggering block to the output.""" + + if args.autobrief: + if len(self.comment) == 1 \ + or (len(self.comment) > 2 and self.comment[1].strip() == ''): + self.comment[0] = self.__docstringSummaryToBrief(self.comment[0]) + + if self.comment: + block = self.makeCommentBlock() + self.output.extend(block) + + if self.defclass: + self.output.extend(self.defclass) + + def __docstringSummaryToBrief(self, line): + """Adds \\brief to the docstrings summary line. + + A \\brief is prepended, provided no other doxygen command is at the + start of the line. + """ + stripped = line.strip() + if stripped and not stripped[0] in ('@', '\\'): + return "\\brief " + line + else: + return line + + def __flushBuffer(self): + """Flushes the current outputbuffer to the outstream.""" + if self.output: + try: + if args.debug: + print("# OUTPUT: ", self.output, file=sys.stderr) + print("\n".join(self.output), file=self.outstream) + self.outstream.flush() + except IOError: + # Fix for FS#33. Catches "broken pipe" when doxygen closes + # stdout prematurely upon usage of INPUT_FILTER, INLINE_SOURCES + # and FILTER_SOURCE_FILES. + pass + self.output = [] + + def catchall(self, input): + """The catchall-condition, always returns true.""" + return True + + def resetCommentSearch(self, match): + """Restarts a new comment search for a different triggering line. + + Closes the current commentblock and starts a new comment search. + """ + if args.debug: + print("# CALLBACK: resetCommentSearch", file=sys.stderr) + self.__closeComment() + self.startCommentSearch(match) + + def startCommentSearch(self, match): + """Starts a new comment search. + + Saves the triggering line, resets the current comment and saves + the current indentation. + """ + if args.debug: + print("# CALLBACK: startCommentSearch", file=sys.stderr) + self.defclass = [self.fsm.current_input] + self.comment = [] + self.indent = match.group(1) + + def stopCommentSearch(self, match): + """Stops a comment search. + + Closes the current commentblock, resets the triggering line and + appends the current line to the output. + """ + if args.debug: + print("# CALLBACK: stopCommentSearch", file=sys.stderr) + self.__closeComment() + + self.defclass = [] + self.output.append(self.fsm.current_input) + + def appendFileheadLine(self, match): + """Appends a line in the FILEHEAD state. + + Closes the open comment block, resets it and appends the current line. + """ + if args.debug: + print("# CALLBACK: appendFileheadLine", file=sys.stderr) + self.__closeComment() + self.comment = [] + self.output.append(self.fsm.current_input) + + def appendCommentLine(self, match): + """Appends a comment line. + + The comment delimiter is removed from multiline start and ends as + well as singleline comments. + """ + if args.debug: + print("# CALLBACK: appendCommentLine", file=sys.stderr) + (from_state, to_state, condition, callback) = self.fsm.current_transition + + # single line comment + if (from_state == "DEFCLASS" and to_state == "DEFCLASS_BODY") \ + or (from_state == "FILEHEAD" and to_state == "FILEHEAD"): + # remove comment delimiter from begin and end of the line + activeCommentDelim = match.group(1) + line = self.fsm.current_input + self.comment.append(line[line.find(activeCommentDelim)+len(activeCommentDelim):line.rfind(activeCommentDelim)]) + + if (to_state == "DEFCLASS_BODY"): + self.__closeComment() + self.defclass = [] + # multiline start + elif from_state == "DEFCLASS" or from_state == "FILEHEAD": + # remove comment delimiter from begin of the line + activeCommentDelim = match.group(1) + line = self.fsm.current_input + self.comment.append(line[line.find(activeCommentDelim)+len(activeCommentDelim):]) + # multiline end + elif to_state == "DEFCLASS_BODY" or to_state == "FILEHEAD": + # remove comment delimiter from end of the line + activeCommentDelim = match.group(1) + line = self.fsm.current_input + self.comment.append(line[0:line.rfind(activeCommentDelim)]) + if (to_state == "DEFCLASS_BODY"): + self.__closeComment() + self.defclass = [] + # in multiline comment + else: + # just append the comment line + self.comment.append(self.fsm.current_input) + + def appendNormalLine(self, match): + """Appends a line to the output.""" + if args.debug: + print("# CALLBACK: appendNormalLine", file=sys.stderr) + self.output.append(self.fsm.current_input) + + def appendDefclassLine(self, match): + """Appends a line to the triggering block.""" + if args.debug: + print("# CALLBACK: appendDefclassLine", file=sys.stderr) + self.defclass.append(self.fsm.current_input) + + def makeCommentBlock(self): + """Indents the current comment block with respect to the current + indentation level. + + @returns a list of indented comment lines + """ + doxyStart = "##" + commentLines = self.comment + + commentLines = ["%s# %s" % (self.indent, x) for x in commentLines] + l = [self.indent + doxyStart] + l.extend(commentLines) + + return l + + def parse(self, input): + """Parses a python file given as input string and returns the doxygen- + compatible representation. + + @param input the python code to parse + @returns the modified python code + """ + lines = input.split("\n") + + for line in lines: + self.fsm.makeTransition(line) + + if self.fsm.current_state == "DEFCLASS": + self.__closeComment() + + return "\n".join(self.output) + + def parseFile(self, filename): + """Parses a python file given as input string and returns the doxygen- + compatible representation. + + @param input the python code to parse + @returns the modified python code + """ + f = open(filename, 'r') + + for line in f: + self.parseLine(line.rstrip('\r\n')) + if self.fsm.current_state == "DEFCLASS": + self.__closeComment() + self.__flushBuffer() + f.close() + + def parseLine(self, line): + """Parse one line of python and flush the resulting output to the + outstream. + + @param line the python code line to parse + """ + self.fsm.makeTransition(line) + self.__flushBuffer() def argParse(): - """Parses commandline args.""" - parser = ArgumentParser(prog=__applicationName__) - - parser.add_argument("--version", action="version", - version="%(prog)s " + __version__ - ) - parser.add_argument("--autobrief", action="store_true", - help="use the docstring summary line as \\brief description" - ) - parser.add_argument("--debug", action="store_true", - help="enable debug output on stderr" - ) - parser.add_argument("filename", metavar="FILENAME") - - return parser.parse_args() + """Parses commandline args.""" + parser = ArgumentParser(prog=__applicationName__) + + parser.add_argument("--version", action="version", + version="%(prog)s " + __version__ + ) + parser.add_argument("--autobrief", action="store_true", + help="use the docstring summary line as \\brief description" + ) + parser.add_argument("--debug", action="store_true", + help="enable debug output on stderr" + ) + parser.add_argument("filename", metavar="FILENAME") + + return parser.parse_args() def main(): - """Starts the parser on the file given by the filename as the first - argument on the commandline. - """ - global args - args = argParse() - fsm = Doxypy() - fsm.parseFile(args.filename) + """Starts the parser on the file given by the filename as the first + argument on the commandline. + """ + global args + args = argParse() + fsm = Doxypy() + fsm.parseFile(args.filename) if __name__ == "__main__": - main() + main() diff --git a/docs/doxygen/swig_doc.py b/docs/doxygen/swig_doc.py index c9e89aec1b..307920d776 100644 --- a/docs/doxygen/swig_doc.py +++ b/docs/doxygen/swig_doc.py @@ -26,6 +26,7 @@ The file instructs SWIG to transfer the doxygen comments into the python docstrings. """ +from __future__ import unicode_literals import sys, time @@ -84,8 +85,8 @@ def utoascii(text): if text is None: return '' out = text.encode('ascii', 'replace') - out = out.replace('"', '\\"') - return out + out = out.replace(b'"', b'\\"').decode('ascii') + return str(out) def combine_descriptions(obj): @@ -301,7 +302,7 @@ def make_swig_interface_file(di, swigdocfilename, custom_output=None): output = "\n\n".join(output) - swig_doc = file(swigdocfilename, 'w') + swig_doc = open(swigdocfilename, 'w') swig_doc.write(output) swig_doc.close() @@ -309,7 +310,7 @@ if __name__ == "__main__": # Parse command line options and set up doxyxml. err_msg = "Execute using: python swig_doc.py xml_path outputfilename" if len(sys.argv) != 3: - raise StandardError(err_msg) + raise Exception(err_msg) xml_path = sys.argv[1] swigdocfilename = sys.argv[2] di = DoxyIndex(xml_path) diff --git a/docs/exploring-gnuradio/dial_tone.py b/docs/exploring-gnuradio/dial_tone.py index ba43c43bfc..08498a84e0 100755..100644 --- a/docs/exploring-gnuradio/dial_tone.py +++ b/docs/exploring-gnuradio/dial_tone.py @@ -20,6 +20,7 @@ # Boston, MA 02110-1301, USA. # +from __future__ import unicode_literals from gnuradio import gr from gnuradio import audio from gnuradio import analog @@ -40,5 +41,5 @@ def build_graph(): if __name__ == '__main__': tb = build_graph() tb.start() - raw_input('Press Enter to quit: ') + input('Press Enter to quit: ') tb.stop() diff --git a/docs/exploring-gnuradio/fm_demod.py b/docs/exploring-gnuradio/fm_demod.py index 8e8b6425f9..a297e78a76 100755..100644 --- a/docs/exploring-gnuradio/fm_demod.py +++ b/docs/exploring-gnuradio/fm_demod.py @@ -20,6 +20,8 @@ # Boston, MA 02110-1301, USA. # +from __future__ import division +from __future__ import unicode_literals from gnuradio import gr from gnuradio import blocks from gnuradio import filter @@ -46,7 +48,7 @@ class build_graph(gr.top_block): # Set the demodulator using the same deviation as the receiver. max_dev = 75e3 - fm_demod_gain = input_rate/(2*math.pi*max_dev/8.0) + fm_demod_gain = input_rate / (2*math.pi*max_dev/8.0) fm_demod = analog.quadrature_demod_cf(fm_demod_gain) # Create a filter for the resampler and filter the audio @@ -80,7 +82,7 @@ class build_graph(gr.top_block): def main(args): tb = build_graph() tb.start() # fork thread and return - raw_input('Press Enter to quit: ') + input('Press Enter to quit: ') tb.stop() if __name__ == '__main__': diff --git a/docs/sphinx/gnuradio_sphinx.py b/docs/sphinx/gnuradio_sphinx.py index 22b96c32e7..cdfd46ceca 100644 --- a/docs/sphinx/gnuradio_sphinx.py +++ b/docs/sphinx/gnuradio_sphinx.py @@ -1,6 +1,7 @@ """ Customizations of sphinx for gnuradio use. """ +from __future__ import unicode_literals from sphinx.ext.autodoc import py_ext_sig_re from sphinx.ext.autodoc import ClassDocumenter, FunctionDocumenter, members_option diff --git a/docs/sphinx/hieroglyph/__init__.py b/docs/sphinx/hieroglyph/__init__.py index 25dea27fba..d6b00fc049 100644 --- a/docs/sphinx/hieroglyph/__init__.py +++ b/docs/sphinx/hieroglyph/__init__.py @@ -1,6 +1,7 @@ +from __future__ import unicode_literals # We only need to expose the setup function to Sphinx from .hieroglyph import setup from .version import __version__ -__author__ = 'Robert Smallshire'
\ No newline at end of file +__author__ = 'Robert Smallshire' diff --git a/docs/sphinx/hieroglyph/errors.py b/docs/sphinx/hieroglyph/errors.py index 9c1d2213b2..9f7cde9570 100644 --- a/docs/sphinx/hieroglyph/errors.py +++ b/docs/sphinx/hieroglyph/errors.py @@ -1,3 +1,4 @@ +from __future__ import unicode_literals from sphinx.errors import ExtensionError @@ -7,4 +8,4 @@ class HieroglyphError(ExtensionError): ''' An exception type specific to the Hieroglyph Sphinx extension. ''' - pass
\ No newline at end of file + pass diff --git a/docs/sphinx/hieroglyph/hieroglyph.py b/docs/sphinx/hieroglyph/hieroglyph.py index 0056d9ab8a..bb58a6e04b 100644 --- a/docs/sphinx/hieroglyph/hieroglyph.py +++ b/docs/sphinx/hieroglyph/hieroglyph.py @@ -1,9 +1,11 @@ from __future__ import print_function +from __future__ import absolute_import +from __future__ import unicode_literals import re -from errors import HieroglyphError -from nodes import (Node, Raises, Except, Note, Warning, Returns, Arg, +from .errors import HieroglyphError +from .nodes import (Node, Raises, Except, Note, Warning, Returns, Arg, ensure_terminal_blank) __author__ = 'Robert Smallshire' diff --git a/docs/sphinx/hieroglyph/nodes.py b/docs/sphinx/hieroglyph/nodes.py index f0c08b5621..1c091ab6a0 100644 --- a/docs/sphinx/hieroglyph/nodes.py +++ b/docs/sphinx/hieroglyph/nodes.py @@ -1,3 +1,4 @@ +from __future__ import unicode_literals __author__ = 'Robert Smallshire' class Node(object): diff --git a/docs/sphinx/hieroglyph/test/__init__.py b/docs/sphinx/hieroglyph/test/__init__.py index c9b674ead2..c568b0851f 100644 --- a/docs/sphinx/hieroglyph/test/__init__.py +++ b/docs/sphinx/hieroglyph/test/__init__.py @@ -1 +1,2 @@ +from __future__ import unicode_literals __author__ = 'rjs' diff --git a/docs/sphinx/hieroglyph/test/test_comments.py b/docs/sphinx/hieroglyph/test/test_comments.py index d1a1453ee1..1cc569605c 100644 --- a/docs/sphinx/hieroglyph/test/test_comments.py +++ b/docs/sphinx/hieroglyph/test/test_comments.py @@ -1,3 +1,4 @@ +from __future__ import unicode_literals import unittest from hieroglyph.hieroglyph import parse_hieroglyph_text diff --git a/docs/sphinx/hieroglyph/test/test_hierglyph.py b/docs/sphinx/hieroglyph/test/test_hierglyph.py index 4f86db5784..7815960905 100644 --- a/docs/sphinx/hieroglyph/test/test_hierglyph.py +++ b/docs/sphinx/hieroglyph/test/test_hierglyph.py @@ -1,3 +1,4 @@ +from __future__ import unicode_literals import unittest from hieroglyph.hieroglyph import first_paragraph_indent, gather_lines, unindent diff --git a/docs/sphinx/hieroglyph/test/test_nodes.py b/docs/sphinx/hieroglyph/test/test_nodes.py index 12cd25a03e..4b6003c91a 100644 --- a/docs/sphinx/hieroglyph/test/test_nodes.py +++ b/docs/sphinx/hieroglyph/test/test_nodes.py @@ -1,3 +1,4 @@ +from __future__ import unicode_literals import unittest from hieroglyph.nodes import Node, Arg, Raises, Except, Returns, Warning, Note diff --git a/docs/sphinx/hieroglyph/version.py b/docs/sphinx/hieroglyph/version.py index b35385b6b8..f823af4363 100644 --- a/docs/sphinx/hieroglyph/version.py +++ b/docs/sphinx/hieroglyph/version.py @@ -1,3 +1,4 @@ '''Specification of the hieroglyph version''' +from __future__ import unicode_literals __version__ = '0.6' |