summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Messick <ericm@nanorex.com>2007-10-17 02:48:36 +0000
committerEric Messick <ericm@nanorex.com>2007-10-17 02:48:36 +0000
commitb2e0b39e59bd5a7610a093d9f138018711edec74 (patch)
tree121920c4aab38a728879574825792753cbf54a2d
parent95d4f615a2183bc65376124ba79222418e8d4141 (diff)
downloadnanoengineer-theirix-b2e0b39e59bd5a7610a093d9f138018711edec74.tar.gz
nanoengineer-theirix-b2e0b39e59bd5a7610a093d9f138018711edec74.zip
move unused files, better loop graph pruning
-rwxr-xr-xcad/src/scratch/butterfly.png (renamed from cad/src/butterfly.png)bin37900 -> 37900 bytes
-rwxr-xr-xcad/src/scratch/canvas-b-3.py (renamed from cad/src/canvas-b-3.py)9
-rwxr-xr-xcad/src/tests/atombasetests.py (renamed from cad/src/atombasetests.py)5
-rwxr-xr-xcad/src/tools/AllPyFiles.sh7
-rwxr-xr-xcad/src/tools/PackageDependency.py120
-rwxr-xr-xcad/src/tools/README.global.dependencies.txt2
6 files changed, 122 insertions, 21 deletions
diff --git a/cad/src/butterfly.png b/cad/src/scratch/butterfly.png
index d8912d254..d8912d254 100755
--- a/cad/src/butterfly.png
+++ b/cad/src/scratch/butterfly.png
Binary files differ
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