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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
45906
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
1 #!/usr/bin/env python2.5
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
2 # Copyright 2006 Google, Inc. All Rights Reserved.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
3 # Licensed to PSF under a Contributor Agreement.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
4
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
5 """Refactoring framework.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
6
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
7 Used as a main program, this can refactor any number of files and/or
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
8 recursively descend down directories. Imported as a module, this
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
9 provides infrastructure to write your own refactoring tool.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
10 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
11
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
12 __author__ = "Guido van Rossum <guido@python.org>"
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
13
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
14
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
15 # Python imports
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
16 import os
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
17 import sys
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
18 import difflib
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
23
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
26
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
27 from . import pytree
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
28 from . import patcomp
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
29 from . import fixes
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
30 from . import pygram
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
31
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
43 return fix_names
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
113 class RefactoringTool(object):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
121 """Initializer.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
133 self.errors = []
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
134 self.logger = logging.getLogger("RefactoringTool")
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
138 del pygram.python_grammar.keywords["print"]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
139 self.driver = driver.Driver(pygram.python_grammar,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
140 convert=pytree.convert,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
141 logger=self.logger)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
147 self.files = [] # List of files that were or should be modified
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
148
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
149 def get_fixers(self):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
152 Returns:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
153 (pre_order, post_order), where pre_order is the list of fixers that
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
154 want a pre-order AST traversal, and post_order is the list that want
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
155 post-order traversal.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
156 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
157 pre_order_fixers = []
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
166 try:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
167 fix_class = getattr(mod, class_name)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
173 self.log_message("Skipping implicit fixer: %s", fix_name)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
174 continue
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
177 if fixer.order == "pre":
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
178 pre_order_fixers.append(fixer)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
179 elif fixer.order == "post":
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
180 post_order_fixers.append(fixer)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
187 return (pre_order_fixers, post_order_fixers)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
188
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
192
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
193 def log_message(self, msg, *args):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
194 """Hook to log a message."""
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
195 if args:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
196 msg = msg % args
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
197 self.logger.info(msg)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
217 """Descends down a directory and refactor every Python file found.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
218
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
219 Python files are assumed to have a .py extension.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
220
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
221 Files and subdirectories starting with '.' are skipped.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
225 dirnames.sort()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
226 filenames.sort()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
227 for name in filenames:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
228 if not name.startswith(".") and name.endswith("py"):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
231 # Modify dirnames in-place to remove subdirs with leading dots
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
232 dirnames[:] = [dn for dn in dirnames if not dn.startswith(".")]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
240 except IOError, err:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
245 finally:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
259 output = self.refactor_docstring(input, filename)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
264 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
265 tree = self.refactor_string(input, filename)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
266 if tree and tree.was_changed:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
272
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
273 def refactor_string(self, data, name):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
276 Args:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
277 data: a string holding the code to be refactored.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
280 Returns:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
281 An AST corresponding to the refactored input stream; None if
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
282 there were errors during the parse.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
283 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
286 except Exception, err:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
287 self.log_error("Can't parse %s: %s: %s",
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
288 name, err.__class__.__name__, err)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
291 self.refactor_tree(tree, name)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
292 return tree
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
298 output = self.refactor_docstring(input, "<stdin>")
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
303 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
304 tree = self.refactor_string(input, "<stdin>")
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
309
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
310 def refactor_tree(self, tree, name):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
313 Args:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
314 tree: a pytree.Node instance representing the root of the tree
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
315 to be refactored.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
318 Returns:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
319 True if the tree was modified, False otherwise.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
322 fixer.start_tree(tree, name)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
328 fixer.finish_tree(tree, name)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
329 return tree.was_changed
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
330
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
331 def traverse_by(self, fixers, traversal):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
336 Args:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
337 fixers: a list of fixer instances.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
340 Returns:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
341 None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
342 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
343 if not fixers:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
344 return
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
347 results = fixer.match(node)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
348 if results:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
349 new = fixer.transform(node, results)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
350 if new is not None and (new != node or
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
351 str(new) != str(node)):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
352 node.replace(new)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
353 node = new
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
359 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
360 self.files.append(filename)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
364 return
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
383 except os.error, err:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
384 self.log_error("Can't create %s: %s", filename, err)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
385 return
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
390 finally:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
394
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
395 PS1 = ">>> "
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
396 PS2 = "... "
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
397
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
398 def refactor_docstring(self, input, filename):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
399 """Refactors a docstring, looking for doctests.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
400
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
401 This returns a modified version of the input string. It looks
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
402 for doctests, which start with a ">>>" prompt, and may be
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
403 continued with "..." prompts, as long as the "..." is indented
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
404 the same as the ">>>".
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
405
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
406 (Unfortunately we can't use the doctest module's parser,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
407 since, like most parsers, it is not geared towards preserving
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
408 the original source.)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
409 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
410 result = []
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
411 block = None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
412 block_lineno = None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
413 indent = None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
414 lineno = 0
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
415 for line in input.splitlines(True):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
416 lineno += 1
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
417 if line.lstrip().startswith(self.PS1):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
418 if block is not None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
419 result.extend(self.refactor_doctest(block, block_lineno,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
420 indent, filename))
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
421 block_lineno = lineno
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
422 block = [line]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
423 i = line.find(self.PS1)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
424 indent = line[:i]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
425 elif (indent is not None and
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
428 block.append(line)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
429 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
430 if block is not None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
431 result.extend(self.refactor_doctest(block, block_lineno,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
432 indent, filename))
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
433 block = None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
434 indent = None
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
435 result.append(line)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
436 if block is not None:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
437 result.extend(self.refactor_doctest(block, block_lineno,
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
440
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
441 def refactor_doctest(self, block, lineno, indent, filename):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
442 """Refactors one doctest.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
443
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
444 A doctest is given as a block of lines, the first of which starts
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
445 with ">>>" (possibly indented), while the remaining lines start
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
446 with "..." (identically indented).
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
447
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
448 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
449 try:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
450 tree = self.parse_block(block, lineno, indent)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
455 self.log_error("Can't parse docstring in %s line %s: %s: %s",
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
456 filename, lineno, err.__class__.__name__, err)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
457 return block
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
458 if self.refactor_tree(tree, filename):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
459 new = str(tree).splitlines(True)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
460 # Undo the adjustment of the line numbers in wrap_toks() below.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
465 block = [indent + self.PS1 + new.pop(0)]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
466 if new:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
467 block += [indent + self.PS2 + line for line in new]
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
468 return block
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
469
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
472 were = "were"
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
473 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
474 were = "need to be"
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
475 if not self.files:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
476 self.log_message("No files %s modified.", were)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
477 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
478 self.log_message("Files that %s modified:", were)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
479 for file in self.files:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
480 self.log_message(file)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
481 if self.fixer_log:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
482 self.log_message("Warnings/messages while refactoring:")
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
483 for message in self.fixer_log:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
484 self.log_message(message)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
485 if self.errors:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
486 if len(self.errors) == 1:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
487 self.log_message("There was 1 error:")
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
488 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
489 self.log_message("There were %d errors:", len(self.errors))
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
490 for msg, args, kwds in self.errors:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
491 self.log_message(msg, *args, **kwds)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
492
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
493 def parse_block(self, block, lineno, indent):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
494 """Parses a block into a tree.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
495
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
496 This is necessary to get correct line number / offset information
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
497 in the parser diagnostics and embedded into the parse tree.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
498 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
499 return self.driver.parse_tokens(self.wrap_toks(block, lineno, indent))
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
500
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
501 def wrap_toks(self, block, lineno, indent):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
502 """Wraps a tokenize stream to systematically modify start/end."""
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
503 tokens = tokenize.generate_tokens(self.gen_lines(block, indent).next)
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
504 for type, value, (line0, col0), (line1, col1), line_text in tokens:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
505 line0 += lineno - 1
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
506 line1 += lineno - 1
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
507 # Don't bother updating the columns; this is too complicated
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
508 # since line_text would also have to be updated and it would
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
509 # still break for tokens spanning lines. Let the user guess
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
510 # that the column numbers for doctests are relative to the
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
511 # end of the prompt string (PS1 or PS2).
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
512 yield type, value, (line0, col0), (line1, col1), line_text
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
513
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
514
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
515 def gen_lines(self, block, indent):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
516 """Generates lines as expected by tokenize from a list of lines.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
517
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
518 This strips the first len(indent + self.PS1) characters off each line.
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
519 """
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
520 prefix1 = indent + self.PS1
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
521 prefix2 = indent + self.PS2
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
522 prefix = prefix1
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
523 for line in block:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
524 if line.startswith(prefix):
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
528 else:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
529 raise AssertionError("line=%r, prefix=%r" % (line, prefix))
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
530 prefix = prefix2
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
531 while True:
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
532 yield ""
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
533
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
594 a = a.splitlines()
302625fa6a2a Import lib2to3.
Martin v. Löwis <martin@v.loewis.de>
parents:
diff changeset
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="")