diff options
Diffstat (limited to 'py2depgraph.py')
-rw-r--r-- | py2depgraph.py | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/py2depgraph.py b/py2depgraph.py new file mode 100644 index 0000000..5e97e06 --- /dev/null +++ b/py2depgraph.py | |||
@@ -0,0 +1,62 @@ | |||
1 | # Copyright 2004 Toby Dickenson | ||
2 | # | ||
3 | # Permission is hereby granted, free of charge, to any person obtaining | ||
4 | # a copy of this software and associated documentation files (the | ||
5 | # "Software"), to deal in the Software without restriction, including | ||
6 | # without limitation the rights to use, copy, modify, merge, publish, | ||
7 | # distribute, sublicense, and/or sell copies of the Software, and to | ||
8 | # permit persons to whom the Software is furnished to do so, subject | ||
9 | # to the following conditions: | ||
10 | # | ||
11 | # The above copyright notice and this permission notice shall be included | ||
12 | # in all copies or substantial portions of the Software. | ||
13 | # | ||
14 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
15 | # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
16 | # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | ||
17 | # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY | ||
18 | # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | ||
19 | # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | ||
20 | # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
21 | |||
22 | import sys, pprint | ||
23 | import modulefinder | ||
24 | |||
25 | class mymf(modulefinder.ModuleFinder): | ||
26 | def __init__(self,*args,**kwargs): | ||
27 | self._depgraph = {} | ||
28 | self._types = {} | ||
29 | self._last_caller = None | ||
30 | modulefinder.ModuleFinder.__init__(self,*args,**kwargs) | ||
31 | |||
32 | def import_hook(self, name, caller=None, fromlist=None): | ||
33 | old_last_caller = self._last_caller | ||
34 | try: | ||
35 | self._last_caller = caller | ||
36 | return modulefinder.ModuleFinder.import_hook(self,name,caller,fromlist) | ||
37 | finally: | ||
38 | self._last_caller = old_last_caller | ||
39 | |||
40 | def import_module(self,partnam,fqname,parent): | ||
41 | r = modulefinder.ModuleFinder.import_module(self,partnam,fqname,parent) | ||
42 | if r is not None: | ||
43 | self._depgraph.setdefault(self._last_caller.__name__,{})[r.__name__] = 1 | ||
44 | return r | ||
45 | |||
46 | def load_module(self, fqname, fp, pathname, (suffix, mode, type)): | ||
47 | r = modulefinder.ModuleFinder.load_module(self, fqname, fp, pathname, (suffix, mode, type)) | ||
48 | if r is not None: | ||
49 | self._types[r.__name__] = type | ||
50 | return r | ||
51 | |||
52 | |||
53 | def main(argv): | ||
54 | path = sys.path[:] | ||
55 | debug = 0 | ||
56 | exclude = [] | ||
57 | mf = mymf(path,debug,exclude) | ||
58 | mf.run_script(argv[0]) | ||
59 | pprint.pprint({'depgraph':mf._depgraph,'types':mf._types}) | ||
60 | |||
61 | if __name__=='__main__': | ||
62 | main(sys.argv[1:]) \ No newline at end of file | ||