Special Types#
These types are part of dature's type system and can be loaded from any source format. This page covers their runtime behavior. For syntax (how to write their values in config files), see Supported Types.
SecretStr#
Wraps a string value so it is never exposed in str(), repr(), or logs:
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.
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:
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:
from dataclasses import dataclass
from urllib.parse import urlparse
from dature.type_aliases 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:
from base64 import urlsafe_b64decode
from dataclasses import dataclass
from dature.type_aliases 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