Skip to main content

Patisserie

Pâtisserie

PyPI Version Python 3.8+ License: MIT License: Apache 2.0

Language-agnostic boilerplate code generator from YAML data models and Jinja2 templates.

Define your data model once in YAML. Generate boilerplate code in any language (Java, Rust, Python, Go, TypeScript, etc.) using Jinja2 templates.

Why Pattiserie?

  • Single Source of Truth: Define your data model once, generate code for multiple languages
  • Template-Driven: Use Jinja2 to create language-specific templates
  • Configuration as Code: YAML schemas with anchors for DRY configuration
  • Language Agnostic: Generate Java, Rust, Python, Go, TypeScript, or any text-based format
  • Zero Runtime Dependencies: Just Python, PyYAML, and Jinja2

Quick Start

Installation

pip install patisserie

5-Minute Example

  1. Initialize a project:

    mkdir my-project && cd my-project pati mise

The pati mise command will create the .pati directory for you and create the sample schema.yaml and templates files you can edit.

  1. Edit your data model (.pati/schema.yaml):

    jobs:
      user_entity:
        template: entity.java.j2
        output: generated/User.java
        context:
          package: com.example
          class_name: User
          fields:
            - name: id
              type: Long
            - name: username
              type: String
    
  2. Customize a template (.pati/tmplts/entity.java.j2):

    package {{ package }};
    
    public class {{ class_name }} {
    {% for field in fields %}
        private {{ field.type }} {{ field.name }};
    {% endfor %}
    }
    
  3. Generate code:

    pati cuire
    
  4. Check the output:

    cat generated/User.java
    

Features

📋 YAML Schema Support

  • Define jobs with template, output, and context
  • YAML anchors (&name) and aliases (*name) for reusable config
  • Merge key (<<: *alias) for DRY configuration
  • Full PyYAML support for complex structures

🎨 Jinja2 Templates

  • Variables: {{ variable }}
  • Loops: {% for item in items %}
  • Conditionals: {% if condition %}
  • Filters: {{ value | filter }}
  • Complete Jinja2 feature set

🛠️ CLI Tools

# Generate all jobs from default schema (.pati/schema.yaml)
pati cuire

# Generate specific job(s) by name
pati cuire pojo_user

# Generate jobs matching a glob pattern
pati cuire 'pojo*'

# Generate jobs matching multiple patterns
pati cuire 'pojo*' dto_user

# Generate from a specific schema
pati cuire --config path/to/schema.yaml

# Dry run (preview without writing)
pati cuire --dry-run

# Override output directory
pati cuire --output-dir /path/to/output

# Initialize new project, creating a sample yaml
# and the sample template files in the directory .pati
pati mise

📦 Built-in Examples

  • Java Spring Boot: Entities, DTOs, Repositories, Liquibase migrations
  • Rust SQLx: Models with SQLx derive macros
  • Python SQLAlchemy: ORM models
  • Go GORM: Struct definitions with GORM tags

These examples are for demonstration purpose only. They are simplified. Real word examples can start from these templates, but they will likely be extended.

Documentation

Example Use Cases

Multi-language ORM Models

jobs:
  user_java:
    template: entity.java.j2
    output: src/main/java/User.java
    context: { class_name: User, fields: [...] }
  
  user_python:
    template: model.py.j2
    output: models/user.py
    context: { class_name: User, fields: [...] }
  
  user_rust:
    template: model.rs.j2
    output: src/models/user.rs
    context: { struct_name: User, fields: [...] }

Microservice Scaffolding

Generate controllers, services, and DTOs from a single data model schema.

API Client/Server Code

Generate OpenAPI specs, request/response models, and route handlers.

Database Migrations

Generate SQL migrations, Liquibase changesets, or Flyway migrations.

Configuration Files

Generate Docker Compose, Kubernetes manifests, or Terraform code.

Architecture

schema.yaml          Template files              Generated code
     │               (Jinja2)                         │
     │                   │                            │
     └──────────────────────────────────────────────────→
                    pati
          (config loader + generator)
  1. Load YAML schema
  2. Extract job configuration
  3. Initialize Jinja2 environment
  4. Render each template with context
  5. Write generated files

Development

This chapter is about how to develop the code of Pâtisserie itself.

Setup

git clone https://github.com/yourusername/pati.git
cd pati
pip install -e ".[dev]"

Running Tests

pytest tests/ -v --cov

Building

./build.sh

Releasing

./release.sh 0.2.0

CLI Reference

# Generate from default schema
pati cuire [JOB ...] [OPTIONS]     # French: "to bake"
pati generate [JOB ...] [OPTIONS]  # English alias — identical
  JOB                     Job name(s) or glob patterns to run (default: all)
                          Examples: pojo_user  'pojo*'  'pojo*' dto_user
  --config, -c FILE       Path to schema file (default: .pati/schema.yaml)
  --dry-run               Show what would be generated without writing
  --output-dir DIR        Override output directory for all jobs

# Initialize new project structure
pati mise [OPTIONS]       # French: "mise en place"
pati init [OPTIONS]       # English alias — identical
  --output, -o DIR        Output directory (default: current directory)

# Show version
pati --version, -v

# Logging level (global flags, mutually exclusive)
pati --verbose COMMAND   # debug output
pati --quiet COMMAND     # warnings and errors only
pati -q COMMAND
pati --silent COMMAND    # errors only
pati -s COMMAND

# Show help
pati --help
pati COMMAND --help

Project Structure

pati/
├── src/pati/           # Main package
│   ├── __init__.py          # Package metadata
│   ├── cli.py               # CLI entry point
│   ├── config.py            # YAML config loader
│   ├── generator.py         # Template generator
│   └── utils.py             # Helper functions
├── examples/                # Example templates
│   ├── java-spring/
│   ├── rust-sqlx/
│   ├── python-sqlalchemy/
│   └── go-gorm/
├── tests/                   # Test suite
├── docs/                    # Documentation
├── setup.py                 # Package metadata
├── pyproject.toml          # Modern Python config
├── build.sh                 # Build script
└── release.sh              # Release script

License

Licensed under either of:

at your option.

Contributing

Contributions welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Write tests for new features
  4. Ensure tests pass: pytest tests/ -v --cov
  5. Submit a pull request

Support

Roadmap

  • Watch mode for live template development
  • Template inheritance and includes
  • Custom Jinja2 filters and globals
  • Schema validation with JSON Schema
  • Plugin system for extensibility
  • Web UI for template editing
  • Template marketplace

Ready to generate? → Quick Start Guide

Metadata

Release files for patisserie 1.1.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 patisserie 1.1.0
File Size Uploaded Provenance
patisserie-1.1.0.tar.gz 24.1 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for patisserie 1.1.0
File Interpreter ABI Platform
patisserie-1.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 46.3 kB

Release files / patisserie-1.1.0.tar.gz

Download URL patisserie-1.1.0.tar.gz
Size 24.1 kB
Tags Source
SHA-256 checksum
How to use checksums
e11ebe8ae38bdb5d5f3d3a0c9fef135edef0472741f15e8363015d0e71ff21ea
BLAKE2b-256 checksum
How to use checksums
1035f16cf0f1f6608427fff7efaed2ec6bceae94800a8cf54b25ff6e40667e77
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Release files / patisserie-1.1.0-py3-none-any.whl

Download URL patisserie-1.1.0-py3-none-any.whl
Size 22.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6828a0df8dc474886448890f78cad1c71d94f8b2c725f94bfb3e63d5697b517d
BLAKE2b-256 checksum
How to use checksums
35fbbc22b354f0417820e3fccf895295a5322fff57bff9ae44e5939328271d0d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.3

Security for patisserie 1.1.0

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.1.0 This release

2 release files No provenance

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