Expand tests and fix bugs in packaging.util.resolve_name.
The code is still ugly, but at least it works better now. Patches to
make it easier to read are welcome, as well as support in #12915.
diff --git a/Lib/packaging/util.py b/Lib/packaging/util.py
index f8a8058..2af1149 100644
--- a/Lib/packaging/util.py
+++ b/Lib/packaging/util.py
@@ -630,22 +630,35 @@
def resolve_name(name):
"""Resolve a name like ``module.object`` to an object and return it.
- Raise ImportError if the module or name is not found.
+ This functions supports packages and attributes without depth limitation:
+ ``package.package.module.class.class.function.attr`` is valid input.
+ However, looking up builtins is not directly supported: use
+ ``builtins.name``.
+
+ Raises ImportError if importing the module fails or if one requested
+ attribute is not found.
"""
+ if '.' not in name:
+ # shortcut
+ __import__(name)
+ return sys.modules[name]
+
+ # FIXME clean up this code!
parts = name.split('.')
cursor = len(parts)
module_name = parts[:cursor]
+ ret = ''
while cursor > 0:
try:
ret = __import__('.'.join(module_name))
break
except ImportError:
- if cursor == 0:
- raise
cursor -= 1
module_name = parts[:cursor]
- ret = ''
+
+ if ret == '':
+ raise ImportError(parts[0])
for part in parts[1:]:
try: