| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
|
|
| import sys |
| import re |
| import os |
|
|
|
|
| |
| |
| def main(): |
| args = sys.argv[1:] |
| if not args: |
| print('usage: pdeps file.py file.py ...') |
| return 2 |
| |
| table = {} |
| for arg in args: |
| process(arg, table) |
| |
| print('--- Uses ---') |
| printresults(table) |
| |
| print('--- Used By ---') |
| inv = inverse(table) |
| printresults(inv) |
| |
| print('--- Closure of Uses ---') |
| reach = closure(table) |
| printresults(reach) |
| |
| print('--- Closure of Used By ---') |
| invreach = inverse(reach) |
| printresults(invreach) |
| |
| return 0 |
|
|
|
|
| |
| |
| m_import = re.compile('^[ \t]*from[ \t]+([^ \t]+)[ \t]+') |
| m_from = re.compile('^[ \t]*import[ \t]+([^#]+)') |
|
|
|
|
| |
| |
| def process(filename, table): |
| with open(filename, encoding='utf-8') as fp: |
| mod = os.path.basename(filename) |
| if mod[-3:] == '.py': |
| mod = mod[:-3] |
| table[mod] = list = [] |
| while 1: |
| line = fp.readline() |
| if not line: break |
| while line[-1:] == '\\': |
| nextline = fp.readline() |
| if not nextline: break |
| line = line[:-1] + nextline |
| m_found = m_import.match(line) or m_from.match(line) |
| if m_found: |
| (a, b), (a1, b1) = m_found.regs[:2] |
| else: continue |
| words = line[a1:b1].split(',') |
| |
| for word in words: |
| word = word.strip() |
| if word not in list: |
| list.append(word) |
|
|
|
|
| |
| |
| def closure(table): |
| modules = list(table.keys()) |
| |
| |
| |
| reach = {} |
| for mod in modules: |
| reach[mod] = table[mod][:] |
| |
| |
| |
| change = 1 |
| while change: |
| change = 0 |
| for mod in modules: |
| for mo in reach[mod]: |
| if mo in modules: |
| for m in reach[mo]: |
| if m not in reach[mod]: |
| reach[mod].append(m) |
| change = 1 |
| |
| return reach |
|
|
|
|
| |
| |
| |
| |
| def inverse(table): |
| inv = {} |
| for key in table.keys(): |
| if key not in inv: |
| inv[key] = [] |
| for item in table[key]: |
| store(inv, item, key) |
| return inv |
|
|
|
|
| |
| |
| |
| |
| def store(dict, key, item): |
| if key in dict: |
| dict[key].append(item) |
| else: |
| dict[key] = [item] |
|
|
|
|
| |
| |
| def printresults(table): |
| modules = sorted(table.keys()) |
| maxlen = 0 |
| for mod in modules: maxlen = max(maxlen, len(mod)) |
| for mod in modules: |
| list = sorted(table[mod]) |
| print(mod.ljust(maxlen), ':', end=' ') |
| if mod in list: |
| print('(*)', end=' ') |
| for ref in list: |
| print(ref, end=' ') |
| print() |
|
|
|
|
| |
| if __name__ == '__main__': |
| try: |
| sys.exit(main()) |
| except KeyboardInterrupt: |
| sys.exit(1) |
|
|