]> granicus.if.org Git - python/commitdiff
Merged revisions 61724-61824 via svnmerge from
authorMartin v. Löwis <martin@v.loewis.de>
Mon, 24 Mar 2008 00:46:53 +0000 (00:46 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Mon, 24 Mar 2008 00:46:53 +0000 (00:46 +0000)
svn+ssh://pythondev@svn.python.org/sandbox/trunk/2to3/lib2to3

........
  r61730 | martin.v.loewis | 2008-03-22 02:20:58 +0100 (Sa, 22 Mär 2008) | 2 lines

  More explicit relative imports.
........
  r61755 | david.wolever | 2008-03-22 21:33:52 +0100 (Sa, 22 Mär 2008) | 1 line

  Fixing #2446 -- 2to3 now translates 'import foo' to 'from . import foo'
........
  r61824 | david.wolever | 2008-03-24 01:30:24 +0100 (Mo, 24 Mär 2008) | 3 lines

  Fixed a bug where 'from itertools import izip' would return 'from itertools import'
........

Lib/lib2to3/fixes/fix_import.py
Lib/lib2to3/fixes/fix_itertools_imports.py
Lib/lib2to3/fixes/util.py
Lib/lib2to3/tests/benchmark.py
Lib/lib2to3/tests/pytree_idempotency.py
Lib/lib2to3/tests/test_fixers.py

index 661705420375b14deed5b3e1f48570f11510a6b3..91cbcf74883960c46f839c2b73ab58b7c8d716fa 100644 (file)
@@ -7,19 +7,20 @@ Becomes:
 And this import:
     import spam
 Becomes:
-    import .spam
+    from . import spam
 """
 
 # Local imports
 from . import basefix
 from os.path import dirname, join, exists, pathsep
+from .util import FromImport
 
 class FixImport(basefix.BaseFix):
 
     PATTERN = """
-    import_from< 'from' imp=any 'import' any >
+    import_from< type='from' imp=any 'import' any >
     |
-    import_name< 'import' imp=any >
+    import_name< type='import' imp=any >
     """
 
     def transform(self, node, results):
@@ -33,15 +34,19 @@ class FixImport(basefix.BaseFix):
             # I guess this is a global import -- skip it!
             return
 
-        # Some imps are top-level (eg: 'import ham')
-        # some are first level (eg: 'import ham.eggs')
-        # some are third level (eg: 'import ham.eggs as spam')
-        # Hence, the loop
-        while not hasattr(imp, 'value'):
-            imp = imp.children[0]
-
-        imp.value = "." + imp.value
-        node.changed()
+        if results['type'].value == 'from':
+            # Some imps are top-level (eg: 'import ham')
+            # some are first level (eg: 'import ham.eggs')
+            # some are third level (eg: 'import ham.eggs as spam')
+            # Hence, the loop
+            while not hasattr(imp, 'value'):
+                imp = imp.children[0]
+            imp.value = "." + imp.value
+            node.changed()
+        else:
+            new = FromImport('.', getattr(imp, 'content', None) or [imp])
+            new.prefix = node.get_prefix()
+            node = new
         return node
 
 def probably_a_local_import(imp_name, file_path):
index 0faa4ea5373044ee989d06759bcf792a0ca168aa..d5876a52f2b61dea3f155e8bfa48112569a7bba8 100644 (file)
@@ -17,6 +17,9 @@ class FixItertoolsImports(basefix.BaseFix):
                 # Handle 'import ... as ...'
                 continue
             if child.value in ('imap', 'izip', 'ifilter'):
+                # The value must be set to none in case child == import,
+                # so that the test for empty imports will work out
+                child.value = None
                 child.remove()
             elif child.value == 'ifilterfalse':
                 node.changed()
@@ -34,10 +37,9 @@ class FixItertoolsImports(basefix.BaseFix):
         if unicode(children[-1]) == ',':
             children[-1].remove()
 
-        # If there is nothing left, return a blank line
+        # If there are no imports left, just get rid of the entire statement
         if not (imports.children or getattr(imports, 'value', None)):
-            new = BlankLine()
-            new.prefix = node.get_prefix()
-        else:
-            new = node
-        return new
+            p = node.get_prefix()
+            node = BlankLine()
+            node.prefix = p
+        return node
index ef809afe00dd9ae2f9de29c568f4cb38f5083549..82dfba1b1b50cb46db7d72df7e2898599da4b849 100644 (file)
@@ -108,6 +108,26 @@ def ListComp(xp, fp, it, test=None):
                         inner,
                         Leaf(token.RBRACE, "]")])
 
+def FromImport(package_name, name_leafs):
+    """ Return an import statement in the form:
+        from package import name_leafs"""
+    # XXX: May not handle dotted imports properly (eg, package_name='foo.bar')
+    assert package_name == '.' or '.' not in package.name, "FromImport has "\
+           "not been tested with dotted package names -- use at your own "\
+           "peril!"
+
+    for leaf in name_leafs:
+        # Pull the leaves out of their old tree
+        leaf.remove()
+
+    children = [Leaf(token.NAME, 'from'),
+                Leaf(token.NAME, package_name, prefix=" "),
+                Leaf(token.NAME, 'import', prefix=" "),
+                Node(syms.import_as_names, name_leafs)]
+    imp = Node(syms.import_from, children)
+    return imp
+
+
 ###########################################################
 ### Determine whether a node represents a given literal
 ###########################################################
index 3723f69645f77a78f721aa08591210e65fa6089d..e0f3e68f646b2d8217efd7c3ea1a34cd69fe6af5 100644 (file)
@@ -13,7 +13,7 @@ import sys
 from time import time
 
 # Test imports
-from support import adjust_path
+from .support import adjust_path
 adjust_path()
 
 # Local imports
index d83f5cc77d4d11e0b2088370776f37d996518251..eeffe50bbba2b499421f4944478bdeb80be5d596 100755 (executable)
@@ -7,7 +7,7 @@
 __author__ = "Guido van Rossum <guido@python.org>"
 
 # Support imports (need to be imported first)
-import support
+from . import support
 
 # Python imports
 import os
index 0cd985c00a047f5c166ca1ddc7515a59d906848e..e89ef4d643514588d4416c502a66bdd244ab68c6 100755 (executable)
@@ -3036,6 +3036,10 @@ class Test_itertools_imports(FixerTestCase):
         a = ""
         self.check(b, a)
 
+        b = "from itertools import izip"
+        a = ""
+        self.check(b, a)
+
     def test_import_as(self):
         b = "from itertools import izip, bar as bang, imap"
         a = "from itertools import bar as bang"
@@ -3105,6 +3109,10 @@ class Test_import(FixerTestCase):
             self.failUnlessEqual(set(self.files_checked), expected_checks)
 
     def test_from(self):
+        b = "from foo import bar, baz"
+        a = "from .foo import bar, baz"
+        self.check_both(b, a)
+
         b = "from foo import bar"
         a = "from .foo import bar"
         self.check_both(b, a)
@@ -3121,17 +3129,21 @@ class Test_import(FixerTestCase):
 
     def test_import(self):
         b = "import foo"
-        a = "import .foo"
+        a = "from . import foo"
+        self.check_both(b, a)
+
+        b = "import foo, bar"
+        a = "from . import foo, bar"
         self.check_both(b, a)
 
     def test_dotted_import(self):
         b = "import foo.bar"
-        a = "import .foo.bar"
+        a = "from . import foo.bar"
         self.check_both(b, a)
 
     def test_dotted_import_as(self):
         b = "import foo.bar as bang"
-        a = "import .foo.bar as bang"
+        a = "from . import foo.bar as bang"
         self.check_both(b, a)