예제 #1
0
def test_get_signature_infers_defaults():
    def func(foo="bar"):
        pass

    signature = get_signature(func)
    assert signature.parameters == ("foo",)
    assert signature.required == tuple()
    assert signature.optional == {"foo": "bar"}
예제 #2
0
def test_get_signature_works_with_mixed_arg_kwarg():
    def func(foo, bar, baz="buz"):
        pass

    signature = get_signature(func)
    assert signature.parameters == ("foo", "bar", "baz")
    assert signature.required == ("foo", "bar")
    assert signature.optional == {"baz": "buz"}
예제 #3
0
def test_get_signature_returns_empty_dict_for_no_defaults():
    def func(foo, bar, baz):
        pass

    signature = get_signature(func)
    assert signature.parameters == ("foo", "bar", "baz")
    assert signature.required == ("foo", "bar", "baz")
    assert signature.optional == {}
예제 #4
0
def test_get_signature_infers_defaults():
    def func(foo='bar'):
        pass

    signature = get_signature(func)
    assert signature.parameters == ('foo', )
    assert signature.required == tuple()
    assert signature.optional == {'foo': 'bar'}
예제 #5
0
def test_get_signature_works_with_mixed_arg_kwarg():
    def func(foo, bar, baz='buz'):
        pass

    signature = get_signature(func)
    assert signature.parameters == ('foo', 'bar', 'baz')
    assert signature.required == ('foo', 'bar')
    assert signature.optional == {'baz': 'buz'}
예제 #6
0
def test_get_signature_returns_empty_dict_for_no_defaults():
    def func(foo, bar, baz):
        pass

    signature = get_signature(func)
    assert signature.parameters == ('foo', 'bar', 'baz')
    assert signature.required == ('foo', 'bar', 'baz')
    assert signature.optional == {}
예제 #7
0
def test_get_signature_doesnt_conflate_objects_defined_inside():
    def func(foo, bar, baz=2):
        blah = foo * 42
        return blah

    signature = get_signature(func)
    assert signature.parameters == ("foo", "bar", "baz")
    assert signature.required == ("foo", "bar")
    assert signature.optional == {"baz": 2}
예제 #8
0
def test_get_signature_doesnt_conflate_objects_defined_inside():
    def func(foo, bar, baz=2):
        blah = foo * 42
        return blah

    signature = get_signature(func)
    assert signature.parameters == ('foo', 'bar', 'baz')
    assert signature.required == ('foo', 'bar')
    assert signature.optional == {'baz': 2}
예제 #9
0
 def loop(in_except):
     signatures = self._signatures
     for function, prev_func in functions_iter:
         if _return_after is not None and prev_func is not _NO_PREVIOUS:
             if prev_func.__name__ == _return_after:
                 break
         try:
             if function not in signatures:
                 signatures[function] = get_signature(function)
             deps = resolve_dependencies(signatures[function], state)
             skip = (
                 # When function wants exception but we don't have it.
                 not in_except and 'exception' in deps.signature.required
                 or
                 # When function doesn't want exception but we have it.
                 in_except and 'exception' not in deps.signature.parameters
             )
             if not skip:
                 new_state = function(**deps.as_kwargs)
                 if new_state is not None:
                     state.update(new_state)
                 if in_except and state['exception'] is None:
                     # exception is cleared, return to normal flow
                     if PYTHON_2:
                         sys.exc_clear()
                     return
         except:
             if _raise_immediately:
                 raise
             state['exception'] = sys.exc_info()[1]
             loop(True)
             if in_except:
                 # an exception occurred while we were handling another
                 # exception, but now it's been cleared, so we return to
                 # the normal flow
                 return
     if in_except:
         raise  # exception hasn't been handled, reraise