Skip to main content

A declarative, language-agnostic build system and utility manager

This project has been archived.

The maintainers of this project have marked this project as archived. No new releases are expected.

Project description

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.

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

ppbuild-2.0.0.tar.gz (20.4 kB view details)

Uploaded Source

Built Distribution

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

ppbuild-2.0.0-py3-none-any.whl (15.2 kB view details)

Uploaded Python 3

File details

Details for the file ppbuild-2.0.0.tar.gz.

File metadata

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

File hashes

Hashes for ppbuild-2.0.0.tar.gz
Algorithm Hash digest
SHA256 1de2ffffa9f7f66390bb03c660a4678b34b0c27a30ad0d9d9e378e358818e165
MD5 32f7d4e579850d764397798bfe64b350
BLAKE2b-256 2c07f3ebfdabafe251332ec14e53bee1c205a71a0196cadfe3fb8421d79fa63b

See more details on using hashes here.

Provenance

The following attestation bundles were made for ppbuild-2.0.0.tar.gz:

Publisher: publish.yml on JoshCap20/pp

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

File details

Details for the file ppbuild-2.0.0-py3-none-any.whl.

File metadata

  • Download URL: ppbuild-2.0.0-py3-none-any.whl
  • Upload date:
  • Size: 15.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for ppbuild-2.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4b0f96a436bdf3775bc2bd2addf61e2367cfc53e262b45b6fc4b3087946d56ff
MD5 18bcde066e6f9c76745a6341e0efa570
BLAKE2b-256 9d97266436dd08ed39ee400f3032b6068e6815a47cbb0ee692372f76d9ddd914

See more details on using hashes here.

Provenance

The following attestation bundles were made for ppbuild-2.0.0-py3-none-any.whl:

Publisher: publish.yml on JoshCap20/pp

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