]> mj.ucw.cz Git - moe.git/blobdiff - t/moe/config.py
Added ConfigTree.remove, adapted parse and parse_file
[moe.git] / t / moe / config.py
index dacaf42a7a1450e45fa505c266cb7fecc1b01e1d..04e363f1887ef53446392b202a34df97faa00630 100644 (file)
@@ -101,11 +101,21 @@ class ConfigTree(object):
     for key in keys:
       self.lookup(key, create=True).fix()
 
+  def remove(self, parsed):
+    """Given a list [(varname, `Operation`)] as returned by `parse` or `parse_file`, 
+    removes the operations from the respective variables config tree.
+    Variables/operations not present int the tree raise ValueError.
+    """
+    for vname, o in parsed:
+      v = self.lookup(vname, create = True)
+      v.remove_operation(o)
+
   def parse(self, s, source=None, level=0):
-    """Parse `s` (stream/string) into the tree, see `moe.confparser.ConfigParser` for details."""
+    """Parse `s` (stream/string) into the tree, see `moe.confparser.ConfigParser` for details.
+    Returns list of parset operations: [(varname, `Operation`)]"""
     import moe.config_parser
     p = moe.config_parser.ConfigParser(s, self, source=source, level=level)
-    p.parse()
+    return p.parse()
 
   def parse_file(self, filename, desc=None, level=0):
     """Parse an utf-8 file into the tree, see `moe.confparser.ConfigParser` for details. 
@@ -113,7 +123,7 @@ class ConfigTree(object):
     with open(filename, 'rt') as f:
       if desc: 
        filename += " <" + desc + ">" 
-      self.parse(f, source=filename, level=level)
+      return self.parse(f, source=filename, level=level)
 
 
 class ConfigElem(object):
@@ -268,7 +278,9 @@ class ConfigVar(ConfigElem):
 
   def variables(self):
     "Return a set of variables used in the expressions"
-    return set(sum([ list(op.expression.variables()) for op in self.operations ], []))
+    if not self.operations:
+      return set([])
+    return set.union(*[ op.expression.variables() for op in self.operations ])
 
   def fix(self):
     """
@@ -318,7 +330,7 @@ class ConfigVar(ConfigElem):
     self.invalidate()
     # Remove the operation 
     self.operations.remove(operation)
-    # Remove dependencies on variables unused in other operations
+    # Remove dependencies on variables unused in other defining operations
     vs = self.variables()
     for v in operation.expression.variables():
       if v not in vs:
@@ -383,8 +395,8 @@ class ConfigExpression(object):
          self.exprlist[i] = unicode(e, 'ascii')
 
   def variables(self):
-    "Return an iterator of variables user in the expression"
-    return itertools.ifilter(lambda e: isinstance(e, ConfigVar), self.exprlist)
+    "Return a set of variables used in the expression"
+    return set([e for e in self.exprlist if isinstance(e, ConfigVar)])
 
   def __str__(self):
     return self.original