[Python-checkins] distutils2: Merge from Konrad, minus trailing spaces and plus renaming

tarek.ziade python-checkins at python.org
Thu Aug 19 08:34:13 CEST 2010


tarek.ziade pushed e71d39135e23 to distutils2:

http://hg.python.org/distutils2/rev/e71d39135e23
changeset:   552:e71d39135e23
parent:      549:6640d8916744
parent:      551:6eea7e7a79da
user:        ?ric Araujo <merwok at netwok.org>
date:        Thu Aug 12 19:13:25 2010 +0200
summary:     Merge from Konrad, minus trailing spaces and plus renaming
files:       src/distutils2/dist.py, src/distutils2/tests/test_util.py, src/distutils2/util.py

diff --git a/src/distutils2/dist.py b/src/distutils2/dist.py
--- a/src/distutils2/dist.py
+++ b/src/distutils2/dist.py
@@ -16,7 +16,7 @@
 from distutils2.errors import (DistutilsOptionError, DistutilsArgError,
                                DistutilsModuleError, DistutilsClassError)
 from distutils2.fancy_getopt import FancyGetopt, translate_longopt
-from distutils2.util import check_environ, strtobool, resolve_dotted_name
+from distutils2.util import check_environ, strtobool, resolve_name
 from distutils2 import log
 from distutils2.metadata import DistributionMetadata
 
@@ -967,7 +967,7 @@
         if hooks is None:
             return
         for hook in hooks.values():
-            hook_func = resolve_dotted_name(hook)
+            hook_func = resolve_name(hook)
             hook_func(cmd_obj)
 
     # -- Distribution query methods ------------------------------------
diff --git a/src/distutils2/tests/test_util.py b/src/distutils2/tests/test_util.py
--- a/src/distutils2/tests/test_util.py
+++ b/src/distutils2/tests/test_util.py
@@ -18,7 +18,7 @@
                              _find_exe_version, _MAC_OS_X_LD_VERSION,
                              byte_compile, find_packages, spawn, find_executable,
                              _nt_quote_args, get_pypirc_path, generate_pypirc,
-                             read_pypirc, resolve_dotted_name)
+                             read_pypirc, resolve_name)
 
 from distutils2 import util
 from distutils2.tests import support
@@ -342,16 +342,30 @@
         res = find_packages([root], ['pkg1.pkg2'])
         self.assertEqual(set(res), set(['pkg1', 'pkg5', 'pkg1.pkg3', 'pkg1.pkg3.pkg6']))
 
-    def test_resolve_dotted_name(self):
-        self.assertEqual(UtilTestCase, resolve_dotted_name("distutils2.tests.test_util.UtilTestCase"))
-        self.assertEqual(UtilTestCase.test_resolve_dotted_name,
-                         resolve_dotted_name("distutils2.tests.test_util.UtilTestCase.test_resolve_dotted_name"))
+    def test_resolve_name(self):
+        self.assertEqual(UtilTestCase, resolve_name("distutils2.tests.test_util.UtilTestCase"))
+        self.assertEqual(UtilTestCase.test_resolve_name,
+                         resolve_name("distutils2.tests.test_util.UtilTestCase.test_resolve_name"))
 
-        self.assertRaises(ImportError, resolve_dotted_name,
+        self.assertRaises(ImportError, resolve_name,
                           "distutils2.tests.test_util.UtilTestCaseNot")
-        self.assertRaises(ImportError, resolve_dotted_name,
+        self.assertRaises(ImportError, resolve_name,
                           "distutils2.tests.test_util.UtilTestCase.nonexistent_attribute")
 
+    def test_import_nested_first_time(self):
+        tmp_dir = self.mkdtemp()
+        os.makedirs(os.path.join(tmp_dir, 'a', 'b'))
+        self.write_file(os.path.join(tmp_dir, 'a', '__init__.py'), '')
+        self.write_file(os.path.join(tmp_dir, 'a', 'b', '__init__.py'), '')
+        self.write_file(os.path.join(tmp_dir, 'a', 'b', 'c.py'), 'class Foo: pass')
+
+        try:
+            sys.path.append(tmp_dir)
+            resolve_name("a.b.c.Foo")
+            # assert nothing raised
+        finally:
+            sys.path.remove(tmp_dir)
+
     @unittest.skipIf(sys.version < '2.6', 'requires Python 2.6 or higher')
     def test_run_2to3_on_code(self):
         content = "print 'test'"
diff --git a/src/distutils2/util.py b/src/distutils2/util.py
--- a/src/distutils2/util.py
+++ b/src/distutils2/util.py
@@ -636,21 +636,26 @@
                 packages.append(package_name)
     return packages
 
+def resolve_name(name):
+    """Resolve a name like ``module.object`` to an object and return it."""
+    parts = name.split('.')
+    cursor = len(parts)
+    module_name, rest = parts[:cursor], parts[cursor:]
 
-def resolve_dotted_name(dotted_name):
-    module_name, rest = dotted_name.split('.')[0], dotted_name.split('.')[1:]
-    while len(rest) > 0:
+    while cursor > 0:
         try:
-            ret = __import__(module_name)
+            ret = __import__('.'.join(module_name))
             break
         except ImportError:
-            if rest == []:
+            if cursor == 0:
                 raise
-            module_name += ('.' + rest[0])
-            rest = rest[1:]
-    while len(rest) > 0:
+            cursor -= 1
+            module_name = parts[:cursor]
+            rest = parts[cursor:]
+
+    for part in parts[1:]:
         try:
-            ret = getattr(ret, rest.pop(0))
+            ret = getattr(ret, part)
         except AttributeError:
             raise ImportError
     return ret

--
Repository URL: http://hg.python.org/distutils2


More information about the Python-checkins mailing list