Skip to content

Instantly share code, notes, and snippets.

@0xced
Created January 7, 2011 12:32
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 0xced/769411 to your computer and use it in GitHub Desktop.
Save 0xced/769411 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
# Nicolas Seriot
# 2011-01-06
# https://gist.github.com/768457
"""
Input: path of an Objective-C project
Output: import dependancies Graphviz format
Typical usage: $ python objc_dep.py /path/to/project > graph.dot
The .dot file can be opened with Graphviz or OmniGraffle.
"""
import sys
import os
import re
regex_import = re.compile("#import \"(?P<filename>\S*)\.h")
def filenames_imported_in_file(path):
imports = set()
f = open(path)
for line in f.xreadlines():
results = re.search(regex_import, line)
if results:
filename = results.group('filename')
imports.add(filename)
f.close()
return imports
def add_imports_from_files(d, dir, files):
for f in files:
if f.endswith('.h') or f.endswith('.m'):
base_name = f.split('.')[0]
if base_name not in d:
d[base_name] = set()
path = os.path.join(dir, f)
if not os.path.isdir(path):
imports = filenames_imported_in_file(path)
d[base_name] = d[base_name].union(imports)
return d
def dependancies_in_dot_format(d):
l = []
l.append("digraph G {")
for k, set in d.iteritems():
if set:
set.discard(k)
deps = map(lambda s:'"%s"' % s, set)
deps = '; '.join(deps)
l.append("\t\"%s\" -> {%s};" % (k, deps))
l.append("}\n")
return '\n'.join(l)
def dependancies_in_project(path):
d = {}
os.path.walk(path, add_imports_from_files, d)
return d
def main():
if len(sys.argv) != 2 or not os.path.exists(sys.argv[1]):
print "USAGE: %s PROJECT_PATH" % sys.argv[0]
exit(0)
d = dependancies_in_project(sys.argv[1])
s = dependancies_in_dot_format(d)
print s
if __name__=='__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment