]> mj.ucw.cz Git - moe.git/commitdiff
Implemented overrides
authorMartin Mares <mj@ucw.cz>
Sat, 8 Aug 2009 15:13:54 +0000 (17:13 +0200)
committerMartin Mares <mj@ucw.cz>
Sat, 8 Aug 2009 15:13:54 +0000 (17:13 +0200)
t/moe/config.py
t/test.py

index 7c41fa2e774d31772e0f676f84f1a74330ad1a5d..f2ca64136bc19c7c3e52fd6aaedf68735a4f15cb 100644 (file)
@@ -16,7 +16,7 @@ class MoeConfig:
     """Moe configuration file."""
 
     def __init__(self, file=None, name=None):
-        self.cfg = {}
+        self.vars = {}
        if file is not None:
            self.load(file)
        elif name is not None:
@@ -34,24 +34,24 @@ class MoeConfig:
                v = x[sep+1:]
                if k.endswith("+"):
                    k = k[:-1]
-                   if not self.cfg.has_key(k):
-                       self.cfg[k] = [('a','')];
+                   if not self.vars.has_key(k):
+                       self.vars[k] = [('a','')];
                else:
-                   self.cfg[k] = []
+                   self.vars[k] = []
                if not key_pattern.match(k):
                    raise MoeConfigInvalid, "Malformed name of configuration variable"
                if v.startswith("'"):
                    v=v[1:]
                    if not v.endswith("'"):
                        raise MoeConfigInvalid, "Misquoted string"
-                   self.cfg[k].append(('s', v[:-1]))
+                   self.vars[k].append(('s', v[:-1]))
                elif v.startswith('"'):
                    v=v[1:]
                    if not v.endswith('"'):
                        raise MoeConfigInvalid, "Misquoted string"
-                   self.parse_interpolated(self.cfg[k], v[:-1])
+                   self.parse_interpolated(self.vars[k], v[:-1])
                else:
-                   self.cfg[k].append(('s', v))
+                   self.parse_interpolated(self.vars[k], v)
            else:
                raise MoeConfigInvalid, "Parse error"
 
@@ -93,7 +93,7 @@ class MoeConfig:
                s = s[p:]
 
     def dump(self, file=sys.stdout):
-        for k,v in self.cfg.items():
+        for k,v in self.vars.items():
            file.write(k)
            if len(v) > 0 and v[0][0] == 'a':
                file.write('+')
@@ -131,8 +131,8 @@ class MoeConfigStack:
     def do_get(self, k, pos):
         while pos >= 0:
            cfg = self.stk[pos]
-           if cfg.cfg.has_key(k):
-               new = cfg.cfg[k]
+           if cfg.vars.has_key(k):
+               new = cfg.vars[k]
                if new[0][0] == 'a':
                    v = self.do_get(k, pos-1)
                else:
@@ -145,3 +145,44 @@ class MoeConfigStack:
                return v
            pos -= 1
        return ''
+
+    def keys(self):
+        seen = {}
+       for cfg in self.stk:
+           for k in cfg.vars.keys():
+               seen[k] = None
+       return seen.keys()
+
+    def dump(self, file=sys.stdout):
+       for k in self.keys():
+           v = self[k]
+           file.write("%s=%s\n" % (k,v))
+
+    def dump_defs(self, file=sys.stdout):
+       file.write("Configuration stack:\n")
+       level = 0
+       for cfg in self.stk:
+           level += 1
+           file.write("(level %d)\n" % level)
+           cfg.dump(file)
+       file.write("(end)\n")
+
+    def apply_overrides(self, prefix):
+        newstk = []
+       for cfg in self.stk:
+           over = MoeConfig()
+           changed = False
+           for k in cfg.vars.keys():
+               if k.startswith(prefix):
+                   over.vars[k[len(prefix):]] = cfg.vars[k]
+                   changed = True
+           if changed:
+               clean = MoeConfig()
+               for k in cfg.vars.keys():
+                   if not k.startswith(prefix):
+                       clean.vars[k] = cfg.vars[k]
+               newstk.append(clean)
+               newstk.append(over)
+           else:
+               newstk.append(cfg)
+       self.stk = newstk
index 2460a214f3989723817bf4507a594243cb1462fe..d503b7c0c221b68cfbd59086fefda6914926f4d3 100755 (executable)
--- a/t/test.py
+++ b/t/test.py
@@ -20,4 +20,10 @@ s = moe.config.MoeConfigStack()
 s.push(c)
 s.push(d)
 
-print s['a']
+s.dump_defs()
+
+s.apply_overrides("x_")
+s.dump_defs()
+
+print "***"
+s.dump()