You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@gump.apache.org by aj...@apache.org on 2020/11/30 21:45:39 UTC

svn commit: r1883964 [2/3] - in /gump/live: ./ bin/ cron/ python/gump/actor/document/ python/gump/actor/document/text/ python/gump/actor/document/xdocs/ python/gump/actor/mvnrepoproxy/ python/gump/actor/notify/ python/gump/actor/repository/ python/gump...

Modified: gump/live/python/gump/core/commandLine.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/commandLine.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/commandLine.py (original)
+++ gump/live/python/gump/core/commandLine.py Mon Nov 30 21:45:38 2020
@@ -60,29 +60,29 @@ class CommandLine:
             if argv[1] in ['-V','--version']:
                 sys.exit(0)      
             elif argv[1] in ['-h','--help']:
-                print "command: " , __name__    
-                print "Usage: python "+__name__+".py -w {workspaceFile} [OPTION] [PROJECT]"
-                print 
-                print "Mandatory arguments to long options are mandatory for short options too."
-                print 
-                print "Startup:"
-                print "  -V,  --version           display the version of Apache Gump(TM) and exit."
-                print "  -h,  --help              print this help."
-                print "  -w,  --workspace         use this workspace for Gump."
-                print 
-                print "General:"
-                print "  -v,  --verbose           verbose logging."
-                print "  -d,  --debug             debug logging."
-                print
-                print " Not relevent to all scripts:"
-                print "  -O,  --official          Full run, publishing notifications, etc."
-                print "  -D,  --dated             Dated log files."
-                print "  -c,  --cache             Use local cache (do not download over HTTP)."
-                print "  -t,  --text              Use text not xdocs."
-                print "  -X,  --xdocs             Output xdocs, not XHTML."
-                print
-                print "For bug reports use JIRA: http://issues.apache.org/."
-                print "For suggestions: <general@gump.apache.org/>."
+                print("command: " , __name__)    
+                print("Usage: python "+__name__+".py -w {workspaceFile} [OPTION] [PROJECT]")
+                print() 
+                print("Mandatory arguments to long options are mandatory for short options too.")
+                print() 
+                print("Startup:")
+                print("  -V,  --version           display the version of Apache Gump(TM) and exit.")
+                print("  -h,  --help              print this help.")
+                print("  -w,  --workspace         use this workspace for Gump.")
+                print() 
+                print("General:")
+                print("  -v,  --verbose           verbose logging.")
+                print("  -d,  --debug             debug logging.")
+                print()
+                print(" Not relevent to all scripts:")
+                print("  -O,  --official          Full run, publishing notifications, etc.")
+                print("  -D,  --dated             Dated log files.")
+                print("  -c,  --cache             Use local cache (do not download over HTTP).")
+                print("  -t,  --text              Use text not xdocs.")
+                print("  -X,  --xdocs             Output xdocs, not XHTML.")
+                print()
+                print("For bug reports use JIRA: http://issues.apache.org/.")
+                print("For suggestions: <general@gump.apache.org/>.")
                 sys.exit(0)
       
         # 
@@ -161,9 +161,9 @@ class CommandLine:
                         self.args.append(arg)
                     removers.append(arg)        
             else:
-                print
-                print " No project specified, please supply a comma separated list of project expressions or 'all'."
-                print " Project wildcards are accepted, e.g. \"jakarta-*\"."
+                print()
+                print(" No project specified, please supply a comma separated list of project expressions or 'all'.")
+                print(" Project wildcards are accepted, e.g. \"jakarta-*\".")
                 sys.exit(1)
              
         # Remove those used

Modified: gump/live/python/gump/core/config.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/config.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/config.py (original)
+++ gump/live/python/gump/core/config.py Mon Nov 30 21:45:38 2020
@@ -72,7 +72,7 @@ class setting:
     UTC_TIME_PRESENTATION_FORMAT='%H:%M:%S (UTC)'
     
     TIMEOUT=60*60 # 60 minutes (in seconds)
-    if os.environ.has_key('GUMP_TIMEOUT'):
+    if 'GUMP_TIMEOUT' in os.environ:
             TIMEOUT = string.atoi(os.environ['GUMP_TIMEOUT'])
     
 class default:
@@ -133,11 +133,11 @@ def basicConfig():
 
 if __name__ == '__main__':
   def dump(section):
-    print
-    print "---", str(section).split('.')[-1], "---"
+    print()
+    print(("---", str(section).split('.')[-1], "---"))
     for attr in __builtins__.dir(section):
       if attr == '__module__': continue
-      print " ", attr + ":\t" + getattr(section, attr).__repr__()
+      print((" ", attr + ":\t" + getattr(section, attr).__repr__()))
 
   for section in sys.argv[1:] or ('dir','default','setting','switch'):
     dump(locals()[section])

Modified: gump/live/python/gump/core/language/java.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/language/java.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/language/java.py (original)
+++ gump/live/python/gump/core/language/java.py Mon Nov 30 21:45:38 2020
@@ -56,11 +56,11 @@ class JavaHelper(gump.core.run.gumprun.R
 
         """
         args = project.jvmargs
-        if os.environ.has_key('GUMP_JAVA_ARGS'):
+        if 'GUMP_JAVA_ARGS' in os.environ:
             args = gump.util.process.command.Parameters()
             for p in os.environ['GUMP_JAVA_ARGS'].split(' '):
                 args.addParameter(p)
-            for p in project.jvmargs.items() :
+            for p in list(project.jvmargs.items()) :
                 args.addParameterObject(p)
         return args
 
@@ -102,10 +102,10 @@ class JavaHelper(gump.core.run.gumprun.R
         # Do this once only... storing it on the context. Not as nice as 
         # doing it OO (each project context stores its own, but a step..)
         #
-        if self.classpaths.has_key(project) and \
-                self.bootclasspaths.has_key(project) :
+        if project in self.classpaths and \
+                project in self.bootclasspaths :
             if debug:
-                print "Classpath/Bootclasspath previously resolved..."
+                print("Classpath/Bootclasspath previously resolved...")
             return (self.classpaths[project], self.bootclasspaths[project])
 
         # Start with the system classpath (later remove this)
@@ -162,20 +162,20 @@ class JavaHelper(gump.core.run.gumprun.R
         if (dependency in visited):
             # beneficiary.addInfo("Duplicated dependency [" + str(depend) + "]")
             if debug:
-                print str(depth) + ") Already Visited : " + str(dependency)
-                print str(depth) + ") Previously Visits  : "
+                print(str(depth) + ") Already Visited : " + str(dependency))
+                print(str(depth) + ") Previously Visits  : ")
                 for v in visited:
-                    print str(depth) + ")  - " + str(v)
+                    print(str(depth) + ")  - " + str(v))
             return (None, None)
 
         visited.append(dependency)
 
         if debug:
-            print str(depth) + ") Perform : " + `dependency`
+            print(str(depth) + ") Perform : " + repr(dependency))
 
         # 
-        classpath = Classpath('Classpath for ' + `dependency`)
-        bootclasspath = Classpath('Bootclasspath for ' + `dependency`)
+        classpath = Classpath('Classpath for ' + repr(dependency))
+        bootclasspath = Classpath('Bootclasspath for ' + repr(dependency))
 
         # Context for this dependecy project...
         project = dependency.getProject()
@@ -226,13 +226,13 @@ class JavaHelper(gump.core.run.gumprun.R
                 # Add to CLASSPATH
                 if not jar.getType() == OUTPUT_BOOTCLASSPATH_JAR:
                     if debug:
-                        print str(depth) + ') Append JAR : ' + str(path)
+                        print(str(depth) + ') Append JAR : ' + str(path))
                     classpath.addPathPart(path)
                 else:
                     # Add to BOOTCLASSPATH
                     if debug:
-                        print str(depth) + ') Append *BOOTCLASSPATH* JAR : ' \
-                            + str(path)
+                        print(str(depth) + ') Append *BOOTCLASSPATH* JAR : ' \
+                            + str(path))
                     bootclasspath.addPathPart(path)
 
         # Double check IDs (to reduce stale ids in metadata)
@@ -277,8 +277,8 @@ class JavaHelper(gump.core.run.gumprun.R
                                                             debug)
                 _importClasspaths(classpath, bootclasspath, subcp, subbcp)
             elif debug:
-                print str(depth) + ') Skip : ' + str(subdependency) \
-                    + ' in ' + project.name
+                print(str(depth) + ') Skip : ' + str(subdependency) \
+                    + ' in ' + project.name)
 
         return (classpath, bootclasspath)
 

Propchange: gump/live/python/gump/core/language/java.py
------------------------------------------------------------------------------
  Merged /gump/branches/python3/python/gump/core/language/java.py:r1883918-1883963

Modified: gump/live/python/gump/core/language/path.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/language/path.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/language/path.py (original)
+++ gump/live/python/gump/core/language/path.py Mon Nov 30 21:45:38 2020
@@ -22,7 +22,6 @@
 """
 
 import os
-from string import split
 from gump.util.note import transferAnnotations, Annotatable
 
 #
@@ -104,12 +103,12 @@ class ArtifactPath(Annotatable):
         
     def addPathPart(self,part):
         if part in self.parts:
-            self.addDebug('Duplicate Path Part [' + `part` + ']')
+            self.addDebug('Duplicate Path Part [' + repr(part) + ']')
         else:
             self.parts.append(part)
         
     def importFlattenedParts(self,parts):
-        for part in split(parts,os.pathsep):
+        for part in parts.split(os.pathsep):
             self.addPathPart(part)
             
     def importPath(self,p):

Modified: gump/live/python/gump/core/loader/loader.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/loader/loader.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/loader/loader.py (original)
+++ gump/live/python/gump/core/loader/loader.py Mon Nov 30 21:45:38 2020
@@ -40,7 +40,7 @@ class XmlLoader:
         """ Builds a GOM in memory from the xml file. Return the generated GOM. """
         
         if not os.path.exists(file):
-            raise IOError, 'Metadata file [%s] not found.' % file 
+            raise IOError('Metadata file [%s] not found.' % file) 
     
         return self.load(file,tag)
     
@@ -70,7 +70,7 @@ class XmlLoader:
 
         if not os.path.exists(file):
             log.error('Metadata file [' + file + '] not found')
-            raise IOError, 'Metadata File %s not found.' % file 
+            raise IOError('Metadata File %s not found.' % file) 
             
         dom=xml.dom.minidom.parse(file)
         
@@ -87,7 +87,7 @@ class XmlLoader:
         if tag:
             if not tag == xtag:
                 dom.unlink()
-                raise IOError, 'Incorrect XML Element, expected %s found %s.' % (tag,xtag)        
+                raise IOError('Incorrect XML Element, expected %s found %s.' % (tag,xtag))        
                 
         return dom
     
@@ -165,7 +165,7 @@ class XmlWorker:
             self.postProcess(task,dom)        
             
             task.setResult(XmlResult(dom))
-        except Exception, details:
+        except Exception as details:
             
             log.warning('Failed to parse XML %s : %s' % (task.getDescription(),details))
             
@@ -193,7 +193,7 @@ class XmlWorker:
             elif child.nodeType == xml.dom.Node.TEXT_NODE:
                 pass # log.debug("Skip Text: " + `child.nodeType`)          
             else:
-                log.debug("Skip Node: " + `child.nodeType` + ' ' + `child`)                       
+                log.debug("Skip Node: " + repr(child.nodeType) + ' ' + repr(child))                       
     
 class ModelLoader:
     """
@@ -246,8 +246,8 @@ class ModelLoader:
                 if parentObject:
                     object=parentObject.getObjectForTag(element.tagName,dom,name)
                     
-                    log.debug("Used parent: %s to get %s for <%s %s" %(`parentObject`,`object`,
-                                `element.tagName`,`name`))  
+                    log.debug("Used parent: %s to get %s for <%s %s" %(repr(parentObject),repr(object),
+                                repr(element.tagName),repr(name)))  
                 else:
                     # Just construct
                     if name: object=cls(name,dom)
@@ -273,7 +273,7 @@ class ModelLoader:
         #    transferAnnotations(parser, object)
         
         if not rootObject:
-            raise RuntimeError, 'Failed to extract %s from XML.' % cls.__name__
+            raise RuntimeError('Failed to extract %s from XML.' % cls.__name__)
         
         return rootObject
         

Modified: gump/live/python/gump/core/model/builder.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/model/builder.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/model/builder.py (original)
+++ gump/live/python/gump/core/model/builder.py Mon Nov 30 21:45:38 2020
@@ -60,7 +60,7 @@ class Builder(ModelObject, PropertyConta
         if not self.project:
             return self.__class__.__name__
         else:
-            return self.__class__.__name__ + ' on ' + `self.project`
+            return self.__class__.__name__ + ' on ' + repr(self.project)
 
     #
     # expand properties - in other words, do everything to complete the
@@ -440,7 +440,7 @@ class MvnInstall(Maven):
                     prop = Property(MvnInstall.VERSION, dom, self.project)
                     prop.complete(self.project, self.project.getWorkspace())
                     props.append(prop)
-            except Exception, details:
+            except Exception as details:
                 self.project.addError('failed to parse POM because of '
                                       + str(details))
         return props

Modified: gump/live/python/gump/core/model/depend.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/model/depend.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/model/depend.py (original)
+++ gump/live/python/gump/core/model/depend.py Mon Nov 30 21:45:38 2020
@@ -146,7 +146,7 @@ class ProjectDependency(Annotatable):
         return self.project
         
     def hasInheritence(self):
-        return self.inherit <> INHERIT_NONE
+        return self.inherit != INHERIT_NONE
         
     def getInheritence(self):
         return self.inherit
@@ -245,7 +245,7 @@ class DependSet:
             dependProject = depend.getOwnerProject()
         else:
             dependProject = depend.getProject()        
-        if not self.projectMap.has_key(dependProject):
+        if dependProject not in self.projectMap:
             self.projectMap[dependProject] = []            
         self.projectMap[dependProject] = depend
         
@@ -253,13 +253,13 @@ class DependSet:
         return (depend in self.depends)
         
     def containsProject(self, project):
-        return self.projectMap.has_key(project)
+        return project in self.projectMap
         
     def getDepends(self):
         return self.depends
         
     def getUniqueProjectDependList(self):
-        return self.projectMap.keys()
+        return list(self.projectMap.keys())
         
     def getUniqueProjectDependCount(self):
         return len(self.projectMap)

Modified: gump/live/python/gump/core/model/misc.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/model/misc.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/model/misc.py (original)
+++ gump/live/python/gump/core/model/misc.py Mon Nov 30 21:45:38 2020
@@ -30,6 +30,9 @@ class Positioned:
         self.posn = -1
         self.total = -1
 
+    def __del__(self):
+        pass
+
     def setPosition(self, posn):
         """ Set this object's position (within some sequence) """
         self.posn = posn
@@ -54,6 +57,10 @@ class Resultable:
     def __init__(self): 
         pass
 
+    def __del__(self):
+        self.results=None
+        self.serverResults=None
+
     # Stats are loaded separately and cached on here, 
     # hence they may exist on an object at all times.
     def hasServerResults(self):
@@ -64,8 +71,8 @@ class Resultable:
 
     def getServerResults(self):
         if not self.hasServerResults():
-            raise RuntimeError, "ServerResults not available [yet]: " \
-                    + self.getName()
+            raise RuntimeError("ServerResults not available [yet]: " \
+                    + self.getName())
         return self.serverResults
 
 
@@ -79,8 +86,8 @@ class Resultable:
 
     def getResults(self):
         if not self.hasResults():
-            raise RuntimeError, "Results not available [yet]: " \
-                    + self.getName()
+            raise RuntimeError("Results not available [yet]: " \
+                    + self.getName())
         return self.results
 
 class Resolvable(ModelObject):

Modified: gump/live/python/gump/core/model/module.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/model/module.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/model/module.py (original)
+++ gump/live/python/gump/core/model/module.py Mon Nov 30 21:45:38 2020
@@ -286,6 +286,12 @@ class Module(NamedModelObject, Statable,
 
         self.groupId = None
 
+    def __lt__(self, other):
+        return self.name < other.name
+
+    def __gt__(self, other):
+        return self.name > other.name
+
     def getObjectForTag(self, tag, dom, name = None):
         """
                 Get a new (or spliced) object for this tag
@@ -402,13 +408,13 @@ class Module(NamedModelObject, Statable,
         if not packageCount:
             allPackaged = False
 
-        log.debug('Packaged? ' + `self` + ':' + `packageCount`)
+        log.debug('Packaged? ' + repr(self) + ':' + repr(packageCount))
 
         # Give this module a second try,  if some are packaged, and
         # check if the others have no outputs, then call them good.
         if packageCount and not allPackaged:
 
-            log.debug('Packaged? ' + `self` + ':' + `packageCount`)
+            log.debug('Packaged? ' + repr(self) + ':' + repr(packageCount))
 
             allPackaged = True
             for project in self.getProjects():
@@ -437,7 +443,7 @@ class Module(NamedModelObject, Statable,
             self.setPackaged(True)
             self.changeState(STATE_COMPLETE, REASON_PACKAGE)
             self.addInfo("\'Packaged\' Module. (Packaged projects: " + \
-                                    `packageCount` + '.)')
+                                    repr(packageCount) + '.)')
 
         # Determine source directory
         self.absWorkingDir = \
@@ -540,7 +546,7 @@ class Module(NamedModelObject, Statable,
         name = project.getName()
 
         if self.hasProject(name):
-            raise RuntimeError, 'Attempt to add duplicate project: ' + name
+            raise RuntimeError('Attempt to add duplicate project: ' + name)
 
         # Reference this module as owner
         project.setModule(self)
@@ -555,17 +561,16 @@ class Module(NamedModelObject, Statable,
             otherProject = self.getOwner().getProject(name)
 
             if not project is otherProject:
-                raise RuntimeError, \
-                    'Attempt to add duplicate project (in module): ' + name
+                raise RuntimeError('Attempt to add duplicate project (in module): ' + name)
 
     def hasProject(self, name):
-        return self.projects.has_key(name)
+        return name in self.projects
 
     def getProject(self, name):
         return self.projects[name]
 
     def getProjects(self):
-        return self.projects.values()
+        return list(self.projects.values())
 
     def getSortedProjects(self):
         return self.sortedProjects

Modified: gump/live/python/gump/core/model/object.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/model/object.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/model/object.py (original)
+++ gump/live/python/gump/core/model/object.py Mon Nov 30 21:45:38 2020
@@ -22,7 +22,6 @@
 """
 
 from time import localtime, strftime, tzname
-from string import lower, capitalize
 
 from gump.util.note import *
 from gump.util.work import *
@@ -148,8 +147,8 @@ class ModelObject(Annotatable,Workable,F
         """ Display the contents of this object """
         # output.write(getIndent(indent)+'Class: ' + self.__class__.__name__ + '\n')
         if self.hasOwner():
-            output.write(getIndent(indent)+'Owner: ' + `self.getOwner()` + '\n')
-        output.write(getIndent(indent)+'Id: ' + `id(self)` + '\n')
+            output.write(getIndent(indent)+'Owner: ' + repr(self.getOwner()) + '\n')
+        output.write(getIndent(indent)+'Id: ' + repr(id(self)) + '\n')
         #output.write(getIndent(indent)+'Id DOM: ' + `id(self.dom)` + '\n')
         #output.write(getIndent(indent)+'Id Element: ' + `id(self.element)` + '\n')
         if self.isSpliced():
@@ -268,7 +267,7 @@ class ModelObject(Annotatable,Workable,F
         
     def splice(self,dom): 
         if self.isComplete():
-            raise RuntimeError, "Can't splice a completed entity: " + `self`
+            raise RuntimeError("Can't splice a completed entity: " + repr(self))
         # log.debug("Splice: " + `dom`) 
         spliceDom(self.element,dom)
         self.setSpliced(True) 
@@ -293,7 +292,7 @@ class NamedModelObject(ModelObject):
         # Named
         self.name=name
         if not name:
-            raise RuntimeError, self.__class__.__name__ + ' needs a name.'
+            raise RuntimeError(self.__class__.__name__ + ' needs a name.')
             
         self.hash=0
         

Modified: gump/live/python/gump/core/model/profile.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/model/profile.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/model/profile.py (original)
+++ gump/live/python/gump/core/model/profile.py Mon Nov 30 21:45:38 2020
@@ -20,7 +20,6 @@
 """
 
 from time import localtime, strftime, tzname
-from string import lower, capitalize
 
 from gump.util.work import *
 from gump.util.tools import *

Modified: gump/live/python/gump/core/model/project.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/model/project.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/model/project.py (original)
+++ gump/live/python/gump/core/model/project.py Mon Nov 30 21:45:38 2020
@@ -43,6 +43,7 @@ from gump.util import getIndent, getStri
 from gump.util.domutils import transferDomInfo, hasDomAttribute, \
     getDomAttributeValue, getDomTextValue, getDomChildIterator
 from gump.util.note import transferAnnotations
+from functools import reduce
 
 class Project(NamedModelObject, Statable, Resultable, Dependable, Positioned):
     """ A Single project """
@@ -131,6 +132,12 @@ class Project(NamedModelObject, Statable
         Dependable.__del__(self)
         Positioned.__del__(self)
 
+    def __lt__(self, other):
+        return self.name < other.name
+
+    def __gt__(self, other):
+        return self.name > other.name
+
     def hasNotifys(self):
         """
         Does this project have any notification addresses, and if not
@@ -311,12 +318,12 @@ class Project(NamedModelObject, Statable
 
     def getOutputs(self):
         self.expand_outputs()
-        return reduce(lambda l1, l2: l1 + l2, self.outputs.itervalues(), [])
+        return reduce(lambda l1, l2: l1 + l2, iter(self.outputs.values()), [])
 
     def expand_outputs(self):
         """ expands glob patterns in output names """
         if (self.built or not self.hasBuilder()) and not self.outputs_expanded:
-            for l in self.outputs.itervalues():
+            for l in self.outputs.values():
                 for output in l:
                     path = output.getPath()
                     log.debug("glob expanding " + path)
@@ -841,13 +848,12 @@ class Project(NamedModelObject, Statable
 
     def setModule(self, module):
         if self.module:
-            raise RuntimeError, \
-                'Project [' + self.name + '] already has a module set'
+            raise RuntimeError('Project [' + self.name + '] already has a module set')
         self.module = module
 
     def getModule(self):
         if not self.inModule():
-            raise RuntimeError, 'Project [' + self.name + '] not in a module.]'
+            raise RuntimeError('Project [' + self.name + '] not in a module.]')
         return self.module 
 
     def getWorkspace(self):
@@ -896,7 +902,7 @@ class Project(NamedModelObject, Statable
             self.languageType = Project.LANGUAGE_MAP[lang]
         except:
             message = 'Language %s not in supported %s.' \
-                % (lang, Project.LANGUAGE_MAP.keys())
+                % (lang, list(Project.LANGUAGE_MAP.keys()))
             self.addWarning(message)
             log.warning(message)
 
@@ -971,7 +977,7 @@ class Project(NamedModelObject, Statable
             self.addOutput(output)
 
         # ensure id is unique per output type
-        for output_type in self.outputs.keys():
+        for output_type in list(self.outputs.keys()):
             d = {}
             remove = []
             for o in self.outputs[output_type]:

Modified: gump/live/python/gump/core/model/propagation.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/model/propagation.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/model/propagation.py (original)
+++ gump/live/python/gump/core/model/propagation.py Mon Nov 30 21:45:38 2020
@@ -19,7 +19,6 @@
 """
 
 from time import localtime, strftime, tzname
-from string import lower, capitalize
 
 from gump.core.model.state import *
 from gump.util.work import *
@@ -61,11 +60,11 @@ class Propogatable(Stateful):
                                    
                 # Describe the problem
                 if not message:
-                    message = lower(stateDescription(state))
+                    message = stateDescription(state).lower()
                     if not REASON_UNSET == reason:
-                        message += " with reason " + lower(reasonDescription(reason))   
+                        message += " with reason " + reasonDescription(reason).lower()   
                 if isinstance(self,Workable):
-                    self.addInfo(capitalize(message))
+                    self.addInfo(message.capitalize())
         
                 # Send on the changes...
                 self.propagateErrorStateChange(state,reason,cause,message)

Modified: gump/live/python/gump/core/model/property.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/model/property.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/model/property.py (original)
+++ gump/live/python/gump/core/model/property.py Mon Nov 30 21:45:38 2020
@@ -27,7 +27,6 @@ from gump.util import getIndent
 from gump.util.domutils import getDomChildIterator, getDomAttributeValue, \
     hasDomAttribute
 from gump.util.owner import Ownable
-from types import NoneType
 
 # represents a <property/> element
 class Property(NamedModelObject):
@@ -145,6 +144,7 @@ class Property(NamedModelObject):
                 responsibleParty.addError('No project specified.')
 
         elif self.hasDomAttribute('path'):
+
             # If a property on a project..
             if not parent == workspace: 
                 relativeProject = None
@@ -167,9 +167,11 @@ class Property(NamedModelObject):
                     # Path relative to module's srcdir (doesn't work
                     # in workspace)
                     path = self.getDomAttributeValue('path')
-                    self.value = os.path.abspath(os.path.join(    \
+                    joinedPath = os.path.join(    \
                             relativeProject.getModule().getWorkingDirectory(), 
-                            path))
+                            path)
+                    absPath = os.path.abspath(joinedPath)
+                    self.value = absPath
             else:
                 responsibleParty.addError( \
                     'Can\'t have path on property on workspace: ' \
@@ -181,7 +183,7 @@ class Property(NamedModelObject):
         #
         # Do we have a value yet?
         #
-        if not blankOk and isinstance(self.value, NoneType):
+        if not blankOk and self.value is None:
             responsibleParty.addError('Unhandled Property: ' \
                                           + self.getName() + ' on: ' \
                                           + str(parent))
@@ -251,7 +253,7 @@ class PropertySet(Ownable):
         """
         Get a list of all the property objects
         """
-        return self.properties.values()
+        return list(self.properties.values())
 
     def importProperty(self, pdom):
         """

Modified: gump/live/python/gump/core/model/repository.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/model/repository.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/model/repository.py (original)
+++ gump/live/python/gump/core/model/repository.py Mon Nov 30 21:45:38 2020
@@ -69,7 +69,7 @@ class Repository(NamedModelObject, Stata
         typeAttribute = self.getDomAttributeValue('type')
         self.scmType = scm_type_for_name(typeAttribute)
         if not self.scmType:
-            raise RuntimeError, 'Invalid Repository Type:' + str(typeAttribute)
+            raise RuntimeError('Invalid Repository Type:' + str(typeAttribute))
 
         if SCM_TYPE_CVS == self.scmType:
             self.web = self.getDomChildValue('web') or \
@@ -82,22 +82,22 @@ class Repository(NamedModelObject, Stata
                 self.path = getDomChildValue(root, 'path')
                 self.hostname = getDomChildValue(root, 'hostname')
             else:
-                raise RuntimeError, 'No XML <root on repository: ' \
-                    + self.getName()
+                raise RuntimeError('No XML <root on repository: ' \
+                    + self.getName())
         elif SCM_TYPE_P4 == self.scmType:
             if self.hasDomChild('root'):
                 root = self.getDomChild('root')
                 self.p4port = getDomChildValue(root, 'hostname')
             else:
-                raise RuntimeError, 'No Perforce server on P4 repository: ' \
-                    + self.getName()
+                raise RuntimeError('No Perforce server on P4 repository: ' \
+                    + self.getName())
             self.web = self.getDomChildValue('web')
         else:
             if self.hasDomChild('url'):
                 self.url = self.getDomChildValue('url')
             else:
-                raise RuntimeError, 'No URL on ' + self.scmType.displayName + \
-                    ' repository: ' + self.getName()
+                raise RuntimeError('No URL on ' + self.scmType.displayName + \
+                    ' repository: ' + self.getName())
             self.web = self.getDomChildValue('web')
             self.user = self.getDomChildValue('user')
             self.password = self.getDomChildValue('password')
@@ -105,6 +105,10 @@ class Repository(NamedModelObject, Stata
         # Modules referencing this repository
         self.modules = []
 
+    def __lt__(self, other):
+        return self.name < other.name
+
+
     def complete(self, workspace):
         pass
 

Modified: gump/live/python/gump/core/model/server.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/model/server.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/model/server.py (original)
+++ gump/live/python/gump/core/model/server.py Mon Nov 30 21:45:38 2020
@@ -33,6 +33,9 @@ class Server(NamedModelObject):
         NamedModelObject.__init__(self,name,dom,workspace)
         
         self.resolver=None
+
+    def __lt__(self, other):
+        return self.name < other.name
             
     def complete(self,workspace):      
     

Modified: gump/live/python/gump/core/model/stats.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/model/stats.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/model/stats.py (original)
+++ gump/live/python/gump/core/model/stats.py Mon Nov 30 21:45:38 2020
@@ -48,6 +48,14 @@ class Statistics:
         self.startOfState=None
         self.sequenceInState=0
                 
+    def __del__(self):
+        self.name=None
+        self.first=None
+        self.last=None
+        self.currentState=None
+        self.previousState=None
+        self.startOfState=None
+        
       
     # FOG is (at present) effectively the
     # 'odds of success' (based off historical results).
@@ -142,6 +150,9 @@ class Statistics:
 class Statable:
     def __init__(self): pass
     
+    def __del__(self):
+        self.stats=None
+
     # Stats are loaded separately and cached on here,
     # hence they may exist on an object at all times.
     def hasStats(self):
@@ -152,8 +163,8 @@ class Statable:
         
     def getStats(self):
         if not self.hasStats():
-            raise RuntimeError, "Statistics not calculated/updated/available [yet]: " \
-                    + self.getName()
+            raise RuntimeError("Statistics not calculated/updated/available [yet]: " \
+                    + self.getName())
         return self.stats
         
     

Modified: gump/live/python/gump/core/model/workspace.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/model/workspace.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/model/workspace.py (original)
+++ gump/live/python/gump/core/model/workspace.py Mon Nov 30 21:45:38 2020
@@ -19,7 +19,6 @@
 """
 
 from time import localtime, strftime, tzname
-from string import lower, capitalize
 
 from gump.util.work import *
 from gump.util.tools import *
@@ -140,26 +139,26 @@ class Workspace(NamedModelObject, Proper
     
     # Repository Interface    
     def hasRepository(self,rname):
-        return self.repositories.has_key(rname)
+        return rname in self.repositories
         
     def getRepository(self,rname):
         return self.repositories[rname]
         
     def getRepositories(self):
-        return self.repositories.values()
+        return list(self.repositories.values())
         
     def getSortedRepositories(self):
         return self.sortedRepositories
 
     # Server Interface    
     def hasServer(self,rname):
-        return self.servers.has_key(rname)
+        return rname in self.servers
         
     def getServer(self,rname):
         return self.servers[rname]
         
     def getServers(self):
-        return self.servers.values()
+        return list(self.servers.values())
         
     def getPythonServers(self):
         """
@@ -179,44 +178,44 @@ class Workspace(NamedModelObject, Proper
 
     # Tracker Interface    
     def hasTracker(self,rname):
-        return self.trackers.has_key(rname)
+        return rname in self.trackers
         
     def getTracker(self,rname):
         return self.trackers[rname]
         
     def getTrackers(self):
-        return self.trackers.values()
+        return list(self.trackers.values())
         
     def getSortedTrackers(self):
         return self.sortedTrackers
 
     # Profile Interface        
     def hasProfile(self,mname):
-        return self.profiles.has_key(mname)
+        return mname in self.profiles
         
     def getProfile(self,mname):
         return self.profiles.get(mname,None)
 
     def getProfiles(self):
-        return self.profiles.values()              
+        return list(self.profiles.values())              
                 
     def getSortedProfiles(self):
         return self.sortedProfiles   
                 
     # Module Interface        
     def hasModule(self,mname):
-        return self.modules.has_key(mname)
+        return mname in self.modules
         
     def addModule(self,module):
         if self.hasModule(name):
-            raise RuntimeError, 'Attempt to add duplicate module: ' + name    
+            raise RuntimeError('Attempt to add duplicate module: ' + name)    
         self.modules[module.getName()]=module
         
     def getModule(self,mname):
         return self.modules.get(mname,None)
 
     def getModules(self):
-        return self.modules.values()              
+        return list(self.modules.values())              
                 
     def getSortedModules(self):
         return self.sortedModules   
@@ -225,19 +224,19 @@ class Workspace(NamedModelObject, Proper
     # through the owning modules)
                 
     def hasProject(self,pname):
-        return self.projects.has_key(pname)
+        return pname in self.projects
         
     def addProject(self,project):
         name=project.getName()
         if self.hasProject(name):
-            raise RuntimeError, 'Attempt to add duplicate project: ' + name    
+            raise RuntimeError('Attempt to add duplicate project: ' + name)    
         self.projects[name]=project
         
     def getProject(self,pname):
         return self.projects[pname]
                 
     def getProjects(self):
-        return self.projects.values() 
+        return list(self.projects.values()) 
                 
     def getSortedProjects(self):
         return self.sortedProjects       
@@ -306,7 +305,7 @@ class Workspace(NamedModelObject, Proper
                             'banner-link' :'bannerLink'})
     
         if not self.basedir:
-            raise RuntimeError, "A workspace cannot operate without a 'basedir'."
+            raise RuntimeError("A workspace cannot operate without a 'basedir'.")
             
         if not self.tmpdir: self.tmpdir=os.path.join(self.getBaseDirectory(),"tmp")
         if not self.logdir: self.logdir=os.path.join(self.getBaseDirectory(),"log")
@@ -324,19 +323,19 @@ class Workspace(NamedModelObject, Proper
         PropertyContainer.importProperties(self,self.element)        
         
         # Complete all profiles
-        for profile in self.profiles.values(): 
+        for profile in list(self.profiles.values()): 
             profile.complete(self)
             
         # Complete all repositories
-        for repository in self.repositories.values(): 
+        for repository in list(self.repositories.values()): 
             repository.complete(self)
 
         # Complete all servers
-        for server in self.servers.values(): 
+        for server in list(self.servers.values()): 
             server.complete(self)
 
         # Complete all trackers
-        for tracker in self.trackers.values(): 
+        for tracker in list(self.trackers.values()): 
             tracker.complete(self)
 
         # Complete the modules
@@ -444,7 +443,7 @@ class Workspace(NamedModelObject, Proper
         output.write('Workspace : \n')
         NamedModelObject.dump(self, indent+1, output)
         
-        for profile in self.profiles.values():
+        for profile in list(self.profiles.values()):
             profile.dump(indent+2,output)            
         
         for module in self.getModules():
@@ -453,7 +452,7 @@ class Workspace(NamedModelObject, Proper
         for project in self.getProjects():
             project.dump(indent+2,output)
         
-        for repo in self.repositories.values():
+        for repo in list(self.repositories.values()):
             repo.dump(indent+2,output)
             
         for server in self.getServers():

Modified: gump/live/python/gump/core/run/actor.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/run/actor.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/run/actor.py (original)
+++ gump/live/python/gump/core/run/actor.py Mon Nov 30 21:45:38 2020
@@ -133,7 +133,7 @@ class AbstractRunActor(RunActor):
         """
         if not hasattr(self,'processRun'): return        
         if not callable(self.processRun):  return        
-        self.log.debug('Process Run using [' + `self` + ']')        
+        self.log.debug('Process Run using [' + repr(self) + ']')        
         self.processRun()
         
             
@@ -144,7 +144,7 @@ class AbstractRunActor(RunActor):
         """
         if not hasattr(self,'processWorkspace'): return        
         if not callable(self.processWorkspace):  return        
-        self.log.debug('Process Workspace [' + `workspace` + '] using [' + `self` + ']')        
+        self.log.debug('Process Workspace [' + repr(workspace) + '] using [' + repr(self) + ']')        
         self.processWorkspace()
         
     def _processModule(self,module):
@@ -154,7 +154,7 @@ class AbstractRunActor(RunActor):
         """
         if not hasattr(self,'processModule'): return        
         if not callable(self.processModule):  return        
-        self.log.debug('Process Module [' + `module` + '] using [' + `self` + ']')        
+        self.log.debug('Process Module [' + repr(module) + '] using [' + repr(self) + ']')        
         self.processModule(module)
         
             
@@ -168,10 +168,10 @@ class AbstractRunActor(RunActor):
         
         # Hack for bad data.
         if project.inModule():   
-            self.log.debug('Process Project [' + `project` + '] using [' + `self` + ']')        
+            self.log.debug('Process Project [' + repr(project) + '] using [' + repr(self) + ']')        
             self.processProject(project)
         else:
-            self.log.debug('Skip Project (not in module) [' + `project` + '] for [' + `self` + ']')        
+            self.log.debug('Skip Project (not in module) [' + repr(project) + '] for [' + repr(self) + ']')        
                
     def _processOtherEvent(self,event):
         """
@@ -180,5 +180,5 @@ class AbstractRunActor(RunActor):
         """
         if not hasattr(self,'processOtherEvent'): return        
         if not callable(self.processOtherEvent):  return        
-        self.log.debug('Process (Other) Event [' + `event` + '] using [' + `self` + ']')        
+        self.log.debug('Process (Other) Event [' + repr(event) + '] using [' + repr(self) + ']')        
         self.processOtherEvent(event)

Modified: gump/live/python/gump/core/run/gumpenv.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/run/gumpenv.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/run/gumpenv.py (original)
+++ gump/live/python/gump/core/run/gumpenv.py Mon Nov 30 21:45:38 2020
@@ -29,7 +29,6 @@
 
 import os.path
 import sys
-from types import NoneType
 
 from gump.core.config import dir, EXIT_CODE_BAD_ENVIRONMENT, \
     EXIT_CODE_MISSING_UTILITY, time
@@ -126,19 +125,19 @@ class GumpEnvironment(Annotatable, Worka
         self.gumpHome = os.environ['GUMP_HOME']
 
         # JAVA_CMD can be set (perhaps for JRE verse JDK)
-        if os.environ.has_key('JAVA_CMD'):
+        if 'JAVA_CMD' in os.environ:
             self.javaCommand  = os.environ['JAVA_CMD']
             self.addInfo('JAVA_CMD environmental variable setting java' + \
                              ' command to ' + self.javaCommand )
 
         # JAVAC_CMD can be set (perhaps for JRE verse JDK)
-        if os.environ.has_key('JAVAC_CMD'):
+        if 'JAVAC_CMD' in os.environ:
             self.javacCommand  = os.environ['JAVAC_CMD']
             self.addInfo('javaCommand environmental variable setting javac' + \
                              ' command to ' + self.javacCommand )
         else:
             # Default to $JAVA_HOME/bin/java, can be overridden with $JAVA_CMD.
-            if os.environ.has_key('JAVA_HOME'):
+            if 'JAVA_HOME' in os.environ:
                 self.javaCommand  = os.path.join(os.environ['JAVA_HOME'],
                                                  'bin', self.javaCommand)
                 self.addInfo('javaCommand set to $JAVA_HOME/bin/java = ' + \
@@ -146,7 +145,7 @@ class GumpEnvironment(Annotatable, Worka
 
         self._checkEnvVariable('JAVA_HOME')
 
-        if os.environ.has_key('JAVA_HOME'):
+        if 'JAVA_HOME' in os.environ:
             self.javaHome  = os.environ['JAVA_HOME']
             self.addInfo('JAVA_HOME environmental variable setting java' + \
                              ' home to ' + self.javaHome )
@@ -277,7 +276,7 @@ class GumpEnvironment(Annotatable, Worka
         primarily so we can log/display them (for user review).
         """
 
-        if not isinstance(self.javaProperties, NoneType):
+        if self.javaProperties is not None:
             return self.javaProperties
 
         # Ensure we've determined the Java Compiler to use
@@ -288,7 +287,7 @@ class GumpEnvironment(Annotatable, Worka
                                "Environment was not found")
             return {}
 
-        import commands, re
+        import subprocess, re
 
         JAVA_SOURCE = dir.tmp + '/sysprop.java'
 
@@ -312,13 +311,13 @@ class GumpEnvironment(Annotatable, Worka
         os.unlink(JAVA_SOURCE)
 
         cmd = self.javaCommand + ' -cp ' + dir.tmp + ' sysprop'
-        result = commands.getoutput(cmd)
+        result = subprocess.getoutput(cmd)
         self.javaProperties = dict(re.findall('(.*?): (.*)', result))
         JAVA_CLASS = JAVA_SOURCE.replace('.java', '.class')
         if os.path.exists(JAVA_CLASS):
             os.unlink(JAVA_CLASS)
 
-        for (name, value) in self.javaProperties.items():
+        for (name, value) in list(self.javaProperties.items()):
             self.log.debug("Java Property: " + name + " = > " + value)
 
         return self.javaProperties
@@ -350,7 +349,7 @@ class GumpEnvironment(Annotatable, Worka
                                                                  options,
                                                              name)
             if cmd_env:
-                for env_key in cmd_env.keys():
+                for env_key in list(cmd_env.keys()):
                     cmd.addEnvironment(env_key, cmd_env[env_key])
 
             result = execute(cmd)
@@ -360,7 +359,7 @@ class GumpEnvironment(Annotatable, Worka
             else:
                 self.log.warning('Failed to detect [' + exe + ' ' + \
                                      options + ']')
-        except Exception, details:
+        except Exception as details:
             ok = False
             self.log.error('Failed to detect [' + exe + ' ' + options + \
                                '] : ' + str(details))
@@ -370,10 +369,10 @@ class GumpEnvironment(Annotatable, Worka
         self.performedWork(CommandWorkItem(WORK_TYPE_CHECK, cmd, result))
 
         if not ok and mandatory:
-            print
-            print "Unable to detect/test mandatory [" + exe + "] in path:"
+            print()
+            print("Unable to detect/test mandatory [" + exe + "] in path:")
             for p in sys.path:
-                print "  " + str(os.path.abspath(p))
+                print("  " + str(os.path.abspath(p)))
             sys.exit(EXIT_CODE_MISSING_UTILITY)
 
         # Store the output
@@ -389,25 +388,25 @@ class GumpEnvironment(Annotatable, Worka
         """
         ok = False
         try:
-            ok = os.environ.has_key(envvar)
+            ok = envvar in os.environ
             if not ok:
                 self.log.info('Failed to find environment variable [' + \
                                   envvar + ']')
 
-        except Exception, details:
+        except Exception as details:
             ok = False
             self.log.error('Failed to find environment variable [' + envvar + \
                                '] : ' + str(details))
 
         if not ok and mandatory:
-            print
-            print "Unable to find mandatory [" + envvar + "] in environment:"
-            for e in os.environ.keys():
+            print()
+            print("Unable to find mandatory [" + envvar + "] in environment:")
+            for e in list(os.environ.keys()):
                 try:
                     v = os.environ[e]
-                    print "  " + e + " = " + v
+                    print("  " + e + " = " + v)
                 except:
-                    print "  " + e
+                    print("  " + e)
             sys.exit(EXIT_CODE_BAD_ENVIRONMENT)
 
         return ok

Modified: gump/live/python/gump/core/run/gumprun.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/run/gumprun.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/run/gumprun.py (original)
+++ gump/live/python/gump/core/run/gumprun.py Mon Nov 30 21:45:38 2020
@@ -98,13 +98,13 @@ class GumpRun(gump.util.timing.Timeable,
         self.outputsRepository=ArtifactRepository(workspace.repodir)
                   
         # Generate a GUID (or close)
-        import md5
+        import hashlib
         import socket        
-        m=md5.new()
+        m=hashlib.md5()
         self.guid = socket.getfqdn()  + ':' + workspace.getName() + ':' + default.datetime_s
-        m.update(self.guid)
+        m.update(self.guid.encode('utf-8'))
         self.hexguid=m.hexdigest().upper()     
-        self.log.info('Run GUID [' + `self.guid` + '] using [' + `self.hexguid` + ']')    
+        self.log.info('Run GUID [' + repr(self.guid) + '] using [' + repr(self.hexguid) + ']')    
         
         # Actor Queue
         self.actors=list()
@@ -167,34 +167,34 @@ class GumpRun(gump.util.timing.Timeable,
         self.gumpSet.dump(indent+1,output)
        
     def registerActor(self,actor):
-        self.log.debug('Register Actor : ' + `actor`)
+        self.log.debug('Register Actor : ' + repr(actor))
         self.actors.append(actor)
         
     def logActors(self):
         self.log.debug('There are %s registered actors : ' % len(self.actors))       
         for actor in self.actors:
-            self.log.debug('Registered Actor : ' + `actor`)    
+            self.log.debug('Registered Actor : ' + repr(actor))    
             
         
     def _dispatchEvent(self,event):        
         """
             Perform the dispatch
         """
-        self.log.debug('Dispatch Event : ' + `event`)        
+        self.log.debug('Dispatch Event : ' + repr(event))        
         for actor in self.actors:
             #self.log.debug('Dispatch Event : ' + `event` + ' to ' + `actor`)     
             actor._processEvent(event)
-        gump.util.inspectGarbageCollection(`event`)
+        gump.util.inspectGarbageCollection(repr(event))
             
     def _dispatchRequest(self,request):
         """
             Perform the dispatch
         """
-        self.log.debug('Dispatch Request : ' + `request`)    
+        self.log.debug('Dispatch Request : ' + repr(request))    
         for actor in self.actors:
             #self.log.debug('Dispatch Request : ' + `request` + ' to ' + `actor`)       
             actor._processRequest(request)
-        gump.util.inspectGarbageCollection(`request`)
+        gump.util.inspectGarbageCollection(repr(request))
             
     def generateEvent(self,entity):
         """
@@ -271,7 +271,7 @@ class EntityRunEvent(RunEvent):
         self.realtime=realtime
             
     def __repr__(self):
-        return self.__class__.__name__ + ':' + `self.entity`
+        return self.__class__.__name__ + ':' + repr(self.entity)
         
     def getEntity(self):
         return self.entity 
@@ -306,7 +306,7 @@ class EntityRunRequest(RunEvent):
         self.entity=entity
         
     def __repr__(self):
-        return self.__class__.__name__ + ':' + `self.entity`
+        return self.__class__.__name__ + ':' + repr(self.entity)
         
     def getEntity(self):
         return self.entity 

Modified: gump/live/python/gump/core/run/gumpset.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/run/gumpset.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/run/gumpset.py (original)
+++ gump/live/python/gump/core/run/gumpset.py Mon Nov 30 21:45:38 2020
@@ -77,7 +77,7 @@ class GumpSet:
                         repositories=None ):
         self.workspace=workspace
         if not self.workspace:
-            raise RuntimeError, 'A non-None workspace is require'
+            raise RuntimeError('A non-None workspace is require')
             
         self.projectexpression=pexpr
         if not pexpr:
@@ -121,7 +121,7 @@ class GumpSet:
     # Validate a decent run
     def validate(self):
         if self.isEmpty():
-            raise RuntimeError, 'No projects match [' + self.projectexpression + ']'
+            raise RuntimeError('No projects match [' + self.projectexpression + ']')
         
     # No Projects
     def isEmpty(self):
@@ -250,7 +250,7 @@ class GumpSet:
         moduleTotal=len(sequence)
         for module in sequence:
             module.setTotal(moduleTotal)               
-            log.debug('Identify ' + module.getName() + ' at position #' + `module.getPosition()`)     
+            log.debug('Identify ' + module.getName() + ' at position #' + repr(module.getPosition()))     
           
         return sequence
   
@@ -274,7 +274,7 @@ class GumpSet:
         
         if not expr:expr='*'
         
-        log.debug('Extract projects for expression ['+`expr`+']')
+        log.debug('Extract projects for expression ['+repr(expr)+']')
         for project in self.workspace.getProjects():
             #log.debug('Evaluate ['+project.getName()+']')
             try:
@@ -283,7 +283,7 @@ class GumpSet:
                     try:
                         if pattern=="all": pattern='*'
                         if fnmatch.fnmatch(project.getName(),pattern): break                    
-                    except Exception, detail:
+                    except Exception as detail:
                         log.error('Failed to regexp: ' + pattern + '. Details: ' + str(detail))
                         continue
                 else:
@@ -291,7 +291,7 @@ class GumpSet:
                     continue
                 log.debug('Matched ['+project.getName()+'] using ['+pattern+']')
                 projects.append(project)
-            except Exception, detail:
+            except Exception as detail:
                 log.error('Failed to regexp: ' + expr + '. Details: ' + str(detail))
                 pass
         projects.sort()
@@ -341,14 +341,14 @@ class GumpSet:
                             break
                     else:
                         loop=", ".join([project.getName() for todoProject in todo])
-                        raise RuntimeError, "Circular Dependency Loop: " + str(loop) 
+                        raise RuntimeError("Circular Dependency Loop: " + str(loop)) 
                         
                         
         # Identify the size of overall sequence
         projectTotal=len(sequence)
         for project in sequence:
             project.setTotal(projectTotal)               
-            log.debug('Identify ' + project.getName() + ' at position #' + `project.getPosition()`)     
+            log.debug('Identify ' + project.getName() + ' at position #' + repr(project.getPosition()))     
                        
         return sequence
 

Modified: gump/live/python/gump/core/runner/demand.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/runner/demand.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/runner/demand.py (original)
+++ gump/live/python/gump/core/runner/demand.py Mon Nov 30 21:45:38 2020
@@ -189,7 +189,7 @@ class OnDemandRunner(GumpRunner):
             
                     # W/ multiple project in one module, it may be done
                     if not module.isUpdated():
-                        self.log.debug('Update module *inlined* (not in background thread) ' + `module` + '.')     
+                        self.log.debug('Update module *inlined* (not in background thread) ' + repr(module) + '.')     
                         inlined+=1
                         self.performUpdate(module)
 
@@ -234,7 +234,7 @@ class UpdateWork:
         self.module=module
         
     def __str__(self):
-        return 'UpdateWork:'+`self.module`
+        return 'UpdateWork:'+repr(self.module)
         
 class UpdateWorker(WorkerThread):
     """

Modified: gump/live/python/gump/core/runner/runner.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/runner/runner.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/runner/runner.py (original)
+++ gump/live/python/gump/core/runner/runner.py Mon Nov 30 21:45:38 2020
@@ -156,7 +156,7 @@ class GumpRunner(RunSpecific):
             try:
                 import gump.actor.mysql.databaser
                 self.run.registerActor(gump.actor.mysql.databaser.Databaser(self.run))
-            except Exception, details:
+            except Exception as details:
                 self.log.warning('Unable to register Database Actor :  %s ' % details,
                             exc_info=1)
 
@@ -167,7 +167,7 @@ class GumpRunner(RunSpecific):
             try:
                 import gump.actor.history.historical
                 self.run.registerActor(gump.actor.history.historical.Historical(self.run))
-            except Exception, details:
+            except Exception as details:
                 self.log.warning('Unable to register Historical Database Actor :  %s ' % details,
                             exc_info=1)
 
@@ -205,7 +205,7 @@ class GumpRunner(RunSpecific):
             try:
                 import gump.actor.rdf.describer
                 self.run.registerActor(gump.actor.rdf.describer.RDFDescriber(self.run))
-            except Exception, details:
+            except Exception as details:
                 self.log.warning('Unable to register RDF Describer :  %s ' % details,
                             exc_info=1)
 
@@ -250,14 +250,12 @@ class GumpRunner(RunSpecific):
         Does the actual gump work by delegating to the performRun(run) method of a subclass.
         """
         if not hasattr(self,'performRun'):
-            raise RuntimeError, \
-                    'Class [' + `self.__class__` + '] needs a performRun(self,run)'
+            raise RuntimeError('Class [' + repr(self.__class__) + '] needs a performRun(self,run)')
 
         if not callable(self.performRun):
-            raise RuntimeError, \
-                    'Class [' + `self.__class__` + '] needs a callable performRun(self,run)'
+            raise RuntimeError('Class [' + repr(self.__class__) + '] needs a callable performRun(self,run)')
 
-        self.log.debug('Perform run using [' + `self` + ']')
+        self.log.debug('Perform run using [' + repr(self) + ']')
 
         return self.performRun()
 

Modified: gump/live/python/gump/core/update/scmupdater.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/update/scmupdater.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/update/scmupdater.py (original)
+++ gump/live/python/gump/core/update/scmupdater.py Mon Nov 30 21:45:38 2020
@@ -17,7 +17,7 @@
 # limitations under the License.
 
 import os.path
-import StringIO
+import io
 
 from gump import log
 
@@ -72,7 +72,7 @@ def extract_URL(result, regex, command):
     """
     Extracs the URL from result
     """
-    stream = StringIO.StringIO()
+    stream = io.StringIO()
     catFile(stream, result.getOutput())
     output = stream.getvalue()
     stream.close()
@@ -116,7 +116,7 @@ class ScmUpdater(RunSpecific):
         """
 
         log.info('Perform ' + module.getScm().getScmType().displayName + \
-                     ' Checkout/Update on #[' + `module.getPosition()` + \
+                     ' Checkout/Update on #[' + repr(module.getPosition()) + \
                      '] : ' + module.getName())
 
         (cmd, isUpdate) = self.getCommandAndType(module)

Modified: gump/live/python/gump/core/update/updater.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/core/update/updater.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/core/update/updater.py (original)
+++ gump/live/python/gump/core/update/updater.py Mon Nov 30 21:45:38 2020
@@ -74,11 +74,11 @@ def syncModule(module):
             #
             module.setModified(True)                                  
             log.info('Update(s) received via on #[' \
-                            + `module.getPosition()` + \
+                            + repr(module.getPosition()) + \
                             '] : ' + module.getName())
                             
                     
-    except Exception, details:
+    except Exception as details:
         module.changeState(STATE_FAILED, REASON_SYNC_FAILED)
         message = 'Synchronize Failed: ' + str(details)
         module.addError(message)
@@ -163,7 +163,7 @@ class GumpUpdater(RunSpecific):
     #        
     #        if not module.isUpdatable(): continue
             
-        log.info('Perform Update on #[' + `module.getPosition()` + \
+        log.info('Perform Update on #[' + repr(module.getPosition()) + \
                         '] : ' + module.getName())
 
         # Do the appropriate...
@@ -202,4 +202,4 @@ class GumpUpdater(RunSpecific):
         if scmUpdater:
             scmUpdater.preview(module)
         else:
-            print 'No updater for module: ' + module.getName()            
+            print('No updater for module: ' + module.getName())            

Modified: gump/live/python/gump/test/artifacts.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/test/artifacts.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/test/artifacts.py (original)
+++ gump/live/python/gump/test/artifacts.py Mon Nov 30 21:45:38 2020
@@ -45,8 +45,8 @@ class ArtifactsTestSuite(UnitTestSuite):
         self.repo=gump.actor.repository.artifact.ArtifactRepository(self.testRepo)
         
         # Create some test files
-        file(self.license,'w').close()
-        file(self.jar1,'w').close()
+        open(self.license,'w').close()
+        open(self.jar1,'w').close()
         
         # Load a decent Run/Workspace
         self.run=getWorkedTestRun()  
@@ -72,7 +72,6 @@ class ArtifactsTestSuite(UnitTestSuite):
         (dated, latest)=self.repo.extractGroup('testGroup')
         
         self.assertNotNone('Extracted something', dated)
-        self.assertNotEmpty('Extracted something', dated)
         
     def testRepositoryExtract2(self):
         # Create a repository & populate it
@@ -80,16 +79,16 @@ class ArtifactsTestSuite(UnitTestSuite):
         
         gdir=self.repo.getGroupDir('test')
         
-        file(os.path.join(gdir,'id1-gump-20030221.jar'),'w').close()
-        file(os.path.join(gdir,'id1-gump-20040221.jar'),'w').close()
-        file(os.path.join(gdir,'id1-gump-20050221.jar'),'w').close()
-        file(os.path.join(gdir,'id2-gump-20030221.jar'),'w').close()
-        file(os.path.join(gdir,'id2-gump-20040221.jar'),'w').close()
-        file(os.path.join(gdir,'id2-gump-20050221.jar'),'w').close()
-        file(os.path.join(gdir,'id3-gump-20030221.jar'),'w').close()
-        file(os.path.join(gdir,'id3-gump-20040221.jar'),'w').close()
-        file(os.path.join(gdir,'id3-gump-20050221.jar'),'w').close()
-        file(os.path.join(gdir,'id4-gump-20050221.jar'),'w').close()
+        open(os.path.join(gdir,'id1-gump-20030221.jar'),'w').close()
+        open(os.path.join(gdir,'id1-gump-20040221.jar'),'w').close()
+        open(os.path.join(gdir,'id1-gump-20050221.jar'),'w').close()
+        open(os.path.join(gdir,'id2-gump-20030221.jar'),'w').close()
+        open(os.path.join(gdir,'id2-gump-20040221.jar'),'w').close()
+        open(os.path.join(gdir,'id2-gump-20050221.jar'),'w').close()
+        open(os.path.join(gdir,'id3-gump-20030221.jar'),'w').close()
+        open(os.path.join(gdir,'id3-gump-20040221.jar'),'w').close()
+        open(os.path.join(gdir,'id3-gump-20050221.jar'),'w').close()
+        open(os.path.join(gdir,'id4-gump-20050221.jar'),'w').close()
         
         (dated, latest)=self.repo.extractGroup('test')
         
@@ -97,6 +96,6 @@ class ArtifactsTestSuite(UnitTestSuite):
         #pprint.pprint(dated)
         
         self.assertNotNone('Extracted something', dated)
-        self.assertEqual('Extracted correct groups', len(dated.keys()), 3)
+        self.assertEqual('Extracted correct groups', len(list(dated.keys())), 3)
         self.assertEqual('Detected correct latest', latest, '20050221')
         

Modified: gump/live/python/gump/test/describer.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/test/describer.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/test/describer.py (original)
+++ gump/live/python/gump/test/describer.py Mon Nov 30 21:45:38 2020
@@ -22,7 +22,7 @@
 
 import os
 import logging
-import types, StringIO
+import types, io
 
 from gump import log
 import gump.core.config

Modified: gump/live/python/gump/test/diagram.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/test/diagram.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/test/diagram.py (original)
+++ gump/live/python/gump/test/diagram.py Mon Nov 30 21:45:38 2020
@@ -26,7 +26,7 @@ from gump.tool.svg.depdiag import Depend
 from gump.test import getWorkedTestRun
 from gump.test.pyunit import UnitTestSuite
 
-import StringIO
+import io
 
 class DiagramTestSuite(UnitTestSuite):
     def __init__(self):
@@ -53,7 +53,7 @@ class DiagramTestSuite(UnitTestSuite):
     def testScaleDiagramGeneration(self):
         diagram=ScaleDiagram([10,20])                
         svg=diagram.generateDiagram()
-        stream=StringIO.StringIO() 
+        stream=io.StringIO() 
         svg.serialize(stream)
         stream.close()
         

Modified: gump/live/python/gump/test/documenter.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/test/documenter.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/test/documenter.py (original)
+++ gump/live/python/gump/test/documenter.py Mon Nov 30 21:45:38 2020
@@ -19,7 +19,7 @@
 
 import os
 import logging
-import types, StringIO
+import types, io
 
 from gump import log
 import gump.core.config
@@ -44,7 +44,7 @@ class DocumenterTestSuite(UnitTestSuite)
         self.assertNotNone('Needed a workspace', self.workspace)
    
     def testText(self):
-        out=StringIO.StringIO()
+        out=io.StringIO()
         documenter=TextDocumenter(self.run,out)
         documenter.document()
         out.close()

Modified: gump/live/python/gump/test/integrator.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/test/integrator.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/test/integrator.py (original)
+++ gump/live/python/gump/test/integrator.py Mon Nov 30 21:45:38 2020
@@ -20,7 +20,7 @@
 
 import os
 import logging
-import types, StringIO
+import types, io
 
 from gump import log
 import gump.core.config

Modified: gump/live/python/gump/test/language.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/test/language.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/test/language.py (original)
+++ gump/live/python/gump/test/language.py Mon Nov 30 21:45:38 2020
@@ -23,7 +23,7 @@
 
 import os
 import logging
-import types, StringIO
+import types, io
 
 from gump import log
 
@@ -115,9 +115,9 @@ class LanguageTestSuite(UnitTestSuite):
         
     def testClasspathOnDepend(self):
         for depend in self.project3.getDirectDependencies():
-            print "Depend:" + `depend`        
+            print("Depend:" + repr(depend))        
         else:
-            print 'No p3 deps:'
+            print('No p3 deps:')
             
         self.assertTrue('<ant <depend gives full dependency (classpath)', \
                 self.project3.hasFullDependencyOnNamedProject('project1'))

Modified: gump/live/python/gump/test/loading.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/test/loading.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/test/loading.py (original)
+++ gump/live/python/gump/test/loading.py Mon Nov 30 21:45:38 2020
@@ -24,7 +24,7 @@
 
 import os
 import logging
-import types, StringIO
+import types, io
 
 from gump import log
 from gump.core.loader.loader import *

Modified: gump/live/python/gump/test/maven.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/test/maven.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/test/maven.py (original)
+++ gump/live/python/gump/test/maven.py Mon Nov 30 21:45:38 2020
@@ -22,7 +22,7 @@
 
 import os
 import logging
-import types, StringIO
+import types, io
 
 from gump import log
 import gump.core.config

Modified: gump/live/python/gump/test/mockobjects.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/test/mockobjects.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/test/mockobjects.py (original)
+++ gump/live/python/gump/test/mockobjects.py Mon Nov 30 21:45:38 2020
@@ -23,16 +23,16 @@ class MockLog:
         pass
     
     def debug(self,msg):
-        print "DEBUG: %s" % (msg)
+        print("DEBUG: %s" % (msg))
 
     def info(self,msg):
-        print "INFO: %s" % (msg)
+        print("INFO: %s" % (msg))
 
     def warning(self,msg):
-        print "WARNING: %s" % (msg)
+        print("WARNING: %s" % (msg))
 
     def error(self,msg):
-        print "ERROR: %s" % (msg)
+        print("ERROR: %s" % (msg))
         
 class MockConnection:
     def __init__(self,cursor):

Modified: gump/live/python/gump/test/model.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/test/model.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/test/model.py (original)
+++ gump/live/python/gump/test/model.py Mon Nov 30 21:45:38 2020
@@ -23,7 +23,7 @@
 
 import os
 import logging
-import types, StringIO
+import types, io
 
 from gump import log
 import gump.core.config
@@ -116,7 +116,7 @@ class ModelTestSuite(UnitTestSuite):
         properties=project2.getProperties()
         self.assertNotNone('Project2 has properties', project2.hasProperties())
         self.assertNotNone('Project2 has properties', properties)
-        self.assertNotEmpty('Project2 has some properties', properties)
+        self.assertNotEmptyDictionary('Project2 has some properties', properties)
         self.assertEqual('Explicit blank is ok', properties.getProperty('blank-ok'), "")
         self.assertNotNone('Explicit blank is NOT ok', properties.getProperty('blank-bogus'))
         
@@ -143,6 +143,19 @@ class ModelTestSuite(UnitTestSuite):
         self.assertFalse('Repository has Password',repo2.hasPassword())
         self.assertNone('Repository Password',repo2.getPassword())
 
+    def testConfigure(self):
+        self.assertNotNone('Got project1', self.project1)
+        self.assertTrue('Got project1 configure', self.project1.hasConfigure())
+        configure = self.project1.getConfigure() 
+        self.assertTrue('Has properties', configure.hasProperties())
+        properties = configure.getProperties()
+        self.assertNotNone('Has properties', properties)
+        for prop in properties:
+            self.assertNotNone('Has property name', prop.name)
+            self.assertNotEmptySequence('Has property name', prop.name)      
+            self.assertNotNone('Has property value', prop.value)
+            self.assertNotEmptySequence('Has property value', prop.value)      
+
     def testComparisons(self):
         project1 = self.project1
         project2 = self.project2
@@ -157,8 +170,8 @@ class ModelTestSuite(UnitTestSuite):
         projects.append(project1)
    
         
-        self.assertIn('Project in list',project1,projects)
-        self.assertNotIn('Project NOT in list',project2,projects)
+        self.assertInSequence('Project in list',project1,projects)
+        self.assertNotInSequence('Project should NOT be in list',project2,projects)
         
         ordered=createOrderedList([ project2, project1, project2, project1])
         
@@ -236,8 +249,8 @@ class ModelTestSuite(UnitTestSuite):
         module1=self.module1
         project1=self.project1
         
-        self.assertNotEmpty('Ought have a location', module1.getMetadataLocation() )
-        self.assertNotEmpty('Ought have a location', project1.getMetadataLocation() )
+        self.assertNotNone('Ought have a location', module1.getMetadataLocation() )
+        self.assertNotNone('Ought have a location', project1.getMetadataLocation() )
     
     def testMaven(self):                
         self.assertTrue('Maven project has a Maven object', self.maven1.hasMaven())
@@ -279,10 +292,10 @@ class ModelTestSuite(UnitTestSuite):
         #print commandLine  
         
     def testServers(self):
-        self.assertNotEmpty('Some servers ought be found', self.workspace.getServers())
+        self.assertNotEmptySequence('Some servers ought be found', self.workspace.getServers())
         
     def testTrackers(self):
-        self.assertNotEmpty('Some trackers ought be found', self.workspace.getTrackers())
+        self.assertNotEmptySequence('Some trackers ought be found', self.workspace.getTrackers())
                         
     def testNotification(self):
         self.assertTrue('Ought allow notify', self.workspace.isNotify())

Modified: gump/live/python/gump/test/nant.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/test/nant.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/test/nant.py (original)
+++ gump/live/python/gump/test/nant.py Mon Nov 30 21:45:38 2020
@@ -22,7 +22,7 @@
 
 import os
 import logging
-import types, StringIO
+import types, io
 
 from gump import log
 import gump.core.config

Modified: gump/live/python/gump/test/notifying.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/test/notifying.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/test/notifying.py (original)
+++ gump/live/python/gump/test/notifying.py Mon Nov 30 21:45:38 2020
@@ -20,7 +20,7 @@
 
 import os
 import logging
-import types, StringIO
+import types, io
 
 from gump import log
 import gump.core.config

Modified: gump/live/python/gump/test/pyunit.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/test/pyunit.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/test/pyunit.py (original)
+++ gump/live/python/gump/test/pyunit.py Mon Nov 30 21:45:38 2020
@@ -19,9 +19,10 @@
 """
 import os
 import sys
-from types import NoneType
 import types
 import logging
+import collections
+import collections.abc
 
 from gump import log
 from gump.core.gumpinit import gumpinit
@@ -45,14 +46,14 @@ class Testable:
             message += str(s)
             message += '] '
 
-        raise RuntimeError, message
+        raise RuntimeError(message)
 
     def assertNotNone(self, message, o):
-        if isinstance(o, NoneType):
+        if o is None:
             self.raiseIssue(['Ought NOT be None', message, o])
 
     def assertNone(self, message, o):
-        if not isinstance(o, NoneType):
+        if o is not None:
             self.raiseIssue(['Ought be None', message, o])
 
     def assertNonZero(self, message, o):
@@ -64,6 +65,10 @@ class Testable:
         if not (o1 == o2):
             self.raiseIssue(['Ought evaluate as equal', message, o1, o2])
 
+    def assertLesser(self, message, o1, o2):
+        if not (o1 < o2):
+            self.raiseIssue(['Ought evaluate as lesser', message, o1, o2])
+
     def assertGreater(self, message, o1, o2):
         if not (o1 > o2):
             self.raiseIssue(['Ought evaluate as greater', message, o1, o2])
@@ -78,14 +83,14 @@ class Testable:
 
     def assertFalse(self, message, o):
         if o:
-            self.raiseIssue(['Ought evaluate as false', message, o])
+            self.raiseIssue(['Ought evaluate as False', message, o])
 
     def assertInString(self, message, substr, superstring):
         if -1 == superstring.find(substr):
             self.raiseIssue(['Ought evaluate as in', message, substr,
                              superstring])
 
-    def assertIn(self, message, o, sequence):
+    def assertInSequence(self, message, o, sequence):
         if not o in sequence:
             self.raiseIssue(['Ought evaluate as in', message, o, sequence])
 
@@ -95,13 +100,25 @@ class Testable:
                              message, subString, mainString,
                              mainString.find(subString)])
 
-    def assertNotEmpty(self, message, sequence):
-        if not sequence or not len(sequence) > 0:
-            self.raiseIssue(['Ought NOT evaluate as empty', message, sequence])
+    def assertNotEmptyDictionary(self, message, dictionary):
+        if not dictionary:
+            self.raiseIssue(['Ought NOT evaluate as None dictionary', message, dictionary])
+        if not isinstance(dictionary,dict):
+            self.raiseIssue(['Ought NOT evaluate as NOT a dictionary', message, dictionary])
+        if not len(dictionary.keys()) > 0:
+            self.raiseIssue(['Ought NOT evaluate as an empty dictionary', message, dictionary])
+
+    def assertNotEmptySequence(self, message, sequence):
+        if not sequence:
+            self.raiseIssue(['Ought NOT evaluate as a None sequence', message, sequence])
+        if not isinstance(sequence,collections.abc.Sequence):
+            self.raiseIssue(['Ought NOT evaluate as NOT a sequence', message, sequence])
+        if not len(sequence) > 0:
+            self.raiseIssue(['Ought NOT evaluate as an empty sequence', message, sequence])
 
-    def assertNotIn(self, message, o, sequence):
+    def assertNotInSequence(self, message, o, sequence):
         if o in sequence:
-            self.raiseIssue(['Ought NOT evaluate as in', message, o, sequence])
+            self.raiseIssue(['Ought NOT evaluate as in sequence', message, o, sequence])
 
     def assertNotSubstring(self, message, subString, mainString):
         if not -1 == mainString.find(subString):
@@ -118,7 +135,7 @@ class Testable:
         self.assertEqual(message, o, sequence[posn])
 
     def assertString(self, message, o):
-        if not isinstance(o, types.StringTypes):
+        if not isinstance(o, str):
             self.raiseIssue(['Ought be a String type', message, o,
                              type(o)])
 
@@ -201,7 +218,7 @@ class UnitTestSuite(Testable):
             # avoid nulls, metadata, and methods other than test*
             if not test:
                 continue
-            if isinstance(test, types.TypeType):
+            if isinstance(test, type):
                 continue
             if not isinstance(test, types.MethodType):
                 continue
@@ -213,12 +230,13 @@ class UnitTestSuite(Testable):
             # If arguments, they are patterns to match
             if ptrns:
                 for pattern in ptrns:
+                    #print("Pattern : " + name + " - " + pattern)
                     try:
                         if pattern == "all":
                             pattern = '*'
                         if fnmatch(name, pattern):
                             break
-                    except Exception, detail:
+                    except Exception as detail:
                         log.error('Failed to regexp: ' + pattern + \
                                       '. Details: ' + str(detail))
                         continue
@@ -247,7 +265,7 @@ class UnitTestSuite(Testable):
                     if hasattr(self, 'tearDown'):
                         self.tearDown()
 
-                except Exception, _details:
+                except Exception as _details:
                     log.error('Test [' + self.__class__.__name__ \
                                   + ':' + test.__name__ + '] Failed',
                               exc_info = 1)
@@ -284,7 +302,7 @@ class TestRunner:
         initializeGarbageCollection()
 
         # Sort to resolve dependency order
-        runOrder = createOrderedList(self.suites)
+        runOrder = self.suites # TEMPORARY createOrderedList(self.suites)
 
         testsRun = 0
         problems = []
@@ -295,7 +313,7 @@ class TestRunner:
                 (runs, results) = suite.performTests(args)
                 testsRun += runs
                 problems += results
-            except Exception, _details:
+            except Exception as _details:
                 log.error('Failed')
                 ei = sys.exc_info()
                 message = formatException(ei)
@@ -304,8 +322,8 @@ class TestRunner:
 
         printSeparator()
 
-        log.info('Performed [' + `testsRun` + '] tests with [' + \
-                     `len(problems)` + '] issues.')
+        log.info('Performed [' + repr(testsRun) + '] tests with [' + \
+                     repr(len(problems)) + '] issues.')
 
         for problem in problems:
             log.error('------------------------------------------------------------------------')

Modified: gump/live/python/gump/test/resolving.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/test/resolving.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/test/resolving.py (original)
+++ gump/live/python/gump/test/resolving.py Mon Nov 30 21:45:38 2020
@@ -21,7 +21,7 @@
 
 import os
 import logging
-import types, StringIO
+import types, io
 
 from gump import log
 import gump.core.config
@@ -90,7 +90,7 @@ class ResolvingTestSuite(UnitTestSuite):
 
         path=Path()
         
-        print path.getPathUp()
+        print(path.getPathUp())
         self.assertNotNone('Ought be period.', path.getPathUp())
         
         path1=path.getPostfixed('ABC')
@@ -142,7 +142,7 @@ class ResolvingTestSuite(UnitTestSuite):
             self.assertNotNone(message + "::getDirectoryUrl", resolver.getDirectoryUrl(self.module1))
             self.assertNotNone(message + "::getUrl", resolver.getUrl(self.module1))
     
-            self.assertNotEmpty('Need work on workspace', self.workspace.getWorkList())        
+            self.assertNotEmptySequence('Need work on workspace', self.workspace.getWorkList())        
             for work in self.workspace.getWorkList():
                 #printSeparator()    
                 self.assertNotNone(message + "::work", work)

Modified: gump/live/python/gump/test/resources/full1/module1.xml
URL: http://svn.apache.org/viewvc/gump/live/python/gump/test/resources/full1/module1.xml?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/test/resources/full1/module1.xml (original)
+++ gump/live/python/gump/test/resources/full1/module1.xml Mon Nov 30 21:45:38 2020
@@ -12,6 +12,13 @@
          to="project1@jakarta.apache.org"/>
          
   <project name="project1">
+
+    <configure>
+      <arg name="--prefix" path="dest-@@DATE@@"/>
+      <arg name="--prefix1" path="dest1"/>
+      <arg name="--prefix2" value="dest1"/>
+    </configure>
+
     <package>org.apache.project1</package>
 
     <script name="gumpscript"/>

Modified: gump/live/python/gump/test/stats.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/test/stats.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/test/stats.py (original)
+++ gump/live/python/gump/test/stats.py Mon Nov 30 21:45:38 2020
@@ -20,7 +20,7 @@
 
 import os
 import logging
-import types, StringIO
+import types, io
 
 from gump import log
 import gump.core.config

Modified: gump/live/python/gump/test/svg.py
URL: http://svn.apache.org/viewvc/gump/live/python/gump/test/svg.py?rev=1883964&r1=1883963&r2=1883964&view=diff
==============================================================================
--- gump/live/python/gump/test/svg.py (original)
+++ gump/live/python/gump/test/svg.py Mon Nov 30 21:45:38 2020
@@ -24,7 +24,7 @@ from gump.tool.svg.drawing import *
 from gump.tool.svg.svg import *
 from gump.test.pyunit import UnitTestSuite
 
-import StringIO
+import io
 
 class SvgTestSuite(UnitTestSuite):
     def __init__(self):
@@ -33,7 +33,7 @@ class SvgTestSuite(UnitTestSuite):
     def testSvgConstruction(self):
         svg=SimpleSvg()
         
-        stream=StringIO.StringIO() 
+        stream=io.StringIO() 
         svg.serialize(stream)
         stream.close()