import re
# Money is declared in function.fune: integer minor units, never a float.
from .money_amount_types import Money
CURRENCY = re.compile(r"[A-Z]{3}")
def money(minor: int, currency: str) -> Money:
if isinstance(minor, bool) or not isinstance(minor, int):
raise TypeError("money() takes integer minor units, received %r" % (minor,))
if not isinstance(currency, str) or not CURRENCY.fullmatch(currency):
raise ValueError('"%s" is not an uppercase ISO 4217 currency code' % (currency,))
return Money(minor=minor, currency=currency)
def is_money(value: object) -> bool:
return isinstance(value, Money)
def assert_same_currency(a: Money, b: Money) -> None:
"""Guard against the silent nonsense of adding GBP to EUR."""
if a.currency != b.currency:
raise ValueError("currency mismatch: %s and %s" % (a.currency, b.currency))
def zero(currency: str) -> Money:
return money(0, currency)