forked from PyCQA/modernize
-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfix_itertools_imports_six.py
73 lines (64 loc) · 2.4 KB
/
fix_itertools_imports_six.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
""" Fixer for imports of itertools.(imap|ifilter|izip|ifilterfalse) """
# Local imports
from fissix import fixer_base, fixer_util
from fissix.fixer_util import BlankLine, syms, token
# This is a derived work of Lib/lib2to3/fixes/fix_itertools_imports.py. That file
# is under the copyright of the Python Software Foundation and licensed
# under the Python Software Foundation License 2.
#
# Copyright notice:
#
# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
# 2011, 2012, 2013 Python Software Foundation. All rights reserved.
class FixItertoolsImportsSix(fixer_base.BaseFix):
BM_compatible = True
PATTERN = """
import_from< 'from' 'itertools' 'import' imports=any >
""" % (
locals()
)
def transform(self, node, results):
imports = results["imports"]
if imports.type == syms.import_as_name or not imports.children:
children = [imports]
else:
children = imports.children
for child in children[::2]:
if child.type == token.NAME:
name_node = child
elif child.type == token.STAR:
# Just leave the import as is.
return
else:
assert child.type == syms.import_as_name
name_node = child.children[0]
member_name = name_node.value
if member_name in (
"imap",
"izip",
"ifilter",
"ifilterfalse",
"izip_longest",
):
child.value = None
fixer_util.touch_import("six.moves", member_name[1:], node)
child.remove()
# Make sure the import statement is still sane
children = imports.children[:] or [imports]
remove_comma = True
for child in children:
if remove_comma and child.type == token.COMMA:
child.remove()
else:
remove_comma ^= True
while children and children[-1].type == token.COMMA:
children.pop().remove()
# If there are no imports left, just get rid of the entire statement
if (
not (imports.children or getattr(imports, "value", None))
or imports.parent is None
):
p = node.prefix
node = BlankLine()
node.prefix = p
return node