Source code for edit_identifiers
#!/usr/bin/env python
"""
Convert mixedCase identifiers to under_scores.
"""
import sys, re, os
##
# Taken from http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66009.
[docs]def cw2us(x): # capwords to underscore notation
# return re.sub(r'(?<=[a-z])[A-Z]', r"_\g<0>", x).lower()
return re.sub(r'(?<=[a-z])[A-Z]|(?<!^)[A-Z](?=[a-z])', r"_\g<0>", x).lower()
[docs]def mc2us(x): # mixed case to underscore notation
return cw2us(x)
[docs]def us2mc(x): # underscore to mixed case notation
return re.sub(r'_([a-z])', lambda m: (m.group(1).upper()), x)
[docs]def us2cw(x): # underscore to capwords notation
s = us2mc(x)
return s[0].upper()+s[1:]
##
misc = '[\'\"\[\]\(\)\{\}]'
mixed = '^%s*(?=[^A-Z])[a-z]+' % misc
match_candidate = re.compile( mixed ).match
[docs]def split_on( token, chars ):
if len( chars ) == 1:
return token.split( chars[0] )
else:
aux = token.split( chars[0] )
out = []
for item in aux:
out.extend( split_on( item, chars[1:] ) )
return out
[docs]def edit( line ):
count = 0
aux = line.split()
if len( aux ) > 2:
if aux[0] == 'from' and aux[2] == 'import':
aux = aux[3:]
elif aux[0] == 'import':
aux = aux[3:]
for token in aux:
for item in split_on( token, '.,=*/+-_' ):
if match_candidate( item ):
# print item, cw2us( item )
line = line.replace( item, cw2us( item ), 1 )
count += 1
return line, count
[docs]def main():
write = True
for name in sys.argv[1:]:
print name
rfd = open( name, 'r' )
path = os.path.dirname( name )
base = os.path.basename( name )
new_name = os.path.join( path, 'new_' + base )
if write:
wfd = open( new_name, 'w' )
n_edit = 0
for line in rfd:
# print line
eline, count = edit( line )
# print eline
if write:
wfd.write( eline )
n_edit += count
# raw_input()
rfd.close()
print '%d edit candidates' % n_edit
if write:
wfd.close()
os.rename( new_name, name )
if __name__ == '__main__':
main()