Skip to main content

Parallel and sequential task-tree runner with matrix expansion and effects plugins.

Project description

camas-sketch-by-jph

Camas

A task runner with parallel execution, matrix expansion, MCP, and pluggable output effects.

  • For developers: live tree view that updates in place as tasks stream
  • For CI/CD: one definition drives both local runs and CI
  • For LLMs: a closed edit→validate→run loop over structured MCP

 

demo

Example

from camas import Parallel, Sequential

ci = Sequential(
  Parallel(
    "ruff format . --check",
    "npx prettier ."
  ),
  Parallel(
    "ruff check .",
    "mypy .",
    "npx eslint src/",
    "pytest",
    "npx tsc --noEmit"
  ),
)

The animated tree above is from a live test fixture — see the walkthrough.

Install

[!TIP] Add extras with PEP 621, e.g. camas[github_checks]

pipx:

pipx install camas

uv:

uv tool install camas

Nix:

nix run github:JPHutchins/camas                     # default
nix run github:JPHutchins/camas#with-github-checks  # adds httpx for the GitHubChecks effect
nix run github:JPHutchins/camas#with-check          # adds ty for `camas --check`
nix run github:JPHutchins/camas#all                 # both extras

Then scaffold a starter tasks.py in your project root:

camas --init

The starter demonstrates leaf tasks, Sequential/Parallel composition, a matrix, a Config default task, and the optional PEP 723 standalone block — cross-platform placeholder commands ready to be swapped for your real ones.

--init also creates a gitignored .camas/ directory beside tasks.py. Camas writes run logs and a per-leaf timing cache there, so camas --list can annotate tasks with an estimated duration; delete the directory to opt out. Rename or relocate it with Config(camas_dir=...).

Why camas?

camas is not a build system. camas is for the specific job of running structured trees of shell commands.

Python task runners† just Task Mage camas
Project scope Python projects only Any Any Go projects only Any
Definition language pyproject.toml TOML or @task decorator justfile DSL YAML Go Python (typed AST)
Inline anonymous parallel groups No No No (must be a named task) No Yes
Parallel execution poe yes; Invoke / taskipy no [parallel] attr deps: (parallel) mg.Deps(...) Parallel(...)
Matrix expansion No No for: + parallel:true Go loops matrix=
CLI matrix override (e.g. --PY 3.13) No No No No Yes
Live tree output No No prefixed / group modes No Termtree (default)
Pluggable output renderers No No 3 built-ins No --effects
Type checking on task definitions Partial No Editor schema Yes (Go) mypy / pyright
First release / status 2013–2020, stable 2016, stable 2017, stable 2017, stable 2026, alpha
Ecosystem Moderate (Python) Large Large Moderate None yet

poethepoet, Invoke, taskipy — pyproject.toml-bound runners that assume a Python project.

If you need... Reach for
Reproducible, hermetic builds Nix
Incremental file-based builds (skip when inputs unchanged) Task
Simple project command menu just
Parameterized tasks (--env=staging, prompts, vars) Task
Go project, build logic in Go Mage
Inline parallel/sequential trees with a live view camas
Pluggable output effects (live tree locally, summary in CI) camas
Matrix runs across versions/platforms, overridable from the CLI camas

CI integration

The renderer is swappable, not the tree. Run the same tasks.py locally with the live Termtree and in CI with Status — one flag changes the output, the pipeline definition is unchanged.

On GitHub Actions, no flag is needed. Camas detects GITHUB_ACTIONS=true and defaults --effects to (Status(output_mode="github"),) — collapsed workflow groups, ISO timestamps with millisecond precision, ANSI colors preserved.

Under an AI coding agent, no flag is needed either. Camas detects agents (the CLAUDECODE env var, or set CAMAS_AGENT=1) and defaults to the line-oriented Status renderer instead of the live Termtree, whose cursor-redraw frames bloat captured output. Prefer the camas mcp server over the CLI from an agent; a Config default_effects always overrides the detection.

- run: uv run camas check

On other CI providers (or to opt into a specific mode), spell it out:

- run: uv run camas check --effects='(Status(output_mode="errors"),)'

See the OutputMode literal and block_for doctests for the per-mode behavior. The status-modes-demo job renders one CI run per mode for visual comparison.

For per-leaf visibility in the PR Checks panel, add the GitHubChecks effect alongside Status (opt-in extra: camas[github_checks]). Each leaf task becomes its own check run, so reviewers see lint / mypy / pytest pass-or-fail individually instead of one monolithic log.

- run: |
    uv run --extra github_checks camas matrix --effects='(
      Status(output_mode="github"),
      GitHubChecks(sha="${{ github.event.pull_request.head.sha || github.sha }}"),
    )'
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

The job needs permissions: checks: write. Defaults read GITHUB_TOKEN, GITHUB_REPOSITORY, and GITHUB_SHA from the Actions env. The pull_request.head.sha override attaches checks to the PR head rather than the synthetic merge commit. See the github-checks-demo job for a working example.

When to use it. Two things it gives you:

  • SSOT between local dev and CI. Your camas matrix terminal view and the PR Checks panel show the same per-leaf shape (lint [PY=3.10], mypy [PY=3.14], …). The matrix definition lives once in tasks.py; CI doesn't re-encode it in YAML.
  • One runner instead of N. Camas-side parallel matrix on a single runner produces the same per-(cell, leaf) granularity that a GHA matrix gets across N runners — at 1/N the minutes and camas gives you efficient task parallelization pushing that runner to 100% utilization as much as possible. Worth it on paid-runner budgets.

The downside is that fork PRs get a read-only GITHUB_TOKEN from GitHub and can't write checks — usually a non-issue for Enterprise teams where contributors have push to the org repo.

When not to bother. OSS gets free runners — just GHA-matrix them in parallel for faster wall-clock time. The cost is small: you give up either SSOT (matrix definition moves into YAML) or per-leaf-UI granularity (one PR check entry per runner instead of per leaf) — pick one. What is a deal-breaker for OSS is fork PRs: external-contributor PRs return 403 from the Checks API, so per-leaf entries silently don't appear. The github-checks-demo job is marked continue-on-error so it doesn't block CI when that happens, but GitHubChecks isn't a workable OSS solution.

Machine-readable report (Ctrf)

For a CI artifact or input to an AI code review, add the Ctrf effect (opt-in extra: camas[ctrf]). It writes the run as a CTRF JSON report — each leaf a test with status, duration, output, command, and exit code. path= writes a file; the default is stdout.

uv run --extra ctrf camas check --effects='(Status(output_mode="errors"), Ctrf(path="ctrf-report.json"))'

Config

Bind a Config in tasks.py and bare camas (no arguments) runs its default_task:

from camas import Config, Sequential, Task

lint = Task("ruff check .")
test = Task("pytest")
ci = Sequential(lint, test, name="ci")

_ = Config(default_task=ci)

Now camas runs ci, camas --dry-run previews it, and the default's matrix axes stay overridable (camas --PY 3.13). With no Config (or no default_task), bare camas prints the full help — task listing, effects, hints — and exits non-zero.

github_task is the CI counterpart, falling back to default_task when unset; it runs under GITHUB_ACTIONS=true. Paired with the automatic Status effect, one bare camas does the right thing in both places:

_ = Config(
  default_task=ci,                            # bare `camas` locally
  github_task=Sequential(ci, "pytest --cov"), # bare `camas` under GitHub Actions
)

Config is discovered by type, so the binding's name never matters — _ by convention. Defining two is an error.

Because github_task reproduces CI, running it before a push catches a CI failure locally. If it is a named task, a one-line git hook guards every push:

echo 'exec camas check' > .git/hooks/pre-push && chmod +x .git/hooks/pre-push

git push --no-verify still bypasses it deliberately. An LLM agent needs no hook — camas_list reports the CI task as github_default, so it runs camas_run with that name before pushing.

Time budget (--under)

Once camas has timed a task's leaves (the .camas/ cache, surfaced by camas --list), camas --under=<duration> runs only the leaves whose estimate fits a wall-clock budget — the fast inner-loop subset, picked for you instead of by hand.

camas --under=1s            # budget the Config default task
camas --under=500ms check   # budget a named task or expression

It runs the mutating leaves first, in sequence, then the read-only rest in parallel — so formatters never race a checker over the same files. Mark a leaf that writes the workspace with mutates=True:

fix = Task("ruff check --fix .", mutates=True)
fmt = Task("ruff format .", mutates=True)
lint = Task("ruff check .")
$ camas --under=1s --dry-run
Time budget 1.00s — running 6 leaf(s) (0 unmeasured), excluded 2 over budget.
  over budget: pyright ~4.57s, coverage ~20.98s
fix → fmt → (mypy | ty | zuban | pyrefly)

Durations are 1s, 500ms, 2m, 1h, or a bare number of seconds. Only leaves measured to exceed the budget are excluded; a leaf with no recorded timing yet runs anyway (and is thereby measured) — skipping it would keep it forever untimed. The budget is per-leaf: a measured leaf runs when its own estimate fits, so the parallel group's wall-clock stays near the budget.

For agents, camas_run exposes the same budget as its under argument (omit task to budget the project default), and the response's budget field reports what was selected and excluded — a tight, time-boxed validate loop over structured MCP.

Path scoping (--paths)

camas <task> --paths <path>… scopes a run to changed paths instead of the whole tree. A leaf opts in by writing the {paths} placeholder in its command and declaring its scope with paths= — a directory prefix, or a (changed) -> paths callable:

py = Task("ruff format {paths}", mutates=True, paths="src")
web = Task("prettier --write {paths}", mutates=True, paths="web")
_ = Config(agent=Claude(fix=Sequential(py, web)))

--paths works on any task — camas check --paths src/a.py. Without it, every {paths} resolves to its full-run default (ruff format src); with it, each leaf runs only over the changed files it covers, and a leaf that covers none is dropped (--paths is repeatable, or comma-separated).

For the Claude Code plugin, you register the auto-fix node — whatever you named it — to Config.agent.fix; the FileChanged hook runs that node over the just-changed file, zero model tokens. Install the plugin (/plugin marketplace add JPHutchins/camas), run camas mcp init --hooks (which writes the hook with the launcher it resolves for your project), or wire it by hand:

// .claude/settings.json
{ "hooks": { "FileChanged": [
  { "hooks": [{ "type": "command", "command": "uvx 'camas[mcp]' mcp fix --paths ${file_path}" }] } ] } }

camas mcp fix runs the registered Config.agent.fix node (not a task named fix — that's just camas fix, your own task); with no fix registered it is a clean no-op, so the hook is harmless without it. The uvx 'camas[mcp]' launcher needs only uv on PATH (no global camas install); with camas already installed, bare camas mcp fix … works too.

Effects plugins

Define an Effect in your tasks.py and it's discovered automatically — usable by name from --effects and listed under camas --effects. See examples/effect-plugin/ for a typed Tail effect that streams per-task output as it arrives.

Versioning

The public API is published through versioned namespacescamas.v0 today, camas.v1 and beyond later. Import from a generation to pin the API shape: a name a generation exports is never removed or changed within that generation. The scheme tracks semver — v0 pairs with camas 0.x and is as loose as semver says 0.x is (the surface prefers to grow; breaking changes stay possible until 1.0, made deliberately and noted in releases). At 1.0 a generation freezes: a breaking change forces the next camas.vN, and published generations keep shipping, so a tasks.py or effect plugin pinned to one keeps working across upgrades.

The top-level camas namespace is the unversioned alias for the latest generation: from camas import Task, Sequential, Parallel, Effect, Config re-exports that generation's five headline definers and is kept 1:1 with its package surface. The rest of the public API for a generation — TaskNode, the TaskEvent stream, LeafState, Completion — lives in that generation's submodules, e.g. from camas.v0.task_event import TaskEvent. Everything under camas.core / camas.main is internal — it consumes whatever generations are installed and carries no stability promise.

To pin a minimum camas feature level, use your dependency declaration (camas>=0.x in pyproject.toml, or PEP 723 inline metadata) — the import path covers API shape; the package pin covers feature availability.

Standalone tasks.py (PEP 723)

For a non-Python project that wants a single-file task runner — no pyproject.toml, no venv to manage — give tasks.py a PEP 723 header and a run_cli(globals()) entry point, then run it with any PEP 723-aware tool:

# /// script
# requires-python = ">=3.11"
# dependencies = ["camas>=0.1.8"]
# ///
"""Build tasks for my project."""

from camas import Parallel, Task, run_cli

lint = Task("ruff check .")
test = Task("pytest")
check = Parallel(lint, test)

if __name__ == "__main__":
    run_cli(globals())
uv run tasks.py check     # uv reads the header, builds an ephemeral env, runs
uv run tasks.py --list    # every camas flag still works
pipx run tasks.py test

run_cli(globals()) introspects the module for Task / Sequential / Parallel and Effect bindings — exactly what camas does when it auto-discovers a tasks.py — so the standalone file behaves identically to a discovered one: camas <task> --help, --dry-run, matrix overrides, and --check all work and cite the file. run_cli is part of the stable surface (from camas import run_cli, or from camas.v0 import run_cli to pin the generation); it's imported lazily, so a plain from camas import Task doesn't pull it in.

The header owns version pinning (dependencies = ["camas>=0.1.8"]) and the interpreter floor (requires-python); it's inert to camas --check and to auto-discovery, which read the module the same way with or without it.

Reference

  • examples/ — full project layouts under test coverage. The canonical reference for how to structure tasks.py, use [tool.camas.tasks] in pyproject.toml, drive a matrix from .python-version, or scope a 2-axis matrix from the CLI.
  • src/camas/ — typed Python with thorough docstrings. camas --help and camas <task> --help link back here.
  • camas with no args runs the Config default task (or prints the full help when none is defined); camas <task> --help shows the expanded tree, matrix axes, and override flags.

Walkthrough

The animated tree at the top is generated from this tasks.py:

examples/tauri-app/tasks.py — Rust + TypeScript + Python in one tree
from pathlib import Path

from camas import Config, Parallel, Sequential, Task

src_tauri = Path("src-tauri")
python_sdk = Path("python-sdk")
node = Path("node_modules/.bin")

frontend = Sequential(
    f"{node}/prettier --write .",
    Parallel(
        f"{node}/eslint src/",
        f"{node}/tsc --noEmit",
        f"{node}/vitest run",
    ),
)

backend = Sequential(
    Task("cargo fmt --all", cwd=src_tauri),
    Parallel(
        Task("cargo clippy --all-targets --locked -- -D warnings", cwd=src_tauri),
        Task("cargo test --all-targets --locked", cwd=src_tauri),
    ),
)

sdk = Sequential(
    Task("uv run ruff check --fix .", cwd=python_sdk),
    Task("uv run ruff format .", cwd=python_sdk),
    Parallel(
        Task("uv run mypy .", cwd=python_sdk),
        Task("uv run pytest", cwd=python_sdk),
    ),
)

all = Parallel(frontend, backend, sdk)

fix = Parallel(
    f"{node}/prettier --write .",
    Task("cargo fmt --all", cwd=src_tauri),
    Sequential(
        Task("uv run ruff check --fix .", cwd=python_sdk),
        Task("uv run ruff format .", cwd=python_sdk),
    ),
)

build = Parallel(
    Task("npm run tauri build {FLAG}"),
    matrix={"FLAG": ("-- --debug", "")},
    help="Debug and release builds (FLAG='-- --debug' debug, FLAG='' release)",
)

_ = Config(default_task=all)
$ cd examples/tauri-app

List the tasks

$ camas --list
output
Available tasks from .../tauri-app/tasks.py:
  all       frontend | backend | sdk
  backend   cargo fmt --all, cargo clippy --all-targets --locked -- -D warnings | cargo test --all-targets --locked
  build     Debug and release builds (FLAG='-- --debug' debug, FLAG='' release)  [matrix: FLAG×2 (-- --debug..)]
  fix       node_modules/.bin/prettier --write . | cargo fmt --all | (uv run ruff check --fix ., uv run ruff format .)
  frontend  node_modules/.bin/prettier --write ., node_modules/.bin/eslint src/ | node_modules/.bin/tsc --noEmit | node_modules/.bin/vitest run
  sdk       uv run ruff check --fix ., uv run ruff format ., uv run mypy . | uv run pytest

Preview what all would run

$ camas --dry-run all
output
all ∥
┃ frontend →
┃ ├─ node_modules/.bin/prettier --write .
┃ └─ node_modules/.bin/eslint src/ | node_modules/.bin/tsc --noEmit | node_modules/.bin/vitest run
┃   ┃ node_modules/.bin/eslint src/
┃   ┃ node_modules/.bin/tsc --noEmit
┃   ┃ node_modules/.bin/vitest run
┃ backend →
┃ ├─ cargo fmt --all  (cwd: src-tauri)
┃ └─ cargo clippy --all-targets --locked -- -D warnings | cargo test --all-targets --locked
┃   ┃ cargo clippy --all-targets --locked -- -D warnings  (cwd: src-tauri)
┃   ┃ cargo test --all-targets --locked  (cwd: src-tauri)
┃ sdk →
┃ ├─ uv run ruff check --fix .  (cwd: python-sdk)
┃ ├─ uv run ruff format .  (cwd: python-sdk)
┃ └─ uv run mypy . | uv run pytest
┃   ┃ uv run mypy .  (cwd: python-sdk)
┃   ┃ uv run pytest  (cwd: python-sdk)

Tree-symbol key: ends a Parallel header, ends a Sequential. Children hang off (parallel siblings, run concurrently) or ├─ / └─ (sequential steps, short-circuit on first failure).

Discover a task's matrix axes and override flags

$ camas build --help
output
usage: camas build [-h] [--dry-run] [--effects EFFECTS] [--FLAG VAL[,VAL...]]

Debug and release builds (FLAG='-- --debug' debug, FLAG='' release)

runs the 'build' task:
build ∥
┃ npm run tauri build -- --debug [FLAG=-- --debug]: npm run tauri build -- --debug  FLAG=-- --debug
┃ npm run tauri build  [FLAG=]: npm run tauri build   FLAG=

Matrix axes (override with --AXIS VAL[,VAL...]):
  --FLAG  -- --debug,

Pin the matrix from the CLI

$ camas build --dry-run --FLAG '-- --debug'
output
build ∥
┃ npm run tauri build -- --debug [FLAG=-- --debug]: npm run tauri build -- --debug  FLAG=-- --debug

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

camas-0.1.16.tar.gz (123.9 kB view details)

Uploaded Source

Built Distributions

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

camas-0.1.16-cp314-cp314-win_amd64.whl (514.4 kB view details)

Uploaded CPython 3.14Windows x86-64

camas-0.1.16-cp314-cp314-musllinux_1_2_x86_64.whl (945.9 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

camas-0.1.16-cp314-cp314-musllinux_1_2_aarch64.whl (930.1 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

camas-0.1.16-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (951.0 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

camas-0.1.16-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (917.6 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

camas-0.1.16-cp314-cp314-macosx_11_0_arm64.whl (626.8 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

camas-0.1.16-cp313-cp313-win_amd64.whl (506.8 kB view details)

Uploaded CPython 3.13Windows x86-64

camas-0.1.16-cp313-cp313-musllinux_1_2_x86_64.whl (940.4 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

camas-0.1.16-cp313-cp313-musllinux_1_2_aarch64.whl (921.6 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

camas-0.1.16-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (946.5 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

camas-0.1.16-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (909.9 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

camas-0.1.16-cp313-cp313-macosx_11_0_arm64.whl (626.0 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

camas-0.1.16-cp312-cp312-win_amd64.whl (507.1 kB view details)

Uploaded CPython 3.12Windows x86-64

camas-0.1.16-cp312-cp312-musllinux_1_2_x86_64.whl (945.9 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

camas-0.1.16-cp312-cp312-musllinux_1_2_aarch64.whl (927.2 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

camas-0.1.16-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (951.7 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

camas-0.1.16-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (915.5 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

camas-0.1.16-cp312-cp312-macosx_11_0_arm64.whl (632.4 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

camas-0.1.16-cp311-cp311-win_amd64.whl (504.6 kB view details)

Uploaded CPython 3.11Windows x86-64

camas-0.1.16-cp311-cp311-musllinux_1_2_x86_64.whl (898.6 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

camas-0.1.16-cp311-cp311-musllinux_1_2_aarch64.whl (889.2 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

camas-0.1.16-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (906.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64manylinux: glibc 2.28+ x86-64

camas-0.1.16-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (876.6 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

camas-0.1.16-cp311-cp311-macosx_11_0_arm64.whl (624.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

Details for the file camas-0.1.16.tar.gz.

File metadata

  • Download URL: camas-0.1.16.tar.gz
  • Upload date:
  • Size: 123.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for camas-0.1.16.tar.gz
Algorithm Hash digest
SHA256 ac0e6299adee145672430c3fc5c76a4e84efff6abe490632a17e914edb31358b
MD5 550577ec6cb32ab4487b2933a515b742
BLAKE2b-256 1345498b34d3e8a286101c05a5c27ccefdbee5dcf00c1da66f37c6622dcedba4

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16.tar.gz:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: camas-0.1.16-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 514.4 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for camas-0.1.16-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 916ad1a3537067629dc528b649cfa4ee33b10829341218b16a068d17a99a1ce5
MD5 887e4446a50582ae3ab9f3553898c964
BLAKE2b-256 4c6ddd2f090cce6e634c69ac7349347d0192681df9ca53e226ad064aebd71771

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp314-cp314-win_amd64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 718e962e2be8573481a89d0b48c2485358855bfa75c3b092dc68284df9b05550
MD5 2e6a65d51e1d70fae162b9cdc16c98e1
BLAKE2b-256 f52884562c1aa60cad496c27916c556c665b7c32b399d7d37fbe5068c91ab4b3

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp314-cp314-musllinux_1_2_x86_64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp314-cp314-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7aff7c0e1b2f81c7949d9832f40c98c6a1236516b4f3e05e3abb84aded36e04c
MD5 099e7dd29c9dde6774c222ae51275fa6
BLAKE2b-256 4505e22c6d4d94570f25dfccd738a67b6e6f322fc0388041f51f2dc019904eb3

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp314-cp314-musllinux_1_2_aarch64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 dacb967410fb0cbc19d683aebd70478f09b6767a78306c165b039d38c43b8dd6
MD5 56b366be9a4301065d6babbaf9a318af
BLAKE2b-256 12ac1660dc335527b6c8fb3bfb924f049411d67280cdc73921379b1d64d205d6

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 c1c91a0052ad7e055adeb056fac61fc58b141787142f5a61fbbeb7d2cdcd4562
MD5 00f2831b88fc3e009d9a5bf0a5c826b1
BLAKE2b-256 d4edd719aaa98523b0c2eef16326fdadfa049e4b71e75eba660b259575a217f0

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8e6bf6c4f64a6707c0fbf407e321c07fedab49f835564e90223fc5f1843150c8
MD5 e70e510c5a6c1003c25ded69ab0a45b5
BLAKE2b-256 6147711b9533280037b92136cf3131a8e4123808cc8ca4061591009316d7634b

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: camas-0.1.16-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 506.8 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for camas-0.1.16-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 e12c72634e330802124d5b61a0a23cd1342806fa4b62ea2a17ec2ef0aff0bf91
MD5 ce16beb189ed1c6d6aaec7ff61f47876
BLAKE2b-256 4717c63b71713ce23566aaecae6dbdd56ff7063bff5322e28505cedf39532d21

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp313-cp313-win_amd64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4a1cd7a598c5a65d3d263a13f79f4117a8d176c01b4d041f1c0754074835687b
MD5 4e9f35ec34449835449f4bd6ba078c06
BLAKE2b-256 756d4e6cf4e6c1f5f54b419dfd90d99e46c9f7ae303e8ac42341ccbcccfe5a53

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp313-cp313-musllinux_1_2_x86_64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 948308cfea9163fe9de44631e046dcb0c46d12c67e3bac62c509fec8f117bfb1
MD5 0a8b94362d6024d1793a109933952971
BLAKE2b-256 deee8b961ec91a42fc287120ce92de9b8542deb8eaf45d4edbee81f6eb3ce319

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp313-cp313-musllinux_1_2_aarch64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 624f7b31bd9dfd6a1fe5b0933960cc07e478f4c909efae6307aa4aa131606108
MD5 568f8bddd316473a3ea23d02818d5a68
BLAKE2b-256 fe18c8c8e488346d45fcf53387543f7181f016cd64305fba25345f1d0628dbdd

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f819bdc74f9dbb42e5156e27b2a34a2b636db4741151602db73f045da2c2303c
MD5 ed82f5562d70cefa4c761c08ce87a15c
BLAKE2b-256 9f57d16fa29833b9135900faaf37f3f0efcc90f08fa6556d2ea4205ec347e387

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fd1648133e8aa484e8fa6273583bfa164d5fcf24c92b1744f1dd9a13d9c28b41
MD5 cd93c957d66cf8ef9f1b5773bc674938
BLAKE2b-256 8ef6c3ba3e068d56898c5853d59db0fabaa0a4d1a00337a433dfddc39522380c

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: camas-0.1.16-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 507.1 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for camas-0.1.16-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 182c6f751458f6d06ddbabed80715cf9a78c6adac54392381eaf2433a2b63055
MD5 e9a76a234dcdb5adf4dbffad2274c369
BLAKE2b-256 67c45b1e4257cbed1cb4111bbc5921d97fdc5968aa1020df5c19238f71943bcb

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp312-cp312-win_amd64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c950dca0dbef082e35fc343e83c520bf2f0511d732c51b57f09f91e537a941a4
MD5 0055ab19a00c875bd028e5f51b2230b9
BLAKE2b-256 1748ea41329fde1e46472638c39d029964ea2179e2a52fd20d42782f2a97f0bb

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 afc68b4064570f10accf3d17f736e9116233d157ae3e4726fbdab4067a94a030
MD5 29bc2d7a05de3653033656f58f105415
BLAKE2b-256 b02e5f87f8070dbf6a7ff98ce6f10017ce54130d8ab2beb4879a7ca50904b030

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp312-cp312-musllinux_1_2_aarch64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 899d5fcd33188bd951de03ec1f83f60e56541a1668133243fe624feb467b4d91
MD5 87389914112a57af574c5b9f33942da6
BLAKE2b-256 088da17107aa7da53b36042f6ded23d69bb65c36f07d04e35b8d4e62b1a00b56

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 69ba4ea56b3649970e95ca1688bdd1b6b41703e04f80d9a96dedd6b124ac0108
MD5 8bb49950581ee235d793c6b2ef2a6ff2
BLAKE2b-256 bf4a7f8348c9db807601ab60f83e4a7db58d8bbc016bec8f53054a118879a0cf

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e67e3ca6ca9f8f8c50b403cfab2218553d8065d88404f1056f523063be2413c4
MD5 c000841ccfddb3a20a343d0e602d6d85
BLAKE2b-256 5f331a9854d16e2e2dbc9b8f3688c8caaa198a518a225e146e44c47c11815b9b

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: camas-0.1.16-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 504.6 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for camas-0.1.16-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 ea7981baf64417e7b0de691f207d645af259b4df958d55c19cd18a49d5752428
MD5 d8d2f26dc27c1006c305b58eda08c658
BLAKE2b-256 2790207e5e7f594085ca8d8961e08d2524088bf53b2dc0e191a5742bcef88a8f

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp311-cp311-win_amd64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 07162e4ba7ffc20f70a15af434ce730d3cb3fe9062864297b16f118c723c7000
MD5 85b51a84abe8aa72a43a2b321466b050
BLAKE2b-256 d0c7175a2dd8b4a7322f0657f41d6eeb6d089f0c2951a163770a90f490c9d093

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp311-cp311-musllinux_1_2_x86_64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 8553509ba934233a14877432ba6842156d475609071a2a77eafcf0d97159b359
MD5 aef2f9ab841ad03d77a8dab0a8d26548
BLAKE2b-256 a09a265ea6b17f388b053084c8297ded05e8b8ec90519739d38988e0d24e3d2c

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp311-cp311-musllinux_1_2_aarch64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 5e0642cafb988780d39a058795675c26d265633f7673e6300a0197b6edbd7710
MD5 6c0c47c2be29cba65612ae28e7b4d80d
BLAKE2b-256 3fb4ffec3e267bb2a45128bdc1a78eba2499df947c0ab0261b39341970112a4e

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 89d723df4701a8bb78045ec137b973cfdacc23f277be91c6d1f8886db307ac40
MD5 855bc3033eba5617d90a9ba2e4346a40
BLAKE2b-256 e4f99d06485d35c57c2738c248cc3cc03f56314fec664a388845b3372fdd9b56

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl:

Publisher: ci.yaml on JPHutchins/camas

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

File details

Details for the file camas-0.1.16-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for camas-0.1.16-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a24f52543e0a25a6beb3d1c2f62de4af038459c6b9f2d6e8bada5ec3e4c584f0
MD5 873e2734c2781d8548ab583efb154f05
BLAKE2b-256 64a7fb461a02a48f70360f204e7861a0c50c273f64059f7824b421f78444bea7

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.16-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: ci.yaml on JPHutchins/camas

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