15b6bfdb9SJed Brownfrom __future__ import absolute_import 2179860b2SJed Brownclass ArgumentProcessor(object): 3179860b2SJed Brown '''This class provides interaction with an RDict object, which by default is shared''' 4179860b2SJed Brown defaultDB = None 5179860b2SJed Brown 6179860b2SJed Brown def __init__(self, clArgs = None, argDB = None): 7179860b2SJed Brown '''Setup the argument database''' 8179860b2SJed Brown self.argDB = self.createArgDB(argDB) 9179860b2SJed Brown if clArgs is None: 10179860b2SJed Brown import sys 11179860b2SJed Brown 12179860b2SJed Brown self.clArgs = sys.argv[1:] 13179860b2SJed Brown else: 14179860b2SJed Brown self.clArgs = clArgs 15179860b2SJed Brown return 16179860b2SJed Brown 17179860b2SJed Brown def __getstate__(self): 18179860b2SJed Brown '''We do not want to pickle the default RDict''' 19179860b2SJed Brown d = self.__dict__.copy() 20179860b2SJed Brown if '_argDB' in d: 21179860b2SJed Brown if d['_argDB'] is ArgumentProcessor.defaultDB: 22179860b2SJed Brown del d['_argDB'] 23179860b2SJed Brown else: 24179860b2SJed Brown d['_argDB'] = None 25179860b2SJed Brown return d 26179860b2SJed Brown 27179860b2SJed Brown def __setstate__(self, d): 28179860b2SJed Brown '''We must create the default RDict''' 29179860b2SJed Brown self.__dict__.update(d) 30179860b2SJed Brown if not '_argDB' in d: 31179860b2SJed Brown self.argDB = self.createArgDB(None) 32179860b2SJed Brown return 33179860b2SJed Brown 34179860b2SJed Brown def getArgDB(self): 35179860b2SJed Brown return self._argDB 36179860b2SJed Brown def setArgDB(self, argDB): 37179860b2SJed Brown self._argDB = argDB 38179860b2SJed Brown return 39179860b2SJed Brown argDB = property(getArgDB, setArgDB, doc = 'The RDict argument database') 40179860b2SJed Brown 41179860b2SJed Brown def createArgDB(self, initDB): 42179860b2SJed Brown '''Create an argument database unless initDB is provided, and insert the command line arguments''' 43179860b2SJed Brown if not initDB is None: 44179860b2SJed Brown argDB = initDB 45179860b2SJed Brown else: 46179860b2SJed Brown if ArgumentProcessor.defaultDB is None: 47179860b2SJed Brown import RDict 48179860b2SJed Brown import os 49179860b2SJed Brown import sys 50179860b2SJed Brown 51179860b2SJed Brown # Changed this to assume RDict is independent 52179860b2SJed Brown ArgumentProcessor.defaultDB = RDict.RDict(load = 0, autoShutdown = 0) 53179860b2SJed Brown argDB = ArgumentProcessor.defaultDB 54179860b2SJed Brown return argDB 55179860b2SJed Brown 56179860b2SJed Brown def setupArguments(self, argDB): 57179860b2SJed Brown '''Setup types in the argument database 58*6aad120cSJose E. Roman - This method should be overridden by any subclass with special arguments, making sure to call the superclass method''' 59179860b2SJed Brown return argDB 60179860b2SJed Brown 61179860b2SJed Brown def insertArguments(self, useEnvironment = 0): 62179860b2SJed Brown '''Put arguments in from the command line and environment 63179860b2SJed Brown - This will only insert command line arguments into a given RDict once''' 64179860b2SJed Brown if useEnvironment: 65179860b2SJed Brown import os 66179860b2SJed Brown 67179860b2SJed Brown self.argDB.insertArgs(os.environ) 68179860b2SJed Brown if not hasattr(self.argDB, '_setCommandLine'): 69179860b2SJed Brown self.argDB.insertArgs(self.clArgs) 70179860b2SJed Brown self.argDB._setCommandLine = 1 71179860b2SJed Brown return 72179860b2SJed Brown 73179860b2SJed Brown def setup(self): 74*6aad120cSJose E. Roman '''This method should be overridden for any setup after initialization 75179860b2SJed Brown - Here we determine argument types and insert arguments into the dictionary''' 76179860b2SJed Brown self.setupArguments(self.argDB) 77179860b2SJed Brown self.insertArguments() 78179860b2SJed Brown return 79179860b2SJed Brown 80179860b2SJed Brown def cleanup(self): 81*6aad120cSJose E. Roman '''This method should be overridden for any cleanup before finalization''' 82179860b2SJed Brown return 83