From d5d98d98bb619a3572e96d0171692dcbfac5b337 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Wed, 4 Feb 2026 11:55:18 +0200 Subject: [PATCH 01/29] Allow `codex` to run `pip-audit` --- .codex/rules/pip-audit.rules | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .codex/rules/pip-audit.rules diff --git a/.codex/rules/pip-audit.rules b/.codex/rules/pip-audit.rules new file mode 100644 index 00000000..667f079e --- /dev/null +++ b/.codex/rules/pip-audit.rules @@ -0,0 +1,11 @@ +prefix_rule( + pattern = ["pip-audit"], + decision = "allow", + justification = "pip-audit is allowed to run", + match = [ + "pip-audit", + ], + not_match = [ + "uvx pip-audit", + ], +) From f211aca59a415a3cc854ff2e72cc97f6167b0521 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Wed, 4 Feb 2026 11:56:02 +0200 Subject: [PATCH 02/29] Install `pip-audit` as a development dependency --- pyproject.toml | 1 + requirements/dev.txt | 39 ++++++++ uv.lock | 230 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 270 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index d24be68f..393f57de 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -82,6 +82,7 @@ dev = [ # ⬆️ Required to fix vulnerability CVE-2025-68146 "marshmallow>=3.26.2", # ⬆️ Required to fix vulnerability CVE-2025-68480 + "pip-audit", ] docs = [ "sphinx>=7.4.7", diff --git a/requirements/dev.txt b/requirements/dev.txt index a0578325..69d2b2c8 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -12,8 +12,12 @@ authlib==1.6.6 # via hirundo (pyproject.toml) basedpyright==1.37.1 # via hirundo (pyproject.toml) +boolean-py==5.0 + # via license-expression bumpver==2025.1131 # via hirundo (pyproject.toml) +cachecontrol==0.14.4 + # via pip-audit certifi==2026.1.4 # via # -c requirements/requirements.txt @@ -39,6 +43,10 @@ cryptography==46.0.3 # via # hirundo (pyproject.toml) # authlib +cyclonedx-python-lib==11.6.0 + # via pip-audit +defusedxml==0.7.1 + # via py-serializable distlib==0.4.0 # via virtualenv docutils==0.21.2 @@ -49,6 +57,7 @@ docutils==0.21.2 filelock==3.20.3 # via # hirundo (pyproject.toml) + # cachecontrol # virtualenv h11==0.16.0 # via @@ -101,6 +110,8 @@ keyring==25.7.0 # twine lexid==2021.1006 # via bumpver +license-expression==30.4.4 + # via cyclonedx-python-lib markdown-it-py==4.0.0 # via # -c requirements/requirements.txt @@ -118,6 +129,8 @@ more-itertools==10.8.0 # -c requirements/requirements.txt # jaraco-classes # jaraco-functools +msgpack==1.1.2 + # via cachecontrol nh3==0.3.2 # via # -c requirements/requirements.txt @@ -126,19 +139,34 @@ nodeenv==1.10.0 # via pre-commit nodejs-wheel-binaries==24.13.0 # via basedpyright +packageurl-python==0.17.6 + # via cyclonedx-python-lib packaging==26.0 # via # -c requirements/requirements.txt + # pip-audit + # pip-requirements-parser # pytest # twine +pip==26.0 + # via pip-api +pip-api==0.0.34 + # via pip-audit +pip-audit==2.10.0 + # via hirundo (pyproject.toml) +pip-requirements-parser==32.0.1 + # via pip-audit platformdirs==4.5.1 # via # hirundo (pyproject.toml) + # pip-audit # virtualenv pluggy==1.6.0 # via pytest pre-commit==4.5.1 # via hirundo (pyproject.toml) +py-serializable==2.1.0 + # via cyclonedx-python-lib pycparser==3.0 # via cffi pydantic==2.12.5 @@ -155,6 +183,8 @@ pygments==2.19.2 # pytest # readme-renderer # rich +pyparsing==3.3.2 + # via pip-requirements-parser pytest==9.0.2 # via # hirundo (pyproject.toml) @@ -178,7 +208,9 @@ requests==2.32.5 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # cachecontrol # id + # pip-audit # requests-toolbelt # twine requests-toolbelt==1.0.0 @@ -192,6 +224,7 @@ rfc3986==2.0.0 rich==14.2.0 # via # -c requirements/requirements.txt + # pip-audit # twine # typer ruff==0.14.13 @@ -204,6 +237,8 @@ shellingham==1.5.4 # via # -c requirements/requirements.txt # typer +sortedcontainers==2.4.0 + # via cyclonedx-python-lib stamina==25.2.0 # via # -c requirements/requirements.txt @@ -214,6 +249,10 @@ tenacity==9.1.2 # stamina toml==0.10.2 # via bumpver +tomli==2.4.0 + # via pip-audit +tomli-w==1.2.0 + # via pip-audit tqdm==4.67.1 # via # -c requirements/requirements.txt diff --git a/uv.lock b/uv.lock index 0139e8f1..58481758 100644 --- a/uv.lock +++ b/uv.lock @@ -191,6 +191,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload-time = "2025-04-15T17:05:12.221Z" }, ] +[[package]] +name = "boolean-py" +version = "5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/cf/85379f13b76f3a69bca86b60237978af17d6aa0bc5998978c3b8cf05abb2/boolean_py-5.0.tar.gz", hash = "sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95", size = 37047, upload-time = "2025-04-03T10:39:49.734Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", size = 26577, upload-time = "2025-04-03T10:39:48.449Z" }, +] + [[package]] name = "bumpver" version = "2025.1131" @@ -206,6 +215,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1d/5b/2d5ea6802495ee4506721977be522804314aa66ad629d9356e3c7e5af4a6/bumpver-2025.1131-py2.py3-none-any.whl", hash = "sha256:c02527f6ed7887afbc06c07630047b24a9f9d02d544a65639e99bf8b92aaa674", size = 65361, upload-time = "2025-07-02T20:36:10.103Z" }, ] +[[package]] +name = "cachecontrol" +version = "0.14.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "msgpack" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2d/f6/c972b32d80760fb79d6b9eeb0b3010a46b89c0b23cf6329417ff7886cd22/cachecontrol-0.14.4.tar.gz", hash = "sha256:e6220afafa4c22a47dd0badb319f84475d79108100d04e26e8542ef7d3ab05a1", size = 16150, upload-time = "2025-11-14T04:32:13.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/79/c45f2d53efe6ada1110cf6f9fca095e4ff47a0454444aefdde6ac4789179/cachecontrol-0.14.4-py3-none-any.whl", hash = "sha256:b7ac014ff72ee199b5f8af1de29d60239954f223e948196fa3d84adaffc71d2b", size = 22247, upload-time = "2025-11-14T04:32:11.733Z" }, +] + +[package.optional-dependencies] +filecache = [ + { name = "filelock" }, +] + [[package]] name = "cattrs" version = "25.1.1" @@ -427,6 +454,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0a/76/cf8d69da8d0b5ecb0db406f24a63a3f69ba5e791a11b782aeeefef27ccbb/cryptography-45.0.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:629127cfdcdc6806dfe234734d7cb8ac54edaf572148274fa377a7d3405b0043", size = 3331874, upload-time = "2025-08-05T23:59:23.017Z" }, ] +[[package]] +name = "cyclonedx-python-lib" +version = "11.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "license-expression" }, + { name = "packageurl-python" }, + { name = "py-serializable" }, + { name = "sortedcontainers" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/89/ed/54ecfa25fc145c58bf4f98090f7b6ffe5188d0759248c57dde44427ea239/cyclonedx_python_lib-11.6.0.tar.gz", hash = "sha256:7fb85a4371fa3a203e5be577ac22b7e9a7157f8b0058b7448731474d6dea7bf0", size = 1408147, upload-time = "2025-12-02T12:28:46.446Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/1b/534ad8a5e0f9470522811a8e5a9bc5d328fb7738ba29faf357467a4ef6d0/cyclonedx_python_lib-11.6.0-py3-none-any.whl", hash = "sha256:94f4aae97db42a452134dafdddcfab9745324198201c4777ed131e64c8380759", size = 511157, upload-time = "2025-12-02T12:28:44.158Z" }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, +] + [[package]] name = "distlib" version = "0.4.0" @@ -578,6 +630,7 @@ dev = [ { name = "httpx-sse" }, { name = "jinja2" }, { name = "marshmallow" }, + { name = "pip-audit" }, { name = "platformdirs" }, { name = "pre-commit" }, { name = "pydantic" }, @@ -642,6 +695,7 @@ requires-dist = [ { name = "marshmallow", marker = "extra == 'dev'", specifier = ">=3.26.2" }, { name = "pandas", marker = "extra == 'pandas'", specifier = ">=2.2.3" }, { name = "peft", marker = "extra == 'transformers'", specifier = ">=0.18.1" }, + { name = "pip-audit", marker = "extra == 'dev'" }, { name = "platformdirs", marker = "extra == 'dev'", specifier = ">=4.3.6" }, { name = "polars", marker = "extra == 'polars'", specifier = ">=1.0.0" }, { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=3.7.1" }, @@ -880,6 +934,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cf/e3/35764404a4b7e2021be1f88f42264c2e92e0c4720273559a62461ce64a47/lexid-2021.1006-py2.py3-none-any.whl", hash = "sha256:5526bb5606fd74c7add23320da5f02805bddd7c77916f2dc1943e6bada8605ed", size = 7587, upload-time = "2021-04-02T20:18:33.129Z" }, ] +[[package]] +name = "license-expression" +version = "30.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "boolean-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/40/71/d89bb0e71b1415453980fd32315f2a037aad9f7f70f695c7cec7035feb13/license_expression-30.4.4.tar.gz", hash = "sha256:73448f0aacd8d0808895bdc4b2c8e01a8d67646e4188f887375398c761f340fd", size = 186402, upload-time = "2025-07-22T11:13:32.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl", hash = "sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4", size = 120615, upload-time = "2025-07-22T11:13:31.217Z" }, +] + [[package]] name = "lsprotocol" version = "2023.0.1" @@ -1003,6 +1069,67 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, ] +[[package]] +name = "msgpack" +version = "1.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/f2/bfb55a6236ed8725a96b0aa3acbd0ec17588e6a2c3b62a93eb513ed8783f/msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e", size = 173581, upload-time = "2025-10-08T09:15:56.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/a2/3b68a9e769db68668b25c6108444a35f9bd163bb848c0650d516761a59c0/msgpack-1.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0051fffef5a37ca2cd16978ae4f0aef92f164df86823871b5162812bebecd8e2", size = 81318, upload-time = "2025-10-08T09:14:38.722Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e1/2b720cc341325c00be44e1ed59e7cfeae2678329fbf5aa68f5bda57fe728/msgpack-1.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a605409040f2da88676e9c9e5853b3449ba8011973616189ea5ee55ddbc5bc87", size = 83786, upload-time = "2025-10-08T09:14:40.082Z" }, + { url = "https://files.pythonhosted.org/packages/71/e5/c2241de64bfceac456b140737812a2ab310b10538a7b34a1d393b748e095/msgpack-1.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b696e83c9f1532b4af884045ba7f3aa741a63b2bc22617293a2c6a7c645f251", size = 398240, upload-time = "2025-10-08T09:14:41.151Z" }, + { url = "https://files.pythonhosted.org/packages/b7/09/2a06956383c0fdebaef5aa9246e2356776f12ea6f2a44bd1368abf0e46c4/msgpack-1.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:365c0bbe981a27d8932da71af63ef86acc59ed5c01ad929e09a0b88c6294e28a", size = 406070, upload-time = "2025-10-08T09:14:42.821Z" }, + { url = "https://files.pythonhosted.org/packages/0e/74/2957703f0e1ef20637d6aead4fbb314330c26f39aa046b348c7edcf6ca6b/msgpack-1.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:41d1a5d875680166d3ac5c38573896453bbbea7092936d2e107214daf43b1d4f", size = 393403, upload-time = "2025-10-08T09:14:44.38Z" }, + { url = "https://files.pythonhosted.org/packages/a5/09/3bfc12aa90f77b37322fc33e7a8a7c29ba7c8edeadfa27664451801b9860/msgpack-1.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:354e81bcdebaab427c3df4281187edc765d5d76bfb3a7c125af9da7a27e8458f", size = 398947, upload-time = "2025-10-08T09:14:45.56Z" }, + { url = "https://files.pythonhosted.org/packages/4b/4f/05fcebd3b4977cb3d840f7ef6b77c51f8582086de5e642f3fefee35c86fc/msgpack-1.1.2-cp310-cp310-win32.whl", hash = "sha256:e64c8d2f5e5d5fda7b842f55dec6133260ea8f53c4257d64494c534f306bf7a9", size = 64769, upload-time = "2025-10-08T09:14:47.334Z" }, + { url = "https://files.pythonhosted.org/packages/d0/3e/b4547e3a34210956382eed1c85935fff7e0f9b98be3106b3745d7dec9c5e/msgpack-1.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:db6192777d943bdaaafb6ba66d44bf65aa0e9c5616fa1d2da9bb08828c6b39aa", size = 71293, upload-time = "2025-10-08T09:14:48.665Z" }, + { url = "https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2e86a607e558d22985d856948c12a3fa7b42efad264dca8a3ebbcfa2735d786c", size = 82271, upload-time = "2025-10-08T09:14:49.967Z" }, + { url = "https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:283ae72fc89da59aa004ba147e8fc2f766647b1251500182fac0350d8af299c0", size = 84914, upload-time = "2025-10-08T09:14:50.958Z" }, + { url = "https://files.pythonhosted.org/packages/71/46/b817349db6886d79e57a966346cf0902a426375aadc1e8e7a86a75e22f19/msgpack-1.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61c8aa3bd513d87c72ed0b37b53dd5c5a0f58f2ff9f26e1555d3bd7948fb7296", size = 416962, upload-time = "2025-10-08T09:14:51.997Z" }, + { url = "https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:454e29e186285d2ebe65be34629fa0e8605202c60fbc7c4c650ccd41870896ef", size = 426183, upload-time = "2025-10-08T09:14:53.477Z" }, + { url = "https://files.pythonhosted.org/packages/25/98/6a19f030b3d2ea906696cedd1eb251708e50a5891d0978b012cb6107234c/msgpack-1.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7bc8813f88417599564fafa59fd6f95be417179f76b40325b500b3c98409757c", size = 411454, upload-time = "2025-10-08T09:14:54.648Z" }, + { url = "https://files.pythonhosted.org/packages/b7/cd/9098fcb6adb32187a70b7ecaabf6339da50553351558f37600e53a4a2a23/msgpack-1.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bafca952dc13907bdfdedfc6a5f579bf4f292bdd506fadb38389afa3ac5b208e", size = 422341, upload-time = "2025-10-08T09:14:56.328Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ae/270cecbcf36c1dc85ec086b33a51a4d7d08fc4f404bdbc15b582255d05ff/msgpack-1.1.2-cp311-cp311-win32.whl", hash = "sha256:602b6740e95ffc55bfb078172d279de3773d7b7db1f703b2f1323566b878b90e", size = 64747, upload-time = "2025-10-08T09:14:57.882Z" }, + { url = "https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:d198d275222dc54244bf3327eb8cbe00307d220241d9cec4d306d49a44e85f68", size = 71633, upload-time = "2025-10-08T09:14:59.177Z" }, + { url = "https://files.pythonhosted.org/packages/73/4d/7c4e2b3d9b1106cd0aa6cb56cc57c6267f59fa8bfab7d91df5adc802c847/msgpack-1.1.2-cp311-cp311-win_arm64.whl", hash = "sha256:86f8136dfa5c116365a8a651a7d7484b65b13339731dd6faebb9a0242151c406", size = 64755, upload-time = "2025-10-08T09:15:00.48Z" }, + { url = "https://files.pythonhosted.org/packages/ad/bd/8b0d01c756203fbab65d265859749860682ccd2a59594609aeec3a144efa/msgpack-1.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:70a0dff9d1f8da25179ffcf880e10cf1aad55fdb63cd59c9a49a1b82290062aa", size = 81939, upload-time = "2025-10-08T09:15:01.472Z" }, + { url = "https://files.pythonhosted.org/packages/34/68/ba4f155f793a74c1483d4bdef136e1023f7bcba557f0db4ef3db3c665cf1/msgpack-1.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:446abdd8b94b55c800ac34b102dffd2f6aa0ce643c55dfc017ad89347db3dbdb", size = 85064, upload-time = "2025-10-08T09:15:03.764Z" }, + { url = "https://files.pythonhosted.org/packages/f2/60/a064b0345fc36c4c3d2c743c82d9100c40388d77f0b48b2f04d6041dbec1/msgpack-1.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c63eea553c69ab05b6747901b97d620bb2a690633c77f23feb0c6a947a8a7b8f", size = 417131, upload-time = "2025-10-08T09:15:05.136Z" }, + { url = "https://files.pythonhosted.org/packages/65/92/a5100f7185a800a5d29f8d14041f61475b9de465ffcc0f3b9fba606e4505/msgpack-1.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:372839311ccf6bdaf39b00b61288e0557916c3729529b301c52c2d88842add42", size = 427556, upload-time = "2025-10-08T09:15:06.837Z" }, + { url = "https://files.pythonhosted.org/packages/f5/87/ffe21d1bf7d9991354ad93949286f643b2bb6ddbeab66373922b44c3b8cc/msgpack-1.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2929af52106ca73fcb28576218476ffbb531a036c2adbcf54a3664de124303e9", size = 404920, upload-time = "2025-10-08T09:15:08.179Z" }, + { url = "https://files.pythonhosted.org/packages/ff/41/8543ed2b8604f7c0d89ce066f42007faac1eaa7d79a81555f206a5cdb889/msgpack-1.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be52a8fc79e45b0364210eef5234a7cf8d330836d0a64dfbb878efa903d84620", size = 415013, upload-time = "2025-10-08T09:15:09.83Z" }, + { url = "https://files.pythonhosted.org/packages/41/0d/2ddfaa8b7e1cee6c490d46cb0a39742b19e2481600a7a0e96537e9c22f43/msgpack-1.1.2-cp312-cp312-win32.whl", hash = "sha256:1fff3d825d7859ac888b0fbda39a42d59193543920eda9d9bea44d958a878029", size = 65096, upload-time = "2025-10-08T09:15:11.11Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ec/d431eb7941fb55a31dd6ca3404d41fbb52d99172df2e7707754488390910/msgpack-1.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:1de460f0403172cff81169a30b9a92b260cb809c4cb7e2fc79ae8d0510c78b6b", size = 72708, upload-time = "2025-10-08T09:15:12.554Z" }, + { url = "https://files.pythonhosted.org/packages/c5/31/5b1a1f70eb0e87d1678e9624908f86317787b536060641d6798e3cf70ace/msgpack-1.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:be5980f3ee0e6bd44f3a9e9dea01054f175b50c3e6cdb692bc9424c0bbb8bf69", size = 64119, upload-time = "2025-10-08T09:15:13.589Z" }, + { url = "https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4efd7b5979ccb539c221a4c4e16aac1a533efc97f3b759bb5a5ac9f6d10383bf", size = 81212, upload-time = "2025-10-08T09:15:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42eefe2c3e2af97ed470eec850facbe1b5ad1d6eacdbadc42ec98e7dcf68b4b7", size = 84315, upload-time = "2025-10-08T09:15:15.543Z" }, + { url = "https://files.pythonhosted.org/packages/d3/68/93180dce57f684a61a88a45ed13047558ded2be46f03acb8dec6d7c513af/msgpack-1.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1fdf7d83102bf09e7ce3357de96c59b627395352a4024f6e2458501f158bf999", size = 412721, upload-time = "2025-10-08T09:15:16.567Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fac4be746328f90caa3cd4bc67e6fe36ca2bf61d5c6eb6d895b6527e3f05071e", size = 424657, upload-time = "2025-10-08T09:15:17.825Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/4398c46863b093252fe67368b44edc6c13b17f4e6b0e4929dbf0bdb13f23/msgpack-1.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fffee09044073e69f2bad787071aeec727183e7580443dfeb8556cbf1978d162", size = 402668, upload-time = "2025-10-08T09:15:19.003Z" }, + { url = "https://files.pythonhosted.org/packages/28/ce/698c1eff75626e4124b4d78e21cca0b4cc90043afb80a507626ea354ab52/msgpack-1.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5928604de9b032bc17f5099496417f113c45bc6bc21b5c6920caf34b3c428794", size = 419040, upload-time = "2025-10-08T09:15:20.183Z" }, + { url = "https://files.pythonhosted.org/packages/67/32/f3cd1667028424fa7001d82e10ee35386eea1408b93d399b09fb0aa7875f/msgpack-1.1.2-cp313-cp313-win32.whl", hash = "sha256:a7787d353595c7c7e145e2331abf8b7ff1e6673a6b974ded96e6d4ec09f00c8c", size = 65037, upload-time = "2025-10-08T09:15:21.416Z" }, + { url = "https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:a465f0dceb8e13a487e54c07d04ae3ba131c7c5b95e2612596eafde1dccf64a9", size = 72631, upload-time = "2025-10-08T09:15:22.431Z" }, + { url = "https://files.pythonhosted.org/packages/e5/db/0314e4e2db56ebcf450f277904ffd84a7988b9e5da8d0d61ab2d057df2b6/msgpack-1.1.2-cp313-cp313-win_arm64.whl", hash = "sha256:e69b39f8c0aa5ec24b57737ebee40be647035158f14ed4b40e6f150077e21a84", size = 64118, upload-time = "2025-10-08T09:15:23.402Z" }, + { url = "https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e23ce8d5f7aa6ea6d2a2b326b4ba46c985dbb204523759984430db7114f8aa00", size = 81127, upload-time = "2025-10-08T09:15:24.408Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c15b7d74c939ebe620dd8e559384be806204d73b4f9356320632d783d1f7939", size = 84981, upload-time = "2025-10-08T09:15:25.812Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a9/3536e385167b88c2cc8f4424c49e28d49a6fc35206d4a8060f136e71f94c/msgpack-1.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e2cb7b9031568a2a5c73aa077180f93dd2e95b4f8d3b8e14a73ae94a9e667e", size = 411885, upload-time = "2025-10-08T09:15:27.22Z" }, + { url = "https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:180759d89a057eab503cf62eeec0aa61c4ea1200dee709f3a8e9397dbb3b6931", size = 419658, upload-time = "2025-10-08T09:15:28.4Z" }, + { url = "https://files.pythonhosted.org/packages/3b/ef/2b92e286366500a09a67e03496ee8b8ba00562797a52f3c117aa2b29514b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:04fb995247a6e83830b62f0b07bf36540c213f6eac8e851166d8d86d83cbd014", size = 403290, upload-time = "2025-10-08T09:15:29.764Z" }, + { url = "https://files.pythonhosted.org/packages/78/90/e0ea7990abea5764e4655b8177aa7c63cdfa89945b6e7641055800f6c16b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8e22ab046fa7ede9e36eeb4cfad44d46450f37bb05d5ec482b02868f451c95e2", size = 415234, upload-time = "2025-10-08T09:15:31.022Z" }, + { url = "https://files.pythonhosted.org/packages/72/4e/9390aed5db983a2310818cd7d3ec0aecad45e1f7007e0cda79c79507bb0d/msgpack-1.1.2-cp314-cp314-win32.whl", hash = "sha256:80a0ff7d4abf5fecb995fcf235d4064b9a9a8a40a3ab80999e6ac1e30b702717", size = 66391, upload-time = "2025-10-08T09:15:32.265Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:9ade919fac6a3e7260b7f64cea89df6bec59104987cbea34d34a2fa15d74310b", size = 73787, upload-time = "2025-10-08T09:15:33.219Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b0/9d9f667ab48b16ad4115c1935d94023b82b3198064cb84a123e97f7466c1/msgpack-1.1.2-cp314-cp314-win_arm64.whl", hash = "sha256:59415c6076b1e30e563eb732e23b994a61c159cec44deaf584e5cc1dd662f2af", size = 66453, upload-time = "2025-10-08T09:15:34.225Z" }, + { url = "https://files.pythonhosted.org/packages/16/67/93f80545eb1792b61a217fa7f06d5e5cb9e0055bed867f43e2b8e012e137/msgpack-1.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:897c478140877e5307760b0ea66e0932738879e7aa68144d9b78ea4c8302a84a", size = 85264, upload-time = "2025-10-08T09:15:35.61Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/33c8a24959cf193966ef11a6f6a2995a65eb066bd681fd085afd519a57ce/msgpack-1.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a668204fa43e6d02f89dbe79a30b0d67238d9ec4c5bd8a940fc3a004a47b721b", size = 89076, upload-time = "2025-10-08T09:15:36.619Z" }, + { url = "https://files.pythonhosted.org/packages/fc/6b/62e85ff7193663fbea5c0254ef32f0c77134b4059f8da89b958beb7696f3/msgpack-1.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5559d03930d3aa0f3aacb4c42c776af1a2ace2611871c84a75afe436695e6245", size = 435242, upload-time = "2025-10-08T09:15:37.647Z" }, + { url = "https://files.pythonhosted.org/packages/c1/47/5c74ecb4cc277cf09f64e913947871682ffa82b3b93c8dad68083112f412/msgpack-1.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70c5a7a9fea7f036b716191c29047374c10721c389c21e9ffafad04df8c52c90", size = 432509, upload-time = "2025-10-08T09:15:38.794Z" }, + { url = "https://files.pythonhosted.org/packages/24/a4/e98ccdb56dc4e98c929a3f150de1799831c0a800583cde9fa022fa90602d/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2cb069d8b981abc72b41aea1c580ce92d57c673ec61af4c500153a626cb9e20", size = 415957, upload-time = "2025-10-08T09:15:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/da/28/6951f7fb67bc0a4e184a6b38ab71a92d9ba58080b27a77d3e2fb0be5998f/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d62ce1f483f355f61adb5433ebfd8868c5f078d1a52d042b0a998682b4fa8c27", size = 422910, upload-time = "2025-10-08T09:15:41.505Z" }, + { url = "https://files.pythonhosted.org/packages/f0/03/42106dcded51f0a0b5284d3ce30a671e7bd3f7318d122b2ead66ad289fed/msgpack-1.1.2-cp314-cp314t-win32.whl", hash = "sha256:1d1418482b1ee984625d88aa9585db570180c286d942da463533b238b98b812b", size = 75197, upload-time = "2025-10-08T09:15:42.954Z" }, + { url = "https://files.pythonhosted.org/packages/15/86/d0071e94987f8db59d4eeb386ddc64d0bb9b10820a8d82bcd3e53eeb2da6/msgpack-1.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:5a46bf7e831d09470ad92dff02b8b1ac92175ca36b087f904a0519857c6be3ff", size = 85772, upload-time = "2025-10-08T09:15:43.954Z" }, + { url = "https://files.pythonhosted.org/packages/81/f2/08ace4142eb281c12701fc3b93a10795e4d4dc7f753911d836675050f886/msgpack-1.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d99ef64f349d5ec3293688e91486c5fdb925ed03807f64d98d205d2713c60b46", size = 70868, upload-time = "2025-10-08T09:15:44.959Z" }, +] + [[package]] name = "networkx" version = "3.4.2" @@ -1259,6 +1386,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a2/eb/86626c1bbc2edb86323022371c39aa48df6fd8b0a1647bc274577f72e90b/nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b17e2001cc0d751a5bc2c6ec6d26ad95913324a4adb86788c944f8ce9ba441f", size = 89954, upload-time = "2025-03-07T01:42:44.131Z" }, ] +[[package]] +name = "packageurl-python" +version = "0.17.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/d6/3b5a4e3cfaef7a53869a26ceb034d1ff5e5c27c814ce77260a96d50ab7bb/packageurl_python-0.17.6.tar.gz", hash = "sha256:1252ce3a102372ca6f86eb968e16f9014c4ba511c5c37d95a7f023e2ca6e5c25", size = 50618, upload-time = "2025-11-24T15:20:17.998Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/2f/c7277b7615a93f51b5fbc1eacfc1b75e8103370e786fd8ce2abf6e5c04ab/packageurl_python-0.17.6-py3-none-any.whl", hash = "sha256:31a85c2717bc41dd818f3c62908685ff9eebcb68588213745b14a6ee9e7df7c9", size = 36776, upload-time = "2025-11-24T15:20:16.962Z" }, +] + [[package]] name = "packaging" version = "25.0" @@ -1337,6 +1473,61 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b3/14/b4e3f574acf349ae6f61f9c000a77f97a3b315b4bb6ad03791e79ae4a568/peft-0.18.1-py3-none-any.whl", hash = "sha256:0bf06847a3551e3019fc58c440cffc9a6b73e6e2962c95b52e224f77bbdb50f1", size = 556960, upload-time = "2026-01-09T13:07:55.865Z" }, ] +[[package]] +name = "pip" +version = "26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/c2/65686a7783a7c27a329706207147e82f23c41221ee9ae33128fc331670a0/pip-26.0.tar.gz", hash = "sha256:3ce220a0a17915972fbf1ab451baae1521c4539e778b28127efa79b974aff0fa", size = 1812654, upload-time = "2026-01-31T01:40:54.361Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/00/5ac7aa77688ec4d34148b423d34dc0c9bc4febe0d872a9a1ad9860b2f6f1/pip-26.0-py3-none-any.whl", hash = "sha256:98436feffb9e31bc9339cf369fd55d3331b1580b6a6f1173bacacddcf9c34754", size = 1787564, upload-time = "2026-01-31T01:40:52.252Z" }, +] + +[[package]] +name = "pip-api" +version = "0.0.34" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pip" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/f1/ee85f8c7e82bccf90a3c7aad22863cc6e20057860a1361083cd2adacb92e/pip_api-0.0.34.tar.gz", hash = "sha256:9b75e958f14c5a2614bae415f2adf7eeb54d50a2cfbe7e24fd4826471bac3625", size = 123017, upload-time = "2024-07-09T20:32:30.641Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/f7/ebf5003e1065fd00b4cbef53bf0a65c3d3e1b599b676d5383ccb7a8b88ba/pip_api-0.0.34-py3-none-any.whl", hash = "sha256:8b2d7d7c37f2447373aa2cf8b1f60a2f2b27a84e1e9e0294a3f6ef10eb3ba6bb", size = 120369, upload-time = "2024-07-09T20:32:29.099Z" }, +] + +[[package]] +name = "pip-audit" +version = "2.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cachecontrol", extra = ["filecache"] }, + { name = "cyclonedx-python-lib" }, + { name = "packaging" }, + { name = "pip-api" }, + { name = "pip-requirements-parser" }, + { name = "platformdirs" }, + { name = "requests" }, + { name = "rich" }, + { name = "tomli" }, + { name = "tomli-w" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/89/0e999b413facab81c33d118f3ac3739fd02c0622ccf7c4e82e37cebd8447/pip_audit-2.10.0.tar.gz", hash = "sha256:427ea5bf61d1d06b98b1ae29b7feacc00288a2eced52c9c58ceed5253ef6c2a4", size = 53776, upload-time = "2025-12-01T23:42:40.612Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/f3/4888f895c02afa085630a3a3329d1b18b998874642ad4c530e9a4d7851fe/pip_audit-2.10.0-py3-none-any.whl", hash = "sha256:16e02093872fac97580303f0848fa3ad64f7ecf600736ea7835a2b24de49613f", size = 61518, upload-time = "2025-12-01T23:42:39.193Z" }, +] + +[[package]] +name = "pip-requirements-parser" +version = "32.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, + { name = "pyparsing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/2a/63b574101850e7f7b306ddbdb02cb294380d37948140eecd468fae392b54/pip-requirements-parser-32.0.1.tar.gz", hash = "sha256:b4fa3a7a0be38243123cf9d1f3518da10c51bdb165a2b2985566247f9155a7d3", size = 209359, upload-time = "2022-12-21T15:25:22.732Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/d0/d04f1d1e064ac901439699ee097f58688caadea42498ec9c4b4ad2ef84ab/pip_requirements_parser-32.0.1-py3-none-any.whl", hash = "sha256:4659bc2a667783e7a15d190f6fccf8b2486685b6dba4c19c3876314769c57526", size = 35648, upload-time = "2022-12-21T15:25:21.046Z" }, +] + [[package]] name = "platformdirs" version = "4.3.8" @@ -1413,6 +1604,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3e/73/2ce007f4198c80fcf2cb24c169884f833fe93fbc03d55d302627b094ee91/psutil-7.2.1-cp37-abi3-win_arm64.whl", hash = "sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442", size = 133836, upload-time = "2025-12-29T08:26:43.086Z" }, ] +[[package]] +name = "py-serializable" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "defusedxml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/21/d250cfca8ff30c2e5a7447bc13861541126ce9bd4426cd5d0c9f08b5547d/py_serializable-2.1.0.tar.gz", hash = "sha256:9d5db56154a867a9b897c0163b33a793c804c80cee984116d02d49e4578fc103", size = 52368, upload-time = "2025-07-21T09:56:48.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/bf/7595e817906a29453ba4d99394e781b6fabe55d21f3c15d240f85dd06bb1/py_serializable-2.1.0-py3-none-any.whl", hash = "sha256:b56d5d686b5a03ba4f4db5e769dc32336e142fc3bd4d68a8c25579ebb0a67304", size = 23045, upload-time = "2025-07-21T09:56:46.848Z" }, +] + [[package]] name = "pycparser" version = "2.22" @@ -1539,6 +1742,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + [[package]] name = "pyspellchecker" version = "0.8.3" @@ -1955,6 +2167,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload-time = "2025-05-09T16:34:50.371Z" }, ] +[[package]] +name = "sortedcontainers" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, +] + [[package]] name = "soupsieve" version = "2.7" @@ -2226,6 +2447,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" }, ] +[[package]] +name = "tomli-w" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/75/241269d1da26b624c0d5e110e8149093c759b7a286138f4efd61a60e75fe/tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021", size = 7184, upload-time = "2025-01-15T12:07:24.262Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90", size = 6675, upload-time = "2025-01-15T12:07:22.074Z" }, +] + [[package]] name = "torch" version = "2.9.1" From 2b352db8ab0c2fda7b0d62f78431cd93622ad4ac Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Wed, 4 Feb 2026 12:04:02 +0200 Subject: [PATCH 03/29] Switch to `dependency-groups` for development to match better modern Python development standards This does mean though that `uv` is now the only recommended development install workflow --- .envrc | 2 +- .pre-commit-config.yaml | 6 +- DEV_README.md | 15 ++--- pyproject.toml | 19 ++---- requirements/dev.txt | 141 +++++++++++++++++++++++++++++++++++----- requirements/docs.txt | 129 ++++++++++++++++++++++++++++++++---- uv.lock | 108 +++++++++++++++--------------- 7 files changed, 309 insertions(+), 111 deletions(-) diff --git a/.envrc b/.envrc index b2d2268b..95c9ec78 100644 --- a/.envrc +++ b/.envrc @@ -1,2 +1,2 @@ watch_file uv.lock -uv sync --all-extras && source .venv/bin/activate +uv sync --all-groups && source .venv/bin/activate diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 25c82ebb..1f77215d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -34,7 +34,7 @@ repos: - id: pip-compile-dev name: compile requirements/dev.txt entry: uv - args: ["pip", "compile", "--extra", "dev", "-o", "requirements/dev.txt", "-c", "requirements/requirements.txt"] + args: ["pip", "compile", "--group", "dev", "-o", "requirements/dev.txt", "-c", "requirements/requirements.txt"] language: python always_run: false files: pyproject.toml$ @@ -56,7 +56,7 @@ repos: - id: pip-compile-docs name: compile requirements/docs.txt entry: uv - args: ["pip", "compile", "--extra", "docs", "-o", "requirements/docs.txt", "-c", "requirements/requirements.txt"] + args: ["pip", "compile", "--group", "docs", "-o", "requirements/docs.txt", "-c", "requirements/requirements.txt"] language: python always_run: false files: pyproject.toml$ @@ -75,4 +75,4 @@ repos: hooks: - id: uv-lock - id: uv-sync - args: ["--extra", "dev", "--extra", "docs", "--extra", "pandas", "--extra", "polars", "--extra", "transformers"] + args: ["--all-groups"] diff --git a/DEV_README.md b/DEV_README.md index a3ebf336..f5683512 100644 --- a/DEV_README.md +++ b/DEV_README.md @@ -18,7 +18,7 @@ When opening Pull Requests, note that the repository has GitHub Actions which ru pip install -r requirements/dev.txt ``` -Note: You can install and use `uv` as a faster drop-in replacement for `pip`. We have it as part of our dev dependencies for this reason. +Note: You can [install](https://docs.astral.sh/uv/getting-started/installation/) and use [`uv`](https://docs.astral.sh/uv/) as a faster drop-in replacement for `pip`. We have it as part of our dev dependencies for this reason. ### Install `git` hooks (optional) ### Install `git` hooks (optional) @@ -36,26 +36,21 @@ ruff format ### Change packages -#### Update `requirements.txt` files +#### Update `requirements.txt` files (optional; pre-commit hooks run this automatically) ```bash uv pip compile pyproject.toml -uv pip compile --extra dev -o requirements/dev.txt -c requirements.txt pyproject.toml +uv pip compile --group dev -o requirements/dev.txt -c requirements.txt pyproject.toml uv pip compile --extra pandas -o requirements/pandas.txt -c requirements.txt pyproject.toml uv pip compile --extra polars -o requirements/polars.txt -c requirements.txt pyproject.toml uv pip compile --extra docs -o requirements/docs.txt -c requirements.txt pyproject.toml uv pip compile --extra transformers -o requirements/transformers.txt -c requirements.txt pyproject.toml ``` -#### Sync installed packages +#### Sync installed packages (optional; pre-commit hooks run this automatically) ```bash -uv pip sync requirements/dev.txt requirements/pandas.txt requirements/polars.txt requirements/docs.txt requirements/transformers.txt -``` -or - -```bash -uv sync --extra dev --extra pandas --extra polars --extra docs --extra transformers +uv sync --all-groups ``` ### Build process diff --git a/pyproject.toml b/pyproject.toml index 393f57de..53924dc1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -50,18 +50,15 @@ hirundo = "hirundo.cli:app" Homepage = "https://github.com/Hirundo-io/hirundo-python-sdk" [project.optional-dependencies] +pandas = ["pandas>=2.2.3"] +polars = ["polars>=1.0.0"] +transformers = ["transformers>=4.57.3", "peft>=0.18.1", "accelerate>=1.12.0"] + +[dependency-groups] dev = [ - "pyyaml>=6.0.1", - "types-PyYAML>=6.0.12", - "pydantic>=2.7.1", + "hirundo[pandas,polars,transformers]", "twine>=5.0.0", - "python-dotenv>=1.0.1", - "types-requests>=2.31.0", "types-setuptools>=69.5.0", - "typer>=0.12.3", - "httpx>=0.27.0", - "stamina>=24.2.0", - "httpx-sse>=0.4.0", "pytest>=8.2.0", "pytest-asyncio>=0.23.6", "uv>=0.9.6", @@ -85,6 +82,7 @@ dev = [ "pip-audit", ] docs = [ + "hirundo[pandas,polars,transformers]", "sphinx>=7.4.7", "sphinx-autobuild>=2024.9.3", "sphinx-click>=5.0.1", @@ -99,9 +97,6 @@ docs = [ "jinja2>=3.1.6", # ⬆️ Required to fix vulnerabilities GHSA-cpwx-vrp4-4pq7 , GHSA-gmj6-6f8f-6699 & GHSA-q2x7-8rv6-6q7h ] -pandas = ["pandas>=2.2.3"] -polars = ["polars>=1.0.0"] -transformers = ["transformers>=4.57.3", "peft>=0.18.1", "accelerate>=1.12.0"] [tool.bumpver] current_version = "0.2.3.post1" diff --git a/requirements/dev.txt b/requirements/dev.txt index 69d2b2c8..d95b32d3 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,5 +1,9 @@ # This file was autogenerated by uv via the following command: -# uv pip compile --extra dev -o requirements/dev.txt -c requirements/requirements.txt pyproject.toml +# uv pip compile --group dev -o requirements/dev.txt -c requirements/requirements.txt pyproject.toml +accelerate==1.12.0 + # via + # hirundo + # peft annotated-types==0.7.0 # via # -c requirements/requirements.txt @@ -9,13 +13,13 @@ anyio==4.12.1 # -c requirements/requirements.txt # httpx authlib==1.6.6 - # via hirundo (pyproject.toml) + # via hirundo (pyproject.toml:dev) basedpyright==1.37.1 - # via hirundo (pyproject.toml) + # via hirundo (pyproject.toml:dev) boolean-py==5.0 # via license-expression bumpver==2025.1131 - # via hirundo (pyproject.toml) + # via hirundo (pyproject.toml:dev) cachecontrol==0.14.4 # via pip-audit certifi==2026.1.4 @@ -37,11 +41,12 @@ click==8.3.1 # -c requirements/requirements.txt # bumpver # typer + # typer-slim colorama==0.4.6 # via bumpver cryptography==46.0.3 # via - # hirundo (pyproject.toml) + # hirundo (pyproject.toml:dev) # authlib cyclonedx-python-lib==11.6.0 # via pip-audit @@ -53,17 +58,30 @@ docutils==0.21.2 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo # readme-renderer filelock==3.20.3 # via - # hirundo (pyproject.toml) + # hirundo (pyproject.toml:dev) # cachecontrol + # huggingface-hub + # torch + # transformers # virtualenv +fsspec==2026.1.0 + # via + # huggingface-hub + # torch h11==0.16.0 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo # httpcore +hf-xet==1.2.0 + # via huggingface-hub +hirundo==0.2.3.post1 + # via hirundo (pyproject.toml:dev) httpcore==1.0.9 # via # -c requirements/requirements.txt @@ -72,10 +90,19 @@ httpx==0.28.1 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo + # huggingface-hub httpx-sse==0.4.3 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo +huggingface-hub==1.3.7 + # via + # accelerate + # peft + # tokenizers + # transformers id==1.5.0 # via # -c requirements/requirements.txt @@ -103,7 +130,9 @@ jaraco-functools==4.4.0 # -c requirements/requirements.txt # keyring jinja2==3.1.6 - # via hirundo (pyproject.toml) + # via + # hirundo (pyproject.toml:dev) + # torch keyring==25.7.0 # via # -c requirements/requirements.txt @@ -119,7 +148,7 @@ markdown-it-py==4.0.0 markupsafe==3.0.3 # via jinja2 marshmallow==4.2.0 - # via hirundo (pyproject.toml) + # via hirundo (pyproject.toml:dev) mdurl==0.1.2 # via # -c requirements/requirements.txt @@ -129,8 +158,12 @@ more-itertools==10.8.0 # -c requirements/requirements.txt # jaraco-classes # jaraco-functools +mpmath==1.3.0 + # via sympy msgpack==1.1.2 # via cachecontrol +networkx==3.6.1 + # via torch nh3==0.3.2 # via # -c requirements/requirements.txt @@ -139,32 +172,54 @@ nodeenv==1.10.0 # via pre-commit nodejs-wheel-binaries==24.13.0 # via basedpyright +numpy==2.4.2 + # via + # accelerate + # pandas + # peft + # transformers packageurl-python==0.17.6 # via cyclonedx-python-lib packaging==26.0 # via # -c requirements/requirements.txt + # accelerate + # huggingface-hub + # peft # pip-audit # pip-requirements-parser # pytest + # transformers # twine +pandas==3.0.0 + # via hirundo +peft==0.18.1 + # via hirundo pip==26.0 # via pip-api pip-api==0.0.34 # via pip-audit pip-audit==2.10.0 - # via hirundo (pyproject.toml) + # via hirundo (pyproject.toml:dev) pip-requirements-parser==32.0.1 # via pip-audit platformdirs==4.5.1 # via - # hirundo (pyproject.toml) + # hirundo (pyproject.toml:dev) # pip-audit # virtualenv pluggy==1.6.0 # via pytest +polars==1.37.1 + # via hirundo +polars-runtime-32==1.37.1 + # via polars pre-commit==4.5.1 - # via hirundo (pyproject.toml) + # via hirundo (pyproject.toml:dev) +psutil==7.2.2 + # via + # accelerate + # peft py-serializable==2.1.0 # via cyclonedx-python-lib pycparser==3.0 @@ -173,6 +228,7 @@ pydantic==2.12.5 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo pydantic-core==2.41.5 # via # -c requirements/requirements.txt @@ -187,28 +243,39 @@ pyparsing==3.3.2 # via pip-requirements-parser pytest==9.0.2 # via - # hirundo (pyproject.toml) + # hirundo (pyproject.toml:dev) # pytest-asyncio pytest-asyncio==1.3.0 - # via hirundo (pyproject.toml) + # via hirundo (pyproject.toml:dev) +python-dateutil==2.9.0.post0 + # via pandas python-dotenv==1.2.1 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo pyyaml==6.0.3 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # accelerate + # hirundo + # huggingface-hub + # peft # pre-commit + # transformers readme-renderer==44.0 # via # -c requirements/requirements.txt # twine +regex==2026.1.15 + # via transformers requests==2.32.5 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) # cachecontrol + # hirundo # id # pip-audit # requests-toolbelt @@ -228,59 +295,98 @@ rich==14.2.0 # twine # typer ruff==0.14.13 - # via hirundo (pyproject.toml) + # via hirundo (pyproject.toml:dev) +safetensors==0.7.0 + # via + # accelerate + # peft + # transformers setuptools==80.10.1 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo + # torch shellingham==1.5.4 # via # -c requirements/requirements.txt + # huggingface-hub # typer +six==1.17.0 + # via python-dateutil sortedcontainers==2.4.0 # via cyclonedx-python-lib stamina==25.2.0 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo +sympy==1.14.0 + # via torch tenacity==9.1.2 # via # -c requirements/requirements.txt # stamina +tokenizers==0.22.2 + # via transformers toml==0.10.2 # via bumpver tomli==2.4.0 # via pip-audit tomli-w==1.2.0 # via pip-audit +torch==2.10.0 + # via + # accelerate + # peft tqdm==4.67.1 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo + # huggingface-hub + # peft + # transformers +transformers==5.0.0 + # via + # hirundo + # peft twine==6.2.0 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo (pyproject.toml:dev) + # hirundo typer==0.21.1 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo +typer-slim==0.21.1 + # via + # huggingface-hub + # transformers types-pyyaml==6.0.12.20250915 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo types-requests==2.32.4.20260107 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo types-setuptools==80.9.0.20251223 - # via hirundo (pyproject.toml) + # via hirundo (pyproject.toml:dev) typing-extensions==4.15.0 # via # -c requirements/requirements.txt + # huggingface-hub # pydantic # pydantic-core + # torch # typer + # typer-slim # typing-inspection typing-inspection==0.4.2 # via @@ -290,12 +396,13 @@ urllib3==2.6.3 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo # requests # twine # types-requests uv==0.9.26 - # via hirundo (pyproject.toml) + # via hirundo (pyproject.toml:dev) virtualenv==20.36.1 # via - # hirundo (pyproject.toml) + # hirundo (pyproject.toml:dev) # pre-commit diff --git a/requirements/docs.txt b/requirements/docs.txt index 23d09419..77b8ed67 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -1,5 +1,9 @@ # This file was autogenerated by uv via the following command: -# uv pip compile --extra docs -o requirements/docs.txt -c requirements/requirements.txt pyproject.toml +# uv pip compile --group docs -o requirements/docs.txt -c requirements/requirements.txt pyproject.toml +accelerate==1.12.0 + # via + # hirundo + # peft accessible-pygments==0.0.5 # via furo aiosqlite==0.22.1 @@ -22,7 +26,7 @@ attrs==25.4.0 # lsprotocol # pygls autodoc-pydantic==2.2.0 - # via hirundo (pyproject.toml) + # via hirundo (pyproject.toml:docs) babel==2.17.0 # via sphinx beautifulsoup4==4.14.3 @@ -46,6 +50,7 @@ click==8.3.1 # -c requirements/requirements.txt # sphinx-click # typer + # typer-slim # uvicorn colorama==0.4.6 # via sphinx-autobuild @@ -54,19 +59,34 @@ docutils==0.21.2 # -c requirements/requirements.txt # hirundo (pyproject.toml) # esbonio + # hirundo # readme-renderer # sphinx # sphinx-click esbonio==1.0.0 - # via hirundo (pyproject.toml) + # via hirundo (pyproject.toml:docs) +filelock==3.20.3 + # via + # huggingface-hub + # torch + # transformers +fsspec==2026.1.0 + # via + # huggingface-hub + # torch furo==2025.12.19 - # via hirundo (pyproject.toml) + # via hirundo (pyproject.toml:docs) h11==0.16.0 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo # httpcore # uvicorn +hf-xet==1.2.0 + # via huggingface-hub +hirundo==0.2.3.post1 + # via hirundo (pyproject.toml:docs) httpcore==1.0.9 # via # -c requirements/requirements.txt @@ -75,10 +95,19 @@ httpx==0.28.1 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo + # huggingface-hub httpx-sse==0.4.3 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo +huggingface-hub==1.3.7 + # via + # accelerate + # peft + # tokenizers + # transformers id==1.5.0 # via # -c requirements/requirements.txt @@ -105,8 +134,9 @@ jaraco-functools==4.4.0 # keyring jinja2==3.1.6 # via - # hirundo (pyproject.toml) + # hirundo (pyproject.toml:docs) # sphinx + # torch keyring==25.7.0 # via # -c requirements/requirements.txt @@ -119,7 +149,7 @@ markdown-it-py==4.0.0 # rich markupsafe==3.0.3 # via - # hirundo (pyproject.toml) + # hirundo (pyproject.toml:docs) # jinja2 mdurl==0.1.2 # via @@ -130,22 +160,49 @@ more-itertools==10.8.0 # -c requirements/requirements.txt # jaraco-classes # jaraco-functools +mpmath==1.3.0 + # via sympy +networkx==3.6.1 + # via torch nh3==0.3.2 # via # -c requirements/requirements.txt # readme-renderer +numpy==2.4.2 + # via + # accelerate + # pandas + # peft + # transformers packaging==26.0 # via # -c requirements/requirements.txt + # accelerate + # huggingface-hub + # peft # sphinx + # transformers # twine +pandas==3.0.0 + # via hirundo +peft==0.18.1 + # via hirundo platformdirs==4.5.1 # via esbonio +polars==1.37.1 + # via hirundo +polars-runtime-32==1.37.1 + # via polars +psutil==7.2.2 + # via + # accelerate + # peft pydantic==2.12.5 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) # autodoc-pydantic + # hirundo # pydantic-settings pydantic-core==2.41.5 # via @@ -163,23 +220,34 @@ pygments==2.19.2 # readme-renderer # rich # sphinx +python-dateutil==2.9.0.post0 + # via pandas python-dotenv==1.2.1 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo # pydantic-settings pyyaml==6.0.3 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # accelerate + # hirundo + # huggingface-hub + # peft + # transformers readme-renderer==44.0 # via # -c requirements/requirements.txt # twine +regex==2026.1.15 + # via transformers requests==2.32.5 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo # id # requests-toolbelt # sphinx @@ -197,21 +265,31 @@ rich==14.2.0 # -c requirements/requirements.txt # twine # typer +safetensors==0.7.0 + # via + # accelerate + # peft + # transformers setuptools==80.10.1 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo + # torch shellingham==1.5.4 # via # -c requirements/requirements.txt + # huggingface-hub # typer +six==1.17.0 + # via python-dateutil snowballstemmer==3.0.1 # via sphinx soupsieve==2.8.3 # via beautifulsoup4 sphinx==8.1.3 # via - # hirundo (pyproject.toml) + # hirundo (pyproject.toml:docs) # autodoc-pydantic # furo # sphinx-autobuild @@ -219,13 +297,13 @@ sphinx==8.1.3 # sphinx-click # sphinx-multiversion sphinx-autobuild==2024.10.3 - # via hirundo (pyproject.toml) + # via hirundo (pyproject.toml:docs) sphinx-basic-ng==1.0.0b2 # via furo sphinx-click==6.2.0 - # via hirundo (pyproject.toml) + # via hirundo (pyproject.toml:docs) sphinx-multiversion==0.2.4 - # via hirundo (pyproject.toml) + # via hirundo (pyproject.toml:docs) sphinxcontrib-applehelp==2.0.0 # via sphinx sphinxcontrib-devhelp==2.0.0 @@ -242,42 +320,70 @@ stamina==25.2.0 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo starlette==0.52.1 # via - # hirundo (pyproject.toml) + # hirundo (pyproject.toml:docs) # sphinx-autobuild +sympy==1.14.0 + # via torch tenacity==9.1.2 # via # -c requirements/requirements.txt # stamina +tokenizers==0.22.2 + # via transformers +torch==2.10.0 + # via + # accelerate + # peft tqdm==4.67.1 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo + # huggingface-hub + # peft + # transformers +transformers==5.0.0 + # via + # hirundo + # peft twine==6.2.0 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo typer==0.21.1 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo +typer-slim==0.21.1 + # via + # huggingface-hub + # transformers types-pyyaml==6.0.12.20250915 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo types-requests==2.32.4.20260107 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo typing-extensions==4.15.0 # via # -c requirements/requirements.txt # beautifulsoup4 # cattrs + # huggingface-hub # pydantic # pydantic-core + # torch # typer + # typer-slim # typing-inspection typing-inspection==0.4.2 # via @@ -288,6 +394,7 @@ urllib3==2.6.3 # via # -c requirements/requirements.txt # hirundo (pyproject.toml) + # hirundo # requests # twine # types-requests diff --git a/uv.lock b/uv.lock index 58481758..47dd94d5 100644 --- a/uv.lock +++ b/uv.lock @@ -620,30 +620,35 @@ dependencies = [ ] [package.optional-dependencies] +pandas = [ + { name = "pandas" }, +] +polars = [ + { name = "polars" }, +] +transformers = [ + { name = "accelerate" }, + { name = "peft" }, + { name = "transformers" }, +] + +[package.dev-dependencies] dev = [ { name = "authlib" }, { name = "basedpyright" }, { name = "bumpver" }, { name = "cryptography" }, { name = "filelock" }, - { name = "httpx" }, - { name = "httpx-sse" }, + { name = "hirundo", extra = ["pandas", "polars", "transformers"] }, { name = "jinja2" }, { name = "marshmallow" }, { name = "pip-audit" }, { name = "platformdirs" }, { name = "pre-commit" }, - { name = "pydantic" }, { name = "pytest" }, { name = "pytest-asyncio" }, - { name = "python-dotenv" }, - { name = "pyyaml" }, { name = "ruff" }, - { name = "stamina" }, { name = "twine" }, - { name = "typer" }, - { name = "types-pyyaml" }, - { name = "types-requests" }, { name = "types-setuptools" }, { name = "uv" }, { name = "virtualenv" }, @@ -652,6 +657,7 @@ docs = [ { name = "autodoc-pydantic" }, { name = "esbonio" }, { name = "furo" }, + { name = "hirundo", extra = ["pandas", "polars", "transformers"] }, { name = "jinja2" }, { name = "markupsafe" }, { name = "sphinx" }, @@ -660,79 +666,67 @@ docs = [ { name = "sphinx-multiversion" }, { name = "starlette" }, ] -pandas = [ - { name = "pandas" }, -] -polars = [ - { name = "polars" }, -] -transformers = [ - { name = "accelerate" }, - { name = "peft" }, - { name = "transformers" }, -] [package.metadata] requires-dist = [ { name = "accelerate", marker = "extra == 'transformers'", specifier = ">=1.12.0" }, - { name = "authlib", marker = "extra == 'dev'", specifier = ">=1.6.6" }, - { name = "autodoc-pydantic", marker = "extra == 'docs'", specifier = ">=2.2.0" }, - { name = "basedpyright", marker = "extra == 'dev'", specifier = "==1.37.1" }, - { name = "bumpver", marker = "extra == 'dev'", specifier = ">=2025.1131" }, - { name = "cryptography", marker = "extra == 'dev'", specifier = ">=44.0.1" }, { name = "docutils", specifier = "<0.22.0" }, - { name = "esbonio", marker = "extra == 'docs'" }, - { name = "filelock", marker = "extra == 'dev'", specifier = ">=3.20.1" }, - { name = "furo", marker = "extra == 'docs'" }, { name = "h11", specifier = ">=0.16.0" }, { name = "httpx", specifier = ">=0.27.0" }, - { name = "httpx", marker = "extra == 'dev'", specifier = ">=0.27.0" }, { name = "httpx-sse", specifier = ">=0.4.0" }, - { name = "httpx-sse", marker = "extra == 'dev'", specifier = ">=0.4.0" }, - { name = "jinja2", marker = "extra == 'dev'", specifier = ">=3.1.6" }, - { name = "jinja2", marker = "extra == 'docs'", specifier = ">=3.1.6" }, - { name = "markupsafe", marker = "extra == 'docs'", specifier = ">=3.0.2" }, - { name = "marshmallow", marker = "extra == 'dev'", specifier = ">=3.26.2" }, { name = "pandas", marker = "extra == 'pandas'", specifier = ">=2.2.3" }, { name = "peft", marker = "extra == 'transformers'", specifier = ">=0.18.1" }, - { name = "pip-audit", marker = "extra == 'dev'" }, - { name = "platformdirs", marker = "extra == 'dev'", specifier = ">=4.3.6" }, { name = "polars", marker = "extra == 'polars'", specifier = ">=1.0.0" }, - { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=3.7.1" }, { name = "pydantic", specifier = ">=2.7.1" }, - { name = "pydantic", marker = "extra == 'dev'", specifier = ">=2.7.1" }, - { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.2.0" }, - { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.23.6" }, { name = "python-dotenv", specifier = ">=1.0.1" }, - { name = "python-dotenv", marker = "extra == 'dev'", specifier = ">=1.0.1" }, { name = "pyyaml", specifier = ">=6.0.1" }, - { name = "pyyaml", marker = "extra == 'dev'", specifier = ">=6.0.1" }, { name = "requests", specifier = ">=2.32.4" }, - { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.12.0" }, { name = "setuptools", specifier = ">=78.1.1" }, - { name = "sphinx", marker = "extra == 'docs'", specifier = ">=7.4.7" }, - { name = "sphinx-autobuild", marker = "extra == 'docs'", specifier = ">=2024.9.3" }, - { name = "sphinx-click", marker = "extra == 'docs'", specifier = ">=5.0.1" }, - { name = "sphinx-multiversion", marker = "extra == 'docs'" }, { name = "stamina", specifier = ">=24.2.0" }, - { name = "stamina", marker = "extra == 'dev'", specifier = ">=24.2.0" }, - { name = "starlette", marker = "extra == 'docs'", specifier = ">=0.49.1" }, { name = "tqdm", specifier = ">=4.66.5" }, { name = "transformers", marker = "extra == 'transformers'", specifier = ">=4.57.3" }, { name = "twine", specifier = ">=5.0.0" }, - { name = "twine", marker = "extra == 'dev'", specifier = ">=5.0.0" }, { name = "typer", specifier = ">=0.12.3" }, - { name = "typer", marker = "extra == 'dev'", specifier = ">=0.12.3" }, { name = "types-pyyaml", specifier = ">=6.0.12" }, - { name = "types-pyyaml", marker = "extra == 'dev'", specifier = ">=6.0.12" }, { name = "types-requests", specifier = ">=2.31.0" }, - { name = "types-requests", marker = "extra == 'dev'", specifier = ">=2.31.0" }, - { name = "types-setuptools", marker = "extra == 'dev'", specifier = ">=69.5.0" }, { name = "urllib3", specifier = ">=2.6.3" }, - { name = "uv", marker = "extra == 'dev'", specifier = ">=0.9.6" }, - { name = "virtualenv", marker = "extra == 'dev'", specifier = ">=20.6.6" }, ] -provides-extras = ["dev", "docs", "pandas", "polars", "transformers"] +provides-extras = ["pandas", "polars", "transformers"] + +[package.metadata.requires-dev] +dev = [ + { name = "authlib", specifier = ">=1.6.6" }, + { name = "basedpyright", specifier = "==1.37.1" }, + { name = "bumpver", specifier = ">=2025.1131" }, + { name = "cryptography", specifier = ">=44.0.1" }, + { name = "filelock", specifier = ">=3.20.1" }, + { name = "hirundo", extras = ["pandas", "polars", "transformers"] }, + { name = "jinja2", specifier = ">=3.1.6" }, + { name = "marshmallow", specifier = ">=3.26.2" }, + { name = "pip-audit" }, + { name = "platformdirs", specifier = ">=4.3.6" }, + { name = "pre-commit", specifier = ">=3.7.1" }, + { name = "pytest", specifier = ">=8.2.0" }, + { name = "pytest-asyncio", specifier = ">=0.23.6" }, + { name = "ruff", specifier = ">=0.12.0" }, + { name = "twine", specifier = ">=5.0.0" }, + { name = "types-setuptools", specifier = ">=69.5.0" }, + { name = "uv", specifier = ">=0.9.6" }, + { name = "virtualenv", specifier = ">=20.6.6" }, +] +docs = [ + { name = "autodoc-pydantic", specifier = ">=2.2.0" }, + { name = "esbonio" }, + { name = "furo" }, + { name = "hirundo", extras = ["pandas", "polars", "transformers"] }, + { name = "jinja2", specifier = ">=3.1.6" }, + { name = "markupsafe", specifier = ">=3.0.2" }, + { name = "sphinx", specifier = ">=7.4.7" }, + { name = "sphinx-autobuild", specifier = ">=2024.9.3" }, + { name = "sphinx-click", specifier = ">=5.0.1" }, + { name = "sphinx-multiversion" }, + { name = "starlette", specifier = ">=0.49.1" }, +] [[package]] name = "httpcore" From b69a1a3601457a07c4e6a10afc171693b4f478d5 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Wed, 4 Feb 2026 12:52:46 +0200 Subject: [PATCH 04/29] Migrate fully to `uv` All of the old `requirements.txt` files is just such a waste of time to maintain I've updated all of the GitHub Actions workflows to use `uv` and the `.pre-commit-config.yaml` The DevContainer Dockerfile is also now using `uv` --- .github/workflows/cleanup-test-artifacts.yaml | 1 - .github/workflows/create-release.yaml | 5 +- .github/workflows/deploy-docker-image.yaml | 3 +- .github/workflows/deploy-to-pypi.yaml | 11 +- .github/workflows/lint.yaml | 16 +- .github/workflows/pytest-full.yaml | 10 +- .github/workflows/pytest-sanity.yaml | 13 +- .github/workflows/update-docs.yaml | 11 +- .github/workflows/vulnerability-scan.yml | 12 +- .pre-commit-config.yaml | 46 -- DEV_README.md | 30 +- dev.Dockerfile | 12 +- pyproject.toml | 1 + requirements/dev.txt | 408 ------------------ requirements/docs.txt | 408 ------------------ requirements/pandas.txt | 204 --------- requirements/polars.txt | 196 --------- requirements/requirements.txt | 116 ----- requirements/transformers.txt | 267 ------------ uv.lock | 27 ++ 20 files changed, 65 insertions(+), 1732 deletions(-) delete mode 100644 requirements/dev.txt delete mode 100644 requirements/docs.txt delete mode 100644 requirements/pandas.txt delete mode 100644 requirements/polars.txt delete mode 100644 requirements/requirements.txt delete mode 100644 requirements/transformers.txt diff --git a/.github/workflows/cleanup-test-artifacts.yaml b/.github/workflows/cleanup-test-artifacts.yaml index 7ea44e01..1c637889 100644 --- a/.github/workflows/cleanup-test-artifacts.yaml +++ b/.github/workflows/cleanup-test-artifacts.yaml @@ -24,7 +24,6 @@ jobs: version: '0.9.6' - name: Install dependencies run: | - python -m pip install --upgrade pip uv venv uv sync --extra polars - name: Run cleanup script diff --git a/.github/workflows/create-release.yaml b/.github/workflows/create-release.yaml index 460109c9..54d75513 100644 --- a/.github/workflows/create-release.yaml +++ b/.github/workflows/create-release.yaml @@ -37,10 +37,9 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - python -m pip install --upgrade pip - python -m venv .venv + uv venv source .venv/bin/activate - pip install bumpver + uv pip install bumpver git config user.name "GitHub Actions [release-bot]" git config user.email "github-actions@hirundo.io" git checkout -b release-${{ github.event.inputs.version }} diff --git a/.github/workflows/deploy-docker-image.yaml b/.github/workflows/deploy-docker-image.yaml index 48ec27aa..6eb42d10 100644 --- a/.github/workflows/deploy-docker-image.yaml +++ b/.github/workflows/deploy-docker-image.yaml @@ -29,7 +29,6 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 with: - install: true platforms: linux/amd64 - name: Login to GitHub Container Registry uses: docker/login-action@v3 @@ -43,7 +42,7 @@ jobs: uses: actions/cache@v4 with: path: opt-uv - key: opt-uv-${{ hashFiles('requirements/*') }} + key: opt-uv-${{ hashFiles('uv.lock') }} - name: inject uv cache into docker # v1 was composed of two actions: "inject" and "extract". # v2 is unified to a single action. diff --git a/.github/workflows/deploy-to-pypi.yaml b/.github/workflows/deploy-to-pypi.yaml index c18cc73f..c910b31a 100644 --- a/.github/workflows/deploy-to-pypi.yaml +++ b/.github/workflows/deploy-to-pypi.yaml @@ -22,10 +22,7 @@ jobs: - uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.base.ref }} - - name: Set up Python - uses: actions/setup-python@v6 - with: - cache: 'pip' + - uses: astral-sh/setup-uv@v7 - name: Push tag with release env: GH_TOKEN: ${{ github.token }} @@ -44,11 +41,9 @@ jobs: git push origin ${{ github.event.pull_request.title }} - name: Install dependencies & build package run: | - python -m pip install --upgrade pip - python -m venv .venv + uv venv source .venv/bin/activate - pip install -r requirements/dev.txt - pip install build twine + uv sync --group dev python -m build - name: Publish package distributions to TestPyPI (with act) env: diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index 64b7a00d..618d944c 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -19,15 +19,13 @@ jobs: python-version: ["3.10", "3.11", "3.12", "3.13"] steps: - uses: actions/checkout@v3 - - uses: actions/setup-python@v6 + - uses: astral-sh/setup-uv@v7 with: - cache: 'pip' python-version: ${{ matrix.python-version }} - run: | - python -m pip install --upgrade pip - python -m venv .venv + uv venv source .venv/bin/activate - pip install -r requirements/dev.txt -r requirements/pandas.txt -r requirements/polars.txt -r requirements/transformers.txt + uv sync --group dev - run: echo "$PWD/.venv/bin" >> $GITHUB_PATH - uses: astral-sh/ruff-action@v3 - run: ruff check @@ -42,14 +40,12 @@ jobs: python-version: ["3.10", "3.11", "3.12", "3.13"] steps: - uses: actions/checkout@v3 - - uses: actions/setup-python@v6 + - uses: astral-sh/setup-uv@v7 with: - cache: 'pip' python-version: ${{ matrix.python-version }} - run: | - python -m pip install --upgrade pip - python -m venv .venv + uv venv source .venv/bin/activate - pip install -r requirements/dev.txt -r requirements/pandas.txt -r requirements/polars.txt -r requirements/transformers.txt + uv sync --group dev - run: echo "$PWD/.venv/bin" >> $GITHUB_PATH - run: basedpyright diff --git a/.github/workflows/pytest-full.yaml b/.github/workflows/pytest-full.yaml index 6201a9ef..7ab3d5e3 100644 --- a/.github/workflows/pytest-full.yaml +++ b/.github/workflows/pytest-full.yaml @@ -28,16 +28,12 @@ jobs: env: RUN_COCO_OD_GCP_SANITY_DATA_QA steps: - uses: actions/checkout@v4 - - name: Set up Python - uses: actions/setup-python@v6 - with: - cache: 'pip' + - uses: astral-sh/setup-uv@v7 - name: Install dependencies on Linux and macOS run: | - python -m pip install --upgrade pip - python -m venv .venv + uv venv source .venv/bin/activate - pip install -r requirements/dev.txt -r requirements/polars.txt -r requirements/transformers.txt + uv sync --group dev - name: Run PyTest run: .venv/bin/pytest tests/${{ matrix.data-qa-test['test'] }} env: diff --git a/.github/workflows/pytest-sanity.yaml b/.github/workflows/pytest-sanity.yaml index a07c73f8..cf55ecf3 100644 --- a/.github/workflows/pytest-sanity.yaml +++ b/.github/workflows/pytest-sanity.yaml @@ -46,24 +46,21 @@ jobs: fi - name: Set up Python if: github.event_name != 'pull_request' && steps.changes.outputs.non_workflow == 'true' - uses: actions/setup-python@v6 + uses: astral-sh/setup-uv@v7 with: python-version: ${{ matrix.python-version }} - cache: 'pip' - name: Install dependencies on Linux and macOS if: github.event_name != 'pull_request' && runner.os != 'Windows' && steps.changes.outputs.non_workflow == 'true' run: | - python -m pip install --upgrade pip - python -m venv .venv + uv venv source .venv/bin/activate - pip install -r requirements/dev.txt -r requirements/polars.txt -r requirements/transformers.txt + uv sync --group dev - name: Run commands on Windows if: github.event_name != 'pull_request' && runner.os == 'Windows' && steps.changes.outputs.non_workflow == 'true' run: | - python -m pip install --upgrade 'pip>=24.1.2' - python -m venv .venv + uv venv .venv\Scripts\activate - python -m pip install -r requirements\dev.txt -r requirements\polars.txt -r requirements\transformers.txt + uv sync --group dev - name: Run PyTest on Linux and macOS if: github.event_name != 'pull_request' && runner.os != 'Windows' && steps.changes.outputs.non_workflow == 'true' run: .venv/bin/pytest diff --git a/.github/workflows/update-docs.yaml b/.github/workflows/update-docs.yaml index 6ef39a57..f927b977 100644 --- a/.github/workflows/update-docs.yaml +++ b/.github/workflows/update-docs.yaml @@ -32,18 +32,15 @@ jobs: uses: actions/checkout@v4 with: fetch-depth: 0 # Fetch all history for all tags and branches - - uses: actions/setup-python@v6 - with: - cache: 'pip' + - uses: astral-sh/setup-uv@v7 - name: Install dependencies timeout-minutes: 5 env: SLEEP: 15 run: | - python -m pip install --upgrade pip - python -m venv .venv + uv venv source .venv/bin/activate - pip install -r requirements/docs.txt + uv sync --group docs # Extract version from hirundo/__init__.py with error handling if [ -f "hirundo/__init__.py" ]; then export VERSION=$(python -c "import re; content=open('hirundo/__init__.py').read(); match=re.search(r'__version__ = [\"\'](.*?)[\"\']', content); print(match.group(1) if match else 'unknown')" 2>/dev/null || echo 'unknown') @@ -56,7 +53,7 @@ jobs: exit 1 fi - until pip install --no-cache-dir "hirundo==${VERSION}"; do + until uv pip install --no-cache-dir "hirundo==${VERSION}"; do echo "Can't find the version you mentioned, waiting $SLEEP seconds and retrying" sleep $SLEEP echo "finish waiting. retrying..." diff --git a/.github/workflows/vulnerability-scan.yml b/.github/workflows/vulnerability-scan.yml index 40fe962d..0e3d0175 100644 --- a/.github/workflows/vulnerability-scan.yml +++ b/.github/workflows/vulnerability-scan.yml @@ -16,15 +16,6 @@ concurrency: jobs: vulnerability-scan: - strategy: - matrix: - requirements: - - requirements/requirements.txt - - requirements/dev.txt - - requirements/docs.txt - - requirements/pandas.txt - - requirements/polars.txt - - requirements/transformers.txt runs-on: ubuntu-latest permissions: contents: read @@ -34,7 +25,8 @@ jobs: - name: No-op on pull_request if: github.event_name == 'pull_request' run: echo "Skipping vulnerability scan on PR; marking job success." + - run: uv export --format requirements.txt - uses: pypa/gh-action-pip-audit@v1.1.0 if: github.event_name != 'pull_request' with: - inputs: ${{ matrix.requirements }} + inputs: requirements.txt diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1f77215d..0d59d395 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -23,52 +23,6 @@ repos: types: [python] pass_filenames: false additional_dependencies: [basedpyright==1.37.1] - - id: pip-compile - name: compile requirements/requirements.txt - entry: uv - args: ["pip", "compile", "-o", "requirements/requirements.txt"] - language: python - always_run: false - files: pyproject.toml$ - additional_dependencies: [uv] - - id: pip-compile-dev - name: compile requirements/dev.txt - entry: uv - args: ["pip", "compile", "--group", "dev", "-o", "requirements/dev.txt", "-c", "requirements/requirements.txt"] - language: python - always_run: false - files: pyproject.toml$ - additional_dependencies: [uv] - - id: pip-compile-pandas - name: compile requirements/pandas.txt - entry: uv - args: ["pip", "compile", "--extra", "pandas", "-o", "requirements/pandas.txt", "-c", "requirements/requirements.txt"] - language: python - files: pyproject.toml$ - additional_dependencies: [uv] - - id: pip-compile-polars - name: compile requirements/polars.txt - entry: uv - args: ["pip", "compile", "--extra", "polars", "-o", "requirements/polars.txt", "-c", "requirements/requirements.txt"] - language: python - files: pyproject.toml$ - additional_dependencies: [uv] - - id: pip-compile-docs - name: compile requirements/docs.txt - entry: uv - args: ["pip", "compile", "--group", "docs", "-o", "requirements/docs.txt", "-c", "requirements/requirements.txt"] - language: python - always_run: false - files: pyproject.toml$ - additional_dependencies: [uv] - - id: pip-compile-transformers - name: compile requirements/transformers.txt - entry: uv - args: ["pip", "compile", "--extra", "transformers", "-o", "requirements/transformers.txt", "-c", "requirements/requirements.txt"] - language: python - always_run: false - files: pyproject.toml$ - additional_dependencies: [uv] - repo: https://github.com/astral-sh/uv-pre-commit # uv version. rev: 0.9.6 diff --git a/DEV_README.md b/DEV_README.md index f5683512..d86bc4f3 100644 --- a/DEV_README.md +++ b/DEV_README.md @@ -14,13 +14,14 @@ When opening Pull Requests, note that the repository has GitHub Actions which ru ### Install dev dependencies +Note: You need to [install](https://docs.astral.sh/uv/getting-started/installation/) and use [`uv`](https://docs.astral.sh/uv/) as a faster drop-in replacement for `pip` for our project. + + +Then you can install the dependencies with: ```bash -pip install -r requirements/dev.txt +uv sync --all-groups ``` -Note: You can [install](https://docs.astral.sh/uv/getting-started/installation/) and use [`uv`](https://docs.astral.sh/uv/) as a faster drop-in replacement for `pip`. We have it as part of our dev dependencies for this reason. - -### Install `git` hooks (optional) ### Install `git` hooks (optional) ```bash @@ -34,25 +35,6 @@ ruff check ruff format ``` -### Change packages - -#### Update `requirements.txt` files (optional; pre-commit hooks run this automatically) - -```bash -uv pip compile pyproject.toml -uv pip compile --group dev -o requirements/dev.txt -c requirements.txt pyproject.toml -uv pip compile --extra pandas -o requirements/pandas.txt -c requirements.txt pyproject.toml -uv pip compile --extra polars -o requirements/polars.txt -c requirements.txt pyproject.toml -uv pip compile --extra docs -o requirements/docs.txt -c requirements.txt pyproject.toml -uv pip compile --extra transformers -o requirements/transformers.txt -c requirements.txt pyproject.toml -``` - -#### Sync installed packages (optional; pre-commit hooks run this automatically) - -```bash -uv sync --all-groups -``` - ### Build process To build the package, run: @@ -60,7 +42,7 @@ To build the package, run: ### Documentation -We use `sphinx` to generate our documentation. Note: If you want to manually create the HTML files from your documentation, you must install `requirements/docs.txt` instead of/in addition to `requirements/dev.txt`. +We use `sphinx` to generate our documentation. Note: If you want to manually create the HTML files from your documentation, you must install the `dev` dependency group. #### Documentation releases Documentation releases are published via GitHub Actions on merges to `main`. diff --git a/dev.Dockerfile b/dev.Dockerfile index 35ee2d1b..91dc1e6f 100644 --- a/dev.Dockerfile +++ b/dev.Dockerfile @@ -1,13 +1,11 @@ ARG PLATFORM=linux/amd64 -FROM --platform=${PLATFORM} mcr.microsoft.com/devcontainers/python:3.10 +FROM --platform=${PLATFORM} ghcr.io/astral-sh/uv:python3.10-trixie COPY . . -RUN pip install -r requirements/requirements.txt \ - -r requirements/dev.txt -r requirements/docs.txt \ - -r requirements/pandas.txt -r requirements/polars.txt \ - -r requirements/transformers.txt \ - && pip install ipykernel +RUN curl -LsSf https://astral.sh/uv/install.sh | sh +RUN uv sync --all-groups + && uv pip install ipykernel -CMD ["python"] +CMD ["uv", "run", "python"] diff --git a/pyproject.toml b/pyproject.toml index 53924dc1..b38ebf38 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,6 +23,7 @@ dependencies = [ "pyyaml>=6.0.1", "types-PyYAML>=6.0.12", "pydantic>=2.7.1", + "build", "twine>=5.0.0", "python-dotenv>=1.0.1", "types-requests>=2.31.0", diff --git a/requirements/dev.txt b/requirements/dev.txt deleted file mode 100644 index d95b32d3..00000000 --- a/requirements/dev.txt +++ /dev/null @@ -1,408 +0,0 @@ -# This file was autogenerated by uv via the following command: -# uv pip compile --group dev -o requirements/dev.txt -c requirements/requirements.txt pyproject.toml -accelerate==1.12.0 - # via - # hirundo - # peft -annotated-types==0.7.0 - # via - # -c requirements/requirements.txt - # pydantic -anyio==4.12.1 - # via - # -c requirements/requirements.txt - # httpx -authlib==1.6.6 - # via hirundo (pyproject.toml:dev) -basedpyright==1.37.1 - # via hirundo (pyproject.toml:dev) -boolean-py==5.0 - # via license-expression -bumpver==2025.1131 - # via hirundo (pyproject.toml:dev) -cachecontrol==0.14.4 - # via pip-audit -certifi==2026.1.4 - # via - # -c requirements/requirements.txt - # httpcore - # httpx - # requests -cffi==2.0.0 - # via cryptography -cfgv==3.5.0 - # via pre-commit -charset-normalizer==3.4.4 - # via - # -c requirements/requirements.txt - # requests -click==8.3.1 - # via - # -c requirements/requirements.txt - # bumpver - # typer - # typer-slim -colorama==0.4.6 - # via bumpver -cryptography==46.0.3 - # via - # hirundo (pyproject.toml:dev) - # authlib -cyclonedx-python-lib==11.6.0 - # via pip-audit -defusedxml==0.7.1 - # via py-serializable -distlib==0.4.0 - # via virtualenv -docutils==0.21.2 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo - # readme-renderer -filelock==3.20.3 - # via - # hirundo (pyproject.toml:dev) - # cachecontrol - # huggingface-hub - # torch - # transformers - # virtualenv -fsspec==2026.1.0 - # via - # huggingface-hub - # torch -h11==0.16.0 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo - # httpcore -hf-xet==1.2.0 - # via huggingface-hub -hirundo==0.2.3.post1 - # via hirundo (pyproject.toml:dev) -httpcore==1.0.9 - # via - # -c requirements/requirements.txt - # httpx -httpx==0.28.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo - # huggingface-hub -httpx-sse==0.4.3 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo -huggingface-hub==1.3.7 - # via - # accelerate - # peft - # tokenizers - # transformers -id==1.5.0 - # via - # -c requirements/requirements.txt - # twine -identify==2.6.16 - # via pre-commit -idna==3.11 - # via - # -c requirements/requirements.txt - # anyio - # httpx - # requests -iniconfig==2.3.0 - # via pytest -jaraco-classes==3.4.0 - # via - # -c requirements/requirements.txt - # keyring -jaraco-context==6.1.0 - # via - # -c requirements/requirements.txt - # keyring -jaraco-functools==4.4.0 - # via - # -c requirements/requirements.txt - # keyring -jinja2==3.1.6 - # via - # hirundo (pyproject.toml:dev) - # torch -keyring==25.7.0 - # via - # -c requirements/requirements.txt - # twine -lexid==2021.1006 - # via bumpver -license-expression==30.4.4 - # via cyclonedx-python-lib -markdown-it-py==4.0.0 - # via - # -c requirements/requirements.txt - # rich -markupsafe==3.0.3 - # via jinja2 -marshmallow==4.2.0 - # via hirundo (pyproject.toml:dev) -mdurl==0.1.2 - # via - # -c requirements/requirements.txt - # markdown-it-py -more-itertools==10.8.0 - # via - # -c requirements/requirements.txt - # jaraco-classes - # jaraco-functools -mpmath==1.3.0 - # via sympy -msgpack==1.1.2 - # via cachecontrol -networkx==3.6.1 - # via torch -nh3==0.3.2 - # via - # -c requirements/requirements.txt - # readme-renderer -nodeenv==1.10.0 - # via pre-commit -nodejs-wheel-binaries==24.13.0 - # via basedpyright -numpy==2.4.2 - # via - # accelerate - # pandas - # peft - # transformers -packageurl-python==0.17.6 - # via cyclonedx-python-lib -packaging==26.0 - # via - # -c requirements/requirements.txt - # accelerate - # huggingface-hub - # peft - # pip-audit - # pip-requirements-parser - # pytest - # transformers - # twine -pandas==3.0.0 - # via hirundo -peft==0.18.1 - # via hirundo -pip==26.0 - # via pip-api -pip-api==0.0.34 - # via pip-audit -pip-audit==2.10.0 - # via hirundo (pyproject.toml:dev) -pip-requirements-parser==32.0.1 - # via pip-audit -platformdirs==4.5.1 - # via - # hirundo (pyproject.toml:dev) - # pip-audit - # virtualenv -pluggy==1.6.0 - # via pytest -polars==1.37.1 - # via hirundo -polars-runtime-32==1.37.1 - # via polars -pre-commit==4.5.1 - # via hirundo (pyproject.toml:dev) -psutil==7.2.2 - # via - # accelerate - # peft -py-serializable==2.1.0 - # via cyclonedx-python-lib -pycparser==3.0 - # via cffi -pydantic==2.12.5 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo -pydantic-core==2.41.5 - # via - # -c requirements/requirements.txt - # pydantic -pygments==2.19.2 - # via - # -c requirements/requirements.txt - # pytest - # readme-renderer - # rich -pyparsing==3.3.2 - # via pip-requirements-parser -pytest==9.0.2 - # via - # hirundo (pyproject.toml:dev) - # pytest-asyncio -pytest-asyncio==1.3.0 - # via hirundo (pyproject.toml:dev) -python-dateutil==2.9.0.post0 - # via pandas -python-dotenv==1.2.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo -pyyaml==6.0.3 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # accelerate - # hirundo - # huggingface-hub - # peft - # pre-commit - # transformers -readme-renderer==44.0 - # via - # -c requirements/requirements.txt - # twine -regex==2026.1.15 - # via transformers -requests==2.32.5 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # cachecontrol - # hirundo - # id - # pip-audit - # requests-toolbelt - # twine -requests-toolbelt==1.0.0 - # via - # -c requirements/requirements.txt - # twine -rfc3986==2.0.0 - # via - # -c requirements/requirements.txt - # twine -rich==14.2.0 - # via - # -c requirements/requirements.txt - # pip-audit - # twine - # typer -ruff==0.14.13 - # via hirundo (pyproject.toml:dev) -safetensors==0.7.0 - # via - # accelerate - # peft - # transformers -setuptools==80.10.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo - # torch -shellingham==1.5.4 - # via - # -c requirements/requirements.txt - # huggingface-hub - # typer -six==1.17.0 - # via python-dateutil -sortedcontainers==2.4.0 - # via cyclonedx-python-lib -stamina==25.2.0 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo -sympy==1.14.0 - # via torch -tenacity==9.1.2 - # via - # -c requirements/requirements.txt - # stamina -tokenizers==0.22.2 - # via transformers -toml==0.10.2 - # via bumpver -tomli==2.4.0 - # via pip-audit -tomli-w==1.2.0 - # via pip-audit -torch==2.10.0 - # via - # accelerate - # peft -tqdm==4.67.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo - # huggingface-hub - # peft - # transformers -transformers==5.0.0 - # via - # hirundo - # peft -twine==6.2.0 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo (pyproject.toml:dev) - # hirundo -typer==0.21.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo -typer-slim==0.21.1 - # via - # huggingface-hub - # transformers -types-pyyaml==6.0.12.20250915 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo -types-requests==2.32.4.20260107 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo -types-setuptools==80.9.0.20251223 - # via hirundo (pyproject.toml:dev) -typing-extensions==4.15.0 - # via - # -c requirements/requirements.txt - # huggingface-hub - # pydantic - # pydantic-core - # torch - # typer - # typer-slim - # typing-inspection -typing-inspection==0.4.2 - # via - # -c requirements/requirements.txt - # pydantic -urllib3==2.6.3 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo - # requests - # twine - # types-requests -uv==0.9.26 - # via hirundo (pyproject.toml:dev) -virtualenv==20.36.1 - # via - # hirundo (pyproject.toml:dev) - # pre-commit diff --git a/requirements/docs.txt b/requirements/docs.txt deleted file mode 100644 index 77b8ed67..00000000 --- a/requirements/docs.txt +++ /dev/null @@ -1,408 +0,0 @@ -# This file was autogenerated by uv via the following command: -# uv pip compile --group docs -o requirements/docs.txt -c requirements/requirements.txt pyproject.toml -accelerate==1.12.0 - # via - # hirundo - # peft -accessible-pygments==0.0.5 - # via furo -aiosqlite==0.22.1 - # via esbonio -alabaster==1.0.0 - # via sphinx -annotated-types==0.7.0 - # via - # -c requirements/requirements.txt - # pydantic -anyio==4.12.1 - # via - # -c requirements/requirements.txt - # httpx - # starlette - # watchfiles -attrs==25.4.0 - # via - # cattrs - # lsprotocol - # pygls -autodoc-pydantic==2.2.0 - # via hirundo (pyproject.toml:docs) -babel==2.17.0 - # via sphinx -beautifulsoup4==4.14.3 - # via furo -cattrs==25.3.0 - # via - # lsprotocol - # pygls -certifi==2026.1.4 - # via - # -c requirements/requirements.txt - # httpcore - # httpx - # requests -charset-normalizer==3.4.4 - # via - # -c requirements/requirements.txt - # requests -click==8.3.1 - # via - # -c requirements/requirements.txt - # sphinx-click - # typer - # typer-slim - # uvicorn -colorama==0.4.6 - # via sphinx-autobuild -docutils==0.21.2 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # esbonio - # hirundo - # readme-renderer - # sphinx - # sphinx-click -esbonio==1.0.0 - # via hirundo (pyproject.toml:docs) -filelock==3.20.3 - # via - # huggingface-hub - # torch - # transformers -fsspec==2026.1.0 - # via - # huggingface-hub - # torch -furo==2025.12.19 - # via hirundo (pyproject.toml:docs) -h11==0.16.0 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo - # httpcore - # uvicorn -hf-xet==1.2.0 - # via huggingface-hub -hirundo==0.2.3.post1 - # via hirundo (pyproject.toml:docs) -httpcore==1.0.9 - # via - # -c requirements/requirements.txt - # httpx -httpx==0.28.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo - # huggingface-hub -httpx-sse==0.4.3 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo -huggingface-hub==1.3.7 - # via - # accelerate - # peft - # tokenizers - # transformers -id==1.5.0 - # via - # -c requirements/requirements.txt - # twine -idna==3.11 - # via - # -c requirements/requirements.txt - # anyio - # httpx - # requests -imagesize==1.4.1 - # via sphinx -jaraco-classes==3.4.0 - # via - # -c requirements/requirements.txt - # keyring -jaraco-context==6.1.0 - # via - # -c requirements/requirements.txt - # keyring -jaraco-functools==4.4.0 - # via - # -c requirements/requirements.txt - # keyring -jinja2==3.1.6 - # via - # hirundo (pyproject.toml:docs) - # sphinx - # torch -keyring==25.7.0 - # via - # -c requirements/requirements.txt - # twine -lsprotocol==2025.0.0 - # via pygls -markdown-it-py==4.0.0 - # via - # -c requirements/requirements.txt - # rich -markupsafe==3.0.3 - # via - # hirundo (pyproject.toml:docs) - # jinja2 -mdurl==0.1.2 - # via - # -c requirements/requirements.txt - # markdown-it-py -more-itertools==10.8.0 - # via - # -c requirements/requirements.txt - # jaraco-classes - # jaraco-functools -mpmath==1.3.0 - # via sympy -networkx==3.6.1 - # via torch -nh3==0.3.2 - # via - # -c requirements/requirements.txt - # readme-renderer -numpy==2.4.2 - # via - # accelerate - # pandas - # peft - # transformers -packaging==26.0 - # via - # -c requirements/requirements.txt - # accelerate - # huggingface-hub - # peft - # sphinx - # transformers - # twine -pandas==3.0.0 - # via hirundo -peft==0.18.1 - # via hirundo -platformdirs==4.5.1 - # via esbonio -polars==1.37.1 - # via hirundo -polars-runtime-32==1.37.1 - # via polars -psutil==7.2.2 - # via - # accelerate - # peft -pydantic==2.12.5 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # autodoc-pydantic - # hirundo - # pydantic-settings -pydantic-core==2.41.5 - # via - # -c requirements/requirements.txt - # pydantic -pydantic-settings==2.12.0 - # via autodoc-pydantic -pygls==2.0.0 - # via esbonio -pygments==2.19.2 - # via - # -c requirements/requirements.txt - # accessible-pygments - # furo - # readme-renderer - # rich - # sphinx -python-dateutil==2.9.0.post0 - # via pandas -python-dotenv==1.2.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo - # pydantic-settings -pyyaml==6.0.3 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # accelerate - # hirundo - # huggingface-hub - # peft - # transformers -readme-renderer==44.0 - # via - # -c requirements/requirements.txt - # twine -regex==2026.1.15 - # via transformers -requests==2.32.5 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo - # id - # requests-toolbelt - # sphinx - # twine -requests-toolbelt==1.0.0 - # via - # -c requirements/requirements.txt - # twine -rfc3986==2.0.0 - # via - # -c requirements/requirements.txt - # twine -rich==14.2.0 - # via - # -c requirements/requirements.txt - # twine - # typer -safetensors==0.7.0 - # via - # accelerate - # peft - # transformers -setuptools==80.10.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo - # torch -shellingham==1.5.4 - # via - # -c requirements/requirements.txt - # huggingface-hub - # typer -six==1.17.0 - # via python-dateutil -snowballstemmer==3.0.1 - # via sphinx -soupsieve==2.8.3 - # via beautifulsoup4 -sphinx==8.1.3 - # via - # hirundo (pyproject.toml:docs) - # autodoc-pydantic - # furo - # sphinx-autobuild - # sphinx-basic-ng - # sphinx-click - # sphinx-multiversion -sphinx-autobuild==2024.10.3 - # via hirundo (pyproject.toml:docs) -sphinx-basic-ng==1.0.0b2 - # via furo -sphinx-click==6.2.0 - # via hirundo (pyproject.toml:docs) -sphinx-multiversion==0.2.4 - # via hirundo (pyproject.toml:docs) -sphinxcontrib-applehelp==2.0.0 - # via sphinx -sphinxcontrib-devhelp==2.0.0 - # via sphinx -sphinxcontrib-htmlhelp==2.1.0 - # via sphinx -sphinxcontrib-jsmath==1.0.1 - # via sphinx -sphinxcontrib-qthelp==2.0.0 - # via sphinx -sphinxcontrib-serializinghtml==2.0.0 - # via sphinx -stamina==25.2.0 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo -starlette==0.52.1 - # via - # hirundo (pyproject.toml:docs) - # sphinx-autobuild -sympy==1.14.0 - # via torch -tenacity==9.1.2 - # via - # -c requirements/requirements.txt - # stamina -tokenizers==0.22.2 - # via transformers -torch==2.10.0 - # via - # accelerate - # peft -tqdm==4.67.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo - # huggingface-hub - # peft - # transformers -transformers==5.0.0 - # via - # hirundo - # peft -twine==6.2.0 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo -typer==0.21.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo -typer-slim==0.21.1 - # via - # huggingface-hub - # transformers -types-pyyaml==6.0.12.20250915 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo -types-requests==2.32.4.20260107 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo -typing-extensions==4.15.0 - # via - # -c requirements/requirements.txt - # beautifulsoup4 - # cattrs - # huggingface-hub - # pydantic - # pydantic-core - # torch - # typer - # typer-slim - # typing-inspection -typing-inspection==0.4.2 - # via - # -c requirements/requirements.txt - # pydantic - # pydantic-settings -urllib3==2.6.3 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # hirundo - # requests - # twine - # types-requests -uvicorn==0.40.0 - # via sphinx-autobuild -watchfiles==1.1.1 - # via sphinx-autobuild -websockets==16.0 - # via - # esbonio - # sphinx-autobuild diff --git a/requirements/pandas.txt b/requirements/pandas.txt deleted file mode 100644 index d344621b..00000000 --- a/requirements/pandas.txt +++ /dev/null @@ -1,204 +0,0 @@ -# This file was autogenerated by uv via the following command: -# uv pip compile --extra pandas -o requirements/pandas.txt -c requirements/requirements.txt pyproject.toml -annotated-types==0.7.0 - # via - # -c requirements/requirements.txt - # pydantic -anyio==4.12.1 - # via - # -c requirements/requirements.txt - # httpx -certifi==2026.1.4 - # via - # -c requirements/requirements.txt - # httpcore - # httpx - # requests -charset-normalizer==3.4.4 - # via - # -c requirements/requirements.txt - # requests -click==8.3.1 - # via - # -c requirements/requirements.txt - # typer -docutils==0.21.2 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # readme-renderer -h11==0.16.0 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # httpcore -httpcore==1.0.9 - # via - # -c requirements/requirements.txt - # httpx -httpx==0.28.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -httpx-sse==0.4.3 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -id==1.5.0 - # via - # -c requirements/requirements.txt - # twine -idna==3.11 - # via - # -c requirements/requirements.txt - # anyio - # httpx - # requests -jaraco-classes==3.4.0 - # via - # -c requirements/requirements.txt - # keyring -jaraco-context==6.1.0 - # via - # -c requirements/requirements.txt - # keyring -jaraco-functools==4.4.0 - # via - # -c requirements/requirements.txt - # keyring -keyring==25.7.0 - # via - # -c requirements/requirements.txt - # twine -markdown-it-py==4.0.0 - # via - # -c requirements/requirements.txt - # rich -mdurl==0.1.2 - # via - # -c requirements/requirements.txt - # markdown-it-py -more-itertools==10.8.0 - # via - # -c requirements/requirements.txt - # jaraco-classes - # jaraco-functools -nh3==0.3.2 - # via - # -c requirements/requirements.txt - # readme-renderer -numpy==2.2.6 - # via pandas -packaging==26.0 - # via - # -c requirements/requirements.txt - # twine -pandas==2.3.3 - # via hirundo (pyproject.toml) -pydantic==2.12.5 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -pydantic-core==2.41.5 - # via - # -c requirements/requirements.txt - # pydantic -pygments==2.19.2 - # via - # -c requirements/requirements.txt - # readme-renderer - # rich -python-dateutil==2.9.0.post0 - # via pandas -python-dotenv==1.2.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -pytz==2025.2 - # via pandas -pyyaml==6.0.3 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -readme-renderer==44.0 - # via - # -c requirements/requirements.txt - # twine -requests==2.32.5 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # id - # requests-toolbelt - # twine -requests-toolbelt==1.0.0 - # via - # -c requirements/requirements.txt - # twine -rfc3986==2.0.0 - # via - # -c requirements/requirements.txt - # twine -rich==14.2.0 - # via - # -c requirements/requirements.txt - # twine - # typer -setuptools==80.10.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -shellingham==1.5.4 - # via - # -c requirements/requirements.txt - # typer -six==1.17.0 - # via python-dateutil -stamina==25.2.0 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -tenacity==9.1.2 - # via - # -c requirements/requirements.txt - # stamina -tqdm==4.67.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -twine==6.2.0 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -typer==0.21.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -types-pyyaml==6.0.12.20250915 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -types-requests==2.32.4.20260107 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -typing-extensions==4.15.0 - # via - # -c requirements/requirements.txt - # pydantic - # pydantic-core - # typer - # typing-inspection -typing-inspection==0.4.2 - # via - # -c requirements/requirements.txt - # pydantic -tzdata==2025.3 - # via pandas -urllib3==2.6.3 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # requests - # twine - # types-requests diff --git a/requirements/polars.txt b/requirements/polars.txt deleted file mode 100644 index 2f86f332..00000000 --- a/requirements/polars.txt +++ /dev/null @@ -1,196 +0,0 @@ -# This file was autogenerated by uv via the following command: -# uv pip compile --extra polars -o requirements/polars.txt -c requirements/requirements.txt pyproject.toml -annotated-types==0.7.0 - # via - # -c requirements/requirements.txt - # pydantic -anyio==4.12.1 - # via - # -c requirements/requirements.txt - # httpx -certifi==2026.1.4 - # via - # -c requirements/requirements.txt - # httpcore - # httpx - # requests -charset-normalizer==3.4.4 - # via - # -c requirements/requirements.txt - # requests -click==8.3.1 - # via - # -c requirements/requirements.txt - # typer -docutils==0.21.2 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # readme-renderer -h11==0.16.0 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # httpcore -httpcore==1.0.9 - # via - # -c requirements/requirements.txt - # httpx -httpx==0.28.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -httpx-sse==0.4.3 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -id==1.5.0 - # via - # -c requirements/requirements.txt - # twine -idna==3.11 - # via - # -c requirements/requirements.txt - # anyio - # httpx - # requests -jaraco-classes==3.4.0 - # via - # -c requirements/requirements.txt - # keyring -jaraco-context==6.1.0 - # via - # -c requirements/requirements.txt - # keyring -jaraco-functools==4.4.0 - # via - # -c requirements/requirements.txt - # keyring -keyring==25.7.0 - # via - # -c requirements/requirements.txt - # twine -markdown-it-py==4.0.0 - # via - # -c requirements/requirements.txt - # rich -mdurl==0.1.2 - # via - # -c requirements/requirements.txt - # markdown-it-py -more-itertools==10.8.0 - # via - # -c requirements/requirements.txt - # jaraco-classes - # jaraco-functools -nh3==0.3.2 - # via - # -c requirements/requirements.txt - # readme-renderer -packaging==26.0 - # via - # -c requirements/requirements.txt - # twine -polars==1.37.1 - # via hirundo (pyproject.toml) -polars-runtime-32==1.37.1 - # via polars -pydantic==2.12.5 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -pydantic-core==2.41.5 - # via - # -c requirements/requirements.txt - # pydantic -pygments==2.19.2 - # via - # -c requirements/requirements.txt - # readme-renderer - # rich -python-dotenv==1.2.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -pyyaml==6.0.3 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -readme-renderer==44.0 - # via - # -c requirements/requirements.txt - # twine -requests==2.32.5 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # id - # requests-toolbelt - # twine -requests-toolbelt==1.0.0 - # via - # -c requirements/requirements.txt - # twine -rfc3986==2.0.0 - # via - # -c requirements/requirements.txt - # twine -rich==14.2.0 - # via - # -c requirements/requirements.txt - # twine - # typer -setuptools==80.10.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -shellingham==1.5.4 - # via - # -c requirements/requirements.txt - # typer -stamina==25.2.0 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -tenacity==9.1.2 - # via - # -c requirements/requirements.txt - # stamina -tqdm==4.67.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -twine==6.2.0 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -typer==0.21.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -types-pyyaml==6.0.12.20250915 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -types-requests==2.32.4.20260107 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -typing-extensions==4.15.0 - # via - # -c requirements/requirements.txt - # pydantic - # pydantic-core - # typer - # typing-inspection -typing-inspection==0.4.2 - # via - # -c requirements/requirements.txt - # pydantic -urllib3==2.6.3 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # requests - # twine - # types-requests diff --git a/requirements/requirements.txt b/requirements/requirements.txt deleted file mode 100644 index 62c62352..00000000 --- a/requirements/requirements.txt +++ /dev/null @@ -1,116 +0,0 @@ -# This file was autogenerated by uv via the following command: -# uv pip compile -o requirements/requirements.txt pyproject.toml -annotated-types==0.7.0 - # via pydantic -anyio==4.12.1 - # via httpx -certifi==2026.1.4 - # via - # httpcore - # httpx - # requests -charset-normalizer==3.4.4 - # via requests -click==8.3.1 - # via typer -docutils==0.21.2 - # via - # hirundo (pyproject.toml) - # readme-renderer -h11==0.16.0 - # via - # hirundo (pyproject.toml) - # httpcore -httpcore==1.0.9 - # via httpx -httpx==0.28.1 - # via hirundo (pyproject.toml) -httpx-sse==0.4.3 - # via hirundo (pyproject.toml) -id==1.5.0 - # via twine -idna==3.11 - # via - # anyio - # httpx - # requests -jaraco-classes==3.4.0 - # via keyring -jaraco-context==6.1.0 - # via keyring -jaraco-functools==4.4.0 - # via keyring -keyring==25.7.0 - # via twine -markdown-it-py==4.0.0 - # via rich -mdurl==0.1.2 - # via markdown-it-py -more-itertools==10.8.0 - # via - # jaraco-classes - # jaraco-functools -nh3==0.3.2 - # via readme-renderer -packaging==26.0 - # via twine -pydantic==2.12.5 - # via hirundo (pyproject.toml) -pydantic-core==2.41.5 - # via pydantic -pygments==2.19.2 - # via - # readme-renderer - # rich -python-dotenv==1.2.1 - # via hirundo (pyproject.toml) -pyyaml==6.0.3 - # via hirundo (pyproject.toml) -readme-renderer==44.0 - # via twine -requests==2.32.5 - # via - # hirundo (pyproject.toml) - # id - # requests-toolbelt - # twine -requests-toolbelt==1.0.0 - # via twine -rfc3986==2.0.0 - # via twine -rich==14.2.0 - # via - # twine - # typer -setuptools==80.10.1 - # via hirundo (pyproject.toml) -shellingham==1.5.4 - # via typer -stamina==25.2.0 - # via hirundo (pyproject.toml) -tenacity==9.1.2 - # via stamina -tqdm==4.67.1 - # via hirundo (pyproject.toml) -twine==6.2.0 - # via hirundo (pyproject.toml) -typer==0.21.1 - # via hirundo (pyproject.toml) -types-pyyaml==6.0.12.20250915 - # via hirundo (pyproject.toml) -types-requests==2.32.4.20260107 - # via hirundo (pyproject.toml) -typing-extensions==4.15.0 - # via - # pydantic - # pydantic-core - # typer - # typing-inspection -typing-inspection==0.4.2 - # via pydantic -urllib3==2.6.3 - # via - # hirundo (pyproject.toml) - # requests - # twine - # types-requests diff --git a/requirements/transformers.txt b/requirements/transformers.txt deleted file mode 100644 index 5ac08939..00000000 --- a/requirements/transformers.txt +++ /dev/null @@ -1,267 +0,0 @@ -# This file was autogenerated by uv via the following command: -# uv pip compile --extra transformers -o requirements/transformers.txt -c requirements/requirements.txt pyproject.toml -accelerate==1.12.0 - # via - # hirundo (pyproject.toml) - # peft -annotated-types==0.7.0 - # via - # -c requirements/requirements.txt - # pydantic -anyio==4.12.1 - # via - # -c requirements/requirements.txt - # httpx -certifi==2026.1.4 - # via - # -c requirements/requirements.txt - # httpcore - # httpx - # requests -charset-normalizer==3.4.4 - # via - # -c requirements/requirements.txt - # requests -click==8.3.1 - # via - # -c requirements/requirements.txt - # typer -docutils==0.21.2 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # readme-renderer -filelock==3.20.3 - # via - # huggingface-hub - # torch - # transformers -fsspec==2026.1.0 - # via - # huggingface-hub - # torch -h11==0.16.0 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # httpcore -hf-xet==1.2.0 - # via huggingface-hub -httpcore==1.0.9 - # via - # -c requirements/requirements.txt - # httpx -httpx==0.28.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -httpx-sse==0.4.3 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -huggingface-hub==0.36.0 - # via - # accelerate - # peft - # tokenizers - # transformers -id==1.5.0 - # via - # -c requirements/requirements.txt - # twine -idna==3.11 - # via - # -c requirements/requirements.txt - # anyio - # httpx - # requests -jaraco-classes==3.4.0 - # via - # -c requirements/requirements.txt - # keyring -jaraco-context==6.1.0 - # via - # -c requirements/requirements.txt - # keyring -jaraco-functools==4.4.0 - # via - # -c requirements/requirements.txt - # keyring -jinja2==3.1.6 - # via torch -keyring==25.7.0 - # via - # -c requirements/requirements.txt - # twine -markdown-it-py==4.0.0 - # via - # -c requirements/requirements.txt - # rich -markupsafe==3.0.3 - # via jinja2 -mdurl==0.1.2 - # via - # -c requirements/requirements.txt - # markdown-it-py -more-itertools==10.8.0 - # via - # -c requirements/requirements.txt - # jaraco-classes - # jaraco-functools -mpmath==1.3.0 - # via sympy -networkx==3.4.2 - # via torch -nh3==0.3.2 - # via - # -c requirements/requirements.txt - # readme-renderer -numpy==2.2.6 - # via - # accelerate - # peft - # transformers -packaging==26.0 - # via - # -c requirements/requirements.txt - # accelerate - # huggingface-hub - # peft - # transformers - # twine -peft==0.18.1 - # via hirundo (pyproject.toml) -psutil==7.2.1 - # via - # accelerate - # peft -pydantic==2.12.5 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -pydantic-core==2.41.5 - # via - # -c requirements/requirements.txt - # pydantic -pygments==2.19.2 - # via - # -c requirements/requirements.txt - # readme-renderer - # rich -python-dotenv==1.2.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -pyyaml==6.0.3 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # accelerate - # huggingface-hub - # peft - # transformers -readme-renderer==44.0 - # via - # -c requirements/requirements.txt - # twine -regex==2026.1.15 - # via transformers -requests==2.32.5 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # huggingface-hub - # id - # requests-toolbelt - # transformers - # twine -requests-toolbelt==1.0.0 - # via - # -c requirements/requirements.txt - # twine -rfc3986==2.0.0 - # via - # -c requirements/requirements.txt - # twine -rich==14.2.0 - # via - # -c requirements/requirements.txt - # twine - # typer -safetensors==0.7.0 - # via - # accelerate - # peft - # transformers -setuptools==80.10.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # torch -shellingham==1.5.4 - # via - # -c requirements/requirements.txt - # typer -stamina==25.2.0 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -sympy==1.14.0 - # via torch -tenacity==9.1.2 - # via - # -c requirements/requirements.txt - # stamina -tokenizers==0.22.2 - # via transformers -torch==2.10.0 - # via - # accelerate - # peft -tqdm==4.67.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # huggingface-hub - # peft - # transformers -transformers==4.57.6 - # via - # hirundo (pyproject.toml) - # peft -twine==6.2.0 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -typer==0.21.1 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -types-pyyaml==6.0.12.20250915 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -types-requests==2.32.4.20260107 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) -typing-extensions==4.15.0 - # via - # -c requirements/requirements.txt - # huggingface-hub - # pydantic - # pydantic-core - # torch - # typer - # typing-inspection -typing-inspection==0.4.2 - # via - # -c requirements/requirements.txt - # pydantic -urllib3==2.6.3 - # via - # -c requirements/requirements.txt - # hirundo (pyproject.toml) - # requests - # twine - # types-requests diff --git a/uv.lock b/uv.lock index 47dd94d5..2b5b399d 100644 --- a/uv.lock +++ b/uv.lock @@ -200,6 +200,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", size = 26577, upload-time = "2025-04-03T10:39:48.449Z" }, ] +[[package]] +name = "build" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "os_name == 'nt'" }, + { name = "importlib-metadata", marker = "python_full_version < '3.10.2'" }, + { name = "packaging" }, + { name = "pyproject-hooks" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/18/94eaffda7b329535d91f00fe605ab1f1e5cd68b2074d03f255c7d250687d/build-1.4.0.tar.gz", hash = "sha256:f1b91b925aa322be454f8330c6fb48b465da993d1e7e7e6fa35027ec49f3c936", size = 50054, upload-time = "2026-01-08T16:41:47.696Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/0d/84a4380f930db0010168e0aa7b7a8fed9ba1835a8fbb1472bc6d0201d529/build-1.4.0-py3-none-any.whl", hash = "sha256:6a07c1b8eb6f2b311b96fcbdbce5dab5fe637ffda0fd83c9cac622e927501596", size = 24141, upload-time = "2026-01-08T16:41:46.453Z" }, +] + [[package]] name = "bumpver" version = "2025.1131" @@ -601,6 +617,7 @@ name = "hirundo" version = "0.2.3.post1" source = { editable = "." } dependencies = [ + { name = "build" }, { name = "docutils" }, { name = "h11" }, { name = "httpx" }, @@ -670,6 +687,7 @@ docs = [ [package.metadata] requires-dist = [ { name = "accelerate", marker = "extra == 'transformers'", specifier = ">=1.12.0" }, + { name = "build" }, { name = "docutils", specifier = "<0.22.0" }, { name = "h11", specifier = ">=0.16.0" }, { name = "httpx", specifier = ">=0.27.0" }, @@ -1745,6 +1763,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, ] +[[package]] +name = "pyproject-hooks" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, +] + [[package]] name = "pyspellchecker" version = "0.8.3" From 84dfb866de03d98793ade251006e958cc724adfd Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Wed, 4 Feb 2026 12:53:05 +0200 Subject: [PATCH 05/29] Add `AGENTS.md` --- AGENTS.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 AGENTS.md diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..14ea904d --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,19 @@ +# Commands + +Run from repo root unless noted. +Activate the local virtualenv before running any Python/uv commands: `source .venv/bin/activate`. + +- Install deps (preferred): `uv sync --all-groups` +- Lint: `ruff check .` +- Format: `ruff format .` +- Type check: `basedpyright` +- Tests: `pytest` + +# Project rules + +- Tests are integration-heavy and often require credentials plus opt-in + env flags (`FULL_TEST` / `RUN_*`). See `tests/dataset_qa_shared.py`. +- HTTP calls should use the retrying shim and error helper: + `from hirundo._http import requests, raise_for_status_with_reason`. +- Use `hirundo.logger.get_logger(__name__)` for logging. +- Auth loads from `.env` or `~/.hirundo.conf` via `hirundo/_env.py`. From eb0f3d4532c668895bdcb98e186b387c01224ca1 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Wed, 4 Feb 2026 13:03:50 +0200 Subject: [PATCH 06/29] Fix vulnerability scan GitHub Actions workflow scanning the `pyproject.toml` and not `uv.lock` The `pyproject.toml` is what affects our downstream users as opposed to developers, and we want to fix thing sfor them not just developers of the project --- .github/workflows/vulnerability-scan.yml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/vulnerability-scan.yml b/.github/workflows/vulnerability-scan.yml index 0e3d0175..cf4b7ae8 100644 --- a/.github/workflows/vulnerability-scan.yml +++ b/.github/workflows/vulnerability-scan.yml @@ -16,6 +16,15 @@ concurrency: jobs: vulnerability-scan: + strategy: + matrix: + extras: + - '' + - dev + - docs + - pandas + - polars + - transformers runs-on: ubuntu-latest permissions: contents: read @@ -25,7 +34,12 @@ jobs: - name: No-op on pull_request if: github.event_name == 'pull_request' run: echo "Skipping vulnerability scan on PR; marking job success." - - run: uv export --format requirements.txt + - if: ${{ matrix.extras != '' && contains(fromJSON('["dev", "docs"]'), matrix.extras) }} + run: uv pip compile pyproject.toml --group ${{ matrix.extras }} + - if: ${{ matrix.extras != '' && !contains(fromJSON('["dev", "docs"]'), matrix.extras) }} + run: uv pip compile pyproject.toml --extra ${{ matrix.extras }} + - if: ${{ matrix.extras == '' }} + run: uv pip compile pyproject.toml - uses: pypa/gh-action-pip-audit@v1.1.0 if: github.event_name != 'pull_request' with: From ea09765ce06ca7a020ac8cf48429d306426dde32 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Wed, 4 Feb 2026 13:15:16 +0200 Subject: [PATCH 07/29] Fix vulnerabilities --- pyproject.toml | 4 ++-- uv.lock | 23 ++++++++++++----------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index b38ebf38..39bff02d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -65,7 +65,7 @@ dev = [ "uv>=0.9.6", "pre-commit>=3.7.1", "basedpyright==1.37.1", - "virtualenv>=20.6.6", + "virtualenv>=20.36.1", # ⬆️ Needed for `pre-commit` version fix for vulnerability GHSA-rqc4-2hc7-8c8v "authlib>=1.6.6", # ⬆️ Required to fix vulnerability CVE-2025-68158 @@ -78,7 +78,7 @@ dev = [ # ⬆️ Required to fix vulnerabilities GHSA-cpwx-vrp4-4pq7 , GHSA-gmj6-6f8f-6699 & GHSA-q2x7-8rv6-6q7h "filelock>=3.20.1", # ⬆️ Required to fix vulnerability CVE-2025-68146 - "marshmallow>=3.26.2", + "marshmallow>=4.1.2", # ⬆️ Required to fix vulnerability CVE-2025-68480 "pip-audit", ] diff --git a/uv.lock b/uv.lock index 2b5b399d..1c6b5850 100644 --- a/uv.lock +++ b/uv.lock @@ -720,7 +720,7 @@ dev = [ { name = "filelock", specifier = ">=3.20.1" }, { name = "hirundo", extras = ["pandas", "polars", "transformers"] }, { name = "jinja2", specifier = ">=3.1.6" }, - { name = "marshmallow", specifier = ">=3.26.2" }, + { name = "marshmallow", specifier = ">=4.1.2" }, { name = "pip-audit" }, { name = "platformdirs", specifier = ">=4.3.6" }, { name = "pre-commit", specifier = ">=3.7.1" }, @@ -730,7 +730,7 @@ dev = [ { name = "twine", specifier = ">=5.0.0" }, { name = "types-setuptools", specifier = ">=69.5.0" }, { name = "uv", specifier = ">=0.9.6" }, - { name = "virtualenv", specifier = ">=20.6.6" }, + { name = "virtualenv", specifier = ">=20.36.1" }, ] docs = [ { name = "autodoc-pydantic", specifier = ">=2.2.0" }, @@ -876,14 +876,14 @@ wheels = [ [[package]] name = "jaraco-context" -version = "6.0.1" +version = "6.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "backports-tarfile", marker = "python_full_version < '3.12'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", size = 13912, upload-time = "2024-08-20T03:39:27.358Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/9c/a788f5bb29c61e456b8ee52ce76dbdd32fd72cd73dd67bc95f42c7a8d13c/jaraco_context-6.1.0.tar.gz", hash = "sha256:129a341b0a85a7db7879e22acd66902fda67882db771754574338898b2d5d86f", size = 15850, upload-time = "2026-01-13T02:53:53.847Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", size = 6825, upload-time = "2024-08-20T03:39:25.966Z" }, + { url = "https://files.pythonhosted.org/packages/8d/48/aa685dbf1024c7bd82bede569e3a85f82c32fd3d79ba5fea578f0159571a/jaraco_context-6.1.0-py3-none-any.whl", hash = "sha256:a43b5ed85815223d0d3cfdb6d7ca0d2bc8946f28f30b6f3216bda070f68badda", size = 7065, upload-time = "2026-01-13T02:53:53.031Z" }, ] [[package]] @@ -1043,15 +1043,15 @@ wheels = [ [[package]] name = "marshmallow" -version = "4.0.0" +version = "4.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "backports-datetime-fromisoformat", marker = "python_full_version < '3.11'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1e/ff/26df5a9f5ac57ccf693a5854916ab47243039d2aa9e0fe5f5a0331e7b74b/marshmallow-4.0.0.tar.gz", hash = "sha256:3b6e80aac299a7935cfb97ed01d1854fb90b5079430969af92118ea1b12a8d55", size = 220507, upload-time = "2025-04-17T02:25:54.925Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/61/9540e1b120e9eff74b24def6060b79347f2b4083dddbd5a435f6e8d74b14/marshmallow-4.2.1.tar.gz", hash = "sha256:4d1d66189c8d279ca73a6b0599d74117e5f8a3830b5cd766b75c2bb08e3464e7", size = 221309, upload-time = "2026-01-23T13:00:24.841Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/26/6cc45d156f44dbe1d5696d9e54042e4dcaf7b946c0b86df6a97d29706f32/marshmallow-4.0.0-py3-none-any.whl", hash = "sha256:e7b0528337e9990fd64950f8a6b3a1baabed09ad17a0dfb844d701151f92d203", size = 48420, upload-time = "2025-04-17T02:25:53.375Z" }, + { url = "https://files.pythonhosted.org/packages/6c/41/e8cfdebc3a475c397e074ceaa12e86dca1b23e8e10c2ab4d4875f9a01418/marshmallow-4.2.1-py3-none-any.whl", hash = "sha256:d82b1a83cfbb4667d050850fbed4e9d4435576cb95f5ff37894f375dce201768", size = 48451, upload-time = "2026-01-23T13:00:23.009Z" }, ] [[package]] @@ -2731,16 +2731,17 @@ wheels = [ [[package]] name = "virtualenv" -version = "20.33.1" +version = "20.36.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8b/60/4f20960df6c7b363a18a55ab034c8f2bcd5d9770d1f94f9370ec104c1855/virtualenv-20.33.1.tar.gz", hash = "sha256:1b44478d9e261b3fb8baa5e74a0ca3bc0e05f21aa36167bf9cbf850e542765b8", size = 6082160, upload-time = "2025-08-05T16:10:55.605Z" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/a3/4d310fa5f00863544e1d0f4de93bddec248499ccf97d4791bc3122c9d4f3/virtualenv-20.36.1.tar.gz", hash = "sha256:8befb5c81842c641f8ee658481e42641c68b5eab3521d8e092d18320902466ba", size = 6032239, upload-time = "2026-01-09T18:21:01.296Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/ff/ded57ac5ff40a09e6e198550bab075d780941e0b0f83cbeabd087c59383a/virtualenv-20.33.1-py3-none-any.whl", hash = "sha256:07c19bc66c11acab6a5958b815cbcee30891cd1c2ccf53785a28651a0d8d8a67", size = 6060362, upload-time = "2025-08-05T16:10:52.81Z" }, + { url = "https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl", hash = "sha256:575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f", size = 6008258, upload-time = "2026-01-09T18:20:59.425Z" }, ] [[package]] From 71924389fadc35b4be617ef55347db1a6bcb5ea3 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Wed, 4 Feb 2026 13:17:24 +0200 Subject: [PATCH 08/29] Update `AGENTS.md` --- AGENTS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/AGENTS.md b/AGENTS.md index 14ea904d..aa8fc675 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -17,3 +17,4 @@ Activate the local virtualenv before running any Python/uv commands: `source .ve `from hirundo._http import requests, raise_for_status_with_reason`. - Use `hirundo.logger.get_logger(__name__)` for logging. - Auth loads from `.env` or `~/.hirundo.conf` via `hirundo/_env.py`. +- Avoid 1-3 character variable names in new or refactored code. Use descriptive names even in small scopes. From c37898e7b119de8cb4806c819b71684f67206772 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Wed, 4 Feb 2026 13:23:02 +0200 Subject: [PATCH 09/29] Upgrade `uv` version in `pyproject.toml` to fix issues with agent usage --- pyproject.toml | 2 +- uv.lock | 46 +++++++++++++++++++++++----------------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 39bff02d..9bd45066 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,7 +62,7 @@ dev = [ "types-setuptools>=69.5.0", "pytest>=8.2.0", "pytest-asyncio>=0.23.6", - "uv>=0.9.6", + "uv>=0.9.29", "pre-commit>=3.7.1", "basedpyright==1.37.1", "virtualenv>=20.36.1", diff --git a/uv.lock b/uv.lock index 1c6b5850..ac75af85 100644 --- a/uv.lock +++ b/uv.lock @@ -729,7 +729,7 @@ dev = [ { name = "ruff", specifier = ">=0.12.0" }, { name = "twine", specifier = ">=5.0.0" }, { name = "types-setuptools", specifier = ">=69.5.0" }, - { name = "uv", specifier = ">=0.9.6" }, + { name = "uv", specifier = ">=0.9.29" }, { name = "virtualenv", specifier = ">=20.36.1" }, ] docs = [ @@ -2691,28 +2691,28 @@ wheels = [ [[package]] name = "uv" -version = "0.9.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/99/51/c56ac81b4bd642d78365741eef118140459e2a94b9385ef973826b1b5306/uv-0.9.6.tar.gz", hash = "sha256:547fd27ab5da7cd1a833288a36858852451d416a056825f162ecf2af5be6f8b8", size = 3704033, upload-time = "2025-10-29T19:40:46.35Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b4/e6/c0747c9b307a91618e483b0cd78ba076578df70359f08c9096f36b0dae93/uv-0.9.6-py3-none-linux_armv6l.whl", hash = "sha256:b2f934737c93f88c906b6a47bcc083170210fe5d66565e80a7c139599e5cbf2f", size = 20632765, upload-time = "2025-10-29T19:39:52.628Z" }, - { url = "https://files.pythonhosted.org/packages/0e/d8/eba09583108476b9c21f4e09427553af7c5516a21ac01a18c63c357bcd72/uv-0.9.6-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a7c6067919d87208c4a6092033c3bc9799cb8be1c8bc6ef419a1f6d42a755329", size = 19666984, upload-time = "2025-10-29T19:39:56.981Z" }, - { url = "https://files.pythonhosted.org/packages/f4/a3/8d7da102542995ed8b16ae6079ae853221e17a5eec1fff442e6eacf5760c/uv-0.9.6-py3-none-macosx_11_0_arm64.whl", hash = "sha256:95a62c1f668272555ad0c446bf44a9924dee06054b831d04c162e0bad736dc28", size = 18335059, upload-time = "2025-10-29T19:40:05.138Z" }, - { url = "https://files.pythonhosted.org/packages/eb/0b/597719ad347610588954730f1124761184a6b71cf5aa1600f0a992939ef4/uv-0.9.6-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:0169a85d3ba5ef1c37089d64ff26de573439ca84ecf549276a2eee42d7f833f2", size = 20144462, upload-time = "2025-10-29T19:40:08.328Z" }, - { url = "https://files.pythonhosted.org/packages/31/cf/3f87025168bb377994ea468fc8757d5e01062b3888ec23eddd9b6d119135/uv-0.9.6-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0ba311b3ca49d246f36d444d3ee81571619ef95e5f509eb694a81defcbed262", size = 20251834, upload-time = "2025-10-29T19:40:10.834Z" }, - { url = "https://files.pythonhosted.org/packages/55/a0/a4027a220756a88dbc8bb7a6896fffc0e70af9b9ab030d644ab8baba3793/uv-0.9.6-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e89c964f614fa3f0481060cac709d6da50feac553e1e11227d6c4c81c87af7c", size = 21172738, upload-time = "2025-10-29T19:40:13.429Z" }, - { url = "https://files.pythonhosted.org/packages/2c/f6/d9fd69247c8c3039c6818ceb20652d18322a874e10f6def3f05599ed8d07/uv-0.9.6-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:ea67369918af24ea7e01991dfc8b8988d1b0b7c49cb39d9e5bc0c409930a0a3f", size = 22756338, upload-time = "2025-10-29T19:40:16.032Z" }, - { url = "https://files.pythonhosted.org/packages/fe/f6/6a0b4f43675c48138d62a6ddb5aebed67a1c283bee3758e5258a75f000ed/uv-0.9.6-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:90122a76e6441b8c580fc9faf06bd8c4dbe276cb1c185ad91eceb2afa78e492a", size = 22334132, upload-time = "2025-10-29T19:40:18.862Z" }, - { url = "https://files.pythonhosted.org/packages/0f/3f/a17d6e26a795a2e7d6023bae9c5af7da3118eebc23053ec7c0cbbb603638/uv-0.9.6-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86e05782f9b75d39ab1c0af98bf11e87e646a36a61d425021d5b284073e56315", size = 21487365, upload-time = "2025-10-29T19:40:21.709Z" }, - { url = "https://files.pythonhosted.org/packages/e4/29/9cbafd47012a68b39902ff022bd1c7051384fcc23392b2d813d0f418e61f/uv-0.9.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c2c2b2b093330e603d838fec26941ab6f62e8d62a012f9fa0d5ed88da39d907", size = 21384698, upload-time = "2025-10-29T19:40:24.296Z" }, - { url = "https://files.pythonhosted.org/packages/71/f9/525978cfa7c27ca2616ca0d214460861a8046085c032a0de6c5bedddcf6c/uv-0.9.6-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:e700b2098f9d365061c572d0729b4e8bc71c6468d83dfaae2537cd66e3cb1b98", size = 20255252, upload-time = "2025-10-29T19:40:26.757Z" }, - { url = "https://files.pythonhosted.org/packages/10/6f/89040302486b83e2085579ffebe3078dc92b15f42406f986d9e690e47f1b/uv-0.9.6-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:6403176b55388cf94fb8737e73b26ee2a7b1805a9139da5afa951210986d4fcd", size = 21308498, upload-time = "2025-10-29T19:40:29.273Z" }, - { url = "https://files.pythonhosted.org/packages/39/6e/5a3e879f7399c36c97d0b893c2dd5e91b76315c41793f13f86ff2091191a/uv-0.9.6-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:62e3f057a9ae5e5003a7cd56b617e940f519f6dabcbb22d36cdd0149df25d409", size = 20230221, upload-time = "2025-10-29T19:40:32.161Z" }, - { url = "https://files.pythonhosted.org/packages/7a/66/5bdabfd7afc6b429d8be7d6dc6446709f657621384960ec8b85e0088a3d9/uv-0.9.6-py3-none-musllinux_1_1_i686.whl", hash = "sha256:538716ec97f8d899baa7e1c427f4411525459c0ef72ea9b3625ce9610c9976e6", size = 20625876, upload-time = "2025-10-29T19:40:34.577Z" }, - { url = "https://files.pythonhosted.org/packages/5d/34/257747253ad446fd155e39f0c30afda4597b3b9e28f44a9de5dee76a6509/uv-0.9.6-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:b31377ebf2d0499afc5abe3fe1abded5ca843f3a1161b432fe26eb0ce15bab8e", size = 21597889, upload-time = "2025-10-29T19:40:36.963Z" }, - { url = "https://files.pythonhosted.org/packages/52/72/55d78618acd67e738b4976ac0ae5aebc9a32a1afec90ae66090a9e13c5fe/uv-0.9.6-py3-none-win32.whl", hash = "sha256:0fde18c22376c8b02954c7db3847bc75ac42619932c44b43f49d056e5cfb05f9", size = 19434465, upload-time = "2025-10-29T19:40:39.372Z" }, - { url = "https://files.pythonhosted.org/packages/5f/bb/4fc6ff6cfa14fef6225d4891d001c7a9373f3d6f90def57cdf7d86b2e7ff/uv-0.9.6-py3-none-win_amd64.whl", hash = "sha256:d1072db92cc9525febdf9d113c23916dfc20ca03e21218cc7beefe7185a90631", size = 21444739, upload-time = "2025-10-29T19:40:41.742Z" }, - { url = "https://files.pythonhosted.org/packages/92/05/8b4632c4c793b58bfed5ec8353c3f25818c025a6393ceb91f23a91094408/uv-0.9.6-py3-none-win_arm64.whl", hash = "sha256:166175ba952d2ad727e1dbd57d7cfc1782dfe7b8d79972174a46a7aa33ddceec", size = 19919992, upload-time = "2025-10-29T19:40:44.187Z" }, +version = "0.9.29" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/97/71/8a5bf591f3d9674e0a9144567d2e0a16fd04a33b4ab8ecfc902f1551c709/uv-0.9.29.tar.gz", hash = "sha256:140422df01de34dc335bd29827ae6aec6ecb2b92c2ee8ed6bc6dbeee50ac2f4e", size = 3838234, upload-time = "2026-02-03T19:39:06.702Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/35/a8d744a2866d176a16c02ead8d277e0b02ae587a68c89cb2b5b9b8bcf602/uv-0.9.29-py3-none-linux_armv6l.whl", hash = "sha256:54fc0056a8f41b43e41c4c677632f751842f5d94b91dea4d547086448a8325eb", size = 21998377, upload-time = "2026-02-03T19:38:24.678Z" }, + { url = "https://files.pythonhosted.org/packages/8b/82/92b539e445c75706cbc8b9ac00291ee2923602e68109d73dffa9ab412257/uv-0.9.29-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:66a5f5c5ecf62f32b8d71383760a422aa9a2a2798cbb6424fb25ccfa8fd53a81", size = 21032721, upload-time = "2026-02-03T19:38:44.791Z" }, + { url = "https://files.pythonhosted.org/packages/55/e8/0489cb87d25a9b06ec3b867fecfd32a9a054dcef8c889662c153d20bba3d/uv-0.9.29-py3-none-macosx_11_0_arm64.whl", hash = "sha256:11aad2d15a9e78551f656886ce604810f872fa2452127216f8ff5d75febae26e", size = 19824587, upload-time = "2026-02-03T19:38:17.32Z" }, + { url = "https://files.pythonhosted.org/packages/ef/09/8e06484d3f1713170926b356913deb0cf25f14ba6c77d765afdbac33e07c/uv-0.9.29-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:4f118141a84862b96f4a4f2bf5e2436f65a8b572706861e0d4585f4bc87fdac0", size = 21616388, upload-time = "2026-02-03T19:38:52.269Z" }, + { url = "https://files.pythonhosted.org/packages/04/da/0c5cfd9d0296c78968fb588ca5a018a6b0e0132bdf3b0fca712cd0ffa938/uv-0.9.29-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:ca5effa2b227a989f341197248551be00919d3dbd13e9d03fabd1af26a9f9d41", size = 21622407, upload-time = "2026-02-03T19:39:12.999Z" }, + { url = "https://files.pythonhosted.org/packages/e5/3f/7c14c282b3d258a274d382c0e03b13fafac99483590476ceb01ca54e2b9d/uv-0.9.29-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d227644f94c66abf82eb51f33cb03a3e2e50f00d502438bc2f0bae1f4ae0e5a5", size = 21585617, upload-time = "2026-02-03T19:38:21.272Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d9/4db58a2f5d311a0549d1f0855e1f650364265e743709ef81824cf86c7ae6/uv-0.9.29-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14a6c27f7c61ca1dc9c6edf53d39e9f289531873c8488ed24bd15e49353a485c", size = 22794114, upload-time = "2026-02-03T19:38:59.809Z" }, + { url = "https://files.pythonhosted.org/packages/8c/41/4d4df6dd7e88bea33557c3b6fd36e054e057cf8dfd64b8e97b4f40c8d170/uv-0.9.29-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5c99fd20ae5a98066c03e06a8f4c5a68e71acf8029d1ab7eba682f7166696b52", size = 24121009, upload-time = "2026-02-03T19:38:13.137Z" }, + { url = "https://files.pythonhosted.org/packages/5e/ef/9a82a1bf3c5d23dd4ecf3c8778fc8ffc241e671fef519e3e7722884e93ba/uv-0.9.29-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:113cbe21a39fa2cfbe146333141561e015a67dfaec7d12415c7ec6ff9f878754", size = 23655975, upload-time = "2026-02-03T19:38:28.713Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f5/6158eaf6558962ca6a7c17ecbe14a2434166d5a0dae9712aca16b8520f46/uv-0.9.29-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d36fe3f9de3a37f7d712ee51ebf42d97df7a00ec901b02b6306c7ebbab8c6a76", size = 22881973, upload-time = "2026-02-03T19:39:03.854Z" }, + { url = "https://files.pythonhosted.org/packages/7b/fa/e725329efb484997fd60018d62f931901f3d25a04b95278845c1ad25b00d/uv-0.9.29-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae09db1bbdad5c38c508876a5903a322951539146f14c7567448bdcdea67e1fe", size = 22760712, upload-time = "2026-02-03T19:38:33.372Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2f/8a2e4ad9a8024ceb10c04a9c386220d53107e6f3bff7a246fe36622b5342/uv-0.9.29-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:aaf650ddf20a6029a59c136eaeade720655c07bfbbd4e7867cc9b6167b0abae9", size = 21721267, upload-time = "2026-02-03T19:38:09.623Z" }, + { url = "https://files.pythonhosted.org/packages/3e/05/8a3b8a190b5ffb9b0d07d10f6f962e29e0f5aa4209415e78bf0514e2394a/uv-0.9.29-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:4095f5763c69d75f324d81e799d90c682f63f4789f7b8ad4297484262ecdeffd", size = 22426985, upload-time = "2026-02-03T19:38:48.4Z" }, + { url = "https://files.pythonhosted.org/packages/41/1d/af83aeebb75062c8539ffdeaa7474ff3c7acb6263d6d7ead28219c71f5d8/uv-0.9.29-py3-none-musllinux_1_1_i686.whl", hash = "sha256:52a6934cbbb3dd339c24e8de1cdd0d3239b82ce5e65289e0b13055009abf2bc1", size = 22051690, upload-time = "2026-02-03T19:39:09.552Z" }, + { url = "https://files.pythonhosted.org/packages/91/65/fe381859f237a5d2b271bc69215ebc5b87cbfd156ad901927921ef82b2e1/uv-0.9.29-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:367cb2a7ab2138b796caf5b402e343ef47f93329ae5d08a05d7bcfeca51b19e7", size = 22968942, upload-time = "2026-02-03T19:38:05.09Z" }, + { url = "https://files.pythonhosted.org/packages/80/04/155263d673c980da9b513673d9a61bb8a5a98547c8e42af3613881ca54e1/uv-0.9.29-py3-none-win32.whl", hash = "sha256:fcb17d9576598f536a04139beefd82187e84db3e6d11a16fa5507f5d3d414f28", size = 20890568, upload-time = "2026-02-03T19:38:40.928Z" }, + { url = "https://files.pythonhosted.org/packages/78/0a/450bd74385c4da3d83639946eaf39ca5bbcb69e73a0433d3bcc65af096d0/uv-0.9.29-py3-none-win_amd64.whl", hash = "sha256:b823c17132b851bf452e38f68e5dd39de9b433c39e2cd3aec2a1734b1594c295", size = 23465607, upload-time = "2026-02-03T19:38:37.411Z" }, + { url = "https://files.pythonhosted.org/packages/ad/2a/0d4a615f36d53a7cf1992351c395b17367783cface5afa5976db4c96675d/uv-0.9.29-py3-none-win_arm64.whl", hash = "sha256:22ab5e68d2d6a283a0a290e9b4a3ce53fef55f6ae197a5f6a58b7f4c605f21c8", size = 21911432, upload-time = "2026-02-03T19:38:55.987Z" }, ] [[package]] From d75f190be82a25b17ec42a26fd8a850331994f7b Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Wed, 4 Feb 2026 14:33:44 +0200 Subject: [PATCH 10/29] Fix bugs found by agent code reviewers --- .github/workflows/vulnerability-scan.yml | 7 ++++--- dev.Dockerfile | 3 +-- pyproject.toml | 3 +-- uv.lock | 6 ++---- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/.github/workflows/vulnerability-scan.yml b/.github/workflows/vulnerability-scan.yml index cf4b7ae8..cd9c7867 100644 --- a/.github/workflows/vulnerability-scan.yml +++ b/.github/workflows/vulnerability-scan.yml @@ -34,12 +34,13 @@ jobs: - name: No-op on pull_request if: github.event_name == 'pull_request' run: echo "Skipping vulnerability scan on PR; marking job success." + - uses: astral-sh/setup-uv@v7 - if: ${{ matrix.extras != '' && contains(fromJSON('["dev", "docs"]'), matrix.extras) }} - run: uv pip compile pyproject.toml --group ${{ matrix.extras }} + run: uv pip compile pyproject.toml --group ${{ matrix.extras }} -o requirements.txt - if: ${{ matrix.extras != '' && !contains(fromJSON('["dev", "docs"]'), matrix.extras) }} - run: uv pip compile pyproject.toml --extra ${{ matrix.extras }} + run: uv pip compile pyproject.toml --extra ${{ matrix.extras }} -o requirements.txt - if: ${{ matrix.extras == '' }} - run: uv pip compile pyproject.toml + run: uv pip compile pyproject.toml -o requirements.txt - uses: pypa/gh-action-pip-audit@v1.1.0 if: github.event_name != 'pull_request' with: diff --git a/dev.Dockerfile b/dev.Dockerfile index 91dc1e6f..ff4adbc2 100644 --- a/dev.Dockerfile +++ b/dev.Dockerfile @@ -4,8 +4,7 @@ FROM --platform=${PLATFORM} ghcr.io/astral-sh/uv:python3.10-trixie COPY . . -RUN curl -LsSf https://astral.sh/uv/install.sh | sh -RUN uv sync --all-groups +RUN uv sync --all-groups \ && uv pip install ipykernel CMD ["uv", "run", "python"] diff --git a/pyproject.toml b/pyproject.toml index 8f5e92ee..616794eb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,8 +23,6 @@ dependencies = [ "pyyaml>=6.0.1", "types-PyYAML>=6.0.12", "pydantic>=2.7.1", - "build", - "twine>=5.0.0", "python-dotenv>=1.0.1", "types-requests>=2.31.0", "typer>=0.12.3", @@ -58,6 +56,7 @@ transformers = ["transformers>=4.57.3", "peft>=0.18.1", "accelerate>=1.12.0"] [dependency-groups] dev = [ "hirundo[pandas,polars,transformers]", + "build", "twine>=5.0.0", "types-setuptools>=69.5.0", "pytest>=8.2.0", diff --git a/uv.lock b/uv.lock index ac75af85..56a964d5 100644 --- a/uv.lock +++ b/uv.lock @@ -617,7 +617,6 @@ name = "hirundo" version = "0.2.3.post1" source = { editable = "." } dependencies = [ - { name = "build" }, { name = "docutils" }, { name = "h11" }, { name = "httpx" }, @@ -629,7 +628,6 @@ dependencies = [ { name = "setuptools" }, { name = "stamina" }, { name = "tqdm" }, - { name = "twine" }, { name = "typer" }, { name = "types-pyyaml" }, { name = "types-requests" }, @@ -653,6 +651,7 @@ transformers = [ dev = [ { name = "authlib" }, { name = "basedpyright" }, + { name = "build" }, { name = "bumpver" }, { name = "cryptography" }, { name = "filelock" }, @@ -687,7 +686,6 @@ docs = [ [package.metadata] requires-dist = [ { name = "accelerate", marker = "extra == 'transformers'", specifier = ">=1.12.0" }, - { name = "build" }, { name = "docutils", specifier = "<0.22.0" }, { name = "h11", specifier = ">=0.16.0" }, { name = "httpx", specifier = ">=0.27.0" }, @@ -703,7 +701,6 @@ requires-dist = [ { name = "stamina", specifier = ">=24.2.0" }, { name = "tqdm", specifier = ">=4.66.5" }, { name = "transformers", marker = "extra == 'transformers'", specifier = ">=4.57.3" }, - { name = "twine", specifier = ">=5.0.0" }, { name = "typer", specifier = ">=0.12.3" }, { name = "types-pyyaml", specifier = ">=6.0.12" }, { name = "types-requests", specifier = ">=2.31.0" }, @@ -715,6 +712,7 @@ provides-extras = ["pandas", "polars", "transformers"] dev = [ { name = "authlib", specifier = ">=1.6.6" }, { name = "basedpyright", specifier = "==1.37.1" }, + { name = "build" }, { name = "bumpver", specifier = ">=2025.1131" }, { name = "cryptography", specifier = ">=44.0.1" }, { name = "filelock", specifier = ">=3.20.1" }, From d6f9e18e591f7f5e7098cd91fffc81356bfe07c9 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Wed, 4 Feb 2026 16:13:25 +0200 Subject: [PATCH 11/29] Fix `pip-audit` rule --- .codex/rules/pip-audit.rules | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.codex/rules/pip-audit.rules b/.codex/rules/pip-audit.rules index 667f079e..91afd814 100644 --- a/.codex/rules/pip-audit.rules +++ b/.codex/rules/pip-audit.rules @@ -1,11 +1,13 @@ prefix_rule( - pattern = ["pip-audit"], + pattern = ["UV_CACHE_DIR=/tmp/uv-cache", "uv", "run", "pip-audit"], decision = "allow", justification = "pip-audit is allowed to run", match = [ - "pip-audit", + "'UV_CACHE_DIR=/tmp/uv-cache' uv run pip-audit", ], not_match = [ + "uv run abc", + "uv run pip-audit", "uvx pip-audit", ], ) From 72322485ab4c1501edf1e0d715288ebf3502e49e Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Wed, 4 Feb 2026 16:16:58 +0200 Subject: [PATCH 12/29] Fix agent code review comments --- .github/workflows/cleanup-test-artifacts.yaml | 4 +--- .github/workflows/vulnerability-scan.yml | 7 ++++--- .pre-commit-config.yaml | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/cleanup-test-artifacts.yaml b/.github/workflows/cleanup-test-artifacts.yaml index 1c637889..857f9834 100644 --- a/.github/workflows/cleanup-test-artifacts.yaml +++ b/.github/workflows/cleanup-test-artifacts.yaml @@ -18,10 +18,8 @@ jobs: with: python-version: '3.11' cache: 'pip' - - name: Set up uv 0.9.6 + - name: Set up uv uses: astral-sh/setup-uv@v3 - with: - version: '0.9.6' - name: Install dependencies run: | uv venv diff --git a/.github/workflows/vulnerability-scan.yml b/.github/workflows/vulnerability-scan.yml index cd9c7867..94e50383 100644 --- a/.github/workflows/vulnerability-scan.yml +++ b/.github/workflows/vulnerability-scan.yml @@ -35,11 +35,12 @@ jobs: if: github.event_name == 'pull_request' run: echo "Skipping vulnerability scan on PR; marking job success." - uses: astral-sh/setup-uv@v7 - - if: ${{ matrix.extras != '' && contains(fromJSON('["dev", "docs"]'), matrix.extras) }} + if: ${{ github.event_name != 'pull_request' }} + - if: ${{ github.event_name != 'pull_request' && matrix.extras != '' && contains(fromJSON('["dev", "docs"]'), matrix.extras) }} run: uv pip compile pyproject.toml --group ${{ matrix.extras }} -o requirements.txt - - if: ${{ matrix.extras != '' && !contains(fromJSON('["dev", "docs"]'), matrix.extras) }} + - if: ${{ github.event_name != 'pull_request' && matrix.extras != '' && !contains(fromJSON('["dev", "docs"]'), matrix.extras) }} run: uv pip compile pyproject.toml --extra ${{ matrix.extras }} -o requirements.txt - - if: ${{ matrix.extras == '' }} + - if: ${{ github.event_name != 'pull_request' && matrix.extras == '' }} run: uv pip compile pyproject.toml -o requirements.txt - uses: pypa/gh-action-pip-audit@v1.1.0 if: github.event_name != 'pull_request' diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0d59d395..1827def4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -25,7 +25,7 @@ repos: additional_dependencies: [basedpyright==1.37.1] - repo: https://github.com/astral-sh/uv-pre-commit # uv version. - rev: 0.9.6 + rev: 0.9.29 hooks: - id: uv-lock - id: uv-sync From fea36066e5465d42f8d9c4cc7c08e423ca365a7a Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Wed, 4 Feb 2026 17:18:02 +0200 Subject: [PATCH 13/29] Skip local install in docs workflow --- .github/workflows/update-docs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-docs.yaml b/.github/workflows/update-docs.yaml index f927b977..972fede8 100644 --- a/.github/workflows/update-docs.yaml +++ b/.github/workflows/update-docs.yaml @@ -40,7 +40,7 @@ jobs: run: | uv venv source .venv/bin/activate - uv sync --group docs + uv sync --group docs --no-install-project # Extract version from hirundo/__init__.py with error handling if [ -f "hirundo/__init__.py" ]; then export VERSION=$(python -c "import re; content=open('hirundo/__init__.py').read(); match=re.search(r'__version__ = [\"\'](.*?)[\"\']', content); print(match.group(1) if match else 'unknown')" 2>/dev/null || echo 'unknown') From cd4b0ec74297fbdf33aace9c0a9590b9523583cb Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Wed, 4 Feb 2026 17:40:31 +0200 Subject: [PATCH 14/29] Fix Windows venv activation and uv setup --- .github/workflows/cleanup-test-artifacts.yaml | 4 +++- .github/workflows/pytest-sanity.yaml | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cleanup-test-artifacts.yaml b/.github/workflows/cleanup-test-artifacts.yaml index 857f9834..2857dadc 100644 --- a/.github/workflows/cleanup-test-artifacts.yaml +++ b/.github/workflows/cleanup-test-artifacts.yaml @@ -19,7 +19,9 @@ jobs: python-version: '3.11' cache: 'pip' - name: Set up uv - uses: astral-sh/setup-uv@v3 + uses: astral-sh/setup-uv@v7 + with: + version: "0.9.29" - name: Install dependencies run: | uv venv diff --git a/.github/workflows/pytest-sanity.yaml b/.github/workflows/pytest-sanity.yaml index cf55ecf3..a8637d40 100644 --- a/.github/workflows/pytest-sanity.yaml +++ b/.github/workflows/pytest-sanity.yaml @@ -57,9 +57,10 @@ jobs: uv sync --group dev - name: Run commands on Windows if: github.event_name != 'pull_request' && runner.os == 'Windows' && steps.changes.outputs.non_workflow == 'true' + shell: pwsh run: | uv venv - .venv\Scripts\activate + & .\.venv\Scripts\Activate.ps1 uv sync --group dev - name: Run PyTest on Linux and macOS if: github.event_name != 'pull_request' && runner.os != 'Windows' && steps.changes.outputs.non_workflow == 'true' From c92eb9ae1cf029b0907c0ec7834d7f014de03ebc Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Wed, 4 Feb 2026 17:40:42 +0200 Subject: [PATCH 15/29] Align cleanup workflow uv setup --- .github/workflows/cleanup-test-artifacts.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/cleanup-test-artifacts.yaml b/.github/workflows/cleanup-test-artifacts.yaml index 2857dadc..38a1de89 100644 --- a/.github/workflows/cleanup-test-artifacts.yaml +++ b/.github/workflows/cleanup-test-artifacts.yaml @@ -20,8 +20,6 @@ jobs: cache: 'pip' - name: Set up uv uses: astral-sh/setup-uv@v7 - with: - version: "0.9.29" - name: Install dependencies run: | uv venv From 433464fc43e42a2378e4ec929d988fcb37377e86 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Thu, 5 Feb 2026 11:04:35 +0200 Subject: [PATCH 16/29] Align `.envrc` with `pre-commit` and docs and other development recommendations --- .envrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.envrc b/.envrc index 550b4cae..95c9ec78 100644 --- a/.envrc +++ b/.envrc @@ -1,2 +1,2 @@ watch_file uv.lock -uv sync --group dev && source .venv/bin/activate +uv sync --all-groups && source .venv/bin/activate From 2ec8051fcabf371976400a7af6245c85bc7127ad Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Thu, 5 Feb 2026 11:06:10 +0200 Subject: [PATCH 17/29] Fix `jaraco-context` vulnerability by upgrading --- pyproject.toml | 2 ++ uv.lock | 8 +++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 616794eb..a1b95f87 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -80,6 +80,8 @@ dev = [ "marshmallow>=4.1.2", # ⬆️ Required to fix vulnerability CVE-2025-68480 "pip-audit", + "jaraco-context>=6.1.0", + # ⬆️ Required to fix vulnerability CVE-2026-23949 ] docs = [ "hirundo[pandas,polars,transformers]", diff --git a/uv.lock b/uv.lock index cfccfb73..c982bcef 100644 --- a/uv.lock +++ b/uv.lock @@ -656,6 +656,7 @@ dev = [ { name = "cryptography" }, { name = "filelock" }, { name = "hirundo", extra = ["pandas", "polars", "transformers"] }, + { name = "jaraco-context" }, { name = "jinja2" }, { name = "marshmallow" }, { name = "pip-audit" }, @@ -717,6 +718,7 @@ dev = [ { name = "cryptography", specifier = ">=44.0.1" }, { name = "filelock", specifier = ">=3.20.1" }, { name = "hirundo", extras = ["pandas", "polars", "transformers"] }, + { name = "jaraco-context", specifier = ">=6.1.0" }, { name = "jinja2", specifier = ">=3.1.6" }, { name = "marshmallow", specifier = ">=4.1.2" }, { name = "pip-audit" }, @@ -874,14 +876,14 @@ wheels = [ [[package]] name = "jaraco-context" -version = "6.0.1" +version = "6.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "backports-tarfile", marker = "python_full_version < '3.12'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/ad/f3777b81bf0b6e7bc7514a1656d3e637b2e8e15fab2ce3235730b3e7a4e6/jaraco_context-6.0.1.tar.gz", hash = "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", size = 13912, upload-time = "2024-08-20T03:39:27.358Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/9c/a788f5bb29c61e456b8ee52ce76dbdd32fd72cd73dd67bc95f42c7a8d13c/jaraco_context-6.1.0.tar.gz", hash = "sha256:129a341b0a85a7db7879e22acd66902fda67882db771754574338898b2d5d86f", size = 15850, upload-time = "2026-01-13T02:53:53.847Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/db/0c52c4cf5e4bd9f5d7135ec7669a3a767af21b3a308e1ed3674881e52b62/jaraco.context-6.0.1-py3-none-any.whl", hash = "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4", size = 6825, upload-time = "2024-08-20T03:39:25.966Z" }, + { url = "https://files.pythonhosted.org/packages/8d/48/aa685dbf1024c7bd82bede569e3a85f82c32fd3d79ba5fea578f0159571a/jaraco_context-6.1.0-py3-none-any.whl", hash = "sha256:a43b5ed85815223d0d3cfdb6d7ca0d2bc8946f28f30b6f3216bda070f68badda", size = 7065, upload-time = "2026-01-13T02:53:53.031Z" }, ] [[package]] From 6ee5ab27b3b475f910fe18a5ba8efd3d62f65026 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Thu, 5 Feb 2026 15:02:58 +0200 Subject: [PATCH 18/29] Change vulnerability scan to run on the `uv` environment with `lowest-direct` resolution to ensure users don't hit vulnerable packages --- .github/workflows/vulnerability-scan.yml | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/.github/workflows/vulnerability-scan.yml b/.github/workflows/vulnerability-scan.yml index 94e50383..fb1a28c5 100644 --- a/.github/workflows/vulnerability-scan.yml +++ b/.github/workflows/vulnerability-scan.yml @@ -35,14 +35,11 @@ jobs: if: github.event_name == 'pull_request' run: echo "Skipping vulnerability scan on PR; marking job success." - uses: astral-sh/setup-uv@v7 - if: ${{ github.event_name != 'pull_request' }} - - if: ${{ github.event_name != 'pull_request' && matrix.extras != '' && contains(fromJSON('["dev", "docs"]'), matrix.extras) }} - run: uv pip compile pyproject.toml --group ${{ matrix.extras }} -o requirements.txt - - if: ${{ github.event_name != 'pull_request' && matrix.extras != '' && !contains(fromJSON('["dev", "docs"]'), matrix.extras) }} - run: uv pip compile pyproject.toml --extra ${{ matrix.extras }} -o requirements.txt - - if: ${{ github.event_name != 'pull_request' && matrix.extras == '' }} - run: uv pip compile pyproject.toml -o requirements.txt + if: github.event_name != 'pull_request' + - if: github.event_name != 'pull_request' + run: | + uv sync --resolution lowest-direct - uses: pypa/gh-action-pip-audit@v1.1.0 if: github.event_name != 'pull_request' with: - inputs: requirements.txt + local: true From 8b97a7096d34d1180e3170d8d142ff4062af370a Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Thu, 5 Feb 2026 15:31:29 +0200 Subject: [PATCH 19/29] Fix release flow by re-running PyTest sanity and vulnerability scanning when re-assigning PR --- .github/workflows/pytest-sanity.yaml | 2 +- .github/workflows/vulnerability-scan.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pytest-sanity.yaml b/.github/workflows/pytest-sanity.yaml index a8637d40..d2dd2a36 100644 --- a/.github/workflows/pytest-sanity.yaml +++ b/.github/workflows/pytest-sanity.yaml @@ -2,7 +2,7 @@ name: Run sanity tests with PyTest on: pull_request: - types: [opened, synchronize] + types: [opened, synchronize, reopened, assigned] push: branches: - "main" diff --git a/.github/workflows/vulnerability-scan.yml b/.github/workflows/vulnerability-scan.yml index fb1a28c5..460df741 100644 --- a/.github/workflows/vulnerability-scan.yml +++ b/.github/workflows/vulnerability-scan.yml @@ -1,7 +1,7 @@ name: Vulnerability scan on: pull_request: - types: [opened, synchronize] + types: [opened, synchronize, reopened, assigned] merge_group: types: [checks_requested] push: From c9841786890128b97c0c7db5a887aa983b2b64b4 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Sun, 8 Feb 2026 09:44:16 +0200 Subject: [PATCH 20/29] Drop irrelevant `matrix` from `vulnerability-scan.yml` --- .github/workflows/vulnerability-scan.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/.github/workflows/vulnerability-scan.yml b/.github/workflows/vulnerability-scan.yml index 460df741..56d072b7 100644 --- a/.github/workflows/vulnerability-scan.yml +++ b/.github/workflows/vulnerability-scan.yml @@ -16,15 +16,6 @@ concurrency: jobs: vulnerability-scan: - strategy: - matrix: - extras: - - '' - - dev - - docs - - pandas - - polars - - transformers runs-on: ubuntu-latest permissions: contents: read From 46a487c44ec3874c0fb60bffb45c21cd79e505fe Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Sun, 8 Feb 2026 09:45:18 +0200 Subject: [PATCH 21/29] Ensure that `uv`'s `venv` is activated before scanning for vulnerabilities --- .github/workflows/vulnerability-scan.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/vulnerability-scan.yml b/.github/workflows/vulnerability-scan.yml index 56d072b7..b83ec29a 100644 --- a/.github/workflows/vulnerability-scan.yml +++ b/.github/workflows/vulnerability-scan.yml @@ -29,7 +29,9 @@ jobs: if: github.event_name != 'pull_request' - if: github.event_name != 'pull_request' run: | + uv venv uv sync --resolution lowest-direct + source .venv/bin/activate - uses: pypa/gh-action-pip-audit@v1.1.0 if: github.event_name != 'pull_request' with: From 94b89a4991ef0931c9350e1af572234fbc65776f Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Sun, 8 Feb 2026 09:46:08 +0200 Subject: [PATCH 22/29] Align `uv venv` and activation order in `vulnerability-scan.yml` --- .github/workflows/vulnerability-scan.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/vulnerability-scan.yml b/.github/workflows/vulnerability-scan.yml index b83ec29a..d453e144 100644 --- a/.github/workflows/vulnerability-scan.yml +++ b/.github/workflows/vulnerability-scan.yml @@ -30,8 +30,8 @@ jobs: - if: github.event_name != 'pull_request' run: | uv venv - uv sync --resolution lowest-direct source .venv/bin/activate + uv sync --resolution lowest-direct - uses: pypa/gh-action-pip-audit@v1.1.0 if: github.event_name != 'pull_request' with: From 69a8430cd4d03861cd3dde54b1e5849e11ab6134 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Sun, 8 Feb 2026 09:47:33 +0200 Subject: [PATCH 23/29] Change `vulnerability-scan.yml` to install all `groups` and all `extras` to ensure that they are tested for vulnerabilities --- .github/workflows/vulnerability-scan.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/vulnerability-scan.yml b/.github/workflows/vulnerability-scan.yml index d453e144..250b7df1 100644 --- a/.github/workflows/vulnerability-scan.yml +++ b/.github/workflows/vulnerability-scan.yml @@ -31,7 +31,7 @@ jobs: run: | uv venv source .venv/bin/activate - uv sync --resolution lowest-direct + uv sync --resolution lowest-direct --all-groups --all-extras - uses: pypa/gh-action-pip-audit@v1.1.0 if: github.event_name != 'pull_request' with: From a8a5e9f57bceebf12e1f230c3d3cb0a205303ce3 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Sun, 8 Feb 2026 10:28:33 +0200 Subject: [PATCH 24/29] Fix `deploy-docker-image.yaml` disk space issues by changing GitHub Actions runner --- .github/workflows/deploy-docker-image.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-docker-image.yaml b/.github/workflows/deploy-docker-image.yaml index 6eb42d10..ed6a3574 100644 --- a/.github/workflows/deploy-docker-image.yaml +++ b/.github/workflows/deploy-docker-image.yaml @@ -21,7 +21,7 @@ permissions: jobs: build-and-push: if: (startsWith(github.ref, 'refs/tags/v') && contains(github.ref, '+on-prem')) || github.event_name == 'pull_request' - runs-on: ubuntu-latest + runs-on: ubuntu-latest-small-docker steps: - name: Checkout repository From 0f16ab05097ec7cbe93918d5105e345b219b7017 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Sun, 8 Feb 2026 12:04:11 +0200 Subject: [PATCH 25/29] Fix Cursor's bugbot's comment about `vulnerability-scan.yml` specifically scanning `.venv` --- .github/workflows/vulnerability-scan.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/vulnerability-scan.yml b/.github/workflows/vulnerability-scan.yml index 250b7df1..0d8dfcb3 100644 --- a/.github/workflows/vulnerability-scan.yml +++ b/.github/workflows/vulnerability-scan.yml @@ -35,4 +35,4 @@ jobs: - uses: pypa/gh-action-pip-audit@v1.1.0 if: github.event_name != 'pull_request' with: - local: true + virtual-environment: .venv From c74d696b26f4a1cd8276d6f0136d3ed94c9ee317 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Sun, 8 Feb 2026 15:02:30 +0200 Subject: [PATCH 26/29] Update workflows to use setup-uv --- .github/workflows/cleanup-test-artifacts.yaml | 7 ++----- .github/workflows/create-release.yaml | 8 +++----- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/.github/workflows/cleanup-test-artifacts.yaml b/.github/workflows/cleanup-test-artifacts.yaml index 38a1de89..9f5cda4e 100644 --- a/.github/workflows/cleanup-test-artifacts.yaml +++ b/.github/workflows/cleanup-test-artifacts.yaml @@ -13,13 +13,10 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Set up Python - uses: actions/setup-python@v6 - with: - python-version: '3.11' - cache: 'pip' - name: Set up uv uses: astral-sh/setup-uv@v7 + with: + python-version: '3.11' - name: Install dependencies run: | uv venv diff --git a/.github/workflows/create-release.yaml b/.github/workflows/create-release.yaml index 54d75513..47af0da8 100644 --- a/.github/workflows/create-release.yaml +++ b/.github/workflows/create-release.yaml @@ -27,12 +27,10 @@ jobs: - uses: actions/checkout@v4 with: ref: ${{ github.event.ref }} - - name: Set up Python - uses: actions/setup-python@v6 - with: - cache: 'pip' - - name: Install uv + - name: Set up uv uses: astral-sh/setup-uv@v7 + with: + python-version: '3.11' - name: Bump version with `bumpver` then push tag env: GH_TOKEN: ${{ github.token }} From d2d36682be9a6085e1ed9ce740b25779d9c6a170 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Sun, 8 Feb 2026 18:19:33 +0200 Subject: [PATCH 27/29] Add deploy-only dependency group --- .github/workflows/deploy-to-pypi.yaml | 2 +- .github/workflows/update-docs.yaml | 2 +- pyproject.toml | 6 ++++-- uv.lock | 12 ++++++++---- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/.github/workflows/deploy-to-pypi.yaml b/.github/workflows/deploy-to-pypi.yaml index c910b31a..bf5c7904 100644 --- a/.github/workflows/deploy-to-pypi.yaml +++ b/.github/workflows/deploy-to-pypi.yaml @@ -43,7 +43,7 @@ jobs: run: | uv venv source .venv/bin/activate - uv sync --group dev + uv sync --only-group deploy --no-install-project python -m build - name: Publish package distributions to TestPyPI (with act) env: diff --git a/.github/workflows/update-docs.yaml b/.github/workflows/update-docs.yaml index 972fede8..d27160f1 100644 --- a/.github/workflows/update-docs.yaml +++ b/.github/workflows/update-docs.yaml @@ -40,7 +40,7 @@ jobs: run: | uv venv source .venv/bin/activate - uv sync --group docs --no-install-project + uv sync --only-group docs --no-install-project # Extract version from hirundo/__init__.py with error handling if [ -f "hirundo/__init__.py" ]; then export VERSION=$(python -c "import re; content=open('hirundo/__init__.py').read(); match=re.search(r'__version__ = [\"\'](.*?)[\"\']', content); print(match.group(1) if match else 'unknown')" 2>/dev/null || echo 'unknown') diff --git a/pyproject.toml b/pyproject.toml index a1b95f87..9b6bc32d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,8 +56,6 @@ transformers = ["transformers>=4.57.3", "peft>=0.18.1", "accelerate>=1.12.0"] [dependency-groups] dev = [ "hirundo[pandas,polars,transformers]", - "build", - "twine>=5.0.0", "types-setuptools>=69.5.0", "pytest>=8.2.0", "pytest-asyncio>=0.23.6", @@ -83,6 +81,10 @@ dev = [ "jaraco-context>=6.1.0", # ⬆️ Required to fix vulnerability CVE-2026-23949 ] +deploy = [ + "build", + "twine>=5.0.0", +] docs = [ "hirundo[pandas,polars,transformers]", "sphinx>=7.4.7", diff --git a/uv.lock b/uv.lock index c982bcef..8c81be2c 100644 --- a/uv.lock +++ b/uv.lock @@ -648,10 +648,13 @@ transformers = [ ] [package.dev-dependencies] +deploy = [ + { name = "build" }, + { name = "twine" }, +] dev = [ { name = "authlib" }, { name = "basedpyright" }, - { name = "build" }, { name = "bumpver" }, { name = "cryptography" }, { name = "filelock" }, @@ -665,7 +668,6 @@ dev = [ { name = "pytest" }, { name = "pytest-asyncio" }, { name = "ruff" }, - { name = "twine" }, { name = "types-setuptools" }, { name = "uv" }, { name = "virtualenv" }, @@ -710,10 +712,13 @@ requires-dist = [ provides-extras = ["pandas", "polars", "transformers"] [package.metadata.requires-dev] +deploy = [ + { name = "build" }, + { name = "twine", specifier = ">=5.0.0" }, +] dev = [ { name = "authlib", specifier = ">=1.6.6" }, { name = "basedpyright", specifier = "==1.37.1" }, - { name = "build" }, { name = "bumpver", specifier = ">=2025.1131" }, { name = "cryptography", specifier = ">=44.0.1" }, { name = "filelock", specifier = ">=3.20.1" }, @@ -727,7 +732,6 @@ dev = [ { name = "pytest", specifier = ">=8.2.0" }, { name = "pytest-asyncio", specifier = ">=0.23.6" }, { name = "ruff", specifier = ">=0.12.0" }, - { name = "twine", specifier = ">=5.0.0" }, { name = "types-setuptools", specifier = ">=69.5.0" }, { name = "uv", specifier = ">=0.9.29" }, { name = "virtualenv", specifier = ">=20.36.1" }, From 6abef507097ae7dc3628cebfe408f99a7561fb30 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Wed, 11 Feb 2026 00:44:24 +0200 Subject: [PATCH 28/29] Fix vulnerabilities --- .codex/environments/environment.toml | 6 + pyproject.toml | 8 +- uv.lock | 226 ++++++++++++++++----------- 3 files changed, 142 insertions(+), 98 deletions(-) create mode 100644 .codex/environments/environment.toml diff --git a/.codex/environments/environment.toml b/.codex/environments/environment.toml new file mode 100644 index 00000000..dc3e7413 --- /dev/null +++ b/.codex/environments/environment.toml @@ -0,0 +1,6 @@ +# THIS IS AUTOGENERATED. DO NOT EDIT MANUALLY +version = 1 +name = "hirundo-python-sdk" + +[setup] +script = "uv sync --group dev && source .venv/bin/activate" diff --git a/pyproject.toml b/pyproject.toml index 9b6bc32d..dfa98679 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -69,12 +69,12 @@ dev = [ "ruff>=0.12.0", "bumpver>=2025.1131", "platformdirs>=4.3.6", - "cryptography>=44.0.1", - # ⬆️ Required to fix vulnerability GHSA-79v4-65xg-pq4g + "cryptography>=46.0.5", + # ⬆️ Required to fix vulnerability CVE-2026-26007 "jinja2>=3.1.6", # ⬆️ Required to fix vulnerabilities GHSA-cpwx-vrp4-4pq7 , GHSA-gmj6-6f8f-6699 & GHSA-q2x7-8rv6-6q7h - "filelock>=3.20.1", - # ⬆️ Required to fix vulnerability CVE-2025-68146 + "filelock>=3.20.3", + # ⬆️ Required to fix vulnerability CVE-2026-22701 "marshmallow>=4.1.2", # ⬆️ Required to fix vulnerability CVE-2025-68480 "pip-audit", diff --git a/uv.lock b/uv.lock index 8c81be2c..8c377dc2 100644 --- a/uv.lock +++ b/uv.lock @@ -274,59 +274,84 @@ wheels = [ [[package]] name = "cffi" -version = "1.17.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pycparser" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload-time = "2024-09-04T20:45:21.852Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/07/f44ca684db4e4f08a3fdc6eeb9a0d15dc6883efc7b8c90357fdbf74e186c/cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", size = 182191, upload-time = "2024-09-04T20:43:30.027Z" }, - { url = "https://files.pythonhosted.org/packages/08/fd/cc2fedbd887223f9f5d170c96e57cbf655df9831a6546c1727ae13fa977a/cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", size = 178592, upload-time = "2024-09-04T20:43:32.108Z" }, - { url = "https://files.pythonhosted.org/packages/de/cc/4635c320081c78d6ffc2cab0a76025b691a91204f4aa317d568ff9280a2d/cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", size = 426024, upload-time = "2024-09-04T20:43:34.186Z" }, - { url = "https://files.pythonhosted.org/packages/b6/7b/3b2b250f3aab91abe5f8a51ada1b717935fdaec53f790ad4100fe2ec64d1/cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", size = 448188, upload-time = "2024-09-04T20:43:36.286Z" }, - { url = "https://files.pythonhosted.org/packages/d3/48/1b9283ebbf0ec065148d8de05d647a986c5f22586b18120020452fff8f5d/cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", size = 455571, upload-time = "2024-09-04T20:43:38.586Z" }, - { url = "https://files.pythonhosted.org/packages/40/87/3b8452525437b40f39ca7ff70276679772ee7e8b394934ff60e63b7b090c/cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", size = 436687, upload-time = "2024-09-04T20:43:40.084Z" }, - { url = "https://files.pythonhosted.org/packages/8d/fb/4da72871d177d63649ac449aec2e8a29efe0274035880c7af59101ca2232/cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", size = 446211, upload-time = "2024-09-04T20:43:41.526Z" }, - { url = "https://files.pythonhosted.org/packages/ab/a0/62f00bcb411332106c02b663b26f3545a9ef136f80d5df746c05878f8c4b/cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", size = 461325, upload-time = "2024-09-04T20:43:43.117Z" }, - { url = "https://files.pythonhosted.org/packages/36/83/76127035ed2e7e27b0787604d99da630ac3123bfb02d8e80c633f218a11d/cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", size = 438784, upload-time = "2024-09-04T20:43:45.256Z" }, - { url = "https://files.pythonhosted.org/packages/21/81/a6cd025db2f08ac88b901b745c163d884641909641f9b826e8cb87645942/cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", size = 461564, upload-time = "2024-09-04T20:43:46.779Z" }, - { url = "https://files.pythonhosted.org/packages/f8/fe/4d41c2f200c4a457933dbd98d3cf4e911870877bd94d9656cc0fcb390681/cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", size = 171804, upload-time = "2024-09-04T20:43:48.186Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b6/0b0f5ab93b0df4acc49cae758c81fe4e5ef26c3ae2e10cc69249dfd8b3ab/cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", size = 181299, upload-time = "2024-09-04T20:43:49.812Z" }, - { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264, upload-time = "2024-09-04T20:43:51.124Z" }, - { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651, upload-time = "2024-09-04T20:43:52.872Z" }, - { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259, upload-time = "2024-09-04T20:43:56.123Z" }, - { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200, upload-time = "2024-09-04T20:43:57.891Z" }, - { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235, upload-time = "2024-09-04T20:44:00.18Z" }, - { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721, upload-time = "2024-09-04T20:44:01.585Z" }, - { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242, upload-time = "2024-09-04T20:44:03.467Z" }, - { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999, upload-time = "2024-09-04T20:44:05.023Z" }, - { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242, upload-time = "2024-09-04T20:44:06.444Z" }, - { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604, upload-time = "2024-09-04T20:44:08.206Z" }, - { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727, upload-time = "2024-09-04T20:44:09.481Z" }, - { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400, upload-time = "2024-09-04T20:44:10.873Z" }, - { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178, upload-time = "2024-09-04T20:44:12.232Z" }, - { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840, upload-time = "2024-09-04T20:44:13.739Z" }, - { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803, upload-time = "2024-09-04T20:44:15.231Z" }, - { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850, upload-time = "2024-09-04T20:44:17.188Z" }, - { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729, upload-time = "2024-09-04T20:44:18.688Z" }, - { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256, upload-time = "2024-09-04T20:44:20.248Z" }, - { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424, upload-time = "2024-09-04T20:44:21.673Z" }, - { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568, upload-time = "2024-09-04T20:44:23.245Z" }, - { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736, upload-time = "2024-09-04T20:44:24.757Z" }, - { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448, upload-time = "2024-09-04T20:44:26.208Z" }, - { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976, upload-time = "2024-09-04T20:44:27.578Z" }, - { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload-time = "2024-09-04T20:44:28.956Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload-time = "2024-09-04T20:44:30.289Z" }, - { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload-time = "2024-09-04T20:44:32.01Z" }, - { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload-time = "2024-09-04T20:44:33.606Z" }, - { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload-time = "2024-09-04T20:44:35.191Z" }, - { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload-time = "2024-09-04T20:44:36.743Z" }, - { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload-time = "2024-09-04T20:44:38.492Z" }, - { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload-time = "2024-09-04T20:44:40.046Z" }, - { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload-time = "2024-09-04T20:44:41.616Z" }, - { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload-time = "2024-09-04T20:44:43.733Z" }, - { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload-time = "2024-09-04T20:44:45.309Z" }, +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload-time = "2025-09-08T23:22:08.01Z" }, + { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload-time = "2025-09-08T23:22:10.637Z" }, + { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, + { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, + { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" }, + { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" }, + { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, + { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, + { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, + { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, + { url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184, upload-time = "2025-09-08T23:22:23.328Z" }, + { url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790, upload-time = "2025-09-08T23:22:24.752Z" }, + { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, + { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, + { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, + { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, + { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, + { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, + { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, + { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, ] [[package]] @@ -425,49 +450,62 @@ wheels = [ [[package]] name = "cryptography" -version = "45.0.6" +version = "46.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d6/0d/d13399c94234ee8f3df384819dc67e0c5ce215fb751d567a55a1f4b028c7/cryptography-45.0.6.tar.gz", hash = "sha256:5c966c732cf6e4a276ce83b6e4c729edda2df6929083a952cc7da973c539c719", size = 744949, upload-time = "2025-08-05T23:59:27.93Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/29/2793d178d0eda1ca4a09a7c4e09a5185e75738cc6d526433e8663b460ea6/cryptography-45.0.6-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:048e7ad9e08cf4c0ab07ff7f36cc3115924e22e2266e034450a890d9e312dd74", size = 7042702, upload-time = "2025-08-05T23:58:23.464Z" }, - { url = "https://files.pythonhosted.org/packages/b3/b6/cabd07410f222f32c8d55486c464f432808abaa1f12af9afcbe8f2f19030/cryptography-45.0.6-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:44647c5d796f5fc042bbc6d61307d04bf29bccb74d188f18051b635f20a9c75f", size = 4206483, upload-time = "2025-08-05T23:58:27.132Z" }, - { url = "https://files.pythonhosted.org/packages/8b/9e/f9c7d36a38b1cfeb1cc74849aabe9bf817990f7603ff6eb485e0d70e0b27/cryptography-45.0.6-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e40b80ecf35ec265c452eea0ba94c9587ca763e739b8e559c128d23bff7ebbbf", size = 4429679, upload-time = "2025-08-05T23:58:29.152Z" }, - { url = "https://files.pythonhosted.org/packages/9c/2a/4434c17eb32ef30b254b9e8b9830cee4e516f08b47fdd291c5b1255b8101/cryptography-45.0.6-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:00e8724bdad672d75e6f069b27970883179bd472cd24a63f6e620ca7e41cc0c5", size = 4210553, upload-time = "2025-08-05T23:58:30.596Z" }, - { url = "https://files.pythonhosted.org/packages/ef/1d/09a5df8e0c4b7970f5d1f3aff1b640df6d4be28a64cae970d56c6cf1c772/cryptography-45.0.6-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a3085d1b319d35296176af31c90338eeb2ddac8104661df79f80e1d9787b8b2", size = 3894499, upload-time = "2025-08-05T23:58:32.03Z" }, - { url = "https://files.pythonhosted.org/packages/79/62/120842ab20d9150a9d3a6bdc07fe2870384e82f5266d41c53b08a3a96b34/cryptography-45.0.6-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1b7fa6a1c1188c7ee32e47590d16a5a0646270921f8020efc9a511648e1b2e08", size = 4458484, upload-time = "2025-08-05T23:58:33.526Z" }, - { url = "https://files.pythonhosted.org/packages/fd/80/1bc3634d45ddfed0871bfba52cf8f1ad724761662a0c792b97a951fb1b30/cryptography-45.0.6-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:275ba5cc0d9e320cd70f8e7b96d9e59903c815ca579ab96c1e37278d231fc402", size = 4210281, upload-time = "2025-08-05T23:58:35.445Z" }, - { url = "https://files.pythonhosted.org/packages/7d/fe/ffb12c2d83d0ee625f124880a1f023b5878f79da92e64c37962bbbe35f3f/cryptography-45.0.6-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f4028f29a9f38a2025abedb2e409973709c660d44319c61762202206ed577c42", size = 4456890, upload-time = "2025-08-05T23:58:36.923Z" }, - { url = "https://files.pythonhosted.org/packages/8c/8e/b3f3fe0dc82c77a0deb5f493b23311e09193f2268b77196ec0f7a36e3f3e/cryptography-45.0.6-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ee411a1b977f40bd075392c80c10b58025ee5c6b47a822a33c1198598a7a5f05", size = 4333247, upload-time = "2025-08-05T23:58:38.781Z" }, - { url = "https://files.pythonhosted.org/packages/b3/a6/c3ef2ab9e334da27a1d7b56af4a2417d77e7806b2e0f90d6267ce120d2e4/cryptography-45.0.6-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e2a21a8eda2d86bb604934b6b37691585bd095c1f788530c1fcefc53a82b3453", size = 4565045, upload-time = "2025-08-05T23:58:40.415Z" }, - { url = "https://files.pythonhosted.org/packages/31/c3/77722446b13fa71dddd820a5faab4ce6db49e7e0bf8312ef4192a3f78e2f/cryptography-45.0.6-cp311-abi3-win32.whl", hash = "sha256:d063341378d7ee9c91f9d23b431a3502fc8bfacd54ef0a27baa72a0843b29159", size = 2928923, upload-time = "2025-08-05T23:58:41.919Z" }, - { url = "https://files.pythonhosted.org/packages/38/63/a025c3225188a811b82932a4dcc8457a26c3729d81578ccecbcce2cb784e/cryptography-45.0.6-cp311-abi3-win_amd64.whl", hash = "sha256:833dc32dfc1e39b7376a87b9a6a4288a10aae234631268486558920029b086ec", size = 3403805, upload-time = "2025-08-05T23:58:43.792Z" }, - { url = "https://files.pythonhosted.org/packages/5b/af/bcfbea93a30809f126d51c074ee0fac5bd9d57d068edf56c2a73abedbea4/cryptography-45.0.6-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:3436128a60a5e5490603ab2adbabc8763613f638513ffa7d311c900a8349a2a0", size = 7020111, upload-time = "2025-08-05T23:58:45.316Z" }, - { url = "https://files.pythonhosted.org/packages/98/c6/ea5173689e014f1a8470899cd5beeb358e22bb3cf5a876060f9d1ca78af4/cryptography-45.0.6-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0d9ef57b6768d9fa58e92f4947cea96ade1233c0e236db22ba44748ffedca394", size = 4198169, upload-time = "2025-08-05T23:58:47.121Z" }, - { url = "https://files.pythonhosted.org/packages/ba/73/b12995edc0c7e2311ffb57ebd3b351f6b268fed37d93bfc6f9856e01c473/cryptography-45.0.6-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea3c42f2016a5bbf71825537c2ad753f2870191134933196bee408aac397b3d9", size = 4421273, upload-time = "2025-08-05T23:58:48.557Z" }, - { url = "https://files.pythonhosted.org/packages/f7/6e/286894f6f71926bc0da67408c853dd9ba953f662dcb70993a59fd499f111/cryptography-45.0.6-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:20ae4906a13716139d6d762ceb3e0e7e110f7955f3bc3876e3a07f5daadec5f3", size = 4199211, upload-time = "2025-08-05T23:58:50.139Z" }, - { url = "https://files.pythonhosted.org/packages/de/34/a7f55e39b9623c5cb571d77a6a90387fe557908ffc44f6872f26ca8ae270/cryptography-45.0.6-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dac5ec199038b8e131365e2324c03d20e97fe214af051d20c49db129844e8b3", size = 3883732, upload-time = "2025-08-05T23:58:52.253Z" }, - { url = "https://files.pythonhosted.org/packages/f9/b9/c6d32edbcba0cd9f5df90f29ed46a65c4631c4fbe11187feb9169c6ff506/cryptography-45.0.6-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:18f878a34b90d688982e43f4b700408b478102dd58b3e39de21b5ebf6509c301", size = 4450655, upload-time = "2025-08-05T23:58:53.848Z" }, - { url = "https://files.pythonhosted.org/packages/77/2d/09b097adfdee0227cfd4c699b3375a842080f065bab9014248933497c3f9/cryptography-45.0.6-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5bd6020c80c5b2b2242d6c48487d7b85700f5e0038e67b29d706f98440d66eb5", size = 4198956, upload-time = "2025-08-05T23:58:55.209Z" }, - { url = "https://files.pythonhosted.org/packages/55/66/061ec6689207d54effdff535bbdf85cc380d32dd5377173085812565cf38/cryptography-45.0.6-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:eccddbd986e43014263eda489abbddfbc287af5cddfd690477993dbb31e31016", size = 4449859, upload-time = "2025-08-05T23:58:56.639Z" }, - { url = "https://files.pythonhosted.org/packages/41/ff/e7d5a2ad2d035e5a2af116e1a3adb4d8fcd0be92a18032917a089c6e5028/cryptography-45.0.6-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:550ae02148206beb722cfe4ef0933f9352bab26b087af00e48fdfb9ade35c5b3", size = 4320254, upload-time = "2025-08-05T23:58:58.833Z" }, - { url = "https://files.pythonhosted.org/packages/82/27/092d311af22095d288f4db89fcaebadfb2f28944f3d790a4cf51fe5ddaeb/cryptography-45.0.6-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5b64e668fc3528e77efa51ca70fadcd6610e8ab231e3e06ae2bab3b31c2b8ed9", size = 4554815, upload-time = "2025-08-05T23:59:00.283Z" }, - { url = "https://files.pythonhosted.org/packages/7e/01/aa2f4940262d588a8fdf4edabe4cda45854d00ebc6eaac12568b3a491a16/cryptography-45.0.6-cp37-abi3-win32.whl", hash = "sha256:780c40fb751c7d2b0c6786ceee6b6f871e86e8718a8ff4bc35073ac353c7cd02", size = 2912147, upload-time = "2025-08-05T23:59:01.716Z" }, - { url = "https://files.pythonhosted.org/packages/0a/bc/16e0276078c2de3ceef6b5a34b965f4436215efac45313df90d55f0ba2d2/cryptography-45.0.6-cp37-abi3-win_amd64.whl", hash = "sha256:20d15aed3ee522faac1a39fbfdfee25d17b1284bafd808e1640a74846d7c4d1b", size = 3390459, upload-time = "2025-08-05T23:59:03.358Z" }, - { url = "https://files.pythonhosted.org/packages/56/d2/4482d97c948c029be08cb29854a91bd2ae8da7eb9c4152461f1244dcea70/cryptography-45.0.6-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:705bb7c7ecc3d79a50f236adda12ca331c8e7ecfbea51edd931ce5a7a7c4f012", size = 3576812, upload-time = "2025-08-05T23:59:04.833Z" }, - { url = "https://files.pythonhosted.org/packages/ec/24/55fc238fcaa122855442604b8badb2d442367dfbd5a7ca4bb0bd346e263a/cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:826b46dae41a1155a0c0e66fafba43d0ede1dc16570b95e40c4d83bfcf0a451d", size = 4141694, upload-time = "2025-08-05T23:59:06.66Z" }, - { url = "https://files.pythonhosted.org/packages/f9/7e/3ea4fa6fbe51baf3903806a0241c666b04c73d2358a3ecce09ebee8b9622/cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cc4d66f5dc4dc37b89cfef1bd5044387f7a1f6f0abb490815628501909332d5d", size = 4375010, upload-time = "2025-08-05T23:59:08.14Z" }, - { url = "https://files.pythonhosted.org/packages/50/42/ec5a892d82d2a2c29f80fc19ced4ba669bca29f032faf6989609cff1f8dc/cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:f68f833a9d445cc49f01097d95c83a850795921b3f7cc6488731e69bde3288da", size = 4141377, upload-time = "2025-08-05T23:59:09.584Z" }, - { url = "https://files.pythonhosted.org/packages/e7/d7/246c4c973a22b9c2931999da953a2c19cae7c66b9154c2d62ffed811225e/cryptography-45.0.6-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:3b5bf5267e98661b9b888a9250d05b063220dfa917a8203744454573c7eb79db", size = 4374609, upload-time = "2025-08-05T23:59:11.923Z" }, - { url = "https://files.pythonhosted.org/packages/78/6d/c49ccf243f0a1b0781c2a8de8123ee552f0c8a417c6367a24d2ecb7c11b3/cryptography-45.0.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2384f2ab18d9be88a6e4f8972923405e2dbb8d3e16c6b43f15ca491d7831bd18", size = 3322156, upload-time = "2025-08-05T23:59:13.597Z" }, - { url = "https://files.pythonhosted.org/packages/61/69/c252de4ec047ba2f567ecb53149410219577d408c2aea9c989acae7eafce/cryptography-45.0.6-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fc022c1fa5acff6def2fc6d7819bbbd31ccddfe67d075331a65d9cfb28a20983", size = 3584669, upload-time = "2025-08-05T23:59:15.431Z" }, - { url = "https://files.pythonhosted.org/packages/e3/fe/deea71e9f310a31fe0a6bfee670955152128d309ea2d1c79e2a5ae0f0401/cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3de77e4df42ac8d4e4d6cdb342d989803ad37707cf8f3fbf7b088c9cbdd46427", size = 4153022, upload-time = "2025-08-05T23:59:16.954Z" }, - { url = "https://files.pythonhosted.org/packages/60/45/a77452f5e49cb580feedba6606d66ae7b82c128947aa754533b3d1bd44b0/cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:599c8d7df950aa68baa7e98f7b73f4f414c9f02d0e8104a30c0182a07732638b", size = 4386802, upload-time = "2025-08-05T23:59:18.55Z" }, - { url = "https://files.pythonhosted.org/packages/a3/b9/a2f747d2acd5e3075fdf5c145c7c3568895daaa38b3b0c960ef830db6cdc/cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:31a2b9a10530a1cb04ffd6aa1cd4d3be9ed49f7d77a4dafe198f3b382f41545c", size = 4152706, upload-time = "2025-08-05T23:59:20.044Z" }, - { url = "https://files.pythonhosted.org/packages/81/ec/381b3e8d0685a3f3f304a382aa3dfce36af2d76467da0fd4bb21ddccc7b2/cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:e5b3dda1b00fb41da3af4c5ef3f922a200e33ee5ba0f0bc9ecf0b0c173958385", size = 4386740, upload-time = "2025-08-05T23:59:21.525Z" }, - { url = "https://files.pythonhosted.org/packages/0a/76/cf8d69da8d0b5ecb0db406f24a63a3f69ba5e791a11b782aeeefef27ccbb/cryptography-45.0.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:629127cfdcdc6806dfe234734d7cb8ac54edaf572148274fa377a7d3405b0043", size = 3331874, upload-time = "2025-08-05T23:59:23.017Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/60/04/ee2a9e8542e4fa2773b81771ff8349ff19cdd56b7258a0cc442639052edb/cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d", size = 750064, upload-time = "2026-02-10T19:18:38.255Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/81/b0bb27f2ba931a65409c6b8a8b358a7f03c0e46eceacddff55f7c84b1f3b/cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad", size = 7176289, upload-time = "2026-02-10T19:17:08.274Z" }, + { url = "https://files.pythonhosted.org/packages/ff/9e/6b4397a3e3d15123de3b1806ef342522393d50736c13b20ec4c9ea6693a6/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b", size = 4275637, upload-time = "2026-02-10T19:17:10.53Z" }, + { url = "https://files.pythonhosted.org/packages/63/e7/471ab61099a3920b0c77852ea3f0ea611c9702f651600397ac567848b897/cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b", size = 4424742, upload-time = "2026-02-10T19:17:12.388Z" }, + { url = "https://files.pythonhosted.org/packages/37/53/a18500f270342d66bf7e4d9f091114e31e5ee9e7375a5aba2e85a91e0044/cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263", size = 4277528, upload-time = "2026-02-10T19:17:13.853Z" }, + { url = "https://files.pythonhosted.org/packages/22/29/c2e812ebc38c57b40e7c583895e73c8c5adb4d1e4a0cc4c5a4fdab2b1acc/cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d", size = 4947993, upload-time = "2026-02-10T19:17:15.618Z" }, + { url = "https://files.pythonhosted.org/packages/6b/e7/237155ae19a9023de7e30ec64e5d99a9431a567407ac21170a046d22a5a3/cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed", size = 4456855, upload-time = "2026-02-10T19:17:17.221Z" }, + { url = "https://files.pythonhosted.org/packages/2d/87/fc628a7ad85b81206738abbd213b07702bcbdada1dd43f72236ef3cffbb5/cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2", size = 3984635, upload-time = "2026-02-10T19:17:18.792Z" }, + { url = "https://files.pythonhosted.org/packages/84/29/65b55622bde135aedf4565dc509d99b560ee4095e56989e815f8fd2aa910/cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2", size = 4277038, upload-time = "2026-02-10T19:17:20.256Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/45e76c68d7311432741faf1fbf7fac8a196a0a735ca21f504c75d37e2558/cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0", size = 4912181, upload-time = "2026-02-10T19:17:21.825Z" }, + { url = "https://files.pythonhosted.org/packages/6d/1a/c1ba8fead184d6e3d5afcf03d569acac5ad063f3ac9fb7258af158f7e378/cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731", size = 4456482, upload-time = "2026-02-10T19:17:25.133Z" }, + { url = "https://files.pythonhosted.org/packages/f9/e5/3fb22e37f66827ced3b902cf895e6a6bc1d095b5b26be26bd13c441fdf19/cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82", size = 4405497, upload-time = "2026-02-10T19:17:26.66Z" }, + { url = "https://files.pythonhosted.org/packages/1a/df/9d58bb32b1121a8a2f27383fabae4d63080c7ca60b9b5c88be742be04ee7/cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1", size = 4667819, upload-time = "2026-02-10T19:17:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ed/325d2a490c5e94038cdb0117da9397ece1f11201f425c4e9c57fe5b9f08b/cryptography-46.0.5-cp311-abi3-win32.whl", hash = "sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48", size = 3028230, upload-time = "2026-02-10T19:17:30.518Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5a/ac0f49e48063ab4255d9e3b79f5def51697fce1a95ea1370f03dc9db76f6/cryptography-46.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4", size = 3480909, upload-time = "2026-02-10T19:17:32.083Z" }, + { url = "https://files.pythonhosted.org/packages/00/13/3d278bfa7a15a96b9dc22db5a12ad1e48a9eb3d40e1827ef66a5df75d0d0/cryptography-46.0.5-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:94a76daa32eb78d61339aff7952ea819b1734b46f73646a07decb40e5b3448e2", size = 7119287, upload-time = "2026-02-10T19:17:33.801Z" }, + { url = "https://files.pythonhosted.org/packages/67/c8/581a6702e14f0898a0848105cbefd20c058099e2c2d22ef4e476dfec75d7/cryptography-46.0.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5be7bf2fb40769e05739dd0046e7b26f9d4670badc7b032d6ce4db64dddc0678", size = 4265728, upload-time = "2026-02-10T19:17:35.569Z" }, + { url = "https://files.pythonhosted.org/packages/dd/4a/ba1a65ce8fc65435e5a849558379896c957870dd64fecea97b1ad5f46a37/cryptography-46.0.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fe346b143ff9685e40192a4960938545c699054ba11d4f9029f94751e3f71d87", size = 4408287, upload-time = "2026-02-10T19:17:36.938Z" }, + { url = "https://files.pythonhosted.org/packages/f8/67/8ffdbf7b65ed1ac224d1c2df3943553766914a8ca718747ee3871da6107e/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:c69fd885df7d089548a42d5ec05be26050ebcd2283d89b3d30676eb32ff87dee", size = 4270291, upload-time = "2026-02-10T19:17:38.748Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/f52377ee93bc2f2bba55a41a886fd208c15276ffbd2569f2ddc89d50e2c5/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:8293f3dea7fc929ef7240796ba231413afa7b68ce38fd21da2995549f5961981", size = 4927539, upload-time = "2026-02-10T19:17:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/3b/02/cfe39181b02419bbbbcf3abdd16c1c5c8541f03ca8bda240debc467d5a12/cryptography-46.0.5-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:1abfdb89b41c3be0365328a410baa9df3ff8a9110fb75e7b52e66803ddabc9a9", size = 4442199, upload-time = "2026-02-10T19:17:41.789Z" }, + { url = "https://files.pythonhosted.org/packages/c0/96/2fcaeb4873e536cf71421a388a6c11b5bc846e986b2b069c79363dc1648e/cryptography-46.0.5-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:d66e421495fdb797610a08f43b05269e0a5ea7f5e652a89bfd5a7d3c1dee3648", size = 3960131, upload-time = "2026-02-10T19:17:43.379Z" }, + { url = "https://files.pythonhosted.org/packages/d8/d2/b27631f401ddd644e94c5cf33c9a4069f72011821cf3dc7309546b0642a0/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:4e817a8920bfbcff8940ecfd60f23d01836408242b30f1a708d93198393a80b4", size = 4270072, upload-time = "2026-02-10T19:17:45.481Z" }, + { url = "https://files.pythonhosted.org/packages/f4/a7/60d32b0370dae0b4ebe55ffa10e8599a2a59935b5ece1b9f06edb73abdeb/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:68f68d13f2e1cb95163fa3b4db4bf9a159a418f5f6e7242564fc75fcae667fd0", size = 4892170, upload-time = "2026-02-10T19:17:46.997Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b9/cf73ddf8ef1164330eb0b199a589103c363afa0cf794218c24d524a58eab/cryptography-46.0.5-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:a3d1fae9863299076f05cb8a778c467578262fae09f9dc0ee9b12eb4268ce663", size = 4441741, upload-time = "2026-02-10T19:17:48.661Z" }, + { url = "https://files.pythonhosted.org/packages/5f/eb/eee00b28c84c726fe8fa0158c65afe312d9c3b78d9d01daf700f1f6e37ff/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4143987a42a2397f2fc3b4d7e3a7d313fbe684f67ff443999e803dd75a76826", size = 4396728, upload-time = "2026-02-10T19:17:50.058Z" }, + { url = "https://files.pythonhosted.org/packages/65/f4/6bc1a9ed5aef7145045114b75b77c2a8261b4d38717bd8dea111a63c3442/cryptography-46.0.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7d731d4b107030987fd61a7f8ab512b25b53cef8f233a97379ede116f30eb67d", size = 4652001, upload-time = "2026-02-10T19:17:51.54Z" }, + { url = "https://files.pythonhosted.org/packages/86/ef/5d00ef966ddd71ac2e6951d278884a84a40ffbd88948ef0e294b214ae9e4/cryptography-46.0.5-cp314-cp314t-win32.whl", hash = "sha256:c3bcce8521d785d510b2aad26ae2c966092b7daa8f45dd8f44734a104dc0bc1a", size = 3003637, upload-time = "2026-02-10T19:17:52.997Z" }, + { url = "https://files.pythonhosted.org/packages/b7/57/f3f4160123da6d098db78350fdfd9705057aad21de7388eacb2401dceab9/cryptography-46.0.5-cp314-cp314t-win_amd64.whl", hash = "sha256:4d8ae8659ab18c65ced284993c2265910f6c9e650189d4e3f68445ef82a810e4", size = 3469487, upload-time = "2026-02-10T19:17:54.549Z" }, + { url = "https://files.pythonhosted.org/packages/e2/fa/a66aa722105ad6a458bebd64086ca2b72cdd361fed31763d20390f6f1389/cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31", size = 7170514, upload-time = "2026-02-10T19:17:56.267Z" }, + { url = "https://files.pythonhosted.org/packages/0f/04/c85bdeab78c8bc77b701bf0d9bdcf514c044e18a46dcff330df5448631b0/cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18", size = 4275349, upload-time = "2026-02-10T19:17:58.419Z" }, + { url = "https://files.pythonhosted.org/packages/5c/32/9b87132a2f91ee7f5223b091dc963055503e9b442c98fc0b8a5ca765fab0/cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235", size = 4420667, upload-time = "2026-02-10T19:18:00.619Z" }, + { url = "https://files.pythonhosted.org/packages/a1/a6/a7cb7010bec4b7c5692ca6f024150371b295ee1c108bdc1c400e4c44562b/cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a", size = 4276980, upload-time = "2026-02-10T19:18:02.379Z" }, + { url = "https://files.pythonhosted.org/packages/8e/7c/c4f45e0eeff9b91e3f12dbd0e165fcf2a38847288fcfd889deea99fb7b6d/cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76", size = 4939143, upload-time = "2026-02-10T19:18:03.964Z" }, + { url = "https://files.pythonhosted.org/packages/37/19/e1b8f964a834eddb44fa1b9a9976f4e414cbb7aa62809b6760c8803d22d1/cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614", size = 4453674, upload-time = "2026-02-10T19:18:05.588Z" }, + { url = "https://files.pythonhosted.org/packages/db/ed/db15d3956f65264ca204625597c410d420e26530c4e2943e05a0d2f24d51/cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229", size = 3978801, upload-time = "2026-02-10T19:18:07.167Z" }, + { url = "https://files.pythonhosted.org/packages/41/e2/df40a31d82df0a70a0daf69791f91dbb70e47644c58581d654879b382d11/cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1", size = 4276755, upload-time = "2026-02-10T19:18:09.813Z" }, + { url = "https://files.pythonhosted.org/packages/33/45/726809d1176959f4a896b86907b98ff4391a8aa29c0aaaf9450a8a10630e/cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d", size = 4901539, upload-time = "2026-02-10T19:18:11.263Z" }, + { url = "https://files.pythonhosted.org/packages/99/0f/a3076874e9c88ecb2ecc31382f6e7c21b428ede6f55aafa1aa272613e3cd/cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c", size = 4452794, upload-time = "2026-02-10T19:18:12.914Z" }, + { url = "https://files.pythonhosted.org/packages/02/ef/ffeb542d3683d24194a38f66ca17c0a4b8bf10631feef44a7ef64e631b1a/cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4", size = 4404160, upload-time = "2026-02-10T19:18:14.375Z" }, + { url = "https://files.pythonhosted.org/packages/96/93/682d2b43c1d5f1406ed048f377c0fc9fc8f7b0447a478d5c65ab3d3a66eb/cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9", size = 4667123, upload-time = "2026-02-10T19:18:15.886Z" }, + { url = "https://files.pythonhosted.org/packages/45/2d/9c5f2926cb5300a8eefc3f4f0b3f3df39db7f7ce40c8365444c49363cbda/cryptography-46.0.5-cp38-abi3-win32.whl", hash = "sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72", size = 3010220, upload-time = "2026-02-10T19:18:17.361Z" }, + { url = "https://files.pythonhosted.org/packages/48/ef/0c2f4a8e31018a986949d34a01115dd057bf536905dca38897bacd21fac3/cryptography-46.0.5-cp38-abi3-win_amd64.whl", hash = "sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595", size = 3467050, upload-time = "2026-02-10T19:18:18.899Z" }, + { url = "https://files.pythonhosted.org/packages/eb/dd/2d9fdb07cebdf3d51179730afb7d5e576153c6744c3ff8fded23030c204e/cryptography-46.0.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:3b4995dc971c9fb83c25aa44cf45f02ba86f71ee600d81091c2f0cbae116b06c", size = 3476964, upload-time = "2026-02-10T19:18:20.687Z" }, + { url = "https://files.pythonhosted.org/packages/e9/6f/6cc6cc9955caa6eaf83660b0da2b077c7fe8ff9950a3c5e45d605038d439/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bc84e875994c3b445871ea7181d424588171efec3e185dced958dad9e001950a", size = 4218321, upload-time = "2026-02-10T19:18:22.349Z" }, + { url = "https://files.pythonhosted.org/packages/3e/5d/c4da701939eeee699566a6c1367427ab91a8b7088cc2328c09dbee940415/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2ae6971afd6246710480e3f15824ed3029a60fc16991db250034efd0b9fb4356", size = 4381786, upload-time = "2026-02-10T19:18:24.529Z" }, + { url = "https://files.pythonhosted.org/packages/ac/97/a538654732974a94ff96c1db621fa464f455c02d4bb7d2652f4edc21d600/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d861ee9e76ace6cf36a6a89b959ec08e7bc2493ee39d07ffe5acb23ef46d27da", size = 4217990, upload-time = "2026-02-10T19:18:25.957Z" }, + { url = "https://files.pythonhosted.org/packages/ae/11/7e500d2dd3ba891197b9efd2da5454b74336d64a7cc419aa7327ab74e5f6/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:2b7a67c9cd56372f3249b39699f2ad479f6991e62ea15800973b956f4b73e257", size = 4381252, upload-time = "2026-02-10T19:18:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/bc/58/6b3d24e6b9bc474a2dcdee65dfd1f008867015408a271562e4b690561a4d/cryptography-46.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8456928655f856c6e1533ff59d5be76578a7157224dbd9ce6872f25055ab9ab7", size = 3407605, upload-time = "2026-02-10T19:18:29.233Z" }, ] [[package]] @@ -720,8 +758,8 @@ dev = [ { name = "authlib", specifier = ">=1.6.6" }, { name = "basedpyright", specifier = "==1.37.1" }, { name = "bumpver", specifier = ">=2025.1131" }, - { name = "cryptography", specifier = ">=44.0.1" }, - { name = "filelock", specifier = ">=3.20.1" }, + { name = "cryptography", specifier = ">=46.0.5" }, + { name = "filelock", specifier = ">=3.20.3" }, { name = "hirundo", extras = ["pandas", "polars", "transformers"] }, { name = "jaraco-context", specifier = ">=6.1.0" }, { name = "jinja2", specifier = ">=3.1.6" }, From 062512a755a57fdb6a3e4b511b5b8fdc17b22aa8 Mon Sep 17 00:00:00 2001 From: Ben Lewis Date: Wed, 11 Feb 2026 01:09:48 +0200 Subject: [PATCH 29/29] Fix NumPy being compiled for macOS (which is silly) --- pyproject.toml | 2 + uv.lock | 194 +++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 158 insertions(+), 38 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index dfa98679..0ad9ac5f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,6 +56,8 @@ transformers = ["transformers>=4.57.3", "peft>=0.18.1", "accelerate>=1.12.0"] [dependency-groups] dev = [ "hirundo[pandas,polars,transformers]", + "numpy>=2.1.3; sys_platform == 'darwin'", + # ⬆️ Ensure macOS runners resolve a NumPy version with prebuilt wheels in `pytest_sanity`. "types-setuptools>=69.5.0", "pytest>=8.2.0", "pytest-asyncio>=0.23.6", diff --git a/uv.lock b/uv.lock index 8c377dc2..a9b52a5c 100644 --- a/uv.lock +++ b/uv.lock @@ -14,7 +14,8 @@ version = "1.12.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub" }, - { name = "numpy" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "packaging" }, { name = "psutil" }, { name = "pyyaml" }, @@ -700,6 +701,8 @@ dev = [ { name = "jaraco-context" }, { name = "jinja2" }, { name = "marshmallow" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11' and sys_platform == 'darwin'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11' and sys_platform == 'darwin'" }, { name = "pip-audit" }, { name = "platformdirs" }, { name = "pre-commit" }, @@ -764,6 +767,7 @@ dev = [ { name = "jaraco-context", specifier = ">=6.1.0" }, { name = "jinja2", specifier = ">=3.1.6" }, { name = "marshmallow", specifier = ">=4.1.2" }, + { name = "numpy", marker = "sys_platform == 'darwin'", specifier = ">=2.1.3" }, { name = "pip-audit" }, { name = "platformdirs", specifier = ">=4.3.6" }, { name = "pre-commit", specifier = ">=3.7.1" }, @@ -1270,40 +1274,151 @@ wheels = [ [[package]] name = "numpy" -version = "2.0.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/75/10dd1f8116a8b796cb2c737b674e02d02e80454bda953fa7e65d8c12b016/numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78", size = 18902015, upload-time = "2024-08-26T20:19:40.945Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/21/91/3495b3237510f79f5d81f2508f9f13fea78ebfdf07538fc7444badda173d/numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece", size = 21165245, upload-time = "2024-08-26T20:04:14.625Z" }, - { url = "https://files.pythonhosted.org/packages/05/33/26178c7d437a87082d11019292dce6d3fe6f0e9026b7b2309cbf3e489b1d/numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04", size = 13738540, upload-time = "2024-08-26T20:04:36.784Z" }, - { url = "https://files.pythonhosted.org/packages/ec/31/cc46e13bf07644efc7a4bf68df2df5fb2a1a88d0cd0da9ddc84dc0033e51/numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66", size = 5300623, upload-time = "2024-08-26T20:04:46.491Z" }, - { url = "https://files.pythonhosted.org/packages/6e/16/7bfcebf27bb4f9d7ec67332ffebee4d1bf085c84246552d52dbb548600e7/numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b", size = 6901774, upload-time = "2024-08-26T20:04:58.173Z" }, - { url = "https://files.pythonhosted.org/packages/f9/a3/561c531c0e8bf082c5bef509d00d56f82e0ea7e1e3e3a7fc8fa78742a6e5/numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd", size = 13907081, upload-time = "2024-08-26T20:05:19.098Z" }, - { url = "https://files.pythonhosted.org/packages/fa/66/f7177ab331876200ac7563a580140643d1179c8b4b6a6b0fc9838de2a9b8/numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318", size = 19523451, upload-time = "2024-08-26T20:05:47.479Z" }, - { url = "https://files.pythonhosted.org/packages/25/7f/0b209498009ad6453e4efc2c65bcdf0ae08a182b2b7877d7ab38a92dc542/numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8", size = 19927572, upload-time = "2024-08-26T20:06:17.137Z" }, - { url = "https://files.pythonhosted.org/packages/3e/df/2619393b1e1b565cd2d4c4403bdd979621e2c4dea1f8532754b2598ed63b/numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326", size = 14400722, upload-time = "2024-08-26T20:06:39.16Z" }, - { url = "https://files.pythonhosted.org/packages/22/ad/77e921b9f256d5da36424ffb711ae79ca3f451ff8489eeca544d0701d74a/numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97", size = 6472170, upload-time = "2024-08-26T20:06:50.361Z" }, - { url = "https://files.pythonhosted.org/packages/10/05/3442317535028bc29cf0c0dd4c191a4481e8376e9f0db6bcf29703cadae6/numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131", size = 15905558, upload-time = "2024-08-26T20:07:13.881Z" }, - { url = "https://files.pythonhosted.org/packages/8b/cf/034500fb83041aa0286e0fb16e7c76e5c8b67c0711bb6e9e9737a717d5fe/numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448", size = 21169137, upload-time = "2024-08-26T20:07:45.345Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d9/32de45561811a4b87fbdee23b5797394e3d1504b4a7cf40c10199848893e/numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195", size = 13703552, upload-time = "2024-08-26T20:08:06.666Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ca/2f384720020c7b244d22508cb7ab23d95f179fcfff33c31a6eeba8d6c512/numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57", size = 5298957, upload-time = "2024-08-26T20:08:15.83Z" }, - { url = "https://files.pythonhosted.org/packages/0e/78/a3e4f9fb6aa4e6fdca0c5428e8ba039408514388cf62d89651aade838269/numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a", size = 6905573, upload-time = "2024-08-26T20:08:27.185Z" }, - { url = "https://files.pythonhosted.org/packages/a0/72/cfc3a1beb2caf4efc9d0b38a15fe34025230da27e1c08cc2eb9bfb1c7231/numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669", size = 13914330, upload-time = "2024-08-26T20:08:48.058Z" }, - { url = "https://files.pythonhosted.org/packages/ba/a8/c17acf65a931ce551fee11b72e8de63bf7e8a6f0e21add4c937c83563538/numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951", size = 19534895, upload-time = "2024-08-26T20:09:16.536Z" }, - { url = "https://files.pythonhosted.org/packages/ba/86/8767f3d54f6ae0165749f84648da9dcc8cd78ab65d415494962c86fac80f/numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9", size = 19937253, upload-time = "2024-08-26T20:09:46.263Z" }, - { url = "https://files.pythonhosted.org/packages/df/87/f76450e6e1c14e5bb1eae6836478b1028e096fd02e85c1c37674606ab752/numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15", size = 14414074, upload-time = "2024-08-26T20:10:08.483Z" }, - { url = "https://files.pythonhosted.org/packages/5c/ca/0f0f328e1e59f73754f06e1adfb909de43726d4f24c6a3f8805f34f2b0fa/numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4", size = 6470640, upload-time = "2024-08-26T20:10:19.732Z" }, - { url = "https://files.pythonhosted.org/packages/eb/57/3a3f14d3a759dcf9bf6e9eda905794726b758819df4663f217d658a58695/numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc", size = 15910230, upload-time = "2024-08-26T20:10:43.413Z" }, - { url = "https://files.pythonhosted.org/packages/45/40/2e117be60ec50d98fa08c2f8c48e09b3edea93cfcabd5a9ff6925d54b1c2/numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b", size = 20895803, upload-time = "2024-08-26T20:11:13.916Z" }, - { url = "https://files.pythonhosted.org/packages/46/92/1b8b8dee833f53cef3e0a3f69b2374467789e0bb7399689582314df02651/numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e", size = 13471835, upload-time = "2024-08-26T20:11:34.779Z" }, - { url = "https://files.pythonhosted.org/packages/7f/19/e2793bde475f1edaea6945be141aef6c8b4c669b90c90a300a8954d08f0a/numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c", size = 5038499, upload-time = "2024-08-26T20:11:43.902Z" }, - { url = "https://files.pythonhosted.org/packages/e3/ff/ddf6dac2ff0dd50a7327bcdba45cb0264d0e96bb44d33324853f781a8f3c/numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c", size = 6633497, upload-time = "2024-08-26T20:11:55.09Z" }, - { url = "https://files.pythonhosted.org/packages/72/21/67f36eac8e2d2cd652a2e69595a54128297cdcb1ff3931cfc87838874bd4/numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692", size = 13621158, upload-time = "2024-08-26T20:12:14.95Z" }, - { url = "https://files.pythonhosted.org/packages/39/68/e9f1126d757653496dbc096cb429014347a36b228f5a991dae2c6b6cfd40/numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a", size = 19236173, upload-time = "2024-08-26T20:12:44.049Z" }, - { url = "https://files.pythonhosted.org/packages/d1/e9/1f5333281e4ebf483ba1c888b1d61ba7e78d7e910fdd8e6499667041cc35/numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c", size = 19634174, upload-time = "2024-08-26T20:13:13.634Z" }, - { url = "https://files.pythonhosted.org/packages/71/af/a469674070c8d8408384e3012e064299f7a2de540738a8e414dcfd639996/numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded", size = 14099701, upload-time = "2024-08-26T20:13:34.851Z" }, - { url = "https://files.pythonhosted.org/packages/d0/3d/08ea9f239d0e0e939b6ca52ad403c84a2bce1bde301a8eb4888c1c1543f1/numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5", size = 6174313, upload-time = "2024-08-26T20:13:45.653Z" }, - { url = "https://files.pythonhosted.org/packages/b2/b5/4ac39baebf1fdb2e72585c8352c56d063b6126be9fc95bd2bb5ef5770c20/numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a", size = 15606179, upload-time = "2024-08-26T20:14:08.786Z" }, +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, + { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, + { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, + { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, + { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, + { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, + { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.13'", + "python_full_version == '3.12.*'", + "python_full_version == '3.11.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/57/fd/0005efbd0af48e55eb3c7208af93f2862d4b1a56cd78e84309a2d959208d/numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae", size = 20723651, upload-time = "2026-01-31T23:13:10.135Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/44/71852273146957899753e69986246d6a176061ea183407e95418c2aa4d9a/numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825", size = 16955478, upload-time = "2026-01-31T23:10:25.623Z" }, + { url = "https://files.pythonhosted.org/packages/74/41/5d17d4058bd0cd96bcbd4d9ff0fb2e21f52702aab9a72e4a594efa18692f/numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1", size = 14965467, upload-time = "2026-01-31T23:10:28.186Z" }, + { url = "https://files.pythonhosted.org/packages/49/48/fb1ce8136c19452ed15f033f8aee91d5defe515094e330ce368a0647846f/numpy-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6e9f61981ace1360e42737e2bae58b27bf28a1b27e781721047d84bd754d32e7", size = 5475172, upload-time = "2026-01-31T23:10:30.848Z" }, + { url = "https://files.pythonhosted.org/packages/40/a9/3feb49f17bbd1300dd2570432961f5c8a4ffeff1db6f02c7273bd020a4c9/numpy-2.4.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cb7bbb88aa74908950d979eeaa24dbdf1a865e3c7e45ff0121d8f70387b55f73", size = 6805145, upload-time = "2026-01-31T23:10:32.352Z" }, + { url = "https://files.pythonhosted.org/packages/3f/39/fdf35cbd6d6e2fcad42fcf85ac04a85a0d0fbfbf34b30721c98d602fd70a/numpy-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f069069931240b3fc703f1e23df63443dbd6390614c8c44a87d96cd0ec81eb1", size = 15966084, upload-time = "2026-01-31T23:10:34.502Z" }, + { url = "https://files.pythonhosted.org/packages/1b/46/6fa4ea94f1ddf969b2ee941290cca6f1bfac92b53c76ae5f44afe17ceb69/numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32", size = 16899477, upload-time = "2026-01-31T23:10:37.075Z" }, + { url = "https://files.pythonhosted.org/packages/09/a1/2a424e162b1a14a5bd860a464ab4e07513916a64ab1683fae262f735ccd2/numpy-2.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2653de5c24910e49c2b106499803124dde62a5a1fe0eedeaecf4309a5f639390", size = 17323429, upload-time = "2026-01-31T23:10:39.704Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a2/73014149ff250628df72c58204822ac01d768697913881aacf839ff78680/numpy-2.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ae241bbfc6ae276f94a170b14785e561cb5e7f626b6688cf076af4110887413", size = 18635109, upload-time = "2026-01-31T23:10:41.924Z" }, + { url = "https://files.pythonhosted.org/packages/6c/0c/73e8be2f1accd56df74abc1c5e18527822067dced5ec0861b5bb882c2ce0/numpy-2.4.2-cp311-cp311-win32.whl", hash = "sha256:df1b10187212b198dd45fa943d8985a3c8cf854aed4923796e0e019e113a1bda", size = 6237915, upload-time = "2026-01-31T23:10:45.26Z" }, + { url = "https://files.pythonhosted.org/packages/76/ae/e0265e0163cf127c24c3969d29f1c4c64551a1e375d95a13d32eab25d364/numpy-2.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695", size = 12607972, upload-time = "2026-01-31T23:10:47.021Z" }, + { url = "https://files.pythonhosted.org/packages/29/a5/c43029af9b8014d6ea157f192652c50042e8911f4300f8f6ed3336bf437f/numpy-2.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:47c5a6ed21d9452b10227e5e8a0e1c22979811cad7dcc19d8e3e2fb8fa03f1a3", size = 10485763, upload-time = "2026-01-31T23:10:50.087Z" }, + { url = "https://files.pythonhosted.org/packages/51/6e/6f394c9c77668153e14d4da83bcc247beb5952f6ead7699a1a2992613bea/numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a", size = 16667963, upload-time = "2026-01-31T23:10:52.147Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f8/55483431f2b2fd015ae6ed4fe62288823ce908437ed49db5a03d15151678/numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1", size = 14693571, upload-time = "2026-01-31T23:10:54.789Z" }, + { url = "https://files.pythonhosted.org/packages/2f/20/18026832b1845cdc82248208dd929ca14c9d8f2bac391f67440707fff27c/numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e", size = 5203469, upload-time = "2026-01-31T23:10:57.343Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/2eb97c8a77daaba34eaa3fa7241a14ac5f51c46a6bd5911361b644c4a1e2/numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27", size = 6550820, upload-time = "2026-01-31T23:10:59.429Z" }, + { url = "https://files.pythonhosted.org/packages/b1/91/b97fdfd12dc75b02c44e26c6638241cc004d4079a0321a69c62f51470c4c/numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548", size = 15663067, upload-time = "2026-01-31T23:11:01.291Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c6/a18e59f3f0b8071cc85cbc8d80cd02d68aa9710170b2553a117203d46936/numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f", size = 16619782, upload-time = "2026-01-31T23:11:03.669Z" }, + { url = "https://files.pythonhosted.org/packages/b7/83/9751502164601a79e18847309f5ceec0b1446d7b6aa12305759b72cf98b2/numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460", size = 17013128, upload-time = "2026-01-31T23:11:05.913Z" }, + { url = "https://files.pythonhosted.org/packages/61/c4/c4066322256ec740acc1c8923a10047818691d2f8aec254798f3dd90f5f2/numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba", size = 18345324, upload-time = "2026-01-31T23:11:08.248Z" }, + { url = "https://files.pythonhosted.org/packages/ab/af/6157aa6da728fa4525a755bfad486ae7e3f76d4c1864138003eb84328497/numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f", size = 5960282, upload-time = "2026-01-31T23:11:10.497Z" }, + { url = "https://files.pythonhosted.org/packages/92/0f/7ceaaeaacb40567071e94dbf2c9480c0ae453d5bb4f52bea3892c39dc83c/numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85", size = 12314210, upload-time = "2026-01-31T23:11:12.176Z" }, + { url = "https://files.pythonhosted.org/packages/2f/a3/56c5c604fae6dd40fa2ed3040d005fca97e91bd320d232ac9931d77ba13c/numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa", size = 10220171, upload-time = "2026-01-31T23:11:14.684Z" }, + { url = "https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c", size = 16663696, upload-time = "2026-01-31T23:11:17.516Z" }, + { url = "https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979", size = 14688322, upload-time = "2026-01-31T23:11:19.883Z" }, + { url = "https://files.pythonhosted.org/packages/da/b4/f805ab79293c728b9a99438775ce51885fd4f31b76178767cfc718701a39/numpy-2.4.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8e4549f8a3c6d13d55041925e912bfd834285ef1dd64d6bc7d542583355e2e98", size = 5198157, upload-time = "2026-01-31T23:11:22.375Z" }, + { url = "https://files.pythonhosted.org/packages/74/09/826e4289844eccdcd64aac27d13b0fd3f32039915dd5b9ba01baae1f436c/numpy-2.4.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:aea4f66ff44dfddf8c2cffd66ba6538c5ec67d389285292fe428cb2c738c8aef", size = 6546330, upload-time = "2026-01-31T23:11:23.958Z" }, + { url = "https://files.pythonhosted.org/packages/19/fb/cbfdbfa3057a10aea5422c558ac57538e6acc87ec1669e666d32ac198da7/numpy-2.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3cd545784805de05aafe1dde61752ea49a359ccba9760c1e5d1c88a93bbf2b7", size = 15660968, upload-time = "2026-01-31T23:11:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499", size = 16607311, upload-time = "2026-01-31T23:11:28.117Z" }, + { url = "https://files.pythonhosted.org/packages/14/d9/4b5adfc39a43fa6bf918c6d544bc60c05236cc2f6339847fc5b35e6cb5b0/numpy-2.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f74f0f7779cc7ae07d1810aab8ac6b1464c3eafb9e283a40da7309d5e6e48fbb", size = 17012850, upload-time = "2026-01-31T23:11:30.888Z" }, + { url = "https://files.pythonhosted.org/packages/b7/20/adb6e6adde6d0130046e6fdfb7675cc62bc2f6b7b02239a09eb58435753d/numpy-2.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7ac672d699bf36275c035e16b65539931347d68b70667d28984c9fb34e07fa7", size = 18334210, upload-time = "2026-01-31T23:11:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/78/0e/0a73b3dff26803a8c02baa76398015ea2a5434d9b8265a7898a6028c1591/numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110", size = 5958199, upload-time = "2026-01-31T23:11:35.385Z" }, + { url = "https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622", size = 12310848, upload-time = "2026-01-31T23:11:38.001Z" }, + { url = "https://files.pythonhosted.org/packages/6e/8d/6da186483e308da5da1cc6918ce913dcfe14ffde98e710bfeff2a6158d4e/numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71", size = 10221082, upload-time = "2026-01-31T23:11:40.392Z" }, + { url = "https://files.pythonhosted.org/packages/25/a1/9510aa43555b44781968935c7548a8926274f815de42ad3997e9e83680dd/numpy-2.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5633c0da313330fd20c484c78cdd3f9b175b55e1a766c4a174230c6b70ad8262", size = 14815866, upload-time = "2026-01-31T23:11:42.495Z" }, + { url = "https://files.pythonhosted.org/packages/36/30/6bbb5e76631a5ae46e7923dd16ca9d3f1c93cfa8d4ed79a129814a9d8db3/numpy-2.4.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d9f64d786b3b1dd742c946c42d15b07497ed14af1a1f3ce840cce27daa0ce913", size = 5325631, upload-time = "2026-01-31T23:11:44.7Z" }, + { url = "https://files.pythonhosted.org/packages/46/00/3a490938800c1923b567b3a15cd17896e68052e2145d8662aaf3e1ffc58f/numpy-2.4.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:b21041e8cb6a1eb5312dd1d2f80a94d91efffb7a06b70597d44f1bd2dfc315ab", size = 6646254, upload-time = "2026-01-31T23:11:46.341Z" }, + { url = "https://files.pythonhosted.org/packages/d3/e9/fac0890149898a9b609caa5af7455a948b544746e4b8fe7c212c8edd71f8/numpy-2.4.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ab83c56211a1d7c07c25e3217ea6695e50a3e2f255053686b081dc0b091a82", size = 15720138, upload-time = "2026-01-31T23:11:48.082Z" }, + { url = "https://files.pythonhosted.org/packages/ea/5c/08887c54e68e1e28df53709f1893ce92932cc6f01f7c3d4dc952f61ffd4e/numpy-2.4.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fb882da679409066b4603579619341c6d6898fc83a8995199d5249f986e8e8f", size = 16655398, upload-time = "2026-01-31T23:11:50.293Z" }, + { url = "https://files.pythonhosted.org/packages/4d/89/253db0fa0e66e9129c745e4ef25631dc37d5f1314dad2b53e907b8538e6d/numpy-2.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66cb9422236317f9d44b67b4d18f44efe6e9c7f8794ac0462978513359461554", size = 17079064, upload-time = "2026-01-31T23:11:52.927Z" }, + { url = "https://files.pythonhosted.org/packages/2a/d5/cbade46ce97c59c6c3da525e8d95b7abe8a42974a1dc5c1d489c10433e88/numpy-2.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0f01dcf33e73d80bd8dc0f20a71303abbafa26a19e23f6b68d1aa9990af90257", size = 18379680, upload-time = "2026-01-31T23:11:55.22Z" }, + { url = "https://files.pythonhosted.org/packages/40/62/48f99ae172a4b63d981babe683685030e8a3df4f246c893ea5c6ef99f018/numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657", size = 6082433, upload-time = "2026-01-31T23:11:58.096Z" }, + { url = "https://files.pythonhosted.org/packages/07/38/e054a61cfe48ad9f1ed0d188e78b7e26859d0b60ef21cd9de4897cdb5326/numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b", size = 12451181, upload-time = "2026-01-31T23:11:59.782Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a4/a05c3a6418575e185dd84d0b9680b6bb2e2dc3e4202f036b7b4e22d6e9dc/numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1", size = 10290756, upload-time = "2026-01-31T23:12:02.438Z" }, + { url = "https://files.pythonhosted.org/packages/18/88/b7df6050bf18fdcfb7046286c6535cabbdd2064a3440fca3f069d319c16e/numpy-2.4.2-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:444be170853f1f9d528428eceb55f12918e4fda5d8805480f36a002f1415e09b", size = 16663092, upload-time = "2026-01-31T23:12:04.521Z" }, + { url = "https://files.pythonhosted.org/packages/25/7a/1fee4329abc705a469a4afe6e69b1ef7e915117747886327104a8493a955/numpy-2.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d1240d50adff70c2a88217698ca844723068533f3f5c5fa6ee2e3220e3bdb000", size = 14698770, upload-time = "2026-01-31T23:12:06.96Z" }, + { url = "https://files.pythonhosted.org/packages/fb/0b/f9e49ba6c923678ad5bc38181c08ac5e53b7a5754dbca8e581aa1a56b1ff/numpy-2.4.2-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:7cdde6de52fb6664b00b056341265441192d1291c130e99183ec0d4b110ff8b1", size = 5208562, upload-time = "2026-01-31T23:12:09.632Z" }, + { url = "https://files.pythonhosted.org/packages/7d/12/d7de8f6f53f9bb76997e5e4c069eda2051e3fe134e9181671c4391677bb2/numpy-2.4.2-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:cda077c2e5b780200b6b3e09d0b42205a3d1c68f30c6dceb90401c13bff8fe74", size = 6543710, upload-time = "2026-01-31T23:12:11.969Z" }, + { url = "https://files.pythonhosted.org/packages/09/63/c66418c2e0268a31a4cf8a8b512685748200f8e8e8ec6c507ce14e773529/numpy-2.4.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d30291931c915b2ab5717c2974bb95ee891a1cf22ebc16a8006bd59cd210d40a", size = 15677205, upload-time = "2026-01-31T23:12:14.33Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6c/7f237821c9642fb2a04d2f1e88b4295677144ca93285fd76eff3bcba858d/numpy-2.4.2-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bba37bc29d4d85761deed3954a1bc62be7cf462b9510b51d367b769a8c8df325", size = 16611738, upload-time = "2026-01-31T23:12:16.525Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a7/39c4cdda9f019b609b5c473899d87abff092fc908cfe4d1ecb2fcff453b0/numpy-2.4.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b2f0073ed0868db1dcd86e052d37279eef185b9c8db5bf61f30f46adac63c909", size = 17028888, upload-time = "2026-01-31T23:12:19.306Z" }, + { url = "https://files.pythonhosted.org/packages/da/b3/e84bb64bdfea967cc10950d71090ec2d84b49bc691df0025dddb7c26e8e3/numpy-2.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7f54844851cdb630ceb623dcec4db3240d1ac13d4990532446761baede94996a", size = 18339556, upload-time = "2026-01-31T23:12:21.816Z" }, + { url = "https://files.pythonhosted.org/packages/88/f5/954a291bc1192a27081706862ac62bb5920fbecfbaa302f64682aa90beed/numpy-2.4.2-cp314-cp314-win32.whl", hash = "sha256:12e26134a0331d8dbd9351620f037ec470b7c75929cb8a1537f6bfe411152a1a", size = 6006899, upload-time = "2026-01-31T23:12:24.14Z" }, + { url = "https://files.pythonhosted.org/packages/05/cb/eff72a91b2efdd1bc98b3b8759f6a1654aa87612fc86e3d87d6fe4f948c4/numpy-2.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:068cdb2d0d644cdb45670810894f6a0600797a69c05f1ac478e8d31670b8ee75", size = 12443072, upload-time = "2026-01-31T23:12:26.33Z" }, + { url = "https://files.pythonhosted.org/packages/37/75/62726948db36a56428fce4ba80a115716dc4fad6a3a4352487f8bb950966/numpy-2.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:6ed0be1ee58eef41231a5c943d7d1375f093142702d5723ca2eb07db9b934b05", size = 10494886, upload-time = "2026-01-31T23:12:28.488Z" }, + { url = "https://files.pythonhosted.org/packages/36/2f/ee93744f1e0661dc267e4b21940870cabfae187c092e1433b77b09b50ac4/numpy-2.4.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:98f16a80e917003a12c0580f97b5f875853ebc33e2eaa4bccfc8201ac6869308", size = 14818567, upload-time = "2026-01-31T23:12:30.709Z" }, + { url = "https://files.pythonhosted.org/packages/a7/24/6535212add7d76ff938d8bdc654f53f88d35cddedf807a599e180dcb8e66/numpy-2.4.2-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:20abd069b9cda45874498b245c8015b18ace6de8546bf50dfa8cea1696ed06ef", size = 5328372, upload-time = "2026-01-31T23:12:32.962Z" }, + { url = "https://files.pythonhosted.org/packages/5e/9d/c48f0a035725f925634bf6b8994253b43f2047f6778a54147d7e213bc5a7/numpy-2.4.2-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e98c97502435b53741540a5717a6749ac2ada901056c7db951d33e11c885cc7d", size = 6649306, upload-time = "2026-01-31T23:12:34.797Z" }, + { url = "https://files.pythonhosted.org/packages/81/05/7c73a9574cd4a53a25907bad38b59ac83919c0ddc8234ec157f344d57d9a/numpy-2.4.2-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:da6cad4e82cb893db4b69105c604d805e0c3ce11501a55b5e9f9083b47d2ffe8", size = 15722394, upload-time = "2026-01-31T23:12:36.565Z" }, + { url = "https://files.pythonhosted.org/packages/35/fa/4de10089f21fc7d18442c4a767ab156b25c2a6eaf187c0db6d9ecdaeb43f/numpy-2.4.2-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e4424677ce4b47fe73c8b5556d876571f7c6945d264201180db2dc34f676ab5", size = 16653343, upload-time = "2026-01-31T23:12:39.188Z" }, + { url = "https://files.pythonhosted.org/packages/b8/f9/d33e4ffc857f3763a57aa85650f2e82486832d7492280ac21ba9efda80da/numpy-2.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2b8f157c8a6f20eb657e240f8985cc135598b2b46985c5bccbde7616dc9c6b1e", size = 17078045, upload-time = "2026-01-31T23:12:42.041Z" }, + { url = "https://files.pythonhosted.org/packages/c8/b8/54bdb43b6225badbea6389fa038c4ef868c44f5890f95dd530a218706da3/numpy-2.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5daf6f3914a733336dab21a05cdec343144600e964d2fcdabaac0c0269874b2a", size = 18380024, upload-time = "2026-01-31T23:12:44.331Z" }, + { url = "https://files.pythonhosted.org/packages/a5/55/6e1a61ded7af8df04016d81b5b02daa59f2ea9252ee0397cb9f631efe9e5/numpy-2.4.2-cp314-cp314t-win32.whl", hash = "sha256:8c50dd1fc8826f5b26a5ee4d77ca55d88a895f4e4819c7ecc2a9f5905047a443", size = 6153937, upload-time = "2026-01-31T23:12:47.229Z" }, + { url = "https://files.pythonhosted.org/packages/45/aa/fa6118d1ed6d776b0983f3ceac9b1a5558e80df9365b1c3aa6d42bf9eee4/numpy-2.4.2-cp314-cp314t-win_amd64.whl", hash = "sha256:fcf92bee92742edd401ba41135185866f7026c502617f422eb432cfeca4fe236", size = 12631844, upload-time = "2026-01-31T23:12:48.997Z" }, + { url = "https://files.pythonhosted.org/packages/32/0a/2ec5deea6dcd158f254a7b372fb09cfba5719419c8d66343bab35237b3fb/numpy-2.4.2-cp314-cp314t-win_arm64.whl", hash = "sha256:1f92f53998a17265194018d1cc321b2e96e900ca52d54c7c77837b71b9465181", size = 10565379, upload-time = "2026-01-31T23:12:51.345Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f8/50e14d36d915ef64d8f8bc4a087fc8264d82c785eda6711f80ab7e620335/numpy-2.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:89f7268c009bc492f506abd6f5265defa7cb3f7487dc21d357c3d290add45082", size = 16833179, upload-time = "2026-01-31T23:12:53.5Z" }, + { url = "https://files.pythonhosted.org/packages/17/17/809b5cad63812058a8189e91a1e2d55a5a18fd04611dbad244e8aeae465c/numpy-2.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6dee3bb76aa4009d5a912180bf5b2de012532998d094acee25d9cb8dee3e44a", size = 14889755, upload-time = "2026-01-31T23:12:55.933Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ea/181b9bcf7627fc8371720316c24db888dcb9829b1c0270abf3d288b2e29b/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:cd2bd2bbed13e213d6b55dc1d035a4f91748a7d3edc9480c13898b0353708920", size = 5399500, upload-time = "2026-01-31T23:12:58.671Z" }, + { url = "https://files.pythonhosted.org/packages/33/9f/413adf3fc955541ff5536b78fcf0754680b3c6d95103230252a2c9408d23/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:cf28c0c1d4c4bf00f509fa7eb02c58d7caf221b50b467bcb0d9bbf1584d5c821", size = 6714252, upload-time = "2026-01-31T23:13:00.518Z" }, + { url = "https://files.pythonhosted.org/packages/91/da/643aad274e29ccbdf42ecd94dafe524b81c87bcb56b83872d54827f10543/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e04ae107ac591763a47398bb45b568fc38f02dbc4aa44c063f67a131f99346cb", size = 15797142, upload-time = "2026-01-31T23:13:02.219Z" }, + { url = "https://files.pythonhosted.org/packages/66/27/965b8525e9cb5dc16481b30a1b3c21e50c7ebf6e9dbd48d0c4d0d5089c7e/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:602f65afdef699cda27ec0b9224ae5dc43e328f4c24c689deaf77133dbee74d0", size = 16727979, upload-time = "2026-01-31T23:13:04.62Z" }, + { url = "https://files.pythonhosted.org/packages/de/e5/b7d20451657664b07986c2f6e3be564433f5dcaf3482d68eaecd79afaf03/numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0", size = 12502577, upload-time = "2026-01-31T23:13:07.08Z" }, ] [[package]] @@ -1463,7 +1578,8 @@ name = "pandas" version = "2.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "numpy" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "python-dateutil" }, { name = "pytz" }, { name = "tzdata" }, @@ -1513,7 +1629,8 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "accelerate" }, { name = "huggingface-hub" }, - { name = "numpy" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "packaging" }, { name = "psutil" }, { name = "pyyaml" }, @@ -2599,7 +2716,8 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, { name = "huggingface-hub" }, - { name = "numpy" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "packaging" }, { name = "pyyaml" }, { name = "regex" },