Skip to content

Commit ff7af43

Browse files
committed
futurize: change fix_future_builtins to add only those imports that are needed
1 parent 3f64c37 commit ff7af43

File tree

2 files changed

+60
-20
lines changed

2 files changed

+60
-20
lines changed
Lines changed: 53 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,67 @@
11
"""
22
For the ``future`` package.
33
4-
Adds this import line:
4+
Adds this import line::
55
6-
from future.builtins import *
6+
from future.builtins import XYZ
77
8-
after any other imports (in an initial block of them).
8+
for each of the functions XYZ that is used in the module from those in
9+
future.builtins.
10+
11+
Adds these imports after any other imports (in an initial block of them).
912
"""
1013

11-
from lib2to3.fixer_base import BaseFix
14+
from __future__ import unicode_literals
15+
16+
from lib2to3 import fixer_base
1217
from lib2to3.pygram import python_symbols as syms
1318
from libfuturize.fixer_util import touch_import_top
1419

1520

16-
class FixFutureBuiltins(BaseFix):
21+
"""
22+
Fixer that changes zip(seq0, seq1, ...) into list(zip(seq0, seq1, ...)
23+
unless there exists a 'from future_builtins import zip' statement in the
24+
top-level namespace.
25+
26+
We avoid the transformation if the zip() call is directly contained in
27+
iter(<>), list(<>), tuple(<>), sorted(<>), ...join(<>), or for V in <>:.
28+
"""
29+
30+
# Local imports
31+
from lib2to3.fixer_util import Name, Call, in_special_context
32+
33+
# from future.builtins.iterators import (filter, map, zip)
34+
# from future.builtins.misc import (ascii, chr, hex, input, isinstance, oct, open)
35+
# from future.builtins.backports import (bytes, int, range, round, str, super)
36+
37+
replaced_builtins = '''filter map zip
38+
ascii chr hex input isinstance oct open bytes int range
39+
bytes int range round str super'''.split()
40+
41+
expression = '|'.join(["name='{}'".format(name) for name in replaced_builtins])
42+
43+
44+
class FixFutureBuiltins(fixer_base.BaseFix):
1745
BM_compatible = True
18-
PATTERN = "file_input"
19-
run_order = 7
20-
21-
def match(self, node):
22-
if node.type == syms.file_input:
23-
return True
24-
return False
25-
46+
run_order = 8
47+
48+
# Example:
49+
# PATTERN = """
50+
# power<
51+
# (name='print'|name='input'|name='raw_input') trailer< '(' args=[any] ')' >
52+
# rest=any* >
53+
# """
54+
55+
PATTERN = """
56+
power<
57+
({}) trailer< '(' args=[any] ')' >
58+
rest=any* >
59+
""".format(expression)
60+
2661
def transform(self, node, results):
27-
touch_import_top(u'future.builtins', u'*', node)
62+
name = results["name"]
63+
touch_import_top(u'future.builtins', name.value, node)
64+
# name.replace(Name(u"input", prefix=name.prefix))
65+
66+
2867

libfuturize/main.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -185,20 +185,21 @@ def main(args=None):
185185
# the current state of each module. (This can simplify testing, and can
186186
# reduce the need to think about Py2 compatibility when editing the code
187187
# further.)
188-
explicit = set()
188+
extra_fixes = set()
189189
if options.all_imports:
190190
prefix = 'libfuturize.fixes2.'
191191
if options.stage1:
192-
explicit.add(prefix +
192+
extra_fixes.add(prefix +
193193
'fix_add__future__imports_except_unicode_literals')
194194
else:
195195
# In case the user hasn't run stage1 for some reason:
196-
explicit.add(prefix + 'fix_add__future__imports')
197-
explicit.add(prefix + 'fix_add_future_standard_library_import')
196+
extra_fixes.add(prefix + 'fix_add__future__imports')
197+
extra_fixes.add(prefix + 'fix_add_future_standard_library_import')
198+
extra_fixes.add(prefix + 'fix_add_all_future_builtins')
198199

199-
fixer_names = avail_fixes | explicit - unwanted_fixes
200+
fixer_names = avail_fixes | extra_fixes - unwanted_fixes
200201

201-
rt = StdoutRefactoringTool(sorted(fixer_names), flags, explicit,
202+
rt = StdoutRefactoringTool(sorted(fixer_names), flags, set(),
202203
options.nobackups, not options.no_diffs)
203204

204205
# Refactor all files and directories passed as arguments

0 commit comments

Comments
 (0)