def full_relation(): has_email = treehorn.GoDown(condition=treehorn.HasKey('email')) has_city = treehorn.GoDown(condition=treehorn.HasKey('city')) has_email + 'email' has_city + 'city' sample_relation = treehorn.Relation('sample') sample_relation == (has_email + 'email')['email'] > (has_city + 'city')['city'] return sample_relation
def test_not_list(sample_traced_object): obj = treehorn.GoDown(condition=~treehorn.IsList(), label='sample') result = list(obj(sample_traced_object)) result = [] for i in obj(sample_traced_object): result.append(copy.deepcopy(i)) objects_in = [ sample_traced_object["bar"], sample_traced_object["bar"], sample_traced_object["baz"], sample_traced_object["a"], sample_traced_object["a1"], sample_traced_object["a1"]["b1"], sample_traced_object["a1"]["b1"]["c1"], sample_traced_object["a1"]["b1"]["e"], ] objects_out = [ sample_traced_object["qux"], sample_traced_object["a1"]["b1"]["some_list"], ] result_values = [i['sample'] for i in result] for obj in objects_in: assert obj in result_values for obj in objects_out: assert obj not in result_values
def test_has_key_in_conjunction_finds_node(sample_traced_object): obj = treehorn.GoDown(condition=treehorn.HasKey("c1") & treehorn.HasKey("e"), label='sample') result = list(obj(sample_traced_object)) assert result[0] == treehorn.splitter( {'sample': {"c1": "d1", "some_list": [10, 20, 40], "e": "whatever"}} ) assert len(result) == 1
def test_has_descendant_dictionary(sample_traced_object): obj = treehorn.GoDown(condition=treehorn.HasDescendant(treehorn.IsDictionary())) obj(sample_traced_object) result = list(obj._generator) assert sample_traced_object["qux"] in result assert sample_traced_object["a1"] in result assert sample_traced_object["a"] in result assert len(result) == 3 print(result)
def test_has_key_in_disjunction_negation_finds_node(sample_traced_object): obj = treehorn.GoDown( condition=treehorn.HasKey("c1") & (~treehorn.HasKey("nonexistent")), label='sample' ) result = list(obj(sample_traced_object)) # result = list(obj._generator) assert result[0] == treehorn.splitter( {'sample': {"c1": "d1", "some_list": [10, 20, 40], "e": "whatever"}} ) assert len(result) == 1
def p_traversal(p): """traversal : START AT condition | GO DOWN UNTIL condition | GO UP UNTIL condition | traversal AS LABEL """ if len(p) == 4 and p[1] == "START" and p[2] == "AT": p[0] = treehorn.GoDown(condition=p[3]) elif len(p) == 5 and p[1] == "GO" and p[2] == "DOWN" and p[3] == "UNTIL": p[0] = treehorn.GoDown(condition=p[4]) elif len(p) == 5 and p[1] == "GO" and p[2] == "UP" and p[3] == "UNTIL": p[0] = treehorn.GoUp(condition=p[4]) elif len(p) == 4 and p[2] == "AS": p[0] = p[1] (p[0] + p[3]) ###### [p[3]] elif len(p) == 2: p[0] = p[1] else: raise Exception("This should never happen.")
def city_condition(): has_city_key = treehorn.GoDown(condition=treehorn.HasKey('city')) has_city_key + 'city' return has_city_key
def email_condition(): has_email_key = treehorn.GoDown(condition=treehorn.HasKey('email')) return has_email_key
def test_has_key_correctly_finds_nothing(sample_traced_object): obj = treehorn.GoDown(condition=treehorn.HasKey("nonexistent")) result = list(obj(sample_traced_object)) assert len(result) == 0
def test_traversal_creates_generator(sample_traced_object): obj = treehorn.GoDown(condition=treehorn.HasKey("a1"), label='sample') assert obj(sample_traced_object) is not None
def test_instantiate_downward_traversal(): obj = treehorn.GoDown() assert isinstance(obj, (treehorn.GoDown,))
def test_and(sample_traced_object): obj = treehorn.GoDown(condition=treehorn.HasKey("c1") & treehorn.HasKey("e"), label='sample') result = list(obj(sample_traced_object)) assert len(result) == 1