1.1 --- a/micropython/common.py Tue Oct 08 22:59:10 2013 +0200
1.2 +++ b/micropython/common.py Tue Oct 08 23:59:47 2013 +0200
1.3 @@ -24,6 +24,7 @@
1.4 from micropython.basicdata import Const, Constant
1.5 from micropython.data import Attr, Class, Module
1.6 from micropython.errors import *
1.7 +from os.path import split
1.8
1.9 try:
1.10 set
1.11 @@ -247,19 +248,22 @@
1.12 if node.level == 0:
1.13 return node.modname, node.names
1.14
1.15 - # Relative to this module.
1.16 -
1.17 - elif node.level == 1:
1.18 - basename = module.full_name()
1.19 -
1.20 # Relative to an ancestor of this module.
1.21
1.22 else:
1.23 path = module.full_name().split(".")
1.24 - if node.level > len(path):
1.25 + level = node.level
1.26 +
1.27 + # Relative imports treat package roots as submodules.
1.28 +
1.29 + if split(module.filename)[-1] == "__init__.py":
1.30 + level -= 1
1.31 +
1.32 + if level > len(path):
1.33 raise InspectError("Relative import %r involves too many levels up from module %r" % (
1.34 - ("." * node.level + node.modname), module.full_name()))
1.35 - basename = ".".join(path[:-node.level+1])
1.36 + ("%s%s" % ("." * node.level, node.modname or "")), module.full_name()))
1.37 +
1.38 + basename = ".".join(path[:len(path)-level])
1.39
1.40 # Name imports from a module.
1.41
1.42 @@ -269,7 +273,7 @@
1.43 # Relative whole module imports.
1.44
1.45 else:
1.46 - return None, [("%s.%s" % (basename, name), alias) for name, alias in node.names]
1.47 + return None, [("%s.%s" % (basename, name), alias or name) for name, alias in node.names]
1.48
1.49 def used_by_unit(node):
1.50
2.1 --- a/micropython/inspect.py Tue Oct 08 22:59:10 2013 +0200
2.2 +++ b/micropython/inspect.py Tue Oct 08 23:59:47 2013 +0200
2.3 @@ -112,6 +112,7 @@
2.4
2.5 Module.__init__(self, name, importer)
2.6 self.visitor = self
2.7 + self.filename = None
2.8
2.9 # Import machinery links.
2.10
2.11 @@ -136,6 +137,7 @@
2.12
2.13 "Parse the file having the given 'filename'."
2.14
2.15 + self.filename = filename
2.16 self.astnode = module = compiler.parseFile(filename)
2.17
2.18 # Detect and record imports and globals declared in the module.
3.1 --- a/micropython/report.py Tue Oct 08 22:59:10 2013 +0200
3.2 +++ b/micropython/report.py Tue Oct 08 23:59:47 2013 +0200
3.3 @@ -822,7 +822,7 @@
3.4 if modname:
3.5 self._module_link(modname, "%s%s" % ("." * node.level, modname))
3.6 else:
3.7 - self._text("." * node.level)
3.8 + self.stream.write(self._text("." * node.level))
3.9
3.10 self._keyword("import", 1)
3.11 first = True
3.12 @@ -830,7 +830,7 @@
3.13 # Integrate the provided name details with any calculated details
3.14 # resulting from whole module imports.
3.15
3.16 - for (name, alias), (full_name, alias) in zip(node.names, names):
3.17 + for (name, alias), (full_name, _alias) in zip(node.names, names):
3.18 if not first:
3.19 self.stream.write(", ")
3.20