def test_fallback_to_fallback(): def fallback(obj): return 'fallback!' @dispatch(match_instance('obj', lambda obj: obj, fallback=fallback)) def target(obj): return 'not the fallback we want' reg = Registry() def specific_target(obj): return 'specific' reg.register_dispatch(target) reg.register_function(target, specific_target, obj=Alpha) beta = Beta() assert target(beta, lookup=reg.lookup()) == 'fallback!' # this is *not* a registered fallback so won't be returned here assert target.fallback(beta, lookup=reg.lookup()) is fallback # we cannot find a fallback for alpha, as it doesn't hit the fallback assert target(Alpha(), lookup=reg.lookup()) == 'specific' assert target.fallback(Alpha(), lookup=reg.lookup()) is NOT_FOUND
def test_component_inheritance_old_style_class(): reg = Registry() class Gamma: pass class Delta(Gamma): pass @dispatch('obj') def target(obj): pass def foo(obj): pass reg.register_dispatch(target) reg.register_function(target, foo, obj=Gamma) gamma = Gamma() delta = Delta() lookup = reg.lookup() assert target.component(gamma, lookup=lookup) is foo # inheritance case assert target.component(delta, lookup=lookup) is foo
def test_register_no_external_predicates_for_external(): @dispatch_external_predicates() def foo(): pass r = Registry() with pytest.raises(RegistrationError): r.register_dispatch(foo)
def test_lookup_passed_along_fallback(): @dispatch() def a(lookup): return "fallback" reg = Registry() reg.register_dispatch(a) assert a(lookup=reg.lookup()) == 'fallback'
def test_call_not_found_no_sources(): reg = Registry() @dispatch() def target(): return "default" reg.register_dispatch(target) lookup = reg.lookup() assert target(lookup=lookup) == "default"
def test_component_not_found_no_sources(): reg = Registry() @dispatch() def target(): pass reg.register_dispatch(target) lookup = reg.lookup() assert target.component(lookup=lookup) is None
def test_non_callable_registered(): reg = Registry() @dispatch('obj') def target(obj): pass non_callable = None reg.register_dispatch(target) with pytest.raises(RegistrationError): reg.register_function(target, non_callable, a=Alpha)
def test_call_not_found_two_sources(): reg = Registry() @dispatch('a', 'b') def target(a, b): return "a: %s b: %s" % (a, b) reg.register_dispatch(target) lookup = reg.lookup() assert target('dummy1', 'dummy2', lookup=lookup) == "a: dummy1 b: dummy2"
def test_component_not_found_two_sources(): reg = Registry() @dispatch('a', 'b') def target(a, b): pass reg.register_dispatch(target) lookup = reg.lookup() assert target.component('dummy', 'dummy', lookup=lookup) is None
def test_call_not_found_one_source(): reg = Registry() @dispatch('obj') def target(obj): return "default: %s" % obj reg.register_dispatch(target) lookup = reg.lookup() assert target('dummy', lookup=lookup) == 'default: dummy'
def test_component_not_found_one_source(): reg = Registry() @dispatch('obj') def target(obj): pass reg.register_dispatch(target) lookup = reg.lookup() assert target.component('dummy', lookup=lookup) is None
def test_wrong_callable_registered(): reg = Registry() @dispatch('obj') def target(obj): pass def callable(a, b): pass reg.register_dispatch(target) with pytest.raises(RegistrationError): reg.register_function(target, callable, a=Alpha)
def test_key_dict_to_predicate_key_unknown_keys(): r = Registry() @dispatch( key_predicate('foo', default='default foo'), key_predicate('bar', default='default bar')) def view(self, request): raise NotImplementedError() r.register_dispatch(view) # unknown keys are just ignored r.key_dict_to_predicate_key(view.wrapped_func, { 'unknown': 'blah'})
def test_call_no_source(): reg = Registry() foo = object() @dispatch() def target(): pass def factory(): return foo reg.register_dispatch(target) reg.register_function(target, factory) assert target(lookup=reg.lookup()) is foo
def test_implicit_component_lookup(): @dispatch() def func(): pass def foo(): pass reg = Registry() reg.register_dispatch(func) reg.register_function(func, foo) implicit.initialize(reg.lookup()) assert func.component() is foo
def test_different_defaults_in_specific_non_dispatch_arg(): @dispatch('obj') def target(obj, blah='default'): return 'fallback: %s' % blah reg = Registry() def a(obj, blah='default 2'): return 'a: %s' % blah reg.register_dispatch(target) reg.register_function(target, a, obj=Alpha) lookup = reg.lookup() assert target(Alpha(), lookup=lookup) == 'a: default 2'
def test_component_two_sources(): reg = Registry() @dispatch('a', 'b') def target(a, b): pass def foo(a, b): pass reg.register_dispatch(target) reg.register_function(target, foo, a=IAlpha, b=IBeta) alpha = Alpha() beta = Beta() assert target.component(alpha, beta, lookup=reg.lookup()) is foo
def test_key_dict_to_predicate_key(): r = Registry() @dispatch( key_predicate('foo', default='default foo'), key_predicate('bar', default='default bar')) def view(self, request): raise NotImplementedError() r.register_dispatch(view) assert r.key_dict_to_predicate_key(view.wrapped_func, { 'foo': 'FOO', 'bar': 'BAR'}) == ('FOO', 'BAR') assert r.key_dict_to_predicate_key(view.wrapped_func, {}) == ( 'default foo', 'default bar')
def test_fallback_to_dispatch(): @dispatch('obj') def target(obj): return 'fallback' reg = Registry() def specific_target(obj): return 'specific' reg.register_dispatch(target) reg.register_function(target, specific_target, obj=Alpha) beta = Beta() assert target(beta, lookup=reg.lookup()) == 'fallback' # this is *not* a registered fallback so won't be returned here assert target.fallback(beta, lookup=reg.lookup()) is None
def test_different_defaults_in_specific_dispatch_arg_causes_dispatch(): @dispatch(match_key('key', lambda key: key)) def target(key='foo'): return 'fallback: %s' % key reg = Registry() def a(key='default 2'): return 'a: %s' % key reg.register_dispatch(target) reg.register_function(target, a, key='foo') lookup = reg.lookup() assert target('foo', lookup=lookup) == 'a: foo' assert target('bar', lookup=lookup) == 'fallback: bar' assert target(lookup=lookup) == 'a: default 2'
def test_register_dispatch_key_dict(): r = Registry() class Foo(object): pass class FooSub(Foo): pass @dispatch_external_predicates() 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_external_predicates(view, [ match_instance('model', get_model, model_fallback, default=None), match_key('name', get_name, name_fallback, default=''), match_key('request_method', get_request_method, request_method_fallback, default='GET')]) r.register_dispatch(view) assert r.key_dict_to_predicate_key( view.wrapped_func, {}) == (None, '', 'GET')
def test_call_one_source(): reg = Registry() @dispatch('obj') def target(obj): pass def foo(obj): return "foo" def bar(obj): return "bar" reg.register_dispatch(target) reg.register_function(target, foo, obj=IAlpha) reg.register_function(target, bar, obj=IBeta) lookup = reg.lookup() assert target(Alpha(), lookup=lookup) == 'foo' assert target(Beta(), lookup=lookup) == 'bar'
def test_call_with_wrong_args(): @dispatch('obj') def target(obj): pass def specific(obj): return "specific" reg = Registry() reg.register_dispatch(target) reg.register_function(target, specific, obj=Alpha) lookup = reg.lookup() # we are not allowed to call target without arguments with pytest.raises(TypeError): target(wrong=1, lookup=lookup) with pytest.raises(KeyExtractorError): target.component(wrong=1, lookup=lookup)
def test_component_inheritance(): reg = Registry() class Gamma(object): pass class Delta(Gamma): pass @dispatch('obj') def target(obj): pass def foo(obj): pass reg.register_dispatch(target) reg.register_function(target, foo, obj=Gamma) delta = Delta() assert target.component(delta, lookup=reg.lookup()) is foo
def test_calling_twice(): @dispatch('obj') def target(obj): return 'fallback' reg = Registry() def a(obj): return 'a' def b(obj): return 'b' reg.register_dispatch(target) reg.register_function(target, a, obj=Alpha) reg.register_function(target, b, obj=Beta) lookup = reg.lookup() assert target(Alpha(), lookup=lookup) == 'a' assert target(Beta(), lookup=lookup) == 'b'
def test_extra_arg_for_call(): @dispatch('obj') def target(obj, extra): return "General: %s" % extra reg = Registry() def specific(obj, extra): return "Specific: %s" % extra reg.register_dispatch(target) reg.register_function(target, specific, obj=Alpha) alpha = Alpha() beta = Beta() lookup = reg.lookup() assert target(alpha, lookup=lookup, extra="allowed") == 'Specific: allowed' assert target(beta, lookup=lookup, extra="allowed") == 'General: allowed' assert target(alpha, 'allowed', lookup=lookup) == 'Specific: allowed' assert target(beta, 'allowed', lookup=lookup) == 'General: allowed'
def test_call_two_sources(): reg = Registry() @dispatch('a', 'b') def target(a, b): pass def foo(a, b): return "foo" def bar(a, b): return "bar" reg.register_dispatch(target) reg.register_function(target, foo, a=IAlpha, b=IBeta) reg.register_function(target, bar, a=IBeta, b=IAlpha) alpha = Alpha() beta = Beta() lookup = reg.lookup() assert target(alpha, beta, lookup=lookup) == 'foo' assert target(beta, alpha, lookup=lookup) == 'bar'
def test_lookup_passed_along(): @dispatch('obj') def g1(obj): pass @dispatch('obj') def g2(obj): pass reg = Registry() def g1_impl(obj, lookup): return g2(obj, lookup=lookup) def g2_impl(obj): return "g2" reg.register_dispatch(g1) reg.register_dispatch(g2) reg.register_function(g1, g1_impl, obj=Alpha) reg.register_function(g2, g2_impl, obj=Alpha) assert g1(Alpha(), lookup=reg.lookup()) == 'g2'