1 import sys, optparse, cfgparse
4 from manifold.util.singleton import Singleton
6 # http://docs.python.org/dev/library/argparse.html#upgrading-optparse-code
11 __metaclass__ = Singleton
13 # We should be able to use another default conf file
14 CONF_FILE = '/etc/manifold.conf'
16 def __init__(self, name = None):
17 self._opt = optparse.OptionParser()
25 "-c", "--config", dest = "cfg_file",
26 help = "Config file to use.",
27 default = self.CONF_FILE
33 \brief Parse options passed from command-line
37 # if we have a logger singleton, add its options here too
40 # Initialize options to default values
41 cfg = cfgparse.ConfigParser()
42 cfg.add_optparse_help_option(self._opt)
44 # Load configuration file
46 cfg_filename = sys.argv[sys.argv.index("-c") + 1]
48 with open(cfg_filename): cfg.add_file(cfg_filename)
50 raise Exception, "Cannot open specified configuration file: %s" % cfg_filename
53 with open(self.CONF_FILE): cfg.add_file(self.CONF_FILE)
56 for option_name in self._defaults:
57 cfg.add_option(option_name, default = self._defaults[option_name])
59 # Load/override options from configuration file and command-line
60 (options, args) = cfg.parse(self._opt)
61 self.options.update(vars(options))
65 def add_option(self, *args, **kwargs):
66 default = kwargs.get('default', None)
67 self._defaults[kwargs['dest']] = default
68 if 'default' in kwargs:
69 # This is very important otherwise file content is not taken into account
71 kwargs['help'] += " Defaults to %r." % default
72 self._opt.add_option(*args, **kwargs)
76 return self._name if self._name else os.path.basename(sys.argv[0])
79 return "<Options: %r>" % self.options
81 def __getattr__(self, key):
84 return self.options.get(key, None)
86 def __setattr(self, key, value):
87 self.options[key] = value