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