Skip to content

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