Skip to content

A set of templates that allow to bootstrap a Python project structure with uv and other modern Python tools.

License

MIT, Unknown licenses found

Licenses found

MIT
LICENSE
Unknown
LICENSE.jinja
Notifications You must be signed in to change notification settings

copier-templates/copier-python-uv

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

tests uv ruff copier License

🎯 Python Project Template

This template provides a standardized Python project structure with sensible defaults, tailored to use in Python projects. It streamlines project setup and encourages best practices from the start.


📋 Prerequisites

The following tools must be installed:

  • Python 3.10 or newer
  • uv or pipx (if you want to install Copier in an isolated environment, accessible everywhere)
  • copier

🚀 Usage

  1. Install Copier (if not already):

    pipx install copier

    or

    uv tool install copier
  2. Generate files in your target repository (interactive):

    copier copy /path/to/copier-template /path/to/your-repo

    Replace /path/to/copier-template with the path to this template, and /path/to/your-repo with your target repository.

    Note: If you're testing with unreleased template changes, use --vcs-ref=HEAD:

    copier copy --vcs-ref=HEAD /path/to/copier-template /path/to/your-repo
  3. Generate non-interactively using the provided sample data file: A sample data file is provided at examples/config-basic.yml.

    copier copy --data-file examples/config-basic.yml /path/to/copier-template /path/to/your-repo

    You can duplicate and modify that file to create variants (e.g., data-with-ruff.yml).

    Note: This template uses conditional tasks (see Tasks Behavior), which require the --trust flag:

    copier copy --trust --data-file examples/config-basic.yml /path/to/copier-template /path/to/your-repo
  4. (Optional) Override specific values at the CLI: You can still override one or more answers on the fly:

    copier copy --trust --data-file examples/config-basic.yml -d project_name=override_name /path/to/template /dest
  5. Review and commit the generated files:

    cd /path/to/your-repo
    git add .
    git commit -m "feat: Bootstrap repository from template"

⚠️ Tasks Behavior with Different Copier Commands

This template uses conditional tasks to manage optional features (LICENSE file, GitHub integration). Understanding their behavior is important for safe updates:

Task Execution Process

Tasks always run at the end of both copier copy and copier update operations, after all files are generated. This means:

  • Files are created/updated first
  • Tasks execute based on your current answers
  • Any deletions from tasks are permanent for that operation

Initial Project Generation (copier copy)

When you generate a new project with conditions set:

  • include_license=true → LICENSE file is kept
  • include_license=falseLICENSE file is removed after generation
  • github_integration=true.github/ files (templates, workflows) are kept
  • github_integration=false.github/ directory is removed after generation

Project Updates (copier update)

Tasks are executed again during updates. This is important:

  • ✅ Safe with --defaults (keeps your previous answers as-is)
  • ✅ Safe if you keep boolean settings unchanged
  • ⚠️ Dangerous if you change boolean settings when you have customizations

Safe Update Commands

Recommended - Keeps all previous answers:

copier update --defaults --trust  
# Your github_integration and include_license settings remain unchanged

Safe if no customizations in affected directories:

copier update --trust --data github_integration=false
# OK if you haven't customized .github/ subdirectories

Dangerous Update Scenario ⚠️

# Initial generation WITH GitHub integration
copier copy --trust --vcs-ref=HEAD \
  --data project_name=myproject \
  --data github_integration=true \
  /template /myproject

# Later: You customize workflows in .github/workflows/

# Then: Update but accidentally change github_integration to false
copier update --trust --data github_integration=false
# Result: 🔴 rm -rf .github DELETES ALL CUSTOM WORKFLOWS!

Safe Alternative for Disabling Features

If you need to disable GitHub integration after customizing .github/:

  1. Manually back up your customizations:

    cp -r .github/workflows /tmp/my-workflows-backup
    cp LICENSE /tmp/my-license-backup  # if customized
  2. Run the update to disable features:

    copier update --trust --data github_integration=false
  3. Restore your customizations:

    cp -r /tmp/my-workflows-backup /path/to/.github/workflows
  4. Commit your changes:

    git add .github/
    git commit -m "Restore custom workflows"

📦 Answers Files Explained

File Purpose
.copier-answers.yml Auto-maintained answers file for future updates (never edit manually). Now explicitly generated because the template includes .copier-answers.yml.jinja.
examples/config-basic.yml Example data file passed with --data-file (excluded from rendered projects).

⚙️ Internal Template Artifacts Not Copied

The template excludes helper folders (examples/, my_tests/) from generated projects via _exclude in copier.yaml. This keeps consumer projects clean.

To create a new variant template from existing data file configuration:

copier copy --data-file /path/to/config-basic.yml /path/to/template /dest

For advanced configuration (tasks, migrations, multiple templates) see the Copier docs sections: tasks, migrations, applying multiple templates.

✏️ Customization

You can edit the template files (*.jinja) to fit your team's standards. See Copier documentation for advanced templating and options.

🧪 Testing the Template

This template includes comprehensive validation tests to ensure generated projects meet expected standards.

▶️ Running Tests

# Run all validation tests
make test

⚡ Test Performance

Tests use session-scoped fixtures for optimal performance:

  • Session-scoped fixtures: Generated projects created once per test session, reused across all test modules
  • Module-scoped wrappers: Clean test API with ~50% faster execution vs module scope alone
  • All tests read-only: No mutations to generated projects ensures fixture reuse is safe

📁 Test Files

Test files are located in my_tests/ folder.

File Purpose
test_core_structure.py Validates required files, directories, and project structure
test_exclusions.py Ensures excluded files (copier.yaml, etc.) are not rendered
test_conditional_sections.py Tests conditional rendering based on dependencies (e.g., Ruff)

See my_tests/conftest.py for fixture definitions.

📚 Local Documentation

Project-specific guides and workflows:

Topic Location
CI/CD Pipeline docs/ci.md
Development Setup docs/development.md
Template Architecture docs/architecture.md

🔗 External References

For framework and tool documentation:

Python packaging

Tools

About

A set of templates that allow to bootstrap a Python project structure with uv and other modern Python tools.

Topics

Resources

License

MIT, Unknown licenses found

Licenses found

MIT
LICENSE
Unknown
LICENSE.jinja

Security policy

Stars

Watchers

Forks

Packages

No packages published