[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.
|