X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=t%2Fmoe%2Fconfig.py;h=99d36f3cb5fa853ebc79e6e48358cc82f05d9c2a;hb=9587bd376c403e16a0f79c9046eecc9b8f543cb8;hp=2a8443f10db9e515c9ef42a96e686d858eec19ce;hpb=6b13ac50371c389d1e8196d2a7319b26185dd3db;p=moe.git diff --git a/t/moe/config.py b/t/moe/config.py index 2a8443f..99d36f3 100644 --- a/t/moe/config.py +++ b/t/moe/config.py @@ -3,8 +3,8 @@ import re import sys -key_pattern = re.compile('^[A-Za-z0-9_-]+$') -ref_pattern = re.compile('^[A-Za-z0-9_-]+') +key_pattern = re.compile("^[A-Za-z0-9_-]+$") +ref_pattern = re.compile("^[A-Za-z0-9_-]+") class MoeConfigInvalid(Exception): pass @@ -21,21 +21,29 @@ class MoeConfig: self.load(file) elif name is not None: self.name = name - self.load(open(name, 'r')) + try: + file = open(name, "r") + except IOError, err: + raise MoeConfigInvalid, "Cannot open configuration file %s: %s" % (name, err.strerror) + else: + self.load(file) + + def set(self, k, v): + self.vars[k] = [("s", v)] def parse_line(self, x): x = x.rstrip("\n").lstrip(" \t") - if x=='' or x.startswith('#'): + if x=="" or x.startswith("#"): pass else: - sep = x.find('=') + sep = x.find("=") if sep >= 0: k = x[:sep] v = x[sep+1:] if k.endswith("+"): k = k[:-1] if not self.vars.has_key(k): - self.vars[k] = [('a','')]; + self.vars[k] = [("a","")]; else: self.vars[k] = [] if not key_pattern.match(k): @@ -44,7 +52,7 @@ class MoeConfig: v=v[1:] if not v.endswith("'"): raise MoeConfigInvalid, "Misquoted string" - self.vars[k].append(('s', v[:-1])) + self.vars[k].append(("s", v[:-1])) elif v.startswith('"'): v=v[1:] if not v.endswith('"'): @@ -62,17 +70,17 @@ class MoeConfig: try: self.parse_line(x) except MoeConfigInvalid, x: - msg = x.message + ' at line ' + str(lino) - if hasattr(self, 'name'): - msg += ' of ' + self.name + msg = x.message + " at line " + str(lino) + if hasattr(self, "name"): + msg += " of " + self.name raise MoeConfigInvalid, msg def parse_interpolated(self, list, s): - while s<>'': - if s.startswith('$'): + while s<>"": + if s.startswith("$"): s = s[1:] - if s.startswith('{'): - p = s.find('}') + if s.startswith("{"): + p = s.find("}") if not p: raise MoeConfigInvalid, "Unbalanced braces" k, s = s[1:p], s[p+1:] @@ -84,25 +92,25 @@ class MoeConfig: k, s = s[:m.end()], s[m.end():] else: raise MoeConfigInvalid, "Invalid variable reference" - list.append(('i', k)) + list.append(("i", k)) else: - p = s.find('$') + p = s.find("$") if p < 0: p = len(s) - list.append(('s', s[:p])) + list.append(("s", s[:p])) s = s[p:] def dump(self, file=sys.stdout): for k,v in self.vars.items(): file.write(k) - if len(v) > 0 and v[0][0] == 'a': - file.write('+') + if len(v) > 0 and v[0][0] == "a": + file.write("+") v = v[1:] - file.write('=') + file.write("=") for t,w in v: - if t == 's': + if t == "s": file.write("'" + w + "'") - elif t == 'i': + elif t == "i": file.write('"$' + w + '"') file.write("\n") @@ -133,7 +141,8 @@ class MoeConfigStack: self.in_progress[k] = 1; v = self.do_get(k, len(self.stk)-1) del self.in_progress[k] - self.cache[k] = v + ## FIXME: This is disabled, because the immutability invariant is broken! + # self.cache[k] = v return v def do_get(self, k, pos): @@ -141,18 +150,18 @@ class MoeConfigStack: cfg = self.stk[pos] if cfg.vars.has_key(k): new = cfg.vars[k] - if new[0][0] == 'a': + if new[0][0] == "a": v = self.do_get(k, pos-1) else: - v = '' + v = "" for op,arg in new: - if op == 's': + if op == "s": v = v + arg - elif op == 'i': + elif op == "i": v = v + self[arg] return v pos -= 1 - return '' + return "" def keys(self): seen = {} @@ -162,7 +171,7 @@ class MoeConfigStack: return seen.keys() def dump(self, file=sys.stdout): - for k in self.keys(): + for k in sorted(self.keys()): v = self[k] file.write("%s=%s\n" % (k,v))