]> granicus.if.org Git - python/commitdiff
add fixer for reload() -> imp.reload() (closes #11797)\n\nPatch by Laurie Clark-Micha...
authorBenjamin Peterson <benjamin@python.org>
Sat, 8 Dec 2012 03:44:10 +0000 (22:44 -0500)
committerBenjamin Peterson <benjamin@python.org>
Sat, 8 Dec 2012 03:44:10 +0000 (22:44 -0500)
Doc/library/2to3.rst
Lib/lib2to3/fixer_util.py
Lib/lib2to3/fixes/fix_intern.py
Lib/lib2to3/fixes/fix_reload.py [new file with mode: 0644]
Lib/lib2to3/tests/test_fixers.py
Misc/ACKS
Misc/NEWS

index d07aaa11a15e00422d827ef0273da71a5e3b95b4..b324aa63464c1b7be22c6cc4e5d908e65aa66dbb 100644 (file)
@@ -343,6 +343,10 @@ and off individually.  They are described here in more detail.
 
    Handles the move of :func:`reduce` to :func:`functools.reduce`.
 
+.. 2to3fixer:: reload
+
+   Converts :func:`reload` to :func:`imp.reload`.
+
 .. 2to3fixer:: renames
 
    Changes :data:`sys.maxint` to :data:`sys.maxsize`.
index 60d219f57707a41dae8b4d9a0abef4894e148374..6e259c54ac470e1bf688ce28d916d91f20a0c912 100644 (file)
@@ -129,6 +129,29 @@ def FromImport(package_name, name_leafs):
     imp = Node(syms.import_from, children)
     return imp
 
+def ImportAndCall(node, results, names):
+    """Returns an import statement and calls a method
+    of the module:
+
+    import module
+    module.name()"""
+    obj = results["obj"].clone()
+    if obj.type == syms.arglist:
+        newarglist = obj.clone()
+    else:
+        newarglist = Node(syms.arglist, [obj.clone()])
+    after = results["after"]
+    if after:
+        after = [n.clone() for n in after]
+    new = Node(syms.power,
+               Attr(Name(names[0]), Name(names[1])) +
+               [Node(syms.trailer,
+                     [results["lpar"].clone(),
+                      newarglist,
+                      results["rpar"].clone()])] + after)
+    new.prefix = node.prefix
+    return new
+
 
 ###########################################################
 ### Determine whether a node represents a given literal
index 6be11cd39dc8987f74fb3632f9a7f4b7c8f7d856..fb2973c24252a0fe51bf11ef51afc85796a103f9 100644 (file)
@@ -6,9 +6,8 @@
 intern(s) -> sys.intern(s)"""
 
 # Local imports
-from .. import pytree
 from .. import fixer_base
-from ..fixer_util import Name, Attr, touch_import
+from ..fixer_util import ImportAndCall, touch_import
 
 
 class FixIntern(fixer_base.BaseFix):
@@ -26,21 +25,7 @@ class FixIntern(fixer_base.BaseFix):
     """
 
     def transform(self, node, results):
-        syms = self.syms
-        obj = results["obj"].clone()
-        if obj.type == syms.arglist:
-            newarglist = obj.clone()
-        else:
-            newarglist = pytree.Node(syms.arglist, [obj.clone()])
-        after = results["after"]
-        if after:
-            after = [n.clone() for n in after]
-        new = pytree.Node(syms.power,
-                          Attr(Name("sys"), Name("intern")) +
-                          [pytree.Node(syms.trailer,
-                                       [results["lpar"].clone(),
-                                        newarglist,
-                                        results["rpar"].clone()])] + after)
-        new.prefix = node.prefix
+        names = ('sys', 'intern')
+        new = ImportAndCall(node, results, names)
         touch_import(None, 'sys', node)
         return new
diff --git a/Lib/lib2to3/fixes/fix_reload.py b/Lib/lib2to3/fixes/fix_reload.py
new file mode 100644 (file)
index 0000000..1855357
--- /dev/null
@@ -0,0 +1,28 @@
+"""Fixer for reload().
+
+reload(s) -> imp.reload(s)"""
+
+# Local imports
+from .. import fixer_base
+from ..fixer_util import ImportAndCall, touch_import
+
+
+class FixReload(fixer_base.BaseFix):
+    BM_compatible = True
+    order = "pre"
+
+    PATTERN = """
+    power< 'reload'
+           trailer< lpar='('
+                    ( not(arglist | argument<any '=' any>) obj=any
+                      | obj=arglist<(not argument<any '=' any>) any ','> )
+                    rpar=')' >
+           after=any*
+    >
+    """
+
+    def transform(self, node, results):
+        names = ('imp', 'reload')
+        new = ImportAndCall(node, results, names)
+        touch_import(None, 'imp', node)
+        return new
index 914b3bf9287f88a15d627295a07b988a33a2a19b..d7659fa2672d04c60e19b32861d7f434c0415176 100644 (file)
@@ -282,6 +282,65 @@ class Test_apply(FixerTestCase):
         b = """f(*args, **kwds)"""
         self.check(a, b)
 
+class Test_reload(FixerTestCase):
+    fixer = "reload"
+
+    def test(self):
+        b = """reload(a)"""
+        a = """import imp\nimp.reload(a)"""
+        self.check(b, a)
+
+    def test_comment(self):
+        b = """reload( a ) # comment"""
+        a = """import imp\nimp.reload( a ) # comment"""
+        self.check(b, a)
+
+        # PEP 8 comments
+        b = """reload( a )  # comment"""
+        a = """import imp\nimp.reload( a )  # comment"""
+        self.check(b, a)
+
+    def test_space(self):
+        b = """reload( a )"""
+        a = """import imp\nimp.reload( a )"""
+        self.check(b, a)
+
+        b = """reload( a)"""
+        a = """import imp\nimp.reload( a)"""
+        self.check(b, a)
+
+        b = """reload(a )"""
+        a = """import imp\nimp.reload(a )"""
+        self.check(b, a)
+
+    def test_unchanged(self):
+        s = """reload(a=1)"""
+        self.unchanged(s)
+
+        s = """reload(f, g)"""
+        self.unchanged(s)
+
+        s = """reload(f, *h)"""
+        self.unchanged(s)
+
+        s = """reload(f, *h, **i)"""
+        self.unchanged(s)
+
+        s = """reload(f, **i)"""
+        self.unchanged(s)
+
+        s = """reload(*h, **i)"""
+        self.unchanged(s)
+
+        s = """reload(*h)"""
+        self.unchanged(s)
+
+        s = """reload(**i)"""
+        self.unchanged(s)
+
+        s = """reload()"""
+        self.unchanged(s)
+
 class Test_intern(FixerTestCase):
     fixer = "intern"
 
index 7e6beeebcdba54a01d8135d0787027934a973aca..186cd0f33fb1968347d0a0f7e20df092d9f6dce6 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -214,6 +214,7 @@ David Cinege
 Craig Citro
 Gilles Civario
 Chris Clark
+Laurie Clark-Michalek
 Mike Clarkson
 Andrew Clegg
 Brad Clements
index 874e12aea2eb4221de385ba59bf52cb8344f2861..99fa5b136141612a1919806a302f9a006ffca6c5 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -503,6 +503,8 @@ Documentation
 Tools/Demos
 -----------
 
+- Issue #11797: Add a 2to3 fixer that maps reload() to imp.reload().
+
 - Issue #10966: Remove the concept of unexpected skipped tests.
 
 - Issue #9893: Removed the Misc/Vim directory.