Skip to main content

csrd-models

Shared Pydantic models, settings, and parsing utilities for FastAPI microservices.

Package: csrd.models · Import: from csrd.models import BaseModel, BaseSettings

What's included

  • BaseModel / BaseSettings with camelCase alias config and populate_by_name=True
  • ModelParserMixin — response parsing mixin for delegates and repositories
  • PayloadExtractor / DefaultExtractor — pluggable payload extraction
  • UserClaims — JWT user claims dataclass
  • APIErrorResponse, ErrorMeta, Error, APIVersion — structured error response models
  • Secret / InternalToken — settings field marker that refuses to boot on empty, short or placeholder secrets
  • app_env / is_production on BaseSettings, ProductionRequired, Secret(production_only=True) — production-boot checks

Secret settings

from typing import Annotated

from csrd.models import BaseSettings, InternalToken, Secret


class Settings(BaseSettings):
    internal_token: InternalToken = ""  # Annotated[str, Secret()] — min 32 chars
    db_password: Annotated[str, Secret(min_length=16, placeholders=("dev-password",))] = "change_me"

Secret(min_length=32, placeholders=(), markers=DEFAULT_PLACEHOLDER_MARKERS) rejects empty/whitespace values, values containing a marker (change_me, changeme, change-me, <generate; case-insensitive), any declared placeholder, and values shorter than min_length. It works on str and SecretStr; None passes through for str | None fields. Validation runs when settings load (pydantic-settings validates defaults), and a single ValidationError lists every offending field. BaseSettings sets hide_input_in_errors=True, so rejected values never appear in the error.

Production checks

from typing import Annotated

from csrd.models import BaseSettings, InternalToken, ProductionRequired, Secret


class Settings(BaseSettings):
    # app_env: str = "development"  — inherited; env var APP_ENV, lower-cased
    internal_token: InternalToken = ""                                          # always checked
    db_password: Annotated[str, Secret(production_only=True)] = "change_me"     # checked in production
    cookie_secure: Annotated[bool, ProductionRequired(True)] = False            # must be True in production
    public_base_url: Annotated[str, ProductionRequired()] = ""                  # must be set in production
  • BaseSettings.app_env (env APP_ENV, default "development"; any name, stripped and lower-cased) and settings.is_production (app_env == "production").
  • ProductionRequired(value): with APP_ENV=production the field must equal value; ProductionRequired() only requires it to be set (not None, empty string or empty collection). Error type production_required.
  • Secret(production_only=True): the usual secret checks, but only when APP_ENV=production; development defaults such as change_me are tolerated elsewhere.
  • Everything runs as field validation when the settings object is built, so web apps and workers (Settings()) are covered with no extra call. One ValidationError lists every failing field — always-on secrets and production checks together — and never includes the rejected values.
  • The production checks read app_env from fields validated before them; BaseSettings declares it first (a subclass may redeclare it, e.g. to change the default). On plain BaseModels without app_env they are skipped.

Installation

uv pip install "csrd-models @ git+ssh://git@github.com/csrd-api/fastapi-common.git#subdirectory=packages/models"

Dependencies

None (Tier 1 — standalone)

Metadata

Release files for csrd-models 0.8.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for csrd-models 0.8.0
File Size Uploaded
csrd_models-0.8.0.tar.gz 13.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for csrd-models 0.8.0
File Interpreter ABI Platform
csrd_models-0.8.0-py3-none-any.whl Python 3 none any Details

Total release size: 25.8 kB

Release files / csrd_models-0.8.0.tar.gz

Download URL csrd_models-0.8.0.tar.gz
Size 13.7 kB
Tags Source
SHA-256 checksum
How to use checksums
e79f1bc311608e643cce03d2f986617db313be0a158909278ff81623a4fcaab6
BLAKE2b-256 checksum
How to use checksums
37212d7af3ae7134c34b6a708130f9e38875786ce2077ecfe6ff817cf1d70410
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release files / csrd_models-0.8.0-py3-none-any.whl

Download URL csrd_models-0.8.0-py3-none-any.whl
Size 12.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e0dae0696d0b367e898b4f55a96c979031e1a813b7737d1e2158449f7fd20c10
BLAKE2b-256 checksum
How to use checksums
4f40adacc6ba223391507ce5bed71e1e2a95b8dec0f3363ca83560221e65e185
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 16, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.8.0 This release

2 release files

0.7.0

2 release files

0.6.0

2 release files

0.5.30

2 release files

0.5.29

2 release files

0.5.28

2 release files

0.5.27

2 release files

0.5.26

2 release files

0.5.25

2 release files

0.5.24

2 release files

0.5.23

2 release files

0.5.22

2 release files

0.5.21

2 release files

0.5.9

2 release files

0.5.8

2 release files

0.5.7

2 release files

0.5.6

2 release files

0.5.5

2 release files

0.5.4

2 release files

0.5.3

2 release files

0.5.2

2 release files

0.5.1

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.9

2 release files

0.3.8

2 release files

0.3.7

2 release files

0.3.6

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.45

2 release files

0.1.44

2 release files

0.1.43

2 release files

0.1.42

2 release files

0.1.41

2 release files

0.1.40

2 release files

0.1.39

2 release files

0.1.38

2 release files

0.1.37

2 release files

0.1.36

2 release files

0.1.35

2 release files

0.1.34

2 release files

0.1.33

2 release files

0.1.32

2 release files

0.1.31

2 release files

0.1.30

2 release files

0.1.29

2 release files

0.1.28

2 release files

0.1.26

2 release files

0.1.25

2 release files

0.1.24

2 release files

0.1.23

2 release files

0.1.22

2 release files

0.1.21

2 release files

0.1.20

2 release files

0.1.19

2 release files

0.1.18

2 release files

0.1.17

2 release files

0.1.15

2 release files

0.1.14

2 release files

0.1.13

2 release files

0.1.11

2 release files

0.1.10

2 release files

0.1.3

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page