diff --git a/.agents/skills/ptf-generate/references/generation-checklist.md b/.agents/skills/ptf-generate/references/generation-checklist.md index cc108d7..b0fb39a 100644 --- a/.agents/skills/ptf-generate/references/generation-checklist.md +++ b/.agents/skills/ptf-generate/references/generation-checklist.md @@ -19,15 +19,15 @@ Run the relevant project gates after `cargo run --manifest-path codegen/Cargo.toml -- generate`: ```sh -just codegen::format -just codegen::lint -just codegen::test -just rust::format -just rust::lint -just rust::test -just python::test -just python::lint -just python::format +mise run codegen:format +mise run codegen:lint +mise run codegen:test +mise run rust:format +mise run rust:lint +mise run rust:test +mise run python:format +mise run python:lint +mise run python:test ``` Run `cargo run --manifest-path codegen/Cargo.toml -- generate` a second time and diff --git a/.github/scripts/check-version.py b/.github/scripts/check-version.py index 4d322a7..59dcdcd 100644 --- a/.github/scripts/check-version.py +++ b/.github/scripts/check-version.py @@ -1,31 +1,31 @@ import re import runpy import sys +import tomllib from pathlib import Path -import tomllib -expected = sys.argv[1].removeprefix("v") +expected = sys.argv[1].removeprefix('v') -with Path("targets/ptfkit-rs/Cargo.toml").open("rb") as file: - rust = tomllib.load(file)["package"]["version"] +with Path('targets/ptfkit-rs/Cargo.toml').open('rb') as file: + rust = tomllib.load(file)['package']['version'] -python = runpy.run_path("targets/ptfkit-py/src/ptfkit/_version.py")["__version__"] +python = runpy.run_path('targets/ptfkit-py/src/ptfkit/_version.py')['__version__'] -native_source = Path("targets/ptfkit-native/cmake/ptfkitVersion.cmake").read_text() +native_source = Path('targets/ptfkit-native/cmake/ptfkitVersion.cmake').read_text() match = re.fullmatch( - r"# @generated by ptfkit-codegen; do not edit\.\n" + r'# @generated by ptfkit-codegen; do not edit\.\n' r'set\(PTFKIT_VERSION "([^"]+)"\)\n?', native_source, ) if match is None: - raise SystemExit("failed to read native version") + message = 'failed to read native version' + raise SystemExit(message) native = match.group(1) -versions = {"rust": rust, "python": python, "native": native} -mismatches = { - name: version for name, version in versions.items() if version != expected -} +versions = {'rust': rust, 'python': python, 'native': native} +mismatches = {name: version for name, version in versions.items() if version != expected} if mismatches: - details = ", ".join(f"{name}={version}" for name, version in mismatches.items()) - raise SystemExit(f"version mismatch for tag {expected}: {details}") + details = ', '.join(f'{name}={version}' for name, version in mismatches.items()) + message = f'version mismatch for tag {expected}: {details}' + raise SystemExit(message) diff --git a/.github/scripts/ruff.toml b/.github/scripts/ruff.toml new file mode 100644 index 0000000..4182d88 --- /dev/null +++ b/.github/scripts/ruff.toml @@ -0,0 +1,4 @@ +extend = "../../ruff.toml" + +[lint] +ignore = ["INP001"] diff --git a/.github/workflows/pr.yaml b/.github/workflows/ci.yaml similarity index 81% rename from .github/workflows/pr.yaml rename to .github/workflows/ci.yaml index aa9a8b8..557f4f1 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/ci.yaml @@ -1,4 +1,4 @@ -name: PR Checks +name: CI on: push: @@ -18,7 +18,7 @@ jobs: - name: Checkout uses: actions/checkout@v7 - - name: Install uv + - name: Set up uv uses: astral-sh/setup-uv@v10.0.1 with: enable-cache: true @@ -34,16 +34,13 @@ jobs: - name: Checkout uses: actions/checkout@v7 - - name: Set up Rust - uses: dtolnay/rust-toolchain@stable + - name: Set up uv cache + uses: astral-sh/setup-uv@v10.0.1 with: - components: clippy, rustfmt + enable-cache: true - - name: Install clang-format - uses: awalsh128/cache-apt-pkgs-action@v1 - with: - packages: clang-format - version: 1.0 + - name: Set up development toolchains + uses: jdx/mise-action@v4 - name: Cache Rust dependencies and codegen artifacts uses: Swatinem/rust-cache@v2 @@ -54,16 +51,6 @@ jobs: - name: Set up Rust problem matchers uses: r7kamura/rust-problem-matchers@v1 - - name: Set up Python - uses: actions/setup-python@v7 - with: - python-version-file: targets/ptfkit-py/pyproject.toml - - - name: Install uv - uses: astral-sh/setup-uv@v10.0.1 - with: - enable-cache: true - - name: Check ptfkit-py uv.lock run: uv lock --project targets/ptfkit-py --check @@ -88,21 +75,26 @@ jobs: continue-on-error: true run: cargo test --manifest-path codegen/Cargo.toml - - name: Check ptfkit-py lint + - name: Check Python target and GitHub script lint id: ptfkit-py-lint continue-on-error: true - run: uv run --directory targets/ptfkit-py --no-sync ruff check --output-format=github + run: ruff check targets/ptfkit-py .github/scripts --output-format=github - - name: Check ptfkit-py formatting + - name: Check Python target and GitHub script formatting id: ptfkit-py-format continue-on-error: true - run: uv run --directory targets/ptfkit-py --no-sync ruff format --check --output-format=github + run: ruff format targets/ptfkit-py .github/scripts --check --output-format=github - name: Check ptfkit-py types id: ptfkit-py-typescheck continue-on-error: true run: uv run --directory targets/ptfkit-py --no-sync ty check --output-format=github + - name: Check GitHub script types + id: github-script-typescheck + continue-on-error: true + run: ty check .github/scripts --output-format=github + - name: Check ptfkit-rs formatting id: ptfkit-rs-format continue-on-error: true @@ -133,6 +125,7 @@ jobs: steps.ptfkit-py-lint.outcome == 'failure' || steps.ptfkit-py-format.outcome == 'failure' || steps.ptfkit-py-typescheck.outcome == 'failure' || + steps.github-script-typescheck.outcome == 'failure' || steps.ptfkit-rs-format.outcome == 'failure' || steps.c-family-format.outcome == 'failure' || steps.ptfkit-rs-lint.outcome == 'failure' || @@ -150,16 +143,16 @@ jobs: - name: Checkout uses: actions/checkout@v7 + - name: Set up uv + uses: astral-sh/setup-uv@v10.0.1 + with: + enable-cache: true + - uses: actions/setup-python@v7 with: python-version: ${{ matrix.python-version }} allow-prereleases: true - - name: Install uv - uses: astral-sh/setup-uv@v10.0.1 - with: - enable-cache: true - - name: Run pytest run: uv run --directory targets/ptfkit-py pytest --no-cov @@ -174,10 +167,13 @@ jobs: - name: Checkout uses: actions/checkout@v7 + - name: Set up development toolchains + uses: jdx/mise-action@v4 + - name: Configure ptfkit-native run: > cmake -S targets/ptfkit-native -B targets/ptfkit-native/build - -DBUILD_TESTING=ON -DPTFKIT_BUILD_CPP_MODULES=ON + -GNinja -DBUILD_TESTING=ON -DPTFKIT_BUILD_CPP_MODULES=ON - name: Build ptfkit-native run: cmake --build targets/ptfkit-native/build @@ -192,13 +188,13 @@ jobs: - name: Checkout uses: actions/checkout@v7 - - name: Install uv + - name: Set up development toolchains + uses: jdx/mise-action@v4 + + - name: Set up uv cache uses: astral-sh/setup-uv@v10.0.1 with: enable-cache: true - cache-dependency-glob: | - docs/pyproject.toml - docs/uv.lock - name: Check documentation lock run: uv lock --project docs --check @@ -206,11 +202,20 @@ jobs: - name: Sync documentation environment run: uv sync --project docs --frozen + - name: Check documentation lint + run: ruff check docs --output-format=github + + - name: Check documentation formatting + run: ruff format docs --check --output-format=github + + - name: Check documentation types + run: uv run --directory docs --no-sync ty check --output-format=github + - name: Build documentation run: uv --directory=docs run mkdocs build --strict --config-file mkdocs.yml summary: - name: PR Checks Summary + name: CI Summary runs-on: ubuntu-latest if: always() needs: [code-quality, docs, native, pytest] diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index caad5bb..2251028 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -16,7 +16,7 @@ repos: language: system entry: cargo args: [run, --manifest-path, codegen/Cargo.toml, generate] - files: '^(codegen/|specs/|targets/ptfkit-(rs|py)/src/)' + files: '^(codegen/|specs/|targets/)' pass_filenames: false - id: rustfmt-codegen name: rustfmt codegen @@ -37,36 +37,62 @@ repos: language: system entry: clang-format args: [--style=file, -i] - files: '\\.(c|h|cc|cpp|cppm|cxx|hpp)$' - - id: uv-lock - name: uv lock + files: '\.(c|h|cc|cpp|cppm|cxx|hpp)$' + - id: uv-lock-ptfkit-py + name: uv lock ptfkit-py language: system entry: uv args: [--project, targets/ptfkit-py, lock, --check] - files: .*(uv\.lock|pyproject\.toml|uv\.toml)$ + files: '^targets/ptfkit-py/(uv\.lock|pyproject\.toml|uv\.toml)$' pass_filenames: false - - id: uv-sync - name: uv sync + - id: uv-sync-ptfkit-py + name: uv sync ptfkit-py language: system entry: uv - args: [--project, targets/ptfkit-py, sync, --frozen, --all-groups, --all-extras, --all-packages] + args: [--project, targets/ptfkit-py, sync, --frozen] + always_run: true + pass_filenames: false + - id: uv-lock-docs + name: uv lock docs + language: system + entry: uv + args: [--project, docs, lock, --check] + files: '^docs/(uv\.lock|pyproject\.toml|uv\.toml)$' + pass_filenames: false + - id: uv-sync-docs + name: uv sync docs + language: system + entry: uv + args: [--project, docs, sync, --frozen] always_run: true pass_filenames: false - id: ruff-check name: ruff check language: system - entry: uv - args: [--project, targets/ptfkit-py, run, --no-sync, ruff, check, --fix] + entry: ruff + args: [check, --fix] types: [file, python] - id: ruff-format name: ruff format language: system - entry: uv - args: [--project, targets/ptfkit-py, run, --no-sync, ruff, format] + entry: ruff + args: [format] types: [file, python] - - id: ty-check - name: ty check + - id: ty-check-python + name: ty check ptfkit-py language: system - entry: uv - args: [--project, targets/ptfkit-py, run, --no-sync, ty, check] + entry: ty + args: [check, --project, targets/ptfkit-py] files: '^targets/ptfkit-py/.*\.py$' + - id: ty-check-docs + name: ty check documentation + language: system + entry: uv + args: [--project, docs, run, --no-sync, ty, check] + files: '^docs/.*\.py$' + - id: ty-check-github + name: ty check GitHub scripts + language: system + entry: ty + args: [check] + files: '^\.github/scripts/.*\.py$' diff --git a/Justfile b/Justfile deleted file mode 100644 index ef23761..0000000 --- a/Justfile +++ /dev/null @@ -1,43 +0,0 @@ -set default-list := true - -[windows] -set shell := ["powershell.exe", "-NoLogo", "-Command"] - -mod codegen -mod native 'targets/ptfkit-native' -mod python 'targets/ptfkit-py' -mod rust 'targets/ptfkit-rs' - -# Validate all PTF specifications without generating targets. -[working-directory: 'codegen'] -@validate: - cargo run validate - -# Generate target sources from validated PTF specifications. -[working-directory: 'codegen'] -@generate: - cargo run generate - -# Regenerate all codegen-owned files and fail if any output drifts. -[working-directory: 'codegen'] -@check-generated: - cargo run check-generated - -# Set the package version and refresh dependent lockfiles. -@version value: - cargo run --manifest-path codegen/Cargo.toml -- version {{quote(value)}} - cargo check --manifest-path targets/ptfkit-rs/Cargo.toml --quiet - uv lock --project targets/ptfkit-py - -# Run the complete test suite for all project components. -[parallel] -test: codegen::test native::test python::test rust::test - -# Run the component verification suites in parallel. -[parallel] -verify: codegen::verify native::verify python::verify rust::verify - -# Build the documentation site or serve it locally with strict validation. -[arg('command', pattern='build|serve')] -@docs command: - uv --directory=docs run mkdocs {{command}} --strict diff --git a/README.md b/README.md index a45814f..4a79763 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ptfkit -[![CI](https://img.shields.io/github/actions/workflow/status/AgroDT/ptfkit/pr.yaml?branch=main)](https://github.com/AgroDT/ptfkit/actions/workflows/pr.yaml) +[![CI](https://img.shields.io/github/actions/workflow/status/AgroDT/ptfkit/ci.yaml?branch=main)](https://github.com/AgroDT/ptfkit/actions/workflows/ci.yaml) [![Documentation](https://img.shields.io/github/actions/workflow/status/AgroDT/ptfkit/deploy-docs.yaml?label=docs)](https://agrodt.github.io/ptfkit/) [![PyPI version](https://img.shields.io/pypi/v/ptfkit)](https://pypi.org/project/ptfkit/) [![crates.io version](https://img.shields.io/crates/v/ptfkit)](https://crates.io/crates/ptfkit) diff --git a/codegen/justfile b/codegen/justfile deleted file mode 100644 index 2183562..0000000 --- a/codegen/justfile +++ /dev/null @@ -1,19 +0,0 @@ -set default-list := true - -[windows] -set shell := ["powershell.exe", "-NoLogo", "-Command"] - -# Run Clippy with warnings treated as errors. -lint: - cargo clippy --all-targets -- -D warnings - -# Check Rust source formatting. -format: - cargo fmt --all --check - -# Run code generator unit and integration tests. -test: - cargo test - -# Run all code generator quality checks. -verify: format lint test diff --git a/codegen/src/output/write.rs b/codegen/src/output/write.rs index e862c7b..cc15cd4 100644 --- a/codegen/src/output/write.rs +++ b/codegen/src/output/write.rs @@ -251,8 +251,8 @@ pub(super) fn format_rust(paths: &[PathBuf]) -> Result<()> { pub(super) fn format_python(root: &Path, paths: &[PathBuf]) -> Result<()> { run( - "uv", - &["run", "--no-sync", "ruff", "format"], + "ruff", + &["format"], paths, Some(&root.join("targets/ptfkit-py")), ) diff --git a/codegen/tasks.toml b/codegen/tasks.toml new file mode 100644 index 0000000..8a0d533 --- /dev/null +++ b/codegen/tasks.toml @@ -0,0 +1,18 @@ +["codegen:lint"] +description = "Run Clippy for the code generator" +dir = "codegen" +run = "cargo clippy --all-targets -- -D warnings" + +["codegen:format"] +description = "Check code generator Rust formatting" +dir = "codegen" +run = "cargo fmt --all --check" + +["codegen:test"] +description = "Run code generator tests" +dir = "codegen" +run = "cargo test" + +["codegen:verify"] +description = "Run all code generator quality checks" +depends = ["codegen:format", "codegen:lint", "codegen:test"] diff --git a/docs/src/contributing/development.md b/docs/src/contributing/development.md index dc04efa..ef4bec0 100644 --- a/docs/src/contributing/development.md +++ b/docs/src/contributing/development.md @@ -24,11 +24,25 @@ the [PTF source specification guide](../ptf-catalog/index.md). ## Toolchains and dependencies -Install Rust using your preferred method or via [rustup](https://rustup.rs/), -and install [`uv`](https://docs.astral.sh/uv/getting-started/installation/). -We also recommend to install [`just`](https://just.systems/) for running -repository commands. The native target also requires CMake and a -C11/C++20 compiler. +Install [Mise](https://mise.jdx.dev/getting-started/) and activate it in your +shell. `mise.toml` is the source of truth for the pinned Rust, uv, CMake, +Ninja, Clang, Ruff, ty, and prek toolchains; `mise.lock` records their resolved +downloads and checksums. The native target requires the C11/C++20 compiler +provided by Clang. + +From the repository root, trust the repository configuration and install the +pinned toolchains: + +```sh +mise trust +mise install +``` + +Install the Git hook shim once the `prek` toolchain is available: + +```sh +prek install +``` Use `cargo` to manage dependencies for the codegen and Rust target, and use `uv` to manage the Python environment. Add, update, or remove dependencies through @@ -38,20 +52,34 @@ these tools instead of manually editing dependency lists in `pyproject.toml` or Prepare the Python environment with: ```sh -just python::sync +mise run python:sync +``` + +List the available project tasks with `mise tasks ls`, inspect one with +`mise tasks info `, and run one with `mise run `. For example: + +```sh +mise tasks ls +mise run python:test ``` +To update a toolchain, change its exact version in `mise.toml`, regenerate the +corresponding lock entry with `mise lock `, and install it locally with +`mise install `. Commit both `mise.toml` and `mise.lock`; do not edit the +lockfile by hand. Use `mise lock` without a tool name to refresh every existing +lock entry. + ## Specifications and generated targets The [PTF source specification guide](../ptf-catalog/index.md) explains the scientific information represented by each YAML file. The JSON Schema and -`just validate` define the complete structural and semantic contract. +`mise run validate` define the complete structural and semantic contract. Do not edit generated target sources, tests, the PTF catalog, or generated API reference pages directly. Regenerate every target and the PTF catalog with: ```sh -just generate +mise run generate ``` A second generation run must leave the working tree unchanged. @@ -59,7 +87,7 @@ A second generation run must leave the working tree unchanged. To check this across every codegen-owned target family, run: ```sh -just check-generated +mise run check-generated ``` The command regenerates the targets through the normal pipeline and reports @@ -104,20 +132,20 @@ Use the smallest relevant checks while iterating. Before submitting changes that affect multiple targets, run the complete target verification suite: ```sh -just verify +mise run verify ``` For a narrower change, run the component verification suite: ```sh -just codegen::verify -just rust::verify -just native::verify -just python::verify +mise run codegen:verify +mise run rust:verify +mise run native:verify +mise run python:verify ``` Each component `verify` runs all of its format, lint, type-checking, and test -checks. `just test` runs only the target test suites together. Python tests +checks. `mise run test` runs only the target test suites together. Python tests build the local native extension before exercising the public API. ## Documentation @@ -125,11 +153,11 @@ build the local native extension before exercising the public API. Build or serve the site through the locked MkDocs environment: ```sh -just docs build -just docs serve +mise run docs:build +mise run docs:serve ``` -Run `just generate` before building documentation if specifications or codegen +Run `mise run generate` before building documentation if specifications or codegen changed. The MkDocs configuration is `docs/mkdocs.yml`; it renders `docs/src/` into diff --git a/docs/tasks.toml b/docs/tasks.toml new file mode 100644 index 0000000..6109d30 --- /dev/null +++ b/docs/tasks.toml @@ -0,0 +1,26 @@ +["docs:build"] +description = "Build the documentation site with strict validation" +dir = "docs" +run = "uv run mkdocs build --strict" + +["docs:serve"] +description = "Serve the documentation site with strict validation" +dir = "docs" +run = "uv run mkdocs serve --strict" + +["docs:lint"] +description = "Run Ruff lint checks for documentation Python sources" +run = "ruff check docs" + +["docs:format"] +description = "Check documentation Python source formatting" +run = "ruff format docs --check" + +["docs:typecheck"] +description = "Run ty for documentation Python sources" +dir = "docs" +run = "uv run --no-sync ty check" + +["docs:verify"] +description = "Run documentation quality checks and build the site" +depends = ["docs:lint", "docs:format", "docs:typecheck", "docs:build"] diff --git a/mise.lock b/mise.lock new file mode 100644 index 0000000..68f7851 --- /dev/null +++ b/mise.lock @@ -0,0 +1,907 @@ +# @generated - this file is auto-generated by `mise lock` https://mise.jdx.dev/dev-tools/mise-lock.html + +[conda-packages.linux-arm64."_openmp_mutex-4.5-20_gnu"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda" +checksum = "sha256:a2527b1d81792a0ccd2c05850960df119c2b6d8f5fdec97f2db7d25dc23b1068" + +[conda-packages.linux-arm64."binutils-2.46.1-default_hf1166c9_102"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.46.1-default_hf1166c9_102.conda" +checksum = "sha256:548d128bc257badd2d9dbdff8173eb693fcbec84ceeb0fa74cbfed141ed42ad9" + +[conda-packages.linux-arm64."binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda" +checksum = "sha256:eebe159bf600943552e4319ff4ce27b6a2dadf0dcc5443e76dcee9259a408e11" + +[conda-packages.linux-arm64."clang-22-22.1.8-default_h224c185_8"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/clang-22-22.1.8-default_h224c185_8.conda" +checksum = "sha256:ea2a2b621e78314f9b8067d2d4bb8d4db1b028b95b4a8d0d6e9a8890764a71f8" + +[conda-packages.linux-arm64."clang_impl_linux-aarch64-22.1.8-default_hc88eb5c_8"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/clang_impl_linux-aarch64-22.1.8-default_hc88eb5c_8.conda" +checksum = "sha256:85229c5587f9e73c4c46179f31fadcffafb6c2e0ca286d5e7431db9aab1dca2b" + +[conda-packages.linux-arm64."compiler-rt-22.1.8-h8af1aa0_2"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/compiler-rt-22.1.8-h8af1aa0_2.conda" +checksum = "sha256:c12f45e88add599ba1055d4bb2db4d274d693fd58d84a9cf902b12dcce8123c5" + +[conda-packages.linux-arm64."compiler-rt22-22.1.8-hde6636f_2"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/compiler-rt22-22.1.8-hde6636f_2.conda" +checksum = "sha256:3fc48a0b51b2907118c4237be6aa39881f4bff76858b75f548e93325cc11200d" + +[conda-packages.linux-arm64."compiler-rt22_linux-aarch64-22.1.8-hde6636f_2"] +url = "https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_linux-aarch64-22.1.8-hde6636f_2.conda" +checksum = "sha256:d64de80ff45218af7682ae6537025d60bf541d3a12bb1826efd4459ebde400c1" + +[conda-packages.linux-arm64."compiler-rt_linux-aarch64-22.1.8-h8af1aa0_2"] +url = "https://conda.anaconda.org/conda-forge/noarch/compiler-rt_linux-aarch64-22.1.8-h8af1aa0_2.conda" +checksum = "sha256:92df1a32092c1443ff117fae8db7360446c1a54f9a8b40442c993e5f9be9e6b3" + +[conda-packages.linux-arm64."kernel-headers_linux-aarch64-6.12.0-h05a177a_6"] +url = "https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-6.12.0-h05a177a_6.conda" +checksum = "sha256:2251f81ccc1d3bb38873cbcdcf43c15f424a057714a7c7a4756e3c68440ad0e9" + +[conda-packages.linux-arm64."ld_impl_linux-aarch64-2.46.1-default_h1979696_102"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda" +checksum = "sha256:2c4901f4227b0850328ed0c69f958b30ad2cd18982f7a31c7c1f911827004d08" + +[conda-packages.linux-arm64."libclang-cpp22.1-22.1.8-default_h01b09c7_8"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp22.1-22.1.8-default_h01b09c7_8.conda" +checksum = "sha256:e99ff64e0d2c318d6d16cf9bc7bd47ac485eb4dcf116122cfbf142d656c5b6b6" + +[conda-packages.linux-arm64."libcompiler-rt-22.1.8-hde6636f_2"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libcompiler-rt-22.1.8-hde6636f_2.conda" +checksum = "sha256:224e5e8761525b368de1257a168c09b2af1d19fc5eb99daa3d514aa0806622d1" + +[conda-packages.linux-arm64."libgcc-16.1.0-h205dda4_2"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_2.conda" +checksum = "sha256:8f67a9b2ca7814b9480907bc9875f9643e0880e1a190bede54db88a02eeac76c" + +[conda-packages.linux-arm64."libgcc-devel_linux-aarch64-16.1.0-hd673532_102"] +url = "https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-16.1.0-hd673532_102.conda" +checksum = "sha256:b501040edd7760c8fd0690797abefae412527f091e302ef7754e3fdd2026c42b" + +[conda-packages.linux-arm64."libgomp-16.1.0-h8acb6b2_2"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_2.conda" +checksum = "sha256:c47d48956ab7b399744ae363509dc644ac614b0ad9c000beaeeea8b1c6e258e3" + +[conda-packages.linux-arm64."libiconv-1.18-h1ea5142_3"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h1ea5142_3.conda" +checksum = "sha256:d22c666eb887afd2119aac2110e23a0e817e9391bda99293421f7c46dab1564c" + +[conda-packages.linux-arm64."libllvm22-22.1.8-h680871c_2"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm22-22.1.8-h680871c_2.conda" +checksum = "sha256:060d423611d4222dc968e44f6a09a8f3edc49682fe46f76f9d9ad0bc362f164d" + +[conda-packages.linux-arm64."liblzma-5.8.3-he30d5cf_1"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_1.conda" +checksum = "sha256:f760669fd1cea27f689f411c0d5488e26ce50e382c9b63e4ad348f959850124a" + +[conda-packages.linux-arm64."libstdcxx-16.1.0-hef695bb_2"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_2.conda" +checksum = "sha256:ebe8a5794162ec1603c43eadc23f0feaaf4894bcc52e9061c4d452237a6b3c99" + +[conda-packages.linux-arm64."libxml2-16-2.15.3-h064b767_1"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.3-h064b767_1.conda" +checksum = "sha256:d2e83830399b322400be5531a4a9b7f2fbc0cc7b4b5b09a6ea67472877856b22" + +[conda-packages.linux-arm64."libxml2-2.15.3-h9ba8346_1"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.3-h9ba8346_1.conda" +checksum = "sha256:6bec73081b746df2427c27f2aa42027bac676c9a8fb94a20a105144b21fa6338" + +[conda-packages.linux-arm64."libzlib-1.3.2-hdc9db2a_3"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda" +checksum = "sha256:76efa6cc9d7e6f5ee3bbca0939f64054af2bdfb3c3632531f8e633cf6c2ea41e" + +[conda-packages.linux-arm64."llvm-openmp-22.1.8-hfdfeb53_1"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/llvm-openmp-22.1.8-hfdfeb53_1.conda" +checksum = "sha256:5e9827c237c5d42e0df0e613e8d365a5bb2be702ed67a03d05e3af030fdbaf61" + +[conda-packages.linux-arm64."sysroot_linux-aarch64-2.39-h934ec21_6"] +url = "https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.39-h934ec21_6.conda" +checksum = "sha256:bf817fbdb9953dda8f4b0d3c5bdf23a072c6baf6d39cb80e067f274a9d6feaf2" + +[conda-packages.linux-arm64.tzdata-2026c-h151e31d_0] +url = "https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda" +checksum = "sha256:b928c30ddcb0e3f544c6eade8352737e6e610e263276b90232db6a578ef899d8" + +[conda-packages.linux-arm64."zstd-1.5.7-h9d15635_7"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h9d15635_7.conda" +checksum = "sha256:427fd14bcb3b8659796fecc682716617409350fb5a98e5b7b47558a10d1a2fc7" + +[conda-packages.linux-arm64-musl."_openmp_mutex-4.5-20_gnu"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-20_gnu.conda" +checksum = "sha256:a2527b1d81792a0ccd2c05850960df119c2b6d8f5fdec97f2db7d25dc23b1068" + +[conda-packages.linux-arm64-musl."binutils-2.46.1-default_hf1166c9_102"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/binutils-2.46.1-default_hf1166c9_102.conda" +checksum = "sha256:548d128bc257badd2d9dbdff8173eb693fcbec84ceeb0fa74cbfed141ed42ad9" + +[conda-packages.linux-arm64-musl."binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102.conda" +checksum = "sha256:eebe159bf600943552e4319ff4ce27b6a2dadf0dcc5443e76dcee9259a408e11" + +[conda-packages.linux-arm64-musl."clang-22-22.1.8-default_h224c185_8"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/clang-22-22.1.8-default_h224c185_8.conda" +checksum = "sha256:ea2a2b621e78314f9b8067d2d4bb8d4db1b028b95b4a8d0d6e9a8890764a71f8" + +[conda-packages.linux-arm64-musl."clang_impl_linux-aarch64-22.1.8-default_hc88eb5c_8"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/clang_impl_linux-aarch64-22.1.8-default_hc88eb5c_8.conda" +checksum = "sha256:85229c5587f9e73c4c46179f31fadcffafb6c2e0ca286d5e7431db9aab1dca2b" + +[conda-packages.linux-arm64-musl."compiler-rt-22.1.8-h8af1aa0_2"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/compiler-rt-22.1.8-h8af1aa0_2.conda" +checksum = "sha256:c12f45e88add599ba1055d4bb2db4d274d693fd58d84a9cf902b12dcce8123c5" + +[conda-packages.linux-arm64-musl."compiler-rt22-22.1.8-hde6636f_2"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/compiler-rt22-22.1.8-hde6636f_2.conda" +checksum = "sha256:3fc48a0b51b2907118c4237be6aa39881f4bff76858b75f548e93325cc11200d" + +[conda-packages.linux-arm64-musl."compiler-rt22_linux-aarch64-22.1.8-hde6636f_2"] +url = "https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_linux-aarch64-22.1.8-hde6636f_2.conda" +checksum = "sha256:d64de80ff45218af7682ae6537025d60bf541d3a12bb1826efd4459ebde400c1" + +[conda-packages.linux-arm64-musl."compiler-rt_linux-aarch64-22.1.8-h8af1aa0_2"] +url = "https://conda.anaconda.org/conda-forge/noarch/compiler-rt_linux-aarch64-22.1.8-h8af1aa0_2.conda" +checksum = "sha256:92df1a32092c1443ff117fae8db7360446c1a54f9a8b40442c993e5f9be9e6b3" + +[conda-packages.linux-arm64-musl."kernel-headers_linux-aarch64-6.12.0-h05a177a_6"] +url = "https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-aarch64-6.12.0-h05a177a_6.conda" +checksum = "sha256:2251f81ccc1d3bb38873cbcdcf43c15f424a057714a7c7a4756e3c68440ad0e9" + +[conda-packages.linux-arm64-musl."ld_impl_linux-aarch64-2.46.1-default_h1979696_102"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.46.1-default_h1979696_102.conda" +checksum = "sha256:2c4901f4227b0850328ed0c69f958b30ad2cd18982f7a31c7c1f911827004d08" + +[conda-packages.linux-arm64-musl."libclang-cpp22.1-22.1.8-default_h01b09c7_8"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libclang-cpp22.1-22.1.8-default_h01b09c7_8.conda" +checksum = "sha256:e99ff64e0d2c318d6d16cf9bc7bd47ac485eb4dcf116122cfbf142d656c5b6b6" + +[conda-packages.linux-arm64-musl."libcompiler-rt-22.1.8-hde6636f_2"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libcompiler-rt-22.1.8-hde6636f_2.conda" +checksum = "sha256:224e5e8761525b368de1257a168c09b2af1d19fc5eb99daa3d514aa0806622d1" + +[conda-packages.linux-arm64-musl."libgcc-16.1.0-h205dda4_2"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-16.1.0-h205dda4_2.conda" +checksum = "sha256:8f67a9b2ca7814b9480907bc9875f9643e0880e1a190bede54db88a02eeac76c" + +[conda-packages.linux-arm64-musl."libgcc-devel_linux-aarch64-16.1.0-hd673532_102"] +url = "https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-aarch64-16.1.0-hd673532_102.conda" +checksum = "sha256:b501040edd7760c8fd0690797abefae412527f091e302ef7754e3fdd2026c42b" + +[conda-packages.linux-arm64-musl."libgomp-16.1.0-h8acb6b2_2"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-16.1.0-h8acb6b2_2.conda" +checksum = "sha256:c47d48956ab7b399744ae363509dc644ac614b0ad9c000beaeeea8b1c6e258e3" + +[conda-packages.linux-arm64-musl."libiconv-1.18-h1ea5142_3"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libiconv-1.18-h1ea5142_3.conda" +checksum = "sha256:d22c666eb887afd2119aac2110e23a0e817e9391bda99293421f7c46dab1564c" + +[conda-packages.linux-arm64-musl."libllvm22-22.1.8-h680871c_2"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libllvm22-22.1.8-h680871c_2.conda" +checksum = "sha256:060d423611d4222dc968e44f6a09a8f3edc49682fe46f76f9d9ad0bc362f164d" + +[conda-packages.linux-arm64-musl."liblzma-5.8.3-he30d5cf_1"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/liblzma-5.8.3-he30d5cf_1.conda" +checksum = "sha256:f760669fd1cea27f689f411c0d5488e26ce50e382c9b63e4ad348f959850124a" + +[conda-packages.linux-arm64-musl."libstdcxx-16.1.0-hef695bb_2"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-16.1.0-hef695bb_2.conda" +checksum = "sha256:ebe8a5794162ec1603c43eadc23f0feaaf4894bcc52e9061c4d452237a6b3c99" + +[conda-packages.linux-arm64-musl."libxml2-16-2.15.3-h064b767_1"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-16-2.15.3-h064b767_1.conda" +checksum = "sha256:d2e83830399b322400be5531a4a9b7f2fbc0cc7b4b5b09a6ea67472877856b22" + +[conda-packages.linux-arm64-musl."libxml2-2.15.3-h9ba8346_1"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libxml2-2.15.3-h9ba8346_1.conda" +checksum = "sha256:6bec73081b746df2427c27f2aa42027bac676c9a8fb94a20a105144b21fa6338" + +[conda-packages.linux-arm64-musl."libzlib-1.3.2-hdc9db2a_3"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.2-hdc9db2a_3.conda" +checksum = "sha256:76efa6cc9d7e6f5ee3bbca0939f64054af2bdfb3c3632531f8e633cf6c2ea41e" + +[conda-packages.linux-arm64-musl."llvm-openmp-22.1.8-hfdfeb53_1"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/llvm-openmp-22.1.8-hfdfeb53_1.conda" +checksum = "sha256:5e9827c237c5d42e0df0e613e8d365a5bb2be702ed67a03d05e3af030fdbaf61" + +[conda-packages.linux-arm64-musl."sysroot_linux-aarch64-2.39-h934ec21_6"] +url = "https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-aarch64-2.39-h934ec21_6.conda" +checksum = "sha256:bf817fbdb9953dda8f4b0d3c5bdf23a072c6baf6d39cb80e067f274a9d6feaf2" + +[conda-packages.linux-arm64-musl.tzdata-2026c-h151e31d_0] +url = "https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda" +checksum = "sha256:b928c30ddcb0e3f544c6eade8352737e6e610e263276b90232db6a578ef899d8" + +[conda-packages.linux-arm64-musl."zstd-1.5.7-h9d15635_7"] +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/zstd-1.5.7-h9d15635_7.conda" +checksum = "sha256:427fd14bcb3b8659796fecc682716617409350fb5a98e5b7b47558a10d1a2fc7" + +[conda-packages.linux-x64."_openmp_mutex-4.5-20_gnu"] +url = "https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda" +checksum = "sha256:1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9" + +[conda-packages.linux-x64."binutils-2.46.1-default_h4852527_102"] +url = "https://conda.anaconda.org/conda-forge/linux-64/binutils-2.46.1-default_h4852527_102.conda" +checksum = "sha256:659c367ef49df7741749a2ad240b007d7df51b4f210505a78543deafb001e44c" + +[conda-packages.linux-x64."binutils_impl_linux-64-2.46.1-default_hfdba357_102"] +url = "https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda" +checksum = "sha256:fb7bf36984a37ce7e4714d1d1da0bd0e3bfc679520f5cdc184afc676fd4b5da2" + +[conda-packages.linux-x64."clang-22-22.1.8-default_h516872c_8"] +url = "https://conda.anaconda.org/conda-forge/linux-64/clang-22-22.1.8-default_h516872c_8.conda" +checksum = "sha256:e2fba92de98faedecbfc998e0aca7bb16ed67330f750e5ceea4645094f14d139" + +[conda-packages.linux-x64."clang_impl_linux-64-22.1.8-default_h509a325_8"] +url = "https://conda.anaconda.org/conda-forge/linux-64/clang_impl_linux-64-22.1.8-default_h509a325_8.conda" +checksum = "sha256:05891c61e9a815883d9681f7a0937c178a8fc7a6d5cf3f9499d23f47301b5142" + +[conda-packages.linux-x64."compiler-rt-22.1.8-ha770c72_2"] +url = "https://conda.anaconda.org/conda-forge/linux-64/compiler-rt-22.1.8-ha770c72_2.conda" +checksum = "sha256:2d1981daa747e884f359c698b95cb36dafea675772e10654e79c0b3516d51832" + +[conda-packages.linux-x64."compiler-rt22-22.1.8-h7148c6a_2"] +url = "https://conda.anaconda.org/conda-forge/linux-64/compiler-rt22-22.1.8-h7148c6a_2.conda" +checksum = "sha256:a363ee7ace374becfda5a4277a78166fa8e541d49ec5280b56b470b72b01f118" + +[conda-packages.linux-x64."compiler-rt22_linux-64-22.1.8-h0e38de2_2"] +url = "https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_linux-64-22.1.8-h0e38de2_2.conda" +checksum = "sha256:904e27f8b3b546bea397e2c68d5c82c6f0a24dbe24def9a7dee714e0b679c586" + +[conda-packages.linux-x64."compiler-rt_linux-64-22.1.8-ha770c72_2"] +url = "https://conda.anaconda.org/conda-forge/noarch/compiler-rt_linux-64-22.1.8-ha770c72_2.conda" +checksum = "sha256:196eb6ea49630770f2ea7278f0ff4a4aa78b412729e8c958cd1d061f68387e65" + +[conda-packages.linux-x64."icu-78.3-py310h44b86e0_2"] +url = "https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda" +checksum = "sha256:9f07834f0c546ab14d885ce0366285f61f44e326c0edd1fc63b8294e113ae432" + +[conda-packages.linux-x64."kernel-headers_linux-64-6.12.0-he073ed8_6"] +url = "https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-6.12.0-he073ed8_6.conda" +checksum = "sha256:73b11f31db6c9ebe63d900334fa4f46859aa1ddd8f37cfa5f25a043e0a59253c" + +[conda-packages.linux-x64."ld_impl_linux-64-2.46.1-default_hbd61a6d_102"] +url = "https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda" +checksum = "sha256:27d83f1188cd19bcb7754a078b3fa7f4cfb8527f8eb2fde54dd01fc529d1adec" + +[conda-packages.linux-x64."libclang-cpp22.1-22.1.8-default_h0acdd01_8"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp22.1-22.1.8-default_h0acdd01_8.conda" +checksum = "sha256:5a5ec4ed1f8eec558669fd51f672bda532a8f36682a9c815229297a356802846" + +[conda-packages.linux-x64."libcompiler-rt-22.1.8-h7148c6a_2"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libcompiler-rt-22.1.8-h7148c6a_2.conda" +checksum = "sha256:84ca16b2ea02a365c36a0a5b488dd88f460433e49575c925e849ad76ef573302" + +[conda-packages.linux-x64."libgcc-16.1.0-ha9f2e26_2"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda" +checksum = "sha256:4b733b68027a638fd24a38aaed1ebb05e055bef694970fab745b1c7678ca16f1" + +[conda-packages.linux-x64."libgcc-devel_linux-64-16.1.0-h59071f9_102"] +url = "https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-16.1.0-h59071f9_102.conda" +checksum = "sha256:6bc83b1cbb82292da5e2307baa6ca35c70b94713a6c8bb7571c3b84dc7c13a2e" + +[conda-packages.linux-x64."libgomp-16.1.0-he0feb66_2"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_2.conda" +checksum = "sha256:7d4d1891d5fe5d75a73dd7268e8f2d7c11b7b637dea901a429f8056511960267" + +[conda-packages.linux-x64."libiconv-1.18-h0cb94f2_3"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda" +checksum = "sha256:f943117edb9cd4d9c61cc972eee5a34291dc55ea7a6e9e38da104995841cbcb6" + +[conda-packages.linux-x64."libllvm22-22.1.8-h474f4eb_2"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.8-h474f4eb_2.conda" +checksum = "sha256:cfc90781f703b8b8cc35694d46c9a200e3cf66657f55517f8b1ec1f672c42752" + +[conda-packages.linux-x64."liblzma-5.8.3-hb03c661_1"] +url = "https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda" +checksum = "sha256:9787df8c22a59c9a70d3e5a10db9ad663485e75e9ccc3f09bd092cb7b95e0dab" + +[conda-packages.linux-x64."libstdcxx-16.1.0-h934c35e_2"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda" +checksum = "sha256:af96a5fcf1ce0659d257ababc1b8d0bbb698250e8140c6b8352f60d3be075392" + +[conda-packages.linux-x64."libxml2-16-2.15.3-hca6bf5a_1"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda" +checksum = "sha256:087d4de023f22d6a28b9e1b818961dd41e9bda6e9793590600ff16ca150bf9cb" + +[conda-packages.linux-x64."libxml2-2.15.3-h49c6c72_1"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda" +checksum = "sha256:a16a576a5844a3a0e1cdfc5e162b9fe9c64dccf6a93f44c293bb42851aebe2b4" + +[conda-packages.linux-x64."libzlib-1.3.2-h25fd6f3_3"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda" +checksum = "sha256:eb8a0db0aa570124f7d2a93d7c7f596e3390df5e047818d873baad32985fc736" + +[conda-packages.linux-x64."llvm-openmp-22.1.8-h3206bd6_1"] +url = "https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda" +checksum = "sha256:cf74ea3b6c8f0c01ae3cea10ff9451e4475eb39ee99a2c0f1f1627630ef888e5" + +[conda-packages.linux-x64."sysroot_linux-64-2.39-hc4b9eeb_6"] +url = "https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.39-hc4b9eeb_6.conda" +checksum = "sha256:7d235e4337f122f3439d0196e1c1c6e715a5b88fcbf24f944510186c84168e45" + +[conda-packages.linux-x64.tzdata-2026c-h151e31d_0] +url = "https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda" +checksum = "sha256:b928c30ddcb0e3f544c6eade8352737e6e610e263276b90232db6a578ef899d8" + +[conda-packages.linux-x64."zstd-1.5.7-hb78ec9c_7"] +url = "https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda" +checksum = "sha256:47d682b9f6d6ec9eb1a6e6c3e75ea6273e899e78fb7fc59f81d39745009fbc60" + +[conda-packages.linux-x64-musl."_openmp_mutex-4.5-20_gnu"] +url = "https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda" +checksum = "sha256:1dd3fffd892081df9726d7eb7e0dea6198962ba775bd88842135a4ddb4deb3c9" + +[conda-packages.linux-x64-musl."binutils-2.46.1-default_h4852527_102"] +url = "https://conda.anaconda.org/conda-forge/linux-64/binutils-2.46.1-default_h4852527_102.conda" +checksum = "sha256:659c367ef49df7741749a2ad240b007d7df51b4f210505a78543deafb001e44c" + +[conda-packages.linux-x64-musl."binutils_impl_linux-64-2.46.1-default_hfdba357_102"] +url = "https://conda.anaconda.org/conda-forge/linux-64/binutils_impl_linux-64-2.46.1-default_hfdba357_102.conda" +checksum = "sha256:fb7bf36984a37ce7e4714d1d1da0bd0e3bfc679520f5cdc184afc676fd4b5da2" + +[conda-packages.linux-x64-musl."clang-22-22.1.8-default_h516872c_8"] +url = "https://conda.anaconda.org/conda-forge/linux-64/clang-22-22.1.8-default_h516872c_8.conda" +checksum = "sha256:e2fba92de98faedecbfc998e0aca7bb16ed67330f750e5ceea4645094f14d139" + +[conda-packages.linux-x64-musl."clang_impl_linux-64-22.1.8-default_h509a325_8"] +url = "https://conda.anaconda.org/conda-forge/linux-64/clang_impl_linux-64-22.1.8-default_h509a325_8.conda" +checksum = "sha256:05891c61e9a815883d9681f7a0937c178a8fc7a6d5cf3f9499d23f47301b5142" + +[conda-packages.linux-x64-musl."compiler-rt-22.1.8-ha770c72_2"] +url = "https://conda.anaconda.org/conda-forge/linux-64/compiler-rt-22.1.8-ha770c72_2.conda" +checksum = "sha256:2d1981daa747e884f359c698b95cb36dafea675772e10654e79c0b3516d51832" + +[conda-packages.linux-x64-musl."compiler-rt22-22.1.8-h7148c6a_2"] +url = "https://conda.anaconda.org/conda-forge/linux-64/compiler-rt22-22.1.8-h7148c6a_2.conda" +checksum = "sha256:a363ee7ace374becfda5a4277a78166fa8e541d49ec5280b56b470b72b01f118" + +[conda-packages.linux-x64-musl."compiler-rt22_linux-64-22.1.8-h0e38de2_2"] +url = "https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_linux-64-22.1.8-h0e38de2_2.conda" +checksum = "sha256:904e27f8b3b546bea397e2c68d5c82c6f0a24dbe24def9a7dee714e0b679c586" + +[conda-packages.linux-x64-musl."compiler-rt_linux-64-22.1.8-ha770c72_2"] +url = "https://conda.anaconda.org/conda-forge/noarch/compiler-rt_linux-64-22.1.8-ha770c72_2.conda" +checksum = "sha256:196eb6ea49630770f2ea7278f0ff4a4aa78b412729e8c958cd1d061f68387e65" + +[conda-packages.linux-x64-musl."icu-78.3-py310h44b86e0_2"] +url = "https://conda.anaconda.org/conda-forge/linux-64/icu-78.3-py310h44b86e0_2.conda" +checksum = "sha256:9f07834f0c546ab14d885ce0366285f61f44e326c0edd1fc63b8294e113ae432" + +[conda-packages.linux-x64-musl."kernel-headers_linux-64-6.12.0-he073ed8_6"] +url = "https://conda.anaconda.org/conda-forge/noarch/kernel-headers_linux-64-6.12.0-he073ed8_6.conda" +checksum = "sha256:73b11f31db6c9ebe63d900334fa4f46859aa1ddd8f37cfa5f25a043e0a59253c" + +[conda-packages.linux-x64-musl."ld_impl_linux-64-2.46.1-default_hbd61a6d_102"] +url = "https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda" +checksum = "sha256:27d83f1188cd19bcb7754a078b3fa7f4cfb8527f8eb2fde54dd01fc529d1adec" + +[conda-packages.linux-x64-musl."libclang-cpp22.1-22.1.8-default_h0acdd01_8"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libclang-cpp22.1-22.1.8-default_h0acdd01_8.conda" +checksum = "sha256:5a5ec4ed1f8eec558669fd51f672bda532a8f36682a9c815229297a356802846" + +[conda-packages.linux-x64-musl."libcompiler-rt-22.1.8-h7148c6a_2"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libcompiler-rt-22.1.8-h7148c6a_2.conda" +checksum = "sha256:84ca16b2ea02a365c36a0a5b488dd88f460433e49575c925e849ad76ef573302" + +[conda-packages.linux-x64-musl."libgcc-16.1.0-ha9f2e26_2"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_2.conda" +checksum = "sha256:4b733b68027a638fd24a38aaed1ebb05e055bef694970fab745b1c7678ca16f1" + +[conda-packages.linux-x64-musl."libgcc-devel_linux-64-16.1.0-h59071f9_102"] +url = "https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-16.1.0-h59071f9_102.conda" +checksum = "sha256:6bc83b1cbb82292da5e2307baa6ca35c70b94713a6c8bb7571c3b84dc7c13a2e" + +[conda-packages.linux-x64-musl."libgomp-16.1.0-he0feb66_2"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libgomp-16.1.0-he0feb66_2.conda" +checksum = "sha256:7d4d1891d5fe5d75a73dd7268e8f2d7c11b7b637dea901a429f8056511960267" + +[conda-packages.linux-x64-musl."libiconv-1.18-h0cb94f2_3"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h0cb94f2_3.conda" +checksum = "sha256:f943117edb9cd4d9c61cc972eee5a34291dc55ea7a6e9e38da104995841cbcb6" + +[conda-packages.linux-x64-musl."libllvm22-22.1.8-h474f4eb_2"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libllvm22-22.1.8-h474f4eb_2.conda" +checksum = "sha256:cfc90781f703b8b8cc35694d46c9a200e3cf66657f55517f8b1ec1f672c42752" + +[conda-packages.linux-x64-musl."liblzma-5.8.3-hb03c661_1"] +url = "https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.3-hb03c661_1.conda" +checksum = "sha256:9787df8c22a59c9a70d3e5a10db9ad663485e75e9ccc3f09bd092cb7b95e0dab" + +[conda-packages.linux-x64-musl."libstdcxx-16.1.0-h934c35e_2"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_2.conda" +checksum = "sha256:af96a5fcf1ce0659d257ababc1b8d0bbb698250e8140c6b8352f60d3be075392" + +[conda-packages.linux-x64-musl."libxml2-16-2.15.3-hca6bf5a_1"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.3-hca6bf5a_1.conda" +checksum = "sha256:087d4de023f22d6a28b9e1b818961dd41e9bda6e9793590600ff16ca150bf9cb" + +[conda-packages.linux-x64-musl."libxml2-2.15.3-h49c6c72_1"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.3-h49c6c72_1.conda" +checksum = "sha256:a16a576a5844a3a0e1cdfc5e162b9fe9c64dccf6a93f44c293bb42851aebe2b4" + +[conda-packages.linux-x64-musl."libzlib-1.3.2-h25fd6f3_3"] +url = "https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda" +checksum = "sha256:eb8a0db0aa570124f7d2a93d7c7f596e3390df5e047818d873baad32985fc736" + +[conda-packages.linux-x64-musl."llvm-openmp-22.1.8-h3206bd6_1"] +url = "https://conda.anaconda.org/conda-forge/linux-64/llvm-openmp-22.1.8-h3206bd6_1.conda" +checksum = "sha256:cf74ea3b6c8f0c01ae3cea10ff9451e4475eb39ee99a2c0f1f1627630ef888e5" + +[conda-packages.linux-x64-musl."sysroot_linux-64-2.39-hc4b9eeb_6"] +url = "https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.39-hc4b9eeb_6.conda" +checksum = "sha256:7d235e4337f122f3439d0196e1c1c6e715a5b88fcbf24f944510186c84168e45" + +[conda-packages.linux-x64-musl.tzdata-2026c-h151e31d_0] +url = "https://conda.anaconda.org/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda" +checksum = "sha256:b928c30ddcb0e3f544c6eade8352737e6e610e263276b90232db6a578ef899d8" + +[conda-packages.linux-x64-musl."zstd-1.5.7-hb78ec9c_7"] +url = "https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_7.conda" +checksum = "sha256:47d682b9f6d6ec9eb1a6e6c3e75ea6273e899e78fb7fc59f81d39745009fbc60" + +[conda-packages.windows-x64."clang-22-22.1.8-default_hac490eb_2"] +url = "https://conda.anaconda.org/conda-forge/win-64/clang-22-22.1.8-default_hac490eb_2.conda" +checksum = "sha256:92defdaa5eb6ccce723a7a714a8eee6b1ec72c3f7962d2df2fd0053d0511c461" + +[conda-packages.windows-x64."compiler-rt22-22.1.8-h49e36cd_2"] +url = "https://conda.anaconda.org/conda-forge/win-64/compiler-rt22-22.1.8-h49e36cd_2.conda" +checksum = "sha256:da6148eca9ad24b3f4ddb4e9062965ef6401d42aa950452a331dfc15a76ba8dc" + +[conda-packages.windows-x64."compiler-rt22_win-64-22.1.8-h49e36cd_2"] +url = "https://conda.anaconda.org/conda-forge/noarch/compiler-rt22_win-64-22.1.8-h49e36cd_2.conda" +checksum = "sha256:83503e95b871dd9af6a5e78ed28add18eb2ee40302a2b58584d20f6836750cb6" + +[conda-packages.windows-x64."libzlib-1.3.2-hfd05255_3"] +url = "https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.conda" +checksum = "sha256:0629c2cc0404d3bb29d6baa7b4ba62da80797015e86de050db81ea5a07050527" + +[conda-packages.windows-x64."llvm-openmp-22.1.8-h4fa8253_1"] +url = "https://conda.anaconda.org/conda-forge/win-64/llvm-openmp-22.1.8-h4fa8253_1.conda" +checksum = "sha256:41a804136fdade8cfa9db006f3c41cac1199a387e609c465d779cef271fda85e" + +[conda-packages.windows-x64."ucrt-10.0.26100.0-h57928b3_0"] +url = "https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda" +checksum = "sha256:3005729dce6f3d3f5ec91dfc49fc75a0095f9cd23bab49efb899657297ac91a5" + +[conda-packages.windows-x64."vc-14.5-ha367084_41"] +url = "https://conda.anaconda.org/conda-forge/win-64/vc-14.5-ha367084_41.conda" +checksum = "sha256:35444c55a92e2f7f7ba26bc70f81e56e52344f7d064c0fd4b40a46a58517b79c" + +[conda-packages.windows-x64."vc14_runtime-14.51.36247-habf1de7_41"] +url = "https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda" +checksum = "sha256:4e4cb599cdc41bf2109d1464c127b5bcbddf548ce3e322e612afb691338b48f8" + +[conda-packages.windows-x64."vcomp14-14.51.36247-habf1de7_41"] +url = "https://conda.anaconda.org/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda" +checksum = "sha256:731e043390c9457299484d39e427221fc868a9249540a498a5a4f6456c7744d1" + +[conda-packages.windows-x64."zstd-1.5.7-h534d264_7"] +url = "https://conda.anaconda.org/conda-forge/win-64/zstd-1.5.7-h534d264_7.conda" +checksum = "sha256:ca7daae4f218a11fab82cc2857f0ea518ec3f46acec60490485347a4c22c6b3e" + +[[tools.clang]] +version = "22.1.8" +backend = "conda:clang" + +[tools.clang.options] +channel = "conda-forge" + +[tools.clang."platforms.linux-arm64"] +checksum = "sha256:847cc6a15517c144b72b5bb89a55c8c64d25961147ecbc4dae584db85dc1b828" +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/clang-22.1.8-default_cfg_h1ceb725_8.conda" +conda_deps = [ + "clang_impl_linux-aarch64-22.1.8-default_hc88eb5c_8", + "clang-22-22.1.8-default_h224c185_8", + "libclang-cpp22.1-22.1.8-default_h01b09c7_8", + "llvm-openmp-22.1.8-hfdfeb53_1", + "binutils-2.46.1-default_hf1166c9_102", + "libgcc-devel_linux-aarch64-16.1.0-hd673532_102", + "sysroot_linux-aarch64-2.39-h934ec21_6", + "kernel-headers_linux-aarch64-6.12.0-h05a177a_6", + "libstdcxx-16.1.0-hef695bb_2", + "libgcc-16.1.0-h205dda4_2", + "compiler-rt22-22.1.8-hde6636f_2", + "compiler-rt-22.1.8-h8af1aa0_2", + "libcompiler-rt-22.1.8-hde6636f_2", + "libzlib-1.3.2-hdc9db2a_3", + "libllvm22-22.1.8-h680871c_2", + "zstd-1.5.7-h9d15635_7", + "libxml2-2.15.3-h9ba8346_1", + "libxml2-16-2.15.3-h064b767_1", + "compiler-rt_linux-aarch64-22.1.8-h8af1aa0_2", + "compiler-rt22_linux-aarch64-22.1.8-hde6636f_2", + "binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102", + "ld_impl_linux-aarch64-2.46.1-default_h1979696_102", + "tzdata-2026c-h151e31d_0", + "_openmp_mutex-4.5-20_gnu", + "libgomp-16.1.0-h8acb6b2_2", + "libiconv-1.18-h1ea5142_3", + "liblzma-5.8.3-he30d5cf_1", +] + +[tools.clang."platforms.linux-arm64-musl"] +checksum = "sha256:847cc6a15517c144b72b5bb89a55c8c64d25961147ecbc4dae584db85dc1b828" +url = "https://conda.anaconda.org/conda-forge/linux-aarch64/clang-22.1.8-default_cfg_h1ceb725_8.conda" +conda_deps = [ + "clang_impl_linux-aarch64-22.1.8-default_hc88eb5c_8", + "clang-22-22.1.8-default_h224c185_8", + "libclang-cpp22.1-22.1.8-default_h01b09c7_8", + "llvm-openmp-22.1.8-hfdfeb53_1", + "binutils-2.46.1-default_hf1166c9_102", + "libgcc-devel_linux-aarch64-16.1.0-hd673532_102", + "sysroot_linux-aarch64-2.39-h934ec21_6", + "kernel-headers_linux-aarch64-6.12.0-h05a177a_6", + "libstdcxx-16.1.0-hef695bb_2", + "libgcc-16.1.0-h205dda4_2", + "compiler-rt22-22.1.8-hde6636f_2", + "compiler-rt-22.1.8-h8af1aa0_2", + "libcompiler-rt-22.1.8-hde6636f_2", + "libzlib-1.3.2-hdc9db2a_3", + "libllvm22-22.1.8-h680871c_2", + "zstd-1.5.7-h9d15635_7", + "libxml2-2.15.3-h9ba8346_1", + "libxml2-16-2.15.3-h064b767_1", + "compiler-rt_linux-aarch64-22.1.8-h8af1aa0_2", + "compiler-rt22_linux-aarch64-22.1.8-hde6636f_2", + "binutils_impl_linux-aarch64-2.46.1-default_h5f4c503_102", + "ld_impl_linux-aarch64-2.46.1-default_h1979696_102", + "tzdata-2026c-h151e31d_0", + "_openmp_mutex-4.5-20_gnu", + "libgomp-16.1.0-h8acb6b2_2", + "libiconv-1.18-h1ea5142_3", + "liblzma-5.8.3-he30d5cf_1", +] + +[tools.clang."platforms.linux-x64"] +checksum = "sha256:df0d7a8c3a60a83cdd5078adffc8288581782518fdfcc0afc5d9ce988bde4dc4" +url = "https://conda.anaconda.org/conda-forge/linux-64/clang-22.1.8-default_cfg_hdba170d_8.conda" +conda_deps = [ + "clang_impl_linux-64-22.1.8-default_h509a325_8", + "clang-22-22.1.8-default_h516872c_8", + "libclang-cpp22.1-22.1.8-default_h0acdd01_8", + "llvm-openmp-22.1.8-h3206bd6_1", + "binutils-2.46.1-default_h4852527_102", + "libgcc-devel_linux-64-16.1.0-h59071f9_102", + "sysroot_linux-64-2.39-hc4b9eeb_6", + "kernel-headers_linux-64-6.12.0-he073ed8_6", + "libstdcxx-16.1.0-h934c35e_2", + "libgcc-16.1.0-ha9f2e26_2", + "compiler-rt22-22.1.8-h7148c6a_2", + "compiler-rt-22.1.8-ha770c72_2", + "libcompiler-rt-22.1.8-h7148c6a_2", + "libzlib-1.3.2-h25fd6f3_3", + "libllvm22-22.1.8-h474f4eb_2", + "libxml2-2.15.3-h49c6c72_1", + "libxml2-16-2.15.3-hca6bf5a_1", + "zstd-1.5.7-hb78ec9c_7", + "compiler-rt_linux-64-22.1.8-ha770c72_2", + "compiler-rt22_linux-64-22.1.8-h0e38de2_2", + "binutils_impl_linux-64-2.46.1-default_hfdba357_102", + "ld_impl_linux-64-2.46.1-default_hbd61a6d_102", + "tzdata-2026c-h151e31d_0", + "_openmp_mutex-4.5-20_gnu", + "libgomp-16.1.0-he0feb66_2", + "liblzma-5.8.3-hb03c661_1", + "icu-78.3-py310h44b86e0_2", + "libiconv-1.18-h0cb94f2_3", +] + +[tools.clang."platforms.linux-x64-musl"] +checksum = "sha256:df0d7a8c3a60a83cdd5078adffc8288581782518fdfcc0afc5d9ce988bde4dc4" +url = "https://conda.anaconda.org/conda-forge/linux-64/clang-22.1.8-default_cfg_hdba170d_8.conda" +conda_deps = [ + "clang_impl_linux-64-22.1.8-default_h509a325_8", + "clang-22-22.1.8-default_h516872c_8", + "libclang-cpp22.1-22.1.8-default_h0acdd01_8", + "llvm-openmp-22.1.8-h3206bd6_1", + "binutils-2.46.1-default_h4852527_102", + "libgcc-devel_linux-64-16.1.0-h59071f9_102", + "sysroot_linux-64-2.39-hc4b9eeb_6", + "kernel-headers_linux-64-6.12.0-he073ed8_6", + "libstdcxx-16.1.0-h934c35e_2", + "libgcc-16.1.0-ha9f2e26_2", + "compiler-rt22-22.1.8-h7148c6a_2", + "compiler-rt-22.1.8-ha770c72_2", + "libcompiler-rt-22.1.8-h7148c6a_2", + "libzlib-1.3.2-h25fd6f3_3", + "libllvm22-22.1.8-h474f4eb_2", + "libxml2-2.15.3-h49c6c72_1", + "libxml2-16-2.15.3-hca6bf5a_1", + "zstd-1.5.7-hb78ec9c_7", + "compiler-rt_linux-64-22.1.8-ha770c72_2", + "compiler-rt22_linux-64-22.1.8-h0e38de2_2", + "binutils_impl_linux-64-2.46.1-default_hfdba357_102", + "ld_impl_linux-64-2.46.1-default_hbd61a6d_102", + "tzdata-2026c-h151e31d_0", + "_openmp_mutex-4.5-20_gnu", + "libgomp-16.1.0-he0feb66_2", + "liblzma-5.8.3-hb03c661_1", + "icu-78.3-py310h44b86e0_2", + "libiconv-1.18-h0cb94f2_3", +] + +[tools.clang."platforms.windows-x64"] +checksum = "sha256:a626a7e6781301a55d29bd2c1d2c78ed94d70a05675e36c109bf0039bad6e8ff" +url = "https://conda.anaconda.org/conda-forge/win-64/clang-22.1.8-default_nocfg_hbb9487a_2.conda" +conda_deps = [ + "clang-22-22.1.8-default_hac490eb_2", + "libzlib-1.3.2-hfd05255_3", + "llvm-openmp-22.1.8-h4fa8253_1", + "ucrt-10.0.26100.0-h57928b3_0", + "vc-14.5-ha367084_41", + "vc14_runtime-14.51.36247-habf1de7_41", + "vcomp14-14.51.36247-habf1de7_41", + "zstd-1.5.7-h534d264_7", + "compiler-rt22-22.1.8-h49e36cd_2", + "compiler-rt22_win-64-22.1.8-h49e36cd_2", +] + +[[tools.cmake]] +version = "4.4.2" +backend = "aqua:Kitware/CMake" + +[tools.cmake."platforms.linux-arm64"] +checksum = "sha256:9ca1aadb4451c5dcbdc67f9b4aff42dab52abbaebd8db9e2900026502dbed671" +url = "https://github.com/Kitware/CMake/releases/download/v4.4.2/cmake-4.4.2-linux-aarch64.tar.gz" +url_api = "https://api.github.com/repos/Kitware/CMake/releases/assets/496776579" + +[tools.cmake."platforms.linux-arm64-musl"] +checksum = "sha256:9ca1aadb4451c5dcbdc67f9b4aff42dab52abbaebd8db9e2900026502dbed671" +url = "https://github.com/Kitware/CMake/releases/download/v4.4.2/cmake-4.4.2-linux-aarch64.tar.gz" +url_api = "https://api.github.com/repos/Kitware/CMake/releases/assets/496776579" + +[tools.cmake."platforms.linux-x64"] +checksum = "sha256:3ada9a3f5d8a85413579bdd0ea6aa8e8da86efdd6d15c91a1afa517f2021956c" +url = "https://github.com/Kitware/CMake/releases/download/v4.4.2/cmake-4.4.2-linux-x86_64.tar.gz" +url_api = "https://api.github.com/repos/Kitware/CMake/releases/assets/496776689" + +[tools.cmake."platforms.linux-x64-musl"] +checksum = "sha256:3ada9a3f5d8a85413579bdd0ea6aa8e8da86efdd6d15c91a1afa517f2021956c" +url = "https://github.com/Kitware/CMake/releases/download/v4.4.2/cmake-4.4.2-linux-x86_64.tar.gz" +url_api = "https://api.github.com/repos/Kitware/CMake/releases/assets/496776689" + +[tools.cmake."platforms.macos-arm64"] +checksum = "sha256:800fc86838e913fff969b499886c80baeb4ccfd00f0e39906b34aa334f39ab6c" +url = "https://github.com/Kitware/CMake/releases/download/v4.4.2/cmake-4.4.2-macos-universal.tar.gz" +url_api = "https://api.github.com/repos/Kitware/CMake/releases/assets/496776845" + +[tools.cmake."platforms.macos-x64"] +checksum = "sha256:800fc86838e913fff969b499886c80baeb4ccfd00f0e39906b34aa334f39ab6c" +url = "https://github.com/Kitware/CMake/releases/download/v4.4.2/cmake-4.4.2-macos-universal.tar.gz" +url_api = "https://api.github.com/repos/Kitware/CMake/releases/assets/496776845" + +[tools.cmake."platforms.windows-x64"] +checksum = "sha256:e8139d85b3813bc38833142ae1940472e9a587e9b5d2718ac1804c60f4e57a64" +url = "https://github.com/Kitware/CMake/releases/download/v4.4.2/cmake-4.4.2-windows-x86_64.zip" +url_api = "https://api.github.com/repos/Kitware/CMake/releases/assets/496777367" + +[[tools.ninja]] +version = "1.13.2" +backend = "aqua:ninja-build/ninja" + +[tools.ninja."platforms.linux-arm64"] +checksum = "sha256:fd2cacc8050a7f12a16a2e48f9e06fca5c14fc4c2bee2babb67b58be17a607fc" +url = "https://github.com/ninja-build/ninja/releases/download/v1.13.2/ninja-linux-aarch64.zip" +url_api = "https://api.github.com/repos/ninja-build/ninja/releases/assets/318864579" + +[tools.ninja."platforms.linux-arm64-musl"] +checksum = "sha256:fd2cacc8050a7f12a16a2e48f9e06fca5c14fc4c2bee2babb67b58be17a607fc" +url = "https://github.com/ninja-build/ninja/releases/download/v1.13.2/ninja-linux-aarch64.zip" +url_api = "https://api.github.com/repos/ninja-build/ninja/releases/assets/318864579" + +[tools.ninja."platforms.linux-x64"] +checksum = "sha256:5749cbc4e668273514150a80e387a957f933c6ed3f5f11e03fb30955e2bbead6" +url = "https://github.com/ninja-build/ninja/releases/download/v1.13.2/ninja-linux.zip" +url_api = "https://api.github.com/repos/ninja-build/ninja/releases/assets/318865358" + +[tools.ninja."platforms.linux-x64-musl"] +checksum = "sha256:5749cbc4e668273514150a80e387a957f933c6ed3f5f11e03fb30955e2bbead6" +url = "https://github.com/ninja-build/ninja/releases/download/v1.13.2/ninja-linux.zip" +url_api = "https://api.github.com/repos/ninja-build/ninja/releases/assets/318865358" + +[tools.ninja."platforms.macos-arm64"] +checksum = "sha256:c99048673aa765960a99cf10c6ddb9f1fad506099ff0a0e137ad8960a88f321b" +url = "https://github.com/ninja-build/ninja/releases/download/v1.13.2/ninja-mac.zip" +url_api = "https://api.github.com/repos/ninja-build/ninja/releases/assets/318863524" + +[tools.ninja."platforms.macos-x64"] +checksum = "sha256:c99048673aa765960a99cf10c6ddb9f1fad506099ff0a0e137ad8960a88f321b" +url = "https://github.com/ninja-build/ninja/releases/download/v1.13.2/ninja-mac.zip" +url_api = "https://api.github.com/repos/ninja-build/ninja/releases/assets/318863524" + +[tools.ninja."platforms.windows-x64"] +checksum = "sha256:07fc8261b42b20e71d1720b39068c2e14ffcee6396b76fb7a795fb460b78dc65" +url = "https://github.com/ninja-build/ninja/releases/download/v1.13.2/ninja-win.zip" +url_api = "https://api.github.com/repos/ninja-build/ninja/releases/assets/318863577" + +[[tools.prek]] +version = "0.4.12" +backend = "aqua:j178/prek" + +[tools.prek."platforms.linux-arm64"] +checksum = "sha256:f3be7601f991e05f161023d231198d966ea2afdb6bc6dd15d253d751674d6ab1" +url = "https://github.com/j178/prek/releases/download/v0.4.12/prek-aarch64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/j178/prek/releases/assets/499978731" +provenance = "github-attestations" + +[tools.prek."platforms.linux-arm64-musl"] +checksum = "sha256:f3be7601f991e05f161023d231198d966ea2afdb6bc6dd15d253d751674d6ab1" +url = "https://github.com/j178/prek/releases/download/v0.4.12/prek-aarch64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/j178/prek/releases/assets/499978731" +provenance = "github-attestations" + +[tools.prek."platforms.linux-x64"] +checksum = "sha256:3321ec6e4d873fbf41bef55d11b3f269fa91cbb87b19f18211df7c1bd061ac8a" +url = "https://github.com/j178/prek/releases/download/v0.4.12/prek-x86_64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/j178/prek/releases/assets/499978791" +provenance = "github-attestations" + +[tools.prek."platforms.linux-x64-musl"] +checksum = "sha256:3321ec6e4d873fbf41bef55d11b3f269fa91cbb87b19f18211df7c1bd061ac8a" +url = "https://github.com/j178/prek/releases/download/v0.4.12/prek-x86_64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/j178/prek/releases/assets/499978791" +provenance = "github-attestations" + +[tools.prek."platforms.macos-arm64"] +checksum = "sha256:cef66b9641a1c9ac61518edb13c2a7b440f3f1748e4bd60f2514a82bc1f2bd30" +url = "https://github.com/j178/prek/releases/download/v0.4.12/prek-aarch64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/j178/prek/releases/assets/499978720" +provenance = "github-attestations" + +[tools.prek."platforms.macos-x64"] +checksum = "sha256:783bf6b8d036e80cd43dd7c037d0888648c249f9c3c6045f0dd6eb135e11556e" +url = "https://github.com/j178/prek/releases/download/v0.4.12/prek-x86_64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/j178/prek/releases/assets/499978780" +provenance = "github-attestations" + +[tools.prek."platforms.windows-x64"] +checksum = "sha256:1ea049702009636296ca845e91b336aeb203d47df8ce500eb388672c8199d57b" +url = "https://github.com/j178/prek/releases/download/v0.4.12/prek-x86_64-pc-windows-msvc.zip" +url_api = "https://api.github.com/repos/j178/prek/releases/assets/499978783" +provenance = "github-attestations" + +[[tools.ruff]] +version = "0.16.1" +backend = "aqua:astral-sh/ruff" + +[tools.ruff."platforms.linux-arm64"] +checksum = "sha256:5929d9f37fc518a3825f33a76ad8092c0555ca045ca1dbf5e680038a402c840c" +url = "https://github.com/astral-sh/ruff/releases/download/0.16.1/ruff-aarch64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/495779006" +provenance = "github-attestations" + +[tools.ruff."platforms.linux-arm64-musl"] +checksum = "sha256:5929d9f37fc518a3825f33a76ad8092c0555ca045ca1dbf5e680038a402c840c" +url = "https://github.com/astral-sh/ruff/releases/download/0.16.1/ruff-aarch64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/495779006" +provenance = "github-attestations" + +[tools.ruff."platforms.linux-x64"] +checksum = "sha256:23469683052cd2db1589f15032dd1751b2a3f212062e9fc901b0776d25fb36bc" +url = "https://github.com/astral-sh/ruff/releases/download/0.16.1/ruff-x86_64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/495779139" +provenance = "github-attestations" + +[tools.ruff."platforms.linux-x64-musl"] +checksum = "sha256:23469683052cd2db1589f15032dd1751b2a3f212062e9fc901b0776d25fb36bc" +url = "https://github.com/astral-sh/ruff/releases/download/0.16.1/ruff-x86_64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/495779139" +provenance = "github-attestations" + +[tools.ruff."platforms.macos-arm64"] +checksum = "sha256:a8df4e8e9f22e3b0ae0b9f165ddaafb7e34df692197a6c1a361e7426f90681d5" +url = "https://github.com/astral-sh/ruff/releases/download/0.16.1/ruff-aarch64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/495778992" +provenance = "github-attestations" + +[tools.ruff."platforms.macos-x64"] +checksum = "sha256:00396fb9db4cb04e07ad277e6b10d845e6767f0a2aae67e1a57aa65fa01334f0" +url = "https://github.com/astral-sh/ruff/releases/download/0.16.1/ruff-x86_64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/495779121" +provenance = "github-attestations" + +[tools.ruff."platforms.windows-x64"] +checksum = "sha256:f37898d133acba7df8cbd130abc3b58b98243d7f3ab751087193dde8887955c4" +url = "https://github.com/astral-sh/ruff/releases/download/0.16.1/ruff-x86_64-pc-windows-msvc.zip" +url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/495779128" +provenance = "github-attestations" + +[[tools.rust]] +version = "stable" +backend = "core:rust" + +[tools.rust.options] +components = "clippy,rustfmt" + +[[tools.ty]] +version = "0.0.71" +backend = "aqua:astral-sh/ty" + +[tools.ty."platforms.linux-arm64"] +checksum = "sha256:e871417144b8996168f5c29f1d2552ac5b2ad838306c778cdef3a8f3d3a4631f" +url = "https://github.com/astral-sh/ty/releases/download/0.0.71/ty-aarch64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/ty/releases/assets/512259670" +provenance = "github-attestations" + +[tools.ty."platforms.linux-arm64-musl"] +checksum = "sha256:e871417144b8996168f5c29f1d2552ac5b2ad838306c778cdef3a8f3d3a4631f" +url = "https://github.com/astral-sh/ty/releases/download/0.0.71/ty-aarch64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/ty/releases/assets/512259670" +provenance = "github-attestations" + +[tools.ty."platforms.linux-x64"] +checksum = "sha256:c4396992f52a8401b8bae623e66d287edf33c2c03d9ad31d1b7fd72326243066" +url = "https://github.com/astral-sh/ty/releases/download/0.0.71/ty-x86_64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/ty/releases/assets/512259728" +provenance = "github-attestations" + +[tools.ty."platforms.linux-x64-musl"] +checksum = "sha256:c4396992f52a8401b8bae623e66d287edf33c2c03d9ad31d1b7fd72326243066" +url = "https://github.com/astral-sh/ty/releases/download/0.0.71/ty-x86_64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/ty/releases/assets/512259728" +provenance = "github-attestations" + +[tools.ty."platforms.macos-arm64"] +checksum = "sha256:9b59a9bd1ea39318de73684899b7787d6a23c04d0c1e48b8463ababc127ec307" +url = "https://github.com/astral-sh/ty/releases/download/0.0.71/ty-aarch64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/ty/releases/assets/512259653" +provenance = "github-attestations" + +[tools.ty."platforms.macos-x64"] +checksum = "sha256:a25c9a8a4feaf10cb6a15264c23de2d35e7af4db88d1ffe8e5994ca2befb41a9" +url = "https://github.com/astral-sh/ty/releases/download/0.0.71/ty-x86_64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/ty/releases/assets/512259715" +provenance = "github-attestations" + +[tools.ty."platforms.windows-x64"] +checksum = "sha256:8bcb2ca989be239d4f0cafaf6da07564069a57b434f5041569359319dd9fc9a0" +url = "https://github.com/astral-sh/ty/releases/download/0.0.71/ty-x86_64-pc-windows-msvc.zip" +url_api = "https://api.github.com/repos/astral-sh/ty/releases/assets/512259718" +provenance = "github-attestations" + +[[tools.uv]] +version = "0.12.3" +backend = "aqua:astral-sh/uv" + +[tools.uv."platforms.linux-arm64"] +checksum = "sha256:fa513fca1eb2913334c944fe9adbdd410274a1cbe8dd05d03699a9eb85311d4e" +url = "https://github.com/astral-sh/uv/releases/download/0.12.3/uv-aarch64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/505387718" +provenance = "github-attestations" + +[tools.uv."platforms.linux-arm64-musl"] +checksum = "sha256:fa513fca1eb2913334c944fe9adbdd410274a1cbe8dd05d03699a9eb85311d4e" +url = "https://github.com/astral-sh/uv/releases/download/0.12.3/uv-aarch64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/505387718" +provenance = "github-attestations" + +[tools.uv."platforms.linux-x64"] +checksum = "sha256:0643b9fb8c9fb27458e709ce6ff939695013c41975ff7b02d3f3b138d8d4bdb3" +url = "https://github.com/astral-sh/uv/releases/download/0.12.3/uv-x86_64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/505387821" +provenance = "github-attestations" + +[tools.uv."platforms.linux-x64-musl"] +checksum = "sha256:0643b9fb8c9fb27458e709ce6ff939695013c41975ff7b02d3f3b138d8d4bdb3" +url = "https://github.com/astral-sh/uv/releases/download/0.12.3/uv-x86_64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/505387821" +provenance = "github-attestations" + +[tools.uv."platforms.macos-arm64"] +checksum = "sha256:546f7f8a6c70ff13a3a9d2bc958db3427298cebf3e0cb756f9177133b7068843" +url = "https://github.com/astral-sh/uv/releases/download/0.12.3/uv-aarch64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/505387707" +provenance = "github-attestations" + +[tools.uv."platforms.macos-x64"] +checksum = "sha256:4c9f52262a14da336e4a42ed24992d12d0c956acde87619e4611d321dffa602b" +url = "https://github.com/astral-sh/uv/releases/download/0.12.3/uv-x86_64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/505387807" +provenance = "github-attestations" + +[tools.uv."platforms.windows-x64"] +checksum = "sha256:b23350c79e8ad0192b8124af13a0f17e8d4e4549524785e1aef389ae5a06990e" +url = "https://github.com/astral-sh/uv/releases/download/0.12.3/uv-x86_64-pc-windows-msvc.zip" +url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/505387809" +provenance = "github-attestations" diff --git a/mise.toml b/mise.toml new file mode 100644 index 0000000..dc9b044 --- /dev/null +++ b/mise.toml @@ -0,0 +1,53 @@ +[settings] +lockfile = true + +[tools] +rust = { version = "stable", components = ["rustfmt", "clippy"] } +uv = "0.12.3" +cmake = "4.4.2" +ninja = "1.13.2" +clang = "22.1.8" +ruff = "0.16.1" +ty = "0.0.71" +prek = "0.4.12" + +[task_config] +includes = [ + "docs/tasks.toml", + "codegen/tasks.toml", + "targets/ptfkit-native/tasks.toml", + "targets/ptfkit-py/tasks.toml", + "targets/ptfkit-rs/tasks.toml", +] + +[tasks.validate] +description = "Validate all PTF specifications without generating targets" +dir = "codegen" +run = "cargo run validate" + +[tasks.generate] +description = "Generate target sources from validated PTF specifications" +dir = "codegen" +run = "cargo run generate" + +[tasks.generate-check] +description = "Regenerate codegen-owned files and fail on output drift" +dir = "codegen" +run = "cargo run check-generated" + +[tasks.version] +description = "Set the package version and refresh dependent lockfiles" +usage = 'arg "" help="Package version"' +run = [ + 'cargo run --manifest-path codegen/Cargo.toml -- version "{{ usage.version }}"', + "cargo check --manifest-path targets/ptfkit-rs/Cargo.toml --quiet", + "uv lock --project targets/ptfkit-py", +] + +[tasks.test] +description = "Run the complete target test suite" +depends = ["codegen:test", "native:test", "python:test", "rust:test"] + +[tasks.verify] +description = "Run all component verification suites" +depends = ["codegen:verify", "native:verify", "python:verify", "rust:verify"] diff --git a/ruff.toml b/ruff.toml index 6425c4a..382dc73 100644 --- a/ruff.toml +++ b/ruff.toml @@ -19,4 +19,3 @@ quote-style = "single" [lint.isort] lines-after-imports = 2 -known-first-party = ["ptfkit"] diff --git a/targets/ptfkit-native/README.md b/targets/ptfkit-native/README.md index 1d633d1..4592633 100644 --- a/targets/ptfkit-native/README.md +++ b/targets/ptfkit-native/README.md @@ -7,9 +7,14 @@ The native ptfkit distribution provides: ## Install from a release archive -Versioned native source archives are attached to each [GitHub Release](https://github.com/AgroDT/ptfkit/releases). For a release `vX.Y.Z`, download `ptfkit-native-X.Y.Z.tar.gz`, extract the archive, and build it with CMake. A matching `.sha256` file is provided for optional checksum verification. - -The archives are generated by the release workflow and carry GitHub build-provenance attestations. +Versioned native source archives are attached to each +[GitHub Release](https://github.com/AgroDT/ptfkit/releases). +For a release `vX.Y.Z`, download `ptfkit-native-X.Y.Z.tar.gz`, extract the +archive, and build it with CMake. A matching `.sha256` file is provided for +optional checksum verification. + +The archives are generated by the release workflow and carry GitHub +build-provenance attestations. ## Build and install diff --git a/targets/ptfkit-native/justfile b/targets/ptfkit-native/justfile deleted file mode 100644 index 85d8a89..0000000 --- a/targets/ptfkit-native/justfile +++ /dev/null @@ -1,37 +0,0 @@ -set default-list := true -set unstable -set lists - -[windows] -set shell := ["powershell.exe", "-NoLogo", "-Command"] - -build_dir := 'build' -cmake_generator := if which("ninja") { - "Ninja" -} else { - [] -} - -# Configure the native build with tests enabled. -[env("CMAKE_GENERATOR", cmake_generator)] -configure: - cmake -S . -B "{{build_dir}}" -DBUILD_TESTING=ON - -# Build the native target. -build: configure - cmake --build "{{build_dir}}" - -# Build and run native CTest tests. -test: build - ctest --test-dir "{{build_dir}}" --output-on-failure - -# Check C and C++ source formatting. -format: - git ls-files -z -- '*.c' '*.h' '*.cc' '*.cpp' '*.cppm' '*.cxx' '*.hpp' | xargs -0 --no-run-if-empty clang-format --style=file --dry-run --Werror - -# Run all native target quality checks. -verify: format test - -# Remove generated native build artifacts. -clean: - rm -rf "{{build_dir}}" diff --git a/targets/ptfkit-native/tasks.toml b/targets/ptfkit-native/tasks.toml new file mode 100644 index 0000000..61e1247 --- /dev/null +++ b/targets/ptfkit-native/tasks.toml @@ -0,0 +1,30 @@ +["native:configure"] +description = "Configure the native build with tests enabled" +dir = "targets/ptfkit-native" +run = 'cmake -S . -B build -GNinja -DBUILD_TESTING=ON' + +["native:build"] +description = "Build the native target" +depends = ["native:configure"] +dir = "targets/ptfkit-native" +run = 'cmake --build build' + +["native:test"] +description = "Build and run native CTest tests" +depends = ["native:build"] +dir = "targets/ptfkit-native" +run = 'ctest --test-dir build --output-on-failure' + +["native:format"] +description = "Check C and C++ source formatting" +run = "git ls-files -z -- '*.c' '*.h' '*.cc' '*.cpp' '*.cppm' '*.cxx' '*.hpp' | xargs -0 --no-run-if-empty clang-format --style=file --dry-run --Werror" +run_windows = "& { $files = git ls-files -- '*.c' '*.h' '*.cc' '*.cpp' '*.cppm' '*.cxx' '*.hpp'; if ($files) { clang-format --style=file --dry-run --Werror $files } }" + +["native:verify"] +description = "Run all native target quality checks" +depends = ["native:format", "native:test"] + +["native:clean"] +description = "Remove native build artifacts" +dir = "targets/ptfkit-native" +run = "cmake -E rm -rf build" diff --git a/targets/ptfkit-py/justfile b/targets/ptfkit-py/justfile deleted file mode 100644 index b758469..0000000 --- a/targets/ptfkit-py/justfile +++ /dev/null @@ -1,47 +0,0 @@ -set default-list := true - -[windows] -set shell := ["powershell.exe", "-NoLogo", "-Command"] - -# Synchronize the locked Python development environment. -sync: - uv sync --frozen --all-groups - -# Verify that the Python lockfile is current. -lock: - uv lock --check - -# Build Python source and wheel distributions. -build: - uv build - -# Run the Python test suite. -test: - uv run --no-sync pytest - -# Run Ruff lint checks. -lint: - uv run --no-sync ruff check - -# Apply safe Ruff lint fixes. -lint-fix: - uv run --no-sync ruff check --fix - -# Check Python formatting with Ruff. -format: - uv run --no-sync ruff format --check - -# Apply Python formatting with Ruff. -format-fix: - uv run --no-sync ruff format - -# Run static type checking with ty. -typecheck: - uv run --no-sync ty check - -# Apply ty type-checking fixes. -typecheck-fix: - uv run --no-sync ty check --fix - -# Run all Python target quality checks. -verify: lint format typecheck test diff --git a/targets/ptfkit-py/pyproject.toml b/targets/ptfkit-py/pyproject.toml index 5da4c61..2171aef 100644 --- a/targets/ptfkit-py/pyproject.toml +++ b/targets/ptfkit-py/pyproject.toml @@ -46,11 +46,8 @@ Documentation = "https://agrodt.github.io/ptfkit/" [dependency-groups] dev = [ - "pre-commit~=4.5", "pytest~=9.0", "pytest-cov~=7.0", - "ruff~=0.14", - "ty~=0.0.71", ] [[tool.dynamic-metadata]] @@ -58,9 +55,6 @@ provider = "scikit_build_core.metadata.regex" field = "version" input = "src/ptfkit/_version.py" -[tool.ruff] -extend = "../../ruff.toml" - [tool.pytest.ini_options] addopts = "--cov=ptfkit" testpaths = ["tests"] diff --git a/targets/ptfkit-py/ruff.toml b/targets/ptfkit-py/ruff.toml new file mode 100644 index 0000000..2db4c47 --- /dev/null +++ b/targets/ptfkit-py/ruff.toml @@ -0,0 +1,7 @@ +extend = "../../ruff.toml" + +[lint.isort] +known-first-party = ["ptfkit", "_helpers"] + +[lint.per-file-ignores] +"tests/**.py" = ["ANN201", "INP001", "PLR2004", "S101"] diff --git a/targets/ptfkit-py/tasks.toml b/targets/ptfkit-py/tasks.toml new file mode 100644 index 0000000..a048fab --- /dev/null +++ b/targets/ptfkit-py/tasks.toml @@ -0,0 +1,53 @@ +["python:sync"] +description = "Synchronize the locked Python development environment" +dir = "targets/ptfkit-py" +run = "uv sync --frozen --all-groups" + +["python:lock"] +description = "Verify that the Python lockfile is current" +dir = "targets/ptfkit-py" +run = "uv lock --check" + +["python:build"] +description = "Build Python source and wheel distributions" +dir = "targets/ptfkit-py" +run = "uv build" + +["python:test"] +description = "Run the Python test suite" +dir = "targets/ptfkit-py" +run = "uv run --no-sync pytest" + +["python:lint"] +description = "Run Ruff lint checks for the Python target" +dir = "targets/ptfkit-py" +run = "ruff check" + +["python:lint-fix"] +description = "Apply safe Ruff lint fixes for the Python target" +dir = "targets/ptfkit-py" +run = "ruff check --fix" + +["python:format"] +description = "Check Python target formatting" +dir = "targets/ptfkit-py" +run = "ruff format --check" + +["python:format-fix"] +description = "Format the Python target" +dir = "targets/ptfkit-py" +run = "ruff format" + +["python:typecheck"] +description = "Run ty for the Python target" +dir = "targets/ptfkit-py" +run = "ty check" + +["python:typecheck-fix"] +description = "Apply ty fixes for the Python target" +dir = "targets/ptfkit-py" +run = "ty check --fix" + +["python:verify"] +description = "Run all Python target quality checks" +depends = ["python:lint", "python:format", "python:typecheck", "python:test"] diff --git a/targets/ptfkit-py/tests/ruff.toml b/targets/ptfkit-py/tests/ruff.toml deleted file mode 100644 index 016f28d..0000000 --- a/targets/ptfkit-py/tests/ruff.toml +++ /dev/null @@ -1,4 +0,0 @@ -extend = "../../../ruff.toml" - -[lint] -ignore = ["ANN201", "PLR2004", "S101"] diff --git a/targets/ptfkit-py/uv.lock b/targets/ptfkit-py/uv.lock index cac14e9..951db66 100644 --- a/targets/ptfkit-py/uv.lock +++ b/targets/ptfkit-py/uv.lock @@ -6,15 +6,6 @@ resolution-markers = [ "python_full_version < '3.12'", ] -[[package]] -name = "cfgv" -version = "3.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz", hash = "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132", size = 7334, upload-time = "2025-11-19T20:55:51.612Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", hash = "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0", size = 7445, upload-time = "2025-11-19T20:55:50.744Z" }, -] - [[package]] name = "colorama" version = "0.4.6" @@ -113,33 +104,6 @@ toml = [ { name = "tomli", marker = "python_full_version <= '3.11'" }, ] -[[package]] -name = "distlib" -version = "0.4.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c9/02/bd72be9134d25ed783ecbbc38a539ffaefbf90c78418c7fb7229600dbac7/distlib-0.4.3.tar.gz", hash = "sha256:f152097224a0ae24be5a0f6bae1b9359af82133bce63f98a95f86cae1aede9ed", size = 615141, upload-time = "2026-06-12T08:04:52.847Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/02/08/9c41fb51ab5b43eb21674aff13df270e8ba6c4b29c8624e328dc7a9482af/distlib-0.4.3-py2.py3-none-any.whl", hash = "sha256:4b0ce306c966eb73bc3a7b6abad017c556dadd92c44701562cd528ac7fde4d5b", size = 470628, upload-time = "2026-06-12T08:04:50.506Z" }, -] - -[[package]] -name = "filelock" -version = "3.32.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/57/3ba6e6cb097f85b855b00163d169f35365f44277df044dcf96d55b8f62a3/filelock-3.32.2.tar.gz", hash = "sha256:c33351e1f49cae33414acbc6d56784e6ecee82514ec90795da1161fc4836b5b8", size = 217172, upload-time = "2026-07-29T22:46:04.895Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/e8/72f8cef9fdfeffe06213fe8508039396ee48daa0e3259457ed766173bfd6/filelock-3.32.2-py3-none-any.whl", hash = "sha256:87dd94cf281e586d135fa51132b8e3d9a598b316e90377a288663c9321036c82", size = 98830, upload-time = "2026-07-29T22:46:03.52Z" }, -] - -[[package]] -name = "identify" -version = "2.6.19" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/63/51723b5f116cc04b061cb6f5a561790abf249d25931d515cd375e063e0f4/identify-2.6.19.tar.gz", hash = "sha256:6be5020c38fcb07da56c53733538a3081ea5aa70d36a156f83044bfbf9173842", size = 99567, upload-time = "2026-04-17T18:39:50.265Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl", hash = "sha256:20e6a87f786f768c092a721ad107fc9df0eb89347be9396cadf3f4abbd1fb78a", size = 99397, upload-time = "2026-04-17T18:39:49.221Z" }, -] - [[package]] name = "iniconfig" version = "2.3.0" @@ -149,15 +113,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] -[[package]] -name = "nodeenv" -version = "1.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, -] - [[package]] name = "numpy" version = "2.4.6" @@ -303,15 +258,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, ] -[[package]] -name = "platformdirs" -version = "4.11.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/78/9b/560e4be8e26f6fd133a03630a8df0c663b9e8d61b4ade152b72005aec83b/platformdirs-4.11.0.tar.gz", hash = "sha256:0555d18370482847566ffabcaa53ad7c6c1c29f195989ae1ed634a05f76ea1e0", size = 31953, upload-time = "2026-07-21T13:09:36.565Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/68/d8d58938dfb1370b266a1a729e6d77a985be23689a0496498ee17b2cbf90/platformdirs-4.11.0-py3-none-any.whl", hash = "sha256:360ccded2b7fce0af0ff80cc8f5942a1c5d99b0e856033acb030bfc634709e74", size = 23247, upload-time = "2026-07-21T13:09:35.422Z" }, -] - [[package]] name = "pluggy" version = "1.6.0" @@ -321,22 +267,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] -[[package]] -name = "pre-commit" -version = "4.6.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cfgv" }, - { name = "identify" }, - { name = "nodeenv" }, - { name = "pyyaml" }, - { name = "virtualenv" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/25/3a/ddb78f32a0814e66b18a099377a106a2dcdce92d86a034d69d65df9b256e/pre_commit-4.6.1.tar.gz", hash = "sha256:03e809865c7d178b9979d06c761fcbfe6808fdaded8581a745bb110e52050421", size = 198646, upload-time = "2026-07-21T20:56:58.225Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/49/bc925106abcdac498074f2cbe6137e94e09f418dd2b7775df5b577dc0313/pre_commit-4.6.1-py2.py3-none-any.whl", hash = "sha256:0e3b2942510d1fb34eec167a3ec57331bf8442122f1153a9fb8b58f5c49b2717", size = 226186, upload-time = "2026-07-21T20:56:57.064Z" }, -] - [[package]] name = "ptfkit" source = { editable = "." } @@ -347,11 +277,8 @@ dependencies = [ [package.dev-dependencies] dev = [ - { name = "pre-commit" }, { name = "pytest" }, { name = "pytest-cov" }, - { name = "ruff" }, - { name = "ty" }, ] [package.metadata] @@ -359,11 +286,8 @@ requires-dist = [{ name = "numpy", specifier = ">=2.0,<3" }] [package.metadata.requires-dev] dev = [ - { name = "pre-commit", specifier = "~=4.5" }, { name = "pytest", specifier = "~=9.0" }, { name = "pytest-cov", specifier = "~=7.0" }, - { name = "ruff", specifier = "~=0.14" }, - { name = "ty", specifier = "~=0.0.71" }, ] [[package]] @@ -405,99 +329,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", hash = "sha256:a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678", size = 22876, upload-time = "2026-03-21T20:11:14.438Z" }, ] -[[package]] -name = "python-discovery" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "filelock" }, - { name = "platformdirs" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f1/51/276f964496a5714ab9f320896195639086881c2b39c03b5ad13de84acbb8/python_discovery-1.5.0.tar.gz", hash = "sha256:3e014c6327154d3dda27939a9a0dc9c5c000439f1906d3f303b48f984bd2ecef", size = 72483, upload-time = "2026-07-21T13:14:14.641Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/7b/14882602ddee241d7984a742fcb423cb4a30fb0d6efc546ac3129fba475a/python_discovery-1.5.0-py3-none-any.whl", hash = "sha256:70c4fc61b4e7404e44f01d6fc44a715c4d685ca6cea83d295922f05891877c98", size = 34205, upload-time = "2026-07-21T13:14:13.398Z" }, -] - -[[package]] -name = "pyyaml" -version = "6.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, - { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, - { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, - { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, - { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, - { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, - { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, - { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, - { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, - { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, - { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, - { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, - { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, - { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, - { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, - { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, - { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, - { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, - { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, - { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, - { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, - { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, - { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, - { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, - { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, - { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, - { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, - { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, - { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, - { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, - { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, - { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, - { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, - { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, - { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, - { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, - { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, - { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, - { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, - { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, - { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, - { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, - { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, - { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, -] - -[[package]] -name = "ruff" -version = "0.16.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/70/25/7113f6d5498888c5fb7db34081cba7d5971c4cb1bfb26819966eee68f003/ruff-0.16.1.tar.gz", hash = "sha256:fedad7c801dabd3fb9741d76aca39246e6ddd9ca446a015875207bf19f1e6bc7", size = 4877500, upload-time = "2026-07-30T19:37:01.379Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/bd/694da69368e0973de65df2ddc73ab18d43c469d5963d9b150911de6bc513/ruff-0.16.1-py3-none-linux_armv6l.whl", hash = "sha256:58edb313b88f0c5460a26adf5f39a37a3be789494a15e3e411e35fa78b89f9a0", size = 10839126, upload-time = "2026-07-30T19:36:13.697Z" }, - { url = "https://files.pythonhosted.org/packages/3f/f0/b626e5d5bd0dd9576263658ef12885e2288afd1029a48e26ffed65ec1ac1/ruff-0.16.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:fde5a99e2f97479af66edd6622c6d5a2a7592c77cf4153d9e4428f5eeb55b60c", size = 11070253, upload-time = "2026-07-30T19:36:17.14Z" }, - { url = "https://files.pythonhosted.org/packages/83/63/f40acfb6b35b88623e71684942b552c3edd96035f5d98f313815f7b277de/ruff-0.16.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e0d4c20532fca4f7fa609369161d968dd28f65d83dabbd61d8e9c7edbf7001f6", size = 10561425, upload-time = "2026-07-30T19:36:20.04Z" }, - { url = "https://files.pythonhosted.org/packages/aa/dd/14ec0e9c2b4d315547dd38765004b4863e354e1b52cb308272215d9f6f6d/ruff-0.16.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30affbcedf59ad5703d9c91f82266e02b47739f797e1a7b6e158e5526a6dae38", size = 10948879, upload-time = "2026-07-30T19:36:22.476Z" }, - { url = "https://files.pythonhosted.org/packages/33/e9/9d870cbae575030fdef595f04b4b97573c525b5497cce4f4498cf2f85446/ruff-0.16.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24e9c631573cbca9d20f1283f8f479b2afa4a8503504822bd71a293889f16743", size = 10643691, upload-time = "2026-07-30T19:36:24.914Z" }, - { url = "https://files.pythonhosted.org/packages/c4/09/12743d544e2173f53ecd27217c65f90d2bc0f8424a66a60339e56bbc0457/ruff-0.16.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b41bdd48fb420987a9b5212e4957c26ad4abce401fa9ea9d4d85843727945f4f", size = 11435354, upload-time = "2026-07-30T19:36:28.447Z" }, - { url = "https://files.pythonhosted.org/packages/7f/89/a1652b2daee52083c9554a6333b678a8b01d0400f976827bb87857f9449a/ruff-0.16.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b0d1e1393b7648079e13669de1c1f4fde06d4583e84d8fd5c1551e0a77a2aa75", size = 12259033, upload-time = "2026-07-30T19:36:31.326Z" }, - { url = "https://files.pythonhosted.org/packages/16/96/ecdcb8c54ee7b123b487f807eb014e6e019155a0b81dfb669acd52f28ce3/ruff-0.16.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07bf434b1c95f4e093be4532068ef4fcf00924eb2ade8796075980902d6fd54a", size = 11667981, upload-time = "2026-07-30T19:36:34.394Z" }, - { url = "https://files.pythonhosted.org/packages/cd/90/c52e12e0d862e9572f2a33aa227409143520abe53111e9a6babbac7b4af8/ruff-0.16.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39897739f112253ee4fdd2e8aa9a4f9ded99fb2be367d5f31dfa4ded6025584c", size = 11468183, upload-time = "2026-07-30T19:36:37.339Z" }, - { url = "https://files.pythonhosted.org/packages/2c/6b/4ffb7ad1d83eb16cf8cbb3c8815d3f11c88460fd162d4b372a2059be1c2a/ruff-0.16.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:82ae3c0c0d74daf17b968a10b7b3bb3ef297ab7de0c1f749646b25e690ccb150", size = 11470071, upload-time = "2026-07-30T19:36:39.91Z" }, - { url = "https://files.pythonhosted.org/packages/9c/72/32ae7db4c0b5e32ab611787caa19d1546800676d79f7483b7100a3561bf4/ruff-0.16.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4d5f2ed10f8242d83fc08d521301089364e3375375705356f20c0e31606ef3ef", size = 10919503, upload-time = "2026-07-30T19:36:42.65Z" }, - { url = "https://files.pythonhosted.org/packages/f7/ca/3d901ba6ad6fc38da39c3448fc6c59ac945679293a17c3ceb6d6c1cba13e/ruff-0.16.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a4665b309891f83f3e3c25447935f1213e9abbd4b5640af7a1f2def9f8d413c1", size = 10649861, upload-time = "2026-07-30T19:36:45.18Z" }, - { url = "https://files.pythonhosted.org/packages/92/79/894ef1ced26552d5f8c9cf6d85b0687840e1128c55aeab7b9c2d54a0d880/ruff-0.16.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:26e9ca5c9bc3971f20d3cf18a957f52ffd6a5f6564ff15c4912a144dcac22494", size = 11148137, upload-time = "2026-07-30T19:36:47.936Z" }, - { url = "https://files.pythonhosted.org/packages/2d/69/3609a09fa1cb46cc28b762363e440a354204e5dff01bd0c8d7437874d6b9/ruff-0.16.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:67e1e1e3fa4f0c82f0e36d4cd61e661f6e7a6196cb1aa92fe0828fa7b8f257cd", size = 11559211, upload-time = "2026-07-30T19:36:50.448Z" }, - { url = "https://files.pythonhosted.org/packages/fc/8a/fb22af2fd78a736e241fabf67e30ce1799a64244026377a49e133af90762/ruff-0.16.1-py3-none-win32.whl", hash = "sha256:d31765e131295b8445caf301e3e8a85b34d1b9b211b4109b7ba457888b051806", size = 10838258, upload-time = "2026-07-30T19:36:53.298Z" }, - { url = "https://files.pythonhosted.org/packages/d4/35/e57fd9fb5d423961df087a00b12d42c0a830288dc2f3b45ecca299158b4f/ruff-0.16.1-py3-none-win_amd64.whl", hash = "sha256:09b05e8b90c2cb06ad63464350e7a45e8e44a2dfe52072ebfba6666ca8d3f596", size = 11961111, upload-time = "2026-07-30T19:36:56.107Z" }, - { url = "https://files.pythonhosted.org/packages/cb/46/240ea004bf6dc4feb40e9832f2205a476a47dd5b8a3f8211a5fc5f95e20e/ruff-0.16.1-py3-none-win_arm64.whl", hash = "sha256:dbaadaac38c70239f056d306b7476f246b0bf000fa6b3876402acbf5b227eaf8", size = 11309414, upload-time = "2026-07-30T19:36:58.79Z" }, -] - [[package]] name = "tomli" version = "2.4.1" @@ -551,43 +382,3 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, ] - -[[package]] -name = "ty" -version = "0.0.71" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dd/e2/f6e716371b5913a31190db1ad250ac2b5c68b3ca2db71afeba3f98f5fe50/ty-0.0.71.tar.gz", hash = "sha256:c2a24f2745294946c27cef8cc012b84fb2db5405ecefddbe845be4162833da01", size = 6624721, upload-time = "2026-08-13T00:39:31.035Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/e4/8d6d17827c5335d0efe54241fb54fed3cb6ca2d2eca62f3f2382be196b91/ty-0.0.71-py3-none-linux_armv6l.whl", hash = "sha256:a309c9a35e69f45d7053e9205c7fe2295fac09e07e3a2fdb791524f30440a9cc", size = 12576435, upload-time = "2026-08-13T00:38:50.617Z" }, - { url = "https://files.pythonhosted.org/packages/d5/cb/d4c48832ee3d162abc6c834ba62242ec27630cb93014a0e1be82e86c3ee3/ty-0.0.71-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2d42e9ae4b754ce1f34dd1b545f1cdcfc8e704d7460b584c898be156f048828f", size = 12177806, upload-time = "2026-08-13T00:38:53.068Z" }, - { url = "https://files.pythonhosted.org/packages/f0/97/e04782c9eaa1a0b634830f61b0e18cd1b3415332143d45a28882802c8ea1/ty-0.0.71-py3-none-macosx_11_0_arm64.whl", hash = "sha256:4d0b1f2002adc03f3a53aeb70b5cafcea634bb48726d82a307b0f15580d2f74b", size = 12015265, upload-time = "2026-08-13T00:38:55.209Z" }, - { url = "https://files.pythonhosted.org/packages/4f/5c/d716b9049c11a7b85b3b74ec3547d2dbab9a261347a6558420dcae37083d/ty-0.0.71-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:165e6086363f5c149ae4acacfbc36eea0093552a60f4153ef48321e4a3a15c4c", size = 12119608, upload-time = "2026-08-13T00:38:57.336Z" }, - { url = "https://files.pythonhosted.org/packages/b8/78/560ce2d874467d50605b7783e19e45b571fea7a89f664bd0ccdf252adf8a/ty-0.0.71-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:067e16f80855afbda024e7ff6fa5ed3ada5290c403badc63800f0534bd617c04", size = 12353762, upload-time = "2026-08-13T00:38:59.729Z" }, - { url = "https://files.pythonhosted.org/packages/a3/7b/f6a22c0bf2c0dbfe20b7ce90b51bc09efa9a9e245f1c35e160e39ed5dea9/ty-0.0.71-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:416149a550bcb678e619b4e2cd1cca9066d28edc52df76ad9d3640b36e6b5bf1", size = 13088120, upload-time = "2026-08-13T00:39:02.34Z" }, - { url = "https://files.pythonhosted.org/packages/a3/95/6f5382781f2e4fa933296d303376c61b8b3475d58ed60125c54de665fd21/ty-0.0.71-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39e04c41e6d0e74f73cf8b3247d4dde3642ec38aeda7f4674110155b3da416a5", size = 13545140, upload-time = "2026-08-13T00:39:04.655Z" }, - { url = "https://files.pythonhosted.org/packages/6d/e7/8f0ad7b6c4804f8682e08fb161eaf710dd1765006b1b6df7c657b9707c95/ty-0.0.71-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fb696bdea4a3554a0d0a7bbb36e4c5f508acb2bbad435e91c7fc812c1de6bfb", size = 13266730, upload-time = "2026-08-13T00:39:06.858Z" }, - { url = "https://files.pythonhosted.org/packages/ac/06/b83158fdf1473c2486fba0de337a963e9cc21317ccaa3e54ab003d419737/ty-0.0.71-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3ec4ca9d4ba3e11ecc282c3d50d0730a2e181da7142734219d9f213fcbaaa00", size = 12673786, upload-time = "2026-08-13T00:39:09.281Z" }, - { url = "https://files.pythonhosted.org/packages/7c/9a/10f37c0550277722ac1d2c8096e492e0f3fc1aa2e587082439dd066fdb8d/ty-0.0.71-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:48a231253b32639ff4b19f74e476bacdba0150182603011d3792d1f1a335b932", size = 13140294, upload-time = "2026-08-13T00:39:11.659Z" }, - { url = "https://files.pythonhosted.org/packages/3b/e6/5710de1da7eb8aa755d289aa25316691e545b72b4ee2ab14172612eec1c9/ty-0.0.71-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:1a082f57d1fcbe209afdcacff37870defd4cea15ce69e2c6c652a9208462722f", size = 12171216, upload-time = "2026-08-13T00:39:14.382Z" }, - { url = "https://files.pythonhosted.org/packages/80/c5/8d9113e3cf0d4c6c0a9c9e088cee93e41facb278026bea6f6e12533b09dd/ty-0.0.71-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:cbe1c962f6c9e8964180cd171cc6ad35d687f74d51c07f60b670d3f1c5d58ffe", size = 12360626, upload-time = "2026-08-13T00:39:16.747Z" }, - { url = "https://files.pythonhosted.org/packages/7d/a0/0e167507c4c863814d3ea7602bde958baefd03346bd38bae3a430dff1ea9/ty-0.0.71-py3-none-musllinux_1_2_i686.whl", hash = "sha256:25f641b988916b3975e50b2a59cbc5179f2a466d181f207f3032e1e6bc617a88", size = 12637309, upload-time = "2026-08-13T00:39:19.14Z" }, - { url = "https://files.pythonhosted.org/packages/1d/c6/ff6719b91e4916985e9a92f9bddb10d9fe3cb3bdf5abf0f9019a67aebe21/ty-0.0.71-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:c5fe916b6e5b152ef4f583324e1efd770ac3316894776dc1b57c354cb767b8ee", size = 12937996, upload-time = "2026-08-13T00:39:21.533Z" }, - { url = "https://files.pythonhosted.org/packages/ee/3e/21a0873da8f1ece28e166fbbaf696cd48c55fd7cd203dba0266a1fe05ceb/ty-0.0.71-py3-none-win32.whl", hash = "sha256:a273fe0dcc453e94cf2e1955076efec8b739e6e1a890862de29d3c5a1c9ddaff", size = 11953321, upload-time = "2026-08-13T00:39:23.804Z" }, - { url = "https://files.pythonhosted.org/packages/69/fa/ce6614c748f7abfc546d12983d4bad1085116b6458b8c84d9372eb713f08/ty-0.0.71-py3-none-win_amd64.whl", hash = "sha256:65f5f980551ed79f68a0f6c0f2fb71b39a8d54ed0625d2529b01f6c919db72c5", size = 12570891, upload-time = "2026-08-13T00:39:26.346Z" }, - { url = "https://files.pythonhosted.org/packages/77/7f/0fb022535c66fd96e7dd2a1f9c14e3a0e39544a4c3f35a451e8835562730/ty-0.0.71-py3-none-win_arm64.whl", hash = "sha256:6d5552078b9934d359bd5f381dbcb160f1fc5addfca59a960021adca38a73741", size = 12338716, upload-time = "2026-08-13T00:39:28.987Z" }, -] - -[[package]] -name = "virtualenv" -version = "21.7.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "distlib" }, - { name = "filelock" }, - { name = "platformdirs" }, - { name = "python-discovery" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ea/fa/18004e5cb15541ad2a68ff219c755233b012b12d4ec8663d06a258082bec/virtualenv-21.7.1.tar.gz", hash = "sha256:d0dbfaa5483487baea28d7210ef8d24c9d1bd0f10f449eeb215568825a9b334e", size = 5525237, upload-time = "2026-07-30T15:40:36.36Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4b/a7/ded126c19495158a05c7202b3389139839d4cf78d622d453867778e0f7a8/virtualenv-21.7.1-py3-none-any.whl", hash = "sha256:6394973f990536e34c05157179146c020284c42fe01da1dfeb0ba16c345280d9", size = 5504576, upload-time = "2026-07-30T15:40:34.512Z" }, -] diff --git a/targets/ptfkit-rs/justfile b/targets/ptfkit-rs/justfile deleted file mode 100644 index 5a25fda..0000000 --- a/targets/ptfkit-rs/justfile +++ /dev/null @@ -1,19 +0,0 @@ -set default-list := true - -[windows] -set shell := ["powershell.exe", "-NoLogo", "-Command"] - -# Run Clippy with warnings treated as errors. -lint: - cargo clippy --all-targets -- -D warnings - -# Check Rust source formatting. -format: - cargo fmt --all --check - -# Run the Rust target test suite. -test: - cargo test - -# Run all Rust target quality checks. -verify: format lint test diff --git a/targets/ptfkit-rs/tasks.toml b/targets/ptfkit-rs/tasks.toml new file mode 100644 index 0000000..dd20852 --- /dev/null +++ b/targets/ptfkit-rs/tasks.toml @@ -0,0 +1,18 @@ +["rust:lint"] +description = "Run Clippy for the Rust target" +dir = "targets/ptfkit-rs" +run = "cargo clippy --all-targets -- -D warnings" + +["rust:format"] +description = "Check Rust target formatting" +dir = "targets/ptfkit-rs" +run = "cargo fmt --all --check" + +["rust:test"] +description = "Run the Rust target test suite" +dir = "targets/ptfkit-rs" +run = "cargo test" + +["rust:verify"] +description = "Run all Rust target quality checks" +depends = ["rust:format", "rust:lint", "rust:test"]