public
Description: Oliver's Python utilities
Homepage:
Clone URL: git://github.com/osteele/python-utils.git
python-utils / graphimports.py
100644 47 lines (41 sloc) 1.129 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import symbol, token
IMPORT_STMT_WITH_LIST_PATTERN =(
    symbol.stmt,
    (symbol.simple_stmt,
     (symbol.small_stmt,
      ['import_stmt']
      ),
     (token.NEWLINE, '')
     )
    )
 
def findModuleFile(mname):
    import sys, os
    for path in sys.path:
        fname = os.path.join(path, mname.split('.'))
        if os.path.isfile(fname): return fname
    return None
 
def getImports(mname):
    fname = findModuleFile(mname)
    if not fname: return []
    import parser
    ast = parser.suite(open(source).read())
    tup = ast.2tuple()
    from HappyDoc.parseinfo import match
    match(IMPORT_PATTERN, tup)
 
def graphModuleImports(mname):
    graph = Graph()
    visited = {}
    def visit(mname, graph=graph, visited=visited):
        id = visited.get(mname)
        if id: return id
        id = visited[mname] = graph.makeNextId()
        for cm in getImports(mname):
            cf = findModuleFile(cm)
            cid = visit(cf)
            graph.addEdge(id, cid)
        return id
    visit(mname)
    graph.write('imports.jpeg', 'jpeg')
 
graphModuleImports('graphviz')
 
if __name__ == '__main__':
    pass