Fast Python monorepo manager powered by Rust and UV
Project description
pascal
Fast Python monorepo manager powered by Rust and UV.
Pascal handles workspace scaffolding, dependency wiring, and UV workspace sync — so you can focus on code, not configuration.
Documentation · Installation · Quickstart · Commands
Heavily inspired by Polylith — packages map to Polylith's components, apps to its bases, brought to the Python/UV ecosystem with a minimal footprint.
Installation
uv tool install pascal-cli # recommended
pipx install pascal-cli
pip install pascal-cli
pascal --version
Quickstart
# Bootstrap a workspace
mkdir shop && cd shop
pascal init shop
# Add a library and an app
pascal create package cart
pascal create app storefront
# Wire them together
pascal add cart --to storefront
uv sync
# Validate and inspect
pascal check
pascal info
pascal test
Workspace layout
After the quickstart above, your workspace looks like this:
shop/
pascal.toml # workspace manifest
pyproject.toml # UV workspace root — managed by pascal
uv.lock # lockfile — commit to git
packages/
cart/
pyproject.toml
src/cart/__init__.py
tests/test_cart.py
apps/
storefront/
pyproject.toml # depends on cart
src/storefront/__init__.py
src/storefront/main.py
tests/test_storefront.py
pascal.toml
[workspace]
name = "shop"
python = "3.12"
description = "My Python monorepo"
# Optional — pascal auto-discovers from packages/ and apps/ if omitted
packages = ["packages/cart"]
apps = ["apps/storefront"]
apps/storefront/pyproject.toml (after pascal add cart --to storefront)
[project]
name = "storefront"
version = "0.1.0"
requires-python = ">=3.12"
dependencies = ["cart"]
[project.scripts]
storefront = "storefront.main:main"
[tool.uv.sources]
cart = { workspace = true }
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
Command reference
| Command | Description |
|---|---|
pascal init [name] |
Bootstrap a new workspace |
pascal create package <name> |
Scaffold a reusable library |
pascal create app <name> |
Scaffold a deployable app |
pascal add <pkg> --to <app> |
Add a workspace package as a dependency |
pascal info |
Print workspace overview |
pascal deps [--graph] |
Show the dependency tree |
pascal check |
Validate workspace health |
pascal diff [--since <ref>] |
Show changed packages since a git ref |
pascal test [--changed] [name] |
Run tests via UV |
pascal build <app> |
Build an app wheel |
pascal run <app> [-- args] |
Run an app entry-point |
pascal sync |
Regenerate UV workspace config |
Development
Prerequisites
| Tool | Purpose |
|---|---|
| Rust ≥ 1.75 | Compile the binary |
| pre-commit | Git hook runner (uv tool install pre-commit) |
| maturin (optional) | Test PyPI packaging locally |
Build
git clone https://github.com/sandeep-selvaraj/pascal
cd pascal
cargo build
Test
cargo test # unit + integration
cargo test --lib # unit tests only
cargo test --test integration # integration tests only
Integration tests in tests/integration.rs spawn the real binary against tempfile directories — no mocking.
Lint and format
cargo fmt
cargo clippy -- -D warnings
Pre-commit hooks
Install once after cloning:
pre-commit install
Every git commit will then run cargo fmt and cargo clippy automatically.
Test PyPI packaging
pip install maturin
maturin build
pip install target/wheels/*.whl
pascal --version
Serve docs locally
pip install zensical
zensical serve
License
MIT — see LICENSE.
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 Distributions
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 pascal_cli-0.1.0.tar.gz.
File metadata
- Download URL: pascal_cli-0.1.0.tar.gz
- Upload date:
- Size: 44.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bd5955541995421c5272e7e195465b47a9eb05058cdc14b952b451110b592ba9
|
|
| MD5 |
238be5f7f3821bb80b9f8e365c1d51ff
|
|
| BLAKE2b-256 |
71951fafe88a0386e6a93b78f5fc7ea71a65b0d8f4dea4d762979b6366c16692
|
Provenance
The following attestation bundles were made for pascal_cli-0.1.0.tar.gz:
Publisher:
release.yml on sandeep-selvaraj/pascal
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pascal_cli-0.1.0.tar.gz -
Subject digest:
bd5955541995421c5272e7e195465b47a9eb05058cdc14b952b451110b592ba9 - Sigstore transparency entry: 1003508106
- Sigstore integration time:
-
Permalink:
sandeep-selvaraj/pascal@066cb543e767ace0941409e0b03851fb0c939a5c -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/sandeep-selvaraj
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@066cb543e767ace0941409e0b03851fb0c939a5c -
Trigger Event:
push
-
Statement type:
File details
Details for the file pascal_cli-0.1.0-py3-none-win_amd64.whl.
File metadata
- Download URL: pascal_cli-0.1.0-py3-none-win_amd64.whl
- Upload date:
- Size: 1.3 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
220b90e588fcead54db5debe69833fee457961258eb32be01e387a58b7516de1
|
|
| MD5 |
676208129666fd6831af18f9b62ee673
|
|
| BLAKE2b-256 |
6e066ca8baeeb55f176ba4272e126329c4497de0d6a1333a17a602e492da17b2
|
Provenance
The following attestation bundles were made for pascal_cli-0.1.0-py3-none-win_amd64.whl:
Publisher:
release.yml on sandeep-selvaraj/pascal
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pascal_cli-0.1.0-py3-none-win_amd64.whl -
Subject digest:
220b90e588fcead54db5debe69833fee457961258eb32be01e387a58b7516de1 - Sigstore transparency entry: 1003508109
- Sigstore integration time:
-
Permalink:
sandeep-selvaraj/pascal@066cb543e767ace0941409e0b03851fb0c939a5c -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/sandeep-selvaraj
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@066cb543e767ace0941409e0b03851fb0c939a5c -
Trigger Event:
push
-
Statement type:
File details
Details for the file pascal_cli-0.1.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: pascal_cli-0.1.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: Python 3, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2c54320ee1a3754d48e36b9f41ecd40b6e316de928144d15b715bb66eedd1e9e
|
|
| MD5 |
de446e5b95f98c94572958955da93dce
|
|
| BLAKE2b-256 |
327c9ef1c53f1ec4a5e73b64f67f2fa057acce2053ac2d84fdc4aa6fb7a975ae
|
Provenance
The following attestation bundles were made for pascal_cli-0.1.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
release.yml on sandeep-selvaraj/pascal
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pascal_cli-0.1.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
2c54320ee1a3754d48e36b9f41ecd40b6e316de928144d15b715bb66eedd1e9e - Sigstore transparency entry: 1003508122
- Sigstore integration time:
-
Permalink:
sandeep-selvaraj/pascal@066cb543e767ace0941409e0b03851fb0c939a5c -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/sandeep-selvaraj
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@066cb543e767ace0941409e0b03851fb0c939a5c -
Trigger Event:
push
-
Statement type:
File details
Details for the file pascal_cli-0.1.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: pascal_cli-0.1.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 1.2 MB
- Tags: Python 3, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1c1c7db955d2ca864480748866928c8cfea6231566c2b7e044afa4b7b5c9358d
|
|
| MD5 |
88fe68048f4adfb9a6faeed741b0a0ee
|
|
| BLAKE2b-256 |
5c1f1c6e23bfe0878cd0f76b9b6afce5ddcbd675c166ad4d0abb4962ba1488f8
|
Provenance
The following attestation bundles were made for pascal_cli-0.1.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
release.yml on sandeep-selvaraj/pascal
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pascal_cli-0.1.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
1c1c7db955d2ca864480748866928c8cfea6231566c2b7e044afa4b7b5c9358d - Sigstore transparency entry: 1003508115
- Sigstore integration time:
-
Permalink:
sandeep-selvaraj/pascal@066cb543e767ace0941409e0b03851fb0c939a5c -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/sandeep-selvaraj
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@066cb543e767ace0941409e0b03851fb0c939a5c -
Trigger Event:
push
-
Statement type:
File details
Details for the file pascal_cli-0.1.0-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: pascal_cli-0.1.0-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c907ceef67166bb7230b4176ac5ff5172c898abd67660df645562e47d70aaec
|
|
| MD5 |
44cb249d66eca4b299bab87ccde56c0f
|
|
| BLAKE2b-256 |
8f6891d34d71cdd40956a549b8bf84f4938edffcc7d36a5fd09fa1bd4abff0f3
|
Provenance
The following attestation bundles were made for pascal_cli-0.1.0-py3-none-macosx_11_0_arm64.whl:
Publisher:
release.yml on sandeep-selvaraj/pascal
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pascal_cli-0.1.0-py3-none-macosx_11_0_arm64.whl -
Subject digest:
4c907ceef67166bb7230b4176ac5ff5172c898abd67660df645562e47d70aaec - Sigstore transparency entry: 1003508112
- Sigstore integration time:
-
Permalink:
sandeep-selvaraj/pascal@066cb543e767ace0941409e0b03851fb0c939a5c -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/sandeep-selvaraj
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@066cb543e767ace0941409e0b03851fb0c939a5c -
Trigger Event:
push
-
Statement type:
File details
Details for the file pascal_cli-0.1.0-py3-none-macosx_10_12_x86_64.whl.
File metadata
- Download URL: pascal_cli-0.1.0-py3-none-macosx_10_12_x86_64.whl
- Upload date:
- Size: 1.1 MB
- Tags: Python 3, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e8d5cbb6b058aa56a692d1bb1f68f923d7f2a76c61903f8c01965415c0210f4c
|
|
| MD5 |
4dc5f8977b0ceb7c8aecf5b917e1adce
|
|
| BLAKE2b-256 |
775eeb7afde2a53e34456b7e3b9cceab5137a2bd5d0adb549dde992730618c8a
|
Provenance
The following attestation bundles were made for pascal_cli-0.1.0-py3-none-macosx_10_12_x86_64.whl:
Publisher:
release.yml on sandeep-selvaraj/pascal
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pascal_cli-0.1.0-py3-none-macosx_10_12_x86_64.whl -
Subject digest:
e8d5cbb6b058aa56a692d1bb1f68f923d7f2a76c61903f8c01965415c0210f4c - Sigstore transparency entry: 1003508119
- Sigstore integration time:
-
Permalink:
sandeep-selvaraj/pascal@066cb543e767ace0941409e0b03851fb0c939a5c -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/sandeep-selvaraj
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@066cb543e767ace0941409e0b03851fb0c939a5c -
Trigger Event:
push
-
Statement type: