blob: a7e0bffdb47b0c580468c14b01ec4b7e2ac7749b [file] [log] [blame]
#!/usr/bin/python
from pyparsing import *
from optparse import OptionParser
import os
from os.path import join,exists
from shutil import copy
usage = "usage: %prog --old <old namespace> --new <new namespace> <directory root>"
parser = OptionParser(usage=usage)
parser.add_option("-q", "--quiet",
action="store_false", dest="verbose",
help="be vewwy quiet (I'm hunting wabbits)")
parser.add_option("-o", "--old",
metavar="old", help="Old namespace")
parser.add_option("-n", "--new",
default="new", help="New namespace")
(options, args) = parser.parse_args()
old_ns = options.old
new_ns = options.new
# grammar
comment = '#' + SkipTo(lineEnd)
module_ns = Word(alphanums + '-' + '_' + '.' + '*')
old_module_ns = Combine(old_ns + Optional(Combine('.'+module_ns)))
end_of_python_line = Or([lineEnd,comment])
as_suffix = 'as' + module_ns
import_pure = 'import' + old_module_ns
import_pure_line = import_pure + Optional(as_suffix) + end_of_python_line
import_from = 'from' + old_module_ns + 'import' + commaSeparatedList
import_from_line = import_from + Optional(as_suffix) + end_of_python_line
import_line = Or([import_pure_line, import_from_line])
# Make a list of Python files to deal with
try:
f = args[0]
except IndexError:
print 'Specify a directory root'
exit(1)
for root, dirs, files in os.walk(f):
for n in files:
if (n.endswith('.py')):
full_path = '/'.join([root,n])
orig_path = full_path + '.orig'
print 'Working on %s:'%full_path
if (not os.path.exists(orig_path)):
print 'Copying %s->%s:'%(full_path,orig_path)
copy(full_path, orig_path)
f_contents = open(orig_path).read()
new_contents = []
for l in f_contents.splitlines():
try:
match = import_line.parseString(l)
l = l.replace(old_ns, new_ns)
except ParseException:
pass
new_contents.append(l)
new_file = '\n'.join(new_contents)
if (f_contents.endswith('\n')):
new_file+='\n'
open(full_path,'w').write(new_file)