summaryrefslogtreecommitdiff
path: root/sa2to3.py
diff options
context:
space:
mode:
Diffstat (limited to 'sa2to3.py')
-rw-r--r--sa2to3.py76
1 files changed, 76 insertions, 0 deletions
diff --git a/sa2to3.py b/sa2to3.py
new file mode 100644
index 000000000..9c06dafab
--- /dev/null
+++ b/sa2to3.py
@@ -0,0 +1,76 @@
+"""SQLAlchemy 2to3 tool.
+
+Relax ! This just calls the regular 2to3 tool with a preprocessor bolted onto it.
+
+
+I originally wanted to write a custom fixer to accomplish this
+but the Fixer classes seem like they can only understand
+the grammar file included with 2to3, and the grammar does not
+seem to include Python comments (and of course, huge hacks needed
+to get out-of-package fixers in there). While that may be
+an option later on this is a pretty simple approach for
+what is a pretty simple problem.
+
+"""
+
+from lib2to3 import main, refactor
+
+import re
+
+py3k_pattern = re.compile(r'\s*# Py3K')
+comment_pattern = re.compile(r'(\s*)#(?! ?Py2K)(.*)')
+py2k_pattern = re.compile(r'\s*# Py2K')
+end_py2k_pattern = re.compile(r'\s*# end Py2K')
+
+def preprocess(data):
+ lines = data.split('\n')
+ def consume_normal():
+ while lines:
+ line = lines.pop(0)
+ if py3k_pattern.match(line):
+ for line in consume_py3k():
+ yield line
+ elif py2k_pattern.match(line):
+ for line in consume_py2k():
+ yield line
+ else:
+ yield line
+
+ def consume_py3k():
+ yield "# start Py3K"
+ while lines:
+ line = lines.pop(0)
+ m = comment_pattern.match(line)
+ if m:
+ yield "%s%s" % m.group(1, 2)
+ else:
+ # pushback
+ lines.insert(0, line)
+ break
+ yield "# end Py3K"
+
+ def consume_py2k():
+ yield "# start Py2K"
+ while lines:
+ line = lines.pop(0)
+ if not end_py2k_pattern.match(line):
+ yield "#%s" % line
+ else:
+ break
+ yield "# end Py2K"
+
+ return "\n".join(consume_normal())
+
+old_refactor_string = main.StdoutRefactoringTool.refactor_string
+
+def refactor_string(self, data, name):
+ newdata = preprocess(data)
+ tree = old_refactor_string(self, newdata, name)
+ if tree:
+ if newdata != data:
+ tree.was_changed = True
+ return tree
+
+main.StdoutRefactoringTool.refactor_string = refactor_string
+
+main.main("lib2to3.fixes")