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(), )
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