Source code for edit_identifiers

#!/usr/bin/env python
"""
Convert mixedCase identifiers to under_scores.
"""
from __future__ import print_function
from __future__ import absolute_import
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): 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: eline, count = edit(line) if write: wfd.write(eline) n_edit += count rfd.close() print('%d edit candidates' % n_edit) if write: wfd.close() os.rename(new_name, name)
if __name__ == '__main__': main()