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 command opts in by writing the {paths} placeholder and declaring its scope with paths= — a directory prefix, or a (changed) -> paths callable. A Sequential/Parallel may carry paths= too: it's the default scope for descendant {paths} commands that set none (the same way env/cwd propagate into a group's leaves):

py = Task("ruff format {paths}", mutates=True, paths="src")
web = Task("prettier --write {paths}", mutates=True, paths="web")
# the group's paths="." is the default for both children (neither sets its own):
autofix = Parallel(Task("ruff format {paths}"), Task("ruff check --fix {paths}"), paths=".")
_ = Config(agent=Claude(fix=Sequential(py, web, autofix)))

--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 {paths} command runs only over the changed files it covers, and one covering none is dropped. A command without {paths} can't be narrowed, so its paths= is a no-op and it always runs — camas errs on correctness (a tool it can't narrow might be affected by the edit). --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 PostToolBatch hook runs that node over the just-changed files, 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": { "PostToolBatch": [
  { "hooks": [{ "type": "command", "command": "uvx 'camas[mcp]' mcp fix" }] } ] } }

camas mcp fix runs the registered Config.agent.fix node (not a task named fix — that's just camas fix, your own task); it reads the changed files from the PostToolBatch event on stdin (--paths still works for a manual run). 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.18.tar.gz (126.2 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.18-cp314-cp314-win_amd64.whl (516.8 kB view details)

Uploaded CPython 3.14Windows x86-64

camas-0.1.18-cp314-cp314-musllinux_1_2_x86_64.whl (947.8 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

camas-0.1.18-cp314-cp314-musllinux_1_2_aarch64.whl (931.8 kB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

camas-0.1.18-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (953.0 kB view details)

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

camas-0.1.18-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (919.5 kB view details)

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

camas-0.1.18-cp314-cp314-macosx_11_0_arm64.whl (633.3 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

camas-0.1.18-cp313-cp313-win_amd64.whl (509.0 kB view details)

Uploaded CPython 3.13Windows x86-64

camas-0.1.18-cp313-cp313-musllinux_1_2_x86_64.whl (941.9 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

camas-0.1.18-cp313-cp313-musllinux_1_2_aarch64.whl (922.9 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

camas-0.1.18-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (947.9 kB view details)

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

camas-0.1.18-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (911.2 kB view details)

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

camas-0.1.18-cp313-cp313-macosx_11_0_arm64.whl (627.5 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

camas-0.1.18-cp312-cp312-win_amd64.whl (509.4 kB view details)

Uploaded CPython 3.12Windows x86-64

camas-0.1.18-cp312-cp312-musllinux_1_2_x86_64.whl (947.6 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

camas-0.1.18-cp312-cp312-musllinux_1_2_aarch64.whl (929.0 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

camas-0.1.18-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (953.5 kB view details)

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

camas-0.1.18-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (917.3 kB view details)

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

camas-0.1.18-cp312-cp312-macosx_11_0_arm64.whl (634.0 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

camas-0.1.18-cp311-cp311-win_amd64.whl (506.8 kB view details)

Uploaded CPython 3.11Windows x86-64

camas-0.1.18-cp311-cp311-musllinux_1_2_x86_64.whl (900.8 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

camas-0.1.18-cp311-cp311-musllinux_1_2_aarch64.whl (891.3 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

camas-0.1.18-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl (908.8 kB view details)

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

camas-0.1.18-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (878.6 kB view details)

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

camas-0.1.18-cp311-cp311-macosx_11_0_arm64.whl (629.6 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

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

File metadata

  • Download URL: camas-0.1.18.tar.gz
  • Upload date:
  • Size: 126.2 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.18.tar.gz
Algorithm Hash digest
SHA256 28033ba827dce0c00faf0d7e2a75243004767ddde70cc54d4431460a9659cdb6
MD5 6d085ec3abd3ecccf84404bbeb90a855
BLAKE2b-256 5b947fd8aa2a29197a847d4d92b8caf83d3f9cdea818e1fb86d4248ee294accf

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18.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.18-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: camas-0.1.18-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 516.8 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.18-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 5b1bea9efdd9753f086b365a999b3010928917826cbd7d206231224bdca7f478
MD5 71bc8829b40609148ecc737781ec7397
BLAKE2b-256 4cd39b05dc389e434295e42ceba3db5d33b0bdad560ab95b49cc3ea5cf21f43f

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.18-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 94a9a3d411ff0c9e27ce49656dc5ef8a0dd9cd77e2bcaba10f3a711242f1401a
MD5 98373d7cf7ff24bf5574d4802e9fc84d
BLAKE2b-256 f726a36865701cb36aa8bd357100bcf86379a83ca208ae4884bd0016b3fb3592

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp314-cp314-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.18-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 21d5833b0a9a6e560242877441558fbd495d12bc004fca63cfc93ff90099dc69
MD5 a1a071885fe1ed3a85eaabbcb086dc5a
BLAKE2b-256 33eeb1f05b384b05224232707e10747f1b4dc33a22a117ba71f502284136904f

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-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.18-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 032a3c20a77d35f16b2cbca5f6830afe31d0b4bba6fdb4b642f9887d2be99561
MD5 5c9f4eede92e64c1ea3a430bd508cd28
BLAKE2b-256 bc24dd70e877791f45aaa01d0bcad893e8bb683e441c516445042a7320c355e0

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.18-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ccb109e82aa4ae2626d901b29bf9fefd2c2a9e31e09697552e07c9288edb01f3
MD5 25754b16e94e15c22f6c916e1bf36e92
BLAKE2b-256 b029b98b65e94e0f0b40212232e1416b403e5f388d6109c47d8f5d09846bf170

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for camas-0.1.18-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 61f386daa0cb0a1ba9d78670d2f49e7551cb487702aabafcf471a021e0acfc31
MD5 bbb8d668e1ffbf84ef8c2a18b4de253d
BLAKE2b-256 33393a7abfc540fb3f222be3897f6bb96396cbac488792d3738b51698dbef82c

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: camas-0.1.18-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 509.0 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.18-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 7b5f06779ff8a93c5741c0de32146852ec46d2e48e46f5788bf4bfdb88ab1b99
MD5 985c9f46d23a706d138118d9906b181c
BLAKE2b-256 c556db9cf204ee5f44b227732ce52ba03016d6b2e51b41f7c1ff531764b08ac8

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.18-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 e4f9b5470c5e4da601156098a165b5d1523b32ffffcd5affe2fe53433ad2a518
MD5 1285221cd53946ea15ba95d6a4c3cc6b
BLAKE2b-256 25ef24842dbc642754fa9c80f6521392ad74d36cf88a23bc211aaeba24660ba5

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.18-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 8d260f67efcd2a6225387c21028778aa95e0a316bbace96363053ea10bb8d34e
MD5 74914ccb6a2e86eb297dc95c9996bea3
BLAKE2b-256 06ce1e854ef1a748eb91135a3c2c714139284113022eb57db9fd48ade09888fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-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.18-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 15a442349732f741246dd1f4ecd554bb567883a811446c823f446770f0f5c2d4
MD5 cb412603bd3918b6f1d7919e3d4fcc3e
BLAKE2b-256 3e9b1d4abd9f43fa6d41cca1fc79157322d09fa913f0dd4dcd67067b4ce22591

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.18-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 60fcb75cfe2790c042f6dee0789a39caa4eb323fe0d2c2aa19b4e06183072fff
MD5 59efaaeaf7552308739d3247410262d8
BLAKE2b-256 3c6886b52f43edc68cd83d85ac52496f096fc17ece446c531ece1452cd877d65

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for camas-0.1.18-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b41fad3b01f91081439814f42334ff5db869d89f354682e6cd06877dfaac5dc2
MD5 4b2bfad51c258e382c4fae8ea943d451
BLAKE2b-256 55c858fab0415de3ba735598d69f12ebb56447326cae2e5bd0de656966f23d80

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: camas-0.1.18-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 509.4 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.18-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 32fc7d301de5275a6c64cf17f8bfd05e193cb3cac2a4c28a7cb07141819c1ac1
MD5 334f7e08d30b844f00d2312d9eb8f5ad
BLAKE2b-256 2ab88c3e88bfd19e57d1adc62fcaafd81e09a76449c724467916ff838f68447f

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.18-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 19f135bec6e6ac717fc4c47865d1bf7fe3875069f643556eda44bb067b744196
MD5 83dc99e99509140bbbcd8405f3547730
BLAKE2b-256 7150ee57a7673f62cb9f6ce1b538bb49c56fd044208e33ea3106f7e204a7f357

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.18-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 11b9fb119f7ed0daf48de3ffdfcc61efb277e096824e60c7371a3b5c6749a189
MD5 16dc480b72e792a33cc55961769b9bb9
BLAKE2b-256 0ae05ba66a6e07154e8192ad023907cc336f6030b90b6de07b323b444c7f83ad

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-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.18-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 35d74348120c47ffb8bdb8d7657c1d52d08dde5b4aa113a4f0dd7f4374d55439
MD5 62d7a8b99b8128e3c3a9a3a793a73748
BLAKE2b-256 be14c271ccadb968868ce1f8b98f13a9765e326ee5052a07059deb3ba7c1cc1e

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.18-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0a4852674e293004fb1e53999bf5e8908e4c4e7e68d89ae78bd82dfaf94c44f8
MD5 52748355f989d9ff51dbf524c88b338d
BLAKE2b-256 deab31057d31986e06fdf4eae2b402df012281ca597cb00bc8a711ce02694d08

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for camas-0.1.18-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c3cc3598f13e55125467cbe75f27045435887d939e91af486e8fd7e076a00633
MD5 e04b381b60fd94b80bf4b1cfdaafa076
BLAKE2b-256 d578c017d2b24e0318a235442dac8bcf20a88e0a83a1c965b5a3e85a0d26b42e

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: camas-0.1.18-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 506.8 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.18-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 c9a12192bfa2c9819c1aee89c4ffaa6cce51a813eb9199748376e8127c323e72
MD5 2b2c98c03a973304d77aee01da99e6b4
BLAKE2b-256 7425a95b691625c4cfac1e436f28c728067e31f0ddea9ee57b55476383d3ba2b

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for camas-0.1.18-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 cb58c5c029a0660e9421f66be42758c944ebc7d8ad05e0820a5cf59ebd15aaca
MD5 207b5970eb510758832e03e2ecd5dbbd
BLAKE2b-256 307175ec510fa803f8d79c42de06013a6f32bedc8f56638b49ac2fc738130460

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.18-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 0a43253f602d838da226c2ef62a7c504fc5cb17421e79d02b902d32c5bab7b7f
MD5 f6cd2bdc17a3a448213bbe255fc33987
BLAKE2b-256 e00408d4fc9a0e64173d55c469daa2762fd20955d0f0852e4f46fe50ce2423d2

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-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.18-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e5c486a1da5d2bbb20f88e09b6484044b812376a336026877a5eb0c67e91f8c2
MD5 ade0a1ca5fcf896eb53cb23f86431f9a
BLAKE2b-256 e43d6c68c9d5c04fe0608bc149b7370922c240158ac98b6d1c14e5f0355a9602

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for camas-0.1.18-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 dbdd3055c8486afd43ed3b3755534d1cb74e184dac06953ed788a4948fc8c200
MD5 5943c7c2d3dd80e876628ca2af33fc44
BLAKE2b-256 b514ac38242d4b15ca2cc2811f5e45a9606851e50defc2bece06fc8172ab79f5

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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.18-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for camas-0.1.18-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3b5768260003daac9f5bb5373ceef706e4336ff3a66f7f3a9c595d633e80e80b
MD5 524d61d464fbb8aaae7f4c59851d6778
BLAKE2b-256 86ce1bc14a1f8f4a98a322ac0428fc1898b27fd93d22c54cdfa80ee0aa90d395

See more details on using hashes here.

Provenance

The following attestation bundles were made for camas-0.1.18-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