1*179860b2SJed Brownclass ArgumentProcessor(object): 2*179860b2SJed Brown '''This class provides interaction with an RDict object, which by default is shared''' 3*179860b2SJed Brown defaultDB = None 4*179860b2SJed Brown 5*179860b2SJed Brown def __init__(self, clArgs = None, argDB = None): 6*179860b2SJed Brown '''Setup the argument database''' 7*179860b2SJed Brown self.argDB = self.createArgDB(argDB) 8*179860b2SJed Brown if clArgs is None: 9*179860b2SJed Brown import sys 10*179860b2SJed Brown 11*179860b2SJed Brown self.clArgs = sys.argv[1:] 12*179860b2SJed Brown else: 13*179860b2SJed Brown self.clArgs = clArgs 14*179860b2SJed Brown return 15*179860b2SJed Brown 16*179860b2SJed Brown def __getstate__(self): 17*179860b2SJed Brown '''We do not want to pickle the default RDict''' 18*179860b2SJed Brown d = self.__dict__.copy() 19*179860b2SJed Brown if '_argDB' in d: 20*179860b2SJed Brown if d['_argDB'] is ArgumentProcessor.defaultDB: 21*179860b2SJed Brown del d['_argDB'] 22*179860b2SJed Brown else: 23*179860b2SJed Brown d['_argDB'] = None 24*179860b2SJed Brown return d 25*179860b2SJed Brown 26*179860b2SJed Brown def __setstate__(self, d): 27*179860b2SJed Brown '''We must create the default RDict''' 28*179860b2SJed Brown self.__dict__.update(d) 29*179860b2SJed Brown if not '_argDB' in d: 30*179860b2SJed Brown self.argDB = self.createArgDB(None) 31*179860b2SJed Brown return 32*179860b2SJed Brown 33*179860b2SJed Brown def getArgDB(self): 34*179860b2SJed Brown return self._argDB 35*179860b2SJed Brown def setArgDB(self, argDB): 36*179860b2SJed Brown self._argDB = argDB 37*179860b2SJed Brown return 38*179860b2SJed Brown argDB = property(getArgDB, setArgDB, doc = 'The RDict argument database') 39*179860b2SJed Brown 40*179860b2SJed Brown def createArgDB(self, initDB): 41*179860b2SJed Brown '''Create an argument database unless initDB is provided, and insert the command line arguments''' 42*179860b2SJed Brown if not initDB is None: 43*179860b2SJed Brown argDB = initDB 44*179860b2SJed Brown else: 45*179860b2SJed Brown if ArgumentProcessor.defaultDB is None: 46*179860b2SJed Brown import RDict 47*179860b2SJed Brown import os 48*179860b2SJed Brown import sys 49*179860b2SJed Brown 50*179860b2SJed Brown # Changed this to assume RDict is independent 51*179860b2SJed Brown ArgumentProcessor.defaultDB = RDict.RDict(load = 0, autoShutdown = 0) 52*179860b2SJed Brown argDB = ArgumentProcessor.defaultDB 53*179860b2SJed Brown return argDB 54*179860b2SJed Brown 55*179860b2SJed Brown def setupArguments(self, argDB): 56*179860b2SJed Brown '''Setup types in the argument database 57*179860b2SJed Brown - This method shouldbe overidden by any subclass with special arguments, making sure to call the superclass method''' 58*179860b2SJed Brown return argDB 59*179860b2SJed Brown 60*179860b2SJed Brown def insertArguments(self, useEnvironment = 0): 61*179860b2SJed Brown '''Put arguments in from the command line and environment 62*179860b2SJed Brown - This will only insert command line arguments into a given RDict once''' 63*179860b2SJed Brown if useEnvironment: 64*179860b2SJed Brown import os 65*179860b2SJed Brown 66*179860b2SJed Brown self.argDB.insertArgs(os.environ) 67*179860b2SJed Brown if not hasattr(self.argDB, '_setCommandLine'): 68*179860b2SJed Brown self.argDB.insertArgs(self.clArgs) 69*179860b2SJed Brown self.argDB._setCommandLine = 1 70*179860b2SJed Brown return 71*179860b2SJed Brown 72*179860b2SJed Brown def setup(self): 73*179860b2SJed Brown '''This method should be overidden for any setup after initialization 74*179860b2SJed Brown - Here we determine argument types and insert arguments into the dictionary''' 75*179860b2SJed Brown self.setupArguments(self.argDB) 76*179860b2SJed Brown self.insertArguments() 77*179860b2SJed Brown return 78*179860b2SJed Brown 79*179860b2SJed Brown def cleanup(self): 80*179860b2SJed Brown '''This method should be overidden for any cleanup before finalization''' 81*179860b2SJed Brown return 82