Metadata-Version: 2.4
Name: exdrf-gen-al2pd
Version: 0.1.17
Summary: Generate pydantic models content using DRF from sqlalchemy models.
Author-email: Nicu Tofan <nicu.tofan@gmail.com>
License-Expression: MIT
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Development Status :: 3 - Alpha
Classifier: Typing :: Typed
Requires-Python: >=3.12.2
Description-Content-Type: text/markdown
Requires-Dist: click<9,>=8.2.1
Requires-Dist: exdrf-al>=0.1.18
Requires-Dist: exdrf-gen>=0.1.17
Requires-Dist: exdrf-pd>=0.1.17
Requires-Dist: exdrf>=0.1.17
Requires-Dist: pydantic>=2.10.6
Provides-Extra: dev
Requires-Dist: autoflake; extra == "dev"
Requires-Dist: black; extra == "dev"
Requires-Dist: build; extra == "dev"
Requires-Dist: flake8; extra == "dev"
Requires-Dist: isort; extra == "dev"
Requires-Dist: mypy; extra == "dev"
Requires-Dist: pre-commit; extra == "dev"
Requires-Dist: pyproject-flake8; extra == "dev"
Requires-Dist: pytest-cov; extra == "dev"
Requires-Dist: pytest-mock; extra == "dev"
Requires-Dist: pytest; extra == "dev"
Requires-Dist: twine; extra == "dev"
Requires-Dist: wheel; extra == "dev"
Requires-Dist: click<9,>=8.2.1; extra == "dev"

# exdrf-gen-al2pd

**exdrf-gen-al2pd** is an **`exdrf-gen`** plugin that generates **Pydantic**
`ExModel` classes from SQLAlchemy-backed **`ExDataset`** metadata (same field
partitioning idea as **bk-one** **`db2m`**). Generated modules pair with
**`exdrf-gen-al2r`** when you want matching FastAPI routers.

Python **3.12.2+** is required.

## Generated models per resource

For each **`ExResource`** the emitter writes one module (snake-case **plural**
stem, e.g. `widgets.py`) under the resource’s **category** path containing:

- **`Xxx`** — label fields (`minimum_field_set`) plus primary keys.
- **`XxxEx(Xxx)`** — extra scalars and relations (`PagedList[Related]` /
  optional nested related **label** types), with forward refs where needed.
- **`XxxCreate`** — writable create payload: excludes derived columns,
  `depends_on` FK scalars, `read_only`, audit names `created_on` /
  `updated_on`, and the lone PK when **`is_primary_simple`**. To-many
  relations use **`{rel}_ids`** (single related PK) or **`{rel}_keys`**
  (`list[dict[str, Any]]` for composite related PKs).
- **`XxxEdit`** — same payload rules for updates but **no primary-key
  fields**. Omitted when the resource is a **composite-PK link** with **only
  PK scalars** (then only **`XxxCreate`** is emitted).

The package also writes **`api.py`** at the output root with re-exports, and
adds **`__init__.py`** files so the tree is importable as a package.

## Command-line usage

```bash
exdrf-gen al2pd DATASET OUT-PATH
```

Or: `python -m exdrf_gen al2pd DATASET OUT-PATH`.

- **DATASET** — `module.path:DeclarativeBase` for SQLAlchemy (same as other
  **al2\*** plugins).
- **OUT-PATH** — required unless **`EXDRF_AL2PD_PATH`** is set; directory for
  generated Python modules.

## Dependencies

See `pyproject.toml`: **`exdrf`**, **`exdrf-al`**, **`exdrf-gen`**,
**`exdrf-pd`**, **`click`**, **`pydantic`**.

## Plugin registration

```toml
[project.entry-points.'exdrf.plugins']
exdrf_gen = 'exdrf_gen_al2pd'
```

## See also

- **`exdrf-gen-al2r`** — FastAPI routers that import these schemas.
- **`exdrf-gen`** — [`README.md`](../exdrf-gen/README.md).
