Presets
Presets are YAML configuration files that define project templates. They control which dependencies, templates, tooling, and structure a generated project will have.
Built-in Presets
Name |
Description |
|---|---|
|
A minimal Python package with standard tooling (pytest, ruff, dependabot) |
|
A command-line tool built with Typer (extends |
|
Data science project with Jupyter, pandas, and matplotlib |
|
Discord bot using discord.py |
List available presets:
pypreset list-presets
Inspect a preset:
pypreset show-preset cli-tool
Preset YAML Schema
A complete preset file has this structure:
name: my-preset
description: Short description
# Optional: inherit from another preset
base: empty-package
metadata:
version: "0.1.0"
description: "A Python package"
python_version: "3.11"
structure:
directories: [] # Extra directories to create
files: # Extra files to render from templates
- path: "src/{{ project.package_name }}/cli.py"
template: cli_main.py.j2
dependencies:
main:
- "typer>=0.15.0"
dev: []
testing:
enabled: true
framework: pytest
coverage: false # or a dict: {enabled: true, tool: codecov, threshold: 80}
formatting:
enabled: true
tool: ruff
line_length: 100
dependabot:
enabled: true
schedule: weekly
open_pull_requests_limit: 5
docker:
enabled: false # Generate Dockerfile + .dockerignore
base_image: null # Override (auto-resolved from python_version if null)
devcontainer: false # Generate .devcontainer/ config
container_runtime: docker # docker | podman
documentation:
enabled: false # Generate documentation scaffolding
tool: none # none | sphinx | mkdocs
deploy_gh_pages: false # Generate GitHub Pages deploy workflow
tox:
enabled: false # Generate tox.ini with tox-uv backend
typing_level: strict # none | basic | strict
layout: src # src | flat
entry_points:
- name: "__PROJECT_NAME__"
module: "__PACKAGE_NAME__.cli:app"
extras: {} # Arbitrary key-value pairs for template use
Inheritance
Presets support single inheritance via the base: field. The child preset
inherits all values from the parent, then overrides with its own values.
# cli-tool.yaml inherits from empty-package.yaml
base: empty-package
dependencies:
main:
- "typer>=0.15.0" # Added to parent's main deps
Key rules:
Scalars (strings, booleans, numbers): child replaces parent
Lists: child extends parent (additive merge via
deep_merge)Dicts: child merges into parent (recursive)
Only single-level inheritance is supported (no chains of
base:references)
Placeholders
Two special placeholder strings are available in entry_points:
__PROJECT_NAME__— replaced with the hyphenated project name (e.g.my-app)__PACKAGE_NAME__— replaced with the underscored package name (e.g.my_app)
These are substituted at config build time by preset_loader._replace_placeholders().
Custom Presets
Place custom preset YAML files in:
~/.config/pypreset/presets/
User presets take precedence over built-in presets with the same name. Use them to define your organization’s project templates:
# ~/.config/pypreset/presets/company-service.yaml
name: company-service
description: Internal microservice template
base: empty-package
metadata:
python_version: "3.14"
dependencies:
main:
- "fastapi>=0.115.0"
- "uvicorn>=0.34.0"
dev:
- "httpx>=0.28.0"
structure:
files:
- path: "Dockerfile"
template: dockerfile.j2
Then use it:
pypreset create my-service --preset company-service