Special Types#
SecretStr#
Wraps a string value so it is never exposed in str(), repr(), or logs:
"""SecretStr — masks secret values in str/repr."""
from dataclasses import dataclass
from dature.fields.secret_str import SecretStr
secret = SecretStr("my-database-password")
@dataclass
class Config:
db_password: SecretStr
config = Config(db_password=secret)
assert str(config.db_password) == "**********"
assert repr(config.db_password) == "SecretStr('**********')"
assert config.db_password.get_secret_value() == "my-database-password"
assert len(config.db_password) == 20
Works with mask_secrets=True — fields of type SecretStr are always detected regardless of field name.
ByteSize#
Parses human-readable sizes into bytes. Supports comparison operators.
"""ByteSize — parses human-readable sizes."""
from dataclasses import dataclass
from dature.fields.byte_size import ByteSize
@dataclass
class Config:
max_upload: ByteSize
config = Config(max_upload=ByteSize("1.5 GB"))
assert int(config.max_upload) == 1500000000
assert str(config.max_upload) == "1.4GiB"
assert repr(config.max_upload) == "ByteSize(1500000000)"
assert config.max_upload.human_readable() == "1.4GiB"
assert config.max_upload.human_readable(decimal=True) == "1.5GB"
assert ByteSize(1024) > ByteSize(512)
Supported units: B, KB, MB, GB, TB, PB, KiB, MiB, GiB, TiB, PiB.
PaymentCardNumber#
Validates using the Luhn algorithm and detects the brand:
"""PaymentCardNumber — validates via Luhn and detects brand."""
from dataclasses import dataclass
from dature.fields.payment_card import PaymentCardNumber
@dataclass
class Config:
card: PaymentCardNumber
config = Config(card=PaymentCardNumber("42424242424242"))
assert str(config.card) == "**********4242"
assert repr(config.card) == "PaymentCardNumber('**********4242')"
assert config.card.masked == "**********4242"
assert config.card.brand == "Visa"
assert config.card.get_raw_number() == "42424242424242"
URL#
Type alias for urllib.parse.ParseResult:
"""URL — parsed into urllib.parse.ParseResult."""
from dataclasses import dataclass
from urllib.parse import urlparse
from dature.types import URL
@dataclass
class Config:
api_url: URL
config = Config(
api_url=urlparse("https://api.example.com:8080/v1?key=abc#section"),
)
assert config.api_url.scheme == "https"
assert config.api_url.netloc == "api.example.com:8080"
assert config.api_url.hostname == "api.example.com"
assert config.api_url.port == 8080
assert config.api_url.path == "/v1"
assert config.api_url.query == "key=abc"
assert config.api_url.fragment == "section"
assert (
config.api_url.geturl() == "https://api.example.com:8080/v1?key=abc#section"
)
Base64UrlBytes / Base64UrlStr#
Type aliases decoded from Base64 string in the config. Base64UrlStr decodes to str, Base64UrlBytes decodes to bytes:
"""Base64UrlBytes / Base64UrlStr — decoded from Base64."""
from base64 import urlsafe_b64decode
from dataclasses import dataclass
from dature.types import Base64UrlBytes, Base64UrlStr
encoded = "aGVsbG8gd29ybGQ="
@dataclass
class Config:
token: Base64UrlStr
data: Base64UrlBytes
config = Config(
token=urlsafe_b64decode(encoded).decode(),
data=urlsafe_b64decode(encoded),
)
assert config.token == "hello world"
assert type(config.token) is str
assert config.data == b"hello world"
assert type(config.data) is bytes