Metadata-Version: 2.5
Name: csrd-models
Version: 0.7.0
Summary: Base Pydantic models and settings
Project-URL: Repository, https://github.com/csrd-api/fastapi-common
Project-URL: Documentation, https://github.com/csrd-api/fastapi-common/tree/main/packages/models
Project-URL: Changelog, https://github.com/csrd-api/fastapi-common/blob/main/CHANGELOG.md
License: MIT
Requires-Python: >=3.12
Requires-Dist: pydantic-settings<3,>=2.10
Requires-Dist: pydantic<3,>=2.10
Description-Content-Type: text/markdown

# 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

## Secret settings

```python
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.

## Installation

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

## Dependencies

None (Tier 1 — standalone)
