mirror of
https://github.com/kennethreitz/pydantic.git
synced 2026-06-05 23:00:18 +00:00
0c5793770b
* 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
29 lines
709 B
Python
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'
|