Signature validators

Checking if signatures are valid

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)

Build library