Example #1
0
def test_registry_class_lookup():
    reg = Registry()

    class Document(object):
        pass

    class SpecialDocument(Document):
        pass

    linecount = 'linecount'

    reg.register_predicates(linecount, [class_predicate('obj')])
    reg.register_value(linecount, [Document], 'document line count')
    reg.register_value(linecount, [SpecialDocument],
                       'special document line count')

    assert (reg.component(linecount, Document) ==
            'document line count')

    assert (reg.component(linecount, SpecialDocument) ==
            'special document line count')

    class AnotherDocument(Document):
        pass

    assert (reg.component(linecount, AnotherDocument) ==
            'document line count')

    class Other(object):
        pass

    assert reg.component(linecount, Other) is None
Example #2
0
def test_registry_target_find_specific():
    reg = Registry()

    class Document(object):
        pass

    class SpecialDocument(Document):
        pass

    def linecount(obj):
        pass

    def special_linecount(obj):
        pass

    reg.register_predicates(linecount, [class_predicate('obj')])
    reg.register_value(linecount, [Document], 'line count')
    reg.register_predicates(special_linecount, [class_predicate('obj')])
    reg.register_value(special_linecount, [Document], 'special line count')

    assert reg.component(linecount, Document) == 'line count'
    assert (reg.component(special_linecount, Document) ==
            'special line count')

    assert reg.component(linecount, SpecialDocument) == 'line count'
    assert (reg.component(special_linecount, SpecialDocument) ==
            'special line count')
Example #3
0
def test_register_twice_without_predicates():
    reg = Registry()

    def linecount(obj):
        pass

    reg.register_predicates(linecount, [])
    reg.register_value(linecount, (), 'once')
    with pytest.raises(RegistrationError):
        reg.register_value(linecount, (), 'twice')
Example #4
0
def test_clear():
    reg = Registry()

    def linecount():
        pass

    reg.register_predicates(linecount, [])
    reg.register_value(linecount, (), 'once')
    assert reg.component(linecount, ()) == 'once'
    reg.clear()
    reg.register_predicates(linecount, [])
    assert reg.component(linecount, ()) is None
Example #5
0
def test_registry_no_sources():
    reg = Registry()

    class Animal(object):
        pass

    def something():
        pass

    reg.register_predicates(something, [])
    reg.register_value(something, (), 'elephant')
    assert reg.component(something, ()) == 'elephant'
Example #6
0
def test_register_twice_with_predicate():
    reg = Registry()

    class Document(object):
        pass

    def linecount(obj):
        pass

    reg.register_predicates(linecount, [class_predicate('obj')])
    reg.register_value(linecount, [Document], 'document line count')
    with pytest.raises(RegistrationError):
        reg.register_value(linecount, [Document], 'another line count')
Example #7
0
def test_registry():
    r = Registry()

    class Foo(object):
        pass

    class FooSub(Foo):
        pass

    def view(self, request):
        raise NotImplementedError()

    def get_model(self):
        return self

    def get_name(request):
        return request.name

    def get_request_method(request):
        return request.request_method

    def model_fallback(self, request):
        return "Model fallback"

    def name_fallback(self, request):
        return "Name fallback"

    def request_method_fallback(self, request):
        return "Request method fallback"

    r.register_callable_predicates(view, [
        match_instance('model', get_model, model_fallback),
        match_key('name', get_name, name_fallback),
        match_key('request_method', get_request_method, request_method_fallback)])

    def foo_default(self, request):
        return "foo default"

    def foo_post(self, request):
        return "foo default post"

    def foo_edit(self, request):
        return "foo edit"

    r.register_value(view, (Foo, '', 'GET'), foo_default)
    r.register_value(view, (Foo, '', 'POST'), foo_post)
    r.register_value(view, (Foo, 'edit', 'POST'), foo_edit)

    assert r.component(view, (Foo, '', 'GET')) is foo_default
    assert r.component(view, (Foo, '', 'POST')) is foo_post
    assert r.component(view, (Foo, 'edit', 'POST')) is foo_edit
    assert r.component(view, (FooSub, '', 'GET')) is foo_default
    assert r.component(view, (FooSub, '', 'POST')) is foo_post

    l = r.lookup()

    class Request(object):
        def __init__(self, name, request_method):
            self.name = name
            self.request_method = request_method

    assert l.call(view, Foo(), Request('', 'GET')) == 'foo default'
    assert l.call(view, FooSub(), Request('', 'GET')) == 'foo default'
    assert l.call(view, FooSub(), Request('edit', 'POST')) == 'foo edit'

    class Bar(object):
        pass

    assert l.call(view, Bar(), Request('', 'GET')) == 'Model fallback'
    assert l.call(view, Foo(), Request('dummy', 'GET')) == 'Name fallback'
    assert l.call(view, Foo(), Request('', 'PUT')) == 'Request method fallback'
    assert l.call(view, FooSub(), Request('dummy', 'GET')) == 'Name fallback'
Example #8
0
def test_caching_registry():
    r = Registry()

    class Foo(object):
        pass

    class FooSub(Foo):
        pass

    def view(self, request):
        raise NotImplementedError()

    def get_model(self):
        return self

    def get_name(request):
        return request.name

    def get_request_method(request):
        return request.request_method

    def model_fallback(self, request):
        return "Model fallback"

    def name_fallback(self, request):
        return "Name fallback"

    def request_method_fallback(self, request):
        return "Request method fallback"

    r.register_callable_predicates(view, [
        match_instance('model', get_model, model_fallback),
        match_key('name', get_name, name_fallback),
        match_key('request_method', get_request_method,
                  request_method_fallback)])

    def foo_default(self, request):
        return "foo default"

    def foo_post(self, request):
        return "foo default post"

    def foo_edit(self, request):
        return "foo edit"

    r.register_value(view, (Foo, '', 'GET'), foo_default)
    r.register_value(view, (Foo, '', 'POST'), foo_post)
    r.register_value(view, (Foo, 'edit', 'POST'), foo_edit)

    l = CachingKeyLookup(r, 100, 100, 100).lookup()

    class Request(object):
        def __init__(self, name, request_method):
            self.name = name
            self.request_method = request_method

    assert l.call(view, Foo(), Request('', 'GET')) == 'foo default'
    assert l.call(view, FooSub(), Request('', 'GET')) == 'foo default'
    assert l.call(view, FooSub(), Request('edit', 'POST')) == 'foo edit'

    # use a bit of inside knowledge to check the cache is filled
    assert l.key_lookup.component_cache.get(
        (view, (Foo, '', 'GET'))) is not None
    assert l.key_lookup.component_cache.get(
        (view, (FooSub, '', 'GET'))) is not None
    assert l.key_lookup.component_cache.get(
        (view, (FooSub, 'edit', 'POST'))) is not None

    # now let's do this again. this time things come from the component cache
    assert l.call(view, Foo(), Request('', 'GET')) == 'foo default'
    assert l.call(view, FooSub(), Request('', 'GET')) == 'foo default'
    assert l.call(view, FooSub(), Request('edit', 'POST')) == 'foo edit'

    # prime and check the all cache
    assert list(l.all(view, Foo(), Request('', 'GET'))) == [foo_default]
    assert l.key_lookup.all_cache.get(
        (view, (Foo, '', 'GET'))) is not None
    # should be coming from cache now
    assert list(l.all(view, Foo(), Request('', 'GET'))) == [foo_default]

    class Bar(object):
        pass
    assert l.call(view, Bar(), Request('', 'GET')) == 'Model fallback'
    assert l.call(view, Foo(), Request('dummy', 'GET')) == 'Name fallback'
    assert l.call(view, Foo(), Request('', 'PUT')) == 'Request method fallback'
    assert l.call(view, FooSub(), Request('dummy', 'GET')) == 'Name fallback'

    # fallbacks get cached too
    assert l.key_lookup.fallback_cache.get(
        (view, (Bar, '', 'GET'))) is model_fallback

    # these come from the fallback cache now
    assert l.call(view, Bar(), Request('', 'GET')) == 'Model fallback'
    assert l.call(view, Foo(), Request('dummy', 'GET')) == 'Name fallback'
    assert l.call(view, Foo(), Request('', 'PUT')) == 'Request method fallback'
    assert l.call(view, FooSub(), Request('dummy', 'GET')) == 'Name fallback'