diff options
author | Eric Messick <ericm@nanorex.com> | 2007-10-17 02:48:36 +0000 |
---|---|---|
committer | Eric Messick <ericm@nanorex.com> | 2007-10-17 02:48:36 +0000 |
commit | b2e0b39e59bd5a7610a093d9f138018711edec74 (patch) | |
tree | 121920c4aab38a728879574825792753cbf54a2d | |
parent | 95d4f615a2183bc65376124ba79222418e8d4141 (diff) | |
download | nanoengineer-theirix-b2e0b39e59bd5a7610a093d9f138018711edec74.tar.gz nanoengineer-theirix-b2e0b39e59bd5a7610a093d9f138018711edec74.zip |
move unused files, better loop graph pruning
-rwxr-xr-x | cad/src/scratch/butterfly.png (renamed from cad/src/butterfly.png) | bin | 37900 -> 37900 bytes | |||
-rwxr-xr-x | cad/src/scratch/canvas-b-3.py (renamed from cad/src/canvas-b-3.py) | 9 | ||||
-rwxr-xr-x | cad/src/tests/atombasetests.py (renamed from cad/src/atombasetests.py) | 5 | ||||
-rwxr-xr-x | cad/src/tools/AllPyFiles.sh | 7 | ||||
-rwxr-xr-x | cad/src/tools/PackageDependency.py | 120 | ||||
-rwxr-xr-x | cad/src/tools/README.global.dependencies.txt | 2 |
6 files changed, 122 insertions, 21 deletions
diff --git a/cad/src/butterfly.png b/cad/src/scratch/butterfly.png Binary files differindex d8912d254..d8912d254 100755 --- a/cad/src/butterfly.png +++ b/cad/src/scratch/butterfly.png diff --git a/cad/src/canvas-b-3.py b/cad/src/scratch/canvas-b-3.py index 95779add4..c2490362a 100755 --- a/cad/src/canvas-b-3.py +++ b/cad/src/scratch/canvas-b-3.py @@ -20,12 +20,9 @@ if it's here in cad/src, that's just so it can import some code modules from our and/or be shared with other developers for testing. It need not be distributed with our product, but if it is this doesn't seem to be a problem. -it's a main program, just run it with "python <filename>" -or whatever is needed for your python installation to start it with a GUI -(e.g. pythonw, or drag and drop it onto something that launches it). -E.g.: - - pythonw `pwd`/canvas-b-3.py +You can try running it as "./ExecSubDir.py scratch/canvas-b-3.py", but it uses +features of Qt3 that no longer exist in Qt4, so it needs to be ported before it +will work. The current dir probably needs to be the same dir as this code module so it can find the 'butterfly.png' file. diff --git a/cad/src/atombasetests.py b/cad/src/tests/atombasetests.py index c221400f7..9cb5162e4 100755 --- a/cad/src/atombasetests.py +++ b/cad/src/tests/atombasetests.py @@ -4,6 +4,11 @@ Python atoms, atom sets, diff factories, diff objects (tests) http://tinyurl.com/rv7fx +May need changes to work in this location. Used to be in cad/src. + +Probably depends on atombasehelp.c, which will likely move as the +cad/src directory is cleaned out. + $Id$ """ diff --git a/cad/src/tools/AllPyFiles.sh b/cad/src/tools/AllPyFiles.sh index 0e74c7a36..6e44fb342 100755 --- a/cad/src/tools/AllPyFiles.sh +++ b/cad/src/tools/AllPyFiles.sh @@ -2,10 +2,9 @@ find . -name \*.py -print | sed ' /experimental/d -/atombasetests\.py/d -/canvas-b-3\.py/d -/\/TreeView\.py/d -/\/TreeWidget\.py/d /scratch/d /outtakes/d +/tools/d +/tests/d +/\/\./d ' | sort diff --git a/cad/src/tools/PackageDependency.py b/cad/src/tools/PackageDependency.py index efbbc4bbc..3ae62d4b8 100755 --- a/cad/src/tools/PackageDependency.py +++ b/cad/src/tools/PackageDependency.py @@ -25,12 +25,14 @@ the GraphViz package. To see the entire graph, comment out the pruneTree() loop. +from exprs import b, c as q, d # with a comment """ import sys import re +import os.path -fromImportLineRegex = re.compile(r'^\s*from\s+(\S+)\s+import\s') +fromImportLineRegex = re.compile(r'^\s*from\s+(\S+)\s+import\s+([^#]*)') importLineRegex = re.compile(r'^\s*import\s+([^#]+)') asRegex = re.compile(r'^(\S+)\s+as\s+') @@ -57,19 +59,29 @@ externalModules = [] """ rootsToKeep = set([ - "main", + "_import_roots", ]) filesToProcess = [] optionPrintUnreferenced = False +optionPrintTables = False +optionJustCycles = False optionDontPrune = False +moduleNameToImportList = {} + # these four are set in initializeGlobals() allProcessedModules = None referencedModules = None fromModuleCount = None toModuleCount = None +def isPackage(moduleName): + possiblePackageName = moduleName.replace(".", "/") + if (os.path.isdir(possiblePackageName)): + return True + return False + def fileNameToModuleName(fileName): if (fileName.startswith("./")): fileName = fileName[2:] @@ -85,19 +97,28 @@ def moduleToDotNode(moduleName): ret = ret.replace("-", "_") return ret -def dependenciesInFile(fileName, printing): +def importsInFile(fileName): importSet = set([]) fromModuleName = moduleToDotNode(fileNameToModuleName(fileName)) - if (fromModuleName in pruneModules or fromModuleName in unreferencedModules): - return None - allProcessedModules.add(fromModuleName) f = open(fileName) for line in f: m = fromImportLineRegex.match(line) if (m): - toModuleName = moduleToDotNode(m.group(1)) - if (toModuleName != fromModuleName): - importSet.add(toModuleName) + if (isPackage(m.group(1))): + packageName = m.group(1) + moduleImportList = m.group(2).strip().split(',') + for toModuleName in moduleImportList: + toModuleName = toModuleName.strip() + m = asRegex.match(toModuleName) + if (m): + toModuleName = m.group(1) + toModuleName = moduleToDotNode(packageName + "." + toModuleName) + if (toModuleName != fromModuleName): + importSet.add(toModuleName) + else: + toModuleName = moduleToDotNode(m.group(1)) + if (toModuleName != fromModuleName): + importSet.add(toModuleName) continue m = importLineRegex.match(line) if (m): @@ -111,9 +132,17 @@ def dependenciesInFile(fileName, printing): if (toModuleName != fromModuleName): importSet.add(toModuleName) f.close() - referencedModules.update(importSet) importList = list(importSet) importList.sort() + moduleNameToImportList[fromModuleName] = importList + +def dependenciesInFile(fileName, printing): + fromModuleName = moduleToDotNode(fileNameToModuleName(fileName)) + if (fromModuleName in pruneModules or fromModuleName in unreferencedModules): + return None + allProcessedModules.add(fromModuleName) + importList = moduleNameToImportList[fromModuleName] + referencedModules.update(importList) outCount = 0 for toModuleName in importList: if (toModuleName in externalModules or toModuleName in pruneModules or toModuleName in unreferencedModules): @@ -137,6 +166,10 @@ def dependenciesInFile(fileName, printing): return fromModuleName return None +def scanForImports(): + for sourceFile in filesToProcess: + importsInFile(sourceFile) + def initializeGlobals(): global allProcessedModules global referencedModules @@ -181,6 +214,45 @@ def pruneTree(): return pruneCount +inThisCycle = set([]) +inAnyCycle = set([]) +visited = {} + +def isInCycle(moduleName, cycleRoot): + global visited + + if (moduleName == cycleRoot): + return True + if (visited.has_key(moduleName)): + return visited[moduleName] + if (moduleName in pruneModules or moduleName in unreferencedModules or moduleName in externalModules): + return False + importList = moduleNameToImportList[moduleName] + visited[moduleName] = False + for toModuleName in importList: + if (isInCycle(toModuleName, cycleRoot)): + visited[moduleName] = True + return True + return False + +def scanForCycles(cycleRoot): + global visited + + if (moduleName in pruneModules or moduleName in unreferencedModules or moduleName in externalModules): + return + visited = {} + removeArcs = [] + importList = moduleNameToImportList[cycleRoot] + for toModuleName in importList: + if (isInCycle(toModuleName, cycleRoot)): + pass + else: + removeArcs += [toModuleName] + for toModuleName in removeArcs: + importList.remove(toModuleName) + moduleNameToImportList[moduleName] = importList + return + def printTree(): initializeGlobals() print "digraph G {" @@ -188,6 +260,8 @@ def printTree(): dependenciesInFile(sourceFile, True) print "}" for key in fromModuleCount.keys(): + if (not toModuleCount.has_key(key)): + toModuleCount[key] = 0 print >>sys.stderr, "%06d %06d %s" % (toModuleCount[key], fromModuleCount[key], key) if (__name__ == '__main__'): @@ -196,13 +270,39 @@ if (__name__ == '__main__'): optionDontPrune = True elif (opt == "--printUnreferenced"): optionPrintUnreferenced = True + elif (opt == "--printTables"): + optionPrintTables = True + elif (opt == "--justCycles"): + optionJustCycles = True else: filesToProcess += [opt] + scanForImports() if (not optionDontPrune): while (pruneTree()): pass if (optionPrintUnreferenced): + unreferencedModules.sort() for module in unreferencedModules: + if (not module.endswith("__init__")): + print module + elif (optionPrintTables): + print "\n Prune\n" + pruneModules.sort() + for module in pruneModules: + print module + print "\n Unreferenced\n" + unreferencedModules.sort() + for module in unreferencedModules: + print module + print "\n External\n" + externalModules.sort() + for module in externalModules: print module else: + if (optionJustCycles): + for sourceFile in filesToProcess: + moduleName = moduleToDotNode(fileNameToModuleName(sourceFile)) + scanForCycles(moduleName) + while (pruneTree()): + pass printTree() diff --git a/cad/src/tools/README.global.dependencies.txt b/cad/src/tools/README.global.dependencies.txt index f9daa376e..172390aee 100755 --- a/cad/src/tools/README.global.dependencies.txt +++ b/cad/src/tools/README.global.dependencies.txt @@ -146,4 +146,4 @@ $ tools/PackageDependency.py `tools/AllPyFiles.sh` > depend.dot 2> packageloopco If you have the GraphViz package installed, the results can be plotted with: -$ dot -Tjpg depend.dot > depend.jpg +$ dot -Tpng depend.dot > depend.png |