Example #1
0
        if not s.isdigit() or len(s) != 16:
            raise ValidationFailed("invalid card number")


def luhn_algorithm(number):
    """An example domain-specific checker, the Luhn check digit algorithm."""
    if not number.isdigit():
        raise ValidationFailed("expected a purely numeric string")
    digits = list(map(int, number))
    v = sum(digits[-1::-2]) + sum(sum(map(int, str(2 * x))) for x in digits[-2::-2])
    if v % 10:
        raise ValidationFailed("invalid check digit")


Request = Object(
    username=String().constrain(length_between(2, 32)),
    password=String().secret().constrain(length_between(6, 256)),
    name=Object(
        given_name=String().constrain(length_between(1, 64), matches_regex(r"^[A-Z][a-z]*")),
        family_name=String().constrain(length_between(1, 64)),
        middle_name=String().optional().constrain(length_between(1, 64)),
    ).optional(),
    titles=Array(String()).optional(),
    position=FixArray(Float(), Float()).optional(),
    birthdate=Date().optional(),
    gender=StringEnum("male", "female", "other").optional(),
    timestamp=Datetime().optional(),
    payment_info=Object(card_number=CardNumber().constrain(luhn_algorithm)).secret().optional(),
    extra=Any().optional(),
)
Example #2
0
def test_secrecy_declared_after():
  t = String().constrain(length_between(4,6)).secret()
  with pytest.raises(ValidationFailed) as excinfo:
    t.check("xxx")
  message = str(excinfo)
  assert "xxx" not in message