Autocomplete working in query_editor plugin
[unfold.git] / manifold / util / options.py
diff --git a/manifold/util/options.py b/manifold/util/options.py
new file mode 100644 (file)
index 0000000..d6bd958
--- /dev/null
@@ -0,0 +1,87 @@
+import sys, optparse, cfgparse
+import os.path
+
+from manifold.util.singleton    import Singleton
+
+# http://docs.python.org/dev/library/argparse.html#upgrading-optparse-code
+
+
+class Options(object):
+
+    __metaclass__ = Singleton
+
+    # We should be able to use another default conf file
+    CONF_FILE = '/etc/manifold.conf'
+    
+    def __init__(self, name = None):
+        self._opt = optparse.OptionParser()
+        self._defaults = {}
+        self._name = name
+        self.clear()
+
+    def clear(self):
+        self.options  = {}
+        self.add_option(
+            "-c", "--config", dest = "cfg_file",
+            help = "Config file to use.",
+            default = self.CONF_FILE
+        )
+        self.uptodate = True
+
+    def parse(self):
+        """
+        \brief Parse options passed from command-line
+        """
+        # add options here
+
+        # if we have a logger singleton, add its options here too
+        # get defaults too
+        
+        # Initialize options to default values
+        cfg = cfgparse.ConfigParser()
+        cfg.add_optparse_help_option(self._opt)
+
+        # Load configuration file
+        try:
+            cfg_filename = sys.argv[sys.argv.index("-c") + 1]
+            try:
+                with open(cfg_filename): cfg.add_file(cfg_filename)
+            except IOError: 
+                raise Exception, "Cannot open specified configuration file: %s" % cfg_filename
+        except ValueError:
+            try:
+                with open(self.CONF_FILE): cfg.add_file(self.CONF_FILE)
+            except IOError: pass
+
+        for option_name in self._defaults:
+            cfg.add_option(option_name, default = self._defaults[option_name])
+            
+        # Load/override options from configuration file and command-line 
+        (options, args) = cfg.parse(self._opt)
+        self.options.update(vars(options))
+        self.uptodate = True
+
+
+    def add_option(self, *args, **kwargs):
+        default = kwargs.get('default', None)
+        self._defaults[kwargs['dest']] = default
+        if 'default' in kwargs:
+            # This is very important otherwise file content is not taken into account
+            del kwargs['default']
+        kwargs['help'] += " Defaults to %r." % default
+        self._opt.add_option(*args, **kwargs)
+        self.uptodate = False
+        
+    def get_name(self):
+        return self._name if self._name else os.path.basename(sys.argv[0])
+
+    def __repr__(self):
+        return "<Options: %r>" % self.options
+
+    def __getattr__(self, key):
+        if not self.uptodate:
+            self.parse()
+        return self.options.get(key, None)
+
+    def __setattr(self, key, value):
+        self.options[key] = value