Files
pydantic/docs/examples/payment_card_number.py
T
Matin Tamizi 0c5793770b PaymentCardNumber type (#790)
* initial proposal of payment card validation #788

* some cleanup for PaymentCardNumber #788

* fix linting issues

* tests and more robust errors #788

* fixed linting

* fixing mypy errors

* let's try this to make mypy work

* make consistent with cpython tests

* avoid using __new__

* use __init__ instead of properties

* clean up PaymentCardNumber.__init__

* use ClassVar where applicable

* add to changes/

* turns out this is never used

* get brand for other

* clean up a bit

* make PaymentCardNumber private

* use if/else to make faster in cython

* card_number => card number in errors

* make it clearer in the tests which exception is being raised

* parameterize tests for PaymentCardNumber

* lint

* clean up merge mistake from earlier

* fix mypy test error

* take out commented line

* update comment since code is moved

* docs for PaymentCardNumber

* clean up docs for PaymentCardNumber

* var name that makes more sense
2019-09-17 10:33:11 +01:00

29 lines
709 B
Python

from datetime import date
from pydantic import BaseModel
from pydantic.types import PaymentCardBrand, PaymentCardNumber, constr
class Card(BaseModel):
name: constr(strip_whitespace=True, min_length=1)
number: PaymentCardNumber
exp: date
@property
def brand(self) -> PaymentCardBrand:
return self.number.brand
@property
def expired(self) -> bool:
return self.exp < date.today()
card = Card(
name='Georg Wilhelm Friedrich Hegel',
number='4000000000000002',
exp=date(2023, 9, 30)
)
assert card.number.brand == PaymentCardBrand.visa
assert card.number.bin == '400000'
assert card.number.last4 == '0002'
assert card.number.masked == '400000******0002'