equal
deleted
inserted
replaced
3 import sys |
3 import sys |
4 |
4 |
5 import cPickle |
5 import cPickle |
6 import os |
6 import os |
7 import graph |
7 import graph |
|
8 |
|
9 |
|
10 ROOTDIR = "soc" |
|
11 |
8 |
12 |
9 def parseFile(file_name): |
13 def parseFile(file_name): |
10 if os.path.exists("imports.dat"): |
14 if os.path.exists("imports.dat"): |
11 log = open("imports.dat", "r") |
15 log = open("imports.dat", "r") |
12 all_imports = cPickle.load(log) |
16 all_imports = cPickle.load(log) |
32 mod = splitline[1] + '.' + splitline[3] |
36 mod = splitline[1] + '.' + splitline[3] |
33 imports.append(mod) |
37 imports.append(mod) |
34 |
38 |
35 for idx, imp in enumerate(imports): |
39 for idx, imp in enumerate(imports): |
36 if imp in set(imports[idx+1:]): |
40 if imp in set(imports[idx+1:]): |
37 print "Warning: file '%s' has a redundant import: '%s'." % (file_name, imp) |
41 sys.stderr.write("Warning: file '%s' has a redundant import: '%s'.\n" % (file_name, imp)) |
38 |
42 |
39 if file_name.endswith("__init__.py"): |
43 if file_name.endswith("__init__.py"): |
40 normalized = file_name[:-12].replace('/', '.') |
44 normalized = file_name[:-12].replace('/', '.') |
41 else: |
45 else: |
42 normalized = file_name[:-3].replace('/', '.') |
46 normalized = file_name[:-3].replace('/', '.') |
50 |
54 |
51 return 0 |
55 return 0 |
52 |
56 |
53 |
57 |
54 def buildGraph(): |
58 def buildGraph(): |
55 import graph |
59 if not os.path.exists("imports.dat"): |
|
60 sys.stderr.write("Missing imports.dat file, run 'build' first\n") |
|
61 return |
56 |
62 |
57 log = open("imports.dat", "r") |
63 log = open("imports.dat", "r") |
58 all_imports = cPickle.load(log) |
64 all_imports = cPickle.load(log) |
59 |
65 |
60 gr = graph.digraph() |
66 gr = graph.digraph() |
134 gvv = gv.readstring(dot) |
140 gvv = gv.readstring(dot) |
135 gv.layout(gvv,'dot') |
141 gv.layout(gvv,'dot') |
136 gv.render(gvv,'png','imports.png') |
142 gv.render(gvv,'png','imports.png') |
137 |
143 |
138 |
144 |
|
145 def accumulate(arg, dirname, fnames): |
|
146 for fname in fnames: |
|
147 if not fname.endswith(".py"): |
|
148 continue |
|
149 |
|
150 arg.append(os.path.join(dirname, fname)) |
|
151 |
|
152 |
139 def main(args): |
153 def main(args): |
140 if len(args) == 1 and args[0].startswith("."): |
154 if len(args) != 1: |
141 gr = buildGraph() |
155 print "Supported options: 'print', 'build', 'find', and 'draw'." |
142 if args[0] == '.': |
|
143 return showGraph(gr) |
|
144 |
|
145 if args[0] == '..': |
|
146 return drawGraph(gr) |
|
147 |
|
148 if args[0] == '...': |
|
149 cycles = findCycles(gr) |
|
150 for cycle in cycles: |
|
151 print cycle |
|
152 return 0 |
|
153 |
|
154 if not args: |
|
155 print "Please specify a filename to parse, or '.' to list the parsed imports" |
|
156 return -1 |
156 return -1 |
157 |
157 |
158 res = 0 |
158 action = args[0] |
159 |
159 |
160 for file_name in args: |
160 if action == "build": |
161 res += parseFile(file_name) |
161 fnames = [] |
|
162 os.path.walk(ROOTDIR, accumulate, fnames) |
162 |
163 |
163 print "Done parsing." |
164 for fname in fnames: |
|
165 parseFile(fname) |
164 |
166 |
165 return res |
167 print "Done parsing." |
|
168 return 0 |
|
169 |
|
170 gr = buildGraph() |
|
171 if not gr: |
|
172 return 1 |
|
173 |
|
174 if action == "show": |
|
175 return showGraph(gr) |
|
176 |
|
177 if action == "draw": |
|
178 return drawGraph(gr) |
|
179 |
|
180 if action == "find": |
|
181 cycles = findCycles(gr) |
|
182 for cycle in cycles: |
|
183 print cycle |
|
184 return 0 |
|
185 |
|
186 print "Unknown option." |
|
187 return -1 |
|
188 |
166 |
189 |
167 if __name__ == '__main__': |
190 if __name__ == '__main__': |
168 import sys |
191 import sys |
|
192 os.chdir("../app") |
169 res = main(sys.argv[1:]) |
193 res = main(sys.argv[1:]) |
170 sys.exit(res) |
194 sys.exit(0) |
171 |
|