Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4eb5fa5

Browse files
committed
Merged revisions 82779,82855,83740,83789-83791,83797-83801,83803,83811,83827,83844 via svnmerge from
svn+ssh://[email protected]/sandbox/trunk/2to3/lib2to3 ........ r82779 | benjamin.peterson | 2010-07-10 14:45:08 -0500 (Sat, 10 Jul 2010) | 1 line typo in attribute name #9217 ........ r82855 | benjamin.peterson | 2010-07-13 16:27:38 -0500 (Tue, 13 Jul 2010) | 1 line remove more extraneous commas #9245 ........ r83740 | alexandre.vassalotti | 2010-08-05 01:58:36 -0500 (Thu, 05 Aug 2010) | 4 lines Issue 5077: Update fixer for the other functions gone from the operator module. Patch by Meador Inge. ........ r83789 | benjamin.peterson | 2010-08-07 17:45:14 -0500 (Sat, 07 Aug 2010) | 1 line cleanup and use unicode consistently ........ r83790 | benjamin.peterson | 2010-08-07 17:52:06 -0500 (Sat, 07 Aug 2010) | 1 line unicode literal ........ r83791 | benjamin.peterson | 2010-08-07 17:52:55 -0500 (Sat, 07 Aug 2010) | 1 line .get() is pointless here ........ r83797 | benjamin.peterson | 2010-08-07 18:54:51 -0500 (Sat, 07 Aug 2010) | 1 line add a function to find how a node is indented ........ r83798 | benjamin.peterson | 2010-08-07 18:55:28 -0500 (Sat, 07 Aug 2010) | 1 line when splitting import statements, use correct indentation #9386 ........ r83799 | benjamin.peterson | 2010-08-07 18:57:43 -0500 (Sat, 07 Aug 2010) | 1 line double quotes ........ r83800 | benjamin.peterson | 2010-08-07 18:58:52 -0500 (Sat, 07 Aug 2010) | 1 line add another test ........ r83801 | benjamin.peterson | 2010-08-07 19:02:10 -0500 (Sat, 07 Aug 2010) | 1 line cleanup; style-nits ........ r83803 | benjamin.peterson | 2010-08-07 19:05:08 -0500 (Sat, 07 Aug 2010) | 1 line slightly more explicit ........ r83811 | benjamin.peterson | 2010-08-07 22:56:44 -0500 (Sat, 07 Aug 2010) | 4 lines Fix node.pre_order() to call the right method on its children. This was a rather tragic copy-paste error. ........ r83827 | benjamin.peterson | 2010-08-08 08:12:48 -0500 (Sun, 08 Aug 2010) | 1 line cause test to actually run and fix it ........ r83844 | benjamin.peterson | 2010-08-08 13:46:37 -0500 (Sun, 08 Aug 2010) | 1 line fix whitespace ........
1 parent bf4cc5d commit 4eb5fa5

9 files changed

Lines changed: 290 additions & 95 deletions

File tree

Lib/lib2to3/fixer_util.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
"""Utility functions, node construction macros, etc."""
22
# Author: Collin Winter
33

4+
from itertools import islice
5+
46
# Local imports
57
from .pgen2 import token
68
from .pytree import Leaf, Node
@@ -14,7 +16,7 @@
1416

1517
def KeywordArg(keyword, value):
1618
return Node(syms.argument,
17-
[keyword, Leaf(token.EQUAL, '='), value])
19+
[keyword, Leaf(token.EQUAL, "="), value])
1820

1921
def LParen():
2022
return Leaf(token.LPAR, "(")
@@ -76,9 +78,9 @@ def Number(n, prefix=None):
7678

7779
def Subscript(index_node):
7880
"""A numeric or string subscript"""
79-
return Node(syms.trailer, [Leaf(token.LBRACE, '['),
81+
return Node(syms.trailer, [Leaf(token.LBRACE, "["),
8082
index_node,
81-
Leaf(token.RBRACE, ']')])
83+
Leaf(token.RBRACE, "]")])
8284

8385
def String(string, prefix=None):
8486
"""A string leaf"""
@@ -120,9 +122,9 @@ def FromImport(package_name, name_leafs):
120122
# Pull the leaves out of their old tree
121123
leaf.remove()
122124

123-
children = [Leaf(token.NAME, 'from'),
125+
children = [Leaf(token.NAME, "from"),
124126
Leaf(token.NAME, package_name, prefix=" "),
125-
Leaf(token.NAME, 'import', prefix=" "),
127+
Leaf(token.NAME, "import", prefix=" "),
126128
Node(syms.import_as_names, name_leafs)]
127129
imp = Node(syms.import_from, children)
128130
return imp
@@ -245,6 +247,16 @@ def is_probably_builtin(node):
245247
return False
246248
return True
247249

250+
def find_indentation(node):
251+
"""Find the indentation of *node*."""
252+
while node is not None:
253+
if node.type == syms.suite and len(node.children) > 2:
254+
indent = node.children[1]
255+
if indent.type == token.INDENT:
256+
return indent.value
257+
node = node.parent
258+
return ""
259+
248260
###########################################################
249261
### The following functions are to find bindings in a suite
250262
###########################################################
@@ -314,11 +326,11 @@ def is_import_stmt(node):
314326

315327
if package is None:
316328
import_ = Node(syms.import_name, [
317-
Leaf(token.NAME, 'import'),
318-
Leaf(token.NAME, name, prefix=' ')
329+
Leaf(token.NAME, "import"),
330+
Leaf(token.NAME, name, prefix=" ")
319331
])
320332
else:
321-
import_ = FromImport(package, [Leaf(token.NAME, name, prefix=' ')])
333+
import_ = FromImport(package, [Leaf(token.NAME, name, prefix=" ")])
322334

323335
children = [import_, Newline()]
324336
root.insert_child(insert_pos, Node(syms.simple_stmt, children))
@@ -404,7 +416,7 @@ def _is_import_binding(node, name, package=None):
404416
if package and str(node.children[1]).strip() != package:
405417
return None
406418
n = node.children[3]
407-
if package and _find('as', n):
419+
if package and _find("as", n):
408420
# See test_from_import_as for explanation
409421
return None
410422
elif n.type == syms.import_as_names and _find(name, n):

Lib/lib2to3/fixes/fix_itertools_imports.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ def transform(self, node, results):
4343
else:
4444
remove_comma ^= True
4545

46-
if children[-1].type == token.COMMA:
47-
children[-1].remove()
46+
while children and children[-1].type == token.COMMA:
47+
children.pop().remove()
4848

4949
# If there are no imports left, just get rid of the entire statement
5050
if (not (imports.children or getattr(imports, 'value', None)) or

Lib/lib2to3/fixes/fix_operator.py

Lines changed: 73 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,89 @@
1-
"""Fixer for operator.{isCallable,sequenceIncludes}
1+
"""Fixer for operator functions.
22
3-
operator.isCallable(obj) -> hasattr(obj, '__call__')
3+
operator.isCallable(obj) -> hasattr(obj, '__call__')
44
operator.sequenceIncludes(obj) -> operator.contains(obj)
5+
operator.isSequenceType(obj) -> isinstance(obj, collections.Sequence)
6+
operator.isMappingType(obj) -> isinstance(obj, collections.Mapping)
7+
operator.isNumberType(obj) -> isinstance(obj, numbers.Number)
8+
operator.repeat(obj, n) -> operator.mul(obj, n)
9+
operator.irepeat(obj, n) -> operator.imul(obj, n)
510
"""
611

12+
import collections
13+
714
# Local imports
8-
from .. import fixer_base
9-
from ..fixer_util import Call, Name, String
15+
from lib2to3 import fixer_base
16+
from lib2to3.fixer_util import Call, Name, String, touch_import
17+
1018

1119
class FixOperator(fixer_base.BaseFix):
1220

13-
methods = "method=('isCallable'|'sequenceIncludes')"
14-
func = "'(' func=any ')'"
21+
methods = """
22+
method=('isCallable'|'sequenceIncludes'
23+
|'isSequenceType'|'isMappingType'|'isNumberType'
24+
|'repeat'|'irepeat')
25+
"""
26+
obj = "'(' obj=any ')'"
1527
PATTERN = """
1628
power< module='operator'
17-
trailer< '.' %(methods)s > trailer< %(func)s > >
29+
trailer< '.' %(methods)s > trailer< %(obj)s > >
1830
|
19-
power< %(methods)s trailer< %(func)s > >
20-
""" % dict(methods=methods, func=func)
31+
power< %(methods)s trailer< %(obj)s > >
32+
""" % dict(methods=methods, obj=obj)
2133

2234
def transform(self, node, results):
35+
method = self._check_method(node, results)
36+
if method is not None:
37+
return method(node, results)
38+
39+
def _sequenceIncludes(self, node, results):
40+
"""operator.contains(%s)"""
41+
return self._handle_rename(node, results, "contains")
42+
43+
def _isCallable(self, node, results):
44+
"""hasattr(%s, '__call__')"""
45+
obj = results["obj"]
46+
args = [obj.clone(), String(", "), String("'__call__'")]
47+
return Call(Name("hasattr"), args, prefix=node.prefix)
48+
49+
def _repeat(self, node, results):
50+
"""operator.mul(%s)"""
51+
return self._handle_rename(node, results, "mul")
52+
53+
def _irepeat(self, node, results):
54+
"""operator.imul(%s)"""
55+
return self._handle_rename(node, results, "imul")
56+
57+
def _isSequenceType(self, node, results):
58+
"""isinstance(%s, collections.Sequence)"""
59+
return self._handle_type2abc(node, results, "collections", "Sequence")
60+
61+
def _isMappingType(self, node, results):
62+
"""isinstance(%s, collections.Mapping)"""
63+
return self._handle_type2abc(node, results, "collections", "Mapping")
64+
65+
def _isNumberType(self, node, results):
66+
"""isinstance(%s, numbers.Number)"""
67+
return self._handle_type2abc(node, results, "numbers", "Number")
68+
69+
def _handle_rename(self, node, results, name):
2370
method = results["method"][0]
71+
method.value = name
72+
method.changed()
2473

25-
if method.value == "sequenceIncludes":
26-
if "module" not in results:
27-
# operator may not be in scope, so we can't make a change.
28-
self.warning(node, "You should use operator.contains here.")
29-
else:
30-
method.value = "contains"
31-
method.changed()
32-
elif method.value == "isCallable":
33-
if "module" not in results:
34-
self.warning(node,
35-
"You should use hasattr(%s, '__call__') here." %
36-
results["func"].value)
74+
def _handle_type2abc(self, node, results, module, abc):
75+
touch_import(None, module, node)
76+
obj = results["obj"]
77+
args = [obj.clone(), String(", " + ".".join([module, abc]))]
78+
return Call(Name("isinstance"), args, prefix=node.prefix)
79+
80+
def _check_method(self, node, results):
81+
method = getattr(self, "_" + results["method"][0].value)
82+
if isinstance(method, collections.Callable):
83+
if "module" in results:
84+
return method
3785
else:
38-
func = results["func"]
39-
args = [func.clone(), String(", "), String("'__call__'")]
40-
return Call(Name("hasattr"), args, prefix=node.prefix)
86+
sub = (str(results["obj"]),)
87+
invocation_str = str(method.__doc__) % sub
88+
self.warning(node, "You should use '%s' here." % invocation_str)
89+
return None

Lib/lib2to3/fixes/fix_urllib.py

Lines changed: 58 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -5,39 +5,40 @@
55
# Author: Nick Edds
66

77
# Local imports
8-
from .fix_imports import alternates, FixImports
9-
from .. import fixer_base
10-
from ..fixer_util import Name, Comma, FromImport, Newline, attr_chain
11-
12-
MAPPING = {'urllib': [
13-
('urllib.request',
14-
['URLOpener', 'FancyURLOpener', 'urlretrieve',
15-
'_urlopener', 'urlopen', 'urlcleanup',
16-
'pathname2url', 'url2pathname']),
17-
('urllib.parse',
18-
['quote', 'quote_plus', 'unquote', 'unquote_plus',
19-
'urlencode', 'splitattr', 'splithost', 'splitnport',
20-
'splitpasswd', 'splitport', 'splitquery', 'splittag',
21-
'splittype', 'splituser', 'splitvalue', ]),
22-
('urllib.error',
23-
['ContentTooShortError'])],
24-
'urllib2' : [
25-
('urllib.request',
26-
['urlopen', 'install_opener', 'build_opener',
27-
'Request', 'OpenerDirector', 'BaseHandler',
28-
'HTTPDefaultErrorHandler', 'HTTPRedirectHandler',
29-
'HTTPCookieProcessor', 'ProxyHandler',
30-
'HTTPPasswordMgr',
31-
'HTTPPasswordMgrWithDefaultRealm',
32-
'AbstractBasicAuthHandler',
33-
'HTTPBasicAuthHandler', 'ProxyBasicAuthHandler',
34-
'AbstractDigestAuthHandler',
35-
'HTTPDigestAuthHandler', 'ProxyDigestAuthHandler',
36-
'HTTPHandler', 'HTTPSHandler', 'FileHandler',
37-
'FTPHandler', 'CacheFTPHandler',
38-
'UnknownHandler']),
39-
('urllib.error',
40-
['URLError', 'HTTPError']),
8+
from lib2to3.fixes.fix_imports import alternates, FixImports
9+
from lib2to3 import fixer_base
10+
from lib2to3.fixer_util import (Name, Comma, FromImport, Newline,
11+
find_indentation)
12+
13+
MAPPING = {"urllib": [
14+
("urllib.request",
15+
["URLOpener", "FancyURLOpener", "urlretrieve",
16+
"_urlopener", "urlopen", "urlcleanup",
17+
"pathname2url", "url2pathname"]),
18+
("urllib.parse",
19+
["quote", "quote_plus", "unquote", "unquote_plus",
20+
"urlencode", "splitattr", "splithost", "splitnport",
21+
"splitpasswd", "splitport", "splitquery", "splittag",
22+
"splittype", "splituser", "splitvalue", ]),
23+
("urllib.error",
24+
["ContentTooShortError"])],
25+
"urllib2" : [
26+
("urllib.request",
27+
["urlopen", "install_opener", "build_opener",
28+
"Request", "OpenerDirector", "BaseHandler",
29+
"HTTPDefaultErrorHandler", "HTTPRedirectHandler",
30+
"HTTPCookieProcessor", "ProxyHandler",
31+
"HTTPPasswordMgr",
32+
"HTTPPasswordMgrWithDefaultRealm",
33+
"AbstractBasicAuthHandler",
34+
"HTTPBasicAuthHandler", "ProxyBasicAuthHandler",
35+
"AbstractDigestAuthHandler",
36+
"HTTPDigestAuthHandler", "ProxyDigestAuthHandler",
37+
"HTTPHandler", "HTTPSHandler", "FileHandler",
38+
"FTPHandler", "CacheFTPHandler",
39+
"UnknownHandler"]),
40+
("urllib.error",
41+
["URLError", "HTTPError"]),
4142
]
4243
}
4344

@@ -78,7 +79,7 @@ def transform_import(self, node, results):
7879
import name with a comma separated list of its
7980
replacements.
8081
"""
81-
import_mod = results.get('module')
82+
import_mod = results.get("module")
8283
pref = import_mod.prefix
8384

8485
names = []
@@ -94,9 +95,9 @@ def transform_member(self, node, results):
9495
the module to be imported from with the appropriate new
9596
module.
9697
"""
97-
mod_member = results.get('mod_member')
98+
mod_member = results.get("mod_member")
9899
pref = mod_member.prefix
99-
member = results.get('member')
100+
member = results.get("member")
100101

101102
# Simple case with only a single member being imported
102103
if member:
@@ -111,19 +112,18 @@ def transform_member(self, node, results):
111112
if new_name:
112113
mod_member.replace(Name(new_name, prefix=pref))
113114
else:
114-
self.cannot_convert(node,
115-
'This is an invalid module element')
115+
self.cannot_convert(node, "This is an invalid module element")
116116

117117
# Multiple members being imported
118118
else:
119119
# a dictionary for replacements, order matters
120120
modules = []
121121
mod_dict = {}
122-
members = results.get('members')
122+
members = results["members"]
123123
for member in members:
124124
member = member.value
125125
# we only care about the actual members
126-
if member != ',':
126+
if member != ",":
127127
for change in MAPPING[mod_member.value]:
128128
if member in change[1]:
129129
if change[0] in mod_dict:
@@ -133,26 +133,32 @@ def transform_member(self, node, results):
133133
modules.append(change[0])
134134

135135
new_nodes = []
136+
indentation = find_indentation(node)
137+
first = True
136138
for module in modules:
137139
elts = mod_dict[module]
138140
names = []
139141
for elt in elts[:-1]:
140142
names.extend([Name(elt, prefix=pref), Comma()])
141143
names.append(Name(elts[-1], prefix=pref))
142-
new_nodes.append(FromImport(module, names))
144+
new = FromImport(module, names)
145+
if not first or node.parent.prefix.endswith(indentation):
146+
new.prefix = indentation
147+
new_nodes.append(new)
148+
first = False
143149
if new_nodes:
144150
nodes = []
145151
for new_node in new_nodes[:-1]:
146152
nodes.extend([new_node, Newline()])
147153
nodes.append(new_nodes[-1])
148154
node.replace(nodes)
149155
else:
150-
self.cannot_convert(node, 'All module elements are invalid')
156+
self.cannot_convert(node, "All module elements are invalid")
151157

152158
def transform_dot(self, node, results):
153159
"""Transform for calls to module members in code."""
154-
module_dot = results.get('bare_with_attr')
155-
member = results.get('member')
160+
module_dot = results.get("bare_with_attr")
161+
member = results.get("member")
156162
new_name = None
157163
if isinstance(member, list):
158164
member = member[0]
@@ -164,17 +170,17 @@ def transform_dot(self, node, results):
164170
module_dot.replace(Name(new_name,
165171
prefix=module_dot.prefix))
166172
else:
167-
self.cannot_convert(node, 'This is an invalid module element')
173+
self.cannot_convert(node, "This is an invalid module element")
168174

169175
def transform(self, node, results):
170-
if results.get('module'):
176+
if results.get("module"):
171177
self.transform_import(node, results)
172-
elif results.get('mod_member'):
178+
elif results.get("mod_member"):
173179
self.transform_member(node, results)
174-
elif results.get('bare_with_attr'):
180+
elif results.get("bare_with_attr"):
175181
self.transform_dot(node, results)
176182
# Renaming and star imports are not supported for these modules.
177-
elif results.get('module_star'):
178-
self.cannot_convert(node, 'Cannot handle star imports.')
179-
elif results.get('module_as'):
180-
self.cannot_convert(node, 'This module is now multiple modules')
183+
elif results.get("module_star"):
184+
self.cannot_convert(node, "Cannot handle star imports.")
185+
elif results.get("module_as"):
186+
self.cannot_convert(node, "This module is now multiple modules")

Lib/lib2to3/pytree.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ def pre_order(self):
286286
"""Return a pre-order iterator for the tree."""
287287
yield self
288288
for child in self.children:
289-
for node in child.post_order():
289+
for node in child.pre_order():
290290
yield node
291291

292292
def _prefix_getter(self):

0 commit comments

Comments
 (0)