# HG changeset patch # User Paul Boddie # Date 1381269587 -7200 # Node ID 5f2c0e22fd402d75ada00832ffdaa3db973819ab # Parent 112b08cc400606d2f6bd7aa6b036197290f23b80 Fixed relative import path interpretation to work within package roots. diff -r 112b08cc4006 -r 5f2c0e22fd40 micropython/common.py --- a/micropython/common.py Tue Oct 08 22:59:10 2013 +0200 +++ b/micropython/common.py Tue Oct 08 23:59:47 2013 +0200 @@ -24,6 +24,7 @@ from micropython.basicdata import Const, Constant from micropython.data import Attr, Class, Module from micropython.errors import * +from os.path import split try: set @@ -247,19 +248,22 @@ if node.level == 0: return node.modname, node.names - # Relative to this module. - - elif node.level == 1: - basename = module.full_name() - # Relative to an ancestor of this module. else: path = module.full_name().split(".") - if node.level > len(path): + level = node.level + + # Relative imports treat package roots as submodules. + + if split(module.filename)[-1] == "__init__.py": + level -= 1 + + if level > len(path): raise InspectError("Relative import %r involves too many levels up from module %r" % ( - ("." * node.level + node.modname), module.full_name())) - basename = ".".join(path[:-node.level+1]) + ("%s%s" % ("." * node.level, node.modname or "")), module.full_name())) + + basename = ".".join(path[:len(path)-level]) # Name imports from a module. @@ -269,7 +273,7 @@ # Relative whole module imports. else: - return None, [("%s.%s" % (basename, name), alias) for name, alias in node.names] + return None, [("%s.%s" % (basename, name), alias or name) for name, alias in node.names] def used_by_unit(node): diff -r 112b08cc4006 -r 5f2c0e22fd40 micropython/inspect.py --- a/micropython/inspect.py Tue Oct 08 22:59:10 2013 +0200 +++ b/micropython/inspect.py Tue Oct 08 23:59:47 2013 +0200 @@ -112,6 +112,7 @@ Module.__init__(self, name, importer) self.visitor = self + self.filename = None # Import machinery links. @@ -136,6 +137,7 @@ "Parse the file having the given 'filename'." + self.filename = filename self.astnode = module = compiler.parseFile(filename) # Detect and record imports and globals declared in the module. diff -r 112b08cc4006 -r 5f2c0e22fd40 micropython/report.py --- a/micropython/report.py Tue Oct 08 22:59:10 2013 +0200 +++ b/micropython/report.py Tue Oct 08 23:59:47 2013 +0200 @@ -822,7 +822,7 @@ if modname: self._module_link(modname, "%s%s" % ("." * node.level, modname)) else: - self._text("." * node.level) + self.stream.write(self._text("." * node.level)) self._keyword("import", 1) first = True @@ -830,7 +830,7 @@ # Integrate the provided name details with any calculated details # resulting from whole module imports. - for (name, alias), (full_name, alias) in zip(node.names, names): + for (name, alias), (full_name, _alias) in zip(node.names, names): if not first: self.stream.write(", ")