[Epydoc-commits] SF.net SVN: epydoc: [1580] trunk/epydoc/src/epydoc/docparser.py
Brought to you by:
edloper
From: <dva...@us...> - 2007-03-10 16:01:54
|
Revision: 1580 http://svn.sourceforge.net/epydoc/?rev=1580&view=rev Author: dvarrazzo Date: 2007-03-10 08:01:52 -0800 (Sat, 10 Mar 2007) Log Message: ----------- - Added parsing of relative import according to rules defined in :PEP:`328`. Allowed relative import forms are:: from .foo import bar from ..foo import bar ... from . import foo from .. import foo ... Other relative forms are not allowed by the PEP:: import . # nope import .. # never from .. import * # not a chance... Modified Paths: -------------- trunk/epydoc/src/epydoc/docparser.py Modified: trunk/epydoc/src/epydoc/docparser.py =================================================================== --- trunk/epydoc/src/epydoc/docparser.py 2007-03-10 02:32:35 UTC (rev 1579) +++ trunk/epydoc/src/epydoc/docparser.py 2007-03-10 16:01:52 UTC (rev 1580) @@ -865,7 +865,9 @@ # >>> from os.path import join, split else: - src_name = parse_dotted_name(lhs) + # Allow relative imports in this case, as per PEP 328 + src_name = parse_dotted_name(lhs, + parent_name=parent_docs[-1].canonical_name) parts = split_on(rhs, (token.OP, ',')) for part in parts: # from m import x @@ -1668,8 +1670,11 @@ raise ParseError("Bad name") return elt[1] -def parse_dotted_name(elt_list, strip_parens=True): +def parse_dotted_name(elt_list, strip_parens=True, parent_name=None): """ + @param parent_name: canonical name of referring module, to resolve + relative imports. + @type parent_name: L{DottedName} @bug: does not handle 'x.(y).z' """ if len(elt_list) == 0: raise ParseError("Bad dotted name") @@ -1683,8 +1688,25 @@ elt_list[0][-1] == (token.OP, ')')): elt_list[:1] = elt_list[0][1:-1] + # Convert a relative import into an absolute name. + prefix_name = None + if parent_name is not None and elt_list[0][-1] == '.': + items = 1 + while len(elt_list) > items and elt_list[items][-1] == '.': + items += 1 + + elt_list = elt_list[items:] + prefix_name = parent_name[:-items] + + # >>> from . import foo + if not elt_list: + return prefix_name + if len(elt_list) % 2 != 1: raise ParseError("Bad dotted name") name = DottedName(parse_name(elt_list[0], True)) + if prefix_name is not None: + name = prefix_name + name + for i in range(2, len(elt_list), 2): dot, identifier = elt_list[i-1], elt_list[i] if dot != (token.OP, '.'): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |