123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- import os
- def walk_directory(root, dirs, files):
- for file_path in files:
- if 'project_template' not in root and file_path.lower().endswith('.py'):
- clean_file(os.path.join(root, file_path))
- def clean_file(file_path):
- py_source = file(file_path).read()
- if 'misago.' in py_source:
- package = file_path.rstrip('.py').split('/')
- parse_file = True
- save_file = False
- cursor = 0
- while parse_file:
- try:
- import_start = py_source.index('from ', cursor)
- import_end = py_source.index(' import', import_start)
- cursor = import_end
- import_len = import_end - import_start
- import_path = py_source[import_start:import_end].lstrip('from').strip()
- if import_path.startswith('misago.'):
- cleaned_import = clean_import(package, import_path.split('.'))
- if cleaned_import:
- save_file = True
- cleaned_import_string = 'from {}'.format('.'.join(cleaned_import))
- py_source = ''.join((py_source[:import_start], cleaned_import_string, py_source[import_end:]))
- cursor -= import_end - import_start - len(cleaned_import_string)
- except ValueError:
- parse_file = False
- if save_file:
- with open(file_path, 'w') as package:
- print file_path
- package.write(py_source)
- def clean_import(package, import_path):
- if len(package) < 2 or len(import_path) < 2:
- # skip non-app import
- return
- if package[:2] != import_path[:2]:
- # skip other app import
- return
- if package == import_path:
- # import from direct child
- return ['', '']
- if package[:-1] == import_path[:-1]:
- # import from sibling module
- return ['', import_path[-1]]
- if len(package) < len(import_path) and package == import_path[:len(package)]:
- # import from child module
- return [''] + import_path[len(package):]
- if len(package) > len(import_path) and package[:len(import_path)] == import_path:
- # import from parent module
- return [''] * (len(package) - len(import_path) + 1)
- # relative up and down path
- relative_path = []
- # find upwards path
- overlap_len = 2
- while True:
- if package[:overlap_len + 1] != import_path[:overlap_len + 1]:
- break
- overlap_len += 1
- relative_path += ([''] * (len(package) - overlap_len))[:-1]
- # append eventual downwards path
- if import_path[overlap_len:]:
- relative_path += [''] + import_path[overlap_len:]
- return relative_path
- if __name__ == '__main__':
- for args in os.walk('misago'):
- walk_directory(*args)
- print "\nDone! Don't forget to run isort to fix imports ordering!"
|