summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docutils/docutils/readers/python/__init__.py6
-rw-r--r--docutils/docutils/readers/python/moduleparser.py343
-rw-r--r--docutils/docutils/readers/python/pynodes.py81
-rw-r--r--docutils/test/DocutilsTestSupport.py2
-rw-r--r--docutils/test/test_readers/test_python/test_parser.py778
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
'''],
]