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
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.yamlfor system-wide tools - Project:
./pp.yamlfor project-specific commands - Environment:
.pp.envfor 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
- TEMPLATE.md - Complete configuration reference
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1de2ffffa9f7f66390bb03c660a4678b34b0c27a30ad0d9d9e378e358818e165
|
|
| MD5 |
32f7d4e579850d764397798bfe64b350
|
|
| BLAKE2b-256 |
2c07f3ebfdabafe251332ec14e53bee1c205a71a0196cadfe3fb8421d79fa63b
|
Provenance
The following attestation bundles were made for ppbuild-2.0.0.tar.gz:
Publisher:
publish.yml on JoshCap20/pp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ppbuild-2.0.0.tar.gz -
Subject digest:
1de2ffffa9f7f66390bb03c660a4678b34b0c27a30ad0d9d9e378e358818e165 - Sigstore transparency entry: 626372941
- Sigstore integration time:
-
Permalink:
JoshCap20/pp@effcec7443f1dc859f328d9bfb3b197d154b7075 -
Branch / Tag:
refs/tags/v2.0.0 - Owner: https://github.com/JoshCap20
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@effcec7443f1dc859f328d9bfb3b197d154b7075 -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4b0f96a436bdf3775bc2bd2addf61e2367cfc53e262b45b6fc4b3087946d56ff
|
|
| MD5 |
18bcde066e6f9c76745a6341e0efa570
|
|
| BLAKE2b-256 |
9d97266436dd08ed39ee400f3032b6068e6815a47cbb0ee692372f76d9ddd914
|
Provenance
The following attestation bundles were made for ppbuild-2.0.0-py3-none-any.whl:
Publisher:
publish.yml on JoshCap20/pp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ppbuild-2.0.0-py3-none-any.whl -
Subject digest:
4b0f96a436bdf3775bc2bd2addf61e2367cfc53e262b45b6fc4b3087946d56ff - Sigstore transparency entry: 626372942
- Sigstore integration time:
-
Permalink:
JoshCap20/pp@effcec7443f1dc859f328d9bfb3b197d154b7075 -
Branch / Tag:
refs/tags/v2.0.0 - Owner: https://github.com/JoshCap20
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@effcec7443f1dc859f328d9bfb3b197d154b7075 -
Trigger Event:
push
-
Statement type: