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.
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):
s.assertRaises(ConfigSyntaxError, s.parse, "if ('{a}'=='{b}' ornot ''!='') {}")
s.assertRaises(ConfigSyntaxError, s.parse, "if 'a'<>'b' {}")
+ def test_parse_remove(s):
+ s.parse('a="000"')
+ d1 = s.parse("a='A'; b='B'; c='C'", level=10)
+ d2 = s.parse('c="{a}{a}"; b="XX" ', level=20)
+ d3 = s.parse('b+=c ', level=30)
+ assert s.val('b') == "XXAA"
+ s.t.remove(d2)
+ assert s.val('b') == "BC"
+ s.assertRaises(ValueError, s.t.remove, [('d', d1[1][0])])
+ s.assertRaises(ValueError, s.t.remove, [('b', d1[1][0])])
+ # partially remove d1
+ s.t.remove([('c', d1[2][1])])
+ # try to remove rest - 'a' and 'b' should get removed
+ s.assertRaises(ValueError, s.t.remove, d1)
+ assert s.val('a') == "000"
+ s.t.remove(d3)
+
class TestConfigEval(TestConfig):