def test_field_composed_filter(): """ Add a field to a tiddler and then make sure we can filter for it. """ tiddler1 = Tiddler('one') tiddler1.fields = {'status': 'hot'} tiddler2 = Tiddler('two') tiddler2.fields = {'status': 'cold'} tiddler3 = Tiddler('three') filter_string = '[status[hot]]' filters = filter.compose_from_string(filter_string) found_tiddlers = filter.by_composition(filters, [tiddler1, tiddler2, tiddler3]) assert [tiddler.title for tiddler in found_tiddlers] == ['one'] filter_string = '[!status[hot]]' filters = filter.compose_from_string(filter_string) found_tiddlers = filter.by_composition(filters, [tiddler1, tiddler2, tiddler3]) assert [tiddler.title for tiddler in found_tiddlers] == ['two', 'three'] filter_string = '[status[cold]]' filters = filter.compose_from_string(filter_string) found_tiddlers = filter.by_composition(filters, [tiddler1, tiddler2, tiddler3]) assert [tiddler.title for tiddler in found_tiddlers] == ['two'] filter_string = '[barnabas[monkey]]' filters = filter.compose_from_string(filter_string) found_tiddlers = filter.by_composition(filters, [tiddler1, tiddler2, tiddler3]) assert [tiddler.title for tiddler in found_tiddlers] == [] filter_string = '[!barnabas[monkey]]' filters = filter.compose_from_string(filter_string) found_tiddlers = filter.by_composition(filters, [tiddler1, tiddler2, tiddler3]) assert [tiddler.title for tiddler in found_tiddlers] == ['one', 'two', 'three']
def test_empty_composed_filters(): filter_string = '' filters = filter.compose_from_string(filter_string) found_tiddlers = filter.by_composition(filters, tiddlers) assert found_tiddlers == tiddlers, 'empty filter returns all tiddlers'
def test_string_to_composed_filter_removal_bag(): filter_string = 'TiddlerThree TiddlerTwo [-bag[TiddlerThree]]' filters = filter.compose_from_string(filter_string) found_tiddlers = filter.by_composition(filters, tiddlers) assert len(found_tiddlers) == 1 assert found_tiddlers[0].title == 'TiddlerTwo'
def test_string_to_composed_filter_negative_bag(): filter_string = '[!bag[TiddlerThree]]' filters = filter.compose_from_string(filter_string) found_tiddlers = filter.by_composition(filters, tiddlers) assert len(found_tiddlers) == 2 assert 'TiddlerOne' in [tiddler.title for tiddler in found_tiddlers] assert 'TiddlerTwo' in [tiddler.title for tiddler in found_tiddlers]
def test_string_to_composed_filter_negative_title(): filter_string = '[tag[tagthree]] !TiddlerOne' filters = filter.compose_from_string(filter_string) found_tiddlers = filter.by_composition(filters, tiddlers) assert len(found_tiddlers) == 2, 'two tiddlers should be found, got %s' % len(found_tiddlers) assert 'TiddlerThree' in [tiddler.title for tiddler in found_tiddlers], 'should get third tiddler' assert 'TiddlerTwo' in [tiddler.title for tiddler in found_tiddlers], 'should get second tiddler'
def test_string_to_composed_filter_positive_bag(): filter_string = '[bag[TiddlerThree]]' filters = filter.compose_from_string(filter_string) found_tiddlers = filter.by_composition(filters, tiddlers) assert len(found_tiddlers) == 1 assert found_tiddlers[0].bag == 'TiddlerThree' assert found_tiddlers[0].title == 'TiddlerThree'
def test_string_to_composed_filter_positive_tag(): filter_string = 'TiddlerOne [tag[tagone]]' filters = filter.compose_from_string(filter_string) found_tiddlers = filter.by_composition(filters, tiddlers) assert len(found_tiddlers) == 2, 'two tiddlers should be found, got %s' % len(found_tiddlers) assert 'TiddlerOne' in [tiddler.title for tiddler in found_tiddlers], 'should get first tiddler' assert 'TiddlerThree' in [tiddler.title for tiddler in found_tiddlers], 'should get third tiddler'
def test_string_composed_filter_with_count(): """ Test count composed string filter. """ filter_string = '[sort[-title]] [count[2]]' filters = filter.compose_from_string(filter_string) found_tiddlers = filter.by_composition(filters, tiddlers) assert [tiddler.title for tiddler in found_tiddlers] == ['TiddlerTwo', 'TiddlerThree']
def test_string_composed_filter_with_remove_by_tag(): """ Test complex composed string filter. """ filter_string = '[!tag[mumbly]] [-tag[tagone]]' filters = filter.compose_from_string(filter_string) found_tiddlers = filter.by_composition(filters, tiddlers) assert len(found_tiddlers) == 1, 'one tiddler should be found, got %s' % len(found_tiddlers) assert found_tiddlers[0].title == 'TiddlerTwo', 'the found tiddler should be TiddlerTwo, got %s' % found_tiddlers[0].title
def test_string_composed_filter_with_remove_by_title(): """ Test removal of a built list. """ filter_string = 'TiddlerTwo TiddlerOne -TiddlerTwo' filters = filter.compose_from_string(filter_string) found_tiddlers = filter.by_composition(filters, tiddlers) assert len(found_tiddlers) == 1, 'one tiddler should be found, got %s' % len(found_tiddlers) assert found_tiddlers[0].title == 'TiddlerOne', 'the found tiddler should be TiddlerOne, got %s' % found_tiddlers[0].title
def test_string_composed_filter_with_spaces(): """ Test spaces in filter. """ tiddlers = [] for name in ['one', 'two', 'three']: tiddler = Tiddler('tiddler %s' % name) tiddler.text = name tiddlers.append(tiddler) filter_string = '[[tiddler one]]' filters = filter.compose_from_string(filter_string) found_tiddlers = filter.by_composition(filters, tiddlers) assert len(found_tiddlers) == 1, 'one tiddler should be found, got %s' % len(found_tiddlers) assert found_tiddlers[0].title == 'tiddler one'
def filter_tiddlers_from_bag(bag, filter, filterargs=None): """ Return the list of tiddlers resulting from filtering bag by filter. filter may be a filter function, in which case filterags may need to be set, or may be a filter string. Probably can do some meta-programming here. """ store = bag.store if callable(filter): if store: return filter(filterargs, get_tiddlers_from_bag(bag)) return filter(filterargs, bag.list_tiddlers()) else: filters = fl.compose_from_string(filter) if store: return fl.by_composition(filters, get_tiddlers_from_bag(bag)) return fl.by_composition(filters, bag.list_tiddlers())