annotate Tools/scripts/cleanfuture.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents fcfe324663a6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
59522
fcfe324663a6 convert shebang lines: python -> python3
Benjamin Peterson <benjamin@python.org>
parents: 42427
diff changeset
1 #! /usr/bin/env python3
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
2
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
3 """cleanfuture [-d][-r][-v] path ...
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
4
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
5 -d Dry run. Analyze, but don't make any changes to, files.
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
6 -r Recurse. Search for all .py files in subdirectories too.
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
7 -v Verbose. Print informative msgs.
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
8
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
9 Search Python (.py) files for future statements, and remove the features
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
10 from such statements that are already mandatory in the version of Python
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
11 you're using.
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
12
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
13 Pass one or more file and/or directory paths. When a directory path, all
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
14 .py files within the directory will be examined, and, if the -r option is
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
15 given, likewise recursively for subdirectories.
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
16
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
17 Overwrites files in place, renaming the originals with a .bak extension. If
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
18 cleanfuture finds nothing to change, the file is left alone. If cleanfuture
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
19 does change a file, the changed file is a fixed-point (i.e., running
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
20 cleanfuture on the resulting .py file won't change it again, at least not
19266
e9a97b02889b Fix typo in module docstring.
Tim Peters <tim.peters@gmail.com>
parents: 19202
diff changeset
21 until you try it again with a later Python release).
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
22
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
23 Limitations: You can do these things, but this tool won't help you then:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
24
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
25 + A future statement cannot be mixed with any other statement on the same
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
26 physical line (separated by semicolon).
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
27
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
28 + A future statement cannot contain an "as" clause.
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
29
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
30 Example: Assuming you're using Python 2.2, if a file containing
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
31
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
32 from __future__ import nested_scopes, generators
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
33
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
34 is analyzed by cleanfuture, the line is rewritten to
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
35
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
36 from __future__ import generators
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
37
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
38 because nested_scopes is no longer optional in 2.2 but generators is.
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
39 """
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
40
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
41 import __future__
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
42 import tokenize
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
43 import os
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
44 import sys
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
45
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
46 dryrun = 0
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
47 recurse = 0
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
48 verbose = 0
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
49
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
50 def errprint(*args):
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
51 strings = map(str, args)
19202
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
52 msg = ' '.join(strings)
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
53 if msg[-1:] != '\n':
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
54 msg += '\n'
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
55 sys.stderr.write(msg)
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
56
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
57 def main():
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
58 import getopt
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
59 global verbose, recurse, dryrun
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
60 try:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
61 opts, args = getopt.getopt(sys.argv[1:], "drv")
40587
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 19266
diff changeset
62 except getopt.error as msg:
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
63 errprint(msg)
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
64 return
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
65 for o, a in opts:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
66 if o == '-d':
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
67 dryrun += 1
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
68 elif o == '-r':
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
69 recurse += 1
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
70 elif o == '-v':
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
71 verbose += 1
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
72 if not args:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
73 errprint("Usage:", __doc__)
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
74 return
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
75 for arg in args:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
76 check(arg)
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
77
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
78 def check(file):
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
79 if os.path.isdir(file) and not os.path.islink(file):
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
80 if verbose:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 41501
diff changeset
81 print("listing directory", file)
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
82 names = os.listdir(file)
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
83 for name in names:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
84 fullname = os.path.join(file, name)
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
85 if ((recurse and os.path.isdir(fullname) and
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
86 not os.path.islink(fullname))
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
87 or name.lower().endswith(".py")):
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
88 check(fullname)
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
89 return
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
90
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
91 if verbose:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 41501
diff changeset
92 print("checking", file, "...", end=' ')
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
93 try:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
94 f = open(file)
40587
6b18a095c2e7 SF patch 1631942 by Collin Winter:
Guido van Rossum <guido@python.org>
parents: 19266
diff changeset
95 except IOError as msg:
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
96 errprint("%r: I/O Error: %s" % (file, str(msg)))
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
97 return
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
98
19202
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
99 ff = FutureFinder(f, file)
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
100 changed = ff.run()
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
101 if changed:
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
102 ff.gettherest()
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
103 f.close()
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
104 if changed:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
105 if verbose:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 41501
diff changeset
106 print("changed.")
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
107 if dryrun:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 41501
diff changeset
108 print("But this is a dry run, so leaving it alone.")
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
109 for s, e, line in changed:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 41501
diff changeset
110 print("%r lines %d-%d" % (file, s+1, e+1))
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
111 for i in range(s, e+1):
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 41501
diff changeset
112 print(ff.lines[i], end=' ')
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
113 if line is None:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 41501
diff changeset
114 print("-- deleted")
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
115 else:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 41501
diff changeset
116 print("-- change to:")
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 41501
diff changeset
117 print(line, end=' ')
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
118 if not dryrun:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
119 bak = file + ".bak"
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
120 if os.path.exists(bak):
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
121 os.remove(bak)
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
122 os.rename(file, bak)
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
123 if verbose:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 41501
diff changeset
124 print("renamed", file, "to", bak)
19202
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
125 g = open(file, "w")
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
126 ff.write(g)
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
127 g.close()
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
128 if verbose:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 41501
diff changeset
129 print("wrote new", file)
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
130 else:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
131 if verbose:
42427
46625e6122e9 Convert print statements to function calls in Tools/.
Collin Winter <collinw@gmail.com>
parents: 41501
diff changeset
132 print("unchanged.")
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
133
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
134 class FutureFinder:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
135
19202
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
136 def __init__(self, f, fname):
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
137 self.f = f
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
138 self.fname = fname
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
139 self.ateof = 0
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
140 self.lines = [] # raw file lines
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
141
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
142 # List of (start_index, end_index, new_line) triples.
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
143 self.changed = []
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
144
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
145 # Line-getter for tokenize.
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
146 def getline(self):
19202
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
147 if self.ateof:
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
148 return ""
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
149 line = self.f.readline()
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
150 if line == "":
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
151 self.ateof = 1
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
152 else:
19202
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
153 self.lines.append(line)
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
154 return line
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
155
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
156 def run(self):
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
157 STRING = tokenize.STRING
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
158 NL = tokenize.NL
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
159 NEWLINE = tokenize.NEWLINE
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
160 COMMENT = tokenize.COMMENT
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
161 NAME = tokenize.NAME
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
162 OP = tokenize.OP
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
163
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
164 changed = self.changed
41501
0c5019afc55b PEP 3114: rename .next() to .__next__() and add next() builtin.
Georg Brandl <georg@python.org>
parents: 40587
diff changeset
165 get = tokenize.generate_tokens(self.getline).__next__
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
166 type, token, (srow, scol), (erow, ecol), line = get()
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
167
19202
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
168 # Chew up initial comments and blank lines (if any).
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
169 while type in (COMMENT, NL, NEWLINE):
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
170 type, token, (srow, scol), (erow, ecol), line = get()
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
171
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
172 # Chew up docstring (if any -- and it may be implicitly catenated!).
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
173 while type is STRING:
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
174 type, token, (srow, scol), (erow, ecol), line = get()
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
175
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
176 # Analyze the future stmts.
19202
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
177 while 1:
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
178 # Chew up comments and blank lines (if any).
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
179 while type in (COMMENT, NL, NEWLINE):
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
180 type, token, (srow, scol), (erow, ecol), line = get()
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
181
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
182 if not (type is NAME and token == "from"):
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
183 break
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
184 startline = srow - 1 # tokenize is one-based
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
185 type, token, (srow, scol), (erow, ecol), line = get()
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
186
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
187 if not (type is NAME and token == "__future__"):
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
188 break
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
189 type, token, (srow, scol), (erow, ecol), line = get()
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
190
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
191 if not (type is NAME and token == "import"):
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
192 break
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
193 type, token, (srow, scol), (erow, ecol), line = get()
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
194
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
195 # Get the list of features.
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
196 features = []
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
197 while type is NAME:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
198 features.append(token)
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
199 type, token, (srow, scol), (erow, ecol), line = get()
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
200
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
201 if not (type is OP and token == ','):
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
202 break
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
203 type, token, (srow, scol), (erow, ecol), line = get()
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
204
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
205 # A trailing comment?
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
206 comment = None
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
207 if type is COMMENT:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
208 comment = token
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
209 type, token, (srow, scol), (erow, ecol), line = get()
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
210
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
211 if type is not NEWLINE:
19202
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
212 errprint("Skipping file %r; can't parse line %d:\n%s" %
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
213 (self.fname, srow, line))
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
214 return []
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
215
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
216 endline = srow - 1
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
217
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
218 # Check for obsolete features.
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
219 okfeatures = []
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
220 for f in features:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
221 object = getattr(__future__, f, None)
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
222 if object is None:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
223 # A feature we don't know about yet -- leave it in.
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
224 # They'll get a compile-time error when they compile
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
225 # this program, but that's not our job to sort out.
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
226 okfeatures.append(f)
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
227 else:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
228 released = object.getMandatoryRelease()
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
229 if released is None or released <= sys.version_info:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
230 # Withdrawn or obsolete.
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
231 pass
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
232 else:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
233 okfeatures.append(f)
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
234
19202
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
235 # Rewrite the line if at least one future-feature is obsolete.
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
236 if len(okfeatures) < len(features):
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
237 if len(okfeatures) == 0:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
238 line = None
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
239 else:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
240 line = "from __future__ import "
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
241 line += ', '.join(okfeatures)
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
242 if comment is not None:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
243 line += ' ' + comment
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
244 line += '\n'
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
245 changed.append((startline, endline, line))
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
246
19202
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
247 # Loop back for more future statements.
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
248
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
249 return changed
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
250
19202
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
251 def gettherest(self):
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
252 if self.ateof:
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
253 self.therest = ''
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
254 else:
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
255 self.therest = self.f.read()
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
256
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
257 def write(self, f):
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
258 changed = self.changed
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
259 assert changed
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
260 # Prevent calling this again.
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
261 self.changed = []
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
262 # Apply changes in reverse order.
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
263 changed.reverse()
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
264 for s, e, line in changed:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
265 if line is None:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
266 # pure deletion
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
267 del self.lines[s:e+1]
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
268 else:
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
269 self.lines[s:e+1] = [line]
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
270 f.writelines(self.lines)
19202
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
271 # Copy over the remainder of the file.
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
272 if self.therest:
47a45da03b09 + A msg on c.l.py reminded me that docstrings can be implicitly catenated.
Tim Peters <tim.peters@gmail.com>
parents: 19196
diff changeset
273 f.write(self.therest)
19196
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
274
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
275 if __name__ == '__main__':
301bcb01b503 Tool to delete (or just rewrite parts of) obsolete future statements.
Tim Peters <tim.peters@gmail.com>
parents:
diff changeset
276 main()