Autocomplete working in query_editor plugin
[myslice.git] / manifold / util / options.py
1 import sys, optparse, cfgparse
2 import os.path
3
4 from manifold.util.singleton    import Singleton
5
6 # http://docs.python.org/dev/library/argparse.html#upgrading-optparse-code
7
8
9 class Options(object):
10
11     __metaclass__ = Singleton
12
13     # We should be able to use another default conf file
14     CONF_FILE = '/etc/manifold.conf'
15     
16     def __init__(self, name = None):
17         self._opt = optparse.OptionParser()
18         self._defaults = {}
19         self._name = name
20         self.clear()
21
22     def clear(self):
23         self.options  = {}
24         self.add_option(
25             "-c", "--config", dest = "cfg_file",
26             help = "Config file to use.",
27             default = self.CONF_FILE
28         )
29         self.uptodate = True
30
31     def parse(self):
32         """
33         \brief Parse options passed from command-line
34         """
35         # add options here
36
37         # if we have a logger singleton, add its options here too
38         # get defaults too
39         
40         # Initialize options to default values
41         cfg = cfgparse.ConfigParser()
42         cfg.add_optparse_help_option(self._opt)
43
44         # Load configuration file
45         try:
46             cfg_filename = sys.argv[sys.argv.index("-c") + 1]
47             try:
48                 with open(cfg_filename): cfg.add_file(cfg_filename)
49             except IOError: 
50                 raise Exception, "Cannot open specified configuration file: %s" % cfg_filename
51         except ValueError:
52             try:
53                 with open(self.CONF_FILE): cfg.add_file(self.CONF_FILE)
54             except IOError: pass
55
56         for option_name in self._defaults:
57             cfg.add_option(option_name, default = self._defaults[option_name])
58             
59         # Load/override options from configuration file and command-line 
60         (options, args) = cfg.parse(self._opt)
61         self.options.update(vars(options))
62         self.uptodate = True
63
64
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
70             del kwargs['default']
71         kwargs['help'] += " Defaults to %r." % default
72         self._opt.add_option(*args, **kwargs)
73         self.uptodate = False
74         
75     def get_name(self):
76         return self._name if self._name else os.path.basename(sys.argv[0])
77
78     def __repr__(self):
79         return "<Options: %r>" % self.options
80
81     def __getattr__(self, key):
82         if not self.uptodate:
83             self.parse()
84         return self.options.get(key, None)
85
86     def __setattr(self, key, value):
87         self.options[key] = value