From a1f37f6b810d2faaf4db904c0cf1f2c50e91b6ea Mon Sep 17 00:00:00 2001 From: Michael Krasnyk Date: Mon, 6 Apr 2026 11:36:03 +0200 Subject: [PATCH] feat: add rust toolchain to packages based on required build backend --- .github/workflows/ci.yml | 6 + Dockerfile | 10 +- MODULE.bazel | 5 +- README.md | 2 +- docker-compose.yml | 38 ++++-- examples/markers/MODULE.bazel | 10 ++ examples/torch/gen/poetry.lock | 200 ++++++++++++++++---------------- examples/torch/pyproject.toml | 4 +- examples/torch/test.py | 3 +- examples/uv/.bazelrc | 6 +- examples/uv/pyproject.toml | 26 ++--- examples/uv/test.py | 6 + examples/uv/tools/bazel | 1 + examples/uv/tools/bazel.ps1 | 1 + examples/uv/uv.lock | 31 +++++ pyproject.toml | 2 +- python/private/BUILD.bazel | 3 + python/private/lock_parser.bzl | 2 +- python/private/lock_parser.py | 12 +- python/private/package_deps.bzl | 57 +++++---- python/private/package_deps.py | 10 ++ python/private/rust_packages.gz | Bin 0 -> 30975 bytes tools/bazel | 3 + tools/bazel.ps1 | 3 + 24 files changed, 281 insertions(+), 160 deletions(-) create mode 120000 examples/uv/tools/bazel create mode 120000 examples/uv/tools/bazel.ps1 create mode 100644 python/private/rust_packages.gz create mode 100755 tools/bazel create mode 100755 tools/bazel.ps1 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e6ca87de..63bf19d3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,6 +20,12 @@ jobs: cat /proc/cpuinfo sudo apt-get update sudo apt-get install -y postgresql postgresql-contrib + - os: ubuntu-24.04-arm + cache: ~/.cache/bazel + install: | + cat /proc/cpuinfo + sudo apt-get update + sudo apt-get install -y postgresql postgresql-contrib - os: macos-latest cache: /private/var/tmp/_bazel_runner install: | diff --git a/Dockerfile b/Dockerfile index 9d7cfff7..844b679f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,14 @@ FROM ubuntu:24.04 +ARG TARGETPLATFORM +ARG TARGETARCH + # Avoid interactive prompts ENV DEBIAN_FRONTEND=noninteractive # Update and install core packages -RUN --mount=type=cache,target=/var/lib/apt,id=$CACHE_ID/var/lib/apt \ - --mount=type=cache,target=/var/cache/apt,id=$CACHE_ID/var/cache/apt \ +RUN --mount=type=cache,target=/var/lib/apt,id=$TARGETPLATFORM/var/lib/apt \ + --mount=type=cache,target=/var/cache/apt,id=$TARGETPLATFORM/var/cache/apt \ apt-get update && apt-get install -y \ ca-certificates \ curl \ @@ -17,11 +20,12 @@ RUN --mount=type=cache,target=/var/lib/apt,id=$CACHE_ID/var/lib/apt \ python3 \ python3-pip \ sudo \ + tree \ wget \ unzip # Install Bazelisk -RUN curl -Lo /usr/local/bin/bazelisk https://github.com/bazelbuild/bazelisk/releases/latest/download/bazelisk-linux-amd64 \ +RUN curl -Lo /usr/local/bin/bazelisk https://github.com/bazelbuild/bazelisk/releases/latest/download/bazelisk-linux-$TARGETARCH \ && chmod +x /usr/local/bin/bazelisk \ && ln -s /usr/local/bin/bazelisk /usr/local/bin/bazel diff --git a/MODULE.bazel b/MODULE.bazel index 036c9be4..b63945a7 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -10,7 +10,7 @@ bazel_dep(name = "platforms", version = "1.0.0") bazel_dep(name = "rules_cc", version = "0.2.17") bazel_dep(name = "rules_multitool", version = "1.11.1") bazel_dep(name = "rules_python", version = "1.9.0") -bazel_dep(name = "rules_shell", version = "0.6.1") +bazel_dep(name = "rules_shell", version = "0.7.1") bazel_dep(name = "rules_rust", version = "0.69.0") python = use_extension("@rules_python//python/extensions:python.bzl", "python") @@ -25,3 +25,6 @@ use_repo(internal_deps, "ofiuco_defs", "ofiuco_pip", "ofiuco_poetry_deps") multitool = use_extension("@rules_multitool//multitool:extension.bzl", "multitool") multitool.hub(lockfile = "//python/private:uv.lock.json") use_repo(multitool, "multitool") + +rust = use_extension("@rules_rust//rust:extensions.bzl", "rust") +rust.toolchain(edition = "2026") diff --git a/README.md b/README.md index 2236a8a0..d887cdb2 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ python = use_extension("@rules_python//python/extensions:python.bzl", "python") python.toolchain(python_version = "3.13") use_repo(python, "python_3_13") -bazel_dep(name = "ofiuco", version = "0.8.4") +bazel_dep(name = "ofiuco", version = "0.9.0") parse = use_extension("@ofiuco//python:extensions.bzl", "parse") parse.lock( diff --git a/docker-compose.yml b/docker-compose.yml index 46e87f67..a1e00dc5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,25 +1,45 @@ services: - ofiuco: + + linux-amd64: build: context: . dockerfile: Dockerfile - container_name: ofiuco platform: linux/amd64 + container_name: ofiuco-linux-amd64 cap_add: - NET_ADMIN environment: - USER=${USER} - WORKSPACE=${PWD} - - HISTFILE=/home/fsw-dev/.cache/.bash_history + - HISTFILE=${HOME}/.cache/ofiuco-linux-amd64/.bash_history + - CACHE_DIR=${HOME}/.cache/ofiuco-linux-amd64/bazel volumes: - ${PWD}:${PWD}:rw - - ${HOME}/.gitconfig:/home/fsw-dev/.gitconfig:ro - - ${HOME}/.netrc:/home/fsw-dev/.netrc:ro - - ${HOME}/.ssh:/home/fsw-dev/.ssh:ro + - ${HOME}/.gitconfig:/home/ubuntu/.gitconfig:ro + - ${HOME}/.netrc:/home/ubuntu/.netrc:ro + - ${HOME}/.ssh:/home/ubuntu/.ssh:ro - ${HOME}/foss:${HOME}/foss - - ofiuco-cache:/home/fsw-dev/.cache + - ${HOME}/.cache/ofiuco-linux-amd64:${HOME}/.cache/ofiuco-linux-amd64 working_dir: ${PWD} entrypoint: sleep infinity + post_start: + - command: echo chown -R 1000:1000 {HOME}/.cache/ofiuco-linux-amd64 + user: root -volumes: - ofiuco-cache: + linux-aarch64: + extends: linux-amd64 + platform: linux/aarch64 + container_name: ofiuco-linux-aarch64 + environment: + - HISTFILE=${HOME}/.cache/ofiuco-linux-aarch64/.bash_history + - CACHE_DIR=${HOME}/.cache/ofiuco-linux-aarch64/bazel + volumes: !override + - ${PWD}:${PWD}:rw + - ${HOME}/.gitconfig:/home/ubuntu/.gitconfig:ro + - ${HOME}/.netrc:/home/ubuntu/.netrc:ro + - ${HOME}/.ssh:/home/ubuntu/.ssh:ro + - ${HOME}/foss:${HOME}/foss + - ${HOME}/.cache/ofiuco-linux-aarch64:${HOME}/.cache/ofiuco-linux-aarch64 + post_start: !reset + - command: echo chown -R 1000:1000 ${HOME}/.cache/ofiuco-linux-aarch64 + user: root diff --git a/examples/markers/MODULE.bazel b/examples/markers/MODULE.bazel index d2f82b5b..dd05f493 100644 --- a/examples/markers/MODULE.bazel +++ b/examples/markers/MODULE.bazel @@ -22,6 +22,16 @@ parse.lock( name = "python", lock = "//:poetry.lock", platforms = { + python_version + "_aarch64-unknown-linux-gnu": "{" + ",".join( + [ + '"python_full_version": "{}"'.format(python_full_version), + '"os_name": "posix"', + '"platform_machine": "arm64"', + '"platform_system": "Windows"', + '"platform_tags": ["manylinux_2_17_aarch64"]', + '"sys_platform": "linux"', + ], + ) + "}", python_version + "_x86_64-unknown-linux-gnu": "{" + ",".join( [ '"python_full_version": "{}"'.format(python_full_version), diff --git a/examples/torch/gen/poetry.lock b/examples/torch/gen/poetry.lock index d242cdfb..dd25c85d 100644 --- a/examples/torch/gen/poetry.lock +++ b/examples/torch/gen/poetry.lock @@ -31,14 +31,14 @@ files = [ [[package]] name = "fsspec" -version = "2026.2.0" +version = "2026.3.0" description = "File-system specification" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "fsspec-2026.2.0-py3-none-any.whl", hash = "sha256:98de475b5cb3bd66bedd5c4679e87b4fdfe1a3bf4d707b151b3c07e58c9a2437"}, - {file = "fsspec-2026.2.0.tar.gz", hash = "sha256:6544e34b16869f5aacd5b90bdf1a71acb37792ea3ddf6125ee69a22a53fb8bff"}, + {file = "fsspec-2026.3.0-py3-none-any.whl", hash = "sha256:d2ceafaad1b3457968ed14efa28798162f1638dbb5d2a6868a2db002a5ee39a4"}, + {file = "fsspec-2026.3.0.tar.gz", hash = "sha256:1ee6a0e28677557f8c2f994e3eea77db6392b4de9cd1f5d7a9e87a0ae9d01b41"}, ] [package.extras] @@ -465,103 +465,103 @@ files = [ [[package]] name = "pillow" -version = "12.1.1" +version = "12.2.0" description = "Python Imaging Library (fork)" optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "pillow-12.1.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f1625b72740fdda5d77b4def688eb8fd6490975d06b909fd19f13f391e077e0"}, - {file = "pillow-12.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:178aa072084bd88ec759052feca8e56cbb14a60b39322b99a049e58090479713"}, - {file = "pillow-12.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b66e95d05ba806247aaa1561f080abc7975daf715c30780ff92a20e4ec546e1b"}, - {file = "pillow-12.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89c7e895002bbe49cdc5426150377cbbc04767d7547ed145473f496dfa40408b"}, - {file = "pillow-12.1.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a5cbdcddad0af3da87cb16b60d23648bc3b51967eb07223e9fed77a82b457c4"}, - {file = "pillow-12.1.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f51079765661884a486727f0729d29054242f74b46186026582b4e4769918e4"}, - {file = "pillow-12.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:99c1506ea77c11531d75e3a412832a13a71c7ebc8192ab9e4b2e355555920e3e"}, - {file = "pillow-12.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:36341d06738a9f66c8287cf8b876d24b18db9bd8740fa0672c74e259ad408cff"}, - {file = "pillow-12.1.1-cp310-cp310-win32.whl", hash = "sha256:6c52f062424c523d6c4db85518774cc3d50f5539dd6eed32b8f6229b26f24d40"}, - {file = "pillow-12.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6008de247150668a705a6338156efb92334113421ceecf7438a12c9a12dab23"}, - {file = "pillow-12.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:1a9b0ee305220b392e1124a764ee4265bd063e54a751a6b62eff69992f457fa9"}, - {file = "pillow-12.1.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:e879bb6cd5c73848ef3b2b48b8af9ff08c5b71ecda8048b7dd22d8a33f60be32"}, - {file = "pillow-12.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:365b10bb9417dd4498c0e3b128018c4a624dc11c7b97d8cc54effe3b096f4c38"}, - {file = "pillow-12.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d4ce8e329c93845720cd2014659ca67eac35f6433fd3050393d85f3ecef0dad5"}, - {file = "pillow-12.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc354a04072b765eccf2204f588a7a532c9511e8b9c7f900e1b64e3e33487090"}, - {file = "pillow-12.1.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7e7976bf1910a8116b523b9f9f58bf410f3e8aa330cd9a2bb2953f9266ab49af"}, - {file = "pillow-12.1.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:597bd9c8419bc7c6af5604e55847789b69123bbe25d65cc6ad3012b4f3c98d8b"}, - {file = "pillow-12.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2c1fc0f2ca5f96a3c8407e41cca26a16e46b21060fe6d5b099d2cb01412222f5"}, - {file = "pillow-12.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:578510d88c6229d735855e1f278aa305270438d36a05031dfaae5067cc8eb04d"}, - {file = "pillow-12.1.1-cp311-cp311-win32.whl", hash = "sha256:7311c0a0dcadb89b36b7025dfd8326ecfa36964e29913074d47382706e516a7c"}, - {file = "pillow-12.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:fbfa2a7c10cc2623f412753cddf391c7f971c52ca40a3f65dc5039b2939e8563"}, - {file = "pillow-12.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:b81b5e3511211631b3f672a595e3221252c90af017e399056d0faabb9538aa80"}, - {file = "pillow-12.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ab323b787d6e18b3d91a72fc99b1a2c28651e4358749842b8f8dfacd28ef2052"}, - {file = "pillow-12.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:adebb5bee0f0af4909c30db0d890c773d1a92ffe83da908e2e9e720f8edf3984"}, - {file = "pillow-12.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bb66b7cc26f50977108790e2456b7921e773f23db5630261102233eb355a3b79"}, - {file = "pillow-12.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aee2810642b2898bb187ced9b349e95d2a7272930796e022efaf12e99dccd293"}, - {file = "pillow-12.1.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a0b1cd6232e2b618adcc54d9882e4e662a089d5768cd188f7c245b4c8c44a397"}, - {file = "pillow-12.1.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7aac39bcf8d4770d089588a2e1dd111cbaa42df5a94be3114222057d68336bd0"}, - {file = "pillow-12.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ab174cd7d29a62dd139c44bf74b698039328f45cb03b4596c43473a46656b2f3"}, - {file = "pillow-12.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:339ffdcb7cbeaa08221cd401d517d4b1fe7a9ed5d400e4a8039719238620ca35"}, - {file = "pillow-12.1.1-cp312-cp312-win32.whl", hash = "sha256:5d1f9575a12bed9e9eedd9a4972834b08c97a352bd17955ccdebfeca5913fa0a"}, - {file = "pillow-12.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:21329ec8c96c6e979cd0dfd29406c40c1d52521a90544463057d2aaa937d66a6"}, - {file = "pillow-12.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:af9a332e572978f0218686636610555ae3defd1633597be015ed50289a03c523"}, - {file = "pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:d242e8ac078781f1de88bf823d70c1a9b3c7950a44cdf4b7c012e22ccbcd8e4e"}, - {file = "pillow-12.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:02f84dfad02693676692746df05b89cf25597560db2857363a208e393429f5e9"}, - {file = "pillow-12.1.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:e65498daf4b583091ccbb2556c7000abf0f3349fcd57ef7adc9a84a394ed29f6"}, - {file = "pillow-12.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c6db3b84c87d48d0088943bf33440e0c42370b99b1c2a7989216f7b42eede60"}, - {file = "pillow-12.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b7e5304e34942bf62e15184219a7b5ad4ff7f3bb5cca4d984f37df1a0e1aee2"}, - {file = "pillow-12.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:18e5bddd742a44b7e6b1e773ab5db102bd7a94c32555ba656e76d319d19c3850"}, - {file = "pillow-12.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc44ef1f3de4f45b50ccf9136999d71abb99dca7706bc75d222ed350b9fd2289"}, - {file = "pillow-12.1.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5a8eb7ed8d4198bccbd07058416eeec51686b498e784eda166395a23eb99138e"}, - {file = "pillow-12.1.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47b94983da0c642de92ced1702c5b6c292a84bd3a8e1d1702ff923f183594717"}, - {file = "pillow-12.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:518a48c2aab7ce596d3bf79d0e275661b846e86e4d0e7dec34712c30fe07f02a"}, - {file = "pillow-12.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a550ae29b95c6dc13cf69e2c9dc5747f814c54eeb2e32d683e5e93af56caa029"}, - {file = "pillow-12.1.1-cp313-cp313-win32.whl", hash = "sha256:a003d7422449f6d1e3a34e3dd4110c22148336918ddbfc6a32581cd54b2e0b2b"}, - {file = "pillow-12.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:344cf1e3dab3be4b1fa08e449323d98a2a3f819ad20f4b22e77a0ede31f0faa1"}, - {file = "pillow-12.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c0dd1636633e7e6a0afe7bf6a51a14992b7f8e60de5789018ebbdfae55b040a"}, - {file = "pillow-12.1.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0330d233c1a0ead844fc097a7d16c0abff4c12e856c0b325f231820fee1f39da"}, - {file = "pillow-12.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5dae5f21afb91322f2ff791895ddd8889e5e947ff59f71b46041c8ce6db790bc"}, - {file = "pillow-12.1.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2e0c664be47252947d870ac0d327fea7e63985a08794758aa8af5b6cb6ec0c9c"}, - {file = "pillow-12.1.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:691ab2ac363b8217f7d31b3497108fb1f50faab2f75dfb03284ec2f217e87bf8"}, - {file = "pillow-12.1.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9e8064fb1cc019296958595f6db671fba95209e3ceb0c4734c9baf97de04b20"}, - {file = "pillow-12.1.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:472a8d7ded663e6162dafdf20015c486a7009483ca671cece7a9279b512fcb13"}, - {file = "pillow-12.1.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:89b54027a766529136a06cfebeecb3a04900397a3590fd252160b888479517bf"}, - {file = "pillow-12.1.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:86172b0831b82ce4f7877f280055892b31179e1576aa00d0df3bb1bbf8c3e524"}, - {file = "pillow-12.1.1-cp313-cp313t-win32.whl", hash = "sha256:44ce27545b6efcf0fdbdceb31c9a5bdea9333e664cda58a7e674bb74608b3986"}, - {file = "pillow-12.1.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a285e3eb7a5a45a2ff504e31f4a8d1b12ef62e84e5411c6804a42197c1cf586c"}, - {file = "pillow-12.1.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cc7d296b5ea4d29e6570dabeaed58d31c3fea35a633a69679fb03d7664f43fb3"}, - {file = "pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:417423db963cb4be8bac3fc1204fe61610f6abeed1580a7a2cbb2fbda20f12af"}, - {file = "pillow-12.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:b957b71c6b2387610f556a7eb0828afbe40b4a98036fc0d2acfa5a44a0c2036f"}, - {file = "pillow-12.1.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:097690ba1f2efdeb165a20469d59d8bb03c55fb6621eb2041a060ae8ea3e9642"}, - {file = "pillow-12.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2815a87ab27848db0321fb78c7f0b2c8649dee134b7f2b80c6a45c6831d75ccd"}, - {file = "pillow-12.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f7ed2c6543bad5a7d5530eb9e78c53132f93dfa44a28492db88b41cdab885202"}, - {file = "pillow-12.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:652a2c9ccfb556235b2b501a3a7cf3742148cd22e04b5625c5fe057ea3e3191f"}, - {file = "pillow-12.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d6e4571eedf43af33d0fc233a382a76e849badbccdf1ac438841308652a08e1f"}, - {file = "pillow-12.1.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b574c51cf7d5d62e9be37ba446224b59a2da26dc4c1bb2ecbe936a4fb1a7cb7f"}, - {file = "pillow-12.1.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a37691702ed687799de29a518d63d4682d9016932db66d4e90c345831b02fb4e"}, - {file = "pillow-12.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f95c00d5d6700b2b890479664a06e754974848afaae5e21beb4d83c106923fd0"}, - {file = "pillow-12.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:559b38da23606e68681337ad74622c4dbba02254fc9cb4488a305dd5975c7eeb"}, - {file = "pillow-12.1.1-cp314-cp314-win32.whl", hash = "sha256:03edcc34d688572014ff223c125a3f77fb08091e4607e7745002fc214070b35f"}, - {file = "pillow-12.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:50480dcd74fa63b8e78235957d302d98d98d82ccbfac4c7e12108ba9ecbdba15"}, - {file = "pillow-12.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:5cb1785d97b0c3d1d1a16bc1d710c4a0049daefc4935f3a8f31f827f4d3d2e7f"}, - {file = "pillow-12.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1f90cff8aa76835cba5769f0b3121a22bd4eb9e6884cfe338216e557a9a548b8"}, - {file = "pillow-12.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1f1be78ce9466a7ee64bfda57bdba0f7cc499d9794d518b854816c41bf0aa4e9"}, - {file = "pillow-12.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:42fc1f4677106188ad9a55562bbade416f8b55456f522430fadab3cef7cd4e60"}, - {file = "pillow-12.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98edb152429ab62a1818039744d8fbb3ccab98a7c29fc3d5fcef158f3f1f68b7"}, - {file = "pillow-12.1.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d470ab1178551dd17fdba0fef463359c41aaa613cdcd7ff8373f54be629f9f8f"}, - {file = "pillow-12.1.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6408a7b064595afcab0a49393a413732a35788f2a5092fdc6266952ed67de586"}, - {file = "pillow-12.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5d8c41325b382c07799a3682c1c258469ea2ff97103c53717b7893862d0c98ce"}, - {file = "pillow-12.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c7697918b5be27424e9ce568193efd13d925c4481dd364e43f5dff72d33e10f8"}, - {file = "pillow-12.1.1-cp314-cp314t-win32.whl", hash = "sha256:d2912fd8114fc5545aa3a4b5576512f64c55a03f3ebcca4c10194d593d43ea36"}, - {file = "pillow-12.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:4ceb838d4bd9dab43e06c363cab2eebf63846d6a4aeaea283bbdfd8f1a8ed58b"}, - {file = "pillow-12.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:7b03048319bfc6170e93bd60728a1af51d3dd7704935feb228c4d4faab35d334"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:600fd103672b925fe62ed08e0d874ea34d692474df6f4bf7ebe148b30f89f39f"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:665e1b916b043cef294bc54d47bf02d87e13f769bc4bc5fa225a24b3a6c5aca9"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:495c302af3aad1ca67420ddd5c7bd480c8867ad173528767d906428057a11f0e"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8fd420ef0c52c88b5a035a0886f367748c72147b2b8f384c9d12656678dfdfa9"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f975aa7ef9684ce7e2c18a3aa8f8e2106ce1e46b94ab713d156b2898811651d3"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8089c852a56c2966cf18835db62d9b34fef7ba74c726ad943928d494fa7f4735"}, - {file = "pillow-12.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:cb9bb857b2d057c6dfc72ac5f3b44836924ba15721882ef103cecb40d002d80e"}, - {file = "pillow-12.1.1.tar.gz", hash = "sha256:9ad8fa5937ab05218e2b6a4cff30295ad35afd2f83ac592e68c0d871bb0fdbc4"}, + {file = "pillow-12.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:a4e8f36e677d3336f35089648c8955c51c6d386a13cf6ee9c189c5f5bd713a9f"}, + {file = "pillow-12.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e589959f10d9824d39b350472b92f0ce3b443c0a3442ebf41c40cb8361c5b97"}, + {file = "pillow-12.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a52edc8bfff4429aaabdf4d9ee0daadbbf8562364f940937b941f87a4290f5ff"}, + {file = "pillow-12.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:975385f4776fafde056abb318f612ef6285b10a1f12b8570f3647ad0d74b48ec"}, + {file = "pillow-12.2.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd9c0c7a0c681a347b3194c500cb1e6ca9cab053ea4d82a5cf45b6b754560136"}, + {file = "pillow-12.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:88d387ff40b3ff7c274947ed3125dedf5262ec6919d83946753b5f3d7c67ea4c"}, + {file = "pillow-12.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:51c4167c34b0d8ba05b547a3bb23578d0ba17b80a5593f93bd8ecb123dd336a3"}, + {file = "pillow-12.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:34c0d99ecccea270c04882cb3b86e7b57296079c9a4aff88cb3b33563d95afaa"}, + {file = "pillow-12.2.0-cp310-cp310-win32.whl", hash = "sha256:b85f66ae9eb53e860a873b858b789217ba505e5e405a24b85c0464822fe88032"}, + {file = "pillow-12.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:673aa32138f3e7531ccdbca7b3901dba9b70940a19ccecc6a37c77d5fdeb05b5"}, + {file = "pillow-12.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:3e080565d8d7c671db5802eedfb438e5565ffa40115216eabb8cd52d0ecce024"}, + {file = "pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab"}, + {file = "pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65"}, + {file = "pillow-12.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7"}, + {file = "pillow-12.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8bd7903a5f2a4545f6fd5935c90058b89d30045568985a71c79f5fd6edf9b91e"}, + {file = "pillow-12.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3997232e10d2920a68d25191392e3a4487d8183039e1c74c2297f00ed1c50705"}, + {file = "pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176"}, + {file = "pillow-12.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:56a3f9c60a13133a98ecff6197af34d7824de9b7b38c3654861a725c970c197b"}, + {file = "pillow-12.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90e6f81de50ad6b534cab6e5aef77ff6e37722b2f5d908686f4a5c9eba17a909"}, + {file = "pillow-12.2.0-cp311-cp311-win32.whl", hash = "sha256:8c984051042858021a54926eb597d6ee3012393ce9c181814115df4c60b9a808"}, + {file = "pillow-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60"}, + {file = "pillow-12.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:9a8a34cc89c67a65ea7437ce257cea81a9dad65b29805f3ecee8c8fe8ff25ffe"}, + {file = "pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5"}, + {file = "pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421"}, + {file = "pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987"}, + {file = "pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76"}, + {file = "pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005"}, + {file = "pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780"}, + {file = "pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5"}, + {file = "pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5"}, + {file = "pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940"}, + {file = "pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5"}, + {file = "pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414"}, + {file = "pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c"}, + {file = "pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2"}, + {file = "pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c"}, + {file = "pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795"}, + {file = "pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f"}, + {file = "pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed"}, + {file = "pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9"}, + {file = "pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed"}, + {file = "pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3"}, + {file = "pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9"}, + {file = "pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795"}, + {file = "pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e"}, + {file = "pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b"}, + {file = "pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06"}, + {file = "pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b"}, + {file = "pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f"}, + {file = "pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612"}, + {file = "pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c"}, + {file = "pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea"}, + {file = "pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4"}, + {file = "pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4"}, + {file = "pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea"}, + {file = "pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24"}, + {file = "pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98"}, + {file = "pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453"}, + {file = "pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8"}, + {file = "pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b"}, + {file = "pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295"}, + {file = "pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed"}, + {file = "pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae"}, + {file = "pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601"}, + {file = "pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be"}, + {file = "pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f"}, + {file = "pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286"}, + {file = "pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50"}, + {file = "pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104"}, + {file = "pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7"}, + {file = "pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150"}, + {file = "pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1"}, + {file = "pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463"}, + {file = "pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3"}, + {file = "pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166"}, + {file = "pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe"}, + {file = "pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd"}, + {file = "pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e"}, + {file = "pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06"}, + {file = "pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43"}, + {file = "pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354"}, + {file = "pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1"}, + {file = "pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538bd5e05efec03ae613fd89c4ce0368ecd2ba239cc25b9f9be7ed426b0af1f"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:394167b21da716608eac917c60aa9b969421b5dcbbe02ae7f013e7b85811c69d"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5d04bfa02cc2d23b497d1e90a0f927070043f6cbf303e738300532379a4b4e0f"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0c838a5125cee37e68edec915651521191cef1e6aa336b855f495766e77a366e"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6c9fa44005fa37a91ebfc95d081e8079757d2e904b27103f4f5fa6f0bf78c0"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25373b66e0dd5905ed63fa3cae13c82fbddf3079f2c8bf15c6fb6a35586324c1"}, + {file = "pillow-12.2.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bfa9c230d2fe991bed5318a5f119bd6780cda2915cca595393649fc118ab895e"}, + {file = "pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5"}, ] [package.extras] @@ -677,7 +677,7 @@ description = "Tensors and Dynamic neural networks in Python with strong GPU acc optional = false python-versions = ">=3.8.0" groups = ["main"] -markers = "sys_platform != \"linux\"" +markers = "sys_platform != \"linux-x86_64\"" files = [ {file = "torch-2.2.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:8d3bad336dd2c93c6bcb3268e8e9876185bda50ebde325ef211fb565c7d15273"}, {file = "torch-2.2.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:5297f13370fdaca05959134b26a06a7f232ae254bf2e11a50eddec62525c9006"}, @@ -736,7 +736,7 @@ description = "Tensors and Dynamic neural networks in Python with strong GPU acc optional = false python-versions = ">=3.8.0" groups = ["main"] -markers = "sys_platform == \"linux\"" +markers = "sys_platform == \"linux-x86_64\"" files = [ {file = "torch-2.2.1+cu121-cp312-cp312-linux_x86_64.whl", hash = "sha256:362751719d4b319b2e7efcc7aea01332602af06aef1c3d1f0653639e6906f23c"}, ] @@ -775,7 +775,7 @@ description = "image and video datasets and models for torch deep learning" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "sys_platform != \"linux\"" +markers = "sys_platform != \"linux-x86_64\"" files = [ {file = "torchvision-0.17.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:06418880212b66e45e855dd39f536e7fd48b4e6b034a11dd9fe9e2384afb51ec"}, {file = "torchvision-0.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33d65d0c7fdcb3f7bc1dd8ed30ea3cd7e0587b4ad1b104b5677c8191a8bad9f1"}, @@ -819,7 +819,7 @@ description = "image and video datasets and models for torch deep learning" optional = false python-versions = ">=3.8" groups = ["main"] -markers = "sys_platform == \"linux\"" +markers = "sys_platform == \"linux-x86_64\"" files = [ {file = "torchvision-0.17.1+cu121-cp310-cp310-linux_x86_64.whl", hash = "sha256:27af47915f6e762c1d44e58e8088d22ac97445668f9f793524032b2baf4f34bd"}, {file = "torchvision-0.17.1+cu121-cp310-cp310-win_amd64.whl", hash = "sha256:26d198e9dcba51b9f78a050fabca96a7cb3079e2dc20e1d23a4d244b180b8fea"}, @@ -861,4 +861,4 @@ files = [ [metadata] lock-version = "2.1" python-versions = ">=3.12" -content-hash = "ade782390a65c864be56b93c796c387271f9a0877853e9dc5f7bec555ac71c67" +content-hash = "dcd3db417a488eebc63acc242066f429c1f2bf5d2ffddd110e296da131b84d81" diff --git a/examples/torch/pyproject.toml b/examples/torch/pyproject.toml index d1d304e6..fa26c639 100644 --- a/examples/torch/pyproject.toml +++ b/examples/torch/pyproject.toml @@ -23,11 +23,11 @@ sample_package_hatchling = { path = "sample_hatchling", develop = false } sample_package_flit = { path = "sample_flit.tar.xz", develop = true } # tar cvfJ sample_flit.tar.xz --disable-copyfile -C x . torch = [ { platform = "darwin", version = "2.2.1", source = "pypi" }, - { platform = "linux", url = "https://download.pytorch.org/whl/cu121/torch-2.2.1%2Bcu121-cp312-cp312-linux_x86_64.whl" }, + { platform = "linux-x86_64", url = "https://download.pytorch.org/whl/cu121/torch-2.2.1%2Bcu121-cp312-cp312-linux_x86_64.whl" }, ] torchvision = [ { version = "0.17.1" }, - { platform = "linux", version = "0.17.1", source = "pytorch" }, + { platform = "linux-x86_64", version = "0.17.1", source = "pytorch" }, ] [tool.poetry.group.dev.dependencies] diff --git a/examples/torch/test.py b/examples/torch/test.py index afaed0a4..6bff8693 100644 --- a/examples/torch/test.py +++ b/examples/torch/test.py @@ -1,4 +1,5 @@ import os +import platform import sys import tomllib @@ -19,7 +20,7 @@ def test_torch_version(): assert torch.__version__.split("+").pop(0) in torch_version -@pytest.mark.skipif(sys.platform != "linux", reason="torch+CUDA is installed only for linux") +@pytest.mark.skipif(sys.platform != "linux" or platform.machine() != "x86_64", reason="torch+CUDA is for Linux x86_64") def test_cuda_libs_loaded(): assert torch.backends.cudnn.enabled assert torch.backends.cudnn.version() > 8000 diff --git a/examples/uv/.bazelrc b/examples/uv/.bazelrc index 07ca07e7..320d60a6 100644 --- a/examples/uv/.bazelrc +++ b/examples/uv/.bazelrc @@ -1,12 +1,8 @@ startup --windows_enable_symlinks build --sandbox_default_allow_network=false -build --nolegacy_external_runfiles -build --incompatible_default_to_explicit_init_py -build --incompatible_autoload_externally= build --incompatible_no_implicit_file_export +build --incompatible_default_to_explicit_init_py build --incompatible_config_setting_private_default_visibility build --incompatible_disable_starlark_host_transitions -build --incompatible_disable_native_repo_rules -build --incompatible_disable_autoloads_in_main_repo common --deleted_packages=re2/re2,re2/re2/python,re2/re2/app \ No newline at end of file diff --git a/examples/uv/pyproject.toml b/examples/uv/pyproject.toml index 91095bee..a174c5e5 100644 --- a/examples/uv/pyproject.toml +++ b/examples/uv/pyproject.toml @@ -5,28 +5,28 @@ description = "example with dependencies" requires-python = ">=3.13" classifiers = [ "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.13" ] dependencies = [ - "annetbox[sync,async]", "aioboto3", + # Package installed from a git source subdirectory + "anki-eco-packager", + "annetbox[sync,async]", + # Package with setuptools_scm build-system + "ccsdspy", + + # Some Rust-dependent packages + "cryptography", "numpy", + "orjson", "pip @ https://files.pythonhosted.org/packages/20/16/650289cd3f43d5a2fadfd98c68bd1e1e7f2550a1a5326768cddfbcedb2c5/pip-25.2.tar.gz", + "polars[rt64]", "pre-commit", "pytest @ file://${PROJECT_ROOT}/pytest-8.4.2-py3-none-any.whl", + "questdb", + "setuptools @ https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", "sphinxcontrib-images @ git+https://github.com/sphinx-contrib/images", "ytsaurus-yson", - # Some Rust-dependent packages - "cryptography", - "orjson", - "polars[rt64]", - - # Package with setuptools_scm build-system - "ccsdspy", - - # Package installed from a git source subdirectory - "anki-eco-packager", ] - [tool.uv.sources] -anki-eco-packager = { git = "https://github.com/ikkz/anki-eco", subdirectory ="packages/packager/src/python" } +anki-eco-packager = { git = "https://github.com/ikkz/anki-eco", subdirectory = "packages/packager/src/python" } diff --git a/examples/uv/test.py b/examples/uv/test.py index 578fb204..bc8b5458 100644 --- a/examples/uv/test.py +++ b/examples/uv/test.py @@ -82,6 +82,12 @@ def test_rust_dependencies(): assert orjson.dumps(data, option=orjson.OPT_NAIVE_UTC | orjson.OPT_SERIALIZE_NUMPY) == expected +def test_questdb(): + import questdb + + assert questdb + + @pytest.mark.skipif(os.name == "nt", reason="@abseil-cpp+//absl/base building fails") def test_re2(): import re2 diff --git a/examples/uv/tools/bazel b/examples/uv/tools/bazel new file mode 120000 index 00000000..c57ace50 --- /dev/null +++ b/examples/uv/tools/bazel @@ -0,0 +1 @@ +../../../tools/bazel \ No newline at end of file diff --git a/examples/uv/tools/bazel.ps1 b/examples/uv/tools/bazel.ps1 new file mode 120000 index 00000000..089c8ea7 --- /dev/null +++ b/examples/uv/tools/bazel.ps1 @@ -0,0 +1 @@ +../../../tools/bazel.ps1 \ No newline at end of file diff --git a/examples/uv/uv.lock b/examples/uv/uv.lock index bb62bc26..6d3edc0f 100644 --- a/examples/uv/uv.lock +++ b/examples/uv/uv.lock @@ -1178,6 +1178,35 @@ wheels = [ { 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 = "questdb" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/15/2a/2480940b8ee3946208d0f15bfd2d8c0fe29dcfbd18ef28a0a87a31c51cad/questdb-4.1.0.tar.gz", hash = "sha256:d899daf474bf66c57dd3f6a8e9bb1f928430b5e5bd115b10bddb418c0330aaec", size = 76967528, upload-time = "2025-11-28T19:50:39.762Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/c1/dc0dee0152cb9287c5ad001d4529619293792bf4ca9dd2b0064253634709/questdb-4.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:33dc5d67807a304f019fdda8f74459f4782681755e2926dd5dce6fca5cd1a5a1", size = 3139270, upload-time = "2025-11-28T19:50:03.975Z" }, + { url = "https://files.pythonhosted.org/packages/3f/07/220c625ca92716e1928a3acae3e670434e69b1087ca0eec294255953842e/questdb-4.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39d276351519bf702214bf1cf3ac55f0715a692f514a6efcc3c28d813cecd324", size = 3215967, upload-time = "2025-11-28T19:50:05.313Z" }, + { url = "https://files.pythonhosted.org/packages/8b/02/1ba125590bade826119da0a1efea187c3a75f2752cb2d004eb6cda905f96/questdb-4.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2189b664b0745bebfb7e3b6cc4a25da849dbcf192f1e1ca7e686c604dc9b6051", size = 5586001, upload-time = "2025-11-28T19:50:07.156Z" }, + { url = "https://files.pythonhosted.org/packages/13/b5/5605dc8869f19e27f063ef7009e456ae2ee0ea97ceb30c317770b54d94e2/questdb-4.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:4afee5e4f5b97f78932e3bba5cd4a6e2b06a001f1d5e7665d95cfcbd394d80db", size = 5980637, upload-time = "2025-11-28T19:50:08.726Z" }, + { url = "https://files.pythonhosted.org/packages/5a/bd/45b95f1a8dc69b8df38d7953bdc5c670f0c782dad09a8175251e46c7d41b/questdb-4.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4aedda5cc08a7686165633fc8814b34ca2a9dfaf306a7f279dd74f9cb1e1a8a3", size = 5619590, upload-time = "2025-11-28T19:50:10.128Z" }, + { url = "https://files.pythonhosted.org/packages/3c/5e/990cd2d8fff5a0901c045570ed417c633cb38071f08166b63057bd43f73f/questdb-4.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3c6300701ae1e95a7395c168288e13286421f33a620cd21ed1e97bd788922d27", size = 6011143, upload-time = "2025-11-28T19:50:12.104Z" }, + { url = "https://files.pythonhosted.org/packages/18/ec/38ba0092db36d0d1fc9aaf34f6445bd31d122b686b32e0e95578fc66e26a/questdb-4.1.0-cp313-cp313-win32.whl", hash = "sha256:f0b57153c4a177c19e0243e130f1558210a0deea77cd254448191bf7392ccb6f", size = 1732995, upload-time = "2025-11-28T19:50:14.626Z" }, + { url = "https://files.pythonhosted.org/packages/f7/3c/c51d071264aaa099f30f8375d37ed23dc57b84608c5cb3010d3d6e52f78d/questdb-4.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a7857d8ba4f919475e22b94011604198049e970d94ce0f1bdc7186cd1fe1b105", size = 2011594, upload-time = "2025-11-28T19:50:15.827Z" }, + { url = "https://files.pythonhosted.org/packages/10/d5/cfb0b4c202c80b0ec69bff5fd16b091904a3348aca5c723d8341199f7f68/questdb-4.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c4c37cd028d864b7c0584e63822c1d74e03cf477056d88ef31cf9c153b436632", size = 3147333, upload-time = "2025-11-28T19:50:17.07Z" }, + { url = "https://files.pythonhosted.org/packages/81/d5/bababb5803bb8ba16e77808774b0b20451a71ee2928e3085f249ad14546f/questdb-4.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b63723a63e8af95ad9b4b2ee1cfa09585375e44e4fdd8d02bbed2ae29f41b2ed", size = 3224698, upload-time = "2025-11-28T19:50:18.673Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ac/c61430be729e7eb62c7fd4a6ec4e8c3ccde63e49fe8a5eff8c65a559063e/questdb-4.1.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:8e4db50b13d806a5185280d2519d0d24f64c0ba2f369377e3f13838260751dae", size = 5968252, upload-time = "2025-11-28T19:50:20.381Z" }, + { url = "https://files.pythonhosted.org/packages/09/b5/9fb415c9e373ff3a69719c73b7a879e75e963e1d0f7f6048b97d7b6408a5/questdb-4.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b93bec78f0a2607f3164a54a4bc5bfd3522b0b1d7025b01d229ae9f2dbd90e46", size = 6008992, upload-time = "2025-11-28T19:50:21.816Z" }, + { url = "https://files.pythonhosted.org/packages/e7/13/4099213d156c529df72b6fff7e5d8eaaa92a540788627feb4cee76b8b50d/questdb-4.1.0-cp314-cp314-win32.whl", hash = "sha256:80462e6c4aeb441acb430c409a8bee7e861fa5fe3cc455f7b54e6acc8031f14c", size = 1755241, upload-time = "2025-11-28T19:50:23.116Z" }, + { url = "https://files.pythonhosted.org/packages/e9/eb/836ca068d047bb7af31e89f7e6077f5a27dbf0f66b783bd5491d3209ab91/questdb-4.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:78ae5407a24883779a5df8d013ad30335ea64245e8e11176e5d35d907bbc74c5", size = 2050253, upload-time = "2025-11-28T19:50:24.28Z" }, + { url = "https://files.pythonhosted.org/packages/b5/06/e25e611d35c21616256b73c3772fda8cb6317f139cc9a6630d0d42ecd6e4/questdb-4.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:44b0e5bae301484ac169eb74058cd722d5e26fe0640200615079fd7c629236f2", size = 3154538, upload-time = "2025-11-28T19:50:25.499Z" }, + { url = "https://files.pythonhosted.org/packages/75/c7/d19fdd4edcc91b1f6e66f9dc7c8dfd66967b7b800ca59180c75ef8b2b546/questdb-4.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ae54862ac73bcfb7b1d17771693872e04f2659b04180bdf24259f46012b0bb66", size = 3252602, upload-time = "2025-11-28T19:50:26.922Z" }, + { url = "https://files.pythonhosted.org/packages/08/2a/b80fc90836c975f26443fcf9e0ab672abfe3f4283c3421456242b46012b4/questdb-4.1.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:b7f9f437f594b88c7e4c6cf9c683c809ecd5f2020446d82be47e4f12e0295cfd", size = 5921142, upload-time = "2025-11-28T19:50:28.369Z" }, + { url = "https://files.pythonhosted.org/packages/37/b1/6c22a6c6425c3e7a0d578526db2b8ea2e534f9b4cc3aa6e2f1c5878f6081/questdb-4.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:bee0c5df4513e6c30f9d24fd3feedc08f0528b3daa990bed4eb31deebceffa85", size = 5965328, upload-time = "2025-11-28T19:50:30.107Z" }, +] + [[package]] name = "requests" version = "2.33.1" @@ -1294,6 +1323,7 @@ dependencies = [ { name = "polars", extra = ["rt64"] }, { name = "pre-commit" }, { name = "pytest" }, + { name = "questdb" }, { name = "setuptools" }, { name = "sphinxcontrib-images" }, { name = "ytsaurus-yson" }, @@ -1312,6 +1342,7 @@ requires-dist = [ { name = "polars", extras = ["rt64"] }, { name = "pre-commit" }, { name = "pytest", path = "pytest-8.4.2-py3-none-any.whl" }, + { name = "questdb" }, { name = "setuptools", url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl" }, { name = "sphinxcontrib-images", git = "https://github.com/sphinx-contrib/images" }, { name = "ytsaurus-yson" }, diff --git a/pyproject.toml b/pyproject.toml index 2926a095..b2fd4315 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ofiuco" -version = "0.8.4" +version = "0.9.0" description = "Bazel tools for Python and package managers" readme = "README.md" license = "Apache-2.0" diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 02e649a3..85609cba 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -62,6 +62,9 @@ py_binary( srcs = [ "lock_parser.py", ], + data = [ + "rust_packages.gz", + ], ) py_test( diff --git a/python/private/lock_parser.bzl b/python/private/lock_parser.bzl index 44de7c72..b07b47c4 100644 --- a/python/private/lock_parser.bzl +++ b/python/private/lock_parser.bzl @@ -9,7 +9,7 @@ def _parse_lock_impl(rctx): rules_repository = self.split("/", 1)[0] rules_repository = ("@@" if "~" in rules_repository else "@") + rules_repository rules_repository = rules_repository.split("+")[0] - prefix = '''load("{name}//python/private:package_deps.bzl", "package")'''.format(name = rules_repository) + prefix = '''load("{name}//python/private:package_deps.bzl", "package", "rust_package")'''.format(name = rules_repository) interpreter = rctx.path(rctx.attr._python_host) rctx.watch(rctx.attr.lock) diff --git a/python/private/lock_parser.py b/python/private/lock_parser.py index a3b8d72f..51b66ae9 100644 --- a/python/private/lock_parser.py +++ b/python/private/lock_parser.py @@ -1,5 +1,7 @@ import argparse import asyncio +import bisect +import gzip import html.parser import itertools import json @@ -74,6 +76,9 @@ (16, 0), # Tahoe ] +with gzip.open(Path(__file__).parent / "rust_packages.gz", "rt") as rust_packages_file: + RUST_PACKAGES = [line.strip() for line in rust_packages_file.readlines() if line.strip()] + def normalize_basename(name): return re.sub(r"[^A-Za-z0-9._-]", "-", urllib.parse.unquote(os.path.basename(name))) @@ -431,8 +436,13 @@ def repr(self, platforms, generate_extras, enable_rust): "visibility": ['["//visibility:public"]'], } + # https://pypi.org/search/?c=Programming+Language+%3A%3A+Rust + rust_package_index = bisect.bisect_left(RUST_PACKAGES, self.name) + rust_package = rust_package_index < len(RUST_PACKAGES) and RUST_PACKAGES[rust_package_index] == self.name + package_rule = "rust_package" if rust_package else "package" + return f""" -package( +{package_rule}( name = "{self.name}", {attr_sep.join((attr + " = " + sep.join(value)) for attr, value in attrs.items() if value)}, ) diff --git a/python/private/package_deps.bzl b/python/private/package_deps.bzl index d1be296e..660ecc58 100644 --- a/python/private/package_deps.bzl +++ b/python/private/package_deps.bzl @@ -271,7 +271,7 @@ def _package_impl(ctx): # Generates CC toolchain argument arguments.append("--cc_toolchain=" + json.encode(cc_attr)) - if ctx.attr.enable_rust: + if "@rules_rust//rust:toolchain_type" in ctx.toolchains: # Get Rust target toolchain and propagate to the installation script rust_toolchain = ctx.toolchains["@rules_rust//rust:toolchain_type"] if rust_toolchain: @@ -328,30 +328,43 @@ def _package_impl(ctx): PyInfo(transitive_sources = files, imports = imports), ] +package_attrs = { + "deps": attr.label_list(doc = "The package dependencies list"), + "data": attr.label_list(doc = "The package dependencies list"), + "description": attr.string(doc = "The package description"), + "package": attr.label(doc = "The Python package target"), + "develop": attr.bool(), + "enable_rust": attr.bool(default = True), + "markers": attr.string(doc = "The JSON string with a dictionary of dependency markers accordingly to PEP 508"), + "platforms": attr.string_dict( + default = DEFAULT_PLATFORMS, + doc = "The mapping of an interpter substring mapping to environment markers and platform tags as a JSON string. " + + "Default value corresponds to platforms defined at " + + "https://github.com/bazelbuild/rules_python/blob/23cf6b66/python/versions.bzl#L231-L277", + ), + "system_platform": attr.string(doc = "The system platform environment markers as a JSON string"), + "_libpython": attr.label_list(default = [ + "@rules_python//python/cc:current_py_cc_headers", + "@rules_python//python/cc:current_py_cc_libs", + ]), + "_package_deps": attr.label(default = ":package_deps", cfg = "exec", executable = True), +} + package = rule( implementation = _package_impl, provides = [PyInfo], - attrs = { - "deps": attr.label_list(doc = "The package dependencies list"), - "data": attr.label_list(doc = "The package dependencies list"), - "description": attr.string(doc = "The package description"), - "package": attr.label(doc = "The Python package target"), - "develop": attr.bool(), - "enable_rust": attr.bool(), - "markers": attr.string(doc = "The JSON string with a dictionary of dependency markers accordingly to PEP 508"), - "platforms": attr.string_dict( - default = DEFAULT_PLATFORMS, - doc = "The mapping of an interpter substring mapping to environment markers and platform tags as a JSON string. " + - "Default value corresponds to platforms defined at " + - "https://github.com/bazelbuild/rules_python/blob/23cf6b66/python/versions.bzl#L231-L277", - ), - "system_platform": attr.string(doc = "The system platform environment markers as a JSON string"), - "_libpython": attr.label_list(default = [ - "@rules_python//python/cc:current_py_cc_headers", - "@rules_python//python/cc:current_py_cc_libs", - ]), - "_package_deps": attr.label(default = ":package_deps", cfg = "exec", executable = True), - }, + attrs = package_attrs, + toolchains = [ + "@bazel_tools//tools/python:toolchain_type", + config_common.toolchain_type("@bazel_tools//tools/cpp:toolchain_type", mandatory = False), + ], + fragments = ["cpp"], +) + +rust_package = rule( + implementation = _package_impl, + provides = [PyInfo], + attrs = package_attrs, toolchains = [ "@bazel_tools//tools/python:toolchain_type", config_common.toolchain_type("@bazel_tools//tools/cpp:toolchain_type", mandatory = False), diff --git a/python/private/package_deps.py b/python/private/package_deps.py index f6858a63..e0a4d33d 100644 --- a/python/private/package_deps.py +++ b/python/private/package_deps.py @@ -188,6 +188,16 @@ def install_internal(args): os.environ["PATH"] = f"{os.getcwd()}/{rust_toolchain.get('RUST_SYSROOT')}/bin:{os.environ['PATH']}" os.environ["RUSTUP_HOME"] = os.fspath(output_path) os.environ["CARGO_HOME"] = os.fspath(output_path) + os.environ["CARGO_TERM_VERBOSE"] = "true" + os.environ["CARGO_PROFILE_RELEASE_BUILD_OVERRIDE_DEBUG"] = "true" + os.environ["RUST_BACKTRACE"] = "full" + + # Do not forward ARFLAGS, + # References: + # https://github.com/bazelbuild/rules_rust/commit/d6da8a62f12811e462c9a0653ddb826fea3b5074 + # https://github.com/rust-lang/cc-rs/blob/f4c5ac7a7e7917660d2068ecb5fd015a11ffb3d6/src/lib.rs#L2813-L2815 + # https://github.com/rust-lang/cc-rs/issues/1011 + os.environ["ARFLAGS"] = "" if retcode := install_command.main(install_args + get_platform_args(args)): logging.error(f"pip install returned {retcode}") diff --git a/python/private/rust_packages.gz b/python/private/rust_packages.gz new file mode 100644 index 0000000000000000000000000000000000000000..e8354555e14c016fbcda3f7637ab8cee2ffcf33c GIT binary patch literal 30975 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 literal 0 HcmV?d00001 diff --git a/tools/bazel b/tools/bazel new file mode 100755 index 00000000..2b00f614 --- /dev/null +++ b/tools/bazel @@ -0,0 +1,3 @@ +#!/bin/bash -x + +${BAZEL_REAL} --output_user_root=${CACHE_DIR:-$HOME/.cache/bazel} $@ diff --git a/tools/bazel.ps1 b/tools/bazel.ps1 new file mode 100755 index 00000000..3cec9f8e --- /dev/null +++ b/tools/bazel.ps1 @@ -0,0 +1,3 @@ +Set-PSDebug -Trace 1 + +& $env:BAZEL_REAL --output_base=$(if ($env:CACHE_DIR) { $env:CACHE_DIR } else { "$env:USERPROFILE\.cache\bazel" }) @args