Skip to main content

Deterministic fixture generator for Pydantic models.

Project description

pydantic-fixturegen: deterministic fixtures for Pydantic, dataclasses, TypedDicts

Deterministic fixtures, pytest modules, datasets, and JSON from Pydantic v2 models and stdlib dataclasses/TypedDicts, all inside a sandboxed CLI with Pluggy providers.

PyPI version Python versions Pydantic v2 License: MIT

Generate deterministic structured data, pytest fixtures, and JSON quickly with a safe, task-focused CLI built for modern testing workflows. Fixturegen still speaks Pydantic natively and now understands dataclasses and TypedDicts without extra adapters. Official support targets Python 3.10–3.14 and Pydantic v2.

📘 Read the full docs and examples at pydantic-fixturegen.kitgrid.dev.

Install

pip install pydantic-fixturegen
# Extras: orjson, regex, hypothesis, watch
pip install 'pydantic-fixturegen[all]'

Other flows → docs/install.md

⚡️ 60-second quickstart

Copy/paste the snippet below into a shell. It drops a tiny User model into models.py, lists it, generates JSON samples, and writes pytest fixtures—all with deterministic seeds.

# 1) Create a minimal model file
cat > models.py <<'PY'
from pydantic import BaseModel, EmailStr


class User(BaseModel):
    id: int
    email: EmailStr
    tags: list[str]
PY

# 2) Discover models
pfg list models.py

# 3) Emit JSON samples (2 records) to ./out/User.json
pfg gen json models.py \
  --include models.User \
  --n 2 --indent 2 \
  --seed 7 --freeze-seeds \
  --out out/{model}.json

# 4) Emit pytest fixtures with 3 deterministic cases
pfg gen fixtures models.py \
  --include models.User \
  --cases 3 \
  --seed 7 --freeze-seeds \
  --out tests/fixtures/{model}_fixtures.py

Expected results:

  • pfg list prints models.User so you know discovery works.
  • out/User.json contains two pretty-printed user records seeded with --seed 7.
  • tests/fixtures/User_fixtures.py exposes three pytest fixtures (user_case_1, etc.) you can import immediately.

Once those commands work, swap in your actual module path and tweak shared flags like --include, --seed, --watch, or --cases as needed.

Documentation & examples

If you ever get stuck, run pfg <command> --help to see the available flags plus the docs permalink for that command.

Why

  • You keep tests reproducible with cascaded seeds across random, Faker, and optional NumPy.
  • You run untrusted models inside a safe-import sandbox with network, filesystem, and memory guards.
  • You drive JSON, pytest fixtures, schemas, and explanations from the CLI or Python helpers.
  • You dial collection sizes up or down (globally or per field) with deterministic min/max/distribution knobs when you need denser samples.
  • You extend generation with Pluggy providers and preset bundles without forking core code.

You also stay observant while you work: every command can emit structured logs, diff artifacts against disk, and surface sandbox warnings so you catch regressions before they land.

Extended quickstart

  1. Create a small model file (Pydantic v2, @dataclass, or TypedDict).
  2. List models: pfg list ./models.py
  3. Generate JSON: pfg gen json ./models.py --include models.User --n 2 --indent 2 --out ./out/User
  4. Generate fixtures: pfg gen fixtures ./models.py --out tests/fixtures/test_user.py --cases 3 Full steps → docs/quickstart.md

JSON, fixtures, and schema commands all share flags like --include, --exclude, --seed, --preset, and --watch, so once you learn one flow you can handle the rest without re-reading the help pages.

Example module + CLI tour

# examples/models.py
from dataclasses import dataclass
from typing import TypedDict

from pydantic import BaseModel, EmailStr


class AuditTrail(TypedDict):
    actor: str
    event: str
    ip: str


@dataclass
class ShippingWindow:
    earliest: str
    latest: str


class Order(BaseModel):
    id: int
    email: EmailStr
    items: list[str]
    shipping: ShippingWindow
    audit: AuditTrail


class Address(BaseModel):
    street: str
    city: str
# JSON + datasets
pfg gen json examples/models.py --include examples.Order --n 5 --jsonl \
  --seed 11 --freeze-seeds \
  --out artifacts/{model}.jsonl
pfg gen dataset examples/models.py --include examples.Order --format parquet --n 10000 \
  --seed 11 --freeze-seeds \
  --out warehouse/{model}.parquet

# Pytest fixtures + persistence
pfg gen fixtures examples/models.py --include examples.Order --cases 3 \
  --seed 11 --freeze-seeds \
  --out tests/fixtures/{model}_fixtures.py
pfg persist examples/models.py --handler http-post --handler-config '{"url": "https://api.example.com/orders"}' \
  --include examples.Order --n 25 --seed 11 --freeze-seeds

Prefer Python APIs?

from pathlib import Path
from pydantic_fixturegen.api import generate_json
from pydantic_fixturegen.core.path_template import OutputTemplate

result = generate_json(
    target=Path("examples/models.py"),
    output_template=OutputTemplate("artifacts/{model}.json"),
    count=10,
    jsonl=True,
    include=["examples.Order"],
    field_hints="defaults",
    collection_min_items=1,
    collection_max_items=3,
)

for path in result.paths:
    print("wrote", path)

See docs/examples.md for more end-to-end snippets that cover datasets, fixtures, persistence handlers, and Python helpers.

Supported model families

  • Pydantic BaseModel / RootModel (v2) — full support with validators, constraints, provider defaults, and Polyfactory delegation.
  • Stdlib @dataclass — fixturegen inspects field metadata/annotations, respects defaults/examples, and serializes back to dataclass instances.
  • typing.TypedDict (total or partial) — treated as schema-driven dicts, including nested dataclasses or other TypedDicts.
  • 🚧 attrs/msgspec — not yet wired into the adapters; vote on issue #53 if you need them next.

The same include/exclude filters, overrides, presets, and field hints apply no matter which model family you point the CLI at.

Basics

Core usage (top 5)

pfg list <path>
pfg gen json <target> [--n --jsonl --indent --out]
pfg gen fixtures <target> [--style --scope --cases --out]
pfg gen schema <target> --out <file>
pfg doctor <target>
  • pfg list discovers models with AST or safe-import; add --ast when you must avoid imports.
  • pfg gen json emits JSON or JSONL; scale with --n, --jsonl, --shard-size, and --freeze-seeds.
  • pfg gen fixtures writes pytest modules; tune --style, --scope, --cases, and --return-type.
  • pfg gen schema dumps JSON Schema atomically; point --out at a file or directory template.
  • pfg doctor audits coverage and sandbox warnings; fail builds with --fail-on-gaps.

All commands → docs/cli.md

Basic configuration

key type default purpose
seed int \ str \ null null Global seed
locale str en_US Faker locale
union_policy enum first Union branch
enum_policy enum first Enum choice
json.indent int 2 Pretty JSON
json.orjson bool false Fast JSON
emitters.pytest.style enum functions Fixture style
emitters.pytest.scope enum function Fixture scope
[tool.pydantic_fixturegen]
seed = 42
[tool.pydantic_fixturegen.json]
indent = 2

Need denser lists/sets? Add a [tool.pydantic_fixturegen.collections] block (or pass --collection-* flags) to clamp global min/max items and choose uniform, min-heavy, or max-heavy distributions before per-field constraints kick in.

Full matrix and precedence → docs/configuration.md

Common tasks

Documentation

Index · Quickstart · Examples · Cookbook · Configuration · CLI · Concepts · Features · Security · Architecture · Troubleshooting · Alternatives

Community

Open issues for bugs or ideas, start Discussions for design questions, and follow the security policy when you disclose sandbox bypasses.

License

MIT. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pydantic_fixturegen-1.3.0.tar.gz (469.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pydantic_fixturegen-1.3.0-py3-none-any.whl (282.2 kB view details)

Uploaded Python 3

File details

Details for the file pydantic_fixturegen-1.3.0.tar.gz.

File metadata

  • Download URL: pydantic_fixturegen-1.3.0.tar.gz
  • Upload date:
  • Size: 469.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for pydantic_fixturegen-1.3.0.tar.gz
Algorithm Hash digest
SHA256 c30ac65f36e34204ac667fae11f05ef41e0e2a13d53c01d19c226829e32f0118
MD5 c4aef58772b764101d3dae3982518f41
BLAKE2b-256 ddda665c3376d9bf47902c69b0609e70b4eb2b9aedec74a4aeb47454a5373bb9

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydantic_fixturegen-1.3.0.tar.gz:

Publisher: release.yml on CasperKristiansson/pydantic-fixturegen

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pydantic_fixturegen-1.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for pydantic_fixturegen-1.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 33a10c714bd83690873efe3bdbe4a68cab3055d87ab45d406c328e8d2fb91530
MD5 36748d28ecf2f9faefc83f65485274e2
BLAKE2b-256 7cb64f8e3511344aac561fa6c5bb2d07665965b061810ab706ce66976ca981b7

See more details on using hashes here.

Provenance

The following attestation bundles were made for pydantic_fixturegen-1.3.0-py3-none-any.whl:

Publisher: release.yml on CasperKristiansson/pydantic-fixturegen

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page