diff options
| -rw-r--r-- | docutils/docutils/readers/python/__init__.py | 6 | ||||
| -rw-r--r-- | docutils/docutils/readers/python/moduleparser.py | 343 | ||||
| -rw-r--r-- | docutils/docutils/readers/python/pynodes.py | 81 | ||||
| -rw-r--r-- | docutils/test/DocutilsTestSupport.py | 2 | ||||
| -rw-r--r-- | docutils/test/test_readers/test_python/test_parser.py | 778 |
5 files changed, 702 insertions, 508 deletions
diff --git a/docutils/docutils/readers/python/__init__.py b/docutils/docutils/readers/python/__init__.py index 5bc832183..3087f9147 100644 --- a/docutils/docutils/readers/python/__init__.py +++ b/docutils/docutils/readers/python/__init__.py @@ -13,9 +13,15 @@ __docformat__ = 'reStructuredText' import sys import docutils.readers +from docutils.readers.python import moduleparser class Reader(docutils.readers.Reader): config_section = 'python reader' config_section_dependencies = ('readers',) + + def parse(self): + """Parse `self.input` into a document tree.""" + self.document = document = moduleparser.parse_module(self.input) + document.current_source = document.current_line = None diff --git a/docutils/docutils/readers/python/moduleparser.py b/docutils/docutils/readers/python/moduleparser.py index a425d2738..c95d997c8 100644 --- a/docutils/docutils/readers/python/moduleparser.py +++ b/docutils/docutils/readers/python/moduleparser.py @@ -191,6 +191,7 @@ from compiler.consts import OP_ASSIGN from compiler.visitor import ASTVisitor from types import StringType, UnicodeType, TupleType from docutils.readers.python import pynodes +from docutils.nodes import Text def parse_module(module_text, filename): @@ -201,168 +202,6 @@ def parse_module(module_text, filename): compiler.walk(ast, visitor, walker=visitor) return visitor.module - -class Node: - - """ - Base class for module documentation tree nodes. - """ - - def __init__(self, node): - self.children = [] - """List of child nodes.""" - - self.lineno = node.lineno - """Line number of this node (or ``None``).""" - - def __str__(self, indent=' ', level=0): - return ''.join(['%s%s\n' % (indent * level, repr(self))] + - [child.__str__(indent, level+1) - for child in self.children]) - - def __repr__(self): - parts = [self.__class__.__name__] - for name, value in self.attlist(): - parts.append('%s="%s"' % (name, value)) - return '<%s>' % ' '.join(parts) - - def attlist(self, **atts): - if self.lineno is not None: - atts['lineno'] = self.lineno - attlist = atts.items() - attlist.sort() - return attlist - - def append(self, node): - self.children.append(node) - - def extend(self, node_list): - self.children.extend(node_list) - - -class TextNode(Node): - - def __init__(self, node, text): - Node.__init__(self, node) - self.text = trim_docstring(text) - - def __str__(self, indent=' ', level=0): - prefix = indent * (level + 1) - text = '\n'.join([prefix + line for line in self.text.splitlines()]) - return Node.__str__(self, indent, level) + text + '\n' - - -class Module(Node): - - def __init__(self, node, filename): - Node.__init__(self, node) - self.filename = filename - - def attlist(self): - return Node.attlist(self, filename=self.filename) - - -class Docstring(TextNode): pass - - -class Comment(TextNode): pass - - -class Import(Node): - - def __init__(self, node, names, from_name=None): - Node.__init__(self, node) - self.names = names - self.from_name = from_name - - def __str__(self, indent=' ', level=0): - prefix = indent * (level + 1) - lines = [] - for name, as in self.names: - if as: - lines.append('%s%s as %s' % (prefix, name, as)) - else: - lines.append('%s%s' % (prefix, name)) - text = '\n'.join(lines) - return Node.__str__(self, indent, level) + text + '\n' - - def attlist(self): - if self.from_name: - atts = {'from': self.from_name} - else: - atts = {} - return Node.attlist(self, **atts) - - -class Attribute(Node): - - def __init__(self, node, name): - Node.__init__(self, node) - self.name = name - - def attlist(self): - return Node.attlist(self, name=self.name) - - -class AttributeTuple(Node): - - def __init__(self, node, names): - Node.__init__(self, node) - self.names = names - - def attlist(self): - return Node.attlist(self, names=' '.join(self.names)) - - -class Expression(TextNode): - - def __str__(self, indent=' ', level=0): - prefix = indent * (level + 1) - return '%s%s%s\n' % (Node.__str__(self, indent, level), - prefix, self.text.encode('unicode-escape')) - - -class Function(Attribute): pass - - -class ParameterList(Node): pass - - -class Parameter(Attribute): pass - - -class ParameterTuple(AttributeTuple): - - def attlist(self): - return Node.attlist(self, names=normalize_parameter_name(self.names)) - - -class ExcessPositionalArguments(Parameter): pass - - -class ExcessKeywordArguments(Parameter): pass - - -class Default(Expression): pass - - -class Class(Node): - - def __init__(self, node, name, bases=None): - Node.__init__(self, node) - self.name = name - self.bases = bases or [] - - def attlist(self): - atts = {'name': self.name} - if self.bases: - atts['bases'] = ' '.join(self.bases) - return Node.attlist(self, **atts) - - -class Method(Function): pass - - class BaseVisitor(ASTVisitor): def __init__(self, token_parser): @@ -390,7 +229,7 @@ class DocstringVisitor(BaseVisitor): def visitConst(self, node): if self.documentable: if type(node.value) in (StringType, UnicodeType): - self.documentable.append(Docstring(node, node.value)) + self.documentable.append(make_docstring(node.value, node.lineno)) else: self.documentable = None @@ -419,26 +258,28 @@ class ModuleVisitor(AssignmentVisitor): self.module = None def visitModule(self, node): - - self.module = module = Module(node, self.filename) - if node.doc is not None: - module.append(Docstring(node, node.doc)) + self.module = module = pynodes.module_section() + module['filename'] = self.filename + append_docstring(module, node.doc, node.lineno) self.context.append(module) self.documentable = module self.visit(node.node) self.context.pop() def visitImport(self, node): - self.context[-1].append(Import(node, node.names)) + self.context[-1] += make_import_group(names=node.names, + lineno=node.lineno) self.documentable = None def visitFrom(self, node): self.context[-1].append( - Import(node, node.names, from_name=node.modname)) + make_import_group(names=node.names, from_name=node.modname, + lineno=node.lineno)) self.documentable = None def visitFunction(self, node): - visitor = FunctionVisitor(self.token_parser) + visitor = FunctionVisitor(self.token_parser, + function_class=pynodes.function_section) compiler.walk(node, visitor, walker=visitor) self.context[-1].append(visitor.function) @@ -452,29 +293,32 @@ class AttributeVisitor(BaseVisitor): def __init__(self, token_parser): BaseVisitor.__init__(self, token_parser) - self.attributes = [] + self.attributes = pynodes.class_attribute_section() def visitAssign(self, node): # Don't visit the expression itself, just the attribute nodes: for child in node.nodes: self.dispatch(child) expression_text = self.token_parser.rhs(node.lineno) - expression = Expression(node, expression_text) + expression = pynodes.expression_value() + expression.append(Text(expression_text)) for attribute in self.attributes: attribute.append(expression) def visitAssName(self, node): - self.attributes.append(Attribute(node, node.name)) + self.attributes.append(make_attribute(node.name, + lineno=node.lineno)) def visitAssTuple(self, node): attributes = self.attributes self.attributes = [] self.default_visit(node) - names = [attribute.name for attribute in self.attributes] - att_tuple = AttributeTuple(node, names) - att_tuple.lineno = self.attributes[0].lineno + n = pynodes.attribute_tuple() + n.extend(self.attributes) + n['lineno'] = self.attributes[0]['lineno'] + attributes.append(n) self.attributes = attributes - self.attributes.append(att_tuple) + #self.attributes.append(att_tuple) def visitAssAttr(self, node): self.default_visit(node, node.attrname) @@ -483,13 +327,17 @@ class AttributeVisitor(BaseVisitor): self.default_visit(node, node.attrname + '.' + suffix) def visitName(self, node, suffix): - self.attributes.append(Attribute(node, node.name + '.' + suffix)) + self.attributes.append(make_attribute(node.name + '.' + suffix, + lineno=node.lineno)) class FunctionVisitor(DocstringVisitor): in_function = 0 - function_class = Function + + def __init__(self, token_parser, function_class): + DocstringVisitor.__init__(self, token_parser) + self.function_class = function_class def visitFunction(self, node): if self.in_function: @@ -497,9 +345,11 @@ class FunctionVisitor(DocstringVisitor): # Don't bother with nested function definitions. return self.in_function = 1 - self.function = function = self.function_class(node, node.name) - if node.doc is not None: - function.append(Docstring(node, node.doc)) + self.function = function = make_function_like_section( + name=node.name, + lineno=node.lineno, + doc=node.doc, + function_class=self.function_class) self.context.append(function) self.documentable = function self.parse_parameter_list(node) @@ -511,10 +361,11 @@ class FunctionVisitor(DocstringVisitor): special = [] argnames = list(node.argnames) if node.kwargs: - special.append(ExcessKeywordArguments(node, argnames[-1])) + special.append(make_parameter(argnames[-1], excess_keyword=True)) argnames.pop() if node.varargs: - special.append(ExcessPositionalArguments(node, argnames[-1])) + special.append(make_parameter(argnames[-1], + excess_positional=True)) argnames.pop() defaults = list(node.defaults) defaults = [None] * (len(argnames) - len(defaults)) + defaults @@ -523,17 +374,21 @@ class FunctionVisitor(DocstringVisitor): #print >>sys.stderr, function_parameters for argname, default in zip(argnames, defaults): if type(argname) is TupleType: - parameter = ParameterTuple(node, argname) + parameter = pynodes.parameter_tuple() + for tuplearg in argname: + parameter.append(make_parameter(tuplearg)) argname = normalize_parameter_name(argname) else: - parameter = Parameter(node, argname) + parameter = make_parameter(argname) if default: - parameter.append(Default(node, function_parameters[argname])) + n_default = pynodes.parameter_default() + n_default.append(Text(function_parameters[argname])) + parameter.append(n_default) parameters.append(parameter) if parameters or special: special.reverse() parameters.extend(special) - parameter_list = ParameterList(node) + parameter_list = pynodes.parameter_list() parameter_list.extend(parameters) self.function.append(parameter_list) @@ -556,9 +411,9 @@ class ClassVisitor(AssignmentVisitor): #pdb.set_trace() for base in node.bases: self.visit(base) - self.klass = klass = Class(node, node.name, self.bases) - if node.doc is not None: - klass.append(Docstring(node, node.doc)) + self.klass = klass = make_class_section(node.name, self.bases, + doc=node.doc, + lineno=node.lineno) self.context.append(klass) self.documentable = klass self.visit(node.code) @@ -580,19 +435,17 @@ class ClassVisitor(AssignmentVisitor): def visitFunction(self, node): if node.name == '__init__': - visitor = InitMethodVisitor(self.token_parser) + visitor = InitMethodVisitor(self.token_parser, + function_class=pynodes.method_section) + compiler.walk(node, visitor, walker=visitor) else: - visitor = MethodVisitor(self.token_parser) - compiler.walk(node, visitor, walker=visitor) + visitor = FunctionVisitor(self.token_parser, + function_class=pynodes.method_section) + compiler.walk(node, visitor, walker=visitor) self.context[-1].append(visitor.function) -class MethodVisitor(FunctionVisitor): - - function_class = Method - - -class InitMethodVisitor(MethodVisitor, AssignmentVisitor): pass +class InitMethodVisitor(FunctionVisitor, AssignmentVisitor): pass class TokenParser: @@ -746,6 +599,81 @@ class TokenParser: return parameters +def make_docstring(doc, lineno): + n = pynodes.docstring() + if lineno: + # Really, only module docstrings don't have a line + # (@@: but maybe they should) + n['lineno'] = lineno + n.append(Text(doc)) + return n + +def append_docstring(node, doc, lineno): + if doc: + node.append(make_docstring(doc, lineno)) + +def make_class_section(name, bases, lineno, doc): + n = pynodes.class_section() + n['lineno'] = lineno + n.append(make_object_name(name)) + for base in bases: + b = pynodes.class_base() + b.append(make_object_name(base)) + n.append(b) + append_docstring(n, doc, lineno) + return n + +def make_object_name(name): + n = pynodes.object_name() + n.append(Text(name)) + return n + +def make_function_like_section(name, lineno, doc, function_class): + n = function_class() + n['lineno'] = lineno + n.append(make_object_name(name)) + append_docstring(n, doc, lineno) + return n + +def make_import_group(names, lineno, from_name=None): + n = pynodes.import_group() + n['lineno'] = lineno + if from_name: + n_from = pynodes.import_from() + n_from.append(Text(from_name)) + n.append(n_from) + for name, alias in names: + n_name = pynodes.import_name() + n_name.append(Text(name)) + if alias: + n_alias = pynodes.import_alias() + n_alias.append(Text(alias)) + n_name.append(n_alias) + n.append(n_name) + return n + +def make_class_attribute(name, lineno): + n = pynodes.class_attribute() + n['lineno'] = lineno + n.append(Text(name)) + return n + +def make_attribute(name, lineno): + n = pynodes.attribute() + n['lineno'] = lineno + n.append(make_object_name(name)) + return n + +def make_parameter(name, excess_keyword=False, excess_positional=False): + n = pynodes.parameter() + n.append(make_object_name(name)) + assert not excess_keyword or not excess_positional + if excess_keyword: + n['excess_keyword'] = 1 + if excess_positional: + n['excess_positional'] = 1 + return n + def trim_docstring(text): """ Trim indentation and blank lines from docstring text & return it. @@ -787,6 +715,15 @@ def normalize_parameter_name(name): if __name__ == '__main__': import sys - filename = sys.argv[1] - content = open(filename).read() - print parse_module(content, filename) + args = sys.argv[1:] + if args[0] == '-v': + filename = args[1] + module_text = open(filename).read() + ast = compiler.parse(module_text) + visitor = compiler.visitor.ExampleASTVisitor() + compiler.walk(ast, visitor, walker=visitor, verbose=1) + else: + filename = args[0] + content = open(filename).read() + print parse_module(content, filename).pformat() + diff --git a/docutils/docutils/readers/python/pynodes.py b/docutils/docutils/readers/python/pynodes.py index f246a5dc6..40db6975e 100644 --- a/docutils/docutils/readers/python/pynodes.py +++ b/docutils/docutils/readers/python/pynodes.py @@ -10,33 +10,39 @@ """ from docutils import nodes -from docutils.nodes import Element, TextElement, Structural, Inline, Part +from docutils.nodes import Element, TextElement, Structural, Inline, Part, \ + Text +import types +# This is the parent class of all the other pynode classes: +class PythonStructural(Structural): pass # ===================== # Structural Elements # ===================== -class package_section(Structural, Element): pass -class module_section(Structural, Element): pass -class class_section(Structural, Element): pass -class method_section(Structural, Element): pass -class function_section(Structural, Element): pass -class module_attribute_section(Structural, Element): pass -class class_attribute_section(Structural, Element): pass -class instance_attribute_section(Structural, Element): pass +class module_section(PythonStructural, Element): pass +class class_section(PythonStructural, Element): pass +class class_base(PythonStructural, Element): pass +class method_section(PythonStructural, Element): pass +class attribute(PythonStructural, Element): pass +class function_section(PythonStructural, Element): pass +class class_attribute_section(PythonStructural, Element): pass +class class_attribute(PythonStructural, Element): pass +class expression_value(PythonStructural, Element): pass +class attribute(PythonStructural, Element): pass # Structural Support Elements # --------------------------- -class inheritance_list(Part, Element): pass -class parameter_list(Part, Element): pass -class parameter_item(Part, Element): pass -class optional_parameters(Part, Element): pass -class parameter_tuple(Part, Element): pass -class parameter_default(Part, TextElement): pass -class initial_value(Part, TextElement): pass -class import_item(Part, TextElement): pass +class parameter_list(PythonStructural, Element): pass +class parameter_tuple(PythonStructural, Element): pass +class parameter_default(PythonStructural, TextElement): pass +class import_group(PythonStructural, TextElement): pass +class import_from(PythonStructural, TextElement): pass +class import_name(PythonStructural, TextElement): pass +class import_alias(PythonStructural, TextElement): pass +class docstring(PythonStructural, Element): pass # ================= # Inline Elements @@ -45,34 +51,35 @@ class import_item(Part, TextElement): pass # These elements cannot become references until the second # pass. Initially, we'll use "reference" or "name". -class package(Part, Inline, TextElement): pass -class module(Part, Inline, TextElement): pass +class object_name(PythonStructural, TextElement): pass +class parameter_list(PythonStructural, TextElement): pass +class parameter(PythonStructural, TextElement): pass +class parameter_default(PythonStructural, TextElement): pass +class class_attribute(PythonStructural, TextElement): pass +class attribute_tuple(PythonStructural, TextElement): pass +# ================= +# Unused Elements +# ================= -class inline_class(Part, Inline, TextElement): - - tagname = 'class' - +# These were part of the model, and maybe should be in the future, but +# aren't now. +#class package_section(PythonStructural, Element): pass +#class module_attribute_section(PythonStructural, Element): pass +#class instance_attribute_section(PythonStructural, Element): pass +#class module_attribute(PythonStructural, TextElement): pass +#class instance_attribute(PythonStructural, TextElement): pass +#class exception_class(PythonStructural, TextElement): pass +#class warning_class(PythonStructural, TextElement): pass -class method(Part, Inline, TextElement): pass -class function(Part, Inline, TextElement): pass -class variable(Inline, TextElement): pass -class parameter(Part, Inline, TextElement): pass -class inline_type(Inline, TextElement): - tagname = 'type' -class class_attribute(Part, Inline, TextElement): pass -class module_attribute(Part, Inline, TextElement): pass -class instance_attribute(Part, Inline, TextElement): pass -class exception_class(Inline, TextElement): pass -class warning_class(Inline, TextElement): pass # Collect all the classes we've written above node_class_names = [] def build_node_class_names(): for name, var in globals().items(): - if type(var) is types.ClassType \ - and issubclass(var, nodes.Node) \ - and name.lower() == name: + if (type(var) is types.ClassType + and issubclass(var, PythonStructural) \ + and name.lower() == name): node_class_names.append(var.tagname or name) # Register the new node names with GenericNodeVisitor and diff --git a/docutils/test/DocutilsTestSupport.py b/docutils/test/DocutilsTestSupport.py index 92d20f41e..a153d4f5e 100644 --- a/docutils/test/DocutilsTestSupport.py +++ b/docutils/test/DocutilsTestSupport.py @@ -516,7 +516,7 @@ class PythonModuleParserTestCase(CustomTestCase): def test_parser(self): if self.run_in_debugger: pdb.set_trace() - module = moduleparser.parse_module(self.input, 'test data') + module = moduleparser.parse_module(self.input, 'test data').pformat() output = str(module) self.compare_output(self.input, output, self.expected) diff --git a/docutils/test/test_readers/test_python/test_parser.py b/docutils/test/test_readers/test_python/test_parser.py index ce70cc27c..1ccfbdc10 100644 --- a/docutils/test/test_readers/test_python/test_parser.py +++ b/docutils/test/test_readers/test_python/test_parser.py @@ -24,22 +24,22 @@ totest['module'] = [ ['''\ ''', '''\ -<Module filename="test data"> +<module_section filename="test data"> '''], ['''\ """docstring""" ''', '''\ -<Module filename="test data"> - <Docstring> +<module_section filename="test data"> + <docstring> docstring '''], ['''\ u"""Unicode docstring""" ''', '''\ -<Module filename="test data"> - <Docstring> +<module_section filename="test data"> + <docstring> Unicode docstring '''], ['''\ @@ -47,10 +47,10 @@ u"""Unicode docstring""" """additional docstring""" ''', '''\ -<Module filename="test data"> - <Docstring> +<module_section filename="test data"> + <docstring> docstring - <Docstring lineno="2"> + <docstring lineno="2"> additional docstring '''], ['''\ @@ -59,10 +59,10 @@ u"""Unicode docstring""" """additional docstring""" ''', '''\ -<Module filename="test data"> - <Docstring> +<module_section filename="test data"> + <docstring> docstring - <Docstring lineno="3"> + <docstring lineno="3"> additional docstring '''], ['''\ @@ -71,8 +71,8 @@ u"""Unicode docstring""" """not an additional docstring""" ''', '''\ -<Module filename="test data"> - <Docstring> +<module_section filename="test data"> + <docstring> docstring '''], ] @@ -82,42 +82,51 @@ totest['import'] = [ import module ''', '''\ -<Module filename="test data"> - <Import lineno="1"> - module +<module_section filename="test data"> + <import_group lineno="1"> + <import_name> + module '''], ['''\ import module as local ''', '''\ -<Module filename="test data"> - <Import lineno="1"> - module as local +<module_section filename="test data"> + <import_group lineno="1"> + <import_name> + module + <import_alias> + local '''], ['''\ import module.name ''', '''\ -<Module filename="test data"> - <Import lineno="1"> - module.name +<module_section filename="test data"> + <import_group lineno="1"> + <import_name> + module.name '''], ['''\ import module.name as local ''', '''\ -<Module filename="test data"> - <Import lineno="1"> - module.name as local +<module_section filename="test data"> + <import_group lineno="1"> + <import_name> + module.name + <import_alias> + local '''], ['''\ import module """not documentable""" ''', '''\ -<Module filename="test data"> - <Import lineno="1"> - module +<module_section filename="test data"> + <import_group lineno="1"> + <import_name> + module '''], ] @@ -126,58 +135,86 @@ totest['from'] = [ from module import name ''', '''\ -<Module filename="test data"> - <Import from="module" lineno="1"> - name +<module_section filename="test data"> + <import_group lineno="1"> + <import_from> + module + <import_name> + name '''], ['''\ from module import name as local ''', '''\ -<Module filename="test data"> - <Import from="module" lineno="1"> - name as local +<module_section filename="test data"> + <import_group lineno="1"> + <import_from> + module + <import_name> + name + <import_alias> + local '''], ['''\ from module import name1, name2 as local2 ''', '''\ -<Module filename="test data"> - <Import from="module" lineno="1"> - name1 - name2 as local2 +<module_section filename="test data"> + <import_group lineno="1"> + <import_from> + module + <import_name> + name1 + <import_name> + name2 + <import_alias> + local2 '''], ['''\ from module.sub import name ''', '''\ -<Module filename="test data"> - <Import from="module.sub" lineno="1"> - name +<module_section filename="test data"> + <import_group lineno="1"> + <import_from> + module.sub + <import_name> + name '''], ['''\ from module.sub import name as local ''', '''\ -<Module filename="test data"> - <Import from="module.sub" lineno="1"> - name as local +<module_section filename="test data"> + <import_group lineno="1"> + <import_from> + module.sub + <import_name> + name + <import_alias> + local '''], ['''\ from module import * ''', '''\ -<Module filename="test data"> - <Import from="module" lineno="1"> - * +<module_section filename="test data"> + <import_group lineno="1"> + <import_from> + module + <import_name> + * '''], ['''\ from __future__ import division ''', '''\ -<Module filename="test data"> - <Import from="__future__" lineno="1"> - division +<module_section filename="test data"> + <import_group lineno="1"> + <import_from> + __future__ + <import_name> + division '''], ] @@ -186,52 +223,62 @@ totest['assign'] = [ a = 1 ''', '''\ -<Module filename="test data"> - <Attribute lineno="1" name="a"> - <Expression lineno="1"> +<module_section filename="test data"> + <attribute lineno="1"> + <object_name> + a + <expression_value> 1 '''], ['''a = 1''', '''\ -<Module filename="test data"> - <Attribute lineno="1" name="a"> - <Expression lineno="1"> +<module_section filename="test data"> + <attribute lineno="1"> + <object_name> + a + <expression_value> 1 '''], ['''\ a = 1 -"""a's docstring""" +"""a docstring""" ''', #" '''\ -<Module filename="test data"> - <Attribute lineno="1" name="a"> - <Expression lineno="1"> +<module_section filename="test data"> + <attribute lineno="1"> + <object_name> + a + <expression_value> 1 - <Docstring lineno="2"> - a's docstring -'''], #' + <docstring lineno="2"> + a docstring +'''], ['''\ a = 1 -"""a's docstring""" +"""a docstring""" """additional docstring""" ''', #" '''\ -<Module filename="test data"> - <Attribute lineno="1" name="a"> - <Expression lineno="1"> +<module_section filename="test data"> + <attribute lineno="1"> + <object_name> + a + <expression_value> 1 - <Docstring lineno="2"> - a's docstring - <Docstring lineno="3"> + <docstring lineno="2"> + a docstring + <docstring lineno="3"> additional docstring '''], #' ['''\ a = 1 + 2 * 3 / 4 ** 5 ''', '''\ -<Module filename="test data"> - <Attribute lineno="1" name="a"> - <Expression lineno="1"> +<module_section filename="test data"> + <attribute lineno="1"> + <object_name> + a + <expression_value> 1 + 2 * 3 / 4 ** 5 '''], ['''\ @@ -239,36 +286,44 @@ a = 1 \\ + 2 ''', '''\ -<Module filename="test data"> - <Attribute lineno="1" name="a"> - <Expression lineno="1"> +<module_section filename="test data"> + <attribute lineno="1"> + <object_name> + a + <expression_value> 1 + 2 '''], ['''\ a = not 1 and 2 or 3 ''', '''\ -<Module filename="test data"> - <Attribute lineno="1" name="a"> - <Expression lineno="1"> +<module_section filename="test data"> + <attribute lineno="1"> + <object_name> + a + <expression_value> not 1 and 2 or 3 '''], ['''\ a = ~ 1 & 2 | 3 ^ 4 ''', '''\ -<Module filename="test data"> - <Attribute lineno="1" name="a"> - <Expression lineno="1"> +<module_section filename="test data"> + <attribute lineno="1"> + <object_name> + a + <expression_value> ~ 1 & 2 | 3 ^ 4 '''], ['''\ a = `1 & 2` ''', '''\ -<Module filename="test data"> - <Attribute lineno="1" name="a"> - <Expression lineno="1"> +<module_section filename="test data"> + <attribute lineno="1"> + <object_name> + a + <expression_value> `1 & 2` '''], ['''\ @@ -276,9 +331,11 @@ very_long_name = \\ x ''', '''\ -<Module filename="test data"> - <Attribute lineno="1" name="very_long_name"> - <Expression lineno="1"> +<module_section filename="test data"> + <attribute lineno="1"> + <object_name> + very_long_name + <expression_value> x '''], ['''\ @@ -286,9 +343,11 @@ very_long_name \\ = x ''', '''\ -<Module filename="test data"> - <Attribute lineno="1" name="very_long_name"> - <Expression lineno="2"> +<module_section filename="test data"> + <attribute lineno="1"> + <object_name> + very_long_name + <expression_value> x '''], ['''\ @@ -297,12 +356,16 @@ very_long_name = \\ x ''', '''\ -<Module filename="test data"> - <Attribute lineno="1" name="very_long_name"> - <Expression lineno="1"> +<module_section filename="test data"> + <attribute lineno="1"> + <object_name> + very_long_name + <expression_value> x - <Attribute lineno="2" name="another_long_name"> - <Expression lineno="1"> + <attribute lineno="2"> + <object_name> + another_long_name + <expression_value> x '''], ['''\ @@ -317,16 +380,24 @@ second line third""" ''', '''\ -<Module filename="test data"> - <Attribute lineno="1" name="a"> - <Expression lineno="1"> +<module_section filename="test data"> + <attribute lineno="1"> + <object_name> + a + <expression_value> (1 + 2) - <Attribute lineno="3" name="b"> - <Expression lineno="3"> + <attribute lineno="3"> + <object_name> + b + <expression_value> a.b[1 + fn(x, y, z, {'key': (1 + 2 + 3)})][4] - <Attribute lineno="7" name="c"> - <Expression lineno="7"> - """first line\\nsecond line\\n third""" + <attribute lineno="7"> + <object_name> + c + <expression_value> + """first line + second line + third""" '''], ['''\ a, b, c = range(3) @@ -336,21 +407,59 @@ g, h, i = j = a, b, c k.a, k.b.c, k.d.e.f = a, b, c ''', '''\ -<Module filename="test data"> - <AttributeTuple lineno="1" names="a b c"> - <Expression lineno="1"> +<module_section filename="test data"> + <attribute_tuple lineno="1"> + <attribute lineno="1"> + <object_name> + a + <attribute lineno="1"> + <object_name> + b + <attribute lineno="1"> + <object_name> + c + <expression_value> range(3) - <AttributeTuple lineno="2" names="d e f"> - <Expression lineno="3"> + <attribute_tuple lineno="2"> + <attribute lineno="2"> + <object_name> + d + <attribute lineno="2"> + <object_name> + e + <attribute lineno="3"> + <object_name> + f + <expression_value> a, b, c - <AttributeTuple lineno="4" names="g h i"> - <Expression lineno="4"> + <attribute_tuple lineno="4"> + <attribute lineno="4"> + <object_name> + g + <attribute lineno="4"> + <object_name> + h + <attribute lineno="4"> + <object_name> + i + <expression_value> a, b, c - <Attribute lineno="4" name="j"> - <Expression lineno="4"> + <attribute lineno="4"> + <object_name> + j + <expression_value> a, b, c - <AttributeTuple lineno="5" names="k.a k.b.c k.d.e.f"> - <Expression lineno="5"> + <attribute_tuple lineno="5"> + <attribute lineno="5"> + <object_name> + k.a + <attribute lineno="5"> + <object_name> + k.b.c + <attribute lineno="5"> + <object_name> + k.d.e.f + <expression_value> a, b, c '''], ['''\ @@ -358,15 +467,21 @@ a = 1 ; b = 2 print ; c = 3 ''', '''\ -<Module filename="test data"> - <Attribute lineno="1" name="a"> - <Expression lineno="1"> +<module_section filename="test data"> + <attribute lineno="1"> + <object_name> + a + <expression_value> 1 - <Attribute lineno="1" name="b"> - <Expression lineno="1"> + <attribute lineno="1"> + <object_name> + b + <expression_value> 2 - <Attribute lineno="2" name="c"> - <Expression lineno="2"> + <attribute lineno="2"> + <object_name> + c + <expression_value> 3 '''], ['''\ @@ -374,11 +489,13 @@ a.b = 1 """This assignment is noted but ignored unless ``a`` is a function.""" ''', '''\ -<Module filename="test data"> - <Attribute lineno="1" name="a.b"> - <Expression lineno="1"> +<module_section filename="test data"> + <attribute lineno="1"> + <object_name> + a.b + <expression_value> 1 - <Docstring lineno="2"> + <docstring lineno="2"> This assignment is noted but ignored unless ``a`` is a function. '''], ['''\ @@ -386,15 +503,17 @@ a[b] = 1 """Subscript assignments are ignored.""" ''', '''\ -<Module filename="test data"> +<module_section filename="test data"> '''], ['''\ a = foo(b=1) ''', '''\ -<Module filename="test data"> - <Attribute lineno="1" name="a"> - <Expression lineno="1"> +<module_section filename="test data"> + <attribute lineno="1"> + <object_name> + a + <expression_value> foo(b=1) '''], # ['''\ @@ -403,11 +522,13 @@ a = foo(b=1) # """Because of the blank above, this is a module docstring.""" # ''', # '''\ -# <Module filename="test data"> -# <Attribute lineno="1" name="a"> -# <Expression lineno="1"> +# <module_section filename="test data"> +# <attribute lineno="1"> +# <object_name> +# a +# <expression_value> # 1 -# <Docstring lineno="3"> +# <docstring lineno="3"> # Because of the blank above, this is a module docstring. # '''], ] @@ -415,17 +536,19 @@ a = foo(b=1) totest['def'] = [ ['''\ def f(): - """Function f's docstring""" + """Function f docstring""" """Additional docstring""" local = 1 """Not a docstring, since ``local`` is local.""" ''', # " '''\ -<Module filename="test data"> - <Function lineno="1" name="f"> - <Docstring lineno="1"> - Function f's docstring - <Docstring lineno="3"> +<module_section filename="test data"> + <function_section lineno="1"> + <object_name> + f + <docstring lineno="1"> + Function f docstring + <docstring lineno="3"> Additional docstring '''], # ' ['''\ @@ -433,25 +556,37 @@ def f(a, b): local = 1 ''', '''\ -<Module filename="test data"> - <Function lineno="1" name="f"> - <ParameterList lineno="1"> - <Parameter lineno="1" name="a"> - <Parameter lineno="1" name="b"> +<module_section filename="test data"> + <function_section lineno="1"> + <object_name> + f + <parameter_list> + <parameter> + <object_name> + a + <parameter> + <object_name> + b '''], ['''\ def f(a=None, b=1): local = 1 ''', '''\ -<Module filename="test data"> - <Function lineno="1" name="f"> - <ParameterList lineno="1"> - <Parameter lineno="1" name="a"> - <Default lineno="1"> +<module_section filename="test data"> + <function_section lineno="1"> + <object_name> + f + <parameter_list> + <parameter> + <object_name> + a + <parameter_default> None - <Parameter lineno="1" name="b"> - <Default lineno="1"> + <parameter> + <object_name> + b + <parameter_default> 1 '''], ['''\ @@ -460,15 +595,30 @@ def f(a, (b, c, d)=range(3), local = 1 ''', '''\ -<Module filename="test data"> - <Function lineno="1" name="f"> - <ParameterList lineno="1"> - <Parameter lineno="1" name="a"> - <ParameterTuple lineno="1" names="(b, c, d)"> - <Default lineno="1"> +<module_section filename="test data"> + <function_section lineno="1"> + <object_name> + f + <parameter_list> + <parameter> + <object_name> + a + <parameter_tuple> + <parameter> + <object_name> + b + <parameter> + <object_name> + c + <parameter> + <object_name> + d + <parameter_default> range(3) - <Parameter lineno="1" name="e"> - <Default lineno="1"> + <parameter> + <object_name> + e + <parameter_default> None '''], ['''\ @@ -476,52 +626,74 @@ def f(*args): local = 1 ''', '''\ -<Module filename="test data"> - <Function lineno="1" name="f"> - <ParameterList lineno="1"> - <ExcessPositionalArguments lineno="1" name="args"> +<module_section filename="test data"> + <function_section lineno="1"> + <object_name> + f + <parameter_list> + <parameter excess_positional="1"> + <object_name> + args '''], ['''\ def f(**kwargs): local = 1 ''', '''\ -<Module filename="test data"> - <Function lineno="1" name="f"> - <ParameterList lineno="1"> - <ExcessKeywordArguments lineno="1" name="kwargs"> +<module_section filename="test data"> + <function_section lineno="1"> + <object_name> + f + <parameter_list> + <parameter excess_keyword="1"> + <object_name> + kwargs '''], ['''\ def f(a, b=None, *args, **kwargs): local = 1 ''', '''\ -<Module filename="test data"> - <Function lineno="1" name="f"> - <ParameterList lineno="1"> - <Parameter lineno="1" name="a"> - <Parameter lineno="1" name="b"> - <Default lineno="1"> +<module_section filename="test data"> + <function_section lineno="1"> + <object_name> + f + <parameter_list> + <parameter> + <object_name> + a + <parameter> + <object_name> + b + <parameter_default> None - <ExcessPositionalArguments lineno="1" name="args"> - <ExcessKeywordArguments lineno="1" name="kwargs"> + <parameter excess_positional="1"> + <object_name> + args + <parameter excess_keyword="1"> + <object_name> + kwargs '''], ['''\ def f(): pass f.attrib = 1 -"""f.attrib's docstring""" +"""f.attrib docstring""" ''', # " -# @@@ When should the Attribute move inside the Function? -'''\ -<Module filename="test data"> - <Function lineno="1" name="f"> - <Attribute lineno="3" name="f.attrib"> - <Expression lineno="3"> +# @@@ When should the attribute move inside the Function? +'''\ +<module_section filename="test data"> + <function_section lineno="1"> + <object_name> + f + <attribute lineno="3"> + <object_name> + f.attrib + <expression_value> 1 - <Docstring lineno="4"> - f.attrib's docstring -'''], # ' + <docstring lineno="4"> + f.attrib docstring +'''], ['''\ def f(): def g(): @@ -530,21 +702,25 @@ def f(): local = 1 ''', '''\ -<Module filename="test data"> - <Function lineno="1" name="f"> +<module_section filename="test data"> + <function_section lineno="1"> + <object_name> + f '''], ] totest['class'] = [ ['''\ class C: - """class C's docstring""" + """class C docstring""" ''', '''\ -<Module filename="test data"> - <Class lineno="1" name="C"> - <Docstring lineno="1"> - class C's docstring +<module_section filename="test data"> + <class_section lineno="1"> + <object_name> + C + <docstring lineno="1"> + class C docstring '''], ['''\ class C(Super): @@ -554,9 +730,22 @@ class D(SuperD, package.module.SuperD): pass ''', '''\ -<Module filename="test data"> - <Class bases="Super" lineno="1" name="C"> - <Class bases="SuperD package.module.SuperD" lineno="4" name="D"> +<module_section filename="test data"> + <class_section lineno="1"> + <object_name> + C + <class_base> + <object_name> + Super + <class_section lineno="4"> + <object_name> + D + <class_base> + <object_name> + SuperD + <class_base> + <object_name> + package.module.SuperD '''], ['''\ class C: @@ -565,8 +754,10 @@ class C: """Not a docstring""" ''', '''\ -<Module filename="test data"> - <Class lineno="1" name="C"> +<module_section filename="test data"> + <class_section lineno="1"> + <object_name> + C '''], ['''\ class C: @@ -575,11 +766,17 @@ class C: local = 1 ''', '''\ -<Module filename="test data"> - <Class lineno="1" name="C"> - <Method lineno="2" name="f"> - <ParameterList lineno="2"> - <Parameter lineno="2" name="self"> +<module_section filename="test data"> + <class_section lineno="1"> + <object_name> + C + <method_section lineno="2"> + <object_name> + f + <parameter_list> + <parameter> + <object_name> + self '''], ['''\ class C: @@ -588,16 +785,26 @@ class C: local = 1 ''', '''\ -<Module filename="test data"> - <Class lineno="1" name="C"> - <Method lineno="2" name="__init__"> - <ParameterList lineno="2"> - <Parameter lineno="2" name="self"> - <Attribute lineno="3" name="self.local"> - <Expression lineno="3"> +<module_section filename="test data"> + <class_section lineno="1"> + <object_name> + C + <method_section lineno="2"> + <object_name> + __init__ + <parameter_list> + <parameter> + <object_name> + self + <attribute lineno="3"> + <object_name> + self.local + <expression_value> 1 - <Attribute lineno="4" name="local"> - <Expression lineno="4"> + <attribute lineno="4"> + <object_name> + local + <expression_value> 1 '''], ['''\ @@ -606,13 +813,21 @@ class C: local = foo(a=1) ''', '''\ -<Module filename="test data"> - <Class lineno="1" name="C"> - <Method lineno="2" name="__init__"> - <ParameterList lineno="2"> - <Parameter lineno="2" name="self"> - <Attribute lineno="3" name="local"> - <Expression lineno="3"> +<module_section filename="test data"> + <class_section lineno="1"> + <object_name> + C + <method_section lineno="2"> + <object_name> + __init__ + <parameter_list> + <parameter> + <object_name> + self + <attribute lineno="3"> + <object_name> + local + <expression_value> foo(a=1) '''], ] @@ -622,13 +837,13 @@ totest['ignore'] = [ 1 + 2 ''', '''\ -<Module filename="test data"> +<module_section filename="test data"> '''], ['''\ del a ''', '''\ -<Module filename="test data"> +<module_section filename="test data"> '''], ] @@ -637,13 +852,13 @@ totest['comments'] = [ # # Comment # ''', # '''\ -# <Module filename="test data"> +# <module_section filename="test data"> # <Comment lineno="1"> # # Comment # '''], ] -# @@@ no comments yet +# @@@ we don't parse comments yet totest['everything'] = [ ['''\ # comment @@ -659,77 +874,106 @@ a = 1 class C(Super): - """C's docstring""" + """C docstring""" class_attribute = 1 - """class_attribute's docstring""" + """class_attribute docstring""" def __init__(self, text=None): - """__init__'s docstring""" + """__init__ docstring""" self.instance_attribute = (text * 7 + ' whaddyaknow') - """instance_attribute's docstring""" + """instance_attribute docstring""" def f(x, # parameter x y=a*5, # parameter y *args): # parameter args - """f's docstring""" + """f docstring""" return [x + item for item in args] f.function_attribute = 1 -"""f.function_attribute's docstring""" +"""f.function_attribute docstring""" ''', '''\ -<Module filename="test data"> - <Docstring> +<module_section filename="test data"> + <docstring> Docstring - <Docstring lineno="5"> + <docstring lineno="5"> Additional docstring - <Attribute lineno="7" name="__docformat__"> - <Expression lineno="7"> + <attribute lineno="7"> + <object_name> + __docformat__ + <expression_value> 'reStructuredText' - <Attribute lineno="9" name="a"> - <Expression lineno="9"> + <attribute lineno="9"> + <object_name> + a + <expression_value> 1 - <Docstring lineno="10"> + <docstring lineno="10"> Attribute docstring - <Class bases="Super" lineno="12" name="C"> - <Docstring lineno="12"> - C's docstring - <Attribute lineno="16" name="class_attribute"> - <Expression lineno="16"> + <class_section lineno="12"> + <object_name> + C + <class_base> + <object_name> + Super + <docstring lineno="12"> + C docstring + <attribute lineno="16"> + <object_name> + class_attribute + <expression_value> 1 - <Docstring lineno="17"> - class_attribute's docstring - <Method lineno="19" name="__init__"> - <Docstring lineno="19"> - __init__'s docstring - <ParameterList lineno="19"> - <Parameter lineno="19" name="self"> - <Parameter lineno="19" name="text"> - <Default lineno="19"> + <docstring lineno="17"> + class_attribute docstring + <method_section lineno="19"> + <object_name> + __init__ + <docstring lineno="19"> + __init__ docstring + <parameter_list> + <parameter> + <object_name> + self + <parameter> + <object_name> + text + <parameter_default> None - <Attribute lineno="22" name="self.instance_attribute"> - <Expression lineno="22"> + <attribute lineno="22"> + <object_name> + self.instance_attribute + <expression_value> (text * 7 + ' whaddyaknow') - <Docstring lineno="24"> - instance_attribute's docstring - <Function lineno="27" name="f"> - <Docstring lineno="27"> - f's docstring - <ParameterList lineno="27"> - <Parameter lineno="27" name="x"> - <Parameter lineno="27" name="y"> - <Default lineno="27"> + <docstring lineno="24"> + instance_attribute docstring + <function_section lineno="27"> + <object_name> + f + <docstring lineno="27"> + f docstring + <parameter_list> + <parameter> + <object_name> + x + <parameter> + <object_name> + y + <parameter_default> a * 5 - <ExcessPositionalArguments lineno="27" name="args"> - <Attribute lineno="33" name="f.function_attribute"> - <Expression lineno="33"> + <parameter excess_positional="1"> + <object_name> + args + <attribute lineno="33"> + <object_name> + f.function_attribute + <expression_value> 1 - <Docstring lineno="34"> - f.function_attribute's docstring + <docstring lineno="34"> + f.function_attribute docstring '''], ] |
