def test_intersection(): fqn_a = SelectionCriteria.from_single_spec('fqn:model_a') fqn_b = SelectionCriteria.from_single_spec('fqn:model_b') intersection = SelectionIntersection(components=[fqn_a, fqn_b]) assert list(intersection) == [fqn_a, fqn_b] combined = intersection.combine_selections( [{'model_a', 'model_b', 'model_c'}, {'model_c', 'model_d'}]) assert combined == {'model_c'}
def test_union(): fqn_a = SelectionCriteria.from_single_spec('fqn:model_a') fqn_b = SelectionCriteria.from_single_spec('fqn:model_b') fqn_c = SelectionCriteria.from_single_spec('fqn:model_c') difference = SelectionUnion(components=[fqn_a, fqn_b, fqn_c]) combined = difference.combine_selections([{'model_a', 'model_b'}, {'model_b', 'model_c'}, {'model_d'}]) assert combined == {'model_a', 'model_b', 'model_c', 'model_d'}
def test_difference(): fqn_a = SelectionCriteria.from_single_spec('fqn:model_a') fqn_b = SelectionCriteria.from_single_spec('fqn:model_b') difference = SelectionDifference(components=[fqn_a, fqn_b]) assert list(difference) == [fqn_a, fqn_b] combined = difference.combine_selections( [{'model_a', 'model_b', 'model_c'}, {'model_c', 'model_d'}]) assert combined == {'model_a', 'model_b'} fqn_c = SelectionCriteria.from_single_spec('fqn:model_c') difference = SelectionDifference(components=[fqn_a, fqn_b, fqn_c]) assert list(difference) == [fqn_a, fqn_b, fqn_c] combined = difference.combine_selections( [{'model_a', 'model_b', 'model_c'}, {'model_c', 'model_d'}, {'model_a'}]) assert combined == {'model_b'}
def parse_from_definition(cls, definition): if isinstance(definition, str): definition = SelectionCriteria.dict_from_single_spec(definition) elif 'union' in definition: definition = cls.parse_a_definition('union', definition) elif 'intersection' in definition: definition = cls.parse_a_definition('intersection', definition) elif isinstance(definition, dict): definition = cls.parse_dict_definition(definition) return definition
def test_raw_parse_complex(): raw = '2+config.arg.secondarg:argument_value+4' result = SelectionCriteria.from_single_spec(raw) assert result.raw == raw assert result.method == MethodName.Config assert result.method_arguments == ['arg', 'secondarg'] assert result.value == 'argument_value' assert not result.childrens_parents assert result.children assert result.parents assert result.parents_depth == 2 assert result.children_depth == 4
def test_raw_parse_simple_infer_fqn_children(): raw = 'asdf+' result = SelectionCriteria.from_single_spec(raw) assert result.raw == raw assert result.method == MethodName.FQN assert result.method_arguments == [] assert result.value == 'asdf' assert not result.childrens_parents assert result.children assert not result.parents assert result.parents_depth is None assert result.children_depth is None
def test_raw_parse_simple_infer_path_modified(): raw = '@' + os.path.join('asdf', '*') result = SelectionCriteria.from_single_spec(raw) assert result.raw == raw assert result.method == MethodName.Path assert result.method_arguments == [] assert result.value == raw[1:] assert result.childrens_parents assert not result.children assert not result.parents assert result.parents_depth is None assert result.children_depth is None
def parse_a_definition(cls, def_type, definition): # this definition must be a list new_dict = {def_type: []} for sel_def in definition[def_type]: if isinstance(sel_def, dict): sel_def = cls.parse_from_definition(sel_def) new_dict[def_type].append(sel_def) elif isinstance(sel_def, str): sel_def = SelectionCriteria.dict_from_single_spec(sel_def) new_dict[def_type].append(sel_def) else: new_dict[def_type].append(sel_def) return new_dict
def test_raw_parse_weird(): # you can have an empty method name (defaults to FQN/path) and you can have # an empty value, so you can also have this... result = SelectionCriteria.from_single_spec('') assert result.raw == '' assert result.method == MethodName.FQN assert result.method_arguments == [] assert result.value == '' assert not result.childrens_parents assert not result.children assert not result.parents assert result.parents_depth is None assert result.children_depth is None
def test_raw_parse_invalid(): with pytest.raises(RuntimeException): SelectionCriteria.from_single_spec('invalid_method:something') with pytest.raises(RuntimeException): SelectionCriteria.from_single_spec('@foo+')