Skip to main content

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

Project description

pkrr

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

# Scaffold a new Python package
pkrr new python my-package

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

# Initialize pkg.yaml in an existing directory
pkrr init --name my-package --languages python,r

Commands

Command Description
pkrr new <lang> <name> Scaffold a new package from templates
pkrr init Create a pkg.yaml manifest in the current 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

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 an existing project

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

This creates a pkg.yaml manifest that tracks metadata shared across languages.

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-0.1.0.tar.gz (11.2 kB view details)

Uploaded Source

Built Distribution

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

pkrr-0.1.0-py3-none-any.whl (19.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: pkrr-0.1.0.tar.gz
  • Upload date:
  • Size: 11.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.6

File hashes

Hashes for pkrr-0.1.0.tar.gz
Algorithm Hash digest
SHA256 241eae34d33696cef05d96bca6e0fd20c08dd79261963f2d8aa46ff091f3ea60
MD5 2e735b055f43335f72d9ce79b532d43c
BLAKE2b-256 16691def2ca828dccfd5bb41c3fa6c16af8b6df0221bdd687a4727ef3de0ca08

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pkrr-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 19.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.6

File hashes

Hashes for pkrr-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 48b3db89c66b7d0204ad67f8316c26f8495843aa267f0f41a8be3f021487ebd7
MD5 fd7a945cd5909ec2418404e42403effa
BLAKE2b-256 75c044a604aebb3fd0dc34edfe2be2152a6ce6f851489a0998a51672cf95eb00

See more details on using hashes here.

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