A signature validator is simply a collection of argument validators. Its is_valid methods checks for a given list of arguments if all argument validators return valid.
source
SignatureValidator
SignatureValidator
(argument_validators:list[pymoq.argument_validators.A
rgumentValidator])
This class holds a list of argument validators and can evaluate a list of arguments against those validators
any_int = argument_validator_from_argument(int , name= "firstArgument" , position= 0 )
second_any_int = argument_validator_from_argument(int , name= "secondArgument" , position= 1 )
s = SignatureValidator([any_int, second_any_int])
s
SignatureValidator:
Positional:
ArgumentFunctionValidator(argument_name:firstArgument, position=0): any_int
ArgumentFunctionValidator(argument_name:secondArgument, position=1): any_int
Named
ArgumentFunctionValidator(argument_name:firstArgument, position=0): any_int
ArgumentFunctionValidator(argument_name:secondArgument, position=1): any_int
Calling a signature validator with only positional arguments works as expected:
assert s.is_valid(1 ,1 )
assert not s.is_valid(1 ,"1" )
assert not s.is_valid("1" , 1 )
Named arguments:
assert s.is_valid(1 , secondArgument= 1 )
assert not s.is_valid(1 , named= "1" )
Edge cases
Argument validators contain more than one element with the same name
test_fail(lambda : SignatureValidator([any_int, any_int]), "duplicate names" )
Argument validators contain more than one element with the same position
second_any_int._position = any_int._position
test_fail(lambda : SignatureValidator([any_int, second_any_int]), "duplicate positions" )
second_any_int._position = any_int._position + 1
More arguments than validators:
assert not s.is_valid(1 ,1 ,1 )
Ease of use: Construct from arguments
source
signature_validator_from_arguments
signature_validator_from_arguments (argument_names:list[str], *args,
**kwargs)
Construct a SignatureValidator by smartly constructing ArgumentValidators when no actual argument validators are given
If there are actual ArgumentValidators given:
sign_val = signature_validator_from_arguments(['a' ,'b' ], ArgumentFunctionValidator(lambda a: isinstance (a, int ), name= 'a' , position= 0 ), b= ArgumentFunctionValidator(lambda b: isinstance (b, str ), name= 'b' , position= 1 ))
assert sign_val.is_valid(1 , '1' )
assert not sign_val.is_valid("1" )
assert not sign_val.is_valid(1 ,1 )
If there is a callable given, a ArgumentFunctinValidator is constructed:
sign_val = signature_validator_from_arguments(['a' , 'b' ], lambda a: isinstance (a, int ), b= lambda b: isinstance (b, str ))
assert sign_val.is_valid(1 , '1' )
assert not sign_val.is_valid("1" )
assert not sign_val.is_valid(1 ,1 )