Skip to main content
Archived

This project has been archived by its maintainers, and is no longer receiving any updates.

pp

Tests CI/CD

A declarative, language-agnostic task runner and build system.

Stop memorizing different build tools. Define your commands once in pp.yaml and run them anywhere.

pp myapp build    # Build your app
pp myapp test     # Run tests
pp myapp deploy   # Deploy

Works with any language: Python, Node.js, Rust, Go, Docker, or shell scripts.

Why pp?

  • ✅ One interface for everything - Same commands across all projects
  • ✅ Task dependencies - Automatic execution ordering (lint → test → build)
  • ✅ Type-safe parameters - Validated arguments with defaults and constraints
  • ✅ Environment management - Automatic venv activation, env vars, working directories
  • ✅ Simple & fast - 1,000 lines of straightforward code, zero dependencies

Quick Start

1. Install:

pip install ppbuild
macOS users: click for installation options

If you get an "externally-managed-environment" error:

# Option 1: Use pipx (recommended)
brew install pipx
pipx install ppbuild

# Option 2: Use venv
python3 -m venv ~/.pp-env
source ~/.pp-env/bin/activate
pip install ppbuild

2. Create pp.yaml:

applications:
  myapp:
    help: "My awesome application"
    actions:
      build:
        help: "Build the project"
        command: ["cargo", "build", "--release"]

      test:
        help: "Run tests"
        command: ["cargo", "test"]
        depends_on: [build]

      deploy:
        help: "Deploy to production"
        command: ["./deploy.sh"]
        depends_on: [test]

3. Run:

pp myapp deploy   # Automatically runs: build → test → deploy

Features

Task Dependencies

Actions run in the correct order automatically:

actions:
  deploy:
    command: ["./deploy.sh"]
    depends_on: [lint, test, build]  # Runs lint → test → build → deploy

Typed Parameters

Add validated, type-safe parameters to your commands:

actions:
  run:
    parameters:
      port:
        type: integer
        default: 8000
        min: 1024
        max: 65535
      debug:
        type: boolean
        default: false
    command: ["python", "app.py", "--port", "{port}", "{debug:--debug}"]
pp myapp run --port 3000 --debug

Environment Management

Automatic environment setup:

applications:
  backend:
    directory: "~/projects/backend"  # Auto-changes directory
    venv: ".venv"                    # Auto-activates venv
    env_vars:
      DATABASE_URL: "postgresql://localhost/db"
      API_KEY: "${SECRET_API_KEY}"   # Substitutes env vars
    actions:
      # ... your actions

Flexible Configuration

  • Global: ~/.pp/pp.yaml for system-wide tools
  • Project: ./pp.yaml for project-specific commands
  • Environment: .pp.env for secrets and local overrides

Examples

Web Development:

applications:
  web:
    directory: "./frontend"
    actions:
      dev:
        command: ["npm", "run", "dev"]
      build:
        command: ["npm", "run", "build"]
      deploy:
        command: ["vercel", "deploy"]
        depends_on: [build]

Python Project:

applications:
  api:
    venv: ".venv"
    env_vars:
      PYTHONPATH: "./src"
    actions:
      install:
        command: ["pip", "install", "-r", "requirements.txt"]
      test:
        command: ["pytest", "--cov=src"]
        depends_on: [install]
      lint:
        command: ["black", ".", "--check"]

Multi-Service:

applications:
  stack:
    actions:
      up:
        command: ["docker-compose", "up", "-d"]
      logs:
        command: ["docker-compose", "logs", "-f"]
      down:
        command: ["docker-compose", "down"]

See examples/ for more configurations.

Documentation

Development

# Clone and install
git clone https://github.com/JoshCap20/pp.git
cd pp
pip install -e .

# Run tests
pytest                           # Run all tests
pytest --cov=lib                # With coverage

# Format and lint
black .
isort .

Architecture

Simple, straightforward Python code. No design patterns, no over-engineering.

pp/
├── pp.py              # Main entry point (144 lines)
└── lib/               # Core library (~850 lines)
    ├── config.py      # YAML loading & validation
    ├── params.py      # Parameter handling
    ├── execution.py   # Command execution
    ├── dependencies.py # Dependency resolution
    └── cli.py         # Argument parser

Test coverage: 72% overall, 99% on core logic

License

MIT License - see LICENSE

Contributing

Contributions welcome! This project values simplicity above all else. Before adding features, consider whether they truly need to exist.


Stop context-switching between build tools. Use pp.

Metadata

Release files for ppbuild 2.0.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 ppbuild 2.0.0
File Size Uploaded
ppbuild-2.0.0.tar.gz 20.4 kB Details

Built distribution (wheel)

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

Total release size: 35.6 kB

Release files / ppbuild-2.0.0.tar.gz

Download URL ppbuild-2.0.0.tar.gz
Size 20.4 kB
Tags Source
SHA-256 checksum
How to use checksums
1de2ffffa9f7f66390bb03c660a4678b34b0c27a30ad0d9d9e378e358818e165
BLAKE2b-256 checksum
How to use checksums
2c07f3ebfdabafe251332ec14e53bee1c205a71a0196cadfe3fb8421d79fa63b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 21, 2025.

Transparency log

Release files / ppbuild-2.0.0-py3-none-any.whl

Download URL ppbuild-2.0.0-py3-none-any.whl
Size 15.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4b0f96a436bdf3775bc2bd2addf61e2367cfc53e262b45b6fc4b3087946d56ff
BLAKE2b-256 checksum
How to use checksums
9d97266436dd08ed39ee400f3032b6068e6815a47cbb0ee692372f76d9ddd914
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 21, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

2.0.0 This release

2 release files

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