def test_select(): context = Context(foo="foo", bar="bar", lst=[1, 2, 3]) assert context.select("foo") == Value("foo") assert context.select("bar") == Value("bar") assert context.select("lst") == CtxList([1, 2, 3]) assert context.select("lst.0") == Value(1) with pytest.raises(KeyNotInContext): context.select("baz") d = { "lst": [ { "foo0": "foo0", "bar0": "bar0" }, { "foo1": "foo1", "bar1": "bar1" }, ] } context = Context(d) assert context.select("lst") == CtxList(d["lst"]) assert context.select("lst.0") == CtxDict(d["lst"][0]) assert context.select("lst.1") == CtxDict(d["lst"][1]) with pytest.raises(KeyNotInContext): context.select("lst.2") for i, _ in enumerate(d["lst"]): assert context.select(f"lst.{i}.foo{i}") == Value(f"foo{i}") assert context.select(f"lst.{i}.bar{i}") == Value(f"bar{i}")
def test_select_unwrap(): context = Context({"dct": {"foo": "bar"}}, lst=[1, 2, 3], foo="foo") assert context.select("dct.foo", unwrap=True) == "bar" assert context.select("lst.0", unwrap=True) == 1 assert context.select("foo", unwrap=True) == "foo" node = context.select("dct", unwrap=True) assert isinstance(node, dict) and recurse_not_a_node(node) assert node == {"foo": "bar"} node = context.select("lst", unwrap=True) assert isinstance(node, list) and recurse_not_a_node(node) assert node == [1, 2, 3]
def test_merge_dict(): d1 = {"Train": {"us": {"lr": 10}}} d2 = {"Train": {"us": {"layers": 100}}} c1 = Context(d1) c2 = Context(d2) c1.merge_update(c2) assert c1.select("Train.us") == CtxDict(lr=10, layers=100) with pytest.raises(ValueError): # cannot overwrite by default c1.merge_update({"Train": {"us": {"lr": 15}}}) c1.merge_update({"Train": {"us": {"lr": 15}}}, overwrite=True) assert c1.select("Train.us") == CtxDict(lr=15, layers=100)
def test_merge_list(): c1 = Context(lst=[1, 2, 3]) with pytest.raises(ValueError): # cannot overwrite by default c1.merge_update({"lst": [10, 11, 12]}) # lists are never merged c1.merge_update({"lst": [10, 11, 12]}, overwrite=True) assert c1.select("lst") == [10, 11, 12]
def test_merge_dict(): d1 = {"Train": {"us": {"lr": 10}}} d2 = {"Train": {"us": {"layers": 100}}} c1 = Context(d1) c2 = Context(d2) c1.merge_update(c2) assert c1.select("Train.us") == CtxDict(lr=10, layers=100) with pytest.raises(MergeError): # cannot overwrite by default c1.merge_update({"Train": {"us": {"lr": 15}}}) c1.merge_update({"Train": {"us": {"lr": 15}}}, overwrite=True) node = c1.select("Train.us") assert node == {"lr": 15, "layers": 100} assert isinstance(node, CtxDict) assert node["lr"] == Value(15) assert node["layers"] == Value(100)
def test_merge_list(): c1 = Context(lst=[1, 2, 3]) with pytest.raises(MergeError): # cannot overwrite by default c1.merge_update({"lst": [10, 11, 12]}) # lists are never merged c1.merge_update({"lst": [10, 11, 12]}, overwrite=True) node = c1.select("lst") assert node == [10, 11, 12] assert isinstance(node, CtxList) assert node[0] == Value(10)
def _resolve_value(match, context: Context): _, _, inner = match.groups() value = context.select(inner) return _unwrap(value)
def _resolve_value(match, context: Context, unwrap=UNWRAP_DEFAULT): _, _, inner = match.groups() value = context.select(inner) return _unwrap(value) if unwrap else value