Mercurial > cpython-lru_cache-weakref
annotate Lib/lib2to3/refactor.py @ 54294:dba767bc3155 legacy-trunk
remove mention of old ctypes version
| author | Benjamin Peterson <benjamin@python.org> |
|---|---|
| date | Sat, 23 May 2009 20:59:09 +0000 |
| parents | 119e4323400d |
| children | 7700408f65fc |
| rev | line source |
|---|---|
| 45906 | 1 #!/usr/bin/env python2.5 |
| 2 # Copyright 2006 Google, Inc. All Rights Reserved. | |
| 3 # Licensed to PSF under a Contributor Agreement. | |
| 4 | |
| 5 """Refactoring framework. | |
| 6 | |
| 7 Used as a main program, this can refactor any number of files and/or | |
| 8 recursively descend down directories. Imported as a module, this | |
| 9 provides infrastructure to write your own refactoring tool. | |
| 10 """ | |
| 11 | |
| 12 __author__ = "Guido van Rossum <guido@python.org>" | |
| 13 | |
| 14 | |
| 15 # Python imports | |
| 16 import os | |
| 17 import sys | |
| 18 import difflib | |
| 19 import logging | |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
20 import operator |
|
46628
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
21 from collections import defaultdict |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
22 from itertools import chain |
| 45906 | 23 |
| 24 # Local imports | |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
25 from .pgen2 import driver, tokenize |
| 45906 | 26 |
| 27 from . import pytree | |
| 28 from . import patcomp | |
| 29 from . import fixes | |
| 30 from . import pygram | |
| 31 | |
| 32 | |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
33 def get_all_fix_names(fixer_pkg, remove_prefix=True): |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
34 """Return a sorted list of all available fix names in the given package.""" |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
35 pkg = __import__(fixer_pkg, [], [], ["*"]) |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
36 fixer_dir = os.path.dirname(pkg.__file__) |
| 45906 | 37 fix_names = [] |
|
49677
82ccc7e77ec5
Merged revisions 66801,66803-66804,66813,66854-66856,66866,66870-66872,66874,66887,66903,66905,66911,66913,66927,66932,66938,66942,66962,66964,66973-66974,66977,66992,66998-66999,67002,67005,67007,67028,67040-67041,67044,67070,67089,67091,67101,67117-67119,67123-67124 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49314
diff
changeset
|
38 for name in sorted(os.listdir(fixer_dir)): |
| 45906 | 39 if name.startswith("fix_") and name.endswith(".py"): |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
40 if remove_prefix: |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
41 name = name[4:] |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
42 fix_names.append(name[:-3]) |
| 45906 | 43 return fix_names |
| 44 | |
|
46628
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
45 def get_head_types(pat): |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
46 """ Accepts a pytree Pattern Node and returns a set |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
47 of the pattern types which will match first. """ |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
48 |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
49 if isinstance(pat, (pytree.NodePattern, pytree.LeafPattern)): |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
50 # NodePatters must either have no type and no content |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
51 # or a type and content -- so they don't get any farther |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
52 # Always return leafs |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
53 return set([pat.type]) |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
54 |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
55 if isinstance(pat, pytree.NegatedPattern): |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
56 if pat.content: |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
57 return get_head_types(pat.content) |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
58 return set([None]) # Negated Patterns don't have a type |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
59 |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
60 if isinstance(pat, pytree.WildcardPattern): |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
61 # Recurse on each node in content |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
62 r = set() |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
63 for p in pat.content: |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
64 for x in p: |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
65 r.update(get_head_types(x)) |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
66 return r |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
67 |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
68 raise Exception("Oh no! I don't understand pattern %s" %(pat)) |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
69 |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
70 def get_headnode_dict(fixer_list): |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
71 """ Accepts a list of fixers and returns a dictionary |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
72 of head node type --> fixer list. """ |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
73 head_nodes = defaultdict(list) |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
74 for fixer in fixer_list: |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
75 if not fixer.pattern: |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
76 head_nodes[None].append(fixer) |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
77 continue |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
78 for t in get_head_types(fixer.pattern): |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
79 head_nodes[t].append(fixer) |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
80 return head_nodes |
|
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
81 |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
82 def get_fixers_from_package(pkg_name): |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
83 """ |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
84 Return the fully qualified names for fixers in the package pkg_name. |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
85 """ |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
86 return [pkg_name + "." + fix_name |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
87 for fix_name in get_all_fix_names(pkg_name, False)] |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
88 |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
89 def _identity(obj): |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
90 return obj |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
91 |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
92 if sys.version_info < (3, 0): |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
93 import codecs |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
94 _open_with_encoding = codecs.open |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
95 # codecs.open doesn't translate newlines sadly. |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
96 def _from_system_newlines(input): |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
97 return input.replace(u"\r\n", u"\n") |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
98 def _to_system_newlines(input): |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
99 if os.linesep != "\n": |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
100 return input.replace(u"\n", os.linesep) |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
101 else: |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
102 return input |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
103 else: |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
104 _open_with_encoding = open |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
105 _from_system_newlines = _identity |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
106 _to_system_newlines = _identity |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
107 |
| 45906 | 108 |
|
49314
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
109 class FixerError(Exception): |
|
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
110 """A fixer could not be loaded.""" |
|
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
111 |
|
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
112 |
| 45906 | 113 class RefactoringTool(object): |
| 114 | |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
115 _default_options = {"print_function": False} |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
116 |
|
49314
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
117 CLASS_PREFIX = "Fix" # The prefix for fixer classes |
|
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
118 FILE_PREFIX = "fix_" # The prefix for modules with a fixer within |
|
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
119 |
|
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
120 def __init__(self, fixer_names, options=None, explicit=None): |
| 45906 | 121 """Initializer. |
| 122 | |
|
47725
991caad81a2d
Merged revisions 63661,63666,63695,63711,63729,63769,63790,63880,63886 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
46628
diff
changeset
|
123 Args: |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
124 fixer_names: a list of fixers to import |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
125 options: an dict with configuration. |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
126 explicit: a list of fixers to run even if they are explicit. |
| 45906 | 127 """ |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
128 self.fixers = fixer_names |
|
49314
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
129 self.explicit = explicit or [] |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
130 self.options = self._default_options.copy() |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
131 if options is not None: |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
132 self.options.update(options) |
| 45906 | 133 self.errors = [] |
| 134 self.logger = logging.getLogger("RefactoringTool") | |
| 135 self.fixer_log = [] | |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
136 self.wrote = False |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
137 if self.options["print_function"]: |
| 45906 | 138 del pygram.python_grammar.keywords["print"] |
| 139 self.driver = driver.Driver(pygram.python_grammar, | |
| 140 convert=pytree.convert, | |
| 141 logger=self.logger) | |
| 142 self.pre_order, self.post_order = self.get_fixers() | |
|
46628
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
143 |
|
50198
21d3357dcbec
Merged revisions 67806 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49885
diff
changeset
|
144 self.pre_order_heads = get_headnode_dict(self.pre_order) |
|
21d3357dcbec
Merged revisions 67806 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49885
diff
changeset
|
145 self.post_order_heads = get_headnode_dict(self.post_order) |
|
46628
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
146 |
| 45906 | 147 self.files = [] # List of files that were or should be modified |
| 148 | |
| 149 def get_fixers(self): | |
| 150 """Inspects the options to load the requested patterns and handlers. | |
|
45909
a9855db40ffb
Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45906
diff
changeset
|
151 |
| 45906 | 152 Returns: |
| 153 (pre_order, post_order), where pre_order is the list of fixers that | |
| 154 want a pre-order AST traversal, and post_order is the list that want | |
| 155 post-order traversal. | |
| 156 """ | |
| 157 pre_order_fixers = [] | |
| 158 post_order_fixers = [] | |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
159 for fix_mod_path in self.fixers: |
|
49314
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
160 mod = __import__(fix_mod_path, {}, {}, ["*"]) |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
161 fix_name = fix_mod_path.rsplit(".", 1)[-1] |
|
49314
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
162 if fix_name.startswith(self.FILE_PREFIX): |
|
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
163 fix_name = fix_name[len(self.FILE_PREFIX):] |
| 45906 | 164 parts = fix_name.split("_") |
|
49314
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
165 class_name = self.CLASS_PREFIX + "".join([p.title() for p in parts]) |
| 45906 | 166 try: |
| 167 fix_class = getattr(mod, class_name) | |
| 168 except AttributeError: | |
|
49314
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
169 raise FixerError("Can't find %s.%s" % (fix_name, class_name)) |
|
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
170 fixer = fix_class(self.options, self.fixer_log) |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
171 if fixer.explicit and self.explicit is not True and \ |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
172 fix_mod_path not in self.explicit: |
| 45906 | 173 self.log_message("Skipping implicit fixer: %s", fix_name) |
| 174 continue | |
| 175 | |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
176 self.log_debug("Adding transformation: %s", fix_name) |
| 45906 | 177 if fixer.order == "pre": |
| 178 pre_order_fixers.append(fixer) | |
| 179 elif fixer.order == "post": | |
| 180 post_order_fixers.append(fixer) | |
| 181 else: | |
|
49314
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
182 raise FixerError("Illegal fixer order: %r" % fixer.order) |
|
45992
e47c3c7bbddc
Merged revisions 61602-61723 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45909
diff
changeset
|
183 |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
184 key_func = operator.attrgetter("run_order") |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
185 pre_order_fixers.sort(key=key_func) |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
186 post_order_fixers.sort(key=key_func) |
| 45906 | 187 return (pre_order_fixers, post_order_fixers) |
| 188 | |
| 189 def log_error(self, msg, *args, **kwds): | |
|
49314
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
190 """Called when an error occurs.""" |
|
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
191 raise |
| 45906 | 192 |
| 193 def log_message(self, msg, *args): | |
| 194 """Hook to log a message.""" | |
| 195 if args: | |
| 196 msg = msg % args | |
| 197 self.logger.info(msg) | |
| 198 | |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
199 def log_debug(self, msg, *args): |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
200 if args: |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
201 msg = msg % args |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
202 self.logger.debug(msg) |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
203 |
|
49314
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
204 def print_output(self, lines): |
|
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
205 """Called with lines of output to give to the user.""" |
|
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
206 pass |
|
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
207 |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
208 def refactor(self, items, write=False, doctests_only=False): |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
209 """Refactor a list of files and directories.""" |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
210 for dir_or_file in items: |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
211 if os.path.isdir(dir_or_file): |
|
49314
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
212 self.refactor_dir(dir_or_file, write, doctests_only) |
| 45906 | 213 else: |
|
49314
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
214 self.refactor_file(dir_or_file, write, doctests_only) |
| 45906 | 215 |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
216 def refactor_dir(self, dir_name, write=False, doctests_only=False): |
| 45906 | 217 """Descends down a directory and refactor every Python file found. |
| 218 | |
| 219 Python files are assumed to have a .py extension. | |
| 220 | |
| 221 Files and subdirectories starting with '.' are skipped. | |
| 222 """ | |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
223 for dirpath, dirnames, filenames in os.walk(dir_name): |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
224 self.log_debug("Descending into %s", dirpath) |
| 45906 | 225 dirnames.sort() |
| 226 filenames.sort() | |
| 227 for name in filenames: | |
| 228 if not name.startswith(".") and name.endswith("py"): | |
| 229 fullname = os.path.join(dirpath, name) | |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
230 self.refactor_file(fullname, write, doctests_only) |
| 45906 | 231 # Modify dirnames in-place to remove subdirs with leading dots |
| 232 dirnames[:] = [dn for dn in dirnames if not dn.startswith(".")] | |
| 233 | |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
234 def _read_python_source(self, filename): |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
235 """ |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
236 Do our best to decode a Python source file correctly. |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
237 """ |
| 45906 | 238 try: |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
239 f = open(filename, "rb") |
| 45906 | 240 except IOError, err: |
| 241 self.log_error("Can't open %s: %s", filename, err) | |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
242 return None, None |
| 45906 | 243 try: |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
244 encoding = tokenize.detect_encoding(f.readline)[0] |
| 45906 | 245 finally: |
| 246 f.close() | |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
247 with _open_with_encoding(filename, "r", encoding=encoding) as f: |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
248 return _from_system_newlines(f.read()), encoding |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
249 |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
250 def refactor_file(self, filename, write=False, doctests_only=False): |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
251 """Refactors a file.""" |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
252 input, encoding = self._read_python_source(filename) |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
253 if input is None: |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
254 # Reading the file failed. |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
255 return |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
256 input += u"\n" # Silence certain parse errors |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
257 if doctests_only: |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
258 self.log_debug("Refactoring doctests in %s", filename) |
| 45906 | 259 output = self.refactor_docstring(input, filename) |
| 260 if output != input: | |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
261 self.processed_file(output, filename, input, write, encoding) |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
262 else: |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
263 self.log_debug("No doctest changes in %s", filename) |
| 45906 | 264 else: |
| 265 tree = self.refactor_string(input, filename) | |
| 266 if tree and tree.was_changed: | |
| 267 # The [:-1] is to take off the \n we added earlier | |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
268 self.processed_file(unicode(tree)[:-1], filename, |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
269 write=write, encoding=encoding) |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
270 else: |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
271 self.log_debug("No changes in %s", filename) |
| 45906 | 272 |
| 273 def refactor_string(self, data, name): | |
| 274 """Refactor a given input string. | |
|
45909
a9855db40ffb
Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45906
diff
changeset
|
275 |
| 45906 | 276 Args: |
| 277 data: a string holding the code to be refactored. | |
| 278 name: a human-readable name for use in error/log messages. | |
|
45909
a9855db40ffb
Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45906
diff
changeset
|
279 |
| 45906 | 280 Returns: |
| 281 An AST corresponding to the refactored input stream; None if | |
| 282 there were errors during the parse. | |
| 283 """ | |
| 284 try: | |
|
49677
82ccc7e77ec5
Merged revisions 66801,66803-66804,66813,66854-66856,66866,66870-66872,66874,66887,66903,66905,66911,66913,66927,66932,66938,66942,66962,66964,66973-66974,66977,66992,66998-66999,67002,67005,67007,67028,67040-67041,67044,67070,67089,67091,67101,67117-67119,67123-67124 via svnmerge from
Georg Brandl <georg@python.org>
parents:
49314
diff
changeset
|
285 tree = self.driver.parse_string(data) |
| 45906 | 286 except Exception, err: |
| 287 self.log_error("Can't parse %s: %s: %s", | |
| 288 name, err.__class__.__name__, err) | |
| 289 return | |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
290 self.log_debug("Refactoring %s", name) |
| 45906 | 291 self.refactor_tree(tree, name) |
| 292 return tree | |
| 293 | |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
294 def refactor_stdin(self, doctests_only=False): |
| 45906 | 295 input = sys.stdin.read() |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
296 if doctests_only: |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
297 self.log_debug("Refactoring doctests in stdin") |
| 45906 | 298 output = self.refactor_docstring(input, "<stdin>") |
| 299 if output != input: | |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
300 self.processed_file(output, "<stdin>", input) |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
301 else: |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
302 self.log_debug("No doctest changes in stdin") |
| 45906 | 303 else: |
| 304 tree = self.refactor_string(input, "<stdin>") | |
| 305 if tree and tree.was_changed: | |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
306 self.processed_file(str(tree), "<stdin>", input) |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
307 else: |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
308 self.log_debug("No changes in stdin") |
| 45906 | 309 |
| 310 def refactor_tree(self, tree, name): | |
| 311 """Refactors a parse tree (modifying the tree in place). | |
|
45909
a9855db40ffb
Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45906
diff
changeset
|
312 |
| 45906 | 313 Args: |
| 314 tree: a pytree.Node instance representing the root of the tree | |
| 315 to be refactored. | |
| 316 name: a human-readable name for this tree. | |
|
45909
a9855db40ffb
Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45906
diff
changeset
|
317 |
| 45906 | 318 Returns: |
| 319 True if the tree was modified, False otherwise. | |
| 320 """ | |
|
50487
a92f71d46dc4
Merged revisions 68197 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50198
diff
changeset
|
321 for fixer in chain(self.pre_order, self.post_order): |
| 45906 | 322 fixer.start_tree(tree, name) |
| 323 | |
|
50198
21d3357dcbec
Merged revisions 67806 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49885
diff
changeset
|
324 self.traverse_by(self.pre_order_heads, tree.pre_order()) |
|
21d3357dcbec
Merged revisions 67806 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49885
diff
changeset
|
325 self.traverse_by(self.post_order_heads, tree.post_order()) |
| 45906 | 326 |
|
50487
a92f71d46dc4
Merged revisions 68197 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50198
diff
changeset
|
327 for fixer in chain(self.pre_order, self.post_order): |
| 45906 | 328 fixer.finish_tree(tree, name) |
| 329 return tree.was_changed | |
| 330 | |
| 331 def traverse_by(self, fixers, traversal): | |
| 332 """Traverse an AST, applying a set of fixers to each node. | |
|
45909
a9855db40ffb
Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45906
diff
changeset
|
333 |
| 45906 | 334 This is a helper method for refactor_tree(). |
|
45909
a9855db40ffb
Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45906
diff
changeset
|
335 |
| 45906 | 336 Args: |
| 337 fixers: a list of fixer instances. | |
| 338 traversal: a generator that yields AST nodes. | |
|
45909
a9855db40ffb
Merged revisions 61598-61599,61601 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
45906
diff
changeset
|
339 |
| 45906 | 340 Returns: |
| 341 None | |
| 342 """ | |
| 343 if not fixers: | |
| 344 return | |
| 345 for node in traversal: | |
|
46628
1ffec2a687e9
Merged revisions 62263-62646 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents:
46191
diff
changeset
|
346 for fixer in fixers[node.type] + fixers[None]: |
| 45906 | 347 results = fixer.match(node) |
| 348 if results: | |
| 349 new = fixer.transform(node, results) | |
| 350 if new is not None and (new != node or | |
| 351 str(new) != str(node)): | |
| 352 node.replace(new) | |
| 353 node = new | |
| 354 | |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
355 def processed_file(self, new_text, filename, old_text=None, write=False, |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
356 encoding=None): |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
357 """ |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
358 Called when a file has been refactored, and there are changes. |
| 45906 | 359 """ |
| 360 self.files.append(filename) | |
| 361 if old_text is None: | |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
362 old_text = self._read_python_source(filename)[0] |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
363 if old_text is None: |
| 45906 | 364 return |
| 365 if old_text == new_text: | |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
366 self.log_debug("No changes to %s", filename) |
| 45906 | 367 return |
|
49314
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
368 self.print_output(diff_texts(old_text, new_text, filename)) |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
369 if write: |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
370 self.write_file(new_text, filename, old_text, encoding) |
|
49314
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
371 else: |
|
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
372 self.log_debug("Not writing changes to %s", filename) |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
373 |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
374 def write_file(self, new_text, filename, old_text, encoding=None): |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
375 """Writes a string to a file. |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
376 |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
377 It first shows a unified diff between the old text and the new text, and |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
378 then rewrites the file; the latter is only done if the write option is |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
379 set. |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
380 """ |
| 45906 | 381 try: |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
382 f = _open_with_encoding(filename, "w", encoding=encoding) |
| 45906 | 383 except os.error, err: |
| 384 self.log_error("Can't create %s: %s", filename, err) | |
| 385 return | |
| 386 try: | |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
387 f.write(_to_system_newlines(new_text)) |
|
49702
2b3340b5ca38
Merged revisions 67180 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49677
diff
changeset
|
388 except os.error, err: |
|
2b3340b5ca38
Merged revisions 67180 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
49677
diff
changeset
|
389 self.log_error("Can't write %s: %s", filename, err) |
| 45906 | 390 finally: |
| 391 f.close() | |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
392 self.log_debug("Wrote changes to %s", filename) |
|
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
393 self.wrote = True |
| 45906 | 394 |
| 395 PS1 = ">>> " | |
| 396 PS2 = "... " | |
| 397 | |
| 398 def refactor_docstring(self, input, filename): | |
| 399 """Refactors a docstring, looking for doctests. | |
| 400 | |
| 401 This returns a modified version of the input string. It looks | |
| 402 for doctests, which start with a ">>>" prompt, and may be | |
| 403 continued with "..." prompts, as long as the "..." is indented | |
| 404 the same as the ">>>". | |
| 405 | |
| 406 (Unfortunately we can't use the doctest module's parser, | |
| 407 since, like most parsers, it is not geared towards preserving | |
| 408 the original source.) | |
| 409 """ | |
| 410 result = [] | |
| 411 block = None | |
| 412 block_lineno = None | |
| 413 indent = None | |
| 414 lineno = 0 | |
| 415 for line in input.splitlines(True): | |
| 416 lineno += 1 | |
| 417 if line.lstrip().startswith(self.PS1): | |
| 418 if block is not None: | |
| 419 result.extend(self.refactor_doctest(block, block_lineno, | |
| 420 indent, filename)) | |
| 421 block_lineno = lineno | |
| 422 block = [line] | |
| 423 i = line.find(self.PS1) | |
| 424 indent = line[:i] | |
| 425 elif (indent is not None and | |
| 426 (line.startswith(indent + self.PS2) or | |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
427 line == indent + self.PS2.rstrip() + u"\n")): |
| 45906 | 428 block.append(line) |
| 429 else: | |
| 430 if block is not None: | |
| 431 result.extend(self.refactor_doctest(block, block_lineno, | |
| 432 indent, filename)) | |
| 433 block = None | |
| 434 indent = None | |
| 435 result.append(line) | |
| 436 if block is not None: | |
| 437 result.extend(self.refactor_doctest(block, block_lineno, | |
| 438 indent, filename)) | |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
439 return u"".join(result) |
| 45906 | 440 |
| 441 def refactor_doctest(self, block, lineno, indent, filename): | |
| 442 """Refactors one doctest. | |
| 443 | |
| 444 A doctest is given as a block of lines, the first of which starts | |
| 445 with ">>>" (possibly indented), while the remaining lines start | |
| 446 with "..." (identically indented). | |
| 447 | |
| 448 """ | |
| 449 try: | |
| 450 tree = self.parse_block(block, lineno, indent) | |
| 451 except Exception, err: | |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
452 if self.log.isEnabledFor(logging.DEBUG): |
| 45906 | 453 for line in block: |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
454 self.log_debug("Source: %s", line.rstrip(u"\n")) |
| 45906 | 455 self.log_error("Can't parse docstring in %s line %s: %s: %s", |
| 456 filename, lineno, err.__class__.__name__, err) | |
| 457 return block | |
| 458 if self.refactor_tree(tree, filename): | |
| 459 new = str(tree).splitlines(True) | |
| 460 # Undo the adjustment of the line numbers in wrap_toks() below. | |
| 461 clipped, new = new[:lineno-1], new[lineno-1:] | |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
462 assert clipped == [u"\n"] * (lineno-1), clipped |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
463 if not new[-1].endswith(u"\n"): |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
464 new[-1] += u"\n" |
| 45906 | 465 block = [indent + self.PS1 + new.pop(0)] |
| 466 if new: | |
| 467 block += [indent + self.PS2 + line for line in new] | |
| 468 return block | |
| 469 | |
| 470 def summarize(self): | |
|
48975
e2edc1c11e50
Merged revisions 66173 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48933
diff
changeset
|
471 if self.wrote: |
| 45906 | 472 were = "were" |
| 473 else: | |
| 474 were = "need to be" | |
| 475 if not self.files: | |
| 476 self.log_message("No files %s modified.", were) | |
| 477 else: | |
| 478 self.log_message("Files that %s modified:", were) | |
| 479 for file in self.files: | |
| 480 self.log_message(file) | |
| 481 if self.fixer_log: | |
| 482 self.log_message("Warnings/messages while refactoring:") | |
| 483 for message in self.fixer_log: | |
| 484 self.log_message(message) | |
| 485 if self.errors: | |
| 486 if len(self.errors) == 1: | |
| 487 self.log_message("There was 1 error:") | |
| 488 else: | |
| 489 self.log_message("There were %d errors:", len(self.errors)) | |
| 490 for msg, args, kwds in self.errors: | |
| 491 self.log_message(msg, *args, **kwds) | |
| 492 | |
| 493 def parse_block(self, block, lineno, indent): | |
| 494 """Parses a block into a tree. | |
| 495 | |
| 496 This is necessary to get correct line number / offset information | |
| 497 in the parser diagnostics and embedded into the parse tree. | |
| 498 """ | |
| 499 return self.driver.parse_tokens(self.wrap_toks(block, lineno, indent)) | |
| 500 | |
| 501 def wrap_toks(self, block, lineno, indent): | |
| 502 """Wraps a tokenize stream to systematically modify start/end.""" | |
| 503 tokens = tokenize.generate_tokens(self.gen_lines(block, indent).next) | |
| 504 for type, value, (line0, col0), (line1, col1), line_text in tokens: | |
| 505 line0 += lineno - 1 | |
| 506 line1 += lineno - 1 | |
| 507 # Don't bother updating the columns; this is too complicated | |
| 508 # since line_text would also have to be updated and it would | |
| 509 # still break for tokens spanning lines. Let the user guess | |
| 510 # that the column numbers for doctests are relative to the | |
| 511 # end of the prompt string (PS1 or PS2). | |
| 512 yield type, value, (line0, col0), (line1, col1), line_text | |
| 513 | |
| 514 | |
| 515 def gen_lines(self, block, indent): | |
| 516 """Generates lines as expected by tokenize from a list of lines. | |
| 517 | |
| 518 This strips the first len(indent + self.PS1) characters off each line. | |
| 519 """ | |
| 520 prefix1 = indent + self.PS1 | |
| 521 prefix2 = indent + self.PS2 | |
| 522 prefix = prefix1 | |
| 523 for line in block: | |
| 524 if line.startswith(prefix): | |
| 525 yield line[len(prefix):] | |
|
53934
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
526 elif line == prefix.rstrip() + u"\n": |
|
119e4323400d
Merged revisions 72491-72493 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
53821
diff
changeset
|
527 yield u"\n" |
| 45906 | 528 else: |
| 529 raise AssertionError("line=%r, prefix=%r" % (line, prefix)) | |
| 530 prefix = prefix2 | |
| 531 while True: | |
| 532 yield "" | |
| 533 | |
| 534 | |
|
53821
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
535 class MultiprocessingUnsupported(Exception): |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
536 pass |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
537 |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
538 |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
539 class MultiprocessRefactoringTool(RefactoringTool): |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
540 |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
541 def __init__(self, *args, **kwargs): |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
542 super(MultiprocessRefactoringTool, self).__init__(*args, **kwargs) |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
543 self.queue = None |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
544 |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
545 def refactor(self, items, write=False, doctests_only=False, |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
546 num_processes=1): |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
547 if num_processes == 1: |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
548 return super(MultiprocessRefactoringTool, self).refactor( |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
549 items, write, doctests_only) |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
550 try: |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
551 import multiprocessing |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
552 except ImportError: |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
553 raise MultiprocessingUnsupported |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
554 if self.queue is not None: |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
555 raise RuntimeError("already doing multiple processes") |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
556 self.queue = multiprocessing.JoinableQueue() |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
557 processes = [multiprocessing.Process(target=self._child) |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
558 for i in xrange(num_processes)] |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
559 try: |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
560 for p in processes: |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
561 p.start() |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
562 super(MultiprocessRefactoringTool, self).refactor(items, write, |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
563 doctests_only) |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
564 finally: |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
565 self.queue.join() |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
566 for i in xrange(num_processes): |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
567 self.queue.put(None) |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
568 for p in processes: |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
569 if p.is_alive(): |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
570 p.join() |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
571 self.queue = None |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
572 |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
573 def _child(self): |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
574 task = self.queue.get() |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
575 while task is not None: |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
576 args, kwargs = task |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
577 try: |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
578 super(MultiprocessRefactoringTool, self).refactor_file( |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
579 *args, **kwargs) |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
580 finally: |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
581 self.queue.task_done() |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
582 task = self.queue.get() |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
583 |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
584 def refactor_file(self, *args, **kwargs): |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
585 if self.queue is not None: |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
586 self.queue.put((args, kwargs)) |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
587 else: |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
588 return super(MultiprocessRefactoringTool, self).refactor_file( |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
589 *args, **kwargs) |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
590 |
|
fb10b88afd40
Merged revisions 68503,68507,68694,69054,69673,69679-69681,70991,70999,71003,71695 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
50487
diff
changeset
|
591 |
| 45906 | 592 def diff_texts(a, b, filename): |
|
49314
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
593 """Return a unified diff of two strings.""" |
| 45906 | 594 a = a.splitlines() |
| 595 b = b.splitlines() | |
|
49314
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
596 return difflib.unified_diff(a, b, filename, filename, |
|
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
597 "(original)", "(refactored)", |
|
cdc7f636778b
Merged revisions 66511,66548-66549,66644,66646-66652 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
48977
diff
changeset
|
598 lineterm="") |
