app/check_includes.py
changeset 598 c1f9435bb645
parent 597 66088092f849
equal deleted inserted replaced
597:66088092f849 598:c1f9435bb645
     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