Skip to main content

Unified CLI to scaffold, build, test, lint, and document Python and R packages

Project description

pkrr

PyPI Repo Status

Unified CLI to scaffold, build, test, lint, and document Python and R packages from a single, consistent workflow.

Why pkrr?

Many packages exist in both R and Python — either as ports of each other or as parallel implementations for different audiences. Data science teams often use R for analysis and Python for production, while community projects like ggplot2/plotnine, tidyverse/pyjanitor, and bioconductor/scanpy show how common cross-language packaging is.

Maintaining packages in both languages means juggling two build systems, two test frameworks, two sets of linting rules, and two version files. One wrong step and your versions drift, your metadata is inconsistent, or your CI only tests one language.

pkrr solves this by:

  • Unifying your workflow — one CLI for build, test, lint, docs, and versioning across both languages
  • Preventing version drift — bump the version once and it propagates to pyproject.toml and DESCRIPTION automatically
  • Scaffolding quickly — generate a ready-to-run package skeleton for either language in seconds
  • Checking your environmentpkrr doctor tells you exactly what tools you're missing before you start

If you maintain a package in both Python and R, or you're porting one to the other, pkrr keeps everything in sync from a single pkg.yaml manifest.

Install

# Run without installing (recommended)
uvx pkrr

# Install into current environment
uv pip install pkrr

# Install as a standalone CLI tool
uv tool install pkrr

# Developer install from source
git clone https://github.com/<owner>/pkrr.git
cd pkrr
uv pip install -e .

Quick start

# Initialize in current directory (prompts for name, scaffolds all files)
pkrr init

# Or with options
pkrr init --name my-package --languages python,r

# Scaffold a new Python package (creates directory)
pkrr new python my-package

# Scaffold a new R package
pkrr new r my-r-package

Commands

Command Description
pkrr init Create pkg.yaml and scaffold project files in current directory
pkrr new <lang> <name> Scaffold a new package in a new directory
pkrr build Build artifacts for the package(s)
pkrr test Run tests for the package(s)
pkrr lint Run linters for the package(s)
pkrr docs Build documentation for the package(s)
pkrr version Bump or set the version and propagate to ecosystem files
pkrr doctor Diagnose local environment for Python and R tooling

Most commands accept a --lang flag to restrict operations to a single language.

Usage

Scaffold a new package

# Use pkrr init in an empty directory to create pkg.yaml and scaffold files there
# Use pkrr new to create a new directory with the package

pkrr new python my-lib                      # creates my-lib/ with pyproject.toml, src/, tests/, docs/
pkrr new r my-r-lib                         # creates my-r-lib/ with DESCRIPTION, R/, tests/, NAMESPACE
pkrr new python my-lib --template minimal   # specify a template (default: minimal)

Initialize a project

# Interactive mode (prompts for package name)
pkrr init

# With options
pkrr init --name my-project --version 1.0.0 --license MIT --languages python,r

This creates a pkg.yaml manifest and scaffolds project files for all specified languages in the current directory.

Build, test, lint, docs

pkrr build                # python: python -m build; R: R CMD build .
pkrr test                 # python: pytest; R: testthat::test_local()
pkrr lint                 # python: ruff + black; R: lintr::lint_package()
pkrr docs                 # python: mkdocs; R: pkgdown::build_site()

# Restrict to one language in a multi-language project
pkrr build --lang python
pkrr test --lang r

Version management

pkrr version patch                     # 0.1.0 -> 0.1.1
pkrr version minor                     # 0.1.1 -> 0.2.0
pkrr version major                     # 0.2.0 -> 1.0.0
pkrr version --set 2.0.0               # set exact version
pkrr version patch --dry-run           # show what would change without writing
pkrr version patch --no-propagate      # update pkg.yaml only, skip ecosystem files
pkrr version patch --lang python       # propagate only to Python ecosystem files

Version changes are propagated to language-specific files automatically:

  • Python: updates version in pyproject.toml
  • R: updates Version in DESCRIPTION

Diagnose environment

pkrr doctor

Checks for required tooling (Python, pip, pytest, ruff, black, mkdocs, R, Rscript, testthat, lintr, pkgdown, pandoc) and reports what is missing.

The manifest (pkg.yaml)

pkrr uses a pkg.yaml file as the single source of truth for package metadata. Example:

name: my-package
version: 0.1.0
license: MIT
description: My awesome package
languages:
  - python
  - r
authors:
  - name: Jane Doe
    email: jane@example.com
keywords:
  - data
python:
  build_backend: hatchling
  requires: []
r:
  depends: []
docs:
  python: mkdocs
  r: pkgdown
ci:
  provider: none
  release_on_tag: false

Supported languages

Language Build Test Lint Docs Version propagation
Python python -m build pytest ruff, black mkdocs pyproject.toml
R R CMD build testthat lintr pkgdown DESCRIPTION

Dependencies

  • Python >= 3.9
  • typer, pydantic, PyYAML, Jinja2 (installed automatically)

Per-language tooling (pytest, ruff, R, etc.) must be installed separately. Run pkrr doctor to check what you need.

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

pkrr-1.0.1.tar.gz (11.8 kB view details)

Uploaded Source

Built Distribution

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

pkrr-1.0.1-py3-none-any.whl (20.0 kB view details)

Uploaded Python 3

File details

Details for the file pkrr-1.0.1.tar.gz.

File metadata

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

File hashes

Hashes for pkrr-1.0.1.tar.gz
Algorithm Hash digest
SHA256 549eaf1f3fa245e592ed20a4a5b48287d32187b4378a4f2f1edde604032cb598
MD5 cbda346a87716be85620e8cc570ad912
BLAKE2b-256 0ea088391c19c1bfcafa50aa40b571a1621a05ec02edb467cc589d1724c61344

See more details on using hashes here.

Provenance

The following attestation bundles were made for pkrr-1.0.1.tar.gz:

Publisher: publish.yml on nortelabs/pkrr

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

File details

Details for the file pkrr-1.0.1-py3-none-any.whl.

File metadata

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

File hashes

Hashes for pkrr-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 76798c995573f26fe3c3c264e6edd7d09fa4122440cd744afc328d36ff3f8082
MD5 52476e413d0c20ce3e52b32a28df059e
BLAKE2b-256 9a57d508c8c6f7ee7dfc89e023571a1f8e87586e4e5683753530493deaf3ec3d

See more details on using hashes here.

Provenance

The following attestation bundles were made for pkrr-1.0.1-py3-none-any.whl:

Publisher: publish.yml on nortelabs/pkrr

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