From 52fa54bcaae4660509e5edb25e7bcc988385bf0b Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Sat, 20 Dec 2025 20:44:49 -0500 Subject: [PATCH 01/12] add inquirer-textual to deps --- pyproject.toml | 1 + uv.lock | 1076 +++++++++++++++++++++++++++--------------------- 2 files changed, 615 insertions(+), 462 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 10337a89d..5b4d4718d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,6 +43,7 @@ dependencies = [ "codeflash-benchmark", "filelock", "pytest-asyncio>=1.2.0", + "inquirer-textual>=0.2.0", ] [project.urls] diff --git a/uv.lock b/uv.lock index 714b33380..f4d5665d1 100644 --- a/uv.lock +++ b/uv.lock @@ -75,17 +75,19 @@ wheels = [ name = "black" version = "25.11.0" source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9.2' and python_full_version < '3.10'", + "python_full_version < '3.9.2'", +] dependencies = [ { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "click", version = "8.3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "mypy-extensions" }, - { name = "packaging" }, - { name = "pathspec" }, + { name = "mypy-extensions", marker = "python_full_version < '3.10'" }, + { name = "packaging", marker = "python_full_version < '3.10'" }, + { name = "pathspec", marker = "python_full_version < '3.10'" }, { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "platformdirs", version = "4.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "pytokens" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "pytokens", marker = "python_full_version < '3.10'" }, + { name = "tomli", marker = "python_full_version < '3.10'" }, + { name = "typing-extensions", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8c/ad/33adf4708633d047950ff2dfdea2e215d84ac50ef95aff14a614e4b6e9b2/black-25.11.0.tar.gz", hash = "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08", size = 655669, upload-time = "2025-11-10T01:53:50.558Z" } wheels = [ @@ -116,6 +118,57 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/00/5d/aed32636ed30a6e7f9efd6ad14e2a0b0d687ae7c8c7ec4e4a557174b895c/black-25.11.0-py3-none-any.whl", hash = "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b", size = 204918, upload-time = "2025-11-10T01:53:48.917Z" }, ] +[[package]] +name = "black" +version = "25.12.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version == '3.13.*'", + "python_full_version == '3.12.*'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "click", version = "8.3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "mypy-extensions", marker = "python_full_version >= '3.10'" }, + { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "pathspec", marker = "python_full_version >= '3.10'" }, + { name = "platformdirs", version = "4.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pytokens", marker = "python_full_version >= '3.10'" }, + { name = "tomli", marker = "python_full_version == '3.10.*'" }, + { name = "typing-extensions", marker = "python_full_version == '3.10.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/d9/07b458a3f1c525ac392b5edc6b191ff140b596f9d77092429417a54e249d/black-25.12.0.tar.gz", hash = "sha256:8d3dd9cea14bff7ddc0eb243c811cdb1a011ebb4800a5f0335a01a68654796a7", size = 659264, upload-time = "2025-12-08T01:40:52.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/d5/8d3145999d380e5d09bb00b0f7024bf0a8ccb5c07b5648e9295f02ec1d98/black-25.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f85ba1ad15d446756b4ab5f3044731bf68b777f8f9ac9cdabd2425b97cd9c4e8", size = 1895720, upload-time = "2025-12-08T01:46:58.197Z" }, + { url = "https://files.pythonhosted.org/packages/06/97/7acc85c4add41098f4f076b21e3e4e383ad6ed0a3da26b2c89627241fc11/black-25.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:546eecfe9a3a6b46f9d69d8a642585a6eaf348bcbbc4d87a19635570e02d9f4a", size = 1727193, upload-time = "2025-12-08T01:52:26.674Z" }, + { url = "https://files.pythonhosted.org/packages/24/f0/fdf0eb8ba907ddeb62255227d29d349e8256ef03558fbcadfbc26ecfe3b2/black-25.12.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:17dcc893da8d73d8f74a596f64b7c98ef5239c2cd2b053c0f25912c4494bf9ea", size = 1774506, upload-time = "2025-12-08T01:46:25.721Z" }, + { url = "https://files.pythonhosted.org/packages/e4/f5/9203a78efe00d13336786b133c6180a9303d46908a9aa72d1104ca214222/black-25.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:09524b0e6af8ba7a3ffabdfc7a9922fb9adef60fed008c7cd2fc01f3048e6e6f", size = 1416085, upload-time = "2025-12-08T01:46:06.073Z" }, + { url = "https://files.pythonhosted.org/packages/ba/cc/7a6090e6b081c3316282c05c546e76affdce7bf7a3b7d2c3a2a69438bd01/black-25.12.0-cp310-cp310-win_arm64.whl", hash = "sha256:b162653ed89eb942758efeb29d5e333ca5bb90e5130216f8369857db5955a7da", size = 1226038, upload-time = "2025-12-08T01:45:29.388Z" }, + { url = "https://files.pythonhosted.org/packages/60/ad/7ac0d0e1e0612788dbc48e62aef8a8e8feffac7eb3d787db4e43b8462fa8/black-25.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d0cfa263e85caea2cff57d8f917f9f51adae8e20b610e2b23de35b5b11ce691a", size = 1877003, upload-time = "2025-12-08T01:43:29.967Z" }, + { url = "https://files.pythonhosted.org/packages/e8/dd/a237e9f565f3617a88b49284b59cbca2a4f56ebe68676c1aad0ce36a54a7/black-25.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a2f578ae20c19c50a382286ba78bfbeafdf788579b053d8e4980afb079ab9be", size = 1712639, upload-time = "2025-12-08T01:52:46.756Z" }, + { url = "https://files.pythonhosted.org/packages/12/80/e187079df1ea4c12a0c63282ddd8b81d5107db6d642f7d7b75a6bcd6fc21/black-25.12.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e1b65634b0e471d07ff86ec338819e2ef860689859ef4501ab7ac290431f9b", size = 1758143, upload-time = "2025-12-08T01:45:29.137Z" }, + { url = "https://files.pythonhosted.org/packages/93/b5/3096ccee4f29dc2c3aac57274326c4d2d929a77e629f695f544e159bfae4/black-25.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a3fa71e3b8dd9f7c6ac4d818345237dfb4175ed3bf37cd5a581dbc4c034f1ec5", size = 1420698, upload-time = "2025-12-08T01:45:53.379Z" }, + { url = "https://files.pythonhosted.org/packages/7e/39/f81c0ffbc25ffbe61c7d0385bf277e62ffc3e52f5ee668d7369d9854fadf/black-25.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:51e267458f7e650afed8445dc7edb3187143003d52a1b710c7321aef22aa9655", size = 1229317, upload-time = "2025-12-08T01:46:35.606Z" }, + { url = "https://files.pythonhosted.org/packages/d1/bd/26083f805115db17fda9877b3c7321d08c647df39d0df4c4ca8f8450593e/black-25.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:31f96b7c98c1ddaeb07dc0f56c652e25bdedaac76d5b68a059d998b57c55594a", size = 1924178, upload-time = "2025-12-08T01:49:51.048Z" }, + { url = "https://files.pythonhosted.org/packages/89/6b/ea00d6651561e2bdd9231c4177f4f2ae19cc13a0b0574f47602a7519b6ca/black-25.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05dd459a19e218078a1f98178c13f861fe6a9a5f88fc969ca4d9b49eb1809783", size = 1742643, upload-time = "2025-12-08T01:49:59.09Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f3/360fa4182e36e9875fabcf3a9717db9d27a8d11870f21cff97725c54f35b/black-25.12.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1f68c5eff61f226934be6b5b80296cf6939e5d2f0c2f7d543ea08b204bfaf59", size = 1800158, upload-time = "2025-12-08T01:44:27.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/08/2c64830cb6616278067e040acca21d4f79727b23077633953081c9445d61/black-25.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:274f940c147ddab4442d316b27f9e332ca586d39c85ecf59ebdea82cc9ee8892", size = 1426197, upload-time = "2025-12-08T01:45:51.198Z" }, + { url = "https://files.pythonhosted.org/packages/d4/60/a93f55fd9b9816b7432cf6842f0e3000fdd5b7869492a04b9011a133ee37/black-25.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:169506ba91ef21e2e0591563deda7f00030cb466e747c4b09cb0a9dae5db2f43", size = 1237266, upload-time = "2025-12-08T01:45:10.556Z" }, + { url = "https://files.pythonhosted.org/packages/c8/52/c551e36bc95495d2aa1a37d50566267aa47608c81a53f91daa809e03293f/black-25.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a05ddeb656534c3e27a05a29196c962877c83fa5503db89e68857d1161ad08a5", size = 1923809, upload-time = "2025-12-08T01:46:55.126Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f7/aac9b014140ee56d247e707af8db0aae2e9efc28d4a8aba92d0abd7ae9d1/black-25.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9ec77439ef3e34896995503865a85732c94396edcc739f302c5673a2315e1e7f", size = 1742384, upload-time = "2025-12-08T01:49:37.022Z" }, + { url = "https://files.pythonhosted.org/packages/74/98/38aaa018b2ab06a863974c12b14a6266badc192b20603a81b738c47e902e/black-25.12.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e509c858adf63aa61d908061b52e580c40eae0dfa72415fa47ac01b12e29baf", size = 1798761, upload-time = "2025-12-08T01:46:05.386Z" }, + { url = "https://files.pythonhosted.org/packages/16/3a/a8ac542125f61574a3f015b521ca83b47321ed19bb63fe6d7560f348bfe1/black-25.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:252678f07f5bac4ff0d0e9b261fbb029fa530cfa206d0a636a34ab445ef8ca9d", size = 1429180, upload-time = "2025-12-08T01:45:34.903Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2d/bdc466a3db9145e946762d52cd55b1385509d9f9004fec1c97bdc8debbfb/black-25.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:bc5b1c09fe3c931ddd20ee548511c64ebf964ada7e6f0763d443947fd1c603ce", size = 1239350, upload-time = "2025-12-08T01:46:09.458Z" }, + { url = "https://files.pythonhosted.org/packages/35/46/1d8f2542210c502e2ae1060b2e09e47af6a5e5963cb78e22ec1a11170b28/black-25.12.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:0a0953b134f9335c2434864a643c842c44fba562155c738a2a37a4d61f00cad5", size = 1917015, upload-time = "2025-12-08T01:53:27.987Z" }, + { url = "https://files.pythonhosted.org/packages/41/37/68accadf977672beb8e2c64e080f568c74159c1aaa6414b4cd2aef2d7906/black-25.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2355bbb6c3b76062870942d8cc450d4f8ac71f9c93c40122762c8784df49543f", size = 1741830, upload-time = "2025-12-08T01:54:36.861Z" }, + { url = "https://files.pythonhosted.org/packages/ac/76/03608a9d8f0faad47a3af3a3c8c53af3367f6c0dd2d23a84710456c7ac56/black-25.12.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9678bd991cc793e81d19aeeae57966ee02909877cb65838ccffef24c3ebac08f", size = 1791450, upload-time = "2025-12-08T01:44:52.581Z" }, + { url = "https://files.pythonhosted.org/packages/06/99/b2a4bd7dfaea7964974f947e1c76d6886d65fe5d24f687df2d85406b2609/black-25.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:97596189949a8aad13ad12fcbb4ae89330039b96ad6742e6f6b45e75ad5cfd83", size = 1452042, upload-time = "2025-12-08T01:46:13.188Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7c/d9825de75ae5dd7795d007681b752275ea85a1c5d83269b4b9c754c2aaab/black-25.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:778285d9ea197f34704e3791ea9404cd6d07595745907dd2ce3da7a13627b29b", size = 1267446, upload-time = "2025-12-08T01:46:14.497Z" }, + { url = "https://files.pythonhosted.org/packages/68/11/21331aed19145a952ad28fca2756a1433ee9308079bd03bd898e903a2e53/black-25.12.0-py3-none-any.whl", hash = "sha256:48ceb36c16dbc84062740049eef990bb2ce07598272e673c17d1a7720c71c828", size = 206191, upload-time = "2025-12-08T01:40:50.963Z" }, +] + [[package]] name = "blessed" version = "1.25.0" @@ -329,16 +382,17 @@ dependencies = [ { name = "click", version = "8.3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "codeflash-benchmark" }, { name = "coverage", version = "7.10.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "coverage", version = "7.12.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "coverage", version = "7.13.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "crosshair-tool" }, { name = "dill" }, { name = "filelock", version = "3.19.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "filelock", version = "3.20.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "filelock", version = "3.20.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "gitpython" }, { name = "humanize", version = "4.13.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "humanize", version = "4.14.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "humanize", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "inquirer", version = "3.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9.2'" }, { name = "inquirer", version = "3.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9.2'" }, + { name = "inquirer-textual" }, { name = "isort", version = "6.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "isort", version = "7.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "jedi" }, @@ -350,7 +404,7 @@ dependencies = [ { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "platformdirs", version = "4.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "posthog", version = "6.9.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "posthog", version = "7.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "posthog", version = "7.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "pydantic" }, { name = "pygls" }, { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, @@ -374,7 +428,7 @@ dev = [ { name = "pandas-stubs", version = "2.2.2.240807", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "pandas-stubs", version = "2.2.2.240909", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "pre-commit", version = "4.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "pre-commit", version = "4.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pre-commit", version = "4.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "ruff" }, { name = "types-cffi" }, { name = "types-colorama" }, @@ -393,14 +447,15 @@ dev = [ { name = "uv" }, ] tests = [ - { name = "black" }, + { name = "black", version = "25.11.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "black", version = "25.12.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "eval-type-backport" }, { name = "jax", version = "0.4.30", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "jax", version = "0.6.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "jax", version = "0.8.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "jax", version = "0.8.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "pandas" }, { name = "pyrsistent" }, { name = "scipy", version = "1.13.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, @@ -424,6 +479,7 @@ requires-dist = [ { name = "gitpython", specifier = ">=3.1.31" }, { name = "humanize", specifier = ">=4.0.0" }, { name = "inquirer", specifier = ">=3.0.0" }, + { name = "inquirer-textual", specifier = ">=0.2.0" }, { name = "isort", specifier = ">=5.11.0" }, { name = "jedi", specifier = ">=0.19.1" }, { name = "junitparser", specifier = ">=3.1.0" }, @@ -618,7 +674,7 @@ wheels = [ [[package]] name = "coverage" -version = "7.12.0" +version = "7.13.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14'", @@ -627,104 +683,104 @@ resolution-markers = [ "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] -sdist = { url = "https://files.pythonhosted.org/packages/89/26/4a96807b193b011588099c3b5c89fbb05294e5b90e71018e065465f34eb6/coverage-7.12.0.tar.gz", hash = "sha256:fc11e0a4e372cb5f282f16ef90d4a585034050ccda536451901abfb19a57f40c", size = 819341, upload-time = "2025-11-18T13:34:20.766Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/4a/0dc3de1c172d35abe512332cfdcc43211b6ebce629e4cc42e6cd25ed8f4d/coverage-7.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:32b75c2ba3f324ee37af3ccee5b30458038c50b349ad9b88cee85096132a575b", size = 217409, upload-time = "2025-11-18T13:31:53.122Z" }, - { url = "https://files.pythonhosted.org/packages/01/c3/086198b98db0109ad4f84241e8e9ea7e5fb2db8c8ffb787162d40c26cc76/coverage-7.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cb2a1b6ab9fe833714a483a915de350abc624a37149649297624c8d57add089c", size = 217927, upload-time = "2025-11-18T13:31:54.458Z" }, - { url = "https://files.pythonhosted.org/packages/5d/5f/34614dbf5ce0420828fc6c6f915126a0fcb01e25d16cf141bf5361e6aea6/coverage-7.12.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5734b5d913c3755e72f70bf6cc37a0518d4f4745cde760c5d8e12005e62f9832", size = 244678, upload-time = "2025-11-18T13:31:55.805Z" }, - { url = "https://files.pythonhosted.org/packages/55/7b/6b26fb32e8e4a6989ac1d40c4e132b14556131493b1d06bc0f2be169c357/coverage-7.12.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b527a08cdf15753279b7afb2339a12073620b761d79b81cbe2cdebdb43d90daa", size = 246507, upload-time = "2025-11-18T13:31:57.05Z" }, - { url = "https://files.pythonhosted.org/packages/06/42/7d70e6603d3260199b90fb48b537ca29ac183d524a65cc31366b2e905fad/coverage-7.12.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9bb44c889fb68004e94cab71f6a021ec83eac9aeabdbb5a5a88821ec46e1da73", size = 248366, upload-time = "2025-11-18T13:31:58.362Z" }, - { url = "https://files.pythonhosted.org/packages/2d/4a/d86b837923878424c72458c5b25e899a3c5ca73e663082a915f5b3c4d749/coverage-7.12.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4b59b501455535e2e5dde5881739897967b272ba25988c89145c12d772810ccb", size = 245366, upload-time = "2025-11-18T13:31:59.572Z" }, - { url = "https://files.pythonhosted.org/packages/e6/c2/2adec557e0aa9721875f06ced19730fdb7fc58e31b02b5aa56f2ebe4944d/coverage-7.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d8842f17095b9868a05837b7b1b73495293091bed870e099521ada176aa3e00e", size = 246408, upload-time = "2025-11-18T13:32:00.784Z" }, - { url = "https://files.pythonhosted.org/packages/5a/4b/8bd1f1148260df11c618e535fdccd1e5aaf646e55b50759006a4f41d8a26/coverage-7.12.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c5a6f20bf48b8866095c6820641e7ffbe23f2ac84a2efc218d91235e404c7777", size = 244416, upload-time = "2025-11-18T13:32:01.963Z" }, - { url = "https://files.pythonhosted.org/packages/0e/13/3a248dd6a83df90414c54a4e121fd081fb20602ca43955fbe1d60e2312a9/coverage-7.12.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:5f3738279524e988d9da2893f307c2093815c623f8d05a8f79e3eff3a7a9e553", size = 244681, upload-time = "2025-11-18T13:32:03.408Z" }, - { url = "https://files.pythonhosted.org/packages/76/30/aa833827465a5e8c938935f5d91ba055f70516941078a703740aaf1aa41f/coverage-7.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0d68c1f7eabbc8abe582d11fa393ea483caf4f44b0af86881174769f185c94d", size = 245300, upload-time = "2025-11-18T13:32:04.686Z" }, - { url = "https://files.pythonhosted.org/packages/38/24/f85b3843af1370fb3739fa7571819b71243daa311289b31214fe3e8c9d68/coverage-7.12.0-cp310-cp310-win32.whl", hash = "sha256:7670d860e18b1e3ee5930b17a7d55ae6287ec6e55d9799982aa103a2cc1fa2ef", size = 220008, upload-time = "2025-11-18T13:32:05.806Z" }, - { url = "https://files.pythonhosted.org/packages/3a/a2/c7da5b9566f7164db9eefa133d17761ecb2c2fde9385d754e5b5c80f710d/coverage-7.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:f999813dddeb2a56aab5841e687b68169da0d3f6fc78ccf50952fa2463746022", size = 220943, upload-time = "2025-11-18T13:32:07.166Z" }, - { url = "https://files.pythonhosted.org/packages/5a/0c/0dfe7f0487477d96432e4815537263363fb6dd7289743a796e8e51eabdf2/coverage-7.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa124a3683d2af98bd9d9c2bfa7a5076ca7e5ab09fdb96b81fa7d89376ae928f", size = 217535, upload-time = "2025-11-18T13:32:08.812Z" }, - { url = "https://files.pythonhosted.org/packages/9b/f5/f9a4a053a5bbff023d3bec259faac8f11a1e5a6479c2ccf586f910d8dac7/coverage-7.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d93fbf446c31c0140208dcd07c5d882029832e8ed7891a39d6d44bd65f2316c3", size = 218044, upload-time = "2025-11-18T13:32:10.329Z" }, - { url = "https://files.pythonhosted.org/packages/95/c5/84fc3697c1fa10cd8571919bf9693f693b7373278daaf3b73e328d502bc8/coverage-7.12.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:52ca620260bd8cd6027317bdd8b8ba929be1d741764ee765b42c4d79a408601e", size = 248440, upload-time = "2025-11-18T13:32:12.536Z" }, - { url = "https://files.pythonhosted.org/packages/f4/36/2d93fbf6a04670f3874aed397d5a5371948a076e3249244a9e84fb0e02d6/coverage-7.12.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f3433ffd541380f3a0e423cff0f4926d55b0cc8c1d160fdc3be24a4c03aa65f7", size = 250361, upload-time = "2025-11-18T13:32:13.852Z" }, - { url = "https://files.pythonhosted.org/packages/5d/49/66dc65cc456a6bfc41ea3d0758c4afeaa4068a2b2931bf83be6894cf1058/coverage-7.12.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7bbb321d4adc9f65e402c677cd1c8e4c2d0105d3ce285b51b4d87f1d5db5245", size = 252472, upload-time = "2025-11-18T13:32:15.068Z" }, - { url = "https://files.pythonhosted.org/packages/35/1f/ebb8a18dffd406db9fcd4b3ae42254aedcaf612470e8712f12041325930f/coverage-7.12.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22a7aade354a72dff3b59c577bfd18d6945c61f97393bc5fb7bd293a4237024b", size = 248592, upload-time = "2025-11-18T13:32:16.328Z" }, - { url = "https://files.pythonhosted.org/packages/da/a8/67f213c06e5ea3b3d4980df7dc344d7fea88240b5fe878a5dcbdfe0e2315/coverage-7.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3ff651dcd36d2fea66877cd4a82de478004c59b849945446acb5baf9379a1b64", size = 250167, upload-time = "2025-11-18T13:32:17.687Z" }, - { url = "https://files.pythonhosted.org/packages/f0/00/e52aef68154164ea40cc8389c120c314c747fe63a04b013a5782e989b77f/coverage-7.12.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:31b8b2e38391a56e3cea39d22a23faaa7c3fc911751756ef6d2621d2a9daf742", size = 248238, upload-time = "2025-11-18T13:32:19.2Z" }, - { url = "https://files.pythonhosted.org/packages/1f/a4/4d88750bcf9d6d66f77865e5a05a20e14db44074c25fd22519777cb69025/coverage-7.12.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:297bc2da28440f5ae51c845a47c8175a4db0553a53827886e4fb25c66633000c", size = 247964, upload-time = "2025-11-18T13:32:21.027Z" }, - { url = "https://files.pythonhosted.org/packages/a7/6b/b74693158899d5b47b0bf6238d2c6722e20ba749f86b74454fac0696bb00/coverage-7.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6ff7651cc01a246908eac162a6a86fc0dbab6de1ad165dfb9a1e2ec660b44984", size = 248862, upload-time = "2025-11-18T13:32:22.304Z" }, - { url = "https://files.pythonhosted.org/packages/18/de/6af6730227ce0e8ade307b1cc4a08e7f51b419a78d02083a86c04ccceb29/coverage-7.12.0-cp311-cp311-win32.whl", hash = "sha256:313672140638b6ddb2c6455ddeda41c6a0b208298034544cfca138978c6baed6", size = 220033, upload-time = "2025-11-18T13:32:23.714Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a1/e7f63021a7c4fe20994359fcdeae43cbef4a4d0ca36a5a1639feeea5d9e1/coverage-7.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a1783ed5bd0d5938d4435014626568dc7f93e3cb99bc59188cc18857c47aa3c4", size = 220966, upload-time = "2025-11-18T13:32:25.599Z" }, - { url = "https://files.pythonhosted.org/packages/77/e8/deae26453f37c20c3aa0c4433a1e32cdc169bf415cce223a693117aa3ddd/coverage-7.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:4648158fd8dd9381b5847622df1c90ff314efbfc1df4550092ab6013c238a5fc", size = 219637, upload-time = "2025-11-18T13:32:27.265Z" }, - { url = "https://files.pythonhosted.org/packages/02/bf/638c0427c0f0d47638242e2438127f3c8ee3cfc06c7fdeb16778ed47f836/coverage-7.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:29644c928772c78512b48e14156b81255000dcfd4817574ff69def189bcb3647", size = 217704, upload-time = "2025-11-18T13:32:28.906Z" }, - { url = "https://files.pythonhosted.org/packages/08/e1/706fae6692a66c2d6b871a608bbde0da6281903fa0e9f53a39ed441da36a/coverage-7.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8638cbb002eaa5d7c8d04da667813ce1067080b9a91099801a0053086e52b736", size = 218064, upload-time = "2025-11-18T13:32:30.161Z" }, - { url = "https://files.pythonhosted.org/packages/a9/8b/eb0231d0540f8af3ffda39720ff43cb91926489d01524e68f60e961366e4/coverage-7.12.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:083631eeff5eb9992c923e14b810a179798bb598e6a0dd60586819fc23be6e60", size = 249560, upload-time = "2025-11-18T13:32:31.835Z" }, - { url = "https://files.pythonhosted.org/packages/e9/a1/67fb52af642e974d159b5b379e4d4c59d0ebe1288677fbd04bbffe665a82/coverage-7.12.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:99d5415c73ca12d558e07776bd957c4222c687b9f1d26fa0e1b57e3598bdcde8", size = 252318, upload-time = "2025-11-18T13:32:33.178Z" }, - { url = "https://files.pythonhosted.org/packages/41/e5/38228f31b2c7665ebf9bdfdddd7a184d56450755c7e43ac721c11a4b8dab/coverage-7.12.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e949ebf60c717c3df63adb4a1a366c096c8d7fd8472608cd09359e1bd48ef59f", size = 253403, upload-time = "2025-11-18T13:32:34.45Z" }, - { url = "https://files.pythonhosted.org/packages/ec/4b/df78e4c8188f9960684267c5a4897836f3f0f20a20c51606ee778a1d9749/coverage-7.12.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d907ddccbca819afa2cd014bc69983b146cca2735a0b1e6259b2a6c10be1e70", size = 249984, upload-time = "2025-11-18T13:32:35.747Z" }, - { url = "https://files.pythonhosted.org/packages/ba/51/bb163933d195a345c6f63eab9e55743413d064c291b6220df754075c2769/coverage-7.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b1518ecbad4e6173f4c6e6c4a46e49555ea5679bf3feda5edb1b935c7c44e8a0", size = 251339, upload-time = "2025-11-18T13:32:37.352Z" }, - { url = "https://files.pythonhosted.org/packages/15/40/c9b29cdb8412c837cdcbc2cfa054547dd83affe6cbbd4ce4fdb92b6ba7d1/coverage-7.12.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:51777647a749abdf6f6fd8c7cffab12de68ab93aab15efc72fbbb83036c2a068", size = 249489, upload-time = "2025-11-18T13:32:39.212Z" }, - { url = "https://files.pythonhosted.org/packages/c8/da/b3131e20ba07a0de4437a50ef3b47840dfabf9293675b0cd5c2c7f66dd61/coverage-7.12.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:42435d46d6461a3b305cdfcad7cdd3248787771f53fe18305548cba474e6523b", size = 249070, upload-time = "2025-11-18T13:32:40.598Z" }, - { url = "https://files.pythonhosted.org/packages/70/81/b653329b5f6302c08d683ceff6785bc60a34be9ae92a5c7b63ee7ee7acec/coverage-7.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5bcead88c8423e1855e64b8057d0544e33e4080b95b240c2a355334bb7ced937", size = 250929, upload-time = "2025-11-18T13:32:42.915Z" }, - { url = "https://files.pythonhosted.org/packages/a3/00/250ac3bca9f252a5fb1338b5ad01331ebb7b40223f72bef5b1b2cb03aa64/coverage-7.12.0-cp312-cp312-win32.whl", hash = "sha256:dcbb630ab034e86d2a0f79aefd2be07e583202f41e037602d438c80044957baa", size = 220241, upload-time = "2025-11-18T13:32:44.665Z" }, - { url = "https://files.pythonhosted.org/packages/64/1c/77e79e76d37ce83302f6c21980b45e09f8aa4551965213a10e62d71ce0ab/coverage-7.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:2fd8354ed5d69775ac42986a691fbf68b4084278710cee9d7c3eaa0c28fa982a", size = 221051, upload-time = "2025-11-18T13:32:46.008Z" }, - { url = "https://files.pythonhosted.org/packages/31/f5/641b8a25baae564f9e52cac0e2667b123de961985709a004e287ee7663cc/coverage-7.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:737c3814903be30695b2de20d22bcc5428fdae305c61ba44cdc8b3252984c49c", size = 219692, upload-time = "2025-11-18T13:32:47.372Z" }, - { url = "https://files.pythonhosted.org/packages/b8/14/771700b4048774e48d2c54ed0c674273702713c9ee7acdfede40c2666747/coverage-7.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:47324fffca8d8eae7e185b5bb20c14645f23350f870c1649003618ea91a78941", size = 217725, upload-time = "2025-11-18T13:32:49.22Z" }, - { url = "https://files.pythonhosted.org/packages/17/a7/3aa4144d3bcb719bf67b22d2d51c2d577bf801498c13cb08f64173e80497/coverage-7.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ccf3b2ede91decd2fb53ec73c1f949c3e034129d1e0b07798ff1d02ea0c8fa4a", size = 218098, upload-time = "2025-11-18T13:32:50.78Z" }, - { url = "https://files.pythonhosted.org/packages/fc/9c/b846bbc774ff81091a12a10203e70562c91ae71badda00c5ae5b613527b1/coverage-7.12.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b365adc70a6936c6b0582dc38746b33b2454148c02349345412c6e743efb646d", size = 249093, upload-time = "2025-11-18T13:32:52.554Z" }, - { url = "https://files.pythonhosted.org/packages/76/b6/67d7c0e1f400b32c883e9342de4a8c2ae7c1a0b57c5de87622b7262e2309/coverage-7.12.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bc13baf85cd8a4cfcf4a35c7bc9d795837ad809775f782f697bf630b7e200211", size = 251686, upload-time = "2025-11-18T13:32:54.862Z" }, - { url = "https://files.pythonhosted.org/packages/cc/75/b095bd4b39d49c3be4bffbb3135fea18a99a431c52dd7513637c0762fecb/coverage-7.12.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:099d11698385d572ceafb3288a5b80fe1fc58bf665b3f9d362389de488361d3d", size = 252930, upload-time = "2025-11-18T13:32:56.417Z" }, - { url = "https://files.pythonhosted.org/packages/6e/f3/466f63015c7c80550bead3093aacabf5380c1220a2a93c35d374cae8f762/coverage-7.12.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:473dc45d69694069adb7680c405fb1e81f60b2aff42c81e2f2c3feaf544d878c", size = 249296, upload-time = "2025-11-18T13:32:58.074Z" }, - { url = "https://files.pythonhosted.org/packages/27/86/eba2209bf2b7e28c68698fc13437519a295b2d228ba9e0ec91673e09fa92/coverage-7.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:583f9adbefd278e9de33c33d6846aa8f5d164fa49b47144180a0e037f0688bb9", size = 251068, upload-time = "2025-11-18T13:32:59.646Z" }, - { url = "https://files.pythonhosted.org/packages/ec/55/ca8ae7dbba962a3351f18940b359b94c6bafdd7757945fdc79ec9e452dc7/coverage-7.12.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2089cc445f2dc0af6f801f0d1355c025b76c24481935303cf1af28f636688f0", size = 249034, upload-time = "2025-11-18T13:33:01.481Z" }, - { url = "https://files.pythonhosted.org/packages/7a/d7/39136149325cad92d420b023b5fd900dabdd1c3a0d1d5f148ef4a8cedef5/coverage-7.12.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:950411f1eb5d579999c5f66c62a40961f126fc71e5e14419f004471957b51508", size = 248853, upload-time = "2025-11-18T13:33:02.935Z" }, - { url = "https://files.pythonhosted.org/packages/fe/b6/76e1add8b87ef60e00643b0b7f8f7bb73d4bf5249a3be19ebefc5793dd25/coverage-7.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b1aab7302a87bafebfe76b12af681b56ff446dc6f32ed178ff9c092ca776e6bc", size = 250619, upload-time = "2025-11-18T13:33:04.336Z" }, - { url = "https://files.pythonhosted.org/packages/95/87/924c6dc64f9203f7a3c1832a6a0eee5a8335dbe5f1bdadcc278d6f1b4d74/coverage-7.12.0-cp313-cp313-win32.whl", hash = "sha256:d7e0d0303c13b54db495eb636bc2465b2fb8475d4c8bcec8fe4b5ca454dfbae8", size = 220261, upload-time = "2025-11-18T13:33:06.493Z" }, - { url = "https://files.pythonhosted.org/packages/91/77/dd4aff9af16ff776bf355a24d87eeb48fc6acde54c907cc1ea89b14a8804/coverage-7.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:ce61969812d6a98a981d147d9ac583a36ac7db7766f2e64a9d4d059c2fe29d07", size = 221072, upload-time = "2025-11-18T13:33:07.926Z" }, - { url = "https://files.pythonhosted.org/packages/70/49/5c9dc46205fef31b1b226a6e16513193715290584317fd4df91cdaf28b22/coverage-7.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:bcec6f47e4cb8a4c2dc91ce507f6eefc6a1b10f58df32cdc61dff65455031dfc", size = 219702, upload-time = "2025-11-18T13:33:09.631Z" }, - { url = "https://files.pythonhosted.org/packages/9b/62/f87922641c7198667994dd472a91e1d9b829c95d6c29529ceb52132436ad/coverage-7.12.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:459443346509476170d553035e4a3eed7b860f4fe5242f02de1010501956ce87", size = 218420, upload-time = "2025-11-18T13:33:11.153Z" }, - { url = "https://files.pythonhosted.org/packages/85/dd/1cc13b2395ef15dbb27d7370a2509b4aee77890a464fb35d72d428f84871/coverage-7.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:04a79245ab2b7a61688958f7a855275997134bc84f4a03bc240cf64ff132abf6", size = 218773, upload-time = "2025-11-18T13:33:12.569Z" }, - { url = "https://files.pythonhosted.org/packages/74/40/35773cc4bb1e9d4658d4fb669eb4195b3151bef3bbd6f866aba5cd5dac82/coverage-7.12.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:09a86acaaa8455f13d6a99221d9654df249b33937b4e212b4e5a822065f12aa7", size = 260078, upload-time = "2025-11-18T13:33:14.037Z" }, - { url = "https://files.pythonhosted.org/packages/ec/ee/231bb1a6ffc2905e396557585ebc6bdc559e7c66708376d245a1f1d330fc/coverage-7.12.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:907e0df1b71ba77463687a74149c6122c3f6aac56c2510a5d906b2f368208560", size = 262144, upload-time = "2025-11-18T13:33:15.601Z" }, - { url = "https://files.pythonhosted.org/packages/28/be/32f4aa9f3bf0b56f3971001b56508352c7753915345d45fab4296a986f01/coverage-7.12.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9b57e2d0ddd5f0582bae5437c04ee71c46cd908e7bc5d4d0391f9a41e812dd12", size = 264574, upload-time = "2025-11-18T13:33:17.354Z" }, - { url = "https://files.pythonhosted.org/packages/68/7c/00489fcbc2245d13ab12189b977e0cf06ff3351cb98bc6beba8bd68c5902/coverage-7.12.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:58c1c6aa677f3a1411fe6fb28ec3a942e4f665df036a3608816e0847fad23296", size = 259298, upload-time = "2025-11-18T13:33:18.958Z" }, - { url = "https://files.pythonhosted.org/packages/96/b4/f0760d65d56c3bea95b449e02570d4abd2549dc784bf39a2d4721a2d8ceb/coverage-7.12.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4c589361263ab2953e3c4cd2a94db94c4ad4a8e572776ecfbad2389c626e4507", size = 262150, upload-time = "2025-11-18T13:33:20.644Z" }, - { url = "https://files.pythonhosted.org/packages/c5/71/9a9314df00f9326d78c1e5a910f520d599205907432d90d1c1b7a97aa4b1/coverage-7.12.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:91b810a163ccad2e43b1faa11d70d3cf4b6f3d83f9fd5f2df82a32d47b648e0d", size = 259763, upload-time = "2025-11-18T13:33:22.189Z" }, - { url = "https://files.pythonhosted.org/packages/10/34/01a0aceed13fbdf925876b9a15d50862eb8845454301fe3cdd1df08b2182/coverage-7.12.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:40c867af715f22592e0d0fb533a33a71ec9e0f73a6945f722a0c85c8c1cbe3a2", size = 258653, upload-time = "2025-11-18T13:33:24.239Z" }, - { url = "https://files.pythonhosted.org/packages/8d/04/81d8fd64928acf1574bbb0181f66901c6c1c6279c8ccf5f84259d2c68ae9/coverage-7.12.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:68b0d0a2d84f333de875666259dadf28cc67858bc8fd8b3f1eae84d3c2bec455", size = 260856, upload-time = "2025-11-18T13:33:26.365Z" }, - { url = "https://files.pythonhosted.org/packages/f2/76/fa2a37bfaeaf1f766a2d2360a25a5297d4fb567098112f6517475eee120b/coverage-7.12.0-cp313-cp313t-win32.whl", hash = "sha256:73f9e7fbd51a221818fd11b7090eaa835a353ddd59c236c57b2199486b116c6d", size = 220936, upload-time = "2025-11-18T13:33:28.165Z" }, - { url = "https://files.pythonhosted.org/packages/f9/52/60f64d932d555102611c366afb0eb434b34266b1d9266fc2fe18ab641c47/coverage-7.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:24cff9d1f5743f67db7ba46ff284018a6e9aeb649b67aa1e70c396aa1b7cb23c", size = 222001, upload-time = "2025-11-18T13:33:29.656Z" }, - { url = "https://files.pythonhosted.org/packages/77/df/c303164154a5a3aea7472bf323b7c857fed93b26618ed9fc5c2955566bb0/coverage-7.12.0-cp313-cp313t-win_arm64.whl", hash = "sha256:c87395744f5c77c866d0f5a43d97cc39e17c7f1cb0115e54a2fe67ca75c5d14d", size = 220273, upload-time = "2025-11-18T13:33:31.415Z" }, - { url = "https://files.pythonhosted.org/packages/bf/2e/fc12db0883478d6e12bbd62d481210f0c8daf036102aa11434a0c5755825/coverage-7.12.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a1c59b7dc169809a88b21a936eccf71c3895a78f5592051b1af8f4d59c2b4f92", size = 217777, upload-time = "2025-11-18T13:33:32.86Z" }, - { url = "https://files.pythonhosted.org/packages/1f/c1/ce3e525d223350c6ec16b9be8a057623f54226ef7f4c2fee361ebb6a02b8/coverage-7.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8787b0f982e020adb732b9f051f3e49dd5054cebbc3f3432061278512a2b1360", size = 218100, upload-time = "2025-11-18T13:33:34.532Z" }, - { url = "https://files.pythonhosted.org/packages/15/87/113757441504aee3808cb422990ed7c8bcc2d53a6779c66c5adef0942939/coverage-7.12.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5ea5a9f7dc8877455b13dd1effd3202e0bca72f6f3ab09f9036b1bcf728f69ac", size = 249151, upload-time = "2025-11-18T13:33:36.135Z" }, - { url = "https://files.pythonhosted.org/packages/d9/1d/9529d9bd44049b6b05bb319c03a3a7e4b0a8a802d28fa348ad407e10706d/coverage-7.12.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fdba9f15849534594f60b47c9a30bc70409b54947319a7c4fd0e8e3d8d2f355d", size = 251667, upload-time = "2025-11-18T13:33:37.996Z" }, - { url = "https://files.pythonhosted.org/packages/11/bb/567e751c41e9c03dc29d3ce74b8c89a1e3396313e34f255a2a2e8b9ebb56/coverage-7.12.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a00594770eb715854fb1c57e0dea08cce6720cfbc531accdb9850d7c7770396c", size = 253003, upload-time = "2025-11-18T13:33:39.553Z" }, - { url = "https://files.pythonhosted.org/packages/e4/b3/c2cce2d8526a02fb9e9ca14a263ca6fc074449b33a6afa4892838c903528/coverage-7.12.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5560c7e0d82b42eb1951e4f68f071f8017c824ebfd5a6ebe42c60ac16c6c2434", size = 249185, upload-time = "2025-11-18T13:33:42.086Z" }, - { url = "https://files.pythonhosted.org/packages/0e/a7/967f93bb66e82c9113c66a8d0b65ecf72fc865adfba5a145f50c7af7e58d/coverage-7.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d6c2e26b481c9159c2773a37947a9718cfdc58893029cdfb177531793e375cfc", size = 251025, upload-time = "2025-11-18T13:33:43.634Z" }, - { url = "https://files.pythonhosted.org/packages/b9/b2/f2f6f56337bc1af465d5b2dc1ee7ee2141b8b9272f3bf6213fcbc309a836/coverage-7.12.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:6e1a8c066dabcde56d5d9fed6a66bc19a2883a3fe051f0c397a41fc42aedd4cc", size = 248979, upload-time = "2025-11-18T13:33:46.04Z" }, - { url = "https://files.pythonhosted.org/packages/f4/7a/bf4209f45a4aec09d10a01a57313a46c0e0e8f4c55ff2965467d41a92036/coverage-7.12.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:f7ba9da4726e446d8dd8aae5a6cd872511184a5d861de80a86ef970b5dacce3e", size = 248800, upload-time = "2025-11-18T13:33:47.546Z" }, - { url = "https://files.pythonhosted.org/packages/b8/b7/1e01b8696fb0521810f60c5bbebf699100d6754183e6cc0679bf2ed76531/coverage-7.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e0f483ab4f749039894abaf80c2f9e7ed77bbf3c737517fb88c8e8e305896a17", size = 250460, upload-time = "2025-11-18T13:33:49.537Z" }, - { url = "https://files.pythonhosted.org/packages/71/ae/84324fb9cb46c024760e706353d9b771a81b398d117d8c1fe010391c186f/coverage-7.12.0-cp314-cp314-win32.whl", hash = "sha256:76336c19a9ef4a94b2f8dc79f8ac2da3f193f625bb5d6f51a328cd19bfc19933", size = 220533, upload-time = "2025-11-18T13:33:51.16Z" }, - { url = "https://files.pythonhosted.org/packages/e2/71/1033629deb8460a8f97f83e6ac4ca3b93952e2b6f826056684df8275e015/coverage-7.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:7c1059b600aec6ef090721f8f633f60ed70afaffe8ecab85b59df748f24b31fe", size = 221348, upload-time = "2025-11-18T13:33:52.776Z" }, - { url = "https://files.pythonhosted.org/packages/0a/5f/ac8107a902f623b0c251abdb749be282dc2ab61854a8a4fcf49e276fce2f/coverage-7.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:172cf3a34bfef42611963e2b661302a8931f44df31629e5b1050567d6b90287d", size = 219922, upload-time = "2025-11-18T13:33:54.316Z" }, - { url = "https://files.pythonhosted.org/packages/79/6e/f27af2d4da367f16077d21ef6fe796c874408219fa6dd3f3efe7751bd910/coverage-7.12.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:aa7d48520a32cb21c7a9b31f81799e8eaec7239db36c3b670be0fa2403828d1d", size = 218511, upload-time = "2025-11-18T13:33:56.343Z" }, - { url = "https://files.pythonhosted.org/packages/67/dd/65fd874aa460c30da78f9d259400d8e6a4ef457d61ab052fd248f0050558/coverage-7.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:90d58ac63bc85e0fb919f14d09d6caa63f35a5512a2205284b7816cafd21bb03", size = 218771, upload-time = "2025-11-18T13:33:57.966Z" }, - { url = "https://files.pythonhosted.org/packages/55/e0/7c6b71d327d8068cb79c05f8f45bf1b6145f7a0de23bbebe63578fe5240a/coverage-7.12.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ca8ecfa283764fdda3eae1bdb6afe58bf78c2c3ec2b2edcb05a671f0bba7b3f9", size = 260151, upload-time = "2025-11-18T13:33:59.597Z" }, - { url = "https://files.pythonhosted.org/packages/49/ce/4697457d58285b7200de6b46d606ea71066c6e674571a946a6ea908fb588/coverage-7.12.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:874fe69a0785d96bd066059cd4368022cebbec1a8958f224f0016979183916e6", size = 262257, upload-time = "2025-11-18T13:34:01.166Z" }, - { url = "https://files.pythonhosted.org/packages/2f/33/acbc6e447aee4ceba88c15528dbe04a35fb4d67b59d393d2e0d6f1e242c1/coverage-7.12.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5b3c889c0b8b283a24d721a9eabc8ccafcfc3aebf167e4cd0d0e23bf8ec4e339", size = 264671, upload-time = "2025-11-18T13:34:02.795Z" }, - { url = "https://files.pythonhosted.org/packages/87/ec/e2822a795c1ed44d569980097be839c5e734d4c0c1119ef8e0a073496a30/coverage-7.12.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8bb5b894b3ec09dcd6d3743229dc7f2c42ef7787dc40596ae04c0edda487371e", size = 259231, upload-time = "2025-11-18T13:34:04.397Z" }, - { url = "https://files.pythonhosted.org/packages/72/c5/a7ec5395bb4a49c9b7ad97e63f0c92f6bf4a9e006b1393555a02dae75f16/coverage-7.12.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:79a44421cd5fba96aa57b5e3b5a4d3274c449d4c622e8f76882d76635501fd13", size = 262137, upload-time = "2025-11-18T13:34:06.068Z" }, - { url = "https://files.pythonhosted.org/packages/67/0c/02c08858b764129f4ecb8e316684272972e60777ae986f3865b10940bdd6/coverage-7.12.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:33baadc0efd5c7294f436a632566ccc1f72c867f82833eb59820ee37dc811c6f", size = 259745, upload-time = "2025-11-18T13:34:08.04Z" }, - { url = "https://files.pythonhosted.org/packages/5a/04/4fd32b7084505f3829a8fe45c1a74a7a728cb251aaadbe3bec04abcef06d/coverage-7.12.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c406a71f544800ef7e9e0000af706b88465f3573ae8b8de37e5f96c59f689ad1", size = 258570, upload-time = "2025-11-18T13:34:09.676Z" }, - { url = "https://files.pythonhosted.org/packages/48/35/2365e37c90df4f5342c4fa202223744119fe31264ee2924f09f074ea9b6d/coverage-7.12.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e71bba6a40883b00c6d571599b4627f50c360b3d0d02bfc658168936be74027b", size = 260899, upload-time = "2025-11-18T13:34:11.259Z" }, - { url = "https://files.pythonhosted.org/packages/05/56/26ab0464ca733fa325e8e71455c58c1c374ce30f7c04cebb88eabb037b18/coverage-7.12.0-cp314-cp314t-win32.whl", hash = "sha256:9157a5e233c40ce6613dead4c131a006adfda70e557b6856b97aceed01b0e27a", size = 221313, upload-time = "2025-11-18T13:34:12.863Z" }, - { url = "https://files.pythonhosted.org/packages/da/1c/017a3e1113ed34d998b27d2c6dba08a9e7cb97d362f0ec988fcd873dcf81/coverage-7.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:e84da3a0fd233aeec797b981c51af1cabac74f9bd67be42458365b30d11b5291", size = 222423, upload-time = "2025-11-18T13:34:15.14Z" }, - { url = "https://files.pythonhosted.org/packages/4c/36/bcc504fdd5169301b52568802bb1b9cdde2e27a01d39fbb3b4b508ab7c2c/coverage-7.12.0-cp314-cp314t-win_arm64.whl", hash = "sha256:01d24af36fedda51c2b1aca56e4330a3710f83b02a5ff3743a6b015ffa7c9384", size = 220459, upload-time = "2025-11-18T13:34:17.222Z" }, - { url = "https://files.pythonhosted.org/packages/ce/a3/43b749004e3c09452e39bb56347a008f0a0668aad37324a99b5c8ca91d9e/coverage-7.12.0-py3-none-any.whl", hash = "sha256:159d50c0b12e060b15ed3d39f87ed43d4f7f7ad40b8a534f4dd331adbb51104a", size = 209503, upload-time = "2025-11-18T13:34:18.892Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/b6/45/2c665ca77ec32ad67e25c77daf1cee28ee4558f3bc571cdbaf88a00b9f23/coverage-7.13.0.tar.gz", hash = "sha256:a394aa27f2d7ff9bc04cf703817773a59ad6dfbd577032e690f961d2460ee936", size = 820905, upload-time = "2025-12-08T13:14:38.055Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/08/bdd7ccca14096f7eb01412b87ac11e5d16e4cb54b6e328afc9dee8bdaec1/coverage-7.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:02d9fb9eccd48f6843c98a37bd6817462f130b86da8660461e8f5e54d4c06070", size = 217979, upload-time = "2025-12-08T13:12:14.505Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f0/d1302e3416298a28b5663ae1117546a745d9d19fde7e28402b2c5c3e2109/coverage-7.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:367449cf07d33dc216c083f2036bb7d976c6e4903ab31be400ad74ad9f85ce98", size = 218496, upload-time = "2025-12-08T13:12:16.237Z" }, + { url = "https://files.pythonhosted.org/packages/07/26/d36c354c8b2a320819afcea6bffe72839efd004b98d1d166b90801d49d57/coverage-7.13.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cdb3c9f8fef0a954c632f64328a3935988d33a6604ce4bf67ec3e39670f12ae5", size = 245237, upload-time = "2025-12-08T13:12:17.858Z" }, + { url = "https://files.pythonhosted.org/packages/91/52/be5e85631e0eec547873d8b08dd67a5f6b111ecfe89a86e40b89b0c1c61c/coverage-7.13.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d10fd186aac2316f9bbb46ef91977f9d394ded67050ad6d84d94ed6ea2e8e54e", size = 247061, upload-time = "2025-12-08T13:12:19.132Z" }, + { url = "https://files.pythonhosted.org/packages/0f/45/a5e8fa0caf05fbd8fa0402470377bff09cc1f026d21c05c71e01295e55ab/coverage-7.13.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f88ae3e69df2ab62fb0bc5219a597cb890ba5c438190ffa87490b315190bb33", size = 248928, upload-time = "2025-12-08T13:12:20.702Z" }, + { url = "https://files.pythonhosted.org/packages/f5/42/ffb5069b6fd1b95fae482e02f3fecf380d437dd5a39bae09f16d2e2e7e01/coverage-7.13.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4be718e51e86f553bcf515305a158a1cd180d23b72f07ae76d6017c3cc5d791", size = 245931, upload-time = "2025-12-08T13:12:22.243Z" }, + { url = "https://files.pythonhosted.org/packages/95/6e/73e809b882c2858f13e55c0c36e94e09ce07e6165d5644588f9517efe333/coverage-7.13.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a00d3a393207ae12f7c49bb1c113190883b500f48979abb118d8b72b8c95c032", size = 246968, upload-time = "2025-12-08T13:12:23.52Z" }, + { url = "https://files.pythonhosted.org/packages/87/08/64ebd9e64b6adb8b4a4662133d706fbaccecab972e0b3ccc23f64e2678ad/coverage-7.13.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a7b1cd820e1b6116f92c6128f1188e7afe421c7e1b35fa9836b11444e53ebd9", size = 244972, upload-time = "2025-12-08T13:12:24.781Z" }, + { url = "https://files.pythonhosted.org/packages/12/97/f4d27c6fe0cb375a5eced4aabcaef22de74766fb80a3d5d2015139e54b22/coverage-7.13.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:37eee4e552a65866f15dedd917d5e5f3d59805994260720821e2c1b51ac3248f", size = 245241, upload-time = "2025-12-08T13:12:28.041Z" }, + { url = "https://files.pythonhosted.org/packages/0c/94/42f8ae7f633bf4c118bf1038d80472f9dade88961a466f290b81250f7ab7/coverage-7.13.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:62d7c4f13102148c78d7353c6052af6d899a7f6df66a32bddcc0c0eb7c5326f8", size = 245847, upload-time = "2025-12-08T13:12:29.337Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2f/6369ca22b6b6d933f4f4d27765d313d8914cc4cce84f82a16436b1a233db/coverage-7.13.0-cp310-cp310-win32.whl", hash = "sha256:24e4e56304fdb56f96f80eabf840eab043b3afea9348b88be680ec5986780a0f", size = 220573, upload-time = "2025-12-08T13:12:30.905Z" }, + { url = "https://files.pythonhosted.org/packages/f1/dc/a6a741e519acceaeccc70a7f4cfe5d030efc4b222595f0677e101af6f1f3/coverage-7.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:74c136e4093627cf04b26a35dab8cbfc9b37c647f0502fc313376e11726ba303", size = 221509, upload-time = "2025-12-08T13:12:32.09Z" }, + { url = "https://files.pythonhosted.org/packages/f1/dc/888bf90d8b1c3d0b4020a40e52b9f80957d75785931ec66c7dfaccc11c7d/coverage-7.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0dfa3855031070058add1a59fdfda0192fd3e8f97e7c81de0596c145dea51820", size = 218104, upload-time = "2025-12-08T13:12:33.333Z" }, + { url = "https://files.pythonhosted.org/packages/8d/ea/069d51372ad9c380214e86717e40d1a743713a2af191cfba30a0911b0a4a/coverage-7.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4fdb6f54f38e334db97f72fa0c701e66d8479af0bc3f9bfb5b90f1c30f54500f", size = 218606, upload-time = "2025-12-08T13:12:34.498Z" }, + { url = "https://files.pythonhosted.org/packages/68/09/77b1c3a66c2aa91141b6c4471af98e5b1ed9b9e6d17255da5eb7992299e3/coverage-7.13.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7e442c013447d1d8d195be62852270b78b6e255b79b8675bad8479641e21fd96", size = 248999, upload-time = "2025-12-08T13:12:36.02Z" }, + { url = "https://files.pythonhosted.org/packages/0a/32/2e2f96e9d5691eaf1181d9040f850b8b7ce165ea10810fd8e2afa534cef7/coverage-7.13.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ed5630d946859de835a85e9a43b721123a8a44ec26e2830b296d478c7fd4259", size = 250925, upload-time = "2025-12-08T13:12:37.221Z" }, + { url = "https://files.pythonhosted.org/packages/7b/45/b88ddac1d7978859b9a39a8a50ab323186148f1d64bc068f86fc77706321/coverage-7.13.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f15a931a668e58087bc39d05d2b4bf4b14ff2875b49c994bbdb1c2217a8daeb", size = 253032, upload-time = "2025-12-08T13:12:38.763Z" }, + { url = "https://files.pythonhosted.org/packages/71/cb/e15513f94c69d4820a34b6bf3d2b1f9f8755fa6021be97c7065442d7d653/coverage-7.13.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:30a3a201a127ea57f7e14ba43c93c9c4be8b7d17a26e03bb49e6966d019eede9", size = 249134, upload-time = "2025-12-08T13:12:40.382Z" }, + { url = "https://files.pythonhosted.org/packages/09/61/d960ff7dc9e902af3310ce632a875aaa7860f36d2bc8fc8b37ee7c1b82a5/coverage-7.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a485ff48fbd231efa32d58f479befce52dcb6bfb2a88bb7bf9a0b89b1bc8030", size = 250731, upload-time = "2025-12-08T13:12:41.992Z" }, + { url = "https://files.pythonhosted.org/packages/98/34/c7c72821794afc7c7c2da1db8f00c2c98353078aa7fb6b5ff36aac834b52/coverage-7.13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:22486cdafba4f9e471c816a2a5745337742a617fef68e890d8baf9f3036d7833", size = 248795, upload-time = "2025-12-08T13:12:43.331Z" }, + { url = "https://files.pythonhosted.org/packages/0a/5b/e0f07107987a43b2def9aa041c614ddb38064cbf294a71ef8c67d43a0cdd/coverage-7.13.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:263c3dbccc78e2e331e59e90115941b5f53e85cfcc6b3b2fbff1fd4e3d2c6ea8", size = 248514, upload-time = "2025-12-08T13:12:44.546Z" }, + { url = "https://files.pythonhosted.org/packages/71/c2/c949c5d3b5e9fc6dd79e1b73cdb86a59ef14f3709b1d72bf7668ae12e000/coverage-7.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e5330fa0cc1f5c3c4c3bb8e101b742025933e7848989370a1d4c8c5e401ea753", size = 249424, upload-time = "2025-12-08T13:12:45.759Z" }, + { url = "https://files.pythonhosted.org/packages/11/f1/bbc009abd6537cec0dffb2cc08c17a7f03de74c970e6302db4342a6e05af/coverage-7.13.0-cp311-cp311-win32.whl", hash = "sha256:0f4872f5d6c54419c94c25dd6ae1d015deeb337d06e448cd890a1e89a8ee7f3b", size = 220597, upload-time = "2025-12-08T13:12:47.378Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f6/d9977f2fb51c10fbaed0718ce3d0a8541185290b981f73b1d27276c12d91/coverage-7.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51a202e0f80f241ccb68e3e26e19ab5b3bf0f813314f2c967642f13ebcf1ddfe", size = 221536, upload-time = "2025-12-08T13:12:48.7Z" }, + { url = "https://files.pythonhosted.org/packages/be/ad/3fcf43fd96fb43e337a3073dea63ff148dcc5c41ba7a14d4c7d34efb2216/coverage-7.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:d2a9d7f1c11487b1c69367ab3ac2d81b9b3721f097aa409a3191c3e90f8f3dd7", size = 220206, upload-time = "2025-12-08T13:12:50.365Z" }, + { url = "https://files.pythonhosted.org/packages/9b/f1/2619559f17f31ba00fc40908efd1fbf1d0a5536eb75dc8341e7d660a08de/coverage-7.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0b3d67d31383c4c68e19a88e28fc4c2e29517580f1b0ebec4a069d502ce1e0bf", size = 218274, upload-time = "2025-12-08T13:12:52.095Z" }, + { url = "https://files.pythonhosted.org/packages/2b/11/30d71ae5d6e949ff93b2a79a2c1b4822e00423116c5c6edfaeef37301396/coverage-7.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:581f086833d24a22c89ae0fe2142cfaa1c92c930adf637ddf122d55083fb5a0f", size = 218638, upload-time = "2025-12-08T13:12:53.418Z" }, + { url = "https://files.pythonhosted.org/packages/79/c2/fce80fc6ded8d77e53207489d6065d0fed75db8951457f9213776615e0f5/coverage-7.13.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0a3a30f0e257df382f5f9534d4ce3d4cf06eafaf5192beb1a7bd066cb10e78fb", size = 250129, upload-time = "2025-12-08T13:12:54.744Z" }, + { url = "https://files.pythonhosted.org/packages/5b/b6/51b5d1eb6fcbb9a1d5d6984e26cbe09018475c2922d554fd724dd0f056ee/coverage-7.13.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:583221913fbc8f53b88c42e8dbb8fca1d0f2e597cb190ce45916662b8b9d9621", size = 252885, upload-time = "2025-12-08T13:12:56.401Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f8/972a5affea41de798691ab15d023d3530f9f56a72e12e243f35031846ff7/coverage-7.13.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f5d9bd30756fff3e7216491a0d6d520c448d5124d3d8e8f56446d6412499e74", size = 253974, upload-time = "2025-12-08T13:12:57.718Z" }, + { url = "https://files.pythonhosted.org/packages/8a/56/116513aee860b2c7968aa3506b0f59b22a959261d1dbf3aea7b4450a7520/coverage-7.13.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a23e5a1f8b982d56fa64f8e442e037f6ce29322f1f9e6c2344cd9e9f4407ee57", size = 250538, upload-time = "2025-12-08T13:12:59.254Z" }, + { url = "https://files.pythonhosted.org/packages/d6/75/074476d64248fbadf16dfafbf93fdcede389ec821f74ca858d7c87d2a98c/coverage-7.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9b01c22bc74a7fb44066aaf765224c0d933ddf1f5047d6cdfe4795504a4493f8", size = 251912, upload-time = "2025-12-08T13:13:00.604Z" }, + { url = "https://files.pythonhosted.org/packages/f2/d2/aa4f8acd1f7c06024705c12609d8698c51b27e4d635d717cd1934c9668e2/coverage-7.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:898cce66d0836973f48dda4e3514d863d70142bdf6dfab932b9b6a90ea5b222d", size = 250054, upload-time = "2025-12-08T13:13:01.892Z" }, + { url = "https://files.pythonhosted.org/packages/19/98/8df9e1af6a493b03694a1e8070e024e7d2cdc77adedc225a35e616d505de/coverage-7.13.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:3ab483ea0e251b5790c2aac03acde31bff0c736bf8a86829b89382b407cd1c3b", size = 249619, upload-time = "2025-12-08T13:13:03.236Z" }, + { url = "https://files.pythonhosted.org/packages/d8/71/f8679231f3353018ca66ef647fa6fe7b77e6bff7845be54ab84f86233363/coverage-7.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d84e91521c5e4cb6602fe11ece3e1de03b2760e14ae4fcf1a4b56fa3c801fcd", size = 251496, upload-time = "2025-12-08T13:13:04.511Z" }, + { url = "https://files.pythonhosted.org/packages/04/86/9cb406388034eaf3c606c22094edbbb82eea1fa9d20c0e9efadff20d0733/coverage-7.13.0-cp312-cp312-win32.whl", hash = "sha256:193c3887285eec1dbdb3f2bd7fbc351d570ca9c02ca756c3afbc71b3c98af6ef", size = 220808, upload-time = "2025-12-08T13:13:06.422Z" }, + { url = "https://files.pythonhosted.org/packages/1c/59/af483673df6455795daf5f447c2f81a3d2fcfc893a22b8ace983791f6f34/coverage-7.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:4f3e223b2b2db5e0db0c2b97286aba0036ca000f06aca9b12112eaa9af3d92ae", size = 221616, upload-time = "2025-12-08T13:13:07.95Z" }, + { url = "https://files.pythonhosted.org/packages/64/b0/959d582572b30a6830398c60dd419c1965ca4b5fb38ac6b7093a0d50ca8d/coverage-7.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:086cede306d96202e15a4b77ace8472e39d9f4e5f9fd92dd4fecdfb2313b2080", size = 220261, upload-time = "2025-12-08T13:13:09.581Z" }, + { url = "https://files.pythonhosted.org/packages/7c/cc/bce226595eb3bf7d13ccffe154c3c487a22222d87ff018525ab4dd2e9542/coverage-7.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:28ee1c96109974af104028a8ef57cec21447d42d0e937c0275329272e370ebcf", size = 218297, upload-time = "2025-12-08T13:13:10.977Z" }, + { url = "https://files.pythonhosted.org/packages/3b/9f/73c4d34600aae03447dff3d7ad1d0ac649856bfb87d1ca7d681cfc913f9e/coverage-7.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d1e97353dcc5587b85986cda4ff3ec98081d7e84dd95e8b2a6d59820f0545f8a", size = 218673, upload-time = "2025-12-08T13:13:12.562Z" }, + { url = "https://files.pythonhosted.org/packages/63/ab/8fa097db361a1e8586535ae5073559e6229596b3489ec3ef2f5b38df8cb2/coverage-7.13.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:99acd4dfdfeb58e1937629eb1ab6ab0899b131f183ee5f23e0b5da5cba2fec74", size = 249652, upload-time = "2025-12-08T13:13:13.909Z" }, + { url = "https://files.pythonhosted.org/packages/90/3a/9bfd4de2ff191feb37ef9465855ca56a6f2f30a3bca172e474130731ac3d/coverage-7.13.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ff45e0cd8451e293b63ced93161e189780baf444119391b3e7d25315060368a6", size = 252251, upload-time = "2025-12-08T13:13:15.553Z" }, + { url = "https://files.pythonhosted.org/packages/df/61/b5d8105f016e1b5874af0d7c67542da780ccd4a5f2244a433d3e20ceb1ad/coverage-7.13.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f4f72a85316d8e13234cafe0a9f81b40418ad7a082792fa4165bd7d45d96066b", size = 253492, upload-time = "2025-12-08T13:13:16.849Z" }, + { url = "https://files.pythonhosted.org/packages/f3/b8/0fad449981803cc47a4694768b99823fb23632150743f9c83af329bb6090/coverage-7.13.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:11c21557d0e0a5a38632cbbaca5f008723b26a89d70db6315523df6df77d6232", size = 249850, upload-time = "2025-12-08T13:13:18.142Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e9/8d68337c3125014d918cf4327d5257553a710a2995a6a6de2ac77e5aa429/coverage-7.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76541dc8d53715fb4f7a3a06b34b0dc6846e3c69bc6204c55653a85dd6220971", size = 251633, upload-time = "2025-12-08T13:13:19.56Z" }, + { url = "https://files.pythonhosted.org/packages/55/14/d4112ab26b3a1bc4b3c1295d8452dcf399ed25be4cf649002fb3e64b2d93/coverage-7.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6e9e451dee940a86789134b6b0ffbe31c454ade3b849bb8a9d2cca2541a8e91d", size = 249586, upload-time = "2025-12-08T13:13:20.883Z" }, + { url = "https://files.pythonhosted.org/packages/2c/a9/22b0000186db663b0d82f86c2f1028099ae9ac202491685051e2a11a5218/coverage-7.13.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:5c67dace46f361125e6b9cace8fe0b729ed8479f47e70c89b838d319375c8137", size = 249412, upload-time = "2025-12-08T13:13:22.22Z" }, + { url = "https://files.pythonhosted.org/packages/a1/2e/42d8e0d9e7527fba439acdc6ed24a2b97613b1dc85849b1dd935c2cffef0/coverage-7.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f59883c643cb19630500f57016f76cfdcd6845ca8c5b5ea1f6e17f74c8e5f511", size = 251191, upload-time = "2025-12-08T13:13:23.899Z" }, + { url = "https://files.pythonhosted.org/packages/a4/af/8c7af92b1377fd8860536aadd58745119252aaaa71a5213e5a8e8007a9f5/coverage-7.13.0-cp313-cp313-win32.whl", hash = "sha256:58632b187be6f0be500f553be41e277712baa278147ecb7559983c6d9faf7ae1", size = 220829, upload-time = "2025-12-08T13:13:25.182Z" }, + { url = "https://files.pythonhosted.org/packages/58/f9/725e8bf16f343d33cbe076c75dc8370262e194ff10072c0608b8e5cf33a3/coverage-7.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:73419b89f812f498aca53f757dd834919b48ce4799f9d5cad33ca0ae442bdb1a", size = 221640, upload-time = "2025-12-08T13:13:26.836Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ff/e98311000aa6933cc79274e2b6b94a2fe0fe3434fca778eba82003675496/coverage-7.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:eb76670874fdd6091eedcc856128ee48c41a9bbbb9c3f1c7c3cf169290e3ffd6", size = 220269, upload-time = "2025-12-08T13:13:28.116Z" }, + { url = "https://files.pythonhosted.org/packages/cf/cf/bbaa2e1275b300343ea865f7d424cc0a2e2a1df6925a070b2b2d5d765330/coverage-7.13.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6e63ccc6e0ad8986386461c3c4b737540f20426e7ec932f42e030320896c311a", size = 218990, upload-time = "2025-12-08T13:13:29.463Z" }, + { url = "https://files.pythonhosted.org/packages/21/1d/82f0b3323b3d149d7672e7744c116e9c170f4957e0c42572f0366dbb4477/coverage-7.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:494f5459ffa1bd45e18558cd98710c36c0b8fbfa82a5eabcbe671d80ecffbfe8", size = 219340, upload-time = "2025-12-08T13:13:31.524Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e3/fe3fd4702a3832a255f4d43013eacb0ef5fc155a5960ea9269d8696db28b/coverage-7.13.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:06cac81bf10f74034e055e903f5f946e3e26fc51c09fc9f584e4a1605d977053", size = 260638, upload-time = "2025-12-08T13:13:32.965Z" }, + { url = "https://files.pythonhosted.org/packages/ad/01/63186cb000307f2b4da463f72af9b85d380236965574c78e7e27680a2593/coverage-7.13.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f2ffc92b46ed6e6760f1d47a71e56b5664781bc68986dbd1836b2b70c0ce2071", size = 262705, upload-time = "2025-12-08T13:13:34.378Z" }, + { url = "https://files.pythonhosted.org/packages/7c/a1/c0dacef0cc865f2455d59eed3548573ce47ed603205ffd0735d1d78b5906/coverage-7.13.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0602f701057c6823e5db1b74530ce85f17c3c5be5c85fc042ac939cbd909426e", size = 265125, upload-time = "2025-12-08T13:13:35.73Z" }, + { url = "https://files.pythonhosted.org/packages/ef/92/82b99223628b61300bd382c205795533bed021505eab6dd86e11fb5d7925/coverage-7.13.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:25dc33618d45456ccb1d37bce44bc78cf269909aa14c4db2e03d63146a8a1493", size = 259844, upload-time = "2025-12-08T13:13:37.69Z" }, + { url = "https://files.pythonhosted.org/packages/cf/2c/89b0291ae4e6cd59ef042708e1c438e2290f8c31959a20055d8768349ee2/coverage-7.13.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:71936a8b3b977ddd0b694c28c6a34f4fff2e9dd201969a4ff5d5fc7742d614b0", size = 262700, upload-time = "2025-12-08T13:13:39.525Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f9/a5f992efae1996245e796bae34ceb942b05db275e4b34222a9a40b9fbd3b/coverage-7.13.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:936bc20503ce24770c71938d1369461f0c5320830800933bc3956e2a4ded930e", size = 260321, upload-time = "2025-12-08T13:13:41.172Z" }, + { url = "https://files.pythonhosted.org/packages/4c/89/a29f5d98c64fedbe32e2ac3c227fbf78edc01cc7572eee17d61024d89889/coverage-7.13.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:af0a583efaacc52ae2521f8d7910aff65cdb093091d76291ac5820d5e947fc1c", size = 259222, upload-time = "2025-12-08T13:13:43.282Z" }, + { url = "https://files.pythonhosted.org/packages/b3/c3/940fe447aae302a6701ee51e53af7e08b86ff6eed7631e5740c157ee22b9/coverage-7.13.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f1c23e24a7000da892a312fb17e33c5f94f8b001de44b7cf8ba2e36fbd15859e", size = 261411, upload-time = "2025-12-08T13:13:44.72Z" }, + { url = "https://files.pythonhosted.org/packages/eb/31/12a4aec689cb942a89129587860ed4d0fd522d5fda81237147fde554b8ae/coverage-7.13.0-cp313-cp313t-win32.whl", hash = "sha256:5f8a0297355e652001015e93be345ee54393e45dc3050af4a0475c5a2b767d46", size = 221505, upload-time = "2025-12-08T13:13:46.332Z" }, + { url = "https://files.pythonhosted.org/packages/65/8c/3b5fe3259d863572d2b0827642c50c3855d26b3aefe80bdc9eba1f0af3b0/coverage-7.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6abb3a4c52f05e08460bd9acf04fec027f8718ecaa0d09c40ffbc3fbd70ecc39", size = 222569, upload-time = "2025-12-08T13:13:47.79Z" }, + { url = "https://files.pythonhosted.org/packages/b0/39/f71fa8316a96ac72fc3908839df651e8eccee650001a17f2c78cdb355624/coverage-7.13.0-cp313-cp313t-win_arm64.whl", hash = "sha256:3ad968d1e3aa6ce5be295ab5fe3ae1bf5bb4769d0f98a80a0252d543a2ef2e9e", size = 220841, upload-time = "2025-12-08T13:13:49.243Z" }, + { url = "https://files.pythonhosted.org/packages/f8/4b/9b54bedda55421449811dcd5263a2798a63f48896c24dfb92b0f1b0845bd/coverage-7.13.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:453b7ec753cf5e4356e14fe858064e5520c460d3bbbcb9c35e55c0d21155c256", size = 218343, upload-time = "2025-12-08T13:13:50.811Z" }, + { url = "https://files.pythonhosted.org/packages/59/df/c3a1f34d4bba2e592c8979f924da4d3d4598b0df2392fbddb7761258e3dc/coverage-7.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:af827b7cbb303e1befa6c4f94fd2bf72f108089cfa0f8abab8f4ca553cf5ca5a", size = 218672, upload-time = "2025-12-08T13:13:52.284Z" }, + { url = "https://files.pythonhosted.org/packages/07/62/eec0659e47857698645ff4e6ad02e30186eb8afd65214fd43f02a76537cb/coverage-7.13.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9987a9e4f8197a1000280f7cc089e3ea2c8b3c0a64d750537809879a7b4ceaf9", size = 249715, upload-time = "2025-12-08T13:13:53.791Z" }, + { url = "https://files.pythonhosted.org/packages/23/2d/3c7ff8b2e0e634c1f58d095f071f52ed3c23ff25be524b0ccae8b71f99f8/coverage-7.13.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3188936845cd0cb114fa6a51842a304cdbac2958145d03be2377ec41eb285d19", size = 252225, upload-time = "2025-12-08T13:13:55.274Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ac/fb03b469d20e9c9a81093575003f959cf91a4a517b783aab090e4538764b/coverage-7.13.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2bdb3babb74079f021696cb46b8bb5f5661165c385d3a238712b031a12355be", size = 253559, upload-time = "2025-12-08T13:13:57.161Z" }, + { url = "https://files.pythonhosted.org/packages/29/62/14afa9e792383c66cc0a3b872a06ded6e4ed1079c7d35de274f11d27064e/coverage-7.13.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7464663eaca6adba4175f6c19354feea61ebbdd735563a03d1e472c7072d27bb", size = 249724, upload-time = "2025-12-08T13:13:58.692Z" }, + { url = "https://files.pythonhosted.org/packages/31/b7/333f3dab2939070613696ab3ee91738950f0467778c6e5a5052e840646b7/coverage-7.13.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8069e831f205d2ff1f3d355e82f511eb7c5522d7d413f5db5756b772ec8697f8", size = 251582, upload-time = "2025-12-08T13:14:00.642Z" }, + { url = "https://files.pythonhosted.org/packages/81/cb/69162bda9381f39b2287265d7e29ee770f7c27c19f470164350a38318764/coverage-7.13.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:6fb2d5d272341565f08e962cce14cdf843a08ac43bd621783527adb06b089c4b", size = 249538, upload-time = "2025-12-08T13:14:02.556Z" }, + { url = "https://files.pythonhosted.org/packages/e0/76/350387b56a30f4970abe32b90b2a434f87d29f8b7d4ae40d2e8a85aacfb3/coverage-7.13.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5e70f92ef89bac1ac8a99b3324923b4749f008fdbd7aa9cb35e01d7a284a04f9", size = 249349, upload-time = "2025-12-08T13:14:04.015Z" }, + { url = "https://files.pythonhosted.org/packages/86/0d/7f6c42b8d59f4c7e43ea3059f573c0dcfed98ba46eb43c68c69e52ae095c/coverage-7.13.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4b5de7d4583e60d5fd246dd57fcd3a8aa23c6e118a8c72b38adf666ba8e7e927", size = 251011, upload-time = "2025-12-08T13:14:05.505Z" }, + { url = "https://files.pythonhosted.org/packages/d7/f1/4bb2dff379721bb0b5c649d5c5eaf438462cad824acf32eb1b7ca0c7078e/coverage-7.13.0-cp314-cp314-win32.whl", hash = "sha256:a6c6e16b663be828a8f0b6c5027d36471d4a9f90d28444aa4ced4d48d7d6ae8f", size = 221091, upload-time = "2025-12-08T13:14:07.127Z" }, + { url = "https://files.pythonhosted.org/packages/ba/44/c239da52f373ce379c194b0ee3bcc121020e397242b85f99e0afc8615066/coverage-7.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:0900872f2fdb3ee5646b557918d02279dc3af3dfb39029ac4e945458b13f73bc", size = 221904, upload-time = "2025-12-08T13:14:08.542Z" }, + { url = "https://files.pythonhosted.org/packages/89/1f/b9f04016d2a29c2e4a0307baefefad1a4ec5724946a2b3e482690486cade/coverage-7.13.0-cp314-cp314-win_arm64.whl", hash = "sha256:3a10260e6a152e5f03f26db4a407c4c62d3830b9af9b7c0450b183615f05d43b", size = 220480, upload-time = "2025-12-08T13:14:10.958Z" }, + { url = "https://files.pythonhosted.org/packages/16/d4/364a1439766c8e8647860584171c36010ca3226e6e45b1753b1b249c5161/coverage-7.13.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9097818b6cc1cfb5f174e3263eba4a62a17683bcfe5c4b5d07f4c97fa51fbf28", size = 219074, upload-time = "2025-12-08T13:14:13.345Z" }, + { url = "https://files.pythonhosted.org/packages/ce/f4/71ba8be63351e099911051b2089662c03d5671437a0ec2171823c8e03bec/coverage-7.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0018f73dfb4301a89292c73be6ba5f58722ff79f51593352759c1790ded1cabe", size = 219342, upload-time = "2025-12-08T13:14:15.02Z" }, + { url = "https://files.pythonhosted.org/packages/5e/25/127d8ed03d7711a387d96f132589057213e3aef7475afdaa303412463f22/coverage-7.13.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:166ad2a22ee770f5656e1257703139d3533b4a0b6909af67c6b4a3adc1c98657", size = 260713, upload-time = "2025-12-08T13:14:16.907Z" }, + { url = "https://files.pythonhosted.org/packages/fd/db/559fbb6def07d25b2243663b46ba9eb5a3c6586c0c6f4e62980a68f0ee1c/coverage-7.13.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f6aaef16d65d1787280943f1c8718dc32e9cf141014e4634d64446702d26e0ff", size = 262825, upload-time = "2025-12-08T13:14:18.68Z" }, + { url = "https://files.pythonhosted.org/packages/37/99/6ee5bf7eff884766edb43bd8736b5e1c5144d0fe47498c3779326fe75a35/coverage-7.13.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e999e2dcc094002d6e2c7bbc1fb85b58ba4f465a760a8014d97619330cdbbbf3", size = 265233, upload-time = "2025-12-08T13:14:20.55Z" }, + { url = "https://files.pythonhosted.org/packages/d8/90/92f18fe0356ea69e1f98f688ed80cec39f44e9f09a1f26a1bbf017cc67f2/coverage-7.13.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:00c3d22cf6fb1cf3bf662aaaa4e563be8243a5ed2630339069799835a9cc7f9b", size = 259779, upload-time = "2025-12-08T13:14:22.367Z" }, + { url = "https://files.pythonhosted.org/packages/90/5d/b312a8b45b37a42ea7d27d7d3ff98ade3a6c892dd48d1d503e773503373f/coverage-7.13.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22ccfe8d9bb0d6134892cbe1262493a8c70d736b9df930f3f3afae0fe3ac924d", size = 262700, upload-time = "2025-12-08T13:14:24.309Z" }, + { url = "https://files.pythonhosted.org/packages/63/f8/b1d0de5c39351eb71c366f872376d09386640840a2e09b0d03973d791e20/coverage-7.13.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:9372dff5ea15930fea0445eaf37bbbafbc771a49e70c0aeed8b4e2c2614cc00e", size = 260302, upload-time = "2025-12-08T13:14:26.068Z" }, + { url = "https://files.pythonhosted.org/packages/aa/7c/d42f4435bc40c55558b3109a39e2d456cddcec37434f62a1f1230991667a/coverage-7.13.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:69ac2c492918c2461bc6ace42d0479638e60719f2a4ef3f0815fa2df88e9f940", size = 259136, upload-time = "2025-12-08T13:14:27.604Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d3/23413241dc04d47cfe19b9a65b32a2edd67ecd0b817400c2843ebc58c847/coverage-7.13.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:739c6c051a7540608d097b8e13c76cfa85263ced467168dc6b477bae3df7d0e2", size = 261467, upload-time = "2025-12-08T13:14:29.09Z" }, + { url = "https://files.pythonhosted.org/packages/13/e6/6e063174500eee216b96272c0d1847bf215926786f85c2bd024cf4d02d2f/coverage-7.13.0-cp314-cp314t-win32.whl", hash = "sha256:fe81055d8c6c9de76d60c94ddea73c290b416e061d40d542b24a5871bad498b7", size = 221875, upload-time = "2025-12-08T13:14:31.106Z" }, + { url = "https://files.pythonhosted.org/packages/3b/46/f4fb293e4cbe3620e3ac2a3e8fd566ed33affb5861a9b20e3dd6c1896cbc/coverage-7.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:445badb539005283825959ac9fa4a28f712c214b65af3a2c464f1adc90f5fcbc", size = 222982, upload-time = "2025-12-08T13:14:33.1Z" }, + { url = "https://files.pythonhosted.org/packages/68/62/5b3b9018215ed9733fbd1ae3b2ed75c5de62c3b55377a52cae732e1b7805/coverage-7.13.0-cp314-cp314t-win_arm64.whl", hash = "sha256:de7f6748b890708578fc4b7bb967d810aeb6fcc9bff4bb77dbca77dab2f9df6a", size = 221016, upload-time = "2025-12-08T13:14:34.601Z" }, + { url = "https://files.pythonhosted.org/packages/8d/4c/1968f32fb9a2604645827e11ff84a31e59d532e01995f904723b4f5328b3/coverage-7.13.0-py3-none-any.whl", hash = "sha256:850d2998f380b1e266459ca5b47bc9e7daf9af1d070f66317972f382d46f1904", size = 210068, upload-time = "2025-12-08T13:14:36.236Z" }, ] [[package]] name = "crosshair-tool" -version = "0.0.99" +version = "0.0.101" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "importlib-metadata" }, @@ -735,50 +791,50 @@ dependencies = [ { name = "typing-inspect" }, { name = "z3-solver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/52/46/cf5e099ddd08ba23e3e1e892167d04227b95d820ba816204cfe658f09a54/crosshair_tool-0.0.99.tar.gz", hash = "sha256:ffb12f62bd707fe7f91b3d19f6716bf8a54d72a1783afa37b913e3cec87317d1", size = 474581, upload-time = "2025-12-01T14:48:55.731Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/87/de3369827347c64d2d4dfc18272d7d2c377c7cc39135795d2b6d99081d1b/crosshair_tool-0.0.99-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ab68b9c892fd8e83bb3da35a6738da42e0edd3d3eca7d53f7a5fccbf7b0cddad", size = 536900, upload-time = "2025-12-01T14:47:56.444Z" }, - { url = "https://files.pythonhosted.org/packages/a9/93/124958d4cb7ec3451fab6e9b608d659322b2630357c16b1b7b24cf180966/crosshair_tool-0.0.99-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e2329e528d2dc66a9dbe8fa928b94fecb74a6c576d0d04bb610089341c9976f8", size = 528914, upload-time = "2025-12-01T14:47:57.898Z" }, - { url = "https://files.pythonhosted.org/packages/18/14/6ba28ca4398e6172b865300ca2475637817f228500c4c5502be444411074/crosshair_tool-0.0.99-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:664dcd62593618f3e25c6670ab36664cc9bd518bf9656bd5f86bcb7c7bc217e1", size = 529674, upload-time = "2025-12-01T14:47:59.066Z" }, - { url = "https://files.pythonhosted.org/packages/41/72/54c1a2e201860e3106380b8fc07de2625df02e7e4a8e49dff3739078d79c/crosshair_tool-0.0.99-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:27aab487793b907ec7281d76505c81b9b2312af078ea5016f353bda1c57d82c9", size = 552549, upload-time = "2025-12-01T14:48:00.374Z" }, - { url = "https://files.pythonhosted.org/packages/19/0f/2cbe24df38ddf049093c3c70a7008b4aa0b477cb09623a5230d2ba2a5caa/crosshair_tool-0.0.99-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:12f34b0f81fc54014ff725ade26157bf44b541652932bcc5ebeb8e2db933afa3", size = 552528, upload-time = "2025-12-01T14:48:01.447Z" }, - { url = "https://files.pythonhosted.org/packages/52/a3/49602adfe2e20f2c0016bab3f246265fe44c8719e5646903bb8bc7a4d0c2/crosshair_tool-0.0.99-cp310-cp310-win32.whl", hash = "sha256:fa6d8860744bf8880a043698a954cd4a62a990258d2b4d5135b0e79963a46769", size = 531970, upload-time = "2025-12-01T14:48:02.502Z" }, - { url = "https://files.pythonhosted.org/packages/a2/06/525e1efae1e0b875a793a1c02baacdab0b8f448ffabe64b2a430e2a25cb9/crosshair_tool-0.0.99-cp310-cp310-win_amd64.whl", hash = "sha256:01ebcb031167fa4422b8f81d7fe5e4b3570ab8b995c48cb36a8a7e2542e63d4e", size = 532978, upload-time = "2025-12-01T14:48:05.2Z" }, - { url = "https://files.pythonhosted.org/packages/06/f7/13fa87d9547efc4db12d2e14d0e5a55ace4ac264e95724491ccd73027593/crosshair_tool-0.0.99-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0c524520b33b95461bca18fe2b5bd3a755f3ab164c209e7cd51a56c298cb917d", size = 537000, upload-time = "2025-12-01T14:48:06.17Z" }, - { url = "https://files.pythonhosted.org/packages/bb/4d/4aa82b973aa8b02648fe7581132a2f8e1650021e2b608d5bb991157b5197/crosshair_tool-0.0.99-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:416a4a46ed5984fd9024efa01d4af93f7c1270db4973bc3dd013c39941b4765c", size = 528971, upload-time = "2025-12-01T14:48:07.117Z" }, - { url = "https://files.pythonhosted.org/packages/b9/45/3ecc807826384f8b0a87e4b3095475caeb260017057349d9b968bc195146/crosshair_tool-0.0.99-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e57c09bd684c9af544f72fe4db32307720263ed0fd1fae7a8e3beb340cf7afdd", size = 529721, upload-time = "2025-12-01T14:48:08.404Z" }, - { url = "https://files.pythonhosted.org/packages/a0/d2/732e7c395c32a924a2de94815f210dbdeff9bb2ee9c22aa8c0f6e1b6fc50/crosshair_tool-0.0.99-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7e65d4647407f487b8dfefeb8be1d182764a479854a334065ce2c983e69914f4", size = 552968, upload-time = "2025-12-01T14:48:09.804Z" }, - { url = "https://files.pythonhosted.org/packages/7c/94/eed1fff90971bc689ebe0674447de5142eb48c23864e3f9a122d4987cdfd/crosshair_tool-0.0.99-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1fded299a8935ded2ed351d67b63e0cde8f7ed9b9570de95a1867bd6b95fb90b", size = 552967, upload-time = "2025-12-01T14:48:11.006Z" }, - { url = "https://files.pythonhosted.org/packages/1e/d2/3476d47f3bdfa0b070c30824ff25c833337df9b2997ffa676a5beead93d4/crosshair_tool-0.0.99-cp311-cp311-win32.whl", hash = "sha256:fca95c689067272293a0f43eb5cca3483f5f24291b72ee8b35e34829624938a3", size = 532003, upload-time = "2025-12-01T14:48:12.38Z" }, - { url = "https://files.pythonhosted.org/packages/09/d7/5c62b42ccc3fe0736cb81488e6d41f28fa83f308c7a76c466c72edb0a340/crosshair_tool-0.0.99-cp311-cp311-win_amd64.whl", hash = "sha256:fc979f19fb0a1673c3db281dd9eb0e58858def988bb02ffba3e2b4126ba9e141", size = 533008, upload-time = "2025-12-01T14:48:13.632Z" }, - { url = "https://files.pythonhosted.org/packages/d3/5c/d53a4fe0e2964b43ddfef91330e82ccb62501b0bbe921102e00dcdd73720/crosshair_tool-0.0.99-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e80643cbc578a18713ef3aaf61401af433503cd0942652913a83ef1e02f7e462", size = 540884, upload-time = "2025-12-01T14:48:15.112Z" }, - { url = "https://files.pythonhosted.org/packages/8d/54/54d95e4ba7673cac674b03e05c0baea08249d4a765b5f1fc4344d7dc025d/crosshair_tool-0.0.99-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:76723b0f1c548fff499a92a85d7c37fdfe9a7f5e8fabc58b12efdfa221662ee6", size = 531411, upload-time = "2025-12-01T14:48:16.16Z" }, - { url = "https://files.pythonhosted.org/packages/ec/d4/81eb599171cde45cd33984de2511b898137d9900478df8c274a96568ba99/crosshair_tool-0.0.99-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:30a159d293087397267149c61713479930c5d35a411381bdeaf5c1d0a27f30f2", size = 531997, upload-time = "2025-12-01T14:48:17.201Z" }, - { url = "https://files.pythonhosted.org/packages/cf/56/f8affb503d52b034d8f17b925e773d4e9534f18d26f7ffc9c85a2449ae06/crosshair_tool-0.0.99-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e431c6fa31314b7faefaec11733ca0dbda6f24fba2da136ae4fdcc20c62598e8", size = 562955, upload-time = "2025-12-01T14:48:18.302Z" }, - { url = "https://files.pythonhosted.org/packages/a0/0d/d1534437dab40d2740d6a6818d0a1173854f37264f519293c0c716fa843a/crosshair_tool-0.0.99-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad6853ef2ffdc088f72a9e8b806b52d6984c693ff2bde5fa225ae1681d57e4ab", size = 562012, upload-time = "2025-12-01T14:48:19.299Z" }, - { url = "https://files.pythonhosted.org/packages/10/da/a575f0dabac3be14317559176d42e9d1d8be8e13d07cacbdd583780c535d/crosshair_tool-0.0.99-cp312-cp312-win32.whl", hash = "sha256:43d345d9cfd50e6608c861c4d5342a2eaf2f12c5604b3d09f39d86913fa54e92", size = 533697, upload-time = "2025-12-01T14:48:20.462Z" }, - { url = "https://files.pythonhosted.org/packages/50/9d/6aacd3c4c8479f7993d5d15c200e78f9b6c49b4200a3dbba7e2ac7ea2928/crosshair_tool-0.0.99-cp312-cp312-win_amd64.whl", hash = "sha256:dd62206e5f0f9dbf0c4640b1aae86c7fe655aafb13fa36a78aa7d86973201cf3", size = 534825, upload-time = "2025-12-01T14:48:21.5Z" }, - { url = "https://files.pythonhosted.org/packages/84/bf/ab31ebed8307076206b604b577a25a53ed6ac6c6b2e31179f880883f394e/crosshair_tool-0.0.99-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:41715f2b4539329898948248d676e64eac430476bf5573063a933958e9a44596", size = 549610, upload-time = "2025-12-01T14:48:22.915Z" }, - { url = "https://files.pythonhosted.org/packages/a4/10/e4fd40566fad0dafe827c66ec6e6baddde854e85a763df2ab0c161bbaf3d/crosshair_tool-0.0.99-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3ac0ac2106d7a7ba212f6c24a216aa1c010586fbdd9d5c6273915e174735d5ba", size = 535207, upload-time = "2025-12-01T14:48:23.96Z" }, - { url = "https://files.pythonhosted.org/packages/35/bc/40be7da4ea6e9332a3589be1d1a21737572ffcd86d0135b92b579c4f3907/crosshair_tool-0.0.99-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:21786986d1bfb6976335c3e07854576826e8cab965593bbea377727f252289b7", size = 535867, upload-time = "2025-12-01T14:48:25.072Z" }, - { url = "https://files.pythonhosted.org/packages/85/a2/3338a73527c266490ecd3485ba11426b111f78869e38fc2c1529251134c4/crosshair_tool-0.0.99-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a08c4801897a0de06a7b76ee24895f62cb682993bc85e2ad1f1160cab40e2935", size = 569682, upload-time = "2025-12-01T14:48:26.088Z" }, - { url = "https://files.pythonhosted.org/packages/cc/8f/e40bfa08ab4e341654929bebe9a9a01a730affd225ad58a3f59a5e2fe233/crosshair_tool-0.0.99-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1227980b640ed9896f2e080f82f78768f34cbe29ac13d3fd8a3d1965530d2b39", size = 568700, upload-time = "2025-12-01T14:48:27.123Z" }, - { url = "https://files.pythonhosted.org/packages/6f/65/5f302a1f7f5d61779e760d904b484e2fab9234aa979f6be7034d91e2997e/crosshair_tool-0.0.99-cp313-cp313-win32.whl", hash = "sha256:4623a83107232ae6791b78646d7b2a71b8fdccd0d3affd0a1a792ab1e107f981", size = 533718, upload-time = "2025-12-01T14:48:28.114Z" }, - { url = "https://files.pythonhosted.org/packages/b1/3c/bc0cb40810215647b37f91491d95363be333129ce4562f6e512041dac337/crosshair_tool-0.0.99-cp313-cp313-win_amd64.whl", hash = "sha256:5e0bd567b24a1fe053e9e8e201113975a26160c9bca4a0529c44a79c9887f91a", size = 534848, upload-time = "2025-12-01T14:48:29.185Z" }, - { url = "https://files.pythonhosted.org/packages/11/72/f097eb8fc9e611f6540c501a1424d1abf4fd2dea54b28c14bb6584693b0c/crosshair_tool-0.0.99-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:6b5bd6ec02bcf5617341a90782bd4110caa38c7dbcf06d40a0e2102ffd6dc8ab", size = 547327, upload-time = "2025-12-01T14:48:30.369Z" }, - { url = "https://files.pythonhosted.org/packages/43/81/dedb4549ee165de0bd1ce07f2f0fedd449595876fb0123db05dc7b2e8b24/crosshair_tool-0.0.99-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ebfd8f1cc40c928850b1ffebbeb938b67e0fab3fbc3471234c51bef0378a77e4", size = 534057, upload-time = "2025-12-01T14:48:31.441Z" }, - { url = "https://files.pythonhosted.org/packages/5a/07/ab446321a5f093a269e5673822d945593da388ea9fc5f643b741a571b97b/crosshair_tool-0.0.99-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fcec0383784bb4896c1955a0093e07691f34249b36287248492fc86a9ec7c8b8", size = 534723, upload-time = "2025-12-01T14:48:32.497Z" }, - { url = "https://files.pythonhosted.org/packages/1c/21/bccfe7cc6a470ec9dbc159d650ca225944ffd5534831d4107c30a3c20582/crosshair_tool-0.0.99-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4cb441470316d96fa496fafb1552791425a94b1bf0aff1ac85a96c8a2133c8c8", size = 606256, upload-time = "2025-12-01T14:48:33.608Z" }, - { url = "https://files.pythonhosted.org/packages/33/86/24fa35187d0b74c597d25d100dfd5f51e04125c49a022a246078581c9714/crosshair_tool-0.0.99-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:630693e7c5c535222342eea769153f19eb7d7eb0625519365c3e230c4b8850eb", size = 604368, upload-time = "2025-12-01T14:48:34.954Z" }, - { url = "https://files.pythonhosted.org/packages/38/ea/38b23e501131134fe0864fb57ac8827f24135a133f9a021fe970374a6d04/crosshair_tool-0.0.99-cp314-cp314-win32.whl", hash = "sha256:c696ecc78e66a37befe3a204ab0c1ace7d5fef4e28039a5770cc080fcfc79dbe", size = 532482, upload-time = "2025-12-01T14:48:36.064Z" }, - { url = "https://files.pythonhosted.org/packages/c4/fb/79d6ed7e982ae62f613d11c61888076aa6705d0d16950e07231da60adfe4/crosshair_tool-0.0.99-cp314-cp314-win_amd64.whl", hash = "sha256:00d694f56f1c3ba27e4421943d31f89a8c99481f13a615f745892d8acec133fd", size = 533492, upload-time = "2025-12-01T14:48:37.083Z" }, - { url = "https://files.pythonhosted.org/packages/5d/a9/8cca7f61e934b9f6dbfcfd968b50f9883b78ecfc9a325230280ce12aee7c/crosshair_tool-0.0.99-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:97ecd9c0356a70f837d3f3db6a672271d6affb55331f69736cd440b95dd94d08", size = 536806, upload-time = "2025-12-01T14:48:46.975Z" }, - { url = "https://files.pythonhosted.org/packages/4f/e9/aa6e2f75c86f5fea7a6c48cd3ca2e309c4aa41df845c6873eee887d33318/crosshair_tool-0.0.99-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:509650a23ca0c9e95822afd888cf63dac358e0b36a947309facde94ba5eb3a1f", size = 528858, upload-time = "2025-12-01T14:48:48.076Z" }, - { url = "https://files.pythonhosted.org/packages/7e/34/81f5d0fcb4e5501f64daa4bc2a6a35ebe0b8d234ccae15410e8235789825/crosshair_tool-0.0.99-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d934335e8f221dd6c8b000151015c6c1f715e847cdad83a8f01831ab2c1598f4", size = 529639, upload-time = "2025-12-01T14:48:49.453Z" }, - { url = "https://files.pythonhosted.org/packages/da/db/29cb0136c69fb15213a6c2424096c1e0beb75d1efe8c2bb2848430050676/crosshair_tool-0.0.99-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3668870fbc70cbb1ea122b9d224aba63149189ead23bd43c2c6b2c90a7fb4ab1", size = 551956, upload-time = "2025-12-01T14:48:50.616Z" }, - { url = "https://files.pythonhosted.org/packages/a7/00/8af2139ea54a96581ac157983afb79514f8a9f8ca1885e7e9271ef65a81e/crosshair_tool-0.0.99-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:16e262433a99ee68d0c3ab356025ae51119bd85b3404ddc1c60e0e79842f20a2", size = 551917, upload-time = "2025-12-01T14:48:52.189Z" }, - { url = "https://files.pythonhosted.org/packages/99/97/61783635b554fdf952df6d704df3035706f1399531ae806a26a0b628e4d5/crosshair_tool-0.0.99-cp39-cp39-win32.whl", hash = "sha256:dfe96b7e3a3ffa317f3161a54ea6fba79a4077d600a6410f3be371bb6fccaa56", size = 531975, upload-time = "2025-12-01T14:48:53.628Z" }, - { url = "https://files.pythonhosted.org/packages/1b/9b/9ed8a7b9534d04db845e4cc7bc1dba161ef11263fefc25f09789dce963b1/crosshair_tool-0.0.99-cp39-cp39-win_amd64.whl", hash = "sha256:51884b5c53fb4b8591f858bf14cb3eda9b8a8c456394d5b0d2d7dfb435c863b4", size = 532992, upload-time = "2025-12-01T14:48:54.666Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/5a/bb/75256bf53b0e5e78f748924cf698771a39a6aced1c8e43ac9df8ecef3d81/crosshair_tool-0.0.101.tar.gz", hash = "sha256:c36eb18e211b344b47dc9aaf85d0b16ae4cb00719d20f131eb6ebf5e79767983", size = 476117, upload-time = "2025-12-18T14:18:53.429Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/69/5ff2d5d6f5db0c571dbde267fc1ed1e0fb29a07468e915687846e1ca7df4/crosshair_tool-0.0.101-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95a448fc876925c614852101db768ff4136bd1cabc2898440d3e191adf0bda50", size = 538688, upload-time = "2025-12-18T14:17:51.254Z" }, + { url = "https://files.pythonhosted.org/packages/fd/75/f90266f0a2c5a06d421e79902ee55d83e1f8e0ec99d749f0d66e5656197e/crosshair_tool-0.0.101-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c5132457fc85517f95ff772a05596ad45c9b7ad0753939621eb0c9b8476d900", size = 530701, upload-time = "2025-12-18T14:17:52.746Z" }, + { url = "https://files.pythonhosted.org/packages/22/b2/913c13579927855396cb517b4723422e727f09f04d2fb8b730a29dce16e3/crosshair_tool-0.0.101-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2c9fffd585ad9e314b9519b589bee8137266ce9bbc84fbef626c231e4e67d26b", size = 531458, upload-time = "2025-12-18T14:17:53.622Z" }, + { url = "https://files.pythonhosted.org/packages/ce/6f/2df7407277d37e6dd248fc64e2bdbb0c58d9f062477bb1c2d2bd8b6dd4a1/crosshair_tool-0.0.101-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:96194cc5bd3336b00fa76ff01887ec74c42ff76ce05fdf90dcb9b133b1509ec0", size = 554333, upload-time = "2025-12-18T14:17:54.569Z" }, + { url = "https://files.pythonhosted.org/packages/29/c6/4bfcbb66b57604c1a724ee6d1ee224a54381eda0069cfb847b0c194a2426/crosshair_tool-0.0.101-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b089b373d56400b176ab3cc1dc396c531fe00c9bede893bfa905f1fa8ab9382e", size = 554310, upload-time = "2025-12-18T14:17:55.895Z" }, + { url = "https://files.pythonhosted.org/packages/99/99/54a71d6bee93c3924e67d650440f51f1fcb2b74dee16ae57cfc135089bd5/crosshair_tool-0.0.101-cp310-cp310-win32.whl", hash = "sha256:6e24e9140014241c1275f9266fd6a8e9d09b91a9b0b0606eed3b58e6809280af", size = 533785, upload-time = "2025-12-18T14:17:56.988Z" }, + { url = "https://files.pythonhosted.org/packages/45/54/f9106814002224ec944e0eb259403312f9eb40eb29efb12060fef3e0f6ac/crosshair_tool-0.0.101-cp310-cp310-win_amd64.whl", hash = "sha256:ce9a8ccd2ccc16ec66e69c66d49a722573b7c59d0d3331ccaee1c9e4abf8401e", size = 534790, upload-time = "2025-12-18T14:17:58.262Z" }, + { url = "https://files.pythonhosted.org/packages/df/d8/21c8f89498905284869541fa8b40097845fda6fe6f87dd542e384b4ba78c/crosshair_tool-0.0.101-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d7649071d0768156d55fff9c9ff6f5e179d5340463b56129b792ae94bf733c9c", size = 538782, upload-time = "2025-12-18T14:17:59.563Z" }, + { url = "https://files.pythonhosted.org/packages/e1/ef/febfdfd917c3e5f57f7b3a271e52ff52fab2a37dc746e05178b1196f6a24/crosshair_tool-0.0.101-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dba6375c4aaed3e7715782b6b2152fc792f700a7474be5bb310469212bedf64b", size = 530759, upload-time = "2025-12-18T14:18:00.957Z" }, + { url = "https://files.pythonhosted.org/packages/d7/5f/c89f1e38b42c0cf7028241b53795ef72067387904b77c2ba6149b3a044dc/crosshair_tool-0.0.101-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:04378d43a11250bb5423c15ccf86191a0e075cf825b2e7b5ea02cf2509f2b5f5", size = 531506, upload-time = "2025-12-18T14:18:01.967Z" }, + { url = "https://files.pythonhosted.org/packages/ed/40/cc0e8228e9393131b6ebebb128f945d02c16216ae7cb192c5da3d2b8a13a/crosshair_tool-0.0.101-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a852577cd68b548a45635a63f97a433c8793134ee75ca79515e3b4cde44daf09", size = 554751, upload-time = "2025-12-18T14:18:03.654Z" }, + { url = "https://files.pythonhosted.org/packages/e8/54/c7ea900656ab20922cba89a640cd3f76457230091db92108b1b470e9069d/crosshair_tool-0.0.101-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ea80e3acfbd6a91b88acabdd18f91f611aedacdd3369656d31dc5c60abf0dd1", size = 554749, upload-time = "2025-12-18T14:18:04.954Z" }, + { url = "https://files.pythonhosted.org/packages/03/ac/32b18b997a9324c3aad2f4da582dbdd097a53d7ae4e94e5eaf53178d631f/crosshair_tool-0.0.101-cp311-cp311-win32.whl", hash = "sha256:88bd52e50d149062c3a87bdb46bff4243ce2fd3623e4fb9aa6829a194e8f9950", size = 533819, upload-time = "2025-12-18T14:18:06.322Z" }, + { url = "https://files.pythonhosted.org/packages/5c/eb/fac6df37ce0f3dc6a71fd146efe1d5979fdda70e2903ff3e95f6614cb4b4/crosshair_tool-0.0.101-cp311-cp311-win_amd64.whl", hash = "sha256:238dbbf44edc3f31d3ad520529b943e39fdf6deb16ab8c166aa95ecccb26412f", size = 534822, upload-time = "2025-12-18T14:18:08.822Z" }, + { url = "https://files.pythonhosted.org/packages/55/7c/ecc5b0dbe939d3bc6d055c7ff28fb28cd2cef28f5d223e6e3013bae4a7f9/crosshair_tool-0.0.101-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e585ef30143dab9a9d131bf7a31a061a3f6425dc6758c7b22d24ec46c9143284", size = 542673, upload-time = "2025-12-18T14:18:10.48Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b2/5a0f8aac2c8339f027525cfafa9703262ebba5d8f400c197a1603eb970af/crosshair_tool-0.0.101-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bb7403aacb31df9e86817de589529707f757be857e7ed905f1a8c818b300bad9", size = 533199, upload-time = "2025-12-18T14:18:11.841Z" }, + { url = "https://files.pythonhosted.org/packages/9b/93/39be29d11ac9224c752faa58201536e9d608383794cddcb7b9858c9e03ac/crosshair_tool-0.0.101-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f10fa35b409aa06022fc399a31e659cc556ca9b5d933b8c93119aee54856f812", size = 533782, upload-time = "2025-12-18T14:18:13.106Z" }, + { url = "https://files.pythonhosted.org/packages/9e/26/37520dbc67aae47e59c591d3968d699712c6de55a9554d8b0ff5da94a531/crosshair_tool-0.0.101-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:659ebd5a7dfbff5d887cd5c5181d8e574fb72723bdb175e0ff7a1d9fe2cd2e3c", size = 564738, upload-time = "2025-12-18T14:18:14.906Z" }, + { url = "https://files.pythonhosted.org/packages/31/fc/ecf423b072b6be46fbbd60bce434a64dc8f0a811ffb750cc215d1c723878/crosshair_tool-0.0.101-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:639931207bd13425f4387125b48e550afbd0d73b311f4ae1197b33d05f8df49b", size = 563796, upload-time = "2025-12-18T14:18:16.634Z" }, + { url = "https://files.pythonhosted.org/packages/79/4b/ea96d1d803de470a0be5010aa68d30c92f6489d1ee6485f16bcbfa5ee6fc/crosshair_tool-0.0.101-cp312-cp312-win32.whl", hash = "sha256:cb026922307100c7f861bd575d6b467d3fe377eb9dbdd2cf47589e87b5a12868", size = 535512, upload-time = "2025-12-18T14:18:17.66Z" }, + { url = "https://files.pythonhosted.org/packages/32/bc/edf87abf668c6fd3bd5216b4b7f08b10be5ca64a20ae2dafc9f79c6b3f45/crosshair_tool-0.0.101-cp312-cp312-win_amd64.whl", hash = "sha256:20ef1abfa39f80c3f15762afa7200d74f2091760e49ff601e7054dac3541ccff", size = 536627, upload-time = "2025-12-18T14:18:19.267Z" }, + { url = "https://files.pythonhosted.org/packages/02/b6/fcc49d2da3da46d8319f9e76a06882482b4c2c1e7a211db8e571ee8fbb59/crosshair_tool-0.0.101-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:16a3d772f7e34d4704433db2ff760d2c6447b06abf12562be1eecd8b4ad74b1a", size = 551391, upload-time = "2025-12-18T14:18:20.459Z" }, + { url = "https://files.pythonhosted.org/packages/e9/98/9a4b368fad60e634c899575b3b34c0e3ff1eb6f0b942704c916d3e1cc3c2/crosshair_tool-0.0.101-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:32c46e468aea2f42eaea902ea342ea3e5e4cdcf8715b520067ed88c65e79cfae", size = 536993, upload-time = "2025-12-18T14:18:21.921Z" }, + { url = "https://files.pythonhosted.org/packages/65/75/6977ff8c03163678628f97a706df5e837d35f5de560babfdbab1cb127509/crosshair_tool-0.0.101-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9963d191c6f390a4f2232ff95ee636bc42d76bb0646a243526b1fdd203a61275", size = 537651, upload-time = "2025-12-18T14:18:22.912Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ad/c2fe4fdf07e97f94fe5420855bfc56e32922bc8609d7ea68beeb6c95f3b2/crosshair_tool-0.0.101-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b871be4d0628f1f9e55b6c7319f3785a0bee1aaae73eb1d371fe06bf2f4713cb", size = 571466, upload-time = "2025-12-18T14:18:24.469Z" }, + { url = "https://files.pythonhosted.org/packages/34/75/8c06e9f7d8205509c8c4f3ea9437b1d18c8d52c403a7a549c4b3b5f9def8/crosshair_tool-0.0.101-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fc950c9cd714c320f2b6aa7d26030c367c9fdb9690df770d9acc059729bcc3f9", size = 570481, upload-time = "2025-12-18T14:18:25.789Z" }, + { url = "https://files.pythonhosted.org/packages/b5/1c/e684fb048a011e8a70bf453c6efcb9b497a2e6181125ece56f77f28e9c03/crosshair_tool-0.0.101-cp313-cp313-win32.whl", hash = "sha256:002b348340ee529176cc3e7b94bc76e0be07be62e4fdd1f4edc1bd0e9bb3e3f7", size = 535531, upload-time = "2025-12-18T14:18:26.76Z" }, + { url = "https://files.pythonhosted.org/packages/1c/bb/7369ecff4b9571232d905396c47e991b17e03466c05c2fffceefc25a6110/crosshair_tool-0.0.101-cp313-cp313-win_amd64.whl", hash = "sha256:0fb3d3c50cfd9489236fbcee583921c784f38ac98ff508be5bd706d16ab2d60c", size = 536651, upload-time = "2025-12-18T14:18:28.229Z" }, + { url = "https://files.pythonhosted.org/packages/4c/cd/00469ecfe4a68e817d7bece48232a5d0603417c48d0f9b312d4dd6b4cd98/crosshair_tool-0.0.101-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:965ee1a51dedd07496b3259c4ae7555c9e1856a941a7017934360736370a4881", size = 549111, upload-time = "2025-12-18T14:18:29.22Z" }, + { url = "https://files.pythonhosted.org/packages/71/d5/1b3858f5026d3234c38a4923462a7183966fe3575a3fe216297feaeb3cce/crosshair_tool-0.0.101-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:bbb015c298c527460225c85d03f3578f6bb65561bd51d8f0ea92ff9d92314b88", size = 535840, upload-time = "2025-12-18T14:18:30.277Z" }, + { url = "https://files.pythonhosted.org/packages/46/70/6661089601c040f6e9c801e925b0397ed465a5bb38960f941131538f0a83/crosshair_tool-0.0.101-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:eca74aa2b553f80ee1d85ff7beb5cefa4fd64037d10fd887f7a21591820932ec", size = 536510, upload-time = "2025-12-18T14:18:31.446Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8e/2deb47c4b744138606078b3814823c159041227d84a65e71df0a85d03f18/crosshair_tool-0.0.101-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c7ea8d4e75aef8c2655cc4b686bc8a685b00d5691f553c0486d76754de8abbea", size = 608040, upload-time = "2025-12-18T14:18:33.975Z" }, + { url = "https://files.pythonhosted.org/packages/f0/cd/41dd26268ace2dc9b51c989fca34d914b19d7b5eef3b85c9ca9b12d3b3ed/crosshair_tool-0.0.101-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a7829a42f32452de508b4f75201223637b7d9452eb2cac4d89302196e1a75d5d", size = 606151, upload-time = "2025-12-18T14:18:34.951Z" }, + { url = "https://files.pythonhosted.org/packages/b4/f1/1340a33a84a621c9550e2eb14b758e9971da6afcc195507afe835b97b6a3/crosshair_tool-0.0.101-cp314-cp314-win32.whl", hash = "sha256:fa6d46b7498cb855f43087374e978e9d6048338966c92aff3423cbd2239801e6", size = 534280, upload-time = "2025-12-18T14:18:35.97Z" }, + { url = "https://files.pythonhosted.org/packages/3a/d8/03a76f1d5edca7ebee74a695e370914d087017f936b19ab02d57f1125073/crosshair_tool-0.0.101-cp314-cp314-win_amd64.whl", hash = "sha256:23582783eca66fad8e139eb46f4cefac603456452b324e4ef0572aabc71ec19b", size = 535286, upload-time = "2025-12-18T14:18:36.975Z" }, + { url = "https://files.pythonhosted.org/packages/45/4e/8720c7b69d79ba2302970cbf495b75bc0046874a4a0bcca38c4356221afd/crosshair_tool-0.0.101-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:60771a5c29ed9b4fc33a788504f8de36da5bf3cc11de386c117e36d4502245b7", size = 538590, upload-time = "2025-12-18T14:18:45.349Z" }, + { url = "https://files.pythonhosted.org/packages/75/cb/a5c260ed01c26eb5048937f30e216ff805ab3ab3a61c391fce14bd3ab356/crosshair_tool-0.0.101-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1dc57f980046a20ecdcef6950380258d39e7a8fa968fc9c851ec27d0a544ab0f", size = 530646, upload-time = "2025-12-18T14:18:46.65Z" }, + { url = "https://files.pythonhosted.org/packages/4b/e7/cd90713b50c484f5882b46d8c59e759bc8e48666d4140a4827029fd6aa5f/crosshair_tool-0.0.101-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:473e99675d9c370d9f750b34a0f0f54dc8c88000a689cfc9e966770cccaf7001", size = 531423, upload-time = "2025-12-18T14:18:48.024Z" }, + { url = "https://files.pythonhosted.org/packages/2b/e4/5dae492829f6891560cd4f23843232312b737186112617dd67a401156e79/crosshair_tool-0.0.101-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:08142586447f05bd26c700fab8ff3afba6948db7bff78670dbfd178b56a004f5", size = 553736, upload-time = "2025-12-18T14:18:48.983Z" }, + { url = "https://files.pythonhosted.org/packages/9a/08/9c5f0a3c9fb0cfc81648b9b31b7e04311d165c2716089f710f2e81be43e9/crosshair_tool-0.0.101-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0c9e3e75a38f42ca9afad9309d3e862a984f04d5ac93326742ce52b2666a3c7f", size = 553701, upload-time = "2025-12-18T14:18:50.256Z" }, + { url = "https://files.pythonhosted.org/packages/5f/0d/e431ff33b798e4cab095decf35d3aa06edab208139909684f4da4744582f/crosshair_tool-0.0.101-cp39-cp39-win32.whl", hash = "sha256:876d36503cf6e848e0fa00166abc85f8d968f5f4593f9bc7eeda17a1df7b77cd", size = 533793, upload-time = "2025-12-18T14:18:51.29Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d8/600d675e6c81a41206b62f7d7884b6f9fa0107186882a719f3ced01d9400/crosshair_tool-0.0.101-cp39-cp39-win_amd64.whl", hash = "sha256:44f716635e40fd85a647b11352e72482aa80769b7893a4359ace5af5f7550d5d", size = 534808, upload-time = "2025-12-18T14:18:52.324Z" }, ] [[package]] @@ -875,7 +931,7 @@ wheels = [ [[package]] name = "filelock" -version = "3.20.0" +version = "3.20.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14'", @@ -884,9 +940,9 @@ resolution-markers = [ "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] -sdist = { url = "https://files.pythonhosted.org/packages/58/46/0028a82567109b5ef6e4d2a1f04a583fb513e6cf9527fcdd09afd817deeb/filelock-3.20.0.tar.gz", hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4", size = 18922, upload-time = "2025-10-08T18:03:50.056Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a7/23/ce7a1126827cedeb958fc043d61745754464eb56c5937c35bbf2b8e26f34/filelock-3.20.1.tar.gz", hash = "sha256:b8360948b351b80f420878d8516519a2204b07aefcdcfd24912a5d33127f188c", size = 19476, upload-time = "2025-12-15T23:54:28.027Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl", hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2", size = 16054, upload-time = "2025-10-08T18:03:48.35Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7f/a1a97644e39e7316d850784c642093c99df1290a460df4ede27659056834/filelock-3.20.1-py3-none-any.whl", hash = "sha256:15d9e9a67306188a44baa72f569d2bfd803076269365fdea0934385da4dc361a", size = 16666, upload-time = "2025-12-15T23:54:26.874Z" }, ] [[package]] @@ -958,7 +1014,7 @@ wheels = [ [[package]] name = "humanize" -version = "4.14.0" +version = "4.15.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14'", @@ -967,9 +1023,9 @@ resolution-markers = [ "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", ] -sdist = { url = "https://files.pythonhosted.org/packages/b6/43/50033d25ad96a7f3845f40999b4778f753c3901a11808a584fed7c00d9f5/humanize-4.14.0.tar.gz", hash = "sha256:2fa092705ea640d605c435b1ca82b2866a1b601cdf96f076d70b79a855eba90d", size = 82939, upload-time = "2025-10-15T13:04:51.214Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/66/a3921783d54be8a6870ac4ccffcd15c4dc0dd7fcce51c6d63b8c63935276/humanize-4.15.0.tar.gz", hash = "sha256:1dd098483eb1c7ee8e32eb2e99ad1910baefa4b75c3aff3a82f4d78688993b10", size = 83599, upload-time = "2025-12-20T20:16:13.19Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/5b/9512c5fb6c8218332b530f13500c6ff5f3ce3342f35e0dd7be9ac3856fd3/humanize-4.14.0-py3-none-any.whl", hash = "sha256:d57701248d040ad456092820e6fde56c930f17749956ac47f4f655c0c547bfff", size = 132092, upload-time = "2025-10-15T13:04:49.404Z" }, + { url = "https://files.pythonhosted.org/packages/c5/7b/bca5613a0c3b542420cf92bd5e5fb8ebd5435ce1011a091f66bb7693285e/humanize-4.15.0-py3-none-any.whl", hash = "sha256:b1186eb9f5a9749cd9cb8565aee77919dd7c8d076161cf44d70e59e3301e1769", size = 132203, upload-time = "2025-12-20T20:16:11.67Z" }, ] [[package]] @@ -1082,6 +1138,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f0/fd/7c404169a3e04a908df0644893a331f253a7f221961f2b6c0cf44430ae5a/inquirer-3.4.1-py3-none-any.whl", hash = "sha256:717bf146d547b595d2495e7285fd55545cff85e5ce01decc7487d2ec6a605412", size = 18152, upload-time = "2025-08-02T18:36:26.753Z" }, ] +[[package]] +name = "inquirer-textual" +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "textual" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/92/e3/04a9c586f4ccbf9b7fcf28365036d545a75f930cff08b719d88170a59ac3/inquirer_textual-0.2.0.tar.gz", hash = "sha256:fe6e40b09d220987ecdf82785cf6c55df0d639dd33024965cef4533e7fc8bd44", size = 394648, upload-time = "2025-12-11T22:16:36.147Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/2c/7f2a89d9e82224d58fc9ba0bf1e239183b923d2537b608cc84bcfc17ed1e/inquirer_textual-0.2.0-py3-none-any.whl", hash = "sha256:6d2065f7b3fb1eecbad3df3e887c328e8dcf2ad6d706552628866ffde92c505c", size = 15964, upload-time = "2025-12-11T22:16:35.023Z" }, +] + [[package]] name = "ipython" version = "8.18.1" @@ -1247,7 +1315,7 @@ wheels = [ [[package]] name = "jax" -version = "0.8.1" +version = "0.8.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14'", @@ -1256,15 +1324,15 @@ resolution-markers = [ "python_full_version == '3.11.*'", ] dependencies = [ - { name = "jaxlib", version = "0.8.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "jaxlib", version = "0.8.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "ml-dtypes", marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "opt-einsum", marker = "python_full_version >= '3.11'" }, { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/32/82/84fd2c662e4d410a34b0402de9b56bb69d7f72d1b875c3ae0edc07df18cc/jax-0.8.1.tar.gz", hash = "sha256:e53f67b15315f5e154851a7fd77a192b59c6c75b3f7ac56e214296765391cca7", size = 2509320, upload-time = "2025-11-18T19:50:02.609Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e6/25/5efb46e5492076622d9150ed394da97ef9aad393aa52f7dd7e980f836e1f/jax-0.8.2.tar.gz", hash = "sha256:1a685ded06a8223a7b52e45e668e406049dbbead02873f2b5a4d881ba7b421ae", size = 2505776, upload-time = "2025-12-18T18:41:59.274Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/e7/19b8cfc8963b2e10a01a4db7bb27ec5fa39ecd024bc62f8e2d1de5625a9d/jax-0.8.1-py3-none-any.whl", hash = "sha256:4cbdc5548f3095cdd69d38e4337950b2fc1f250a740a0234d190e4a319077564", size = 2922137, upload-time = "2025-11-18T19:47:43.693Z" }, + { url = "https://files.pythonhosted.org/packages/a8/f7/ae4ecf183d9693cd5fcce7ee063c5e54f173b66dc80a8a79951861e1b557/jax-0.8.2-py3-none-any.whl", hash = "sha256:d0478c5dc74406441efcd25731166a65ee782f13c352fa72dc7d734351909355", size = 2925344, upload-time = "2025-12-18T18:39:38.645Z" }, ] [[package]] @@ -1338,7 +1406,7 @@ wheels = [ [[package]] name = "jaxlib" -version = "0.8.1" +version = "0.8.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14'", @@ -1348,32 +1416,32 @@ resolution-markers = [ ] dependencies = [ { name = "ml-dtypes", marker = "python_full_version >= '3.11'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "scipy", version = "1.16.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/8b/9babcf487c6f1b533bca9611124c4d9593367c058a96d326c7e70db7d334/jaxlib-0.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:865add56139883405f3f15c9b0de6a64ab8f4aa549dff196b72dbc86be6ccc1f", size = 55719927, upload-time = "2025-11-18T19:48:42.679Z" }, - { url = "https://files.pythonhosted.org/packages/df/0c/b8c67272647ea151b0ac651e43faa846b4987d971058683dcce8abf68bca/jaxlib-0.8.1-cp311-cp311-manylinux_2_27_aarch64.whl", hash = "sha256:ff32b6320d729131efaf22939825b52d75957c84c32af2b0b1bdb33cf27ba75f", size = 74208199, upload-time = "2025-11-18T19:48:45.848Z" }, - { url = "https://files.pythonhosted.org/packages/8f/d0/5b83d614eddb58a2cc97fb948bfeb84509b90da04e808273bf9ae89ad6c1/jaxlib-0.8.1-cp311-cp311-manylinux_2_27_x86_64.whl", hash = "sha256:22f489fb5c8be0da7be5e4957a10936b3760a169668f8b25c5d09c51c3ef47f6", size = 80247963, upload-time = "2025-11-18T19:48:49.443Z" }, - { url = "https://files.pythonhosted.org/packages/52/b2/4b8507d23cfd9e895dce0204f684dc9db4f746da5a46c2e586a50fb3f1ee/jaxlib-0.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:c14c8c19a7eb694aa14092b6d2fffb9d2bdd8a603b63d6f26fbeaf129c204f9f", size = 59760834, upload-time = "2025-11-18T19:48:52.886Z" }, - { url = "https://files.pythonhosted.org/packages/d9/9d/59b36e2f348e599d5812743f263ca54aa03be1a4c9dfc11504d19864b72d/jaxlib-0.8.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88bde0f535eeea6689e0cd57d40b7660d5206ac95c7d42e09562a109b963a49f", size = 55728156, upload-time = "2025-11-18T19:48:56.254Z" }, - { url = "https://files.pythonhosted.org/packages/7e/73/2aa891de9f5f4c60ba3c63bda97ec4ace50ffb900ff3bf750ce42c514a3b/jaxlib-0.8.1-cp312-cp312-manylinux_2_27_aarch64.whl", hash = "sha256:bed1e94ae8c7c16bca4476d8d7f582f0d1a102a4e69c3a9bd2069a0dc42274a9", size = 74209108, upload-time = "2025-11-18T19:48:59.572Z" }, - { url = "https://files.pythonhosted.org/packages/eb/4b/3c7e373d81219ee7493c1581c85a926c413ddeb3794cff87a37023a337e4/jaxlib-0.8.1-cp312-cp312-manylinux_2_27_x86_64.whl", hash = "sha256:af4924189fc53b69237715b56ebcbfc71bb91ca16184143dcef0d430c8173de6", size = 80256943, upload-time = "2025-11-18T19:49:02.92Z" }, - { url = "https://files.pythonhosted.org/packages/07/6c/a6f449a7d1c7f91d73c3b8e00ceba92dff9dfd642508bbe1ddba9cb9ea57/jaxlib-0.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:24ec3f3a9c45d6de060020dc94c444d69e18099fab927ea3979ff8cedf0ed2c9", size = 59787068, upload-time = "2025-11-18T19:49:06.275Z" }, - { url = "https://files.pythonhosted.org/packages/f8/67/97c62849b5d8fc075f902201ff136ad224a2ef113d1fa655ece0ffe8b2a4/jaxlib-0.8.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a0349f6e8179dc897d33aeb90ec66b4a8041330fbbba8d071dc6167cd2271539", size = 55726611, upload-time = "2025-11-18T19:49:09.162Z" }, - { url = "https://files.pythonhosted.org/packages/fd/2a/9fb7599e43d66958b6a9859e045b605afea31f7fd96cfa35a7a8e978b0f8/jaxlib-0.8.1-cp313-cp313-manylinux_2_27_aarch64.whl", hash = "sha256:bd697c171ace1e2e9d6ed910a78f385b3c4095cee290b0255aa58848f2acdeab", size = 74207596, upload-time = "2025-11-18T19:49:12.39Z" }, - { url = "https://files.pythonhosted.org/packages/7d/61/ab5c98641e15f9844dd49efbf6f22c6a9c5d17304319e5be8c51a1dfd088/jaxlib-0.8.1-cp313-cp313-manylinux_2_27_x86_64.whl", hash = "sha256:d245bd6a279c72ca5f796df84cdd64d7c9c8abc4b8d89adf4acf45898dab958b", size = 80254560, upload-time = "2025-11-18T19:49:16.172Z" }, - { url = "https://files.pythonhosted.org/packages/1c/71/82a04ce93baeca5b3d10340f574e0668d327b7d0d18e32d9080917c507f6/jaxlib-0.8.1-cp313-cp313-win_amd64.whl", hash = "sha256:8e118e1fbe714f37a94ba26777c17faab7dca4a33646a3d98cd1d99673bbd6b1", size = 59786828, upload-time = "2025-11-18T19:49:19.563Z" }, - { url = "https://files.pythonhosted.org/packages/97/65/e7c625f1fdb54d45ac248d8398a28d6c02528c31feaa6e1c146a08192d77/jaxlib-0.8.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4933298fcfb07a5aa2d1fed21c111d07cea50e6f180dba2cdb5463c13fb98f2f", size = 55835933, upload-time = "2025-11-18T19:49:27.362Z" }, - { url = "https://files.pythonhosted.org/packages/1f/04/e09ff7b5ba0af93501cb196c65103a30e5050083203c1ff581f18718a356/jaxlib-0.8.1-cp313-cp313t-manylinux_2_27_aarch64.whl", hash = "sha256:f2f11491b077d05249d63813e811401194a41edc8e9cc60af8f4b554057cfad0", size = 74323389, upload-time = "2025-11-18T19:49:30.457Z" }, - { url = "https://files.pythonhosted.org/packages/44/9f/8b7f6ad9eebf8946e73049dae85f86544f5743bc8b2190898415646fa7ec/jaxlib-0.8.1-cp313-cp313t-manylinux_2_27_x86_64.whl", hash = "sha256:7a5d381fad89622750fae29fab83c0847e2931ad8d6a34dc13b28fc4d67f75a3", size = 80358249, upload-time = "2025-11-18T19:49:33.682Z" }, - { url = "https://files.pythonhosted.org/packages/47/6d/75943de28285afcc8d62e89c3e0efc0abdb7e7a72a9e967c3555fc9a35af/jaxlib-0.8.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:90e48973f8dbded7edc8728be84c01ae00412190187fb06622abfa4edd42c0a8", size = 55729587, upload-time = "2025-11-18T19:49:36.952Z" }, - { url = "https://files.pythonhosted.org/packages/2c/ce/9e68ca9f646039d687a94066a5e3e195fc70cebdfbe44945b3c53ceed321/jaxlib-0.8.1-cp314-cp314-manylinux_2_27_aarch64.whl", hash = "sha256:1a4001ed3ba9ed5a812da1b16f52eebb5d473a4480c1523828c7bd3dae8d1375", size = 74222294, upload-time = "2025-11-18T19:49:40.418Z" }, - { url = "https://files.pythonhosted.org/packages/3c/0f/988a413cbf610610cb14783a6e0964a854d0f388ccafe9b4e61c2c188b88/jaxlib-0.8.1-cp314-cp314-manylinux_2_27_x86_64.whl", hash = "sha256:fdbbf2336c08bbf8f30548e204c8c9d77f8b2a3a5b7fc7985749246feb8852b0", size = 80268801, upload-time = "2025-11-18T19:49:44.943Z" }, - { url = "https://files.pythonhosted.org/packages/22/60/044c7591777971345e4778d006cfa1c603ece98fc06ac29ad1bc8f2e18e7/jaxlib-0.8.1-cp314-cp314-win_amd64.whl", hash = "sha256:63fc25c4b5d03256798796a024125e29bcf254acc3eae5dc3239d1c30b86b866", size = 62064205, upload-time = "2025-11-18T19:49:49.435Z" }, - { url = "https://files.pythonhosted.org/packages/07/9b/f6f01d79f519b0cbd09a6c751844b1e0294fc53ea0b09882466b21169ea5/jaxlib-0.8.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:92c41c9b9862c08521eb90515a7c5bcc840c6d30f86230cebf94aea2d6a0af81", size = 55834325, upload-time = "2025-11-18T19:49:52.541Z" }, - { url = "https://files.pythonhosted.org/packages/61/c7/13d13a6f0b0d2e91431d6a031129d51ea4b23af23bb947882234ed003f09/jaxlib-0.8.1-cp314-cp314t-manylinux_2_27_aarch64.whl", hash = "sha256:1bc76edec2bc74a7adb5e29329ece51a67c57cd011a06d55d07da62fbabe3389", size = 74320131, upload-time = "2025-11-18T19:49:56.208Z" }, - { url = "https://files.pythonhosted.org/packages/cd/8a/6cad418c0f11ce0cffa2b74b81fb76e6cf30247288fea75a372b6b163f2e/jaxlib-0.8.1-cp314-cp314t-manylinux_2_27_x86_64.whl", hash = "sha256:117f2fe2c19479e560ad85a3ef2fcc0b1d24816456f0d039f865c2acbab63b5a", size = 80360481, upload-time = "2025-11-18T19:50:00.065Z" }, + { url = "https://files.pythonhosted.org/packages/5f/87/0a44b1a5c558e6d8e4fd796d4f9efe5c8cac2b3013ab7349968c65931fa4/jaxlib-0.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:490bf0cb029c73c65c9431124b86cdc95082dbc1fb76fc549d24d75da33e5454", size = 55929353, upload-time = "2025-12-18T18:40:35.844Z" }, + { url = "https://files.pythonhosted.org/packages/d1/d2/b37c86ee35d9ea7ee67c81e9166b31e18aa3784e1b96e8a60f52bbb8c9c0/jaxlib-0.8.2-cp311-cp311-manylinux_2_27_aarch64.whl", hash = "sha256:bb89be452b1b808d3f88fc01c415b364a260be4cc7ac120c038009f6150a32dc", size = 74548611, upload-time = "2025-12-18T18:40:39.67Z" }, + { url = "https://files.pythonhosted.org/packages/65/7d/9bb1cd620d8093098203b17d227a902939afec00da1c63cb719a9fe89525/jaxlib-0.8.2-cp311-cp311-manylinux_2_27_x86_64.whl", hash = "sha256:ccf77da917a20935247c990691decfcbdd06c25ef0ac94d914a04aadb22f714c", size = 80127195, upload-time = "2025-12-18T18:40:43.795Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f1/56d830c7fcf1736cbfb11d8cf79c1932f826f319d2467becb02933df3ba9/jaxlib-0.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:dffc22b5b732b9556d92c918b251c61bcc046617c4dbb51e1f7a656587fddffb", size = 60338464, upload-time = "2025-12-18T18:40:47.427Z" }, + { url = "https://files.pythonhosted.org/packages/c1/77/18ac0ac08c76bf12ed47b0c2d7d35f3fc3d065bd105b36937901eab1455c/jaxlib-0.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:023de6f3f56da2af7037970996500586331fdb50b530ecbb54b9666da633bd00", size = 55938204, upload-time = "2025-12-18T18:40:50.859Z" }, + { url = "https://files.pythonhosted.org/packages/33/c5/fa809591cbddc0d7bbef9c95962a0b521ae4a168b0ff375cadf37840b97d/jaxlib-0.8.2-cp312-cp312-manylinux_2_27_aarch64.whl", hash = "sha256:3b16e50c5b730c9dd0a49e55f1acfaa722b00b1af0522a591558dcc0464252f2", size = 74550881, upload-time = "2025-12-18T18:40:54.491Z" }, + { url = "https://files.pythonhosted.org/packages/e0/bf/e386c4bbfda3fb326a01594cc46c8ac90cdeeeacee4c553d9e3848f75893/jaxlib-0.8.2-cp312-cp312-manylinux_2_27_x86_64.whl", hash = "sha256:2b9789bd08f8b0cc5a5c12ae896fe432d5942e32e417091b8b5a96a9a6fd5cf1", size = 80135127, upload-time = "2025-12-18T18:40:58.808Z" }, + { url = "https://files.pythonhosted.org/packages/bf/4c/0c90b1e2b47fdf34cd352a01c42c2628d115a6f015d4a3230060bb0d97af/jaxlib-0.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:f472cc72e3058e50b5f0230b236d5a1183bf6c3d5423d2a52eff07bcf34908de", size = 60361039, upload-time = "2025-12-18T18:41:02.367Z" }, + { url = "https://files.pythonhosted.org/packages/c5/22/c0ec75e43a13b2457d78d509f49b49a57fa302ffced4f4a2778e428cb0a6/jaxlib-0.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4d006db96be020c8165212a1216372f8acac4ff4f8fb067743d694ef2b301ace", size = 55939058, upload-time = "2025-12-18T18:41:06.199Z" }, + { url = "https://files.pythonhosted.org/packages/c5/e2/2d3eff7a49ca37ef6929bf67b8ab4c933ab53a115060e60c239702028568/jaxlib-0.8.2-cp313-cp313-manylinux_2_27_aarch64.whl", hash = "sha256:7c304f3a016965b9d1f5239a8a0399a73925f5604fe914c5ca66ecf734bf6422", size = 74550207, upload-time = "2025-12-18T18:41:09.79Z" }, + { url = "https://files.pythonhosted.org/packages/6b/e0/91e5762a7ddb6351b07c742ca407cd28e26043d6945d6228b6c1b0881a45/jaxlib-0.8.2-cp313-cp313-manylinux_2_27_x86_64.whl", hash = "sha256:1bfbcf6c3de221784fa4cdb6765a09d71cb4298b15626b3d0409b3dfcd8a8667", size = 80133534, upload-time = "2025-12-18T18:41:14.193Z" }, + { url = "https://files.pythonhosted.org/packages/85/68/25b38673b07a808616ce7b6efb3eed491f983f3373a09cbbd03f67178563/jaxlib-0.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:f205e91c3a152a2a76c0bc59a6a2de03e87ec261b91e8812922777185e7b08f5", size = 60358239, upload-time = "2025-12-18T18:41:17.661Z" }, + { url = "https://files.pythonhosted.org/packages/bc/da/753c4b16297576e33cb41bf605d27fefd016867d365861c43c505afd1579/jaxlib-0.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f28edac8c226fc07fa3e8af6f9defede8ac2c307429e3291edce8739d39becc9", size = 56035453, upload-time = "2025-12-18T18:41:21.004Z" }, + { url = "https://files.pythonhosted.org/packages/4c/3d/891f967b01a60de1dbcb8c40b6fee28cc39c670c27c919756c41d8c89ebe/jaxlib-0.8.2-cp313-cp313t-manylinux_2_27_aarch64.whl", hash = "sha256:7da8127557c786264049ae55460d1b8d04cc3cdf0403a087f2fc1e6d313ec722", size = 74661142, upload-time = "2025-12-18T18:41:24.454Z" }, + { url = "https://files.pythonhosted.org/packages/e2/5c/3f1476cd6cbc0e2aa661cb750489739aeda500473d91dc79837b5bc9247f/jaxlib-0.8.2-cp313-cp313t-manylinux_2_27_x86_64.whl", hash = "sha256:28eec1a4e0639a0d8702cea3cb70dd3663053dbfa344452994ea48dc6ceadaa5", size = 80238500, upload-time = "2025-12-18T18:41:28.647Z" }, + { url = "https://files.pythonhosted.org/packages/d8/9d/dca93d916bf8664d7a2bb73ea3d219028dabbe382c31774348963287356a/jaxlib-0.8.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:beffb004e7eeb5c9afb24439e2b2cf45a4ee3e3e8adf45e355edf2af62acf8b8", size = 55943240, upload-time = "2025-12-18T18:41:32.095Z" }, + { url = "https://files.pythonhosted.org/packages/f0/47/7407d010db7f5ec1c25a8b8d379defc0c8b4daaaa829c88355e03c0ad314/jaxlib-0.8.2-cp314-cp314-manylinux_2_27_aarch64.whl", hash = "sha256:68108dff0de74adc468016be9a19f80efe48c660c0d5a122287094b44b092afc", size = 74560018, upload-time = "2025-12-18T18:41:36.154Z" }, + { url = "https://files.pythonhosted.org/packages/5e/27/2e6032727e41ce74914277478021140947af59127d68aa9e6f3776b428fd/jaxlib-0.8.2-cp314-cp314-manylinux_2_27_x86_64.whl", hash = "sha256:e6a97dfb0232eed9a2bb6e3828e4f682dbac1a7fea840bfda574cae2dbf5faf9", size = 80156235, upload-time = "2025-12-18T18:41:40.227Z" }, + { url = "https://files.pythonhosted.org/packages/b3/8c/af5a00b07a446414edf6b84a7397eab02cf01ba44b6ae1fce7798ce4c127/jaxlib-0.8.2-cp314-cp314-win_amd64.whl", hash = "sha256:05b958f497e49824c432e734bb059723b7dfe69e2ad696a9f9c8ad82fff7c3f8", size = 62673493, upload-time = "2025-12-18T18:41:43.991Z" }, + { url = "https://files.pythonhosted.org/packages/4d/eb/ad70fe97fda465d536625bef39ee381a7f8fed1f1bf0bc296510bac32ec5/jaxlib-0.8.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:964626f581beab31ee6826b228fcc2ec5181b05cecf94a528dff97921c145dbc", size = 56037334, upload-time = "2025-12-18T18:41:47.407Z" }, + { url = "https://files.pythonhosted.org/packages/34/97/0741440c66a49ec3702f6c28a5608c7543243b1728c3f465505ed5bfe7d2/jaxlib-0.8.2-cp314-cp314t-manylinux_2_27_aarch64.whl", hash = "sha256:a397ea7dcb37d689ce79173eeb99b2f1347637a36be9a27f20ae6848bfc58bfc", size = 74661591, upload-time = "2025-12-18T18:41:51.285Z" }, + { url = "https://files.pythonhosted.org/packages/7c/c4/388797324c201830ac414562eb6697fa38837f40852bdc4d0f464d65889c/jaxlib-0.8.2-cp314-cp314t-manylinux_2_27_x86_64.whl", hash = "sha256:aa8701b6356f098e8452c3cec762fb5f706fcb8f67ffd65964f63982479aa23b", size = 80236629, upload-time = "2025-12-18T18:41:56.05Z" }, ] [[package]] @@ -1500,85 +1568,85 @@ wheels = [ [[package]] name = "librt" -version = "0.7.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/d9/6f3d3fcf5e5543ed8a60cc70fa7d50508ed60b8a10e9af6d2058159ab54e/librt-0.7.3.tar.gz", hash = "sha256:3ec50cf65235ff5c02c5b747748d9222e564ad48597122a361269dd3aa808798", size = 144549, upload-time = "2025-12-06T19:04:45.553Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/66/79a14e672256ef58144a24eb49adb338ec02de67ff4b45320af6504682ab/librt-0.7.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2682162855a708e3270eba4b92026b93f8257c3e65278b456c77631faf0f4f7a", size = 54707, upload-time = "2025-12-06T19:03:10.881Z" }, - { url = "https://files.pythonhosted.org/packages/58/fa/b709c65a9d5eab85f7bcfe0414504d9775aaad6e78727a0327e175474caa/librt-0.7.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:440c788f707c061d237c1e83edf6164ff19f5c0f823a3bf054e88804ebf971ec", size = 56670, upload-time = "2025-12-06T19:03:12.107Z" }, - { url = "https://files.pythonhosted.org/packages/3a/56/0685a0772ec89ddad4c00e6b584603274c3d818f9a68e2c43c4eb7b39ee9/librt-0.7.3-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:399938edbd3d78339f797d685142dd8a623dfaded023cf451033c85955e4838a", size = 161045, upload-time = "2025-12-06T19:03:13.444Z" }, - { url = "https://files.pythonhosted.org/packages/4e/d9/863ada0c5ce48aefb89df1555e392b2209fcb6daee4c153c031339b9a89b/librt-0.7.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1975eda520957c6e0eb52d12968dd3609ffb7eef05d4223d097893d6daf1d8a7", size = 169532, upload-time = "2025-12-06T19:03:14.699Z" }, - { url = "https://files.pythonhosted.org/packages/68/a0/71da6c8724fd16c31749905ef1c9e11de206d9301b5be984bf2682b4efb3/librt-0.7.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f9da128d0edf990cf0d2ca011b02cd6f639e79286774bd5b0351245cbb5a6e51", size = 183277, upload-time = "2025-12-06T19:03:16.446Z" }, - { url = "https://files.pythonhosted.org/packages/8c/bf/9c97bf2f8338ba1914de233ea312bba2bbd7c59f43f807b3e119796bab18/librt-0.7.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e19acfde38cb532a560b98f473adc741c941b7a9bc90f7294bc273d08becb58b", size = 179045, upload-time = "2025-12-06T19:03:17.838Z" }, - { url = "https://files.pythonhosted.org/packages/b3/b1/ceea067f489e904cb4ddcca3c9b06ba20229bc3fa7458711e24a5811f162/librt-0.7.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7b4f57f7a0c65821c5441d98c47ff7c01d359b1e12328219709bdd97fdd37f90", size = 173521, upload-time = "2025-12-06T19:03:19.17Z" }, - { url = "https://files.pythonhosted.org/packages/7a/41/6cb18f5da9c89ed087417abb0127a445a50ad4eaf1282ba5b52588187f47/librt-0.7.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:256793988bff98040de23c57cf36e1f4c2f2dc3dcd17537cdac031d3b681db71", size = 193592, upload-time = "2025-12-06T19:03:20.637Z" }, - { url = "https://files.pythonhosted.org/packages/4c/3c/fcef208746584e7c78584b7aedc617130c4a4742cb8273361bbda8b183b5/librt-0.7.3-cp310-cp310-win32.whl", hash = "sha256:fcb72249ac4ea81a7baefcbff74df7029c3cb1cf01a711113fa052d563639c9c", size = 47201, upload-time = "2025-12-06T19:03:21.764Z" }, - { url = "https://files.pythonhosted.org/packages/c4/bf/d8a6c35d1b2b789a4df9b3ddb1c8f535ea373fde2089698965a8f0d62138/librt-0.7.3-cp310-cp310-win_amd64.whl", hash = "sha256:4887c29cadbdc50640179e3861c276325ff2986791e6044f73136e6e798ff806", size = 54371, upload-time = "2025-12-06T19:03:23.231Z" }, - { url = "https://files.pythonhosted.org/packages/21/e6/f6391f5c6f158d31ed9af6bd1b1bcd3ffafdea1d816bc4219d0d90175a7f/librt-0.7.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:687403cced6a29590e6be6964463835315905221d797bc5c934a98750fe1a9af", size = 54711, upload-time = "2025-12-06T19:03:24.6Z" }, - { url = "https://files.pythonhosted.org/packages/ab/1b/53c208188c178987c081560a0fcf36f5ca500d5e21769596c845ef2f40d4/librt-0.7.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:24d70810f6e2ea853ff79338001533716b373cc0f63e2a0be5bc96129edb5fb5", size = 56664, upload-time = "2025-12-06T19:03:25.969Z" }, - { url = "https://files.pythonhosted.org/packages/cb/5c/d9da832b9a1e5f8366e8a044ec80217945385b26cb89fd6f94bfdc7d80b0/librt-0.7.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bf8c7735fbfc0754111f00edda35cf9e98a8d478de6c47b04eaa9cef4300eaa7", size = 161701, upload-time = "2025-12-06T19:03:27.035Z" }, - { url = "https://files.pythonhosted.org/packages/20/aa/1e0a7aba15e78529dd21f233076b876ee58c8b8711b1793315bdd3b263b0/librt-0.7.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32d43610dff472eab939f4d7fbdd240d1667794192690433672ae22d7af8445", size = 171040, upload-time = "2025-12-06T19:03:28.482Z" }, - { url = "https://files.pythonhosted.org/packages/69/46/3cfa325c1c2bc25775ec6ec1718cfbec9cff4ac767d37d2d3a2d1cc6f02c/librt-0.7.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:adeaa886d607fb02563c1f625cf2ee58778a2567c0c109378da8f17ec3076ad7", size = 184720, upload-time = "2025-12-06T19:03:29.599Z" }, - { url = "https://files.pythonhosted.org/packages/99/bb/e4553433d7ac47f4c75d0a7e59b13aee0e08e88ceadbee356527a9629b0a/librt-0.7.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:572a24fc5958c61431da456a0ef1eeea6b4989d81eeb18b8e5f1f3077592200b", size = 180731, upload-time = "2025-12-06T19:03:31.201Z" }, - { url = "https://files.pythonhosted.org/packages/35/89/51cd73006232981a3106d4081fbaa584ac4e27b49bc02266468d3919db03/librt-0.7.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6488e69d408b492e08bfb68f20c4a899a354b4386a446ecd490baff8d0862720", size = 174565, upload-time = "2025-12-06T19:03:32.818Z" }, - { url = "https://files.pythonhosted.org/packages/42/54/0578a78b587e5aa22486af34239a052c6366835b55fc307bc64380229e3f/librt-0.7.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ed028fc3d41adda916320712838aec289956c89b4f0a361ceadf83a53b4c047a", size = 195247, upload-time = "2025-12-06T19:03:34.434Z" }, - { url = "https://files.pythonhosted.org/packages/b5/0a/ee747cd999753dd9447e50b98fc36ee433b6c841a42dbf6d47b64b32a56e/librt-0.7.3-cp311-cp311-win32.whl", hash = "sha256:2cf9d73499486ce39eebbff5f42452518cc1f88d8b7ea4a711ab32962b176ee2", size = 47514, upload-time = "2025-12-06T19:03:35.959Z" }, - { url = "https://files.pythonhosted.org/packages/ec/af/8b13845178dec488e752878f8e290f8f89e7e34ae1528b70277aa1a6dd1e/librt-0.7.3-cp311-cp311-win_amd64.whl", hash = "sha256:35f1609e3484a649bb80431310ddbec81114cd86648f1d9482bc72a3b86ded2e", size = 54695, upload-time = "2025-12-06T19:03:36.956Z" }, - { url = "https://files.pythonhosted.org/packages/02/7a/ae59578501b1a25850266778f59279f4f3e726acc5c44255bfcb07b4bc57/librt-0.7.3-cp311-cp311-win_arm64.whl", hash = "sha256:550fdbfbf5bba6a2960b27376ca76d6aaa2bd4b1a06c4255edd8520c306fcfc0", size = 48142, upload-time = "2025-12-06T19:03:38.263Z" }, - { url = "https://files.pythonhosted.org/packages/29/90/ed8595fa4e35b6020317b5ea8d226a782dcbac7a997c19ae89fb07a41c66/librt-0.7.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0fa9ac2e49a6bee56e47573a6786cb635e128a7b12a0dc7851090037c0d397a3", size = 55687, upload-time = "2025-12-06T19:03:39.245Z" }, - { url = "https://files.pythonhosted.org/packages/dd/f6/6a20702a07b41006cb001a759440cb6b5362530920978f64a2b2ae2bf729/librt-0.7.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e980cf1ed1a2420a6424e2ed884629cdead291686f1048810a817de07b5eb18", size = 57127, upload-time = "2025-12-06T19:03:40.3Z" }, - { url = "https://files.pythonhosted.org/packages/79/f3/b0c4703d5ffe9359b67bb2ccb86c42d4e930a363cfc72262ac3ba53cff3e/librt-0.7.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e094e445c37c57e9ec612847812c301840239d34ccc5d153a982fa9814478c60", size = 165336, upload-time = "2025-12-06T19:03:41.369Z" }, - { url = "https://files.pythonhosted.org/packages/02/69/3ba05b73ab29ccbe003856232cea4049769be5942d799e628d1470ed1694/librt-0.7.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aca73d70c3f553552ba9133d4a09e767dcfeee352d8d8d3eb3f77e38a3beb3ed", size = 174237, upload-time = "2025-12-06T19:03:42.44Z" }, - { url = "https://files.pythonhosted.org/packages/22/ad/d7c2671e7bf6c285ef408aa435e9cd3fdc06fd994601e1f2b242df12034f/librt-0.7.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c634a0a6db395fdaba0361aa78395597ee72c3aad651b9a307a3a7eaf5efd67e", size = 189017, upload-time = "2025-12-06T19:03:44.01Z" }, - { url = "https://files.pythonhosted.org/packages/f4/94/d13f57193148004592b618555f296b41d2d79b1dc814ff8b3273a0bf1546/librt-0.7.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a59a69deeb458c858b8fea6acf9e2acd5d755d76cd81a655256bc65c20dfff5b", size = 183983, upload-time = "2025-12-06T19:03:45.834Z" }, - { url = "https://files.pythonhosted.org/packages/02/10/b612a9944ebd39fa143c7e2e2d33f2cb790205e025ddd903fb509a3a3bb3/librt-0.7.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d91e60ac44bbe3a77a67af4a4c13114cbe9f6d540337ce22f2c9eaf7454ca71f", size = 177602, upload-time = "2025-12-06T19:03:46.944Z" }, - { url = "https://files.pythonhosted.org/packages/1f/48/77bc05c4cc232efae6c5592c0095034390992edbd5bae8d6cf1263bb7157/librt-0.7.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:703456146dc2bf430f7832fd1341adac5c893ec3c1430194fdcefba00012555c", size = 199282, upload-time = "2025-12-06T19:03:48.069Z" }, - { url = "https://files.pythonhosted.org/packages/12/aa/05916ccd864227db1ffec2a303ae34f385c6b22d4e7ce9f07054dbcf083c/librt-0.7.3-cp312-cp312-win32.whl", hash = "sha256:b7c1239b64b70be7759554ad1a86288220bbb04d68518b527783c4ad3fb4f80b", size = 47879, upload-time = "2025-12-06T19:03:49.289Z" }, - { url = "https://files.pythonhosted.org/packages/50/92/7f41c42d31ea818b3c4b9cc1562e9714bac3c676dd18f6d5dd3d0f2aa179/librt-0.7.3-cp312-cp312-win_amd64.whl", hash = "sha256:ef59c938f72bdbc6ab52dc50f81d0637fde0f194b02d636987cea2ab30f8f55a", size = 54972, upload-time = "2025-12-06T19:03:50.335Z" }, - { url = "https://files.pythonhosted.org/packages/3f/dc/53582bbfb422311afcbc92adb75711f04e989cec052f08ec0152fbc36c9c/librt-0.7.3-cp312-cp312-win_arm64.whl", hash = "sha256:ff21c554304e8226bf80c3a7754be27c6c3549a9fec563a03c06ee8f494da8fc", size = 48338, upload-time = "2025-12-06T19:03:51.431Z" }, - { url = "https://files.pythonhosted.org/packages/93/7d/e0ce1837dfb452427db556e6d4c5301ba3b22fe8de318379fbd0593759b9/librt-0.7.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56f2a47beda8409061bc1c865bef2d4bd9ff9255219402c0817e68ab5ad89aed", size = 55742, upload-time = "2025-12-06T19:03:52.459Z" }, - { url = "https://files.pythonhosted.org/packages/be/c0/3564262301e507e1d5cf31c7d84cb12addf0d35e05ba53312494a2eba9a4/librt-0.7.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:14569ac5dd38cfccf0a14597a88038fb16811a6fede25c67b79c6d50fc2c8fdc", size = 57163, upload-time = "2025-12-06T19:03:53.516Z" }, - { url = "https://files.pythonhosted.org/packages/be/ac/245e72b7e443d24a562f6047563c7f59833384053073ef9410476f68505b/librt-0.7.3-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6038ccbd5968325a5d6fd393cf6e00b622a8de545f0994b89dd0f748dcf3e19e", size = 165840, upload-time = "2025-12-06T19:03:54.918Z" }, - { url = "https://files.pythonhosted.org/packages/98/af/587e4491f40adba066ba39a450c66bad794c8d92094f936a201bfc7c2b5f/librt-0.7.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d39079379a9a28e74f4d57dc6357fa310a1977b51ff12239d7271ec7e71d67f5", size = 174827, upload-time = "2025-12-06T19:03:56.082Z" }, - { url = "https://files.pythonhosted.org/packages/78/21/5b8c60ea208bc83dd00421022a3874330685d7e856404128dc3728d5d1af/librt-0.7.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8837d5a52a2d7aa9f4c3220a8484013aed1d8ad75240d9a75ede63709ef89055", size = 189612, upload-time = "2025-12-06T19:03:57.507Z" }, - { url = "https://files.pythonhosted.org/packages/da/2f/8b819169ef696421fb81cd04c6cdf225f6e96f197366001e9d45180d7e9e/librt-0.7.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:399bbd7bcc1633c3e356ae274a1deb8781c7bf84d9c7962cc1ae0c6e87837292", size = 184584, upload-time = "2025-12-06T19:03:58.686Z" }, - { url = "https://files.pythonhosted.org/packages/6c/fc/af9d225a9395b77bd7678362cb055d0b8139c2018c37665de110ca388022/librt-0.7.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8d8cf653e798ee4c4e654062b633db36984a1572f68c3aa25e364a0ddfbbb910", size = 178269, upload-time = "2025-12-06T19:03:59.769Z" }, - { url = "https://files.pythonhosted.org/packages/6c/d8/7b4fa1683b772966749d5683aa3fd605813defffe157833a8fa69cc89207/librt-0.7.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2f03484b54bf4ae80ab2e504a8d99d20d551bfe64a7ec91e218010b467d77093", size = 199852, upload-time = "2025-12-06T19:04:00.901Z" }, - { url = "https://files.pythonhosted.org/packages/77/e8/4598413aece46ca38d9260ef6c51534bd5f34b5c21474fcf210ce3a02123/librt-0.7.3-cp313-cp313-win32.whl", hash = "sha256:44b3689b040df57f492e02cd4f0bacd1b42c5400e4b8048160c9d5e866de8abe", size = 47936, upload-time = "2025-12-06T19:04:02.054Z" }, - { url = "https://files.pythonhosted.org/packages/af/80/ac0e92d5ef8c6791b3e2c62373863827a279265e0935acdf807901353b0e/librt-0.7.3-cp313-cp313-win_amd64.whl", hash = "sha256:6b407c23f16ccc36614c136251d6b32bf30de7a57f8e782378f1107be008ddb0", size = 54965, upload-time = "2025-12-06T19:04:03.224Z" }, - { url = "https://files.pythonhosted.org/packages/f1/fd/042f823fcbff25c1449bb4203a29919891ca74141b68d3a5f6612c4ce283/librt-0.7.3-cp313-cp313-win_arm64.whl", hash = "sha256:abfc57cab3c53c4546aee31859ef06753bfc136c9d208129bad23e2eca39155a", size = 48350, upload-time = "2025-12-06T19:04:04.234Z" }, - { url = "https://files.pythonhosted.org/packages/3e/ae/c6ecc7bb97134a71b5241e8855d39964c0e5f4d96558f0d60593892806d2/librt-0.7.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:120dd21d46ff875e849f1aae19346223cf15656be489242fe884036b23d39e93", size = 55175, upload-time = "2025-12-06T19:04:05.308Z" }, - { url = "https://files.pythonhosted.org/packages/cf/bc/2cc0cb0ab787b39aa5c7645cd792433c875982bdf12dccca558b89624594/librt-0.7.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1617bea5ab31266e152871208502ee943cb349c224846928a1173c864261375e", size = 56881, upload-time = "2025-12-06T19:04:06.674Z" }, - { url = "https://files.pythonhosted.org/packages/8e/87/397417a386190b70f5bf26fcedbaa1515f19dce33366e2684c6b7ee83086/librt-0.7.3-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:93b2a1f325fefa1482516ced160c8c7b4b8d53226763fa6c93d151fa25164207", size = 163710, upload-time = "2025-12-06T19:04:08.437Z" }, - { url = "https://files.pythonhosted.org/packages/c9/37/7338f85b80e8a17525d941211451199845093ca242b32efbf01df8531e72/librt-0.7.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d4801db8354436fd3936531e7f0e4feb411f62433a6b6cb32bb416e20b529f", size = 172471, upload-time = "2025-12-06T19:04:10.124Z" }, - { url = "https://files.pythonhosted.org/packages/3b/e0/741704edabbfae2c852fedc1b40d9ed5a783c70ed3ed8e4fe98f84b25d13/librt-0.7.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11ad45122bbed42cfc8b0597450660126ef28fd2d9ae1a219bc5af8406f95678", size = 186804, upload-time = "2025-12-06T19:04:11.586Z" }, - { url = "https://files.pythonhosted.org/packages/f4/d1/0a82129d6ba242f3be9af34815be089f35051bc79619f5c27d2c449ecef6/librt-0.7.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:6b4e7bff1d76dd2b46443078519dc75df1b5e01562345f0bb740cea5266d8218", size = 181817, upload-time = "2025-12-06T19:04:12.802Z" }, - { url = "https://files.pythonhosted.org/packages/4f/32/704f80bcf9979c68d4357c46f2af788fbf9d5edda9e7de5786ed2255e911/librt-0.7.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:d86f94743a11873317094326456b23f8a5788bad9161fd2f0e52088c33564620", size = 175602, upload-time = "2025-12-06T19:04:14.004Z" }, - { url = "https://files.pythonhosted.org/packages/f7/6d/4355cfa0fae0c062ba72f541d13db5bc575770125a7ad3d4f46f4109d305/librt-0.7.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:754a0d09997095ad764ccef050dd5bf26cbf457aab9effcba5890dad081d879e", size = 196497, upload-time = "2025-12-06T19:04:15.487Z" }, - { url = "https://files.pythonhosted.org/packages/2e/eb/ac6d8517d44209e5a712fde46f26d0055e3e8969f24d715f70bd36056230/librt-0.7.3-cp314-cp314-win32.whl", hash = "sha256:fbd7351d43b80d9c64c3cfcb50008f786cc82cba0450e8599fdd64f264320bd3", size = 44678, upload-time = "2025-12-06T19:04:16.688Z" }, - { url = "https://files.pythonhosted.org/packages/e9/93/238f026d141faf9958da588c761a0812a1a21c98cc54a76f3608454e4e59/librt-0.7.3-cp314-cp314-win_amd64.whl", hash = "sha256:d376a35c6561e81d2590506804b428fc1075fcc6298fc5bb49b771534c0ba010", size = 51689, upload-time = "2025-12-06T19:04:17.726Z" }, - { url = "https://files.pythonhosted.org/packages/52/44/43f462ad9dcf9ed7d3172fe2e30d77b980956250bd90e9889a9cca93df2a/librt-0.7.3-cp314-cp314-win_arm64.whl", hash = "sha256:cbdb3f337c88b43c3b49ca377731912c101178be91cb5071aac48faa898e6f8e", size = 44662, upload-time = "2025-12-06T19:04:18.771Z" }, - { url = "https://files.pythonhosted.org/packages/1d/35/fed6348915f96b7323241de97f26e2af481e95183b34991df12fd5ce31b1/librt-0.7.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9f0e0927efe87cd42ad600628e595a1a0aa1c64f6d0b55f7e6059079a428641a", size = 57347, upload-time = "2025-12-06T19:04:19.812Z" }, - { url = "https://files.pythonhosted.org/packages/9a/f2/045383ccc83e3fea4fba1b761796584bc26817b6b2efb6b8a6731431d16f/librt-0.7.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:020c6db391268bcc8ce75105cb572df8cb659a43fd347366aaa407c366e5117a", size = 59223, upload-time = "2025-12-06T19:04:20.862Z" }, - { url = "https://files.pythonhosted.org/packages/77/3f/c081f8455ab1d7f4a10dbe58463ff97119272ff32494f21839c3b9029c2c/librt-0.7.3-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7af7785f5edd1f418da09a8cdb9ec84b0213e23d597413e06525340bcce1ea4f", size = 183861, upload-time = "2025-12-06T19:04:21.963Z" }, - { url = "https://files.pythonhosted.org/packages/1d/f5/73c5093c22c31fbeaebc25168837f05ebfd8bf26ce00855ef97a5308f36f/librt-0.7.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ccadf260bb46a61b9c7e89e2218f6efea9f3eeaaab4e3d1f58571890e54858e", size = 194594, upload-time = "2025-12-06T19:04:23.14Z" }, - { url = "https://files.pythonhosted.org/packages/78/b8/d5f17d4afe16612a4a94abfded94c16c5a033f183074fb130dfe56fc1a42/librt-0.7.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9883b2d819ce83f87ba82a746c81d14ada78784db431e57cc9719179847376e", size = 206759, upload-time = "2025-12-06T19:04:24.328Z" }, - { url = "https://files.pythonhosted.org/packages/36/2e/021765c1be85ee23ffd5b5b968bb4cba7526a4db2a0fc27dcafbdfc32da7/librt-0.7.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:59cb0470612d21fa1efddfa0dd710756b50d9c7fb6c1236bbf8ef8529331dc70", size = 203210, upload-time = "2025-12-06T19:04:25.544Z" }, - { url = "https://files.pythonhosted.org/packages/77/f0/9923656e42da4fd18c594bd08cf6d7e152d4158f8b808e210d967f0dcceb/librt-0.7.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:1fe603877e1865b5fd047a5e40379509a4a60204aa7aa0f72b16f7a41c3f0712", size = 196708, upload-time = "2025-12-06T19:04:26.725Z" }, - { url = "https://files.pythonhosted.org/packages/fc/0b/0708b886ac760e64d6fbe7e16024e4be3ad1a3629d19489a97e9cf4c3431/librt-0.7.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5460d99ed30f043595bbdc888f542bad2caeb6226b01c33cda3ae444e8f82d42", size = 217212, upload-time = "2025-12-06T19:04:27.892Z" }, - { url = "https://files.pythonhosted.org/packages/5d/7f/12a73ff17bca4351e73d585dd9ebf46723c4a8622c4af7fe11a2e2d011ff/librt-0.7.3-cp314-cp314t-win32.whl", hash = "sha256:d09f677693328503c9e492e33e9601464297c01f9ebd966ea8fc5308f3069bfd", size = 45586, upload-time = "2025-12-06T19:04:29.116Z" }, - { url = "https://files.pythonhosted.org/packages/e2/df/8decd032ac9b995e4f5606cde783711a71094128d88d97a52e397daf2c89/librt-0.7.3-cp314-cp314t-win_amd64.whl", hash = "sha256:25711f364c64cab2c910a0247e90b51421e45dbc8910ceeb4eac97a9e132fc6f", size = 53002, upload-time = "2025-12-06T19:04:30.173Z" }, - { url = "https://files.pythonhosted.org/packages/de/0c/6605b6199de8178afe7efc77ca1d8e6db00453bc1d3349d27605c0f42104/librt-0.7.3-cp314-cp314t-win_arm64.whl", hash = "sha256:a9f9b661f82693eb56beb0605156c7fca57f535704ab91837405913417d6990b", size = 45647, upload-time = "2025-12-06T19:04:31.302Z" }, - { url = "https://files.pythonhosted.org/packages/e1/70/b3f19e3bb34f44e218c8271dc0b2b14eb6b183fbccbececf94c71e2b5e69/librt-0.7.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd8551aa21df6c60baa2624fd086ae7486bdde00c44097b32e1d1b1966e365e0", size = 54850, upload-time = "2025-12-06T19:04:32.742Z" }, - { url = "https://files.pythonhosted.org/packages/a0/97/6599ed7726aaa9b5bacea206d5861b94e76866240e2f394a59594bf3db46/librt-0.7.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6eb9295c730e26b849ed1f4022735f36863eb46b14b6e10604c1c39b8b5efaea", size = 56797, upload-time = "2025-12-06T19:04:34.193Z" }, - { url = "https://files.pythonhosted.org/packages/33/83/216db13224a6f688787f456909bbc50f9d951c0f4bea8ba38a2eb931d581/librt-0.7.3-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3edbf257c40d21a42615e9e332a6b10a8bacaaf58250aed8552a14a70efd0d65", size = 159681, upload-time = "2025-12-06T19:04:35.554Z" }, - { url = "https://files.pythonhosted.org/packages/83/23/0a490c8ba3bc90090647ac7b9b3c63c16af7378bcabe3ff4c7d7890d66e5/librt-0.7.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b29e97273bd6999e2bfe9fe3531b1f4f64effd28327bced048a33e49b99674a", size = 168505, upload-time = "2025-12-06T19:04:36.748Z" }, - { url = "https://files.pythonhosted.org/packages/5e/16/b47c60805285caa06728d61d933fdd6db5b7321f375ce496cb7fdbeb1a44/librt-0.7.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e40520c37926166c24d0c2e0f3bc3a5f46646c34bdf7b4ea9747c297d6ee809", size = 182234, upload-time = "2025-12-06T19:04:37.889Z" }, - { url = "https://files.pythonhosted.org/packages/2d/2f/bef211d7f0d55fa2484d2c644b2cdae8c9c5eec050754b0516e6582ad452/librt-0.7.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6bdd9adfca615903578d2060ee8a6eb1c24eaf54919ff0ddc820118e5718931b", size = 178276, upload-time = "2025-12-06T19:04:39.408Z" }, - { url = "https://files.pythonhosted.org/packages/3d/dd/5a3e7762b086b62fabb31fd4deaaf3ba888cfdd3b8f2e3247f076c18a6ff/librt-0.7.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f57aca20e637750a2c18d979f7096e2c2033cc40cf7ed201494318de1182f135", size = 172602, upload-time = "2025-12-06T19:04:40.619Z" }, - { url = "https://files.pythonhosted.org/packages/fe/d8/533d5bfd5b377eb03ed54101814b530fc1f9bbe0e79971c641a3f15bfb33/librt-0.7.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cad9971881e4fec00d96af7eaf4b63aa7a595696fc221808b0d3ce7ca9743258", size = 192741, upload-time = "2025-12-06T19:04:41.738Z" }, - { url = "https://files.pythonhosted.org/packages/9f/69/0b87ce8e95f65ebc864f390f1139b8fe9fac6fb64b797307447b1719610c/librt-0.7.3-cp39-cp39-win32.whl", hash = "sha256:170cdb8436188347af17bf9cccf3249ba581c933ed56d926497119d4cf730cec", size = 47154, upload-time = "2025-12-06T19:04:42.96Z" }, - { url = "https://files.pythonhosted.org/packages/c0/1c/070dee0add2d6e742be4d8b965d5a37c24562b43e8ef7deba8ed5b5d3c0f/librt-0.7.3-cp39-cp39-win_amd64.whl", hash = "sha256:b278a9248a4e3260fee3db7613772ca9ab6763a129d6d6f29555e2f9b168216d", size = 54339, upload-time = "2025-12-06T19:04:44.415Z" }, +version = "0.7.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/93/e4/b59bdf1197fdf9888452ea4d2048cdad61aef85eb83e99dc52551d7fdc04/librt-0.7.4.tar.gz", hash = "sha256:3871af56c59864d5fd21d1ac001eb2fb3b140d52ba0454720f2e4a19812404ba", size = 145862, upload-time = "2025-12-15T16:52:43.862Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/1e/3e61dff6c07a3b400fe907d3164b92b3b3023ef86eac1ee236869dc276f7/librt-0.7.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dc300cb5a5a01947b1ee8099233156fdccd5001739e5f596ecfbc0dab07b5a3b", size = 54708, upload-time = "2025-12-15T16:51:03.752Z" }, + { url = "https://files.pythonhosted.org/packages/87/98/ab2428b0a80d0fd67decaeea84a5ec920e3dd4d95ecfd074c71f51bd7315/librt-0.7.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee8d3323d921e0f6919918a97f9b5445a7dfe647270b2629ec1008aa676c0bc0", size = 56656, upload-time = "2025-12-15T16:51:05.038Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ce/de1fad3a16e4fb5b6605bd6cbe6d0e5207cc8eca58993835749a1da0812b/librt-0.7.4-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:95cb80854a355b284c55f79674f6187cc9574df4dc362524e0cce98c89ee8331", size = 161024, upload-time = "2025-12-15T16:51:06.31Z" }, + { url = "https://files.pythonhosted.org/packages/88/00/ddfcdc1147dd7fb68321d7b064b12f0b9101d85f466a46006f86096fde8d/librt-0.7.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ca1caedf8331d8ad6027f93b52d68ed8f8009f5c420c246a46fe9d3be06be0f", size = 169529, upload-time = "2025-12-15T16:51:07.907Z" }, + { url = "https://files.pythonhosted.org/packages/dd/b3/915702c7077df2483b015030d1979404474f490fe9a071e9576f7b26fef6/librt-0.7.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2a6f1236151e6fe1da289351b5b5bce49651c91554ecc7b70a947bced6fe212", size = 183270, upload-time = "2025-12-15T16:51:09.164Z" }, + { url = "https://files.pythonhosted.org/packages/45/19/ab2f217e8ec509fca4ea9e2e5022b9f72c1a7b7195f5a5770d299df807ea/librt-0.7.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7766b57aeebaf3f1dac14fdd4a75c9a61f2ed56d8ebeefe4189db1cb9d2a3783", size = 179038, upload-time = "2025-12-15T16:51:10.538Z" }, + { url = "https://files.pythonhosted.org/packages/10/1c/d40851d187662cf50312ebbc0b277c7478dd78dbaaf5ee94056f1d7f2f83/librt-0.7.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1c4c89fb01157dd0a3bfe9e75cd6253b0a1678922befcd664eca0772a4c6c979", size = 173502, upload-time = "2025-12-15T16:51:11.888Z" }, + { url = "https://files.pythonhosted.org/packages/07/52/d5880835c772b22c38db18660420fa6901fd9e9a433b65f0ba9b0f4da764/librt-0.7.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f7fa8beef580091c02b4fd26542de046b2abfe0aaefa02e8bcf68acb7618f2b3", size = 193570, upload-time = "2025-12-15T16:51:13.168Z" }, + { url = "https://files.pythonhosted.org/packages/f1/35/22d3c424b82f86ce019c0addadf001d459dfac8036aecc07fadc5c541053/librt-0.7.4-cp310-cp310-win32.whl", hash = "sha256:543c42fa242faae0466fe72d297976f3c710a357a219b1efde3a0539a68a6997", size = 42596, upload-time = "2025-12-15T16:51:14.422Z" }, + { url = "https://files.pythonhosted.org/packages/95/b1/e7c316ac5fe60ac1fdfe515198087205220803c4cf923ee63e1cb8380b17/librt-0.7.4-cp310-cp310-win_amd64.whl", hash = "sha256:25cc40d8eb63f0a7ea4c8f49f524989b9df901969cb860a2bc0e4bad4b8cb8a8", size = 48972, upload-time = "2025-12-15T16:51:15.516Z" }, + { url = "https://files.pythonhosted.org/packages/84/64/44089b12d8b4714a7f0e2f33fb19285ba87702d4be0829f20b36ebeeee07/librt-0.7.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3485b9bb7dfa66167d5500ffdafdc35415b45f0da06c75eb7df131f3357b174a", size = 54709, upload-time = "2025-12-15T16:51:16.699Z" }, + { url = "https://files.pythonhosted.org/packages/26/ef/6fa39fb5f37002f7d25e0da4f24d41b457582beea9369eeb7e9e73db5508/librt-0.7.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:188b4b1a770f7f95ea035d5bbb9d7367248fc9d12321deef78a269ebf46a5729", size = 56663, upload-time = "2025-12-15T16:51:17.856Z" }, + { url = "https://files.pythonhosted.org/packages/9d/e4/cbaca170a13bee2469c90df9e47108610b4422c453aea1aec1779ac36c24/librt-0.7.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1b668b1c840183e4e38ed5a99f62fac44c3a3eef16870f7f17cfdfb8b47550ed", size = 161703, upload-time = "2025-12-15T16:51:19.421Z" }, + { url = "https://files.pythonhosted.org/packages/d0/32/0b2296f9cc7e693ab0d0835e355863512e5eac90450c412777bd699c76ae/librt-0.7.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0e8f864b521f6cfedb314d171630f827efee08f5c3462bcbc2244ab8e1768cd6", size = 171027, upload-time = "2025-12-15T16:51:20.721Z" }, + { url = "https://files.pythonhosted.org/packages/d8/33/c70b6d40f7342716e5f1353c8da92d9e32708a18cbfa44897a93ec2bf879/librt-0.7.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4df7c9def4fc619a9c2ab402d73a0c5b53899abe090e0100323b13ccb5a3dd82", size = 184700, upload-time = "2025-12-15T16:51:22.272Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c8/555c405155da210e4c4113a879d378f54f850dbc7b794e847750a8fadd43/librt-0.7.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f79bc3595b6ed159a1bf0cdc70ed6ebec393a874565cab7088a219cca14da727", size = 180719, upload-time = "2025-12-15T16:51:23.561Z" }, + { url = "https://files.pythonhosted.org/packages/6b/88/34dc1f1461c5613d1b73f0ecafc5316cc50adcc1b334435985b752ed53e5/librt-0.7.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77772a4b8b5f77d47d883846928c36d730b6e612a6388c74cba33ad9eb149c11", size = 174535, upload-time = "2025-12-15T16:51:25.031Z" }, + { url = "https://files.pythonhosted.org/packages/b6/5a/f3fafe80a221626bcedfa9fe5abbf5f04070989d44782f579b2d5920d6d0/librt-0.7.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:064a286e6ab0b4c900e228ab4fa9cb3811b4b83d3e0cc5cd816b2d0f548cb61c", size = 195236, upload-time = "2025-12-15T16:51:26.328Z" }, + { url = "https://files.pythonhosted.org/packages/d8/77/5c048d471ce17f4c3a6e08419be19add4d291e2f7067b877437d482622ac/librt-0.7.4-cp311-cp311-win32.whl", hash = "sha256:42da201c47c77b6cc91fc17e0e2b330154428d35d6024f3278aa2683e7e2daf2", size = 42930, upload-time = "2025-12-15T16:51:27.853Z" }, + { url = "https://files.pythonhosted.org/packages/fb/3b/514a86305a12c3d9eac03e424b07cd312c7343a9f8a52719aa079590a552/librt-0.7.4-cp311-cp311-win_amd64.whl", hash = "sha256:d31acb5886c16ae1711741f22504195af46edec8315fe69b77e477682a87a83e", size = 49240, upload-time = "2025-12-15T16:51:29.037Z" }, + { url = "https://files.pythonhosted.org/packages/ba/01/3b7b1914f565926b780a734fac6e9a4d2c7aefe41f4e89357d73697a9457/librt-0.7.4-cp311-cp311-win_arm64.whl", hash = "sha256:114722f35093da080a333b3834fff04ef43147577ed99dd4db574b03a5f7d170", size = 42613, upload-time = "2025-12-15T16:51:30.194Z" }, + { url = "https://files.pythonhosted.org/packages/f3/e7/b805d868d21f425b7e76a0ea71a2700290f2266a4f3c8357fcf73efc36aa/librt-0.7.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7dd3b5c37e0fb6666c27cf4e2c88ae43da904f2155c4cfc1e5a2fdce3b9fcf92", size = 55688, upload-time = "2025-12-15T16:51:31.571Z" }, + { url = "https://files.pythonhosted.org/packages/59/5e/69a2b02e62a14cfd5bfd9f1e9adea294d5bcfeea219c7555730e5d068ee4/librt-0.7.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9c5de1928c486201b23ed0cc4ac92e6e07be5cd7f3abc57c88a9cf4f0f32108", size = 57141, upload-time = "2025-12-15T16:51:32.714Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6b/05dba608aae1272b8ea5ff8ef12c47a4a099a04d1e00e28a94687261d403/librt-0.7.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:078ae52ffb3f036396cc4aed558e5b61faedd504a3c1f62b8ae34bf95ae39d94", size = 165322, upload-time = "2025-12-15T16:51:33.986Z" }, + { url = "https://files.pythonhosted.org/packages/8f/bc/199533d3fc04a4cda8d7776ee0d79955ab0c64c79ca079366fbc2617e680/librt-0.7.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce58420e25097b2fc201aef9b9f6d65df1eb8438e51154e1a7feb8847e4a55ab", size = 174216, upload-time = "2025-12-15T16:51:35.384Z" }, + { url = "https://files.pythonhosted.org/packages/62/ec/09239b912a45a8ed117cb4a6616d9ff508f5d3131bd84329bf2f8d6564f1/librt-0.7.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b719c8730c02a606dc0e8413287e8e94ac2d32a51153b300baf1f62347858fba", size = 189005, upload-time = "2025-12-15T16:51:36.687Z" }, + { url = "https://files.pythonhosted.org/packages/46/2e/e188313d54c02f5b0580dd31476bb4b0177514ff8d2be9f58d4a6dc3a7ba/librt-0.7.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3749ef74c170809e6dee68addec9d2458700a8de703de081c888e92a8b015cf9", size = 183960, upload-time = "2025-12-15T16:51:37.977Z" }, + { url = "https://files.pythonhosted.org/packages/eb/84/f1d568d254518463d879161d3737b784137d236075215e56c7c9be191cee/librt-0.7.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b35c63f557653c05b5b1b6559a074dbabe0afee28ee2a05b6c9ba21ad0d16a74", size = 177609, upload-time = "2025-12-15T16:51:40.584Z" }, + { url = "https://files.pythonhosted.org/packages/5d/43/060bbc1c002f0d757c33a1afe6bf6a565f947a04841139508fc7cef6c08b/librt-0.7.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1ef704e01cb6ad39ad7af668d51677557ca7e5d377663286f0ee1b6b27c28e5f", size = 199269, upload-time = "2025-12-15T16:51:41.879Z" }, + { url = "https://files.pythonhosted.org/packages/ff/7f/708f8f02d8012ee9f366c07ea6a92882f48bd06cc1ff16a35e13d0fbfb08/librt-0.7.4-cp312-cp312-win32.whl", hash = "sha256:c66c2b245926ec15188aead25d395091cb5c9df008d3b3207268cd65557d6286", size = 43186, upload-time = "2025-12-15T16:51:43.149Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a5/4e051b061c8b2509be31b2c7ad4682090502c0a8b6406edcf8c6b4fe1ef7/librt-0.7.4-cp312-cp312-win_amd64.whl", hash = "sha256:71a56f4671f7ff723451f26a6131754d7c1809e04e22ebfbac1db8c9e6767a20", size = 49455, upload-time = "2025-12-15T16:51:44.336Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d2/90d84e9f919224a3c1f393af1636d8638f54925fdc6cd5ee47f1548461e5/librt-0.7.4-cp312-cp312-win_arm64.whl", hash = "sha256:419eea245e7ec0fe664eb7e85e7ff97dcdb2513ca4f6b45a8ec4a3346904f95a", size = 42828, upload-time = "2025-12-15T16:51:45.498Z" }, + { url = "https://files.pythonhosted.org/packages/fe/4d/46a53ccfbb39fd0b493fd4496eb76f3ebc15bb3e45d8c2e695a27587edf5/librt-0.7.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d44a1b1ba44cbd2fc3cb77992bef6d6fdb1028849824e1dd5e4d746e1f7f7f0b", size = 55745, upload-time = "2025-12-15T16:51:46.636Z" }, + { url = "https://files.pythonhosted.org/packages/7f/2b/3ac7f5212b1828bf4f979cf87f547db948d3e28421d7a430d4db23346ce4/librt-0.7.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c9cab4b3de1f55e6c30a84c8cee20e4d3b2476f4d547256694a1b0163da4fe32", size = 57166, upload-time = "2025-12-15T16:51:48.219Z" }, + { url = "https://files.pythonhosted.org/packages/e8/99/6523509097cbe25f363795f0c0d1c6a3746e30c2994e25b5aefdab119b21/librt-0.7.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2857c875f1edd1feef3c371fbf830a61b632fb4d1e57160bb1e6a3206e6abe67", size = 165833, upload-time = "2025-12-15T16:51:49.443Z" }, + { url = "https://files.pythonhosted.org/packages/fe/35/323611e59f8fe032649b4fb7e77f746f96eb7588fcbb31af26bae9630571/librt-0.7.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b370a77be0a16e1ad0270822c12c21462dc40496e891d3b0caf1617c8cc57e20", size = 174818, upload-time = "2025-12-15T16:51:51.015Z" }, + { url = "https://files.pythonhosted.org/packages/41/e6/40fb2bb21616c6e06b6a64022802228066e9a31618f493e03f6b9661548a/librt-0.7.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d05acd46b9a52087bfc50c59dfdf96a2c480a601e8898a44821c7fd676598f74", size = 189607, upload-time = "2025-12-15T16:51:52.671Z" }, + { url = "https://files.pythonhosted.org/packages/32/48/1b47c7d5d28b775941e739ed2bfe564b091c49201b9503514d69e4ed96d7/librt-0.7.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:70969229cb23d9c1a80e14225838d56e464dc71fa34c8342c954fc50e7516dee", size = 184585, upload-time = "2025-12-15T16:51:54.027Z" }, + { url = "https://files.pythonhosted.org/packages/75/a6/ee135dfb5d3b54d5d9001dbe483806229c6beac3ee2ba1092582b7efeb1b/librt-0.7.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4450c354b89dbb266730893862dbff06006c9ed5b06b6016d529b2bf644fc681", size = 178249, upload-time = "2025-12-15T16:51:55.248Z" }, + { url = "https://files.pythonhosted.org/packages/04/87/d5b84ec997338be26af982bcd6679be0c1db9a32faadab1cf4bb24f9e992/librt-0.7.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:adefe0d48ad35b90b6f361f6ff5a1bd95af80c17d18619c093c60a20e7a5b60c", size = 199851, upload-time = "2025-12-15T16:51:56.933Z" }, + { url = "https://files.pythonhosted.org/packages/86/63/ba1333bf48306fe398e3392a7427ce527f81b0b79d0d91618c4610ce9d15/librt-0.7.4-cp313-cp313-win32.whl", hash = "sha256:21ea710e96c1e050635700695095962a22ea420d4b3755a25e4909f2172b4ff2", size = 43249, upload-time = "2025-12-15T16:51:58.498Z" }, + { url = "https://files.pythonhosted.org/packages/f9/8a/de2c6df06cdfa9308c080e6b060fe192790b6a48a47320b215e860f0e98c/librt-0.7.4-cp313-cp313-win_amd64.whl", hash = "sha256:772e18696cf5a64afee908662fbcb1f907460ddc851336ee3a848ef7684c8e1e", size = 49417, upload-time = "2025-12-15T16:51:59.618Z" }, + { url = "https://files.pythonhosted.org/packages/31/66/8ee0949efc389691381ed686185e43536c20e7ad880c122dd1f31e65c658/librt-0.7.4-cp313-cp313-win_arm64.whl", hash = "sha256:52e34c6af84e12921748c8354aa6acf1912ca98ba60cdaa6920e34793f1a0788", size = 42824, upload-time = "2025-12-15T16:52:00.784Z" }, + { url = "https://files.pythonhosted.org/packages/74/81/6921e65c8708eb6636bbf383aa77e6c7dad33a598ed3b50c313306a2da9d/librt-0.7.4-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4f1ee004942eaaed6e06c087d93ebc1c67e9a293e5f6b9b5da558df6bf23dc5d", size = 55191, upload-time = "2025-12-15T16:52:01.97Z" }, + { url = "https://files.pythonhosted.org/packages/0d/d6/3eb864af8a8de8b39cc8dd2e9ded1823979a27795d72c4eea0afa8c26c9f/librt-0.7.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d854c6dc0f689bad7ed452d2a3ecff58029d80612d336a45b62c35e917f42d23", size = 56898, upload-time = "2025-12-15T16:52:03.356Z" }, + { url = "https://files.pythonhosted.org/packages/49/bc/b1d4c0711fdf79646225d576faee8747b8528a6ec1ceb6accfd89ade7102/librt-0.7.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a4f7339d9e445280f23d63dea842c0c77379c4a47471c538fc8feedab9d8d063", size = 163725, upload-time = "2025-12-15T16:52:04.572Z" }, + { url = "https://files.pythonhosted.org/packages/2c/08/61c41cd8f0a6a41fc99ea78a2205b88187e45ba9800792410ed62f033584/librt-0.7.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39003fc73f925e684f8521b2dbf34f61a5deb8a20a15dcf53e0d823190ce8848", size = 172469, upload-time = "2025-12-15T16:52:05.863Z" }, + { url = "https://files.pythonhosted.org/packages/8b/c7/4ee18b4d57f01444230bc18cf59103aeab8f8c0f45e84e0e540094df1df1/librt-0.7.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6bb15ee29d95875ad697d449fe6071b67f730f15a6961913a2b0205015ca0843", size = 186804, upload-time = "2025-12-15T16:52:07.192Z" }, + { url = "https://files.pythonhosted.org/packages/a1/af/009e8ba3fbf830c936842da048eda1b34b99329f402e49d88fafff6525d1/librt-0.7.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:02a69369862099e37d00765583052a99d6a68af7e19b887e1b78fee0146b755a", size = 181807, upload-time = "2025-12-15T16:52:08.554Z" }, + { url = "https://files.pythonhosted.org/packages/85/26/51ae25f813656a8b117c27a974f25e8c1e90abcd5a791ac685bf5b489a1b/librt-0.7.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ec72342cc4d62f38b25a94e28b9efefce41839aecdecf5e9627473ed04b7be16", size = 175595, upload-time = "2025-12-15T16:52:10.186Z" }, + { url = "https://files.pythonhosted.org/packages/48/93/36d6c71f830305f88996b15c8e017aa8d1e03e2e947b40b55bbf1a34cf24/librt-0.7.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:776dbb9bfa0fc5ce64234b446995d8d9f04badf64f544ca036bd6cff6f0732ce", size = 196504, upload-time = "2025-12-15T16:52:11.472Z" }, + { url = "https://files.pythonhosted.org/packages/08/11/8299e70862bb9d704735bf132c6be09c17b00fbc7cda0429a9df222fdc1b/librt-0.7.4-cp314-cp314-win32.whl", hash = "sha256:0f8cac84196d0ffcadf8469d9ded4d4e3a8b1c666095c2a291e22bf58e1e8a9f", size = 39738, upload-time = "2025-12-15T16:52:12.962Z" }, + { url = "https://files.pythonhosted.org/packages/54/d5/656b0126e4e0f8e2725cd2d2a1ec40f71f37f6f03f135a26b663c0e1a737/librt-0.7.4-cp314-cp314-win_amd64.whl", hash = "sha256:037f5cb6fe5abe23f1dc058054d50e9699fcc90d0677eee4e4f74a8677636a1a", size = 45976, upload-time = "2025-12-15T16:52:14.441Z" }, + { url = "https://files.pythonhosted.org/packages/60/86/465ff07b75c1067da8fa7f02913c4ead096ef106cfac97a977f763783bfb/librt-0.7.4-cp314-cp314-win_arm64.whl", hash = "sha256:a5deebb53d7a4d7e2e758a96befcd8edaaca0633ae71857995a0f16033289e44", size = 39073, upload-time = "2025-12-15T16:52:15.621Z" }, + { url = "https://files.pythonhosted.org/packages/b3/a0/24941f85960774a80d4b3c2aec651d7d980466da8101cae89e8b032a3e21/librt-0.7.4-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b4c25312c7f4e6ab35ab16211bdf819e6e4eddcba3b2ea632fb51c9a2a97e105", size = 57369, upload-time = "2025-12-15T16:52:16.782Z" }, + { url = "https://files.pythonhosted.org/packages/77/a0/ddb259cae86ab415786c1547d0fe1b40f04a7b089f564fd5c0242a3fafb2/librt-0.7.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:618b7459bb392bdf373f2327e477597fff8f9e6a1878fffc1b711c013d1b0da4", size = 59230, upload-time = "2025-12-15T16:52:18.259Z" }, + { url = "https://files.pythonhosted.org/packages/31/11/77823cb530ab8a0c6fac848ac65b745be446f6f301753b8990e8809080c9/librt-0.7.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1437c3f72a30c7047f16fd3e972ea58b90172c3c6ca309645c1c68984f05526a", size = 183869, upload-time = "2025-12-15T16:52:19.457Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ce/157db3614cf3034b3f702ae5ba4fefda4686f11eea4b7b96542324a7a0e7/librt-0.7.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c96cb76f055b33308f6858b9b594618f1b46e147a4d03a4d7f0c449e304b9b95", size = 194606, upload-time = "2025-12-15T16:52:20.795Z" }, + { url = "https://files.pythonhosted.org/packages/30/ef/6ec4c7e3d6490f69a4fd2803516fa5334a848a4173eac26d8ee6507bff6e/librt-0.7.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:28f990e6821204f516d09dc39966ef8b84556ffd648d5926c9a3f681e8de8906", size = 206776, upload-time = "2025-12-15T16:52:22.229Z" }, + { url = "https://files.pythonhosted.org/packages/ad/22/750b37bf549f60a4782ab80e9d1e9c44981374ab79a7ea68670159905918/librt-0.7.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bc4aebecc79781a1b77d7d4e7d9fe080385a439e198d993b557b60f9117addaf", size = 203205, upload-time = "2025-12-15T16:52:23.603Z" }, + { url = "https://files.pythonhosted.org/packages/7a/87/2e8a0f584412a93df5faad46c5fa0a6825fdb5eba2ce482074b114877f44/librt-0.7.4-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:022cc673e69283a42621dd453e2407cf1647e77f8bd857d7ad7499901e62376f", size = 196696, upload-time = "2025-12-15T16:52:24.951Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ca/7bf78fa950e43b564b7de52ceeb477fb211a11f5733227efa1591d05a307/librt-0.7.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2b3ca211ae8ea540569e9c513da052699b7b06928dcda61247cb4f318122bdb5", size = 217191, upload-time = "2025-12-15T16:52:26.194Z" }, + { url = "https://files.pythonhosted.org/packages/d6/49/3732b0e8424ae35ad5c3166d9dd5bcdae43ce98775e0867a716ff5868064/librt-0.7.4-cp314-cp314t-win32.whl", hash = "sha256:8a461f6456981d8c8e971ff5a55f2e34f4e60871e665d2f5fde23ee74dea4eeb", size = 40276, upload-time = "2025-12-15T16:52:27.54Z" }, + { url = "https://files.pythonhosted.org/packages/35/d6/d8823e01bd069934525fddb343189c008b39828a429b473fb20d67d5cd36/librt-0.7.4-cp314-cp314t-win_amd64.whl", hash = "sha256:721a7b125a817d60bf4924e1eec2a7867bfcf64cfc333045de1df7a0629e4481", size = 46772, upload-time = "2025-12-15T16:52:28.653Z" }, + { url = "https://files.pythonhosted.org/packages/36/e9/a0aa60f5322814dd084a89614e9e31139702e342f8459ad8af1984a18168/librt-0.7.4-cp314-cp314t-win_arm64.whl", hash = "sha256:76b2ba71265c0102d11458879b4d53ccd0b32b0164d14deb8d2b598a018e502f", size = 39724, upload-time = "2025-12-15T16:52:29.836Z" }, + { url = "https://files.pythonhosted.org/packages/41/95/680a17d56b75ca3a29c1e4a1f29f5fe73bb75b8f1ad6f593f5bf608af0d2/librt-0.7.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6fc4aa67fedd827a601f97f0e61cc72711d0a9165f2c518e9a7c38fc1568b9ad", size = 54838, upload-time = "2025-12-15T16:52:30.967Z" }, + { url = "https://files.pythonhosted.org/packages/71/a7/59937bf107923bba5b9cb2907f1113ee370a130833986c4c3c89b23fa695/librt-0.7.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e710c983d29d9cc4da29113b323647db286eaf384746344f4a233708cca1a82c", size = 56808, upload-time = "2025-12-15T16:52:32.097Z" }, + { url = "https://files.pythonhosted.org/packages/6a/13/41752a15d65000a22660dbb0ac3226370f52063aa3c3e6ad7590c394cb07/librt-0.7.4-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:43a2515a33f2bc17b15f7fb49ff6426e49cb1d5b2539bc7f8126b9c5c7f37164", size = 159679, upload-time = "2025-12-15T16:52:33.293Z" }, + { url = "https://files.pythonhosted.org/packages/6c/98/e3350986cd9e90ca32c51d14575a767af435b07eddacdbc513d85b66d8fd/librt-0.7.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0fd766bb9ace3498f6b93d32f30c0e7c8ce6b727fecbc84d28160e217bb66254", size = 168514, upload-time = "2025-12-15T16:52:34.599Z" }, + { url = "https://files.pythonhosted.org/packages/a6/78/328993841687a6e4916d4213b64e0a6abad1517003ec0fc37e35a05976fe/librt-0.7.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce1b44091355b68cffd16e2abac07c1cafa953fa935852d3a4dd8975044ca3bf", size = 182229, upload-time = "2025-12-15T16:52:36.183Z" }, + { url = "https://files.pythonhosted.org/packages/59/42/c28819460b9780669420c1a5c2cacd1239e2cd952811bfa3b4f40be2f57b/librt-0.7.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5a72b905420c4bb2c10c87b5c09fe6faf4a76d64730e3802feef255e43dfbf5a", size = 178265, upload-time = "2025-12-15T16:52:37.495Z" }, + { url = "https://files.pythonhosted.org/packages/bf/11/2dd429f03a2bbf9f1be48d3a8264d963ced8acb9c0df3f23b3f024850a10/librt-0.7.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:07c4d7c9305e75a0edd3427b79c7bd1d019cd7eddaa7c89dbb10e0c7946bffbb", size = 172567, upload-time = "2025-12-15T16:52:39.129Z" }, + { url = "https://files.pythonhosted.org/packages/92/4e/71e099b7665ad8e5fd74ef63b1c9d9b2b9d28208901ffbe4684da7fb3521/librt-0.7.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2e734c2c54423c6dcc77f58a8585ba83b9f72e422f9edf09cab1096d4a4bdc82", size = 192744, upload-time = "2025-12-15T16:52:40.407Z" }, + { url = "https://files.pythonhosted.org/packages/b3/bd/06c59188a55a5b7fbb38d9b31f7ac32aabc66b912f0c3596c6c0fbfc1ffe/librt-0.7.4-cp39-cp39-win32.whl", hash = "sha256:a34ae11315d4e26326aaf04e21ccd8d9b7de983635fba38d73e203a9c8e3fe3d", size = 42551, upload-time = "2025-12-15T16:52:41.525Z" }, + { url = "https://files.pythonhosted.org/packages/93/c6/532c79748f64d520d130fd4b7aa9d313d6abc614854113bc4de29b6a1eda/librt-0.7.4-cp39-cp39-win_amd64.whl", hash = "sha256:7e4b5ffa1614ad4f32237d739699be444be28de95071bfa4e66a8da9fa777798", size = 48953, upload-time = "2025-12-15T16:52:42.653Z" }, ] [[package]] @@ -1631,6 +1699,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/25/58/3d9355385817d64fc582daec8592eb85f0ea39d577001a2f1ce0971c4b95/line_profiler-5.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:2cb6dced51bf906ddf2a8d75eda3523cee4cfb0102f54610e8f849630341a281", size = 461954, upload-time = "2025-07-23T20:15:40.281Z" }, ] +[[package]] +name = "linkify-it-py" +version = "2.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "uc-micro-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2a/ae/bb56c6828e4797ba5a4821eec7c43b8bf40f69cda4d4f5f8c8a2810ec96a/linkify-it-py-2.0.3.tar.gz", hash = "sha256:68cda27e162e9215c17d786649d1da0021a451bdc436ef9e0fa0ba5234b9b048", size = 27946, upload-time = "2024-02-04T14:48:04.179Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/1e/b832de447dee8b582cac175871d2f6c3d5077cc56d5575cadba1fd1cccfa/linkify_it_py-2.0.3-py3-none-any.whl", hash = "sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79", size = 19820, upload-time = "2024-02-04T14:48:02.496Z" }, +] + [[package]] name = "lsprotocol" version = "2025.0.0" @@ -1809,6 +1889,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, ] +[package.optional-dependencies] +linkify = [ + { name = "linkify-it-py", marker = "python_full_version < '3.10'" }, +] + [[package]] name = "markdown-it-py" version = "4.0.0" @@ -1828,6 +1913,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, ] +[package.optional-dependencies] +linkify = [ + { name = "linkify-it-py", marker = "python_full_version >= '3.10'" }, +] + [[package]] name = "markupsafe" version = "3.0.3" @@ -1936,6 +2026,41 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, ] +[[package]] +name = "mdit-py-plugins" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.9.2' and python_full_version < '3.10'", + "python_full_version < '3.9.2'", +] +dependencies = [ + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542, upload-time = "2024-09-09T20:27:49.564Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316, upload-time = "2024-09-09T20:27:48.397Z" }, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.14'", + "python_full_version == '3.13.*'", + "python_full_version == '3.12.*'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", +] +dependencies = [ + { name = "markdown-it-py", version = "4.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload-time = "2025-08-11T07:25:47.597Z" }, +] + [[package]] name = "mdurl" version = "0.1.2" @@ -1952,7 +2077,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0e/4a/c27b42ed9b1c7d13d9ba8b6905dece787d6259152f2309338aed29b2447b/ml_dtypes-0.5.4.tar.gz", hash = "sha256:8ab06a50fb9bf9666dd0fe5dfb4676fa2b0ac0f31ecff72a6c3af8e22c063453", size = 692314, upload-time = "2025-11-17T22:32:31.031Z" } wheels = [ @@ -2007,54 +2132,54 @@ wheels = [ [[package]] name = "mypy" -version = "1.19.0" +version = "1.19.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "librt" }, + { name = "librt", marker = "platform_python_implementation != 'PyPy'" }, { name = "mypy-extensions" }, { name = "pathspec" }, { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f9/b5/b58cdc25fadd424552804bf410855d52324183112aa004f0732c5f6324cf/mypy-1.19.0.tar.gz", hash = "sha256:f6b874ca77f733222641e5c46e4711648c4037ea13646fd0cdc814c2eaec2528", size = 3579025, upload-time = "2025-11-28T15:49:01.26Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/98/8f/55fb488c2b7dabd76e3f30c10f7ab0f6190c1fcbc3e97b1e588ec625bbe2/mypy-1.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6148ede033982a8c5ca1143de34c71836a09f105068aaa8b7d5edab2b053e6c8", size = 13093239, upload-time = "2025-11-28T15:45:11.342Z" }, - { url = "https://files.pythonhosted.org/packages/72/1b/278beea978456c56b3262266274f335c3ba5ff2c8108b3b31bec1ffa4c1d/mypy-1.19.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a9ac09e52bb0f7fb912f5d2a783345c72441a08ef56ce3e17c1752af36340a39", size = 12156128, upload-time = "2025-11-28T15:46:02.566Z" }, - { url = "https://files.pythonhosted.org/packages/21/f8/e06f951902e136ff74fd7a4dc4ef9d884faeb2f8eb9c49461235714f079f/mypy-1.19.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f7254c15ab3f8ed68f8e8f5cbe88757848df793e31c36aaa4d4f9783fd08ab", size = 12753508, upload-time = "2025-11-28T15:44:47.538Z" }, - { url = "https://files.pythonhosted.org/packages/67/5a/d035c534ad86e09cee274d53cf0fd769c0b29ca6ed5b32e205be3c06878c/mypy-1.19.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318ba74f75899b0e78b847d8c50821e4c9637c79d9a59680fc1259f29338cb3e", size = 13507553, upload-time = "2025-11-28T15:44:39.26Z" }, - { url = "https://files.pythonhosted.org/packages/6a/17/c4a5498e00071ef29e483a01558b285d086825b61cf1fb2629fbdd019d94/mypy-1.19.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cf7d84f497f78b682edd407f14a7b6e1a2212b433eedb054e2081380b7395aa3", size = 13792898, upload-time = "2025-11-28T15:44:31.102Z" }, - { url = "https://files.pythonhosted.org/packages/67/f6/bb542422b3ee4399ae1cdc463300d2d91515ab834c6233f2fd1d52fa21e0/mypy-1.19.0-cp310-cp310-win_amd64.whl", hash = "sha256:c3385246593ac2b97f155a0e9639be906e73534630f663747c71908dfbf26134", size = 10048835, upload-time = "2025-11-28T15:48:15.744Z" }, - { url = "https://files.pythonhosted.org/packages/0f/d2/010fb171ae5ac4a01cc34fbacd7544531e5ace95c35ca166dd8fd1b901d0/mypy-1.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a31e4c28e8ddb042c84c5e977e28a21195d086aaffaf08b016b78e19c9ef8106", size = 13010563, upload-time = "2025-11-28T15:48:23.975Z" }, - { url = "https://files.pythonhosted.org/packages/41/6b/63f095c9f1ce584fdeb595d663d49e0980c735a1d2004720ccec252c5d47/mypy-1.19.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34ec1ac66d31644f194b7c163d7f8b8434f1b49719d403a5d26c87fff7e913f7", size = 12077037, upload-time = "2025-11-28T15:47:51.582Z" }, - { url = "https://files.pythonhosted.org/packages/d7/83/6cb93d289038d809023ec20eb0b48bbb1d80af40511fa077da78af6ff7c7/mypy-1.19.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cb64b0ba5980466a0f3f9990d1c582bcab8db12e29815ecb57f1408d99b4bff7", size = 12680255, upload-time = "2025-11-28T15:46:57.628Z" }, - { url = "https://files.pythonhosted.org/packages/99/db/d217815705987d2cbace2edd9100926196d6f85bcb9b5af05058d6e3c8ad/mypy-1.19.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:120cffe120cca5c23c03c77f84abc0c14c5d2e03736f6c312480020082f1994b", size = 13421472, upload-time = "2025-11-28T15:47:59.655Z" }, - { url = "https://files.pythonhosted.org/packages/4e/51/d2beaca7c497944b07594f3f8aad8d2f0e8fc53677059848ae5d6f4d193e/mypy-1.19.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7a500ab5c444268a70565e374fc803972bfd1f09545b13418a5174e29883dab7", size = 13651823, upload-time = "2025-11-28T15:45:29.318Z" }, - { url = "https://files.pythonhosted.org/packages/aa/d1/7883dcf7644db3b69490f37b51029e0870aac4a7ad34d09ceae709a3df44/mypy-1.19.0-cp311-cp311-win_amd64.whl", hash = "sha256:c14a98bc63fd867530e8ec82f217dae29d0550c86e70debc9667fff1ec83284e", size = 10049077, upload-time = "2025-11-28T15:45:39.818Z" }, - { url = "https://files.pythonhosted.org/packages/11/7e/1afa8fb188b876abeaa14460dc4983f909aaacaa4bf5718c00b2c7e0b3d5/mypy-1.19.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0fb3115cb8fa7c5f887c8a8d81ccdcb94cff334684980d847e5a62e926910e1d", size = 13207728, upload-time = "2025-11-28T15:46:26.463Z" }, - { url = "https://files.pythonhosted.org/packages/b2/13/f103d04962bcbefb1644f5ccb235998b32c337d6c13145ea390b9da47f3e/mypy-1.19.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3e19e3b897562276bb331074d64c076dbdd3e79213f36eed4e592272dabd760", size = 12202945, upload-time = "2025-11-28T15:48:49.143Z" }, - { url = "https://files.pythonhosted.org/packages/e4/93/a86a5608f74a22284a8ccea8592f6e270b61f95b8588951110ad797c2ddd/mypy-1.19.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b9d491295825182fba01b6ffe2c6fe4e5a49dbf4e2bb4d1217b6ced3b4797bc6", size = 12718673, upload-time = "2025-11-28T15:47:37.193Z" }, - { url = "https://files.pythonhosted.org/packages/3d/58/cf08fff9ced0423b858f2a7495001fda28dc058136818ee9dffc31534ea9/mypy-1.19.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6016c52ab209919b46169651b362068f632efcd5eb8ef9d1735f6f86da7853b2", size = 13608336, upload-time = "2025-11-28T15:48:32.625Z" }, - { url = "https://files.pythonhosted.org/packages/64/ed/9c509105c5a6d4b73bb08733102a3ea62c25bc02c51bca85e3134bf912d3/mypy-1.19.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f188dcf16483b3e59f9278c4ed939ec0254aa8a60e8fc100648d9ab5ee95a431", size = 13833174, upload-time = "2025-11-28T15:45:48.091Z" }, - { url = "https://files.pythonhosted.org/packages/cd/71/01939b66e35c6f8cb3e6fdf0b657f0fd24de2f8ba5e523625c8e72328208/mypy-1.19.0-cp312-cp312-win_amd64.whl", hash = "sha256:0e3c3d1e1d62e678c339e7ade72746a9e0325de42cd2cccc51616c7b2ed1a018", size = 10112208, upload-time = "2025-11-28T15:46:41.702Z" }, - { url = "https://files.pythonhosted.org/packages/cb/0d/a1357e6bb49e37ce26fcf7e3cc55679ce9f4ebee0cd8b6ee3a0e301a9210/mypy-1.19.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7686ed65dbabd24d20066f3115018d2dce030d8fa9db01aa9f0a59b6813e9f9e", size = 13191993, upload-time = "2025-11-28T15:47:22.336Z" }, - { url = "https://files.pythonhosted.org/packages/5d/75/8e5d492a879ec4490e6ba664b5154e48c46c85b5ac9785792a5ec6a4d58f/mypy-1.19.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fd4a985b2e32f23bead72e2fb4bbe5d6aceee176be471243bd831d5b2644672d", size = 12174411, upload-time = "2025-11-28T15:44:55.492Z" }, - { url = "https://files.pythonhosted.org/packages/71/31/ad5dcee9bfe226e8eaba777e9d9d251c292650130f0450a280aec3485370/mypy-1.19.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fc51a5b864f73a3a182584b1ac75c404396a17eced54341629d8bdcb644a5bba", size = 12727751, upload-time = "2025-11-28T15:44:14.169Z" }, - { url = "https://files.pythonhosted.org/packages/77/06/b6b8994ce07405f6039701f4b66e9d23f499d0b41c6dd46ec28f96d57ec3/mypy-1.19.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:37af5166f9475872034b56c5efdcf65ee25394e9e1d172907b84577120714364", size = 13593323, upload-time = "2025-11-28T15:46:34.699Z" }, - { url = "https://files.pythonhosted.org/packages/68/b1/126e274484cccdf099a8e328d4fda1c7bdb98a5e888fa6010b00e1bbf330/mypy-1.19.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:510c014b722308c9bd377993bcbf9a07d7e0692e5fa8fc70e639c1eb19fc6bee", size = 13818032, upload-time = "2025-11-28T15:46:18.286Z" }, - { url = "https://files.pythonhosted.org/packages/f8/56/53a8f70f562dfc466c766469133a8a4909f6c0012d83993143f2a9d48d2d/mypy-1.19.0-cp313-cp313-win_amd64.whl", hash = "sha256:cabbee74f29aa9cd3b444ec2f1e4fa5a9d0d746ce7567a6a609e224429781f53", size = 10120644, upload-time = "2025-11-28T15:47:43.99Z" }, - { url = "https://files.pythonhosted.org/packages/b0/f4/7751f32f56916f7f8c229fe902cbdba3e4dd3f3ea9e8b872be97e7fc546d/mypy-1.19.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f2e36bed3c6d9b5f35d28b63ca4b727cb0228e480826ffc8953d1892ddc8999d", size = 13185236, upload-time = "2025-11-28T15:45:20.696Z" }, - { url = "https://files.pythonhosted.org/packages/35/31/871a9531f09e78e8d145032355890384f8a5b38c95a2c7732d226b93242e/mypy-1.19.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a18d8abdda14035c5718acb748faec09571432811af129bf0d9e7b2d6699bf18", size = 12213902, upload-time = "2025-11-28T15:46:10.117Z" }, - { url = "https://files.pythonhosted.org/packages/58/b8/af221910dd40eeefa2077a59107e611550167b9994693fc5926a0b0f87c0/mypy-1.19.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f75e60aca3723a23511948539b0d7ed514dda194bc3755eae0bfc7a6b4887aa7", size = 12738600, upload-time = "2025-11-28T15:44:22.521Z" }, - { url = "https://files.pythonhosted.org/packages/11/9f/c39e89a3e319c1d9c734dedec1183b2cc3aefbab066ec611619002abb932/mypy-1.19.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f44f2ae3c58421ee05fe609160343c25f70e3967f6e32792b5a78006a9d850f", size = 13592639, upload-time = "2025-11-28T15:48:08.55Z" }, - { url = "https://files.pythonhosted.org/packages/97/6d/ffaf5f01f5e284d9033de1267e6c1b8f3783f2cf784465378a86122e884b/mypy-1.19.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:63ea6a00e4bd6822adbfc75b02ab3653a17c02c4347f5bb0cf1d5b9df3a05835", size = 13799132, upload-time = "2025-11-28T15:47:06.032Z" }, - { url = "https://files.pythonhosted.org/packages/fe/b0/c33921e73aaa0106224e5a34822411bea38046188eb781637f5a5b07e269/mypy-1.19.0-cp314-cp314-win_amd64.whl", hash = "sha256:3ad925b14a0bb99821ff6f734553294aa6a3440a8cb082fe1f5b84dfb662afb1", size = 10269832, upload-time = "2025-11-28T15:47:29.392Z" }, - { url = "https://files.pythonhosted.org/packages/b4/59/a7748ef43446163a93159d82bb270c6c4f3d94c1fcbdd2a29a7e439e74d7/mypy-1.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0dde5cb375cb94deff0d4b548b993bec52859d1651e073d63a1386d392a95495", size = 13094255, upload-time = "2025-11-28T15:47:14.282Z" }, - { url = "https://files.pythonhosted.org/packages/f5/0b/92ebf5abc83f559a35dcba3bd9227726b04b04178f1e521f38e647b930eb/mypy-1.19.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1cf9c59398db1c68a134b0b5354a09a1e124523f00bacd68e553b8bd16ff3299", size = 12161414, upload-time = "2025-11-28T15:45:03.302Z" }, - { url = "https://files.pythonhosted.org/packages/aa/03/19412f0a786722055a52c01b4c5d71e5b5443a89f6bbcdd445408240e217/mypy-1.19.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3210d87b30e6af9c8faed61be2642fcbe60ef77cec64fa1ef810a630a4cf671c", size = 12756782, upload-time = "2025-11-28T15:46:49.522Z" }, - { url = "https://files.pythonhosted.org/packages/cb/85/395d53c9098b251414b0448cdadcd3277523ff36f5abda6d26ff945dbdb3/mypy-1.19.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2c1101ab41d01303103ab6ef82cbbfedb81c1a060c868fa7cc013d573d37ab5", size = 13503492, upload-time = "2025-11-28T15:48:57.339Z" }, - { url = "https://files.pythonhosted.org/packages/dd/33/1ab1113e3778617ae7aba66b4b537f90512bd279ff65b6c984fb91fbb2d3/mypy-1.19.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ea4fd21bb48f0da49e6d3b37ef6bd7e8228b9fe41bbf4d80d9364d11adbd43c", size = 13787703, upload-time = "2025-11-28T15:48:41.286Z" }, - { url = "https://files.pythonhosted.org/packages/4f/2d/8b0821b3e0d538de1ad96c86502256c7326274d5cb74e0b373efaada273f/mypy-1.19.0-cp39-cp39-win_amd64.whl", hash = "sha256:16f76ff3f3fd8137aadf593cb4607d82634fca675e8211ad75c43d86033ee6c6", size = 10049225, upload-time = "2025-11-28T15:45:55.089Z" }, - { url = "https://files.pythonhosted.org/packages/09/0e/fe228ed5aeab470c6f4eb82481837fadb642a5aa95cc8215fd2214822c10/mypy-1.19.0-py3-none-any.whl", hash = "sha256:0c01c99d626380752e527d5ce8e69ffbba2046eb8a060db0329690849cf9b6f9", size = 2469714, upload-time = "2025-11-28T15:45:33.22Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/f5/db/4efed9504bc01309ab9c2da7e352cc223569f05478012b5d9ece38fd44d2/mypy-1.19.1.tar.gz", hash = "sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba", size = 3582404, upload-time = "2025-12-15T05:03:48.42Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2f/63/e499890d8e39b1ff2df4c0c6ce5d371b6844ee22b8250687a99fd2f657a8/mypy-1.19.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec", size = 13101333, upload-time = "2025-12-15T05:03:03.28Z" }, + { url = "https://files.pythonhosted.org/packages/72/4b/095626fc136fba96effc4fd4a82b41d688ab92124f8c4f7564bffe5cf1b0/mypy-1.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b", size = 12164102, upload-time = "2025-12-15T05:02:33.611Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5b/952928dd081bf88a83a5ccd49aaecfcd18fd0d2710c7ff07b8fb6f7032b9/mypy-1.19.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6", size = 12765799, upload-time = "2025-12-15T05:03:28.44Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0d/93c2e4a287f74ef11a66fb6d49c7a9f05e47b0a4399040e6719b57f500d2/mypy-1.19.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74", size = 13522149, upload-time = "2025-12-15T05:02:36.011Z" }, + { url = "https://files.pythonhosted.org/packages/7b/0e/33a294b56aaad2b338d203e3a1d8b453637ac36cb278b45005e0901cf148/mypy-1.19.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1", size = 13810105, upload-time = "2025-12-15T05:02:40.327Z" }, + { url = "https://files.pythonhosted.org/packages/0e/fd/3e82603a0cb66b67c5e7abababce6bf1a929ddf67bf445e652684af5c5a0/mypy-1.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac", size = 10057200, upload-time = "2025-12-15T05:02:51.012Z" }, + { url = "https://files.pythonhosted.org/packages/ef/47/6b3ebabd5474d9cdc170d1342fbf9dddc1b0ec13ec90bf9004ee6f391c31/mypy-1.19.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288", size = 13028539, upload-time = "2025-12-15T05:03:44.129Z" }, + { url = "https://files.pythonhosted.org/packages/5c/a6/ac7c7a88a3c9c54334f53a941b765e6ec6c4ebd65d3fe8cdcfbe0d0fd7db/mypy-1.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab", size = 12083163, upload-time = "2025-12-15T05:03:37.679Z" }, + { url = "https://files.pythonhosted.org/packages/67/af/3afa9cf880aa4a2c803798ac24f1d11ef72a0c8079689fac5cfd815e2830/mypy-1.19.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6", size = 12687629, upload-time = "2025-12-15T05:02:31.526Z" }, + { url = "https://files.pythonhosted.org/packages/2d/46/20f8a7114a56484ab268b0ab372461cb3a8f7deed31ea96b83a4e4cfcfca/mypy-1.19.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331", size = 13436933, upload-time = "2025-12-15T05:03:15.606Z" }, + { url = "https://files.pythonhosted.org/packages/5b/f8/33b291ea85050a21f15da910002460f1f445f8007adb29230f0adea279cb/mypy-1.19.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925", size = 13661754, upload-time = "2025-12-15T05:02:26.731Z" }, + { url = "https://files.pythonhosted.org/packages/fd/a3/47cbd4e85bec4335a9cd80cf67dbc02be21b5d4c9c23ad6b95d6c5196bac/mypy-1.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042", size = 10055772, upload-time = "2025-12-15T05:03:26.179Z" }, + { url = "https://files.pythonhosted.org/packages/06/8a/19bfae96f6615aa8a0604915512e0289b1fad33d5909bf7244f02935d33a/mypy-1.19.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1", size = 13206053, upload-time = "2025-12-15T05:03:46.622Z" }, + { url = "https://files.pythonhosted.org/packages/a5/34/3e63879ab041602154ba2a9f99817bb0c85c4df19a23a1443c8986e4d565/mypy-1.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e", size = 12219134, upload-time = "2025-12-15T05:03:24.367Z" }, + { url = "https://files.pythonhosted.org/packages/89/cc/2db6f0e95366b630364e09845672dbee0cbf0bbe753a204b29a944967cd9/mypy-1.19.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2", size = 12731616, upload-time = "2025-12-15T05:02:44.725Z" }, + { url = "https://files.pythonhosted.org/packages/00/be/dd56c1fd4807bc1eba1cf18b2a850d0de7bacb55e158755eb79f77c41f8e/mypy-1.19.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8", size = 13620847, upload-time = "2025-12-15T05:03:39.633Z" }, + { url = "https://files.pythonhosted.org/packages/6d/42/332951aae42b79329f743bf1da088cd75d8d4d9acc18fbcbd84f26c1af4e/mypy-1.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a", size = 13834976, upload-time = "2025-12-15T05:03:08.786Z" }, + { url = "https://files.pythonhosted.org/packages/6f/63/e7493e5f90e1e085c562bb06e2eb32cae27c5057b9653348d38b47daaecc/mypy-1.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13", size = 10118104, upload-time = "2025-12-15T05:03:10.834Z" }, + { url = "https://files.pythonhosted.org/packages/de/9f/a6abae693f7a0c697dbb435aac52e958dc8da44e92e08ba88d2e42326176/mypy-1.19.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250", size = 13201927, upload-time = "2025-12-15T05:02:29.138Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a4/45c35ccf6e1c65afc23a069f50e2c66f46bd3798cbe0d680c12d12935caa/mypy-1.19.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b", size = 12206730, upload-time = "2025-12-15T05:03:01.325Z" }, + { url = "https://files.pythonhosted.org/packages/05/bb/cdcf89678e26b187650512620eec8368fded4cfd99cfcb431e4cdfd19dec/mypy-1.19.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e", size = 12724581, upload-time = "2025-12-15T05:03:20.087Z" }, + { url = "https://files.pythonhosted.org/packages/d1/32/dd260d52babf67bad8e6770f8e1102021877ce0edea106e72df5626bb0ec/mypy-1.19.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef", size = 13616252, upload-time = "2025-12-15T05:02:49.036Z" }, + { url = "https://files.pythonhosted.org/packages/71/d0/5e60a9d2e3bd48432ae2b454b7ef2b62a960ab51292b1eda2a95edd78198/mypy-1.19.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75", size = 13840848, upload-time = "2025-12-15T05:02:55.95Z" }, + { url = "https://files.pythonhosted.org/packages/98/76/d32051fa65ecf6cc8c6610956473abdc9b4c43301107476ac03559507843/mypy-1.19.1-cp313-cp313-win_amd64.whl", hash = "sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd", size = 10135510, upload-time = "2025-12-15T05:02:58.438Z" }, + { url = "https://files.pythonhosted.org/packages/de/eb/b83e75f4c820c4247a58580ef86fcd35165028f191e7e1ba57128c52782d/mypy-1.19.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1", size = 13199744, upload-time = "2025-12-15T05:03:30.823Z" }, + { url = "https://files.pythonhosted.org/packages/94/28/52785ab7bfa165f87fcbb61547a93f98bb20e7f82f90f165a1f69bce7b3d/mypy-1.19.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718", size = 12215815, upload-time = "2025-12-15T05:02:42.323Z" }, + { url = "https://files.pythonhosted.org/packages/0a/c6/bdd60774a0dbfb05122e3e925f2e9e846c009e479dcec4821dad881f5b52/mypy-1.19.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b", size = 12740047, upload-time = "2025-12-15T05:03:33.168Z" }, + { url = "https://files.pythonhosted.org/packages/32/2a/66ba933fe6c76bd40d1fe916a83f04fed253152f451a877520b3c4a5e41e/mypy-1.19.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045", size = 13601998, upload-time = "2025-12-15T05:03:13.056Z" }, + { url = "https://files.pythonhosted.org/packages/e3/da/5055c63e377c5c2418760411fd6a63ee2b96cf95397259038756c042574f/mypy-1.19.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957", size = 13807476, upload-time = "2025-12-15T05:03:17.977Z" }, + { url = "https://files.pythonhosted.org/packages/cd/09/4ebd873390a063176f06b0dbf1f7783dd87bd120eae7727fa4ae4179b685/mypy-1.19.1-cp314-cp314-win_amd64.whl", hash = "sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f", size = 10281872, upload-time = "2025-12-15T05:03:05.549Z" }, + { url = "https://files.pythonhosted.org/packages/b5/f7/88436084550ca9af5e610fa45286be04c3b63374df3e021c762fe8c4369f/mypy-1.19.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7bcfc336a03a1aaa26dfce9fff3e287a3ba99872a157561cbfcebe67c13308e3", size = 13102606, upload-time = "2025-12-15T05:02:46.833Z" }, + { url = "https://files.pythonhosted.org/packages/ca/a5/43dfad311a734b48a752790571fd9e12d61893849a01bff346a54011957f/mypy-1.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b7951a701c07ea584c4fe327834b92a30825514c868b1f69c30445093fdd9d5a", size = 12164496, upload-time = "2025-12-15T05:03:41.947Z" }, + { url = "https://files.pythonhosted.org/packages/88/f0/efbfa391395cce2f2771f937e0620cfd185ec88f2b9cd88711028a768e96/mypy-1.19.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b13cfdd6c87fc3efb69ea4ec18ef79c74c3f98b4e5498ca9b85ab3b2c2329a67", size = 12772068, upload-time = "2025-12-15T05:02:53.689Z" }, + { url = "https://files.pythonhosted.org/packages/25/05/58b3ba28f5aed10479e899a12d2120d582ba9fa6288851b20bf1c32cbb4f/mypy-1.19.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f28f99c824ecebcdaa2e55d82953e38ff60ee5ec938476796636b86afa3956e", size = 13520385, upload-time = "2025-12-15T05:02:38.328Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a0/c006ccaff50b31e542ae69b92fe7e2f55d99fba3a55e01067dd564325f85/mypy-1.19.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c608937067d2fc5a4dd1a5ce92fd9e1398691b8c5d012d66e1ddd430e9244376", size = 13796221, upload-time = "2025-12-15T05:03:22.147Z" }, + { url = "https://files.pythonhosted.org/packages/b2/ff/8bdb051cd710f01b880472241bd36b3f817a8e1c5d5540d0b761675b6de2/mypy-1.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:409088884802d511ee52ca067707b90c883426bd95514e8cfda8281dc2effe24", size = 10055456, upload-time = "2025-12-15T05:03:35.169Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f4/4ce9a05ce5ded1de3ec1c1d96cf9f9504a04e54ce0ed55cfa38619a32b8d/mypy-1.19.1-py3-none-any.whl", hash = "sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247", size = 2471239, upload-time = "2025-12-15T05:03:07.248Z" }, ] [[package]] @@ -2093,7 +2218,7 @@ wheels = [ [[package]] name = "networkx" -version = "3.6" +version = "3.6.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14'", @@ -2101,18 +2226,18 @@ resolution-markers = [ "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", ] -sdist = { url = "https://files.pythonhosted.org/packages/e8/fc/7b6fd4d22c8c4dc5704430140d8b3f520531d4fe7328b8f8d03f5a7950e8/networkx-3.6.tar.gz", hash = "sha256:285276002ad1f7f7da0f7b42f004bcba70d381e936559166363707fdad3d72ad", size = 2511464, upload-time = "2025-11-24T03:03:47.158Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/c7/d64168da60332c17d24c0d2f08bdf3987e8d1ae9d84b5bbd0eec2eb26a55/networkx-3.6-py3-none-any.whl", hash = "sha256:cdb395b105806062473d3be36458d8f1459a4e4b98e236a66c3a48996e07684f", size = 2063713, upload-time = "2025-11-24T03:03:45.21Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504, upload-time = "2025-12-08T17:02:38.159Z" }, ] [[package]] name = "nodeenv" -version = "1.9.1" +version = "1.10.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } +sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, + { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, ] [[package]] @@ -2238,7 +2363,7 @@ wheels = [ [[package]] name = "numpy" -version = "2.3.5" +version = "2.4.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14'", @@ -2246,81 +2371,79 @@ resolution-markers = [ "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", ] -sdist = { url = "https://files.pythonhosted.org/packages/76/65/21b3bc86aac7b8f2862db1e808f1ea22b028e30a225a34a5ede9bf8678f2/numpy-2.3.5.tar.gz", hash = "sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0", size = 20584950, upload-time = "2025-11-16T22:52:42.067Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/77/84dd1d2e34d7e2792a236ba180b5e8fcc1e3e414e761ce0253f63d7f572e/numpy-2.3.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de5672f4a7b200c15a4127042170a694d4df43c992948f5e1af57f0174beed10", size = 17034641, upload-time = "2025-11-16T22:49:19.336Z" }, - { url = "https://files.pythonhosted.org/packages/2a/ea/25e26fa5837106cde46ae7d0b667e20f69cbbc0efd64cba8221411ab26ae/numpy-2.3.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:acfd89508504a19ed06ef963ad544ec6664518c863436306153e13e94605c218", size = 12528324, upload-time = "2025-11-16T22:49:22.582Z" }, - { url = "https://files.pythonhosted.org/packages/4d/1a/e85f0eea4cf03d6a0228f5c0256b53f2df4bc794706e7df019fc622e47f1/numpy-2.3.5-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:ffe22d2b05504f786c867c8395de703937f934272eb67586817b46188b4ded6d", size = 5356872, upload-time = "2025-11-16T22:49:25.408Z" }, - { url = "https://files.pythonhosted.org/packages/5c/bb/35ef04afd567f4c989c2060cde39211e4ac5357155c1833bcd1166055c61/numpy-2.3.5-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:872a5cf366aec6bb1147336480fef14c9164b154aeb6542327de4970282cd2f5", size = 6893148, upload-time = "2025-11-16T22:49:27.549Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2b/05bbeb06e2dff5eab512dfc678b1cc5ee94d8ac5956a0885c64b6b26252b/numpy-2.3.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3095bdb8dd297e5920b010e96134ed91d852d81d490e787beca7e35ae1d89cf7", size = 14557282, upload-time = "2025-11-16T22:49:30.964Z" }, - { url = "https://files.pythonhosted.org/packages/65/fb/2b23769462b34398d9326081fad5655198fcf18966fcb1f1e49db44fbf31/numpy-2.3.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cba086a43d54ca804ce711b2a940b16e452807acebe7852ff327f1ecd49b0d4", size = 16897903, upload-time = "2025-11-16T22:49:34.191Z" }, - { url = "https://files.pythonhosted.org/packages/ac/14/085f4cf05fc3f1e8aa95e85404e984ffca9b2275a5dc2b1aae18a67538b8/numpy-2.3.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6cf9b429b21df6b99f4dee7a1218b8b7ffbbe7df8764dc0bd60ce8a0708fed1e", size = 16341672, upload-time = "2025-11-16T22:49:37.2Z" }, - { url = "https://files.pythonhosted.org/packages/6f/3b/1f73994904142b2aa290449b3bb99772477b5fd94d787093e4f24f5af763/numpy-2.3.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:396084a36abdb603546b119d96528c2f6263921c50df3c8fd7cb28873a237748", size = 18838896, upload-time = "2025-11-16T22:49:39.727Z" }, - { url = "https://files.pythonhosted.org/packages/cd/b9/cf6649b2124f288309ffc353070792caf42ad69047dcc60da85ee85fea58/numpy-2.3.5-cp311-cp311-win32.whl", hash = "sha256:b0c7088a73aef3d687c4deef8452a3ac7c1be4e29ed8bf3b366c8111128ac60c", size = 6563608, upload-time = "2025-11-16T22:49:42.079Z" }, - { url = "https://files.pythonhosted.org/packages/aa/44/9fe81ae1dcc29c531843852e2874080dc441338574ccc4306b39e2ff6e59/numpy-2.3.5-cp311-cp311-win_amd64.whl", hash = "sha256:a414504bef8945eae5f2d7cb7be2d4af77c5d1cb5e20b296c2c25b61dff2900c", size = 13078442, upload-time = "2025-11-16T22:49:43.99Z" }, - { url = "https://files.pythonhosted.org/packages/6d/a7/f99a41553d2da82a20a2f22e93c94f928e4490bb447c9ff3c4ff230581d3/numpy-2.3.5-cp311-cp311-win_arm64.whl", hash = "sha256:0cd00b7b36e35398fa2d16af7b907b65304ef8bb4817a550e06e5012929830fa", size = 10458555, upload-time = "2025-11-16T22:49:47.092Z" }, - { url = "https://files.pythonhosted.org/packages/44/37/e669fe6cbb2b96c62f6bbedc6a81c0f3b7362f6a59230b23caa673a85721/numpy-2.3.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e", size = 16733873, upload-time = "2025-11-16T22:49:49.84Z" }, - { url = "https://files.pythonhosted.org/packages/c5/65/df0db6c097892c9380851ab9e44b52d4f7ba576b833996e0080181c0c439/numpy-2.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769", size = 12259838, upload-time = "2025-11-16T22:49:52.863Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e1/1ee06e70eb2136797abe847d386e7c0e830b67ad1d43f364dd04fa50d338/numpy-2.3.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5", size = 5088378, upload-time = "2025-11-16T22:49:55.055Z" }, - { url = "https://files.pythonhosted.org/packages/6d/9c/1ca85fb86708724275103b81ec4cf1ac1d08f465368acfc8da7ab545bdae/numpy-2.3.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4", size = 6628559, upload-time = "2025-11-16T22:49:57.371Z" }, - { url = "https://files.pythonhosted.org/packages/74/78/fcd41e5a0ce4f3f7b003da85825acddae6d7ecb60cf25194741b036ca7d6/numpy-2.3.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d", size = 14250702, upload-time = "2025-11-16T22:49:59.632Z" }, - { url = "https://files.pythonhosted.org/packages/b6/23/2a1b231b8ff672b4c450dac27164a8b2ca7d9b7144f9c02d2396518352eb/numpy-2.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28", size = 16606086, upload-time = "2025-11-16T22:50:02.127Z" }, - { url = "https://files.pythonhosted.org/packages/a0/c5/5ad26fbfbe2012e190cc7d5003e4d874b88bb18861d0829edc140a713021/numpy-2.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b", size = 16025985, upload-time = "2025-11-16T22:50:04.536Z" }, - { url = "https://files.pythonhosted.org/packages/d2/fa/dd48e225c46c819288148d9d060b047fd2a6fb1eb37eae25112ee4cb4453/numpy-2.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c", size = 18542976, upload-time = "2025-11-16T22:50:07.557Z" }, - { url = "https://files.pythonhosted.org/packages/05/79/ccbd23a75862d95af03d28b5c6901a1b7da4803181513d52f3b86ed9446e/numpy-2.3.5-cp312-cp312-win32.whl", hash = "sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952", size = 6285274, upload-time = "2025-11-16T22:50:10.746Z" }, - { url = "https://files.pythonhosted.org/packages/2d/57/8aeaf160312f7f489dea47ab61e430b5cb051f59a98ae68b7133ce8fa06a/numpy-2.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa", size = 12782922, upload-time = "2025-11-16T22:50:12.811Z" }, - { url = "https://files.pythonhosted.org/packages/78/a6/aae5cc2ca78c45e64b9ef22f089141d661516856cf7c8a54ba434576900d/numpy-2.3.5-cp312-cp312-win_arm64.whl", hash = "sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013", size = 10194667, upload-time = "2025-11-16T22:50:16.16Z" }, - { url = "https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff", size = 16728251, upload-time = "2025-11-16T22:50:19.013Z" }, - { url = "https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188", size = 12254652, upload-time = "2025-11-16T22:50:21.487Z" }, - { url = "https://files.pythonhosted.org/packages/78/da/8c7738060ca9c31b30e9301ee0cf6c5ffdbf889d9593285a1cead337f9a5/numpy-2.3.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0", size = 5083172, upload-time = "2025-11-16T22:50:24.562Z" }, - { url = "https://files.pythonhosted.org/packages/a4/b4/ee5bb2537fb9430fd2ef30a616c3672b991a4129bb1c7dcc42aa0abbe5d7/numpy-2.3.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903", size = 6622990, upload-time = "2025-11-16T22:50:26.47Z" }, - { url = "https://files.pythonhosted.org/packages/95/03/dc0723a013c7d7c19de5ef29e932c3081df1c14ba582b8b86b5de9db7f0f/numpy-2.3.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d", size = 14248902, upload-time = "2025-11-16T22:50:28.861Z" }, - { url = "https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017", size = 16597430, upload-time = "2025-11-16T22:50:31.56Z" }, - { url = "https://files.pythonhosted.org/packages/2a/51/c1e29be863588db58175175f057286900b4b3327a1351e706d5e0f8dd679/numpy-2.3.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf", size = 16024551, upload-time = "2025-11-16T22:50:34.242Z" }, - { url = "https://files.pythonhosted.org/packages/83/68/8236589d4dbb87253d28259d04d9b814ec0ecce7cb1c7fed29729f4c3a78/numpy-2.3.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce", size = 18533275, upload-time = "2025-11-16T22:50:37.651Z" }, - { url = "https://files.pythonhosted.org/packages/40/56/2932d75b6f13465239e3b7b7e511be27f1b8161ca2510854f0b6e521c395/numpy-2.3.5-cp313-cp313-win32.whl", hash = "sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e", size = 6277637, upload-time = "2025-11-16T22:50:40.11Z" }, - { url = "https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl", hash = "sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b", size = 12779090, upload-time = "2025-11-16T22:50:42.503Z" }, - { url = "https://files.pythonhosted.org/packages/8f/88/3f41e13a44ebd4034ee17baa384acac29ba6a4fcc2aca95f6f08ca0447d1/numpy-2.3.5-cp313-cp313-win_arm64.whl", hash = "sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae", size = 10194710, upload-time = "2025-11-16T22:50:44.971Z" }, - { url = "https://files.pythonhosted.org/packages/13/cb/71744144e13389d577f867f745b7df2d8489463654a918eea2eeb166dfc9/numpy-2.3.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd", size = 16827292, upload-time = "2025-11-16T22:50:47.715Z" }, - { url = "https://files.pythonhosted.org/packages/71/80/ba9dc6f2a4398e7f42b708a7fdc841bb638d353be255655498edbf9a15a8/numpy-2.3.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f", size = 12378897, upload-time = "2025-11-16T22:50:51.327Z" }, - { url = "https://files.pythonhosted.org/packages/2e/6d/db2151b9f64264bcceccd51741aa39b50150de9b602d98ecfe7e0c4bff39/numpy-2.3.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a", size = 5207391, upload-time = "2025-11-16T22:50:54.542Z" }, - { url = "https://files.pythonhosted.org/packages/80/ae/429bacace5ccad48a14c4ae5332f6aa8ab9f69524193511d60ccdfdc65fa/numpy-2.3.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139", size = 6721275, upload-time = "2025-11-16T22:50:56.794Z" }, - { url = "https://files.pythonhosted.org/packages/74/5b/1919abf32d8722646a38cd527bc3771eb229a32724ee6ba340ead9b92249/numpy-2.3.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e", size = 14306855, upload-time = "2025-11-16T22:50:59.208Z" }, - { url = "https://files.pythonhosted.org/packages/a5/87/6831980559434973bebc30cd9c1f21e541a0f2b0c280d43d3afd909b66d0/numpy-2.3.5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9", size = 16657359, upload-time = "2025-11-16T22:51:01.991Z" }, - { url = "https://files.pythonhosted.org/packages/dd/91/c797f544491ee99fd00495f12ebb7802c440c1915811d72ac5b4479a3356/numpy-2.3.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946", size = 16093374, upload-time = "2025-11-16T22:51:05.291Z" }, - { url = "https://files.pythonhosted.org/packages/74/a6/54da03253afcbe7a72785ec4da9c69fb7a17710141ff9ac5fcb2e32dbe64/numpy-2.3.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1", size = 18594587, upload-time = "2025-11-16T22:51:08.585Z" }, - { url = "https://files.pythonhosted.org/packages/80/e9/aff53abbdd41b0ecca94285f325aff42357c6b5abc482a3fcb4994290b18/numpy-2.3.5-cp313-cp313t-win32.whl", hash = "sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3", size = 6405940, upload-time = "2025-11-16T22:51:11.541Z" }, - { url = "https://files.pythonhosted.org/packages/d5/81/50613fec9d4de5480de18d4f8ef59ad7e344d497edbef3cfd80f24f98461/numpy-2.3.5-cp313-cp313t-win_amd64.whl", hash = "sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234", size = 12920341, upload-time = "2025-11-16T22:51:14.312Z" }, - { url = "https://files.pythonhosted.org/packages/bb/ab/08fd63b9a74303947f34f0bd7c5903b9c5532c2d287bead5bdf4c556c486/numpy-2.3.5-cp313-cp313t-win_arm64.whl", hash = "sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7", size = 10262507, upload-time = "2025-11-16T22:51:16.846Z" }, - { url = "https://files.pythonhosted.org/packages/ba/97/1a914559c19e32d6b2e233cf9a6a114e67c856d35b1d6babca571a3e880f/numpy-2.3.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82", size = 16735706, upload-time = "2025-11-16T22:51:19.558Z" }, - { url = "https://files.pythonhosted.org/packages/57/d4/51233b1c1b13ecd796311216ae417796b88b0616cfd8a33ae4536330748a/numpy-2.3.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0", size = 12264507, upload-time = "2025-11-16T22:51:22.492Z" }, - { url = "https://files.pythonhosted.org/packages/45/98/2fe46c5c2675b8306d0b4a3ec3494273e93e1226a490f766e84298576956/numpy-2.3.5-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63", size = 5093049, upload-time = "2025-11-16T22:51:25.171Z" }, - { url = "https://files.pythonhosted.org/packages/ce/0e/0698378989bb0ac5f1660c81c78ab1fe5476c1a521ca9ee9d0710ce54099/numpy-2.3.5-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9", size = 6626603, upload-time = "2025-11-16T22:51:27Z" }, - { url = "https://files.pythonhosted.org/packages/5e/a6/9ca0eecc489640615642a6cbc0ca9e10df70df38c4d43f5a928ff18d8827/numpy-2.3.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b", size = 14262696, upload-time = "2025-11-16T22:51:29.402Z" }, - { url = "https://files.pythonhosted.org/packages/c8/f6/07ec185b90ec9d7217a00eeeed7383b73d7e709dae2a9a021b051542a708/numpy-2.3.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520", size = 16597350, upload-time = "2025-11-16T22:51:32.167Z" }, - { url = "https://files.pythonhosted.org/packages/75/37/164071d1dde6a1a84c9b8e5b414fa127981bad47adf3a6b7e23917e52190/numpy-2.3.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c", size = 16040190, upload-time = "2025-11-16T22:51:35.403Z" }, - { url = "https://files.pythonhosted.org/packages/08/3c/f18b82a406b04859eb026d204e4e1773eb41c5be58410f41ffa511d114ae/numpy-2.3.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8", size = 18536749, upload-time = "2025-11-16T22:51:39.698Z" }, - { url = "https://files.pythonhosted.org/packages/40/79/f82f572bf44cf0023a2fe8588768e23e1592585020d638999f15158609e1/numpy-2.3.5-cp314-cp314-win32.whl", hash = "sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248", size = 6335432, upload-time = "2025-11-16T22:51:42.476Z" }, - { url = "https://files.pythonhosted.org/packages/a3/2e/235b4d96619931192c91660805e5e49242389742a7a82c27665021db690c/numpy-2.3.5-cp314-cp314-win_amd64.whl", hash = "sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e", size = 12919388, upload-time = "2025-11-16T22:51:45.275Z" }, - { url = "https://files.pythonhosted.org/packages/07/2b/29fd75ce45d22a39c61aad74f3d718e7ab67ccf839ca8b60866054eb15f8/numpy-2.3.5-cp314-cp314-win_arm64.whl", hash = "sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2", size = 10476651, upload-time = "2025-11-16T22:51:47.749Z" }, - { url = "https://files.pythonhosted.org/packages/17/e1/f6a721234ebd4d87084cfa68d081bcba2f5cfe1974f7de4e0e8b9b2a2ba1/numpy-2.3.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41", size = 16834503, upload-time = "2025-11-16T22:51:50.443Z" }, - { url = "https://files.pythonhosted.org/packages/5c/1c/baf7ffdc3af9c356e1c135e57ab7cf8d247931b9554f55c467efe2c69eff/numpy-2.3.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad", size = 12381612, upload-time = "2025-11-16T22:51:53.609Z" }, - { url = "https://files.pythonhosted.org/packages/74/91/f7f0295151407ddc9ba34e699013c32c3c91944f9b35fcf9281163dc1468/numpy-2.3.5-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39", size = 5210042, upload-time = "2025-11-16T22:51:56.213Z" }, - { url = "https://files.pythonhosted.org/packages/2e/3b/78aebf345104ec50dd50a4d06ddeb46a9ff5261c33bcc58b1c4f12f85ec2/numpy-2.3.5-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20", size = 6724502, upload-time = "2025-11-16T22:51:58.584Z" }, - { url = "https://files.pythonhosted.org/packages/02/c6/7c34b528740512e57ef1b7c8337ab0b4f0bddf34c723b8996c675bc2bc91/numpy-2.3.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52", size = 14308962, upload-time = "2025-11-16T22:52:01.698Z" }, - { url = "https://files.pythonhosted.org/packages/80/35/09d433c5262bc32d725bafc619e095b6a6651caf94027a03da624146f655/numpy-2.3.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b", size = 16655054, upload-time = "2025-11-16T22:52:04.267Z" }, - { url = "https://files.pythonhosted.org/packages/7a/ab/6a7b259703c09a88804fa2430b43d6457b692378f6b74b356155283566ac/numpy-2.3.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3", size = 16091613, upload-time = "2025-11-16T22:52:08.651Z" }, - { url = "https://files.pythonhosted.org/packages/c2/88/330da2071e8771e60d1038166ff9d73f29da37b01ec3eb43cb1427464e10/numpy-2.3.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227", size = 18591147, upload-time = "2025-11-16T22:52:11.453Z" }, - { url = "https://files.pythonhosted.org/packages/51/41/851c4b4082402d9ea860c3626db5d5df47164a712cb23b54be028b184c1c/numpy-2.3.5-cp314-cp314t-win32.whl", hash = "sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5", size = 6479806, upload-time = "2025-11-16T22:52:14.641Z" }, - { url = "https://files.pythonhosted.org/packages/90/30/d48bde1dfd93332fa557cff1972fbc039e055a52021fbef4c2c4b1eefd17/numpy-2.3.5-cp314-cp314t-win_amd64.whl", hash = "sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf", size = 13105760, upload-time = "2025-11-16T22:52:17.975Z" }, - { url = "https://files.pythonhosted.org/packages/2d/fd/4b5eb0b3e888d86aee4d198c23acec7d214baaf17ea93c1adec94c9518b9/numpy-2.3.5-cp314-cp314t-win_arm64.whl", hash = "sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42", size = 10545459, upload-time = "2025-11-16T22:52:20.55Z" }, - { url = "https://files.pythonhosted.org/packages/c6/65/f9dea8e109371ade9c782b4e4756a82edf9d3366bca495d84d79859a0b79/numpy-2.3.5-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f0963b55cdd70fad460fa4c1341f12f976bb26cb66021a5580329bd498988310", size = 16910689, upload-time = "2025-11-16T22:52:23.247Z" }, - { url = "https://files.pythonhosted.org/packages/00/4f/edb00032a8fb92ec0a679d3830368355da91a69cab6f3e9c21b64d0bb986/numpy-2.3.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f4255143f5160d0de972d28c8f9665d882b5f61309d8362fdd3e103cf7bf010c", size = 12457053, upload-time = "2025-11-16T22:52:26.367Z" }, - { url = "https://files.pythonhosted.org/packages/16/a4/e8a53b5abd500a63836a29ebe145fc1ab1f2eefe1cfe59276020373ae0aa/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:a4b9159734b326535f4dd01d947f919c6eefd2d9827466a696c44ced82dfbc18", size = 5285635, upload-time = "2025-11-16T22:52:29.266Z" }, - { url = "https://files.pythonhosted.org/packages/a3/2f/37eeb9014d9c8b3e9c55bc599c68263ca44fdbc12a93e45a21d1d56df737/numpy-2.3.5-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2feae0d2c91d46e59fcd62784a3a83b3fb677fead592ce51b5a6fbb4f95965ff", size = 6801770, upload-time = "2025-11-16T22:52:31.421Z" }, - { url = "https://files.pythonhosted.org/packages/7d/e4/68d2f474df2cb671b2b6c2986a02e520671295647dad82484cde80ca427b/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ffac52f28a7849ad7576293c0cb7b9f08304e8f7d738a8cb8a90ec4c55a998eb", size = 14391768, upload-time = "2025-11-16T22:52:33.593Z" }, - { url = "https://files.pythonhosted.org/packages/b8/50/94ccd8a2b141cb50651fddd4f6a48874acb3c91c8f0842b08a6afc4b0b21/numpy-2.3.5-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63c0e9e7eea69588479ebf4a8a270d5ac22763cc5854e9a7eae952a3908103f7", size = 16729263, upload-time = "2025-11-16T22:52:36.369Z" }, - { url = "https://files.pythonhosted.org/packages/2d/ee/346fa473e666fe14c52fcdd19ec2424157290a032d4c41f98127bfb31ac7/numpy-2.3.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f16417ec91f12f814b10bafe79ef77e70113a2f5f7018640e7425ff979253425", size = 12967213, upload-time = "2025-11-16T22:52:39.38Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a4/7a/6a3d14e205d292b738db449d0de649b373a59edb0d0b4493821d0a3e8718/numpy-2.4.0.tar.gz", hash = "sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934", size = 20685720, upload-time = "2025-12-20T16:18:19.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/7e/7bae7cbcc2f8132271967aa03e03954fc1e48aa1f3bf32b29ca95fbef352/numpy-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:316b2f2584682318539f0bcaca5a496ce9ca78c88066579ebd11fd06f8e4741e", size = 16940166, upload-time = "2025-12-20T16:15:43.434Z" }, + { url = "https://files.pythonhosted.org/packages/0f/27/6c13f5b46776d6246ec884ac5817452672156a506d08a1f2abb39961930a/numpy-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2718c1de8504121714234b6f8241d0019450353276c88b9453c9c3d92e101db", size = 12641781, upload-time = "2025-12-20T16:15:45.701Z" }, + { url = "https://files.pythonhosted.org/packages/14/1c/83b4998d4860d15283241d9e5215f28b40ac31f497c04b12fa7f428ff370/numpy-2.4.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:21555da4ec4a0c942520ead42c3b0dc9477441e085c42b0fbdd6a084869a6f6b", size = 5470247, upload-time = "2025-12-20T16:15:47.943Z" }, + { url = "https://files.pythonhosted.org/packages/54/08/cbce72c835d937795571b0464b52069f869c9e78b0c076d416c5269d2718/numpy-2.4.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:413aa561266a4be2d06cd2b9665e89d9f54c543f418773076a76adcf2af08bc7", size = 6799807, upload-time = "2025-12-20T16:15:49.795Z" }, + { url = "https://files.pythonhosted.org/packages/ff/be/2e647961cd8c980591d75cdcd9e8f647d69fbe05e2a25613dc0a2ea5fb1a/numpy-2.4.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0feafc9e03128074689183031181fac0897ff169692d8492066e949041096548", size = 14701992, upload-time = "2025-12-20T16:15:51.615Z" }, + { url = "https://files.pythonhosted.org/packages/a2/fb/e1652fb8b6fd91ce6ed429143fe2e01ce714711e03e5b762615e7b36172c/numpy-2.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8fdfed3deaf1928fb7667d96e0567cdf58c2b370ea2ee7e586aa383ec2cb346", size = 16646871, upload-time = "2025-12-20T16:15:54.129Z" }, + { url = "https://files.pythonhosted.org/packages/62/23/d841207e63c4322842f7cd042ae981cffe715c73376dcad8235fb31debf1/numpy-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e06a922a469cae9a57100864caf4f8a97a1026513793969f8ba5b63137a35d25", size = 16487190, upload-time = "2025-12-20T16:15:56.147Z" }, + { url = "https://files.pythonhosted.org/packages/bc/a0/6a842c8421ebfdec0a230e65f61e0dabda6edbef443d999d79b87c273965/numpy-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:927ccf5cd17c48f801f4ed43a7e5673a2724bd2171460be3e3894e6e332ef83a", size = 18580762, upload-time = "2025-12-20T16:15:58.524Z" }, + { url = "https://files.pythonhosted.org/packages/0a/d1/c79e0046641186f2134dde05e6181825b911f8bdcef31b19ddd16e232847/numpy-2.4.0-cp311-cp311-win32.whl", hash = "sha256:882567b7ae57c1b1a0250208cc21a7976d8cbcc49d5a322e607e6f09c9e0bd53", size = 6233359, upload-time = "2025-12-20T16:16:00.938Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f0/74965001d231f28184d6305b8cdc1b6fcd4bf23033f6cb039cfe76c9fca7/numpy-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:8b986403023c8f3bf8f487c2e6186afda156174d31c175f747d8934dfddf3479", size = 12601132, upload-time = "2025-12-20T16:16:02.484Z" }, + { url = "https://files.pythonhosted.org/packages/65/32/55408d0f46dfebce38017f5bd931affa7256ad6beac1a92a012e1fbc67a7/numpy-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:3f3096405acc48887458bbf9f6814d43785ac7ba2a57ea6442b581dedbc60ce6", size = 10573977, upload-time = "2025-12-20T16:16:04.77Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ff/f6400ffec95de41c74b8e73df32e3fff1830633193a7b1e409be7fb1bb8c/numpy-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2a8b6bb8369abefb8bd1801b054ad50e02b3275c8614dc6e5b0373c305291037", size = 16653117, upload-time = "2025-12-20T16:16:06.709Z" }, + { url = "https://files.pythonhosted.org/packages/fd/28/6c23e97450035072e8d830a3c411bf1abd1f42c611ff9d29e3d8f55c6252/numpy-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e284ca13d5a8367e43734148622caf0b261b275673823593e3e3634a6490f83", size = 12369711, upload-time = "2025-12-20T16:16:08.758Z" }, + { url = "https://files.pythonhosted.org/packages/bc/af/acbef97b630ab1bb45e6a7d01d1452e4251aa88ce680ac36e56c272120ec/numpy-2.4.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:49ff32b09f5aa0cd30a20c2b39db3e669c845589f2b7fc910365210887e39344", size = 5198355, upload-time = "2025-12-20T16:16:10.902Z" }, + { url = "https://files.pythonhosted.org/packages/c1/c8/4e0d436b66b826f2e53330adaa6311f5cac9871a5b5c31ad773b27f25a74/numpy-2.4.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:36cbfb13c152b1c7c184ddac43765db8ad672567e7bafff2cc755a09917ed2e6", size = 6545298, upload-time = "2025-12-20T16:16:12.607Z" }, + { url = "https://files.pythonhosted.org/packages/ef/27/e1f5d144ab54eac34875e79037011d511ac57b21b220063310cb96c80fbc/numpy-2.4.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35ddc8f4914466e6fc954c76527aa91aa763682a4f6d73249ef20b418fe6effb", size = 14398387, upload-time = "2025-12-20T16:16:14.257Z" }, + { url = "https://files.pythonhosted.org/packages/67/64/4cb909dd5ab09a9a5d086eff9586e69e827b88a5585517386879474f4cf7/numpy-2.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc578891de1db95b2a35001b695451767b580bb45753717498213c5ff3c41d63", size = 16363091, upload-time = "2025-12-20T16:16:17.32Z" }, + { url = "https://files.pythonhosted.org/packages/9d/9c/8efe24577523ec6809261859737cf117b0eb6fdb655abdfdc81b2e468ce4/numpy-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98e81648e0b36e325ab67e46b5400a7a6d4a22b8a7c8e8bbfe20e7db7906bf95", size = 16176394, upload-time = "2025-12-20T16:16:19.524Z" }, + { url = "https://files.pythonhosted.org/packages/61/f0/1687441ece7b47a62e45a1f82015352c240765c707928edd8aef875d5951/numpy-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d57b5046c120561ba8fa8e4030fbb8b822f3063910fa901ffadf16e2b7128ad6", size = 18287378, upload-time = "2025-12-20T16:16:22.866Z" }, + { url = "https://files.pythonhosted.org/packages/d3/6f/f868765d44e6fc466467ed810ba9d8d6db1add7d4a748abfa2a4c99a3194/numpy-2.4.0-cp312-cp312-win32.whl", hash = "sha256:92190db305a6f48734d3982f2c60fa30d6b5ee9bff10f2887b930d7b40119f4c", size = 5955432, upload-time = "2025-12-20T16:16:25.06Z" }, + { url = "https://files.pythonhosted.org/packages/d4/b5/94c1e79fcbab38d1ca15e13777477b2914dd2d559b410f96949d6637b085/numpy-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:680060061adb2d74ce352628cb798cfdec399068aa7f07ba9fb818b2b3305f98", size = 12306201, upload-time = "2025-12-20T16:16:26.979Z" }, + { url = "https://files.pythonhosted.org/packages/70/09/c39dadf0b13bb0768cd29d6a3aaff1fb7c6905ac40e9aaeca26b1c086e06/numpy-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:39699233bc72dd482da1415dcb06076e32f60eddc796a796c5fb6c5efce94667", size = 10308234, upload-time = "2025-12-20T16:16:29.417Z" }, + { url = "https://files.pythonhosted.org/packages/a7/0d/853fd96372eda07c824d24adf02e8bc92bb3731b43a9b2a39161c3667cc4/numpy-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea", size = 16649088, upload-time = "2025-12-20T16:16:31.421Z" }, + { url = "https://files.pythonhosted.org/packages/e3/37/cc636f1f2a9f585434e20a3e6e63422f70bfe4f7f6698e941db52ea1ac9a/numpy-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d", size = 12364065, upload-time = "2025-12-20T16:16:33.491Z" }, + { url = "https://files.pythonhosted.org/packages/ed/69/0b78f37ca3690969beee54103ce5f6021709134e8020767e93ba691a72f1/numpy-2.4.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee", size = 5192640, upload-time = "2025-12-20T16:16:35.636Z" }, + { url = "https://files.pythonhosted.org/packages/1d/2a/08569f8252abf590294dbb09a430543ec8f8cc710383abfb3e75cc73aeda/numpy-2.4.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e", size = 6541556, upload-time = "2025-12-20T16:16:37.276Z" }, + { url = "https://files.pythonhosted.org/packages/93/e9/a949885a4e177493d61519377952186b6cbfdf1d6002764c664ba28349b5/numpy-2.4.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2", size = 14396562, upload-time = "2025-12-20T16:16:38.953Z" }, + { url = "https://files.pythonhosted.org/packages/99/98/9d4ad53b0e9ef901c2ef1d550d2136f5ac42d3fd2988390a6def32e23e48/numpy-2.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a", size = 16351719, upload-time = "2025-12-20T16:16:41.503Z" }, + { url = "https://files.pythonhosted.org/packages/28/de/5f3711a38341d6e8dd619f6353251a0cdd07f3d6d101a8fd46f4ef87f895/numpy-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681", size = 16176053, upload-time = "2025-12-20T16:16:44.552Z" }, + { url = "https://files.pythonhosted.org/packages/2a/5b/2a3753dc43916501b4183532e7ace862e13211042bceafa253afb5c71272/numpy-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475", size = 18277859, upload-time = "2025-12-20T16:16:47.174Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c5/a18bcdd07a941db3076ef489d036ab16d2bfc2eae0cf27e5a26e29189434/numpy-2.4.0-cp313-cp313-win32.whl", hash = "sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344", size = 5953849, upload-time = "2025-12-20T16:16:49.554Z" }, + { url = "https://files.pythonhosted.org/packages/4f/f1/719010ff8061da6e8a26e1980cf090412d4f5f8060b31f0c45d77dd67a01/numpy-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d", size = 12302840, upload-time = "2025-12-20T16:16:51.227Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5a/b3d259083ed8b4d335270c76966cb6cf14a5d1b69e1a608994ac57a659e6/numpy-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d", size = 10308509, upload-time = "2025-12-20T16:16:53.313Z" }, + { url = "https://files.pythonhosted.org/packages/31/01/95edcffd1bb6c0633df4e808130545c4f07383ab629ac7e316fb44fff677/numpy-2.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6", size = 12491815, upload-time = "2025-12-20T16:16:55.496Z" }, + { url = "https://files.pythonhosted.org/packages/59/ea/5644b8baa92cc1c7163b4b4458c8679852733fa74ca49c942cfa82ded4e0/numpy-2.4.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5", size = 5320321, upload-time = "2025-12-20T16:16:57.468Z" }, + { url = "https://files.pythonhosted.org/packages/26/4e/e10938106d70bc21319bd6a86ae726da37edc802ce35a3a71ecdf1fdfe7f/numpy-2.4.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3", size = 6641635, upload-time = "2025-12-20T16:16:59.379Z" }, + { url = "https://files.pythonhosted.org/packages/b3/8d/a8828e3eaf5c0b4ab116924df82f24ce3416fa38d0674d8f708ddc6c8aac/numpy-2.4.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d", size = 14456053, upload-time = "2025-12-20T16:17:01.768Z" }, + { url = "https://files.pythonhosted.org/packages/68/a1/17d97609d87d4520aa5ae2dcfb32305654550ac6a35effb946d303e594ce/numpy-2.4.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3", size = 16401702, upload-time = "2025-12-20T16:17:04.235Z" }, + { url = "https://files.pythonhosted.org/packages/18/32/0f13c1b2d22bea1118356b8b963195446f3af124ed7a5adfa8fdecb1b6ca/numpy-2.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa", size = 16242493, upload-time = "2025-12-20T16:17:06.856Z" }, + { url = "https://files.pythonhosted.org/packages/ae/23/48f21e3d309fbc137c068a1475358cbd3a901b3987dcfc97a029ab3068e2/numpy-2.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c", size = 18324222, upload-time = "2025-12-20T16:17:09.392Z" }, + { url = "https://files.pythonhosted.org/packages/ac/52/41f3d71296a3dcaa4f456aaa3c6fc8e745b43d0552b6bde56571bb4b4a0f/numpy-2.4.0-cp313-cp313t-win32.whl", hash = "sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93", size = 6076216, upload-time = "2025-12-20T16:17:11.437Z" }, + { url = "https://files.pythonhosted.org/packages/35/ff/46fbfe60ab0710d2a2b16995f708750307d30eccbb4c38371ea9e986866e/numpy-2.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4", size = 12444263, upload-time = "2025-12-20T16:17:13.182Z" }, + { url = "https://files.pythonhosted.org/packages/a3/e3/9189ab319c01d2ed556c932ccf55064c5d75bb5850d1df7a482ce0badead/numpy-2.4.0-cp313-cp313t-win_arm64.whl", hash = "sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c", size = 10378265, upload-time = "2025-12-20T16:17:15.211Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ed/52eac27de39d5e5a6c9aadabe672bc06f55e24a3d9010cd1183948055d76/numpy-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c95eb6db2884917d86cde0b4d4cf31adf485c8ec36bf8696dd66fa70de96f36b", size = 16647476, upload-time = "2025-12-20T16:17:17.671Z" }, + { url = "https://files.pythonhosted.org/packages/77/c0/990ce1b7fcd4e09aeaa574e2a0a839589e4b08b2ca68070f1acb1fea6736/numpy-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:65167da969cd1ec3a1df31cb221ca3a19a8aaa25370ecb17d428415e93c1935e", size = 12374563, upload-time = "2025-12-20T16:17:20.216Z" }, + { url = "https://files.pythonhosted.org/packages/37/7c/8c5e389c6ae8f5fd2277a988600d79e9625db3fff011a2d87ac80b881a4c/numpy-2.4.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3de19cfecd1465d0dcf8a5b5ea8b3155b42ed0b639dba4b71e323d74f2a3be5e", size = 5203107, upload-time = "2025-12-20T16:17:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/e6/94/ca5b3bd6a8a70a5eec9a0b8dd7f980c1eff4b8a54970a9a7fef248ef564f/numpy-2.4.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6c05483c3136ac4c91b4e81903cb53a8707d316f488124d0398499a4f8e8ef51", size = 6538067, upload-time = "2025-12-20T16:17:24.001Z" }, + { url = "https://files.pythonhosted.org/packages/79/43/993eb7bb5be6761dde2b3a3a594d689cec83398e3f58f4758010f3b85727/numpy-2.4.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36667db4d6c1cea79c8930ab72fadfb4060feb4bfe724141cd4bd064d2e5f8ce", size = 14411926, upload-time = "2025-12-20T16:17:25.822Z" }, + { url = "https://files.pythonhosted.org/packages/03/75/d4c43b61de473912496317a854dac54f1efec3eeb158438da6884b70bb90/numpy-2.4.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9a818668b674047fd88c4cddada7ab8f1c298812783e8328e956b78dc4807f9f", size = 16354295, upload-time = "2025-12-20T16:17:28.308Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0a/b54615b47ee8736a6461a4bb6749128dd3435c5a759d5663f11f0e9af4ac/numpy-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1ee32359fb7543b7b7bd0b2f46294db27e29e7bbdf70541e81b190836cd83ded", size = 16190242, upload-time = "2025-12-20T16:17:30.993Z" }, + { url = "https://files.pythonhosted.org/packages/98/ce/ea207769aacad6246525ec6c6bbd66a2bf56c72443dc10e2f90feed29290/numpy-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e493962256a38f58283de033d8af176c5c91c084ea30f15834f7545451c42059", size = 18280875, upload-time = "2025-12-20T16:17:33.327Z" }, + { url = "https://files.pythonhosted.org/packages/17/ef/ec409437aa962ea372ed601c519a2b141701683ff028f894b7466f0ab42b/numpy-2.4.0-cp314-cp314-win32.whl", hash = "sha256:6bbaebf0d11567fa8926215ae731e1d58e6ec28a8a25235b8a47405d301332db", size = 6002530, upload-time = "2025-12-20T16:17:35.729Z" }, + { url = "https://files.pythonhosted.org/packages/5f/4a/5cb94c787a3ed1ac65e1271b968686521169a7b3ec0b6544bb3ca32960b0/numpy-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:3d857f55e7fdf7c38ab96c4558c95b97d1c685be6b05c249f5fdafcbd6f9899e", size = 12435890, upload-time = "2025-12-20T16:17:37.599Z" }, + { url = "https://files.pythonhosted.org/packages/48/a0/04b89db963af9de1104975e2544f30de89adbf75b9e75f7dd2599be12c79/numpy-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:bb50ce5fb202a26fd5404620e7ef820ad1ab3558b444cb0b55beb7ef66cd2d63", size = 10591892, upload-time = "2025-12-20T16:17:39.649Z" }, + { url = "https://files.pythonhosted.org/packages/53/e5/d74b5ccf6712c06c7a545025a6a71bfa03bdc7e0568b405b0d655232fd92/numpy-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:355354388cba60f2132df297e2d53053d4063f79077b67b481d21276d61fc4df", size = 12494312, upload-time = "2025-12-20T16:17:41.714Z" }, + { url = "https://files.pythonhosted.org/packages/c2/08/3ca9cc2ddf54dfee7ae9a6479c071092a228c68aef08252aa08dac2af002/numpy-2.4.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:1d8f9fde5f6dc1b6fc34df8162f3b3079365468703fee7f31d4e0cc8c63baed9", size = 5322862, upload-time = "2025-12-20T16:17:44.145Z" }, + { url = "https://files.pythonhosted.org/packages/87/74/0bb63a68394c0c1e52670cfff2e309afa41edbe11b3327d9af29e4383f34/numpy-2.4.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e0434aa22c821f44eeb4c650b81c7fbdd8c0122c6c4b5a576a76d5a35625ecd9", size = 6644986, upload-time = "2025-12-20T16:17:46.203Z" }, + { url = "https://files.pythonhosted.org/packages/06/8f/9264d9bdbcf8236af2823623fe2f3981d740fc3461e2787e231d97c38c28/numpy-2.4.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40483b2f2d3ba7aad426443767ff5632ec3156ef09742b96913787d13c336471", size = 14457958, upload-time = "2025-12-20T16:17:48.017Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d9/f9a69ae564bbc7236a35aa883319364ef5fd41f72aa320cc1cbe66148fe2/numpy-2.4.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6a7664ddd9746e20b7325351fe1a8408d0a2bf9c63b5e898290ddc8f09544", size = 16398394, upload-time = "2025-12-20T16:17:50.409Z" }, + { url = "https://files.pythonhosted.org/packages/34/c7/39241501408dde7f885d241a98caba5421061a2c6d2b2197ac5e3aa842d8/numpy-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ecb0019d44f4cdb50b676c5d0cb4b1eae8e15d1ed3d3e6639f986fc92b2ec52c", size = 16241044, upload-time = "2025-12-20T16:17:52.661Z" }, + { url = "https://files.pythonhosted.org/packages/7c/95/cae7effd90e065a95e59fe710eeee05d7328ed169776dfdd9f789e032125/numpy-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d0ffd9e2e4441c96a9c91ec1783285d80bf835b677853fc2770a89d50c1e48ac", size = 18321772, upload-time = "2025-12-20T16:17:54.947Z" }, + { url = "https://files.pythonhosted.org/packages/96/df/3c6c279accd2bfb968a76298e5b276310bd55d243df4fa8ac5816d79347d/numpy-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:77f0d13fa87036d7553bf81f0e1fe3ce68d14c9976c9851744e4d3e91127e95f", size = 6148320, upload-time = "2025-12-20T16:17:57.249Z" }, + { url = "https://files.pythonhosted.org/packages/92/8d/f23033cce252e7a75cae853d17f582e86534c46404dea1c8ee094a9d6d84/numpy-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b1f5b45829ac1848893f0ddf5cb326110604d6df96cdc255b0bf9edd154104d4", size = 12623460, upload-time = "2025-12-20T16:17:58.963Z" }, + { url = "https://files.pythonhosted.org/packages/a4/4f/1f8475907d1a7c4ef9020edf7f39ea2422ec896849245f00688e4b268a71/numpy-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:23a3e9d1a6f360267e8fbb38ba5db355a6a7e9be71d7fce7ab3125e88bb646c8", size = 10661799, upload-time = "2025-12-20T16:18:01.078Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ef/088e7c7342f300aaf3ee5f2c821c4b9996a1bef2aaf6a49cc8ab4883758e/numpy-2.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b54c83f1c0c0f1d748dca0af516062b8829d53d1f0c402be24b4257a9c48ada6", size = 16819003, upload-time = "2025-12-20T16:18:03.41Z" }, + { url = "https://files.pythonhosted.org/packages/ff/ce/a53017b5443b4b84517182d463fc7bcc2adb4faa8b20813f8e5f5aeb5faa/numpy-2.4.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:aabb081ca0ec5d39591fc33018cd4b3f96e1a2dd6756282029986d00a785fba4", size = 12567105, upload-time = "2025-12-20T16:18:05.594Z" }, + { url = "https://files.pythonhosted.org/packages/77/58/5ff91b161f2ec650c88a626c3905d938c89aaadabd0431e6d9c1330c83e2/numpy-2.4.0-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:8eafe7c36c8430b7794edeab3087dec7bf31d634d92f2af9949434b9d1964cba", size = 5395590, upload-time = "2025-12-20T16:18:08.031Z" }, + { url = "https://files.pythonhosted.org/packages/1d/4e/f1a084106df8c2df8132fc437e56987308e0524836aa7733721c8429d4fe/numpy-2.4.0-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2f585f52b2baf07ff3356158d9268ea095e221371f1074fadea2f42544d58b4d", size = 6709947, upload-time = "2025-12-20T16:18:09.836Z" }, + { url = "https://files.pythonhosted.org/packages/63/09/3d8aeb809c0332c3f642da812ac2e3d74fc9252b3021f8c30c82e99e3f3d/numpy-2.4.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32ed06d0fe9cae27d8fb5f400c63ccee72370599c75e683a6358dd3a4fb50aaf", size = 14535119, upload-time = "2025-12-20T16:18:12.105Z" }, + { url = "https://files.pythonhosted.org/packages/fd/7f/68f0fc43a2cbdc6bb239160c754d87c922f60fbaa0fa3cd3d312b8a7f5ee/numpy-2.4.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:57c540ed8fb1f05cb997c6761cd56db72395b0d6985e90571ff660452ade4f98", size = 16475815, upload-time = "2025-12-20T16:18:14.433Z" }, + { url = "https://files.pythonhosted.org/packages/11/73/edeacba3167b1ca66d51b1a5a14697c2c40098b5ffa01811c67b1785a5ab/numpy-2.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a39fb973a726e63223287adc6dafe444ce75af952d711e400f3bf2b36ef55a7b", size = 12489376, upload-time = "2025-12-20T16:18:16.524Z" }, ] [[package]] @@ -2501,7 +2624,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "python-dateutil" }, { name = "pytz" }, { name = "tzdata" }, @@ -2594,7 +2717,7 @@ resolution-markers = [ ] dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "types-pytz", marker = "python_full_version >= '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/39/d9/0682716a9ba539b78748f026c523ae5f280fc478381f7f1c6c037d0f0fc3/pandas_stubs-2.2.2.240909.tar.gz", hash = "sha256:3c0951a2c3e45e3475aed9d80b7147ae82f176b9e42e9fb321cfdebf3d411b3d", size = 103599, upload-time = "2024-09-09T20:55:19.76Z" } @@ -2702,7 +2825,7 @@ wheels = [ [[package]] name = "posthog" -version = "7.0.1" +version = "7.4.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14'", @@ -2719,9 +2842,9 @@ dependencies = [ { name = "six", marker = "python_full_version >= '3.10'" }, { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a2/d4/b9afe855a8a7a1bf4459c28ae4c300b40338122dc850acabefcf2c3df24d/posthog-7.0.1.tar.gz", hash = "sha256:21150562c2630a599c1d7eac94bc5c64eb6f6acbf3ff52ccf1e57345706db05a", size = 126985, upload-time = "2025-11-15T12:44:22.465Z" } +sdist = { url = "https://files.pythonhosted.org/packages/14/e5/5262d1604a3eb19b23d4e896bce87b4603fd39ec366a96b27e19e3299aef/posthog-7.4.0.tar.gz", hash = "sha256:1fb97b11960e24fcf0b80f0a6450b2311478e5a3ee6ea3c6f9284ff89060a876", size = 143780, upload-time = "2025-12-16T23:42:05.829Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/0c/8b6b20b0be71725e6e8a32dcd460cdbf62fe6df9bc656a650150dc98fedd/posthog-7.0.1-py3-none-any.whl", hash = "sha256:efe212d8d88a9ba80a20c588eab4baf4b1a5e90e40b551160a5603bb21e96904", size = 145234, upload-time = "2025-11-15T12:44:21.247Z" }, + { url = "https://files.pythonhosted.org/packages/9f/8b/13066693d7a6f94fb5da3407417bbbc3f6aa8487051294d0ef766c1567fa/posthog-7.4.0-py3-none-any.whl", hash = "sha256:f9d4e32c1c0f2110256b1aae7046ed90af312c1dbb1eecc6a9cb427733b22970", size = 166079, upload-time = "2025-12-16T23:42:04.33Z" }, ] [[package]] @@ -2746,7 +2869,7 @@ wheels = [ [[package]] name = "pre-commit" -version = "4.5.0" +version = "4.5.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14'", @@ -2762,9 +2885,9 @@ dependencies = [ { name = "pyyaml", marker = "python_full_version >= '3.10'" }, { name = "virtualenv", marker = "python_full_version >= '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/9b/6a4ffb4ed980519da959e1cf3122fc6cb41211daa58dbae1c73c0e519a37/pre_commit-4.5.0.tar.gz", hash = "sha256:dc5a065e932b19fc1d4c653c6939068fe54325af8e741e74e88db4d28a4dd66b", size = 198428, upload-time = "2025-11-22T21:02:42.304Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/f1/6d86a29246dfd2e9b6237f0b5823717f60cad94d47ddc26afa916d21f525/pre_commit-4.5.1.tar.gz", hash = "sha256:eb545fcff725875197837263e977ea257a402056661f09dae08e4b149b030a61", size = 198232, upload-time = "2025-12-16T21:14:33.552Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/c4/b2d28e9d2edf4f1713eb3c29307f1a63f3d67cf09bdda29715a36a68921a/pre_commit-4.5.0-py2.py3-none-any.whl", hash = "sha256:25e2ce09595174d9c97860a95609f9f852c0614ba602de3561e267547f2335e1", size = 226429, upload-time = "2025-11-22T21:02:40.836Z" }, + { url = "https://files.pythonhosted.org/packages/5d/19/fd3ef348460c80af7bb4669ea7926651d1f95c23ff2df18b9d24bab4f3fa/pre_commit-4.5.1-py2.py3-none-any.whl", hash = "sha256:3b3afd891e97337708c1674210f8eba659b52a38ea5f822ff142d10786221f77", size = 226437, upload-time = "2025-12-16T21:14:32.409Z" }, ] [[package]] @@ -3599,28 +3722,28 @@ wheels = [ [[package]] name = "ruff" -version = "0.14.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ed/d9/f7a0c4b3a2bf2556cd5d99b05372c29980249ef71e8e32669ba77428c82c/ruff-0.14.8.tar.gz", hash = "sha256:774ed0dd87d6ce925e3b8496feb3a00ac564bea52b9feb551ecd17e0a23d1eed", size = 5765385, upload-time = "2025-12-04T15:06:17.669Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/48/b8/9537b52010134b1d2b72870cc3f92d5fb759394094741b09ceccae183fbe/ruff-0.14.8-py3-none-linux_armv6l.whl", hash = "sha256:ec071e9c82eca417f6111fd39f7043acb53cd3fde9b1f95bbed745962e345afb", size = 13441540, upload-time = "2025-12-04T15:06:14.896Z" }, - { url = "https://files.pythonhosted.org/packages/24/00/99031684efb025829713682012b6dd37279b1f695ed1b01725f85fd94b38/ruff-0.14.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8cdb162a7159f4ca36ce980a18c43d8f036966e7f73f866ac8f493b75e0c27e9", size = 13669384, upload-time = "2025-12-04T15:06:51.809Z" }, - { url = "https://files.pythonhosted.org/packages/72/64/3eb5949169fc19c50c04f28ece2c189d3b6edd57e5b533649dae6ca484fe/ruff-0.14.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:2e2fcbefe91f9fad0916850edf0854530c15bd1926b6b779de47e9ab619ea38f", size = 12806917, upload-time = "2025-12-04T15:06:08.925Z" }, - { url = "https://files.pythonhosted.org/packages/c4/08/5250babb0b1b11910f470370ec0cbc67470231f7cdc033cee57d4976f941/ruff-0.14.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9d70721066a296f45786ec31916dc287b44040f553da21564de0ab4d45a869b", size = 13256112, upload-time = "2025-12-04T15:06:23.498Z" }, - { url = "https://files.pythonhosted.org/packages/78/4c/6c588e97a8e8c2d4b522c31a579e1df2b4d003eddfbe23d1f262b1a431ff/ruff-0.14.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2c87e09b3cd9d126fc67a9ecd3b5b1d3ded2b9c7fce3f16e315346b9d05cfb52", size = 13227559, upload-time = "2025-12-04T15:06:33.432Z" }, - { url = "https://files.pythonhosted.org/packages/23/ce/5f78cea13eda8eceac71b5f6fa6e9223df9b87bb2c1891c166d1f0dce9f1/ruff-0.14.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d62cb310c4fbcb9ee4ac023fe17f984ae1e12b8a4a02e3d21489f9a2a5f730c", size = 13896379, upload-time = "2025-12-04T15:06:02.687Z" }, - { url = "https://files.pythonhosted.org/packages/cf/79/13de4517c4dadce9218a20035b21212a4c180e009507731f0d3b3f5df85a/ruff-0.14.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:1af35c2d62633d4da0521178e8a2641c636d2a7153da0bac1b30cfd4ccd91344", size = 15372786, upload-time = "2025-12-04T15:06:29.828Z" }, - { url = "https://files.pythonhosted.org/packages/00/06/33df72b3bb42be8a1c3815fd4fae83fa2945fc725a25d87ba3e42d1cc108/ruff-0.14.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25add4575ffecc53d60eed3f24b1e934493631b48ebbc6ebaf9d8517924aca4b", size = 14990029, upload-time = "2025-12-04T15:06:36.812Z" }, - { url = "https://files.pythonhosted.org/packages/64/61/0f34927bd90925880394de0e081ce1afab66d7b3525336f5771dcf0cb46c/ruff-0.14.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c943d847b7f02f7db4201a0600ea7d244d8a404fbb639b439e987edcf2baf9a", size = 14407037, upload-time = "2025-12-04T15:06:39.979Z" }, - { url = "https://files.pythonhosted.org/packages/96/bc/058fe0aefc0fbf0d19614cb6d1a3e2c048f7dc77ca64957f33b12cfdc5ef/ruff-0.14.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb6e8bf7b4f627548daa1b69283dac5a296bfe9ce856703b03130732e20ddfe2", size = 14102390, upload-time = "2025-12-04T15:06:46.372Z" }, - { url = "https://files.pythonhosted.org/packages/af/a4/e4f77b02b804546f4c17e8b37a524c27012dd6ff05855d2243b49a7d3cb9/ruff-0.14.8-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:7aaf2974f378e6b01d1e257c6948207aec6a9b5ba53fab23d0182efb887a0e4a", size = 14230793, upload-time = "2025-12-04T15:06:20.497Z" }, - { url = "https://files.pythonhosted.org/packages/3f/52/bb8c02373f79552e8d087cedaffad76b8892033d2876c2498a2582f09dcf/ruff-0.14.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e5758ca513c43ad8a4ef13f0f081f80f08008f410790f3611a21a92421ab045b", size = 13160039, upload-time = "2025-12-04T15:06:49.06Z" }, - { url = "https://files.pythonhosted.org/packages/1f/ad/b69d6962e477842e25c0b11622548df746290cc6d76f9e0f4ed7456c2c31/ruff-0.14.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:f74f7ba163b6e85a8d81a590363bf71618847e5078d90827749bfda1d88c9cdf", size = 13205158, upload-time = "2025-12-04T15:06:54.574Z" }, - { url = "https://files.pythonhosted.org/packages/06/63/54f23da1315c0b3dfc1bc03fbc34e10378918a20c0b0f086418734e57e74/ruff-0.14.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:eed28f6fafcc9591994c42254f5a5c5ca40e69a30721d2ab18bb0bb3baac3ab6", size = 13469550, upload-time = "2025-12-04T15:05:59.209Z" }, - { url = "https://files.pythonhosted.org/packages/70/7d/a4d7b1961e4903bc37fffb7ddcfaa7beb250f67d97cfd1ee1d5cddb1ec90/ruff-0.14.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:21d48fa744c9d1cb8d71eb0a740c4dd02751a5de9db9a730a8ef75ca34cf138e", size = 14211332, upload-time = "2025-12-04T15:06:06.027Z" }, - { url = "https://files.pythonhosted.org/packages/5d/93/2a5063341fa17054e5c86582136e9895db773e3c2ffb770dde50a09f35f0/ruff-0.14.8-py3-none-win32.whl", hash = "sha256:15f04cb45c051159baebb0f0037f404f1dc2f15a927418f29730f411a79bc4e7", size = 13151890, upload-time = "2025-12-04T15:06:11.668Z" }, - { url = "https://files.pythonhosted.org/packages/02/1c/65c61a0859c0add13a3e1cbb6024b42de587456a43006ca2d4fd3d1618fe/ruff-0.14.8-py3-none-win_amd64.whl", hash = "sha256:9eeb0b24242b5bbff3011409a739929f497f3fb5fe3b5698aba5e77e8c833097", size = 14537826, upload-time = "2025-12-04T15:06:26.409Z" }, - { url = "https://files.pythonhosted.org/packages/6d/63/8b41cea3afd7f58eb64ac9251668ee0073789a3bc9ac6f816c8c6fef986d/ruff-0.14.8-py3-none-win_arm64.whl", hash = "sha256:965a582c93c63fe715fd3e3f8aa37c4b776777203d8e1d8aa3cc0c14424a4b99", size = 13634522, upload-time = "2025-12-04T15:06:43.212Z" }, +version = "0.14.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/08/52232a877978dd8f9cf2aeddce3e611b40a63287dfca29b6b8da791f5e8d/ruff-0.14.10.tar.gz", hash = "sha256:9a2e830f075d1a42cd28420d7809ace390832a490ed0966fe373ba288e77aaf4", size = 5859763, upload-time = "2025-12-18T19:28:57.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/01/933704d69f3f05ee16ef11406b78881733c186fe14b6a46b05cfcaf6d3b2/ruff-0.14.10-py3-none-linux_armv6l.whl", hash = "sha256:7a3ce585f2ade3e1f29ec1b92df13e3da262178df8c8bdf876f48fa0e8316c49", size = 13527080, upload-time = "2025-12-18T19:29:25.642Z" }, + { url = "https://files.pythonhosted.org/packages/df/58/a0349197a7dfa603ffb7f5b0470391efa79ddc327c1e29c4851e85b09cc5/ruff-0.14.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:674f9be9372907f7257c51f1d4fc902cb7cf014b9980152b802794317941f08f", size = 13797320, upload-time = "2025-12-18T19:29:02.571Z" }, + { url = "https://files.pythonhosted.org/packages/7b/82/36be59f00a6082e38c23536df4e71cdbc6af8d7c707eade97fcad5c98235/ruff-0.14.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d85713d522348837ef9df8efca33ccb8bd6fcfc86a2cde3ccb4bc9d28a18003d", size = 12918434, upload-time = "2025-12-18T19:28:51.202Z" }, + { url = "https://files.pythonhosted.org/packages/a6/00/45c62a7f7e34da92a25804f813ebe05c88aa9e0c25e5cb5a7d23dd7450e3/ruff-0.14.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6987ebe0501ae4f4308d7d24e2d0fe3d7a98430f5adfd0f1fead050a740a3a77", size = 13371961, upload-time = "2025-12-18T19:29:04.991Z" }, + { url = "https://files.pythonhosted.org/packages/40/31/a5906d60f0405f7e57045a70f2d57084a93ca7425f22e1d66904769d1628/ruff-0.14.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:16a01dfb7b9e4eee556fbfd5392806b1b8550c9b4a9f6acd3dbe6812b193c70a", size = 13275629, upload-time = "2025-12-18T19:29:21.381Z" }, + { url = "https://files.pythonhosted.org/packages/3e/60/61c0087df21894cf9d928dc04bcd4fb10e8b2e8dca7b1a276ba2155b2002/ruff-0.14.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7165d31a925b7a294465fa81be8c12a0e9b60fb02bf177e79067c867e71f8b1f", size = 14029234, upload-time = "2025-12-18T19:29:00.132Z" }, + { url = "https://files.pythonhosted.org/packages/44/84/77d911bee3b92348b6e5dab5a0c898d87084ea03ac5dc708f46d88407def/ruff-0.14.10-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c561695675b972effb0c0a45db233f2c816ff3da8dcfbe7dfc7eed625f218935", size = 15449890, upload-time = "2025-12-18T19:28:53.573Z" }, + { url = "https://files.pythonhosted.org/packages/e9/36/480206eaefa24a7ec321582dda580443a8f0671fdbf6b1c80e9c3e93a16a/ruff-0.14.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bb98fcbbc61725968893682fd4df8966a34611239c9fd07a1f6a07e7103d08e", size = 15123172, upload-time = "2025-12-18T19:29:23.453Z" }, + { url = "https://files.pythonhosted.org/packages/5c/38/68e414156015ba80cef5473d57919d27dfb62ec804b96180bafdeaf0e090/ruff-0.14.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f24b47993a9d8cb858429e97bdf8544c78029f09b520af615c1d261bf827001d", size = 14460260, upload-time = "2025-12-18T19:29:27.808Z" }, + { url = "https://files.pythonhosted.org/packages/b3/19/9e050c0dca8aba824d67cc0db69fb459c28d8cd3f6855b1405b3f29cc91d/ruff-0.14.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59aabd2e2c4fd614d2862e7939c34a532c04f1084476d6833dddef4afab87e9f", size = 14229978, upload-time = "2025-12-18T19:29:11.32Z" }, + { url = "https://files.pythonhosted.org/packages/51/eb/e8dd1dd6e05b9e695aa9dd420f4577debdd0f87a5ff2fedda33c09e9be8c/ruff-0.14.10-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:213db2b2e44be8625002dbea33bb9c60c66ea2c07c084a00d55732689d697a7f", size = 14338036, upload-time = "2025-12-18T19:29:09.184Z" }, + { url = "https://files.pythonhosted.org/packages/6a/12/f3e3a505db7c19303b70af370d137795fcfec136d670d5de5391e295c134/ruff-0.14.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b914c40ab64865a17a9a5b67911d14df72346a634527240039eb3bd650e5979d", size = 13264051, upload-time = "2025-12-18T19:29:13.431Z" }, + { url = "https://files.pythonhosted.org/packages/08/64/8c3a47eaccfef8ac20e0484e68e0772013eb85802f8a9f7603ca751eb166/ruff-0.14.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1484983559f026788e3a5c07c81ef7d1e97c1c78ed03041a18f75df104c45405", size = 13283998, upload-time = "2025-12-18T19:29:06.994Z" }, + { url = "https://files.pythonhosted.org/packages/12/84/534a5506f4074e5cc0529e5cd96cfc01bb480e460c7edf5af70d2bcae55e/ruff-0.14.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:c70427132db492d25f982fffc8d6c7535cc2fd2c83fc8888f05caaa248521e60", size = 13601891, upload-time = "2025-12-18T19:28:55.811Z" }, + { url = "https://files.pythonhosted.org/packages/0d/1e/14c916087d8598917dbad9b2921d340f7884824ad6e9c55de948a93b106d/ruff-0.14.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5bcf45b681e9f1ee6445d317ce1fa9d6cba9a6049542d1c3d5b5958986be8830", size = 14336660, upload-time = "2025-12-18T19:29:16.531Z" }, + { url = "https://files.pythonhosted.org/packages/f2/1c/d7b67ab43f30013b47c12b42d1acd354c195351a3f7a1d67f59e54227ede/ruff-0.14.10-py3-none-win32.whl", hash = "sha256:104c49fc7ab73f3f3a758039adea978869a918f31b73280db175b43a2d9b51d6", size = 13196187, upload-time = "2025-12-18T19:29:19.006Z" }, + { url = "https://files.pythonhosted.org/packages/fb/9c/896c862e13886fae2af961bef3e6312db9ebc6adc2b156fe95e615dee8c1/ruff-0.14.10-py3-none-win_amd64.whl", hash = "sha256:466297bd73638c6bdf06485683e812db1c00c7ac96d4ddd0294a338c62fdc154", size = 14661283, upload-time = "2025-12-18T19:29:30.16Z" }, + { url = "https://files.pythonhosted.org/packages/74/31/b0e29d572670dca3674eeee78e418f20bdf97fa8aa9ea71380885e175ca0/ruff-0.14.10-py3-none-win_arm64.whl", hash = "sha256:e51d046cf6dda98a4633b8a8a771451107413b0f07183b2bef03f075599e44e6", size = 13729839, upload-time = "2025-12-18T19:28:48.636Z" }, ] [[package]] @@ -3744,7 +3867,7 @@ resolution-markers = [ "python_full_version == '3.11.*'", ] dependencies = [ - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0a/ca/d8ace4f98322d01abcd52d381134344bf7b431eba7ed8b42bdea5a3c2ac9/scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb", size = 30597883, upload-time = "2025-10-28T17:38:54.068Z" } wheels = [ @@ -3812,15 +3935,15 @@ wheels = [ [[package]] name = "sentry-sdk" -version = "2.47.0" +version = "2.48.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4a/2a/d225cbf87b6c8ecce5664db7bcecb82c317e448e3b24a2dcdaacb18ca9a7/sentry_sdk-2.47.0.tar.gz", hash = "sha256:8218891d5e41b4ea8d61d2aed62ed10c80e39d9f2959d6f939efbf056857e050", size = 381895, upload-time = "2025-12-03T14:06:36.846Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/f0/0e9dc590513d5e742d7799e2038df3a05167cba084c6ca4f3cdd75b55164/sentry_sdk-2.48.0.tar.gz", hash = "sha256:5213190977ff7fdff8a58b722fb807f8d5524a80488626ebeda1b5676c0c1473", size = 384828, upload-time = "2025-12-16T14:55:41.722Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/ac/d6286ea0d49e7b58847faf67b00e56bb4ba3d525281e2ac306e1f1f353da/sentry_sdk-2.47.0-py2.py3-none-any.whl", hash = "sha256:d72f8c61025b7d1d9e52510d03a6247b280094a327dd900d987717a4fce93412", size = 411088, upload-time = "2025-12-03T14:06:35.374Z" }, + { url = "https://files.pythonhosted.org/packages/4d/19/8d77f9992e5cbfcaa9133c3bf63b4fbbb051248802e1e803fed5c552fbb2/sentry_sdk-2.48.0-py2.py3-none-any.whl", hash = "sha256:6b12ac256769d41825d9b7518444e57fa35b5642df4c7c5e322af4d2c8721172", size = 414555, upload-time = "2025-12-16T14:55:40.152Z" }, ] [[package]] @@ -3876,6 +3999,26 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, ] +[[package]] +name = "textual" +version = "6.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, extra = ["linkify"], marker = "python_full_version < '3.10'" }, + { name = "markdown-it-py", version = "4.0.0", source = { registry = "https://pypi.org/simple" }, extra = ["linkify"], marker = "python_full_version >= '3.10'" }, + { name = "mdit-py-plugins", version = "0.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "mdit-py-plugins", version = "0.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, + { name = "platformdirs", version = "4.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pygments" }, + { name = "rich" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/06/906f86bbc59ec7cd3fb424250e19ce670406d1f28e49e86c2221e9fd7ed2/textual-6.11.0.tar.gz", hash = "sha256:08237ebda0cfbbfd1a4e2fd3039882b35894a73994f6f0fcc12c5b0d78acf3cc", size = 1584292, upload-time = "2025-12-18T10:48:38.033Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/fc/5e2988590ff2e0128eea6446806c904445a44e17256c67141573ea16b5a5/textual-6.11.0-py3-none-any.whl", hash = "sha256:9e663b73ed37123a9b13c16a0c85e09ef917a4cfded97814361ed5cccfa40f89", size = 714886, upload-time = "2025-12-18T10:48:36.269Z" }, +] + [[package]] name = "tomli" version = "2.3.0" @@ -4004,11 +4147,11 @@ resolution-markers = [ "python_full_version == '3.10.*'", ] dependencies = [ - { name = "filelock", version = "3.20.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "filelock", version = "3.20.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "fsspec", version = "2025.12.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "jinja2", marker = "python_full_version >= '3.10'" }, { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, - { name = "networkx", version = "3.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "nvidia-cublas-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "nvidia-cuda-cupti-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "nvidia-cuda-nvrtc-cu12", marker = "python_full_version >= '3.10' and platform_machine == 'x86_64' and sys_platform == 'linux'" }, @@ -4205,11 +4348,11 @@ wheels = [ [[package]] name = "types-psutil" -version = "7.1.3.20251202" +version = "7.1.3.20251211" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/56/38/fe935d9e9e70f9f0aaa04b743673a72acafcb6410d7a565c7c333348faa3/types_psutil-7.1.3.20251202.tar.gz", hash = "sha256:5cfecaced7c486fb3995bb290eab45043d697a261718aca01b9b340d1ab7968a", size = 24948, upload-time = "2025-12-02T03:10:58.301Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d2/d5/85165865b060fed80b5991574c2ae0ddfd4786398dc8bceddfe0a8960b74/types_psutil-7.1.3.20251211.tar.gz", hash = "sha256:2c25f8fd3a1a4aebdffb861b97755c9a2d5d8019dd6ec1a2f2a77ec796652c89", size = 25198, upload-time = "2025-12-11T03:16:44.651Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/c3/7452fb13e3322885aa1f3c4b754fbb325eb666185656cb5982d720cc8fec/types_psutil-7.1.3.20251202-py3-none-any.whl", hash = "sha256:39bfc44780de7ab686c65169e36a7969db09e7f39d92de643b55789292953400", size = 31843, upload-time = "2025-12-02T03:10:57.153Z" }, + { url = "https://files.pythonhosted.org/packages/29/61/658be05b56aeec195386b3f5c48cfa5bdaf8e989de3e4d802eeba457bd05/types_psutil-7.1.3.20251211-py3-none-any.whl", hash = "sha256:369872d955d7d47d77f4832b41e2300f832126e3fa97eb107d2d6a294c23c650", size = 32055, upload-time = "2025-12-11T03:16:43.864Z" }, ] [[package]] @@ -4339,11 +4482,20 @@ wheels = [ [[package]] name = "tzdata" -version = "2025.2" +version = "2025.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, +] + +[[package]] +name = "uc-micro-py" +version = "1.0.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } +sdist = { url = "https://files.pythonhosted.org/packages/91/7a/146a99696aee0609e3712f2b44c6274566bc368dfe8375191278045186b8/uc-micro-py-1.0.3.tar.gz", hash = "sha256:d321b92cff673ec58027c04015fcaa8bb1e005478643ff4a500882eaab88c48a", size = 6043, upload-time = "2024-02-09T16:52:01.654Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, + { url = "https://files.pythonhosted.org/packages/37/87/1f677586e8ac487e29672e4b17455758fce261de06a0d086167bb760361a/uc_micro_py-1.0.3-py3-none-any.whl", hash = "sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5", size = 6229, upload-time = "2024-02-09T16:52:00.371Z" }, ] [[package]] @@ -4357,37 +4509,37 @@ wheels = [ [[package]] name = "urllib3" -version = "2.6.0" +version = "2.6.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/43/554c2569b62f49350597348fc3ac70f786e3c32e7f19d266e19817812dd3/urllib3-2.6.0.tar.gz", hash = "sha256:cb9bcef5a4b345d5da5d145dc3e30834f58e8018828cbc724d30b4cb7d4d49f1", size = 432585, upload-time = "2025-12-05T15:08:47.885Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/24/a2a2ed9addd907787d7aa0355ba36a6cadf1768b934c652ea78acbd59dcd/urllib3-2.6.2.tar.gz", hash = "sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797", size = 432930, upload-time = "2025-12-11T15:56:40.252Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/56/1a/9ffe814d317c5224166b23e7c47f606d6e473712a2fad0f704ea9b99f246/urllib3-2.6.0-py3-none-any.whl", hash = "sha256:c90f7a39f716c572c4e3e58509581ebd83f9b59cced005b7db7ad2d22b0db99f", size = 131083, upload-time = "2025-12-05T15:08:45.983Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl", hash = "sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd", size = 131182, upload-time = "2025-12-11T15:56:38.584Z" }, ] [[package]] name = "uv" -version = "0.9.16" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bc/21/1a01209d34d49135151edd058bfefe395fd8c7f17233754d85c036311c4c/uv-0.9.16.tar.gz", hash = "sha256:b73269213e22e8638d14d0f8ae1bef34a0a3c20a3bd2010544456d36159e357d", size = 3806010, upload-time = "2025-12-06T14:19:17.889Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/3c/dfea2ce3f863f5fe3762d6305ff54b05d49c36d531c452e0483b226899b4/uv-0.9.16-py3-none-linux_armv6l.whl", hash = "sha256:748b6d408429d9d9ee3e59a33e714bf41471b8534c8fc1526e0d8b695c7304e1", size = 21086205, upload-time = "2025-12-06T14:18:49.667Z" }, - { url = "https://files.pythonhosted.org/packages/21/73/9b8059692dff670b10cc91aa7fb130397e35e22895f47a0d87b1fcd3c1b9/uv-0.9.16-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a4add59e5fb179ff01a8dc02cd24a9c7dcd8a60d3744c2dfacf2818eb709a1de", size = 20271218, upload-time = "2025-12-06T14:19:36.686Z" }, - { url = "https://files.pythonhosted.org/packages/73/d3/2f81803f4fe818b8a1f0c256523a1fed17372d8b901798a92b6316c42757/uv-0.9.16-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ac60c04510e4710370762c8d7f9382f269b881efacc4262e2229ef27df39441c", size = 18831407, upload-time = "2025-12-06T14:19:03.524Z" }, - { url = "https://files.pythonhosted.org/packages/16/42/13bd057513b7616ec0416d070186e410474f8f9c9fa48b965561a8d214af/uv-0.9.16-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:5cacb026d93e9be53f9c74ee4907d2df8c3d94c7b24b1c3130f0aee62b6a0b86", size = 20551474, upload-time = "2025-12-06T14:18:37.936Z" }, - { url = "https://files.pythonhosted.org/packages/94/83/94c46b6f00fb9602cdb1c4f38f0226643f0151ba082544c516d866af84c8/uv-0.9.16-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cd1a625a4cd13a45a667297c30cceb1393167c413ee3fb7ed46606a857abb4fd", size = 20704842, upload-time = "2025-12-06T14:19:20.861Z" }, - { url = "https://files.pythonhosted.org/packages/8e/0c/30fa6f16f31931d20db626f607783ada5e2f01d2307ee51fc477054b779b/uv-0.9.16-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69b405c7de06a8290eae6b246397ad2a3bda8b52e3b8f445a8417d9f62d938e8", size = 21681575, upload-time = "2025-12-06T14:18:54.972Z" }, - { url = "https://files.pythonhosted.org/packages/3c/e6/6a6acdde5d7df54c65ea277fded6e480ff79ffc00d6c8c3404d0142ca5d5/uv-0.9.16-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:7e2ea8e2c8e77c6d3406a66155b07b445107085d240fe52e33d7f5180f356028", size = 23322212, upload-time = "2025-12-06T14:19:11.298Z" }, - { url = "https://files.pythonhosted.org/packages/1d/40/189099b44b9bd02d594dedafcd5da39f4d758e4690c504b624a61cb9eea8/uv-0.9.16-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f231876fa98247e8e009a91a5ea4c032e2f3315f141510259507f847f154254d", size = 22901411, upload-time = "2025-12-06T14:19:24.856Z" }, - { url = "https://files.pythonhosted.org/packages/a7/76/f09c9967648dc22c01d6cf8ce9eeb8b83fdf19c6f0a4090607be608dbcf9/uv-0.9.16-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c43af679a125f41b2f0fe9801ec640e9971d6c24d9e3bea2eaea4d56f240d5ed", size = 21970469, upload-time = "2025-12-06T14:19:15.531Z" }, - { url = "https://files.pythonhosted.org/packages/d1/24/3d737f69753143bba3808d18a1ec7e972cf5d337fbe1dbad6223a3d8d88f/uv-0.9.16-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13217422d30f5c70d37409dd5064d8dbc5a58c1cbaa29f081f43586195a50cc9", size = 22009128, upload-time = "2025-12-06T14:19:28.771Z" }, - { url = "https://files.pythonhosted.org/packages/c6/1a/261d30ac548290bf13c743101c4a08bc3c37f001d3a45b8d0684fe2d151a/uv-0.9.16-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:f06a6e172f34c70865784ff9108a1eabc5a99c97363d9ee587884b111bb220d2", size = 20698915, upload-time = "2025-12-06T14:19:40.497Z" }, - { url = "https://files.pythonhosted.org/packages/21/31/be1651da4398ee7d5064e712a80f0ad83dc47533531f78fb35ae237f1917/uv-0.9.16-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:307336087b53e0a1e6e1c7ec4633ca0bf11be786c692e23c3a343cac37b3e013", size = 21936423, upload-time = "2025-12-06T14:18:41.815Z" }, - { url = "https://files.pythonhosted.org/packages/81/2d/953ddab1cbef688ceb365b571249ce333e7bc8a70af894d1f85e969dc427/uv-0.9.16-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:0b1e32a5c4024b8628b2799d407ffa7aa913ca1554258e963a516936119baba1", size = 20656496, upload-time = "2025-12-06T14:19:44.2Z" }, - { url = "https://files.pythonhosted.org/packages/e8/9d/ef3ff37c6485a3d482c774da0cdb0cb7415a3e267af3b000978c10e0264b/uv-0.9.16-py3-none-musllinux_1_1_i686.whl", hash = "sha256:c21aa40106a902a531a3890d414dd3a418db4a17275f3a3829d08ddc1888bb2d", size = 21154195, upload-time = "2025-12-06T14:19:07.217Z" }, - { url = "https://files.pythonhosted.org/packages/b5/8b/645a28fa9ff93dfe037385a04e27b45cd7335173c7c6239d157b6a09d623/uv-0.9.16-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:0d012ef231699cad1eaf9ab1f5b076522970dcf87bfba3a684e66a02c6a1575d", size = 22207319, upload-time = "2025-12-06T14:18:59.521Z" }, - { url = "https://files.pythonhosted.org/packages/a7/7a/c4e8bc5b759d5da4fcabe0b1fc876f67913da4880d0cec34e9e6418ff93c/uv-0.9.16-py3-none-win32.whl", hash = "sha256:0229a4dfd0ff7e257bcd791f2d78cf1d682b01856d52d95602c56bb5ed97cc72", size = 19908839, upload-time = "2025-12-06T14:18:46.032Z" }, - { url = "https://files.pythonhosted.org/packages/3b/21/6ecf7db074235552d7b0be84c48d934e9916809d7dafb96d9a1019dd2ded/uv-0.9.16-py3-none-win_amd64.whl", hash = "sha256:e3e9a69a463607b9886afa34ce68dadf9a378eb6d191c878156fd8864e604c1e", size = 22033348, upload-time = "2025-12-06T14:19:48.091Z" }, - { url = "https://files.pythonhosted.org/packages/db/a1/4c44988817b72b17f09010983fd40b05f76ce54988fbdd707a8a33cfd498/uv-0.9.16-py3-none-win_arm64.whl", hash = "sha256:18d430980e7f4915a42854bc98a76f87f30da8859469a864fcf33e0a31fafdd1", size = 20396419, upload-time = "2025-12-06T14:19:32.586Z" }, +version = "0.9.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/03/1afff9e6362dc9d3a9e03743da0a4b4c7a0809f859c79eb52bbae31ea582/uv-0.9.18.tar.gz", hash = "sha256:17b5502f7689c4dc1fdeee9d8437a9a6664dcaa8476e70046b5f4753559533f5", size = 3824466, upload-time = "2025-12-16T15:45:11.81Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/9c/92fad10fcee8ea170b66442d95fd2af308fe9a107909ded4b3cc384fdc69/uv-0.9.18-py3-none-linux_armv6l.whl", hash = "sha256:e9e4915bb280c1f79b9a1c16021e79f61ed7c6382856ceaa99d53258cb0b4951", size = 21345538, upload-time = "2025-12-16T15:45:13.992Z" }, + { url = "https://files.pythonhosted.org/packages/81/b1/b0e5808e05acb54aa118c625d9f7b117df614703b0cbb89d419d03d117f3/uv-0.9.18-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d91abfd2649987996e3778729140c305ef0f6ff5909f55aac35c3c372544a24f", size = 20439572, upload-time = "2025-12-16T15:45:26.397Z" }, + { url = "https://files.pythonhosted.org/packages/b7/0b/9487d83adf5b7fd1e20ced33f78adf84cb18239c3d7e91f224cedba46c08/uv-0.9.18-py3-none-macosx_11_0_arm64.whl", hash = "sha256:cf33f4146fd97e94cdebe6afc5122208eea8c55b65ca4127f5a5643c9717c8b8", size = 18952907, upload-time = "2025-12-16T15:44:48.399Z" }, + { url = "https://files.pythonhosted.org/packages/58/92/c8f7ae8900eff8e4ce1f7826d2e1e2ad5a95a5f141abdb539865aff79930/uv-0.9.18-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:edf965e9a5c55f74020ac82285eb0dfe7fac4f325ad0a7afc816290269ecfec1", size = 20772495, upload-time = "2025-12-16T15:45:29.614Z" }, + { url = "https://files.pythonhosted.org/packages/5a/28/9831500317c1dd6cde5099e3eb3b22b88ac75e47df7b502f6aef4df5750e/uv-0.9.18-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae10a941bd7ca1ee69edbe3998c34dce0a9fc2d2406d98198343daf7d2078493", size = 20949623, upload-time = "2025-12-16T15:44:57.482Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ff/1fe1ffa69c8910e54dd11f01fb0765d4fd537ceaeb0c05fa584b6b635b82/uv-0.9.18-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1669a95b588f613b13dd10e08ced6d5bcd79169bba29a2240eee87532648790", size = 21920580, upload-time = "2025-12-16T15:44:39.009Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ee/eed3ec7679ee80e16316cfc95ed28ef6851700bcc66edacfc583cbd2cc47/uv-0.9.18-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:11e1e406590d3159138288203a41ff8a8904600b8628a57462f04ff87d62c477", size = 23491234, upload-time = "2025-12-16T15:45:32.59Z" }, + { url = "https://files.pythonhosted.org/packages/78/58/64b15df743c79ad03ea7fbcbd27b146ba16a116c57f557425dd4e44d6684/uv-0.9.18-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e82078d3c622cb4c60da87f156168ffa78b9911136db7ffeb8e5b0a040bf30e", size = 23095438, upload-time = "2025-12-16T15:45:17.916Z" }, + { url = "https://files.pythonhosted.org/packages/43/6d/3d3dae71796961603c3871699e10d6b9de2e65a3c327b58d4750610a5f93/uv-0.9.18-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704abaf6e76b4d293fc1f24bef2c289021f1df0de9ed351f476cbbf67a7edae0", size = 22140992, upload-time = "2025-12-16T15:44:45.527Z" }, + { url = "https://files.pythonhosted.org/packages/31/91/1042d0966a30e937df500daed63e1f61018714406ce4023c8a6e6d2dcf7c/uv-0.9.18-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3332188fd8d96a68e5001409a52156dced910bf1bc41ec3066534cffcd46eb68", size = 22229626, upload-time = "2025-12-16T15:45:20.712Z" }, + { url = "https://files.pythonhosted.org/packages/5a/1f/0a4a979bb2bf6e1292cc57882955bf1d7757cad40b1862d524c59c2a2ad8/uv-0.9.18-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:b7295e6d505f1fd61c54b1219e3b18e11907396333a9fa61cefe489c08fc7995", size = 20896524, upload-time = "2025-12-16T15:45:06.799Z" }, + { url = "https://files.pythonhosted.org/packages/a5/3c/24f92e56af00cac7d9bed2888d99a580f8093c8745395ccf6213bfccf20b/uv-0.9.18-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:62ea0e518dd4ab76e6f06c0f43a25898a6342a3ecf996c12f27f08eb801ef7f1", size = 22077340, upload-time = "2025-12-16T15:44:51.271Z" }, + { url = "https://files.pythonhosted.org/packages/9c/3e/73163116f748800e676bf30cee838448e74ac4cc2f716c750e1705bc3fe4/uv-0.9.18-py3-none-musllinux_1_1_armv7l.whl", hash = "sha256:8bd073e30030211ba01206caa57b4d63714e1adee2c76a1678987dd52f72d44d", size = 20932956, upload-time = "2025-12-16T15:45:00.3Z" }, + { url = "https://files.pythonhosted.org/packages/59/1b/a26990b51a17de1ffe41fbf2e30de3a98f0e0bce40cc60829fb9d9ed1a8a/uv-0.9.18-py3-none-musllinux_1_1_i686.whl", hash = "sha256:f248e013d10e1fc7a41f94310628b4a8130886b6d683c7c85c42b5b36d1bcd02", size = 21357247, upload-time = "2025-12-16T15:45:23.575Z" }, + { url = "https://files.pythonhosted.org/packages/5f/20/b6ba14fdd671e9237b22060d7422aba4a34503e3e42d914dbf925eff19aa/uv-0.9.18-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:17bedf2b0791e87d889e1c7f125bd5de77e4b7579aec372fa06ba832e07c957e", size = 22443585, upload-time = "2025-12-16T15:44:42.213Z" }, + { url = "https://files.pythonhosted.org/packages/5e/da/1b3dd596964f90a122cfe94dcf5b6b89cf5670eb84434b8c23864382576f/uv-0.9.18-py3-none-win32.whl", hash = "sha256:de6f0bb3e9c18e484545bd1549ec3c956968a141a393d42e2efb25281cb62787", size = 20091088, upload-time = "2025-12-16T15:45:03.225Z" }, + { url = "https://files.pythonhosted.org/packages/11/0b/50e13ebc1eedb36d88524b7740f78351be33213073e3faf81ac8925d0c6e/uv-0.9.18-py3-none-win_amd64.whl", hash = "sha256:c82b0e2e36b33e2146fba5f0ae6906b9679b3b5fe6a712e5d624e45e441e58e9", size = 22181193, upload-time = "2025-12-16T15:44:54.394Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d4/0bf338d863a3d9e5545e268d77a8e6afdd75d26bffc939603042f2e739f9/uv-0.9.18-py3-none-win_arm64.whl", hash = "sha256:4c4ce0ed080440bbda2377488575d426867f94f5922323af6d4728a1cd4d091d", size = 20564933, upload-time = "2025-12-16T15:45:09.819Z" }, ] [[package]] @@ -4397,7 +4549,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock", version = "3.19.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "filelock", version = "3.20.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "filelock", version = "3.20.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "platformdirs", version = "4.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, @@ -4462,7 +4614,7 @@ resolution-markers = [ "python_full_version == '3.11.*'", ] dependencies = [ - { name = "numpy", version = "2.3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "packaging", marker = "python_full_version >= '3.11'" }, { name = "pandas", marker = "python_full_version >= '3.11'" }, ] From f9cb3dbebc7b1c33d6648177c19584b74a4fe162 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Sat, 20 Dec 2025 21:00:10 -0500 Subject: [PATCH 02/12] local dev --- pyproject.toml | 4 +- uv.lock | 145 +++++++------------------------------------------ 2 files changed, 21 insertions(+), 128 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 5b4d4718d..3bbc08139 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,7 +28,6 @@ dependencies = [ "humanize>=4.0.0", "posthog>=3.0.0", "click>=8.1.0", - "inquirer>=3.0.0", "sentry-sdk>=1.40.6,<3.0.0", "parameterized>=0.9.0", "isort>=5.11.0", @@ -201,7 +200,7 @@ install_types = true plugins = ["pydantic.mypy"] [[tool.mypy.overrides]] -module = ["jedi", "jedi.api.classes", "inquirer", "inquirer.themes", "numba"] +module = ["jedi", "jedi.api.classes", "inquirer", "inquirer.themes", "inquirer_textual", "inquirer_textual.common.Choice", "numba"] ignore_missing_imports = true [tool.pydantic-mypy] @@ -283,6 +282,7 @@ workspace = { members = ["codeflash-benchmark"] } [tool.uv.sources] codeflash-benchmark = { workspace = true } +inquirer-textual = { path = "../inquirer-textual", editable = true } [tool.uv-dynamic-versioning] enable = true diff --git a/uv.lock b/uv.lock index f4d5665d1..d6c9d40a5 100644 --- a/uv.lock +++ b/uv.lock @@ -26,15 +26,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, ] -[[package]] -name = "ansicon" -version = "1.89.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b6/e2/1c866404ddbd280efedff4a9f15abfe943cb83cde6e895022370f3a61f85/ansicon-1.89.0.tar.gz", hash = "sha256:e4d039def5768a47e4afec8e89e83ec3ae5a26bf00ad851f914d1240b444d2b1", size = 67312, upload-time = "2019-04-29T20:23:57.314Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/75/f9/f1c10e223c7b56a38109a3f2eb4e7fe9a757ea3ed3a166754fb30f65e466/ansicon-1.89.0-py2.py3-none-any.whl", hash = "sha256:f1def52d17f65c2c9682cf8370c03f541f410c1752d6a14029f97318e4b9dfec", size = 63675, upload-time = "2019-04-29T20:23:53.83Z" }, -] - [[package]] name = "asttokens" version = "3.0.1" @@ -169,19 +160,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/68/11/21331aed19145a952ad28fca2756a1433ee9308079bd03bd898e903a2e53/black-25.12.0-py3-none-any.whl", hash = "sha256:48ceb36c16dbc84062740049eef990bb2ce07598272e673c17d1a7720c71c828", size = 206191, upload-time = "2025-12-08T01:40:50.963Z" }, ] -[[package]] -name = "blessed" -version = "1.25.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "jinxed", marker = "sys_platform == 'win32'" }, - { name = "wcwidth" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/33/cd/eed8b82f1fabcb817d84b24d0780b86600b5c3df7ec4f890bcbb2371b0ad/blessed-1.25.0.tar.gz", hash = "sha256:606aebfea69f85915c7ca6a96eb028e0031d30feccc5688e13fd5cec8277b28d", size = 6746381, upload-time = "2025-11-18T18:43:52.71Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/2c/e9b6dd824fb6e76dbd39a308fc6f497320afd455373aac8518ca3eba7948/blessed-1.25.0-py3-none-any.whl", hash = "sha256:e52b9f778b9e10c30b3f17f6b5f5d2208d1e9b53b270f1d94fc61a243fc4708f", size = 95646, upload-time = "2025-11-18T18:43:50.924Z" }, -] - [[package]] name = "cattrs" version = "25.3.0" @@ -390,8 +368,6 @@ dependencies = [ { name = "gitpython" }, { name = "humanize", version = "4.13.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "humanize", version = "4.15.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "inquirer", version = "3.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.9.2'" }, - { name = "inquirer", version = "3.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9.2'" }, { name = "inquirer-textual" }, { name = "isort", version = "6.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "isort", version = "7.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, @@ -478,8 +454,7 @@ requires-dist = [ { name = "filelock" }, { name = "gitpython", specifier = ">=3.1.31" }, { name = "humanize", specifier = ">=4.0.0" }, - { name = "inquirer", specifier = ">=3.0.0" }, - { name = "inquirer-textual", specifier = ">=0.2.0" }, + { name = "inquirer-textual", editable = "../inquirer-textual" }, { name = "isort", specifier = ">=5.11.0" }, { name = "jedi", specifier = ">=0.19.1" }, { name = "junitparser", specifier = ">=3.1.0" }, @@ -873,19 +848,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, ] -[[package]] -name = "editor" -version = "1.6.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "runs" }, - { name = "xmod" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2a/92/734a4ab345914259cb6146fd36512608ea42be16195375c379046f33283d/editor-1.6.6.tar.gz", hash = "sha256:bb6989e872638cd119db9a4fce284cd8e13c553886a1c044c6b8d8a160c871f8", size = 3197, upload-time = "2024-01-25T10:44:59.909Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/c2/4bc8cd09b14e28ce3f406a8b05761bed0d785d1ca8c2a5c6684d884c66a2/editor-1.6.6-py3-none-any.whl", hash = "sha256:e818e6913f26c2a81eadef503a2741d7cca7f235d20e217274a009ecd5a74abf", size = 4017, upload-time = "2024-01-25T10:44:58.66Z" }, -] - [[package]] name = "eval-type-backport" version = "0.3.1" @@ -900,7 +862,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -1099,55 +1061,28 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] -[[package]] -name = "inquirer" -version = "3.4.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.9.2'", -] -dependencies = [ - { name = "blessed", marker = "python_full_version < '3.9.2'" }, - { name = "editor", marker = "python_full_version < '3.9.2'" }, - { name = "readchar", marker = "python_full_version < '3.9.2'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f3/06/ef91eb8f3feafb736aa33dcb278fc9555d17861aa571b684715d095db24d/inquirer-3.4.0.tar.gz", hash = "sha256:8edc99c076386ee2d2204e5e3653c2488244e82cb197b2d498b3c1b5ffb25d0b", size = 14472, upload-time = "2024-08-12T12:03:43.83Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/b2/be907c8c0f8303bc4b10089f5470014c3bf3521e9b8d3decf3037fd94725/inquirer-3.4.0-py3-none-any.whl", hash = "sha256:bb0ec93c833e4ce7b51b98b1644b0a4d2bb39755c39787f6a504e4fee7a11b60", size = 18077, upload-time = "2024-08-12T12:03:41.589Z" }, -] - -[[package]] -name = "inquirer" -version = "3.4.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.14'", - "python_full_version == '3.13.*'", - "python_full_version == '3.12.*'", - "python_full_version == '3.11.*'", - "python_full_version == '3.10.*'", - "python_full_version >= '3.9.2' and python_full_version < '3.10'", -] -dependencies = [ - { name = "blessed", marker = "python_full_version >= '3.9.2'" }, - { name = "editor", marker = "python_full_version >= '3.9.2'" }, - { name = "readchar", marker = "python_full_version >= '3.9.2'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c1/79/165579fdcd3c2439503732ae76394bf77f5542f3dd18135b60e808e4813c/inquirer-3.4.1.tar.gz", hash = "sha256:60d169fddffe297e2f8ad54ab33698249ccfc3fc377dafb1e5cf01a0efb9cbe5", size = 14069, upload-time = "2025-08-02T18:36:27.901Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/fd/7c404169a3e04a908df0644893a331f253a7f221961f2b6c0cf44430ae5a/inquirer-3.4.1-py3-none-any.whl", hash = "sha256:717bf146d547b595d2495e7285fd55545cff85e5ce01decc7487d2ec6a605412", size = 18152, upload-time = "2025-08-02T18:36:26.753Z" }, -] - [[package]] name = "inquirer-textual" -version = "0.2.0" -source = { registry = "https://pypi.org/simple" } +version = "0.1.0" +source = { editable = "../inquirer-textual" } dependencies = [ { name = "textual" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/92/e3/04a9c586f4ccbf9b7fcf28365036d545a75f930cff08b719d88170a59ac3/inquirer_textual-0.2.0.tar.gz", hash = "sha256:fe6e40b09d220987ecdf82785cf6c55df0d639dd33024965cef4533e7fc8bd44", size = 394648, upload-time = "2025-12-11T22:16:36.147Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/2c/7f2a89d9e82224d58fc9ba0bf1e239183b923d2537b608cc84bcfc17ed1e/inquirer_textual-0.2.0-py3-none-any.whl", hash = "sha256:6d2065f7b3fb1eecbad3df3e887c328e8dcf2ad6d706552628866ffde92c505c", size = 15964, upload-time = "2025-12-11T22:16:35.023Z" }, + +[package.metadata] +requires-dist = [{ name = "textual", specifier = ">=6.4.0" }] + +[package.metadata.requires-dev] +dev = [ + { name = "mkdocs-glightbox", specifier = ">=0.5.2" }, + { name = "mkdocs-material", specifier = ">=9.6.21" }, + { name = "mkdocstrings", extras = ["python"], specifier = ">=0.30.1" }, + { name = "poethepoet", specifier = ">=0.37.0" }, + { name = "pytest", specifier = ">=8.4.2" }, + { name = "pytest-asyncio", specifier = ">=1.2.0" }, + { name = "pytest-textual-snapshot", specifier = ">=1.1.0" }, + { name = "python-semantic-release", specifier = ">=9.21.0" }, + { name = "textual-dev", specifier = ">=1.8.0" }, ] [[package]] @@ -1468,18 +1403,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] -[[package]] -name = "jinxed" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ansicon", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/20/d0/59b2b80e7a52d255f9e0ad040d2e826342d05580c4b1d7d7747cfb8db731/jinxed-1.3.0.tar.gz", hash = "sha256:1593124b18a41b7a3da3b078471442e51dbad3d77b4d4f2b0c26ab6f7d660dbf", size = 80981, upload-time = "2024-07-31T22:39:18.854Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/e3/0e0014d6ab159d48189e92044ace13b1e1fe9aa3024ba9f4e8cf172aa7c2/jinxed-1.3.0-py2.py3-none-any.whl", hash = "sha256:b993189f39dc2d7504d802152671535b06d380b26d78070559551cbf92df4fc5", size = 33085, upload-time = "2024-07-31T22:39:17.426Z" }, -] - [[package]] name = "junitparser" version = "4.0.2" @@ -3348,15 +3271,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c0/28/26534bed77109632a956977f60d8519049f545abc39215d086e33a61f1f2/pyyaml_ft-8.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:de04cfe9439565e32f178106c51dd6ca61afaa2907d143835d501d84703d3793", size = 171579, upload-time = "2025-06-10T15:32:14.34Z" }, ] -[[package]] -name = "readchar" -version = "4.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dd/f8/8657b8cbb4ebeabfbdf991ac40eca8a1d1bd012011bd44ad1ed10f5cb494/readchar-4.2.1.tar.gz", hash = "sha256:91ce3faf07688de14d800592951e5575e9c7a3213738ed01d394dcc949b79adb", size = 9685, upload-time = "2024-11-04T18:28:07.757Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/10/e4b1e0e5b6b6745c8098c275b69bc9d73e9542d5c7da4f137542b499ed44/readchar-4.2.1-py3-none-any.whl", hash = "sha256:a769305cd3994bb5fa2764aa4073452dc105a4ec39068ffe6efd3c20c60acc77", size = 9350, upload-time = "2024-11-04T18:28:02.859Z" }, -] - [[package]] name = "referencing" version = "0.36.2" @@ -3746,18 +3660,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/74/31/b0e29d572670dca3674eeee78e418f20bdf97fa8aa9ea71380885e175ca0/ruff-0.14.10-py3-none-win_arm64.whl", hash = "sha256:e51d046cf6dda98a4633b8a8a771451107413b0f07183b2bef03f075599e44e6", size = 13729839, upload-time = "2025-12-18T19:28:48.636Z" }, ] -[[package]] -name = "runs" -version = "1.2.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "xmod" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/26/6d/b9aace390f62db5d7d2c77eafce3d42774f27f1829d24fa9b6f598b3ef71/runs-1.2.2.tar.gz", hash = "sha256:9dc1815e2895cfb3a48317b173b9f1eac9ba5549b36a847b5cc60c3bf82ecef1", size = 5474, upload-time = "2024-01-25T14:44:01.563Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/86/d6/17caf2e4af1dec288477a0cbbe4a96fbc9b8a28457dce3f1f452630ce216/runs-1.2.2-py3-none-any.whl", hash = "sha256:0980dcbc25aba1505f307ac4f0e9e92cbd0be2a15a1e983ee86c24c87b839dfd", size = 7033, upload-time = "2024-01-25T14:43:59.959Z" }, -] - [[package]] name = "scipy" version = "1.13.1" @@ -4623,15 +4525,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d5/e4/62a677feefde05b12a70a4fc9bdc8558010182a801fbcab68cb56c2b0986/xarray-2025.12.0-py3-none-any.whl", hash = "sha256:9e77e820474dbbe4c6c2954d0da6342aa484e33adaa96ab916b15a786181e970", size = 1381742, upload-time = "2025-12-05T21:51:20.841Z" }, ] -[[package]] -name = "xmod" -version = "1.8.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/b2/e3edc608823348e628a919e1d7129e641997afadd946febdd704aecc5881/xmod-1.8.1.tar.gz", hash = "sha256:38c76486b9d672c546d57d8035df0beb7f4a9b088bc3fb2de5431ae821444377", size = 3988, upload-time = "2024-01-04T18:03:17.663Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/33/6b/0dc75b64a764ea1cb8e4c32d1fb273c147304d4e5483cd58be482dc62e45/xmod-1.8.1-py3-none-any.whl", hash = "sha256:a24e9458a4853489042522bdca9e50ee2eac5ab75c809a91150a8a7f40670d48", size = 4610, upload-time = "2024-01-04T18:03:16.078Z" }, -] - [[package]] name = "z3-solver" version = "4.15.4.0" From 290a294be1c6b96979bf34bef38896c0b5f72efc Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Sat, 20 Dec 2025 21:00:22 -0500 Subject: [PATCH 03/12] first pass --- codeflash/cli_cmds/cli_common.py | 82 ------------ codeflash/cli_cmds/cmd_init.py | 215 ++++++++++--------------------- 2 files changed, 66 insertions(+), 231 deletions(-) diff --git a/codeflash/cli_cmds/cli_common.py b/codeflash/cli_cmds/cli_common.py index 8e203c766..845593fae 100644 --- a/codeflash/cli_cmds/cli_common.py +++ b/codeflash/cli_cmds/cli_common.py @@ -1,11 +1,6 @@ from __future__ import annotations -import shutil import sys -from typing import Callable, cast - -import click -import inquirer from codeflash.cli_cmds.console import console, logger @@ -18,80 +13,3 @@ def apologize_and_exit() -> None: console.rule() logger.info("πŸ‘‹ Exiting...") sys.exit(1) - - -def inquirer_wrapper(func: Callable[..., str | bool], *args: str | bool, **kwargs: str | bool) -> str | bool: - new_args = [] - new_kwargs = {} - - if len(args) == 1: - message = str(args[0]) - else: - message = str(kwargs["message"]) - new_kwargs = kwargs.copy() - split_messages = split_string_to_cli_width(message, is_confirm=func == inquirer.confirm) - for split_message in split_messages[:-1]: - click.echo(split_message) - - last_message = split_messages[-1] - - if len(args) == 1: - new_args.append(last_message) - else: - new_kwargs["message"] = last_message - - return func(*new_args, **new_kwargs) - - -def split_string_to_cli_width(string: str, is_confirm: bool = False) -> list[str]: # noqa: FBT001, FBT002 - cli_width, _ = shutil.get_terminal_size() - # split string to lines that accommodate "[?] " prefix - cli_width -= len("[?] ") - lines = split_string_to_fit_width(string, cli_width) - - # split last line to additionally accommodate ": " or " (y/N): " suffix - cli_width -= len(" (y/N):") if is_confirm else len(": ") - last_lines = split_string_to_fit_width(lines[-1], cli_width) - - lines = lines[:-1] + last_lines - - if len(lines) > 1: - for i in range(len(lines[:-1])): - # Add yellow color to question mark in "[?] " prefix - lines[i] = "[\033[33m?\033[0m] " + lines[i] - return lines - - -def inquirer_wrapper_path(*args: str, **kwargs: str) -> dict[str, str] | None: - new_args = [] - message = kwargs["message"] - new_kwargs = kwargs.copy() - split_messages = split_string_to_cli_width(message) - for split_message in split_messages[:-1]: - click.echo(split_message) - - last_message = split_messages[-1] - new_kwargs["message"] = last_message - new_args.append(args[0]) - - return cast("dict[str, str]", inquirer.prompt([inquirer.Path(*new_args, **new_kwargs)])) - - -def split_string_to_fit_width(string: str, width: int) -> list[str]: - words = string.split() - lines = [] - current_line = [words[0]] - current_length = len(words[0]) - - for word in words[1:]: - word_length = len(word) - if current_length + word_length + 1 <= width: - current_line.append(word) - current_length += word_length + 1 - else: - lines.append(" ".join(current_line)) - current_line = [word] - current_length = word_length - - lines.append(" ".join(current_line)) - return lines diff --git a/codeflash/cli_cmds/cmd_init.py b/codeflash/cli_cmds/cmd_init.py index e63f52b77..eb5ad7af7 100644 --- a/codeflash/cli_cmds/cmd_init.py +++ b/codeflash/cli_cmds/cmd_init.py @@ -11,10 +11,10 @@ import click import git -import inquirer -import inquirer.themes import tomlkit from git import InvalidGitRepositoryError, Repo +from inquirer_textual import prompts # type: ignore[import-untyped] +from inquirer_textual.common.Choice import Choice # type: ignore[import-untyped] from pydantic.dataclasses import dataclass from rich.console import Group from rich.panel import Panel @@ -237,19 +237,6 @@ def should_modify_pyproject_toml() -> tuple[bool, dict[str, Any] | None]: ), config -# Custom theme for better UX -class CodeflashTheme(inquirer.themes.Default): - def __init__(self) -> None: - super().__init__() - self.Question.mark_color = inquirer.themes.term.yellow - self.Question.brackets_color = inquirer.themes.term.bright_blue - self.Question.default_color = inquirer.themes.term.bright_cyan - self.List.selection_color = inquirer.themes.term.bright_blue - self.Checkbox.selection_color = inquirer.themes.term.bright_blue - self.Checkbox.selected_icon = "βœ…" - self.Checkbox.unselected_icon = "⬜" - - # common sections between normal mode and lsp mode class CommonSections(Enum): module_root = "module_root" @@ -282,14 +269,15 @@ def get_valid_subdirs(current_dir: Optional[Path] = None) -> list[str]: ] -def get_suggestions(section: str) -> tuple[list[str], Optional[str]]: +def get_suggestions(section: CommonSections | str) -> tuple[list[str], Optional[str]]: valid_subdirs = get_valid_subdirs() - if section == CommonSections.module_root: + section_value = section.value if isinstance(section, CommonSections) else section + if section_value == CommonSections.module_root.value: return [d for d in valid_subdirs if d != "tests"], None - if section == CommonSections.tests_root: + if section_value == CommonSections.tests_root.value: default = "tests" if "tests" in valid_subdirs else None return valid_subdirs, default - if section == CommonSections.formatter_cmds: + if section_value == CommonSections.formatter_cmds.value: return ["disabled", "ruff", "black"], "disabled" msg = f"Unknown section: {section}" raise ValueError(msg) @@ -322,20 +310,14 @@ def collect_setup_info() -> CLISetupInfo: ) console.print(info_panel) console.print() - questions = [ - inquirer.List( - "module_root", - message="Which Python module do you want me to optimize?", - choices=module_subdir_options, - default=(project_name if project_name in module_subdir_options else module_subdir_options[0]), - carousel=True, - ) - ] - answers = inquirer.prompt(questions, theme=CodeflashTheme()) - if not answers: + default_choice = project_name if project_name in module_subdir_options else module_subdir_options[0] + result = prompts.select( + "Which Python module do you want me to optimize?", choices=module_subdir_options, default=default_choice + ) + if result.command is None: apologize_and_exit() - module_root_answer = answers["module_root"] + module_root_answer = result.value if module_root_answer == curdir_option: module_root = "." elif module_root_answer == custom_dir_option: @@ -353,22 +335,18 @@ def collect_setup_info() -> CLISetupInfo: # Retry loop for custom module root path module_root = None while module_root is None: - custom_questions = [ - inquirer.Path( - "custom_path", - message="Enter the path to your module directory", - path_type=inquirer.Path.DIRECTORY, - exists=True, - ) - ] - - custom_answers = inquirer.prompt(custom_questions, theme=CodeflashTheme()) - if not custom_answers: + result = prompts.text("Enter the path to your module directory") + if result.command is None: apologize_and_exit() return None # unreachable but satisfies type checker - custom_path_str = str(custom_answers["custom_path"]) - # Validate the path is safe + custom_path_str = result.value + # Validate the path is safe and exists + path_obj = Path(custom_path_str) + if not path_obj.exists() or not path_obj.is_dir(): + click.echo(f"❌ Path does not exist or is not a directory: {custom_path_str}") + console.print() # Add spacing before retry + continue is_valid, error_msg = validate_relative_directory_path(custom_path_str) if not is_valid: click.echo(f"❌ Invalid path: {error_msg}") @@ -402,20 +380,14 @@ def collect_setup_info() -> CLISetupInfo: console.print(tests_panel) console.print() - tests_questions = [ - inquirer.List( - "tests_root", - message="Where are your tests located?", - choices=test_subdir_options, - default=(default_tests_subdir or test_subdir_options[0]), - carousel=True, - ) - ] - - tests_answers = inquirer.prompt(tests_questions, theme=CodeflashTheme()) - if not tests_answers: + result = prompts.select( + "Where are your tests located?", + choices=test_subdir_options, + default=(default_tests_subdir or test_subdir_options[0]), + ) + if result.command is None: apologize_and_exit() - tests_root_answer = tests_answers["tests_root"] + tests_root_answer = result.value if tests_root_answer == create_for_me_option: tests_root = Path(curdir) / (default_tests_subdir or "tests") @@ -436,21 +408,18 @@ def collect_setup_info() -> CLISetupInfo: # Retry loop for custom tests root path tests_root = None while tests_root is None: - custom_tests_questions = [ - inquirer.Path( - "custom_tests_path", - message="Enter the path to your tests directory", - path_type=inquirer.Path.DIRECTORY, - exists=True, - ) - ] - - custom_tests_answers = inquirer.prompt(custom_tests_questions, theme=CodeflashTheme()) - if not custom_tests_answers: + result = prompts.text("Enter the path to your tests directory") + if result.command is None: apologize_and_exit() return None # unreachable but satisfies type checker - custom_tests_path_str = str(custom_tests_answers["custom_tests_path"]) + custom_tests_path_str = result.value + # Validate the path exists + path_obj = Path(custom_tests_path_str) + if not path_obj.exists() or not path_obj.is_dir(): + click.echo(f"❌ Path does not exist or is not a directory: {custom_tests_path_str}") + console.print() # Add spacing before retry + continue # Validate the path is safe is_valid, error_msg = validate_relative_directory_path(custom_tests_path_str) if not is_valid: @@ -502,25 +471,17 @@ def collect_setup_info() -> CLISetupInfo: console.print(formatter_panel) console.print() - formatter_questions = [ - inquirer.List( - "formatter", - message="Which code formatter do you use?", - choices=[ - ("⚫ black", "black"), - ("⚑ ruff", "ruff"), - ("πŸ”§ other", "other"), - ("❌ don't use a formatter", "don't use a formatter"), - ], - default="black", - carousel=True, - ) + formatter_choices = [ + Choice("⚫ black", data="black"), + Choice("⚑ ruff", data="ruff"), + Choice("πŸ”§ other", data="other"), + Choice("❌ don't use a formatter", data="don't use a formatter"), ] - formatter_answers = inquirer.prompt(formatter_questions, theme=CodeflashTheme()) - if not formatter_answers: + result = prompts.select("Which code formatter do you use?", choices=formatter_choices, default=formatter_choices[0]) + if result.command is None: apologize_and_exit() - formatter = formatter_answers["formatter"] + formatter = result.value.data if isinstance(result.value, Choice) else result.value git_remote = "" try: @@ -540,18 +501,10 @@ def collect_setup_info() -> CLISetupInfo: console.print(git_panel) console.print() - git_questions = [ - inquirer.List( - "git_remote", - message="Which git remote should Codeflash use for Pull Requests?", - choices=git_remotes, - default="origin", - carousel=True, - ) - ] - - git_answers = inquirer.prompt(git_questions, theme=CodeflashTheme()) - git_remote = git_answers["git_remote"] if git_answers else git_remotes[0] + result = prompts.select( + "Which git remote should Codeflash use for Pull Requests?", choices=git_remotes, default="origin" + ) + git_remote = result.value if result.command is not None else git_remotes[0] else: git_remote = git_remotes[0] else: @@ -618,14 +571,10 @@ def check_for_toml_or_setup_file() -> str | None: ph("cli-no-pyproject-toml-or-setup-py") # Create a pyproject.toml file because it doesn't exist - toml_questions = [ - inquirer.Confirm("create_toml", message="Create pyproject.toml in the current directory?", default=True) - ] - - toml_answers = inquirer.prompt(toml_questions, theme=CodeflashTheme()) - if not toml_answers: + result = prompts.confirm("Create pyproject.toml in the current directory?", default=True) + if result.command is None: apologize_and_exit() - create_toml = toml_answers["create_toml"] + create_toml = result.value if create_toml: create_empty_pyproject_toml(pyproject_toml_path) click.echo() @@ -694,45 +643,27 @@ def install_github_actions(override_formatter_check: bool = False) -> None: # n # Check if the workflow file already exists if optimize_yaml_path.exists(): - overwrite_questions = [ - inquirer.Confirm( - "confirm_overwrite", - message=f"GitHub Actions workflow already exists at {optimize_yaml_path}. Overwrite?", - default=False, - ) - ] - - overwrite_answers = inquirer.prompt(overwrite_questions, theme=CodeflashTheme()) - if not overwrite_answers or not overwrite_answers["confirm_overwrite"]: + result = prompts.confirm( + f"GitHub Actions workflow already exists at {optimize_yaml_path}. Overwrite?", default=False + ) + if result.command is None or not result.value: skip_panel = Panel( Text("⏩️ Skipping workflow creation.", style="yellow"), title="⏩️ Skipped", border_style="yellow" ) console.print(skip_panel) ph("cli-github-workflow-skipped") return - ph( - "cli-github-optimization-confirm-workflow-overwrite", - {"confirm_overwrite": overwrite_answers["confirm_overwrite"]}, - ) - - creation_questions = [ - inquirer.Confirm( - "confirm_creation", message="Set up GitHub Actions for continuous optimization?", default=True - ) - ] + ph("cli-github-optimization-confirm-workflow-overwrite", {"confirm_overwrite": result.value}) - creation_answers = inquirer.prompt(creation_questions, theme=CodeflashTheme()) - if not creation_answers or not creation_answers["confirm_creation"]: + result = prompts.confirm("Set up GitHub Actions for continuous optimization?", default=True) + if result.command is None or not result.value: skip_panel = Panel( Text("⏩️ Skipping GitHub Actions setup.", style="yellow"), title="⏩️ Skipped", border_style="yellow" ) console.print(skip_panel) ph("cli-github-workflow-skipped") return - ph( - "cli-github-optimization-confirm-workflow-creation", - {"confirm_creation": creation_answers["confirm_creation"]}, - ) + ph("cli-github-optimization-confirm-workflow-creation", {"confirm_creation": result.value}) workflows_path.mkdir(parents=True, exist_ok=True) from importlib.resources import files @@ -752,12 +683,8 @@ def install_github_actions(override_formatter_check: bool = False) -> None: # n console.print(benchmark_panel) console.print() - benchmark_questions = [ - inquirer.Confirm("benchmark_mode", message="Run GitHub Actions in benchmark mode?", default=True) - ] - - benchmark_answers = inquirer.prompt(benchmark_questions, theme=CodeflashTheme()) - benchmark_mode = benchmark_answers["benchmark_mode"] if benchmark_answers else False + result = prompts.confirm("Run GitHub Actions in benchmark mode?", default=True) + benchmark_mode = result.value if result.command is not None else False optimize_yml_content = ( files("codeflash").joinpath("cli_cmds", "workflows", "codeflash-optimize.yaml").read_text(encoding="utf-8") @@ -1132,21 +1059,11 @@ def prompt_api_key() -> bool: # Prompt for authentication method auth_choices = ["πŸ” Login in with Codeflash", "πŸ”‘ Use Codeflash API key"] - questions = [ - inquirer.List( - "auth_method", - message="How would you like to authenticate?", - choices=auth_choices, - default=auth_choices[0], - carousel=True, - ) - ] - - answers = inquirer.prompt(questions, theme=CodeflashTheme()) - if not answers: + result = prompts.select("How would you like to authenticate?", choices=auth_choices, default=auth_choices[0]) + if result.command is None: apologize_and_exit() - method = answers["auth_method"] + method = result.value if method == auth_choices[1]: enter_api_key_and_save_to_rc() From 69e0de326a297eaf64787be2aa2058431f6afa6f Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Sat, 20 Dec 2025 22:05:46 -0500 Subject: [PATCH 04/12] themed --- codeflash/cli_cmds/cmd_init.py | 2 +- codeflash/cli_cmds/themed_prompts.py | 112 +++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 codeflash/cli_cmds/themed_prompts.py diff --git a/codeflash/cli_cmds/cmd_init.py b/codeflash/cli_cmds/cmd_init.py index eb5ad7af7..32201560d 100644 --- a/codeflash/cli_cmds/cmd_init.py +++ b/codeflash/cli_cmds/cmd_init.py @@ -13,7 +13,6 @@ import git import tomlkit from git import InvalidGitRepositoryError, Repo -from inquirer_textual import prompts # type: ignore[import-untyped] from inquirer_textual.common.Choice import Choice # type: ignore[import-untyped] from pydantic.dataclasses import dataclass from rich.console import Group @@ -22,6 +21,7 @@ from rich.text import Text from codeflash.api.cfapi import get_user_id, is_github_app_installed_on_repo +from codeflash.cli_cmds import themed_prompts as prompts from codeflash.cli_cmds.cli_common import apologize_and_exit from codeflash.cli_cmds.console import console, logger from codeflash.cli_cmds.extension import install_vscode_extension diff --git a/codeflash/cli_cmds/themed_prompts.py b/codeflash/cli_cmds/themed_prompts.py new file mode 100644 index 000000000..b201b8d23 --- /dev/null +++ b/codeflash/cli_cmds/themed_prompts.py @@ -0,0 +1,112 @@ +"""Themed prompts wrapper for inquirer-textual with CodeFlash styling. + +This module provides themed prompt functions that match the original CodeFlash +inquirer theme (yellow question marks, bright blue selections, cyan defaults). +""" + +from __future__ import annotations + +from inquirer_textual.common.Choice import Choice # type: ignore[import-untyped] +from inquirer_textual.common.Result import Result # type: ignore[import-untyped] +from inquirer_textual.InquirerApp import InquirerApp # type: ignore[import-untyped] +from inquirer_textual.widgets.InquirerCheckbox import InquirerCheckbox # type: ignore[import-untyped] +from inquirer_textual.widgets.InquirerConfirm import InquirerConfirm # type: ignore[import-untyped] +from inquirer_textual.widgets.InquirerSelect import InquirerSelect # type: ignore[import-untyped] +from inquirer_textual.widgets.InquirerText import InquirerText # type: ignore[import-untyped] + + +class CodeflashThemedApp(InquirerApp): # type: ignore[misc] + """Custom themed InquirerApp matching the original CodeFlash theme colors.""" + + def get_theme_variable_defaults(self) -> dict[str, str]: + """Return CodeFlash theme colors. + + Original CodeFlash theme from inquirer: + - Question mark: yellow + - Brackets: bright blue + - Default: bright cyan + - Selection: bright blue + - Checkbox selected: βœ… + - Checkbox unselected: ⬜ + """ + return { + # Question mark color - yellow like the original + "select-question-mark": "#e5c07b", # Gold/yellow + # List item highlight - bright blue like the original selection + "select-list-item-highlight-foreground": "#61afef", # Bright blue + # Input/text color - cyan like the original + "input-color": "#61afef", # Bright blue (used for inputs and selections) + # Additional contrast colors + "input-selection-background": "#3e4451", # Subtle background for selected items + } + + +def select( + message: str, choices: list[str | Choice], default: str | Choice | None = None, mandatory: bool = True +) -> Result[str | Choice]: # type: ignore[type-arg] + """Display a select prompt with CodeFlash theming. + + Args: + message: The prompt message to display + choices: List of choices (strings or Choice objects) + default: Default choice to pre-select + mandatory: Whether a response is mandatory + + Returns: + Result object containing the selected value and command + + """ + widget = InquirerSelect(message, choices, default, mandatory) + app: CodeflashThemedApp = CodeflashThemedApp(widget, shortcuts=None, show_footer=False) # type: ignore[assignment] + return app.run(inline=True) # type: ignore[return-value] + + +def confirm(message: str, default: bool = False, mandatory: bool = True) -> Result[bool]: # type: ignore[type-arg] + """Display a confirm prompt with CodeFlash theming. + + Args: + message: The prompt message to display + default: Default value (True for yes, False for no) + mandatory: Whether a response is mandatory + + Returns: + Result object containing the boolean value and command + + """ + widget = InquirerConfirm(message, default=default, mandatory=mandatory) + app: CodeflashThemedApp = CodeflashThemedApp(widget, shortcuts=None, show_footer=False) # type: ignore[assignment] + return app.run(inline=True) # type: ignore[return-value] + + +def text(message: str) -> Result[str]: # type: ignore[type-arg] + """Display a text input prompt with CodeFlash theming. + + Args: + message: The prompt message to display + + Returns: + Result object containing the text value and command + + """ + widget = InquirerText(message) + app: CodeflashThemedApp = CodeflashThemedApp(widget, shortcuts=None, show_footer=False) # type: ignore[assignment] + return app.run(inline=True) # type: ignore[return-value] + + +def checkbox( + message: str, choices: list[str | Choice], enabled: list[str | Choice] | None = None +) -> Result[list[str | Choice]]: # type: ignore[type-arg] + """Display a checkbox prompt with CodeFlash theming. + + Args: + message: The prompt message to display + choices: List of choices (strings or Choice objects) + enabled: List of pre-selected choices + + Returns: + Result object containing the list of selected values and command + + """ + widget = InquirerCheckbox(message, choices, enabled) + app: CodeflashThemedApp = CodeflashThemedApp(widget, shortcuts=None, show_footer=False) # type: ignore[assignment] + return app.run(inline=True) # type: ignore[return-value] From 2f5578255d1ee5e132d8aefea851e3a601b64905 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Sat, 20 Dec 2025 23:51:31 -0500 Subject: [PATCH 05/12] second pass --- codeflash/cli_cmds/cmd_init.py | 41 +++---- codeflash/cli_cmds/themed_prompts.py | 166 ++++++++++++--------------- pyproject.toml | 3 +- uv.lock | 122 +++++++------------- 4 files changed, 136 insertions(+), 196 deletions(-) diff --git a/codeflash/cli_cmds/cmd_init.py b/codeflash/cli_cmds/cmd_init.py index 32201560d..5ef822d9d 100644 --- a/codeflash/cli_cmds/cmd_init.py +++ b/codeflash/cli_cmds/cmd_init.py @@ -13,7 +13,7 @@ import git import tomlkit from git import InvalidGitRepositoryError, Repo -from inquirer_textual.common.Choice import Choice # type: ignore[import-untyped] +from inquirer_textual.common.Choice import Choice from pydantic.dataclasses import dataclass from rich.console import Group from rich.panel import Panel @@ -450,13 +450,12 @@ def collect_setup_info() -> CLISetupInfo: # # # Ask about benchmark framework # benchmark_framework_options = ["pytest-benchmark", "asv (Airspeed Velocity)", "custom/other"] - # benchmark_framework = inquirer_wrapper( - # inquirer.list_input, - # message="Which benchmark framework do you use?", + # result = prompts.select( + # "Which benchmark framework do you use?", # choices=benchmark_framework_options, - # default=benchmark_framework_options[0], - # carousel=True, + # default=benchmark_framework_options[0] # ) + # benchmark_framework = result.value formatter_panel = Panel( Text( @@ -571,12 +570,10 @@ def check_for_toml_or_setup_file() -> str | None: ph("cli-no-pyproject-toml-or-setup-py") # Create a pyproject.toml file because it doesn't exist - result = prompts.confirm("Create pyproject.toml in the current directory?", default=True) - if result.command is None: + result = prompts.select("Create pyproject.toml in the current directory?", choices=["Yes", "No"], default="Yes") + if result.command is None or result.value == "No": apologize_and_exit() - create_toml = result.value - if create_toml: - create_empty_pyproject_toml(pyproject_toml_path) + create_empty_pyproject_toml(pyproject_toml_path) click.echo() return cast("str", project_name) @@ -643,27 +640,31 @@ def install_github_actions(override_formatter_check: bool = False) -> None: # n # Check if the workflow file already exists if optimize_yaml_path.exists(): - result = prompts.confirm( - f"GitHub Actions workflow already exists at {optimize_yaml_path}. Overwrite?", default=False + result = prompts.select( + f"GitHub Actions workflow already exists at {optimize_yaml_path}. Overwrite?", + choices=["No", "Yes"], + default="No", ) - if result.command is None or not result.value: + if result.command is None or result.value == "No": skip_panel = Panel( Text("⏩️ Skipping workflow creation.", style="yellow"), title="⏩️ Skipped", border_style="yellow" ) console.print(skip_panel) ph("cli-github-workflow-skipped") return - ph("cli-github-optimization-confirm-workflow-overwrite", {"confirm_overwrite": result.value}) + ph("cli-github-optimization-confirm-workflow-overwrite", {"confirm_overwrite": result.value == "Yes"}) - result = prompts.confirm("Set up GitHub Actions for continuous optimization?", default=True) - if result.command is None or not result.value: + result = prompts.select( + "Set up GitHub Actions for continuous optimization?", choices=["Yes", "No"], default="Yes" + ) + if result.command is None or result.value == "No": skip_panel = Panel( Text("⏩️ Skipping GitHub Actions setup.", style="yellow"), title="⏩️ Skipped", border_style="yellow" ) console.print(skip_panel) ph("cli-github-workflow-skipped") return - ph("cli-github-optimization-confirm-workflow-creation", {"confirm_creation": result.value}) + ph("cli-github-optimization-confirm-workflow-creation", {"confirm_creation": result.value == "Yes"}) workflows_path.mkdir(parents=True, exist_ok=True) from importlib.resources import files @@ -683,8 +684,8 @@ def install_github_actions(override_formatter_check: bool = False) -> None: # n console.print(benchmark_panel) console.print() - result = prompts.confirm("Run GitHub Actions in benchmark mode?", default=True) - benchmark_mode = result.value if result.command is not None else False + result = prompts.select("Run GitHub Actions in benchmark mode?", choices=["Yes", "No"], default="Yes") + benchmark_mode = (result.value == "Yes") if result.command is not None else False optimize_yml_content = ( files("codeflash").joinpath("cli_cmds", "workflows", "codeflash-optimize.yaml").read_text(encoding="utf-8") diff --git a/codeflash/cli_cmds/themed_prompts.py b/codeflash/cli_cmds/themed_prompts.py index b201b8d23..9af2090df 100644 --- a/codeflash/cli_cmds/themed_prompts.py +++ b/codeflash/cli_cmds/themed_prompts.py @@ -1,112 +1,94 @@ -"""Themed prompts wrapper for inquirer-textual with CodeFlash styling. - -This module provides themed prompt functions that match the original CodeFlash -inquirer theme (yellow question marks, bright blue selections, cyan defaults). -""" - from __future__ import annotations -from inquirer_textual.common.Choice import Choice # type: ignore[import-untyped] -from inquirer_textual.common.Result import Result # type: ignore[import-untyped] -from inquirer_textual.InquirerApp import InquirerApp # type: ignore[import-untyped] -from inquirer_textual.widgets.InquirerCheckbox import InquirerCheckbox # type: ignore[import-untyped] -from inquirer_textual.widgets.InquirerConfirm import InquirerConfirm # type: ignore[import-untyped] -from inquirer_textual.widgets.InquirerSelect import InquirerSelect # type: ignore[import-untyped] -from inquirer_textual.widgets.InquirerText import InquirerText # type: ignore[import-untyped] +from typing import TYPE_CHECKING +from inquirer_textual.InquirerApp import InquirerApp +from inquirer_textual.widgets.InquirerCheckbox import InquirerCheckbox +from inquirer_textual.widgets.InquirerConfirm import InquirerConfirm +from inquirer_textual.widgets.InquirerSelect import InquirerSelect +from inquirer_textual.widgets.InquirerText import InquirerText -class CodeflashThemedApp(InquirerApp): # type: ignore[misc] - """Custom themed InquirerApp matching the original CodeFlash theme colors.""" +if TYPE_CHECKING: + from inquirer_textual.common.Choice import Choice - def get_theme_variable_defaults(self) -> dict[str, str]: - """Return CodeFlash theme colors. - Original CodeFlash theme from inquirer: - - Question mark: yellow - - Brackets: bright blue - - Default: bright cyan - - Selection: bright blue - - Checkbox selected: βœ… - - Checkbox unselected: ⬜ - """ - return { - # Question mark color - yellow like the original - "select-question-mark": "#e5c07b", # Gold/yellow - # List item highlight - bright blue like the original selection - "select-list-item-highlight-foreground": "#61afef", # Bright blue - # Input/text color - cyan like the original - "input-color": "#61afef", # Bright blue (used for inputs and selections) - # Additional contrast colors - "input-selection-background": "#3e4451", # Subtle background for selected items +class CodeflashThemedApp(InquirerApp): + CSS = """ + App { + background: #1e293b; + } + Screen { + border-top: none; + border-bottom: none; + background: transparent; + height: auto; + } + ListView { + background: transparent; + border: none; + } + ListItem { + background: transparent; + padding: 0 1; + color: #f1f5f9; + } + ListItem.-highlight { + background: #334155; + color: $select-list-item-highlight-foreground; + } + Label { + background: transparent; + color: #f8fafc; + } + Static { + background: transparent; + color: #f8fafc; + } + Input { + background: #334155; + border: solid $primary; + color: #f8fafc; + } + Input:focus { + border: solid $accent; } - - -def select( - message: str, choices: list[str | Choice], default: str | Choice | None = None, mandatory: bool = True -) -> Result[str | Choice]: # type: ignore[type-arg] - """Display a select prompt with CodeFlash theming. - - Args: - message: The prompt message to display - choices: List of choices (strings or Choice objects) - default: Default choice to pre-select - mandatory: Whether a response is mandatory - - Returns: - Result object containing the selected value and command - """ - widget = InquirerSelect(message, choices, default, mandatory) - app: CodeflashThemedApp = CodeflashThemedApp(widget, shortcuts=None, show_footer=False) # type: ignore[assignment] - return app.run(inline=True) # type: ignore[return-value] - - -def confirm(message: str, default: bool = False, mandatory: bool = True) -> Result[bool]: # type: ignore[type-arg] - """Display a confirm prompt with CodeFlash theming. - Args: - message: The prompt message to display - default: Default value (True for yes, False for no) - mandatory: Whether a response is mandatory - - Returns: - Result object containing the boolean value and command + def get_theme_variable_defaults(self) -> dict[str, str]: + return { + "select-question-mark": "#FFC143", + "select-list-item-highlight-foreground": "#2563EB", + "input-color": "#3B82F6", + "input-selection-background": "#1e293b", + "accent": "#FFC143", + "primary": "#2563EB", + "secondary": "#414372", + } - """ - widget = InquirerConfirm(message, default=default, mandatory=mandatory) - app: CodeflashThemedApp = CodeflashThemedApp(widget, shortcuts=None, show_footer=False) # type: ignore[assignment] - return app.run(inline=True) # type: ignore[return-value] +def select( # noqa: ANN201 + message: str, choices: list[str | Choice], default: str | Choice | None = None +): # type: ignore[no-untyped-def] + widget = InquirerSelect(message, choices, default, mandatory=True) + app: CodeflashThemedApp = CodeflashThemedApp(widget, shortcuts=None, show_footer=False) + return app.run(inline=True) -def text(message: str) -> Result[str]: # type: ignore[type-arg] - """Display a text input prompt with CodeFlash theming. - Args: - message: The prompt message to display +def confirm(message: str, *, default: bool = False): # noqa: ANN201 # type: ignore[no-untyped-def] + widget = InquirerConfirm(message, default=default, mandatory=True) + app: CodeflashThemedApp = CodeflashThemedApp(widget, shortcuts=None, show_footer=False) + return app.run(inline=True) - Returns: - Result object containing the text value and command - """ +def text(message: str): # noqa: ANN201 # type: ignore[no-untyped-def] widget = InquirerText(message) - app: CodeflashThemedApp = CodeflashThemedApp(widget, shortcuts=None, show_footer=False) # type: ignore[assignment] - return app.run(inline=True) # type: ignore[return-value] + app: CodeflashThemedApp = CodeflashThemedApp(widget, shortcuts=None, show_footer=False) + return app.run(inline=True) -def checkbox( +def checkbox( # noqa: ANN201 message: str, choices: list[str | Choice], enabled: list[str | Choice] | None = None -) -> Result[list[str | Choice]]: # type: ignore[type-arg] - """Display a checkbox prompt with CodeFlash theming. - - Args: - message: The prompt message to display - choices: List of choices (strings or Choice objects) - enabled: List of pre-selected choices - - Returns: - Result object containing the list of selected values and command - - """ +): # type: ignore[no-untyped-def] widget = InquirerCheckbox(message, choices, enabled) - app: CodeflashThemedApp = CodeflashThemedApp(widget, shortcuts=None, show_footer=False) # type: ignore[assignment] - return app.run(inline=True) # type: ignore[return-value] + app: CodeflashThemedApp = CodeflashThemedApp(widget, shortcuts=None, show_footer=False) + return app.run(inline=True) diff --git a/pyproject.toml b/pyproject.toml index 3bbc08139..d745f3f97 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -200,7 +200,7 @@ install_types = true plugins = ["pydantic.mypy"] [[tool.mypy.overrides]] -module = ["jedi", "jedi.api.classes", "inquirer", "inquirer.themes", "inquirer_textual", "inquirer_textual.common.Choice", "numba"] +module = ["jedi", "jedi.api.classes", "numba"] ignore_missing_imports = true [tool.pydantic-mypy] @@ -282,7 +282,6 @@ workspace = { members = ["codeflash-benchmark"] } [tool.uv.sources] codeflash-benchmark = { workspace = true } -inquirer-textual = { path = "../inquirer-textual", editable = true } [tool.uv-dynamic-versioning] enable = true diff --git a/uv.lock b/uv.lock index d6c9d40a5..00604ef30 100644 --- a/uv.lock +++ b/uv.lock @@ -7,8 +7,7 @@ resolution-markers = [ "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", "python_full_version == '3.10.*'", - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] [manifest] @@ -67,8 +66,7 @@ name = "black" version = "25.11.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] dependencies = [ { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, @@ -188,8 +186,7 @@ name = "cfgv" version = "3.4.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } wheels = [ @@ -322,8 +319,7 @@ name = "click" version = "8.1.8" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] dependencies = [ { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, @@ -454,7 +450,7 @@ requires-dist = [ { name = "filelock" }, { name = "gitpython", specifier = ">=3.1.31" }, { name = "humanize", specifier = ">=4.0.0" }, - { name = "inquirer-textual", editable = "../inquirer-textual" }, + { name = "inquirer-textual", specifier = ">=0.2.0" }, { name = "isort", specifier = ">=5.11.0" }, { name = "jedi", specifier = ">=0.19.1" }, { name = "junitparser", specifier = ">=3.1.0" }, @@ -537,8 +533,7 @@ name = "coverage" version = "7.10.7" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] sdist = { url = "https://files.pythonhosted.org/packages/51/26/d22c300112504f5f9a9fd2297ce33c35f3d353e4aeb987c8419453b2a7c2/coverage-7.10.7.tar.gz", hash = "sha256:f4ab143ab113be368a3e9b795f9cd7906c5ef407d6173fe9675a902e1fffc239", size = 827704, upload-time = "2025-09-21T20:03:56.815Z" } wheels = [ @@ -862,7 +857,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -883,8 +878,7 @@ name = "filelock" version = "3.19.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] sdist = { url = "https://files.pythonhosted.org/packages/40/bb/0ab3e58d22305b6f5440629d20683af28959bf793d98d11950e305c1c326/filelock-3.19.1.tar.gz", hash = "sha256:66eda1888b0171c998b35be2bcc0f6d75c388a7ce20c3f3f37aa8e96c2dddf58", size = 17687, upload-time = "2025-08-14T16:56:03.016Z" } wheels = [ @@ -912,8 +906,7 @@ name = "fsspec" version = "2025.10.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] sdist = { url = "https://files.pythonhosted.org/packages/24/7f/2747c0d332b9acfa75dc84447a066fdf812b5a6b8d30472b74d309bfe8cb/fsspec-2025.10.0.tar.gz", hash = "sha256:b6789427626f068f9a83ca4e8a3cc050850b6c0f71f99ddb4f542b8266a26a59", size = 309285, upload-time = "2025-10-30T14:58:44.036Z" } wheels = [ @@ -966,8 +959,7 @@ name = "humanize" version = "4.13.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] sdist = { url = "https://files.pythonhosted.org/packages/98/1d/3062fcc89ee05a715c0b9bfe6490c00c576314f27ffee3a704122c6fd259/humanize-4.13.0.tar.gz", hash = "sha256:78f79e68f76f0b04d711c4e55d32bebef5be387148862cb1ef83d2b58e7935a0", size = 81884, upload-time = "2025-08-25T09:39:20.04Z" } wheels = [ @@ -1037,8 +1029,7 @@ name = "iniconfig" version = "2.1.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } wheels = [ @@ -1063,26 +1054,14 @@ wheels = [ [[package]] name = "inquirer-textual" -version = "0.1.0" -source = { editable = "../inquirer-textual" } +version = "0.2.0" +source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "textual" }, ] - -[package.metadata] -requires-dist = [{ name = "textual", specifier = ">=6.4.0" }] - -[package.metadata.requires-dev] -dev = [ - { name = "mkdocs-glightbox", specifier = ">=0.5.2" }, - { name = "mkdocs-material", specifier = ">=9.6.21" }, - { name = "mkdocstrings", extras = ["python"], specifier = ">=0.30.1" }, - { name = "poethepoet", specifier = ">=0.37.0" }, - { name = "pytest", specifier = ">=8.4.2" }, - { name = "pytest-asyncio", specifier = ">=1.2.0" }, - { name = "pytest-textual-snapshot", specifier = ">=1.1.0" }, - { name = "python-semantic-release", specifier = ">=9.21.0" }, - { name = "textual-dev", specifier = ">=1.8.0" }, +sdist = { url = "https://files.pythonhosted.org/packages/92/e3/04a9c586f4ccbf9b7fcf28365036d545a75f930cff08b719d88170a59ac3/inquirer_textual-0.2.0.tar.gz", hash = "sha256:fe6e40b09d220987ecdf82785cf6c55df0d639dd33024965cef4533e7fc8bd44", size = 394648, upload-time = "2025-12-11T22:16:36.147Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/2c/7f2a89d9e82224d58fc9ba0bf1e239183b923d2537b608cc84bcfc17ed1e/inquirer_textual-0.2.0-py3-none-any.whl", hash = "sha256:6d2065f7b3fb1eecbad3df3e887c328e8dcf2ad6d706552628866ffde92c505c", size = 15964, upload-time = "2025-12-11T22:16:35.023Z" }, ] [[package]] @@ -1090,8 +1069,7 @@ name = "ipython" version = "8.18.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] dependencies = [ { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, @@ -1181,8 +1159,7 @@ name = "isort" version = "6.1.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] dependencies = [ { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, @@ -1213,8 +1190,7 @@ name = "jax" version = "0.4.30" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] dependencies = [ { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, @@ -1275,8 +1251,7 @@ name = "jaxlib" version = "0.4.30" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] dependencies = [ { name = "ml-dtypes", marker = "python_full_version < '3.10'" }, @@ -1801,8 +1776,7 @@ name = "markdown-it-py" version = "3.0.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] dependencies = [ { name = "mdurl", marker = "python_full_version < '3.10'" }, @@ -1954,8 +1928,7 @@ name = "mdit-py-plugins" version = "0.4.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] dependencies = [ { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, @@ -2119,8 +2092,7 @@ name = "networkx" version = "3.2.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] sdist = { url = "https://files.pythonhosted.org/packages/c4/80/a84676339aaae2f1cfdf9f418701dd634aef9cc76f708ef55c36ff39c3ca/networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6", size = 2073928, upload-time = "2023-10-28T08:41:39.364Z" } wheels = [ @@ -2168,8 +2140,7 @@ name = "numpy" version = "2.0.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] 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 = [ @@ -2476,8 +2447,7 @@ name = "nvidia-nccl-cu12" version = "2.27.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] wheels = [ { url = "https://files.pythonhosted.org/packages/5c/5b/4e4fff7bad39adf89f735f2bc87248c81db71205b62bcc0d5ca5b606b3c3/nvidia_nccl_cu12-2.27.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adf27ccf4238253e0b826bce3ff5fa532d65fc42322c8bfdfaf28024c0fbe039", size = 322364134, upload-time = "2025-06-03T21:58:04.013Z" }, @@ -2615,8 +2585,7 @@ name = "pandas-stubs" version = "2.2.2.240807" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] dependencies = [ { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, @@ -2692,8 +2661,7 @@ name = "platformdirs" version = "4.4.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" } wheels = [ @@ -2730,8 +2698,7 @@ name = "posthog" version = "6.9.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] dependencies = [ { name = "backoff", marker = "python_full_version < '3.10'" }, @@ -2775,8 +2742,7 @@ name = "pre-commit" version = "4.3.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] dependencies = [ { name = "cfgv", version = "3.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, @@ -3050,8 +3016,7 @@ name = "pytest" version = "8.4.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] dependencies = [ { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, @@ -3097,8 +3062,7 @@ name = "pytest-asyncio" version = "1.2.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] dependencies = [ { name = "backports-asyncio-runner", marker = "python_full_version < '3.10'" }, @@ -3276,8 +3240,7 @@ name = "referencing" version = "0.36.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] dependencies = [ { name = "attrs", marker = "python_full_version < '3.10'" }, @@ -3344,8 +3307,7 @@ name = "rpds-py" version = "0.27.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] sdist = { url = "https://files.pythonhosted.org/packages/e9/dd/2c0cbe774744272b0ae725f44032c77bdcab6e8bcf544bffa3b6e70c8dba/rpds_py-0.27.1.tar.gz", hash = "sha256:26a1c73171d10b7acccbded82bf6a586ab8203601e565badc74bbbf8bc5a10f8", size = 27479, upload-time = "2025-08-27T12:16:36.024Z" } wheels = [ @@ -3665,8 +3627,7 @@ name = "scipy" version = "1.13.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] dependencies = [ { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, @@ -3984,8 +3945,7 @@ name = "torch" version = "2.8.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] dependencies = [ { name = "filelock", version = "3.19.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, @@ -4119,8 +4079,7 @@ name = "triton" version = "3.4.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] dependencies = [ { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, @@ -4310,11 +4269,11 @@ wheels = [ [[package]] name = "types-setuptools" -version = "80.9.0.20250822" +version = "80.9.0.20251221" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/19/bd/1e5f949b7cb740c9f0feaac430e301b8f1c5f11a81e26324299ea671a237/types_setuptools-80.9.0.20250822.tar.gz", hash = "sha256:070ea7716968ec67a84c7f7768d9952ff24d28b65b6594797a464f1b3066f965", size = 41296, upload-time = "2025-08-22T03:02:08.771Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/49/cefdde98e1783c09a100f18ade39335e654e8e3364650e200d39069de701/types_setuptools-80.9.0.20251221.tar.gz", hash = "sha256:05da599f5a062bbee3e83d60318576ba23111a768b7a2e46aa11644109c5d17f", size = 42240, upload-time = "2025-12-21T03:20:36.236Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/2d/475bf15c1cdc172e7a0d665b6e373ebfb1e9bf734d3f2f543d668b07a142/types_setuptools-80.9.0.20250822-py3-none-any.whl", hash = "sha256:53bf881cb9d7e46ed12c76ef76c0aaf28cfe6211d3fab12e0b83620b1a8642c3", size = 63179, upload-time = "2025-08-22T03:02:07.643Z" }, + { url = "https://files.pythonhosted.org/packages/58/40/999a63965aaf1f67988ddf64a9ba602fde041a4199840d256dd60c7f9fa9/types_setuptools-80.9.0.20251221-py3-none-any.whl", hash = "sha256:fecf4b9ebfc4cdd9cd38b898b653ad197507d7a62d465a168b709c56e94b02c4", size = 64205, upload-time = "2025-12-21T03:20:35.049Z" }, ] [[package]] @@ -4475,8 +4434,7 @@ name = "xarray" version = "2024.7.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ - "python_full_version >= '3.9.2' and python_full_version < '3.10'", - "python_full_version < '3.9.2'", + "python_full_version < '3.10'", ] dependencies = [ { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, From 03a35070626915ac2eabee9b57b06ca0eb154710 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Sun, 21 Dec 2025 00:31:05 -0500 Subject: [PATCH 06/12] let's do click too --- codeflash/cli_cmds/cmd_init.py | 158 +++++++++++++++------------------ 1 file changed, 71 insertions(+), 87 deletions(-) diff --git a/codeflash/cli_cmds/cmd_init.py b/codeflash/cli_cmds/cmd_init.py index 5ef822d9d..f569ce945 100644 --- a/codeflash/cli_cmds/cmd_init.py +++ b/codeflash/cli_cmds/cmd_init.py @@ -4,12 +4,12 @@ import re import subprocess import sys +import webbrowser from enum import Enum, auto from functools import lru_cache from pathlib import Path from typing import TYPE_CHECKING, Any, Optional, Union, cast -import click import git import tomlkit from git import InvalidGitRepositoryError, Repo @@ -287,8 +287,8 @@ def collect_setup_info() -> CLISetupInfo: curdir = Path.cwd() # Check if the cwd is writable if not os.access(curdir, os.W_OK): - click.echo(f"❌ The current directory isn't writable, please check your folder permissions and try again.{LF}") - click.echo("It's likely you don't have write permissions for this folder.") + console.print(f"❌ The current directory isn't writable, please check your folder permissions and try again.{LF}") + console.print("It's likely you don't have write permissions for this folder.") sys.exit(1) # Check for the existence of pyproject.toml or setup.py @@ -344,13 +344,13 @@ def collect_setup_info() -> CLISetupInfo: # Validate the path is safe and exists path_obj = Path(custom_path_str) if not path_obj.exists() or not path_obj.is_dir(): - click.echo(f"❌ Path does not exist or is not a directory: {custom_path_str}") + console.print(f"❌ Path does not exist or is not a directory: {custom_path_str}") console.print() # Add spacing before retry continue is_valid, error_msg = validate_relative_directory_path(custom_path_str) if not is_valid: - click.echo(f"❌ Invalid path: {error_msg}") - click.echo("Please enter a valid relative directory path.") + console.print(f"❌ Invalid path: {error_msg}") + console.print("Please enter a valid relative directory path.") console.print() # Add spacing before retry continue # Retry the prompt module_root = Path(custom_path_str) @@ -392,7 +392,7 @@ def collect_setup_info() -> CLISetupInfo: if tests_root_answer == create_for_me_option: tests_root = Path(curdir) / (default_tests_subdir or "tests") tests_root.mkdir() - click.echo(f"βœ… Created directory {tests_root}{os.path.sep}{LF}") + console.print(f"βœ… Created directory {tests_root}{os.path.sep}{LF}") elif tests_root_answer == custom_dir_option: custom_tests_panel = Panel( Text( @@ -417,14 +417,14 @@ def collect_setup_info() -> CLISetupInfo: # Validate the path exists path_obj = Path(custom_tests_path_str) if not path_obj.exists() or not path_obj.is_dir(): - click.echo(f"❌ Path does not exist or is not a directory: {custom_tests_path_str}") + console.print(f"❌ Path does not exist or is not a directory: {custom_tests_path_str}") console.print() # Add spacing before retry continue # Validate the path is safe is_valid, error_msg = validate_relative_directory_path(custom_tests_path_str) if not is_valid: - click.echo(f"❌ Invalid path: {error_msg}") - click.echo("Please enter a valid relative directory path.") + console.print(f"❌ Invalid path: {error_msg}") + console.print("Please enter a valid relative directory path.") console.print() # Add spacing before retry continue # Retry the prompt tests_root = Path(curdir) / Path(custom_tests_path_str) @@ -507,7 +507,7 @@ def collect_setup_info() -> CLISetupInfo: else: git_remote = git_remotes[0] else: - click.echo( + console.print( "No git remotes found. You can still use Codeflash locally, but you'll need to set up a remote " "repository to use GitHub features." ) @@ -529,8 +529,8 @@ def collect_setup_info() -> CLISetupInfo: def check_for_toml_or_setup_file() -> str | None: - click.echo() - click.echo("Checking for pyproject.toml or setup.py…\r", nl=False) + console.print() + console.print("Checking for pyproject.toml or setup.py…\r", nl=False) curdir = Path.cwd() pyproject_toml_path = curdir / "pyproject.toml" setup_py_path = curdir / "setup.py" @@ -539,10 +539,10 @@ def check_for_toml_or_setup_file() -> str | None: try: pyproject_toml_content = pyproject_toml_path.read_text(encoding="utf8") project_name = tomlkit.parse(pyproject_toml_content)["tool"]["poetry"]["name"] - click.echo(f"βœ… I found a pyproject.toml for your project {project_name}.") + console.print(f"βœ… I found a pyproject.toml for your project {project_name}.") ph("cli-pyproject-toml-found-name") except Exception: - click.echo("βœ… I found a pyproject.toml for your project.") + console.print("βœ… I found a pyproject.toml for your project.") ph("cli-pyproject-toml-found") else: if setup_py_path.exists(): @@ -550,10 +550,10 @@ def check_for_toml_or_setup_file() -> str | None: project_name_match = re.search(r"setup\s*\([^)]*?name\s*=\s*['\"](.*?)['\"]", setup_py_content, re.DOTALL) if project_name_match: project_name = project_name_match.group(1) - click.echo(f"βœ… Found setup.py for your project {project_name}") + console.print(f"βœ… Found setup.py for your project {project_name}") ph("cli-setup-py-found-name") else: - click.echo("βœ… Found setup.py.") + console.print("βœ… Found setup.py.") ph("cli-setup-py-found") toml_info_panel = Panel( Text( @@ -574,7 +574,7 @@ def check_for_toml_or_setup_file() -> str | None: if result.command is None or result.value == "No": apologize_and_exit() create_empty_pyproject_toml(pyproject_toml_path) - click.echo() + console.print() return cast("str", project_name) @@ -604,7 +604,7 @@ def create_empty_pyproject_toml(pyproject_toml_path: Path) -> None: console.input() ph("cli-created-pyproject-toml") except OSError: - click.echo("❌ Failed to create pyproject.toml. Please check your disk permissions and available space.") + console.print("❌ Failed to create pyproject.toml. Please check your disk permissions and available space.") apologize_and_exit() @@ -616,7 +616,7 @@ def install_github_actions(override_formatter_check: bool = False) -> None: # n try: repo = Repo(config["module_root"], search_parent_directories=True) except git.InvalidGitRepositoryError: - click.echo( + console.print( "Skipping GitHub action installation for continuous optimization because you're not in a git repository." ) return @@ -735,7 +735,7 @@ def install_github_actions(override_formatter_check: bool = False) -> None: # n console.print(f"\nπŸ“ Press Enter to open: {get_github_secrets_page_url(repo)}") console.input() - click.launch(get_github_secrets_page_url(repo)) + webbrowser.open(get_github_secrets_page_url(repo)) # Post-launch message panel launch_panel = Panel( @@ -750,9 +750,9 @@ def install_github_actions(override_formatter_check: bool = False) -> None: # n border_style="bright_cyan", ) console.print(launch_panel) - click.pause() - click.echo() - click.echo( + console.input("Press Enter to continue...") + console.print() + console.print( f"Please edit, commit and push this GitHub actions file to your repo, and you're all set!{LF}" f"πŸš€ Codeflash is now configured to automatically optimize new Github PRs!{LF}" ) @@ -853,7 +853,7 @@ def customize_codeflash_yaml_content( with toml_path.open(encoding="utf8") as pyproject_file: pyproject_data = tomlkit.parse(pyproject_file.read()) except FileNotFoundError: - click.echo( + console.print( f"I couldn't find a pyproject.toml in the current directory.{LF}" f"Please create a new empty pyproject.toml file here, OR if you use poetry then run `poetry init`, OR run `codeflash init` again from a directory with an existing pyproject.toml file." ) @@ -885,7 +885,7 @@ def get_formatter_cmds(formatter: str) -> list[str]: if formatter == "ruff": return ["ruff check --exit-zero --fix $file", "ruff format $file"] if formatter == "other": - click.echo( + console.print( "πŸ”§ In pyproject.toml, please replace 'your-formatter' with the command you use to format your code." ) return ["your-formatter $file"] @@ -906,7 +906,7 @@ def configure_pyproject_toml( with toml_path.open(encoding="utf8") as pyproject_file: pyproject_data = tomlkit.parse(pyproject_file.read()) except FileNotFoundError: - click.echo( + console.print( f"I couldn't find a pyproject.toml in the current directory.{LF}" f"Please create a new empty pyproject.toml file here, OR if you use poetry then run `poetry init`, OR run `codeflash init` again from a directory with an existing pyproject.toml file." ) @@ -951,8 +951,8 @@ def configure_pyproject_toml( with toml_path.open("w", encoding="utf8") as pyproject_file: pyproject_file.write(tomlkit.dumps(pyproject_data)) - click.echo(f"Added Codeflash configuration to {toml_path}") - click.echo() + console.print(f"Added Codeflash configuration to {toml_path}") + console.print() return True @@ -960,79 +960,56 @@ def install_github_app(git_remote: str) -> None: try: git_repo = git.Repo(search_parent_directories=True) except git.InvalidGitRepositoryError: - click.echo("Skipping GitHub app installation because you're not in a git repository.") + console.print("Skipping GitHub app installation because you're not in a git repository.") return if git_remote not in get_git_remotes(git_repo): - click.echo(f"Skipping GitHub app installation, remote ({git_remote}) does not exist in this repository.") + console.print(f"Skipping GitHub app installation, remote ({git_remote}) does not exist in this repository.") return owner, repo = get_repo_owner_and_name(git_repo, git_remote) if is_github_app_installed_on_repo(owner, repo, suppress_errors=True): - click.echo( + console.print( f"πŸ™ Looks like you've already installed the Codeflash GitHub app on this repository ({owner}/{repo})! Continuing…" ) else: try: - click.prompt( + console.print( f"Finally, you'll need to install the Codeflash GitHub app by choosing the repository you want to install Codeflash on.{LF}" f"I will attempt to open the github app page - https://github.com/apps/codeflash-ai/installations/select_target {LF}" - f"Please, press ENTER to open the app installation page{LF}", - default="", - type=click.STRING, - prompt_suffix=">>> ", - show_default=False, + f"Please, press ENTER to open the app installation page{LF}" ) - click.launch("https://github.com/apps/codeflash-ai/installations/select_target") - click.prompt( - f"Please, press ENTER once you've finished installing the github app from https://github.com/apps/codeflash-ai/installations/select_target{LF}", - default="", - type=click.STRING, - prompt_suffix=">>> ", - show_default=False, + console.input(">>> ") + webbrowser.open("https://github.com/apps/codeflash-ai/installations/select_target") + console.print( + f"Please, press ENTER once you've finished installing the github app from https://github.com/apps/codeflash-ai/installations/select_target{LF}" ) + console.input(">>> ") count = 2 while not is_github_app_installed_on_repo(owner, repo, suppress_errors=True): if count == 0: - click.echo( + console.print( f"❌ It looks like the Codeflash GitHub App is not installed on the repository {owner}/{repo}.{LF}" f"You won't be able to create PRs with Codeflash until you install the app.{LF}" f"In the meantime you can make local only optimizations by using the '--no-pr' flag with codeflash.{LF}" ) break - click.prompt( + console.print( f"❌ It looks like the Codeflash GitHub App is not installed on the repository {owner}/{repo}.{LF}" f"Please install it from https://github.com/apps/codeflash-ai/installations/select_target {LF}" - f"Please, press ENTER to continue once you've finished installing the github app…{LF}", - default="", - type=click.STRING, - prompt_suffix=">>> ", - show_default=False, + f"Please, press ENTER to continue once you've finished installing the github app…{LF}" ) + console.input(">>> ") count -= 1 - except (KeyboardInterrupt, EOFError, click.exceptions.Abort): + except (KeyboardInterrupt, EOFError): # leave empty line for the next prompt to be properly rendered - click.echo() - - -class CFAPIKeyType(click.ParamType): - name = "cfapi-key" - - def convert(self, value: str, param: click.Parameter | None, ctx: click.Context | None) -> str | None: - value = value.strip() - if not value.startswith("cf-") and value != "": - self.fail( - f"That key [{value}] seems to be invalid. It should start with a 'cf-' prefix. Please try again.", - param, - ctx, - ) - return value + console.print() -# Returns True if the user entered a new API key, False if they used an existing one +# def prompt_api_key() -> bool: """Prompt user for API key via OAuth or manual entry.""" # Check for existing API key @@ -1081,15 +1058,15 @@ def prompt_api_key() -> bool: shell_rc_path = get_shell_rc_path() if not shell_rc_path.exists() and os.name == "nt": shell_rc_path.touch() - click.echo(f"βœ… Created {shell_rc_path}") + console.print(f"βœ… Created {shell_rc_path}") result = save_api_key_to_rc(api_key) if is_successful(result): - click.echo(result.unwrap()) - click.echo("βœ… Signed in successfully and API key saved!") + console.print(result.unwrap()) + console.print("βœ… Signed in successfully and API key saved!") else: - click.echo(result.failure()) - click.pause() + console.print(result.failure()) + console.input("Press Enter to continue...") os.environ["CODEFLASH_API_KEY"] = api_key ph("cli-oauth-signin-completed") @@ -1100,35 +1077,42 @@ def enter_api_key_and_save_to_rc() -> None: browser_launched = False api_key = "" while api_key == "": - api_key = click.prompt( - f"Enter your Codeflash API key{' [or press Enter to open your API key page]' if not browser_launched else ''}", - hide_input=False, - default="", - type=CFAPIKeyType(), - show_default=False, - ).strip() + result = prompts.text( + f"Enter your Codeflash API key{' [or press Enter to open your API key page]' if not browser_launched else ''}" + ) + if result.command is None: + apologize_and_exit() + return + api_key = result.value.strip() + if api_key: + # Validate API key format + if not api_key.startswith("cf-"): + console.print(f"❌ That key [{api_key}] seems to be invalid. It should start with a 'cf-' prefix. Please try again.") + api_key = "" # Reset to retry + continue break + if not browser_launched: - click.echo( + console.print( f"Opening your Codeflash API key page. Grab a key from there!{LF}" "You can also open this link manually: https://app.codeflash.ai/app/apikeys" ) - click.launch("https://app.codeflash.ai/app/apikeys") + webbrowser.open("https://app.codeflash.ai/app/apikeys") browser_launched = True # This does not work on remote consoles shell_rc_path = get_shell_rc_path() if not shell_rc_path.exists() and os.name == "nt": # On Windows, create the appropriate file (PowerShell .ps1 or CMD .bat) in the user's home directory shell_rc_path.parent.mkdir(parents=True, exist_ok=True) shell_rc_path.touch() - click.echo(f"βœ… Created {shell_rc_path}") + console.print(f"βœ… Created {shell_rc_path}") get_user_id(api_key=api_key) # Used to verify whether the API key is valid. result = save_api_key_to_rc(api_key) if is_successful(result): - click.echo(result.unwrap()) + console.print(result.unwrap()) else: - click.echo(result.failure()) - click.pause() + console.print(result.failure()) + console.input("Press Enter to continue...") os.environ["CODEFLASH_API_KEY"] = api_key From 6e38f966d74060a8accc437c32fed5501646439e Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Sun, 21 Dec 2025 00:36:28 -0500 Subject: [PATCH 07/12] some click --- codeflash/cli_cmds/cmd_init.py | 2 +- codeflash/code_utils/oauth_handler.py | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/codeflash/cli_cmds/cmd_init.py b/codeflash/cli_cmds/cmd_init.py index f569ce945..92f9a202b 100644 --- a/codeflash/cli_cmds/cmd_init.py +++ b/codeflash/cli_cmds/cmd_init.py @@ -530,7 +530,7 @@ def collect_setup_info() -> CLISetupInfo: def check_for_toml_or_setup_file() -> str | None: console.print() - console.print("Checking for pyproject.toml or setup.py…\r", nl=False) + console.print("Checking for pyproject.toml or setup.py…\r") curdir = Path.cwd() pyproject_toml_path = curdir / "pyproject.toml" setup_py_path = curdir / "setup.py" diff --git a/codeflash/code_utils/oauth_handler.py b/codeflash/code_utils/oauth_handler.py index 65e9f1341..9561aec78 100644 --- a/codeflash/code_utils/oauth_handler.py +++ b/codeflash/code_utils/oauth_handler.py @@ -14,10 +14,10 @@ import urllib.parse import webbrowser -import click import requests from codeflash.api.cfapi import get_cfapi_base_urls +from codeflash.cli_cmds.console import console class OAuthHandler: @@ -737,19 +737,19 @@ def perform_oauth_signin() -> str | None: try: httpd = oauth.start_local_server(port) except Exception: - click.echo("❌ Failed to start local server.") + console.print("❌ Failed to start local server.") return None if should_attempt_browser_launch(): # Try to open browser - click.echo("🌐 Opening browser to sign in to CodeFlash…") + console.print("🌐 Opening browser to sign in to CodeFlash…") with contextlib.suppress(Exception): webbrowser.open(local_auth_url) # Show remote URL and start input thread - click.echo("\nπŸ“‹ If browser didn't open, visit this URL:") - click.echo(f"\n{remote_auth_url}\n") - click.echo("Paste code here if prompted > ", nl=False) + console.print("\nπŸ“‹ If browser didn't open, visit this URL:") + console.print(f"\n{remote_auth_url}\n") + console.print("Paste code here if prompted > ", end="") # Start thread to wait for manual input input_thread = threading.Thread(target=_wait_for_manual_code_input, args=(oauth,)) @@ -763,7 +763,7 @@ def perform_oauth_signin() -> str | None: if not oauth.is_complete: httpd.shutdown() - click.echo("\n❌ Authentication timed out.") + console.print("\n❌ Authentication timed out.") return None # Check which method completed @@ -776,7 +776,7 @@ def perform_oauth_signin() -> str | None: # Browser callback received if oauth.error or not oauth.state or oauth.state != state: httpd.shutdown() - click.echo("\n❌ Unauthorized.") + console.print("\n❌ Unauthorized.") return None api_key = oauth.exchange_code_for_token(oauth.code, code_verifier, local_redirect_uri) @@ -786,6 +786,6 @@ def perform_oauth_signin() -> str | None: httpd.shutdown() if not api_key: - click.echo("\n❌ Authentication failed.") - click.echo("\n") + console.print("\n❌ Authentication failed.") + console.print("\n") return api_key From 5db28e233f499e3e0048118ed69634848db50c4c Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Sun, 21 Dec 2025 00:37:00 -0500 Subject: [PATCH 08/12] from deps --- pyproject.toml | 1 - uv.lock | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d745f3f97..4786fb59a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -27,7 +27,6 @@ dependencies = [ "pydantic>=1.10.1", "humanize>=4.0.0", "posthog>=3.0.0", - "click>=8.1.0", "sentry-sdk>=1.40.6,<3.0.0", "parameterized>=0.9.0", "isort>=5.11.0", diff --git a/uv.lock b/uv.lock index 00604ef30..c3a4f42fb 100644 --- a/uv.lock +++ b/uv.lock @@ -352,8 +352,6 @@ wheels = [ name = "codeflash" source = { editable = "." } dependencies = [ - { name = "click", version = "8.1.8", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "click", version = "8.3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "codeflash-benchmark" }, { name = "coverage", version = "7.10.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "coverage", version = "7.13.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, @@ -442,7 +440,6 @@ tests = [ [package.metadata] requires-dist = [ - { name = "click", specifier = ">=8.1.0" }, { name = "codeflash-benchmark", editable = "codeflash-benchmark" }, { name = "coverage", specifier = ">=7.6.4" }, { name = "crosshair-tool", specifier = ">=0.0.78" }, @@ -857,7 +854,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ From c5d392182d8e54245f677db7dcd12c4e20483875 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Sun, 21 Dec 2025 01:08:24 -0500 Subject: [PATCH 09/12] inquired --- codeflash/cli_cmds/cmd_init.py | 1085 +++++++++++--------------- codeflash/cli_cmds/themed_prompts.py | 107 ++- codeflash/cli_cmds/validators.py | 203 +++++ uv.lock | 16 +- 4 files changed, 766 insertions(+), 645 deletions(-) create mode 100644 codeflash/cli_cmds/validators.py diff --git a/codeflash/cli_cmds/cmd_init.py b/codeflash/cli_cmds/cmd_init.py index 92f9a202b..fc66b9912 100644 --- a/codeflash/cli_cmds/cmd_init.py +++ b/codeflash/cli_cmds/cmd_init.py @@ -14,18 +14,23 @@ import tomlkit from git import InvalidGitRepositoryError, Repo from inquirer_textual.common.Choice import Choice +from inquirer_textual.widgets.InquirerConfirm import InquirerConfirm +from inquirer_textual.widgets.InquirerSelect import InquirerSelect from pydantic.dataclasses import dataclass -from rich.console import Group -from rich.panel import Panel -from rich.table import Table -from rich.text import Text from codeflash.api.cfapi import get_user_id, is_github_app_installed_on_repo from codeflash.cli_cmds import themed_prompts as prompts from codeflash.cli_cmds.cli_common import apologize_and_exit from codeflash.cli_cmds.console import console, logger from codeflash.cli_cmds.extension import install_vscode_extension -from codeflash.code_utils.code_utils import validate_relative_directory_path +from codeflash.cli_cmds.validators import ( + APIKeyValidator, + NotEqualPathValidator, + PathExistsValidator, + PyprojectTomlValidator, + RelativePathValidator, + TomlFileValidator, +) from codeflash.code_utils.compat import LF from codeflash.code_utils.config_parser import parse_config_file from codeflash.code_utils.env_utils import check_formatter_installed, get_codeflash_api_key @@ -65,6 +70,17 @@ class CLISetupInfo: enable_telemetry: bool +@dataclass(frozen=True) +class ConfigAnswers: + """Parsed answers from the config widgets.""" + + module_root: Path + tests_root: Path + formatter: str + enable_telemetry: bool + git_remote: str + + @dataclass(frozen=True) class VsCodeSetupInfo: module_root: str @@ -79,74 +95,206 @@ class DependencyManager(Enum): UNKNOWN = auto() -def init_codeflash() -> None: - try: - welcome_panel = Panel( - Text( - "⚑️ Welcome to Codeflash!\n\nThis setup will take just a few minutes.", - style="bold cyan", - justify="center", - ), - title="πŸš€ Codeflash Setup", - border_style="bright_cyan", - padding=(1, 2), - ) - console.print(welcome_panel) - console.print() +def collect_config(curdir: Path, auth_status: str, project_name: str | None, git_remotes: list[str]) -> ConfigAnswers: + """Build config widgets, prompt user, and process results. Exits on cancellation.""" + # Build options for module root + valid_module_subdirs, _ = get_suggestions(CommonSections.module_root) + curdir_option = f"current directory ({curdir})" + custom_module_dir_option = "enter a custom directory…" + module_subdir_options = [*valid_module_subdirs, curdir_option, custom_module_dir_option] + default_module_choice = project_name if project_name in module_subdir_options else module_subdir_options[0] - did_add_new_key = prompt_api_key() + # Build options for tests root + tests_suggestions, default_tests_subdir = get_suggestions(CommonSections.tests_root) + create_for_me_option = f"πŸ†• Create a new tests{os.pathsep} directory for me!" + test_subdir_options: list[str | Choice] = list(tests_suggestions) + if "tests" not in tests_suggestions: + test_subdir_options.append(create_for_me_option) + custom_tests_dir_option = "πŸ“ Enter a custom directory…" + test_subdir_options.append(custom_tests_dir_option) - should_modify, config = should_modify_pyproject_toml() + # Formatter choices + formatter_choices = [ + Choice("⚫ black", data="black"), + Choice("⚑ ruff", data="ruff"), + Choice("πŸ”§ other", data="other"), + Choice("❌ don't use a formatter", data="don't use a formatter"), + ] - git_remote = config.get("git_remote", "origin") if config else "origin" + # Build widgets + widgets: list = [ + InquirerSelect( + "Which Python module do you want me to optimize?", + choices=module_subdir_options, + default=default_module_choice, + mandatory=True, + ), + InquirerSelect( + "Where are your tests located?", + choices=test_subdir_options, + default=(default_tests_subdir or test_subdir_options[0]), + mandatory=True, + ), + InquirerSelect( + "Which code formatter do you use?", choices=formatter_choices, default=formatter_choices[0], mandatory=True + ), + InquirerConfirm("Help us improve Codeflash by sharing anonymous usage data?", default=True), + ] - if should_modify: - setup_info: CLISetupInfo = collect_setup_info() - git_remote = setup_info.git_remote - configured = configure_pyproject_toml(setup_info) - if not configured: - apologize_and_exit() + has_multiple_remotes = len(git_remotes) > 1 + if has_multiple_remotes: + git_remote_choices: list[str | Choice] = list(git_remotes) + widgets.append( + InquirerSelect( + "Which git remote should Codeflash use for Pull Requests?", + choices=git_remote_choices, + default="origin" if "origin" in git_remotes else git_remotes[0], + mandatory=True, + ) + ) - install_github_app(git_remote) + # Run prompt + header = f"{auth_status}\n\nβš™οΈ Project Configuration" if auth_status else "βš™οΈ Project Configuration" + result = prompts.multi(widgets, header=header) + if result.command is None: + apologize_and_exit() - install_github_actions(override_formatter_check=True) + # Unpack results + if has_multiple_remotes: + module_root_answer, tests_root_answer, formatter_answer, enable_telemetry, git_remote = result.value + else: + module_root_answer, tests_root_answer, formatter_answer, enable_telemetry = result.value + git_remote = git_remotes[0] if len(git_remotes) == 1 else "" - install_vscode_extension() + # Process module root + module_root = process_module_root_answer(module_root_answer, curdir_option, custom_module_dir_option) + ph("cli-project-root-provided") - module_string = "" - if "setup_info" in locals(): - module_string = f" you selected ({setup_info.module_root})" + # Process tests root + tests_root = process_tests_root_answer( + tests_root_answer, create_for_me_option, custom_tests_dir_option, curdir, default_tests_subdir, module_root + ) + tests_root = tests_root.relative_to(curdir) + ph("cli-tests-root-provided") - usage_table = Table(show_header=False, show_lines=False, border_style="dim") - usage_table.add_column("Command", style="cyan") - usage_table.add_column("Description", style="white") + # Extract formatter value + formatter = formatter_answer.data if isinstance(formatter_answer, Choice) else formatter_answer - usage_table.add_row( - "codeflash --file --function ", "Optimize a specific function within a file" - ) - usage_table.add_row("codeflash optimize ", "Trace and find the best optimizations for a script") - usage_table.add_row("codeflash --all", "Optimize all functions in all files") - usage_table.add_row("codeflash --help", "See all available options") + return ConfigAnswers( + module_root=Path(module_root), + tests_root=tests_root, + formatter=cast("str", formatter), + enable_telemetry=enable_telemetry, + git_remote=str(git_remote), + ) - completion_message = "⚑️ Codeflash is now set up!\n\nYou can now run any of these commands:" - if did_add_new_key: - completion_message += ( - "\n\n🐚 Don't forget to restart your shell to load the CODEFLASH_API_KEY environment variable!" +def init_codeflash() -> None: + try: + curdir = Path.cwd() + + try: + existing_api_key = get_codeflash_api_key() + except OSError: + existing_api_key = None + + did_add_new_key = False + auth_status = "" + if existing_api_key: + auth_status = f"πŸ”‘ API Key found [{existing_api_key[:3]}****{existing_api_key[-4:]}]" + else: + auth_choices = [Choice("πŸ” Login with Codeflash", data="oauth"), Choice("πŸ”‘ Use API key", data="api_key")] + method = prompts.select_or_exit( + "How would you like to authenticate?", + choices=auth_choices, + default=auth_choices[0], + header="⚑️ Welcome to Codeflash!\n\nThis setup will take just a few minutes.", ) - if os.name == "nt": - reload_cmd = f". {get_shell_rc_path()}" if is_powershell() else f"call {get_shell_rc_path()}" + if method == "api_key": + enter_api_key_and_save_to_rc() + ph("cli-new-api-key-entered") else: - reload_cmd = f"source {get_shell_rc_path()}" - completion_message += f"\nOr run: {reload_cmd}" - - completion_panel = Panel( - Group(Text(completion_message, style="bold green"), Text(""), usage_table), - title="πŸŽ‰ Setup Complete!", - border_style="bright_green", - padding=(1, 2), + api_key = perform_oauth_signin() + if not api_key: + apologize_and_exit() + return # unreachable, satisfies type checker + save_api_key_and_set_env(api_key) + ph("cli-oauth-signin-completed") + auth_status = "βœ… Signed in successfully!" + did_add_new_key = True + + should_modify, config = should_modify_pyproject_toml() + git_remote = config.get("git_remote", "origin") if config else "origin" + + if should_modify: + if not os.access(curdir, os.W_OK): + console.print( + f"❌ The current directory isn't writable, please check your folder permissions and try again.{LF}" + ) + console.print("It's likely you don't have write permissions for this folder.") + sys.exit(1) + + project_name = check_for_toml_or_setup_file() + + try: + repo = Repo(curdir, search_parent_directories=True) + git_remotes = get_git_remotes(repo) + except InvalidGitRepositoryError: + git_remotes = [] + + answers = collect_config(curdir, auth_status, project_name, git_remotes) + git_remote = answers.git_remote + + setup_info = CLISetupInfo( + module_root=str(answers.module_root), + tests_root=str(answers.tests_root), + benchmarks_root=None, + ignore_paths=[], + formatter=answers.formatter, + git_remote=answers.git_remote, + enable_telemetry=answers.enable_telemetry, + ) + if not configure_pyproject_toml(setup_info): + apologize_and_exit() + + try: + git.Repo(search_parent_directories=True) + in_git_repo = True + except git.InvalidGitRepositoryError: + in_git_repo = False + + integration_options = [Choice("πŸ“¦ VSCode Extension", data="vscode")] + if in_git_repo: + integration_options = [ + Choice("πŸ™ GitHub App", data="github_app"), + Choice("βš™οΈ GitHub Actions", data="github_actions"), + *integration_options, + ] + + integrations_header = "πŸ”§ Optional Integrations\n\nπŸ’‘ SPACE to select, ENTER to confirm." + if not should_modify and auth_status: + integrations_header = f"{auth_status}\n\n{integrations_header}" + + selected = prompts.checkbox_or_default( + "Which integrations would you like to install?", + choices=integration_options, + default_on_cancel=[], + header=integrations_header, ) - console.print(completion_panel) + for choice in selected: + if choice.data == "github_app": + install_github_app(git_remote) + elif choice.data == "github_actions": + install_github_actions(override_formatter_check=True) + elif choice.data == "vscode": + install_vscode_extension() + + header = "πŸŽ‰ Codeflash is now set up!\n\nCommands:\n codeflash --file --function \n codeflash optimize \n codeflash --all\n codeflash --help" + if did_add_new_key: + rc = get_shell_rc_path() + cmd = f". {rc}" if is_powershell() else f"call {rc}" if os.name == "nt" else f"source {rc}" + header += f"\n\n🐚 Restart your shell or run: {cmd}" + prompts.confirm("Ready to start optimizing?", default=True, header=header) ph("cli-installation-successful", {"did_add_new_key": did_add_new_key}) sys.exit(0) @@ -155,86 +303,48 @@ def init_codeflash() -> None: def ask_run_end_to_end_test(args: Namespace) -> None: - from rich.prompt import Confirm - - run_tests = Confirm.ask( + result = prompts.select( "⚑️ Do you want to run a sample optimization to make sure everything's set up correctly? (takes about 3 minutes)", - choices=["y", "n"], - default="y", - show_choices=True, - show_default=False, - console=console, + choices=["Yes", "No"], + default="Yes", ) console.rule() - if run_tests: + if result.command is not None and result.value == "Yes": file_path = create_find_common_tags_file(args, "find_common_tags.py") run_end_to_end_test(args, file_path) -def config_found(pyproject_toml_path: Union[str, Path]) -> tuple[bool, str]: - pyproject_toml_path = Path(pyproject_toml_path) - - if not pyproject_toml_path.exists(): - return False, f"Configuration file not found: {pyproject_toml_path}" - - if not pyproject_toml_path.is_file(): - return False, f"Configuration file is not a file: {pyproject_toml_path}" - - if pyproject_toml_path.suffix != ".toml": - return False, f"Configuration file is not a .toml file: {pyproject_toml_path}" - - return True, "" - - -def is_valid_pyproject_toml(pyproject_toml_path: Union[str, Path]) -> tuple[bool, dict[str, Any] | None, str]: - pyproject_toml_path = Path(pyproject_toml_path) - try: - config, _ = parse_config_file(pyproject_toml_path) - except Exception as e: - return False, None, f"Failed to parse configuration: {e}" - - module_root = config.get("module_root") - if not module_root: - return False, config, "Missing required field: 'module_root'" - - if not Path(module_root).is_dir(): - return False, config, f"Invalid 'module_root': directory does not exist at {module_root}" - - tests_root = config.get("tests_root") - if not tests_root: - return False, config, "Missing required field: 'tests_root'" - - if not Path(tests_root).is_dir(): - return False, config, f"Invalid 'tests_root': directory does not exist at {tests_root}" - - return True, config, "" - - def should_modify_pyproject_toml() -> tuple[bool, dict[str, Any] | None]: """Check if the current directory contains a valid pyproject.toml file with codeflash config. If it does, ask the user if they want to re-configure it. """ - from rich.prompt import Confirm - pyproject_toml_path = Path.cwd() / "pyproject.toml" - found, _ = config_found(pyproject_toml_path) - if not found: - return True, None + toml_validator = TomlFileValidator() + toml_result = toml_validator.validate(str(pyproject_toml_path)) + if not toml_result.is_valid: + return True, None # File doesn't exist or isn't valid, needs configuration - valid, config, _message = is_valid_pyproject_toml(pyproject_toml_path) - if not valid: - # needs to be re-configured + config_validator = PyprojectTomlValidator() + config_result = config_validator.validate(str(pyproject_toml_path)) + if not config_result.is_valid: + return True, None # Configuration invalid, needs re-configuration + + try: + config, _ = parse_config_file(pyproject_toml_path) + except Exception: return True, None - return Confirm.ask( + answer = prompts.select_or_exit( "βœ… A valid Codeflash config already exists in this project. Do you want to re-configure it?", - default=False, - show_default=True, - ), config + choices=["Yes", "No"], + default="No", + ) + + return answer == "Yes", config # common sections between normal mode and lsp mode @@ -283,299 +393,121 @@ def get_suggestions(section: CommonSections | str) -> tuple[list[str], Optional[ raise ValueError(msg) -def collect_setup_info() -> CLISetupInfo: - curdir = Path.cwd() - # Check if the cwd is writable - if not os.access(curdir, os.W_OK): - console.print(f"❌ The current directory isn't writable, please check your folder permissions and try again.{LF}") - console.print("It's likely you don't have write permissions for this folder.") - sys.exit(1) - - # Check for the existence of pyproject.toml or setup.py - project_name = check_for_toml_or_setup_file() - valid_module_subdirs, _ = get_suggestions(CommonSections.module_root) +def prompt_custom_directory(message: str, title: str, additional_validators: list | None = None) -> Path | None: + validators = [PathExistsValidator(), RelativePathValidator()] + if additional_validators: + validators.extend(additional_validators) - curdir_option = f"current directory ({curdir})" - custom_dir_option = "enter a custom directory…" - module_subdir_options = [*valid_module_subdirs, curdir_option, custom_dir_option] - - info_panel = Panel( - Text( - "πŸ“ Let's identify your Python module directory.\n\n" - "This is usually the top-level directory containing all your Python source code.\n", - style="cyan", - ), - title="πŸ” Module Discovery", - border_style="bright_blue", - ) - console.print(info_panel) - console.print() + result = prompts.text("Enter the path to your directory", validators=validators, header=f"{title}\n\n{message}") - default_choice = project_name if project_name in module_subdir_options else module_subdir_options[0] - result = prompts.select( - "Which Python module do you want me to optimize?", choices=module_subdir_options, default=default_choice - ) if result.command is None: - apologize_and_exit() - module_root_answer = result.value - if module_root_answer == curdir_option: - module_root = "." - elif module_root_answer == custom_dir_option: - custom_panel = Panel( - Text( - "πŸ“‚ Enter a custom module directory path.\n\nPlease provide the path to your Python module directory.", - style="yellow", - ), - title="πŸ“‚ Custom Directory", - border_style="bright_yellow", - ) - console.print(custom_panel) - console.print() - - # Retry loop for custom module root path - module_root = None - while module_root is None: - result = prompts.text("Enter the path to your module directory") - if result.command is None: - apologize_and_exit() - return None # unreachable but satisfies type checker - - custom_path_str = result.value - # Validate the path is safe and exists - path_obj = Path(custom_path_str) - if not path_obj.exists() or not path_obj.is_dir(): - console.print(f"❌ Path does not exist or is not a directory: {custom_path_str}") - console.print() # Add spacing before retry - continue - is_valid, error_msg = validate_relative_directory_path(custom_path_str) - if not is_valid: - console.print(f"❌ Invalid path: {error_msg}") - console.print("Please enter a valid relative directory path.") - console.print() # Add spacing before retry - continue # Retry the prompt - module_root = Path(custom_path_str) - else: - module_root = module_root_answer - ph("cli-project-root-provided") + return None - # Discover test directory - create_for_me_option = f"πŸ†• Create a new tests{os.pathsep} directory for me!" - tests_suggestions, default_tests_subdir = get_suggestions(CommonSections.tests_root) - test_subdir_options = [sub_dir for sub_dir in tests_suggestions if sub_dir != module_root] - if "tests" not in tests_suggestions: - test_subdir_options.append(create_for_me_option) - custom_dir_option = "πŸ“ Enter a custom directory…" - test_subdir_options.append(custom_dir_option) - - tests_panel = Panel( - Text( - "πŸ§ͺ Now let's locate your test directory.\n\n" - "This is where all your test files are stored. If you don't have tests yet, " - "I can create a directory for you!", - style="green", - ), - title="πŸ§ͺ Test Discovery", - border_style="bright_green", - ) - console.print(tests_panel) - console.print() + return Path(result.value) - result = prompts.select( - "Where are your tests located?", - choices=test_subdir_options, - default=(default_tests_subdir or test_subdir_options[0]), - ) - if result.command is None: - apologize_and_exit() - tests_root_answer = result.value - if tests_root_answer == create_for_me_option: - tests_root = Path(curdir) / (default_tests_subdir or "tests") +def process_module_root_answer(answer: str, curdir_option: str, custom_option: str) -> str | Path: + """Process module root answer and return the path. Exits on cancellation.""" + if answer == curdir_option: + return "." + if answer == custom_option: + custom_path = prompt_custom_directory( + "πŸ“‚ Enter a custom module directory path.\n\nPlease provide the path to your Python module directory.", + "πŸ“‚ Custom Directory", + ) + if custom_path is None: + apologize_and_exit() + return custom_path # type: ignore[return-value] # apologize_and_exit() never returns + return answer + + +def process_tests_root_answer( + answer: str, + create_option: str, + custom_option: str, + curdir: Path, + default_tests_subdir: str | None, + module_root: str | Path, +) -> Path: + """Process tests root answer and return the path. Exits on cancellation.""" + if answer == create_option: + tests_root = curdir / (default_tests_subdir or "tests") tests_root.mkdir() console.print(f"βœ… Created directory {tests_root}{os.path.sep}{LF}") - elif tests_root_answer == custom_dir_option: - custom_tests_panel = Panel( - Text( - "πŸ§ͺ Enter a custom test directory path.\n\nPlease provide the path to your test directory, relative to the current directory.", - style="yellow", - ), - title="πŸ§ͺ Custom Test Directory", - border_style="bright_yellow", + return tests_root + + if answer == custom_option: + resolved_module_root = (curdir / Path(module_root)).resolve() + custom_path = prompt_custom_directory( + "πŸ§ͺ Enter a custom test directory path.\n\nPlease provide the path to your test directory, relative to the current directory.", + "πŸ§ͺ Custom Test Directory", + additional_validators=[NotEqualPathValidator(resolved_module_root)], ) - console.print(custom_tests_panel) - console.print() - - # Retry loop for custom tests root path - tests_root = None - while tests_root is None: - result = prompts.text("Enter the path to your tests directory") - if result.command is None: - apologize_and_exit() - return None # unreachable but satisfies type checker - - custom_tests_path_str = result.value - # Validate the path exists - path_obj = Path(custom_tests_path_str) - if not path_obj.exists() or not path_obj.is_dir(): - console.print(f"❌ Path does not exist or is not a directory: {custom_tests_path_str}") - console.print() # Add spacing before retry - continue - # Validate the path is safe - is_valid, error_msg = validate_relative_directory_path(custom_tests_path_str) - if not is_valid: - console.print(f"❌ Invalid path: {error_msg}") - console.print("Please enter a valid relative directory path.") - console.print() # Add spacing before retry - continue # Retry the prompt - tests_root = Path(curdir) / Path(custom_tests_path_str) - else: - tests_root = Path(curdir) / Path(cast("str", tests_root_answer)) - - tests_root = tests_root.relative_to(curdir) - - resolved_module_root = (Path(curdir) / Path(module_root)).resolve() - resolved_tests_root = (Path(curdir) / Path(tests_root)).resolve() - if resolved_module_root == resolved_tests_root: - logger.warning( - "It looks like your tests root is the same as your module root. This is not recommended and can lead to unexpected behavior." - ) - - ph("cli-tests-root-provided") - - benchmarks_root = None - - # TODO: Implement other benchmark framework options - # if benchmarks_root: - # benchmarks_root = benchmarks_root.relative_to(curdir) - # - # # Ask about benchmark framework - # benchmark_framework_options = ["pytest-benchmark", "asv (Airspeed Velocity)", "custom/other"] - # result = prompts.select( - # "Which benchmark framework do you use?", - # choices=benchmark_framework_options, - # default=benchmark_framework_options[0] - # ) - # benchmark_framework = result.value - - formatter_panel = Panel( - Text( - "🎨 Let's configure your code formatter.\n\n" - "Code formatters help maintain consistent code style. " - "Codeflash will use this to format optimized code.", - style="magenta", - ), - title="🎨 Code Formatter", - border_style="bright_magenta", - ) - console.print(formatter_panel) - console.print() - - formatter_choices = [ - Choice("⚫ black", data="black"), - Choice("⚑ ruff", data="ruff"), - Choice("πŸ”§ other", data="other"), - Choice("❌ don't use a formatter", data="don't use a formatter"), - ] - - result = prompts.select("Which code formatter do you use?", choices=formatter_choices, default=formatter_choices[0]) - if result.command is None: - apologize_and_exit() - formatter = result.value.data if isinstance(result.value, Choice) else result.value - - git_remote = "" - try: - repo = Repo(str(module_root), search_parent_directories=True) - git_remotes = get_git_remotes(repo) - if git_remotes: # Only proceed if there are remotes - if len(git_remotes) > 1: - git_panel = Panel( - Text( - "πŸ”— Configure Git Remote for Pull Requests.\n\n" - "Codeflash will use this remote to create pull requests with optimized code.", - style="blue", - ), - title="πŸ”— Git Remote Setup", - border_style="bright_blue", - ) - console.print(git_panel) - console.print() + if custom_path is None: + apologize_and_exit() + return curdir / custom_path # type: ignore[operator] # apologize_and_exit() never returns - result = prompts.select( - "Which git remote should Codeflash use for Pull Requests?", choices=git_remotes, default="origin" - ) - git_remote = result.value if result.command is not None else git_remotes[0] - else: - git_remote = git_remotes[0] - else: - console.print( - "No git remotes found. You can still use Codeflash locally, but you'll need to set up a remote " - "repository to use GitHub features." - ) - except InvalidGitRepositoryError: - git_remote = "" + return curdir / Path(answer) - enable_telemetry = ask_for_telemetry() - ignore_paths: list[str] = [] - return CLISetupInfo( - module_root=str(module_root), - tests_root=str(tests_root), - benchmarks_root=str(benchmarks_root) if benchmarks_root else None, - ignore_paths=ignore_paths, - formatter=cast("str", formatter), - git_remote=str(git_remote), - enable_telemetry=enable_telemetry, - ) +def detect_project_name(pyproject_path: Path, setup_py_path: Path) -> str | None: + """Detect project name from pyproject.toml or setup.py.""" + if pyproject_path.exists(): + try: + content = pyproject_path.read_text(encoding="utf8") + parsed = tomlkit.parse(content) + name = parsed.get("tool", {}).get("poetry", {}).get("name") # type: ignore[union-attr] + if name: + console.print(f"βœ… I found a pyproject.toml for your project {name}.") + ph("cli-pyproject-toml-found-name") + return cast("str", name) + except Exception: # noqa: S110 - Intentionally silent, project name is optional + pass + console.print("βœ… I found a pyproject.toml for your project.") + ph("cli-pyproject-toml-found") + return None + + if setup_py_path.exists(): + content = setup_py_path.read_text(encoding="utf8") + match = re.search(r"setup\s*\([^)]*?name\s*=\s*['\"](.*?)['\"]", content, re.DOTALL) + if match: + name = match.group(1) + console.print(f"βœ… Found setup.py for your project {name}") + ph("cli-setup-py-found-name") + return name + console.print("βœ… Found setup.py.") + ph("cli-setup-py-found") + return None def check_for_toml_or_setup_file() -> str | None: - console.print() - console.print("Checking for pyproject.toml or setup.py…\r") + """Check for pyproject.toml or setup.py and return project name if found.""" curdir = Path.cwd() pyproject_toml_path = curdir / "pyproject.toml" setup_py_path = curdir / "setup.py" - project_name = None - if pyproject_toml_path.exists(): - try: - pyproject_toml_content = pyproject_toml_path.read_text(encoding="utf8") - project_name = tomlkit.parse(pyproject_toml_content)["tool"]["poetry"]["name"] - console.print(f"βœ… I found a pyproject.toml for your project {project_name}.") - ph("cli-pyproject-toml-found-name") - except Exception: - console.print("βœ… I found a pyproject.toml for your project.") - ph("cli-pyproject-toml-found") - else: - if setup_py_path.exists(): - setup_py_content = setup_py_path.read_text(encoding="utf8") - project_name_match = re.search(r"setup\s*\([^)]*?name\s*=\s*['\"](.*?)['\"]", setup_py_content, re.DOTALL) - if project_name_match: - project_name = project_name_match.group(1) - console.print(f"βœ… Found setup.py for your project {project_name}") - ph("cli-setup-py-found-name") - else: - console.print("βœ… Found setup.py.") - ph("cli-setup-py-found") - toml_info_panel = Panel( - Text( + + project_name = detect_project_name(pyproject_toml_path, setup_py_path) + + # If no pyproject.toml exists, prompt to create one + if not pyproject_toml_path.exists(): + ph("cli-no-pyproject-toml-or-setup-py") + + answer = prompts.select_or_exit( + "Create pyproject.toml in the current directory?", + choices=["Yes", "No"], + default="Yes", + header=( + f"πŸ“‹ pyproject.toml Required\n\n" f"πŸ’‘ No pyproject.toml found in {curdir}.\n\n" "This file is essential for Codeflash to store its configuration.\n" - "Please ensure you are running `codeflash init` from your project's root directory.", - style="yellow", + "Please ensure you are running `codeflash init` from your project's root directory." ), - title="πŸ“‹ pyproject.toml Required", - border_style="bright_yellow", ) - console.print(toml_info_panel) - console.print() - ph("cli-no-pyproject-toml-or-setup-py") - - # Create a pyproject.toml file because it doesn't exist - result = prompts.select("Create pyproject.toml in the current directory?", choices=["Yes", "No"], default="Yes") - if result.command is None or result.value == "No": + if answer == "No": apologize_and_exit() create_empty_pyproject_toml(pyproject_toml_path) - console.print() - return cast("str", project_name) + + return project_name def create_empty_pyproject_toml(pyproject_toml_path: Path) -> None: @@ -589,19 +521,15 @@ def create_empty_pyproject_toml(pyproject_toml_path: Path) -> None: # Check if the pyproject.toml file was created if pyproject_toml_path.exists() and not lsp_mode: - success_panel = Panel( - Text( + prompts.confirm( + "Continue?", + default=True, + header=( + f"πŸŽ‰ Success!\n\n" f"βœ… Created a pyproject.toml file at {pyproject_toml_path}\n\n" - "Your project is now ready for Codeflash configuration!", - style="green", - justify="center", + "Your project is now ready for Codeflash configuration!" ), - title="πŸŽ‰ Success!", - border_style="bright_green", ) - console.print(success_panel) - console.print("\nπŸ“ Press any key to continue...") - console.input() ph("cli-created-pyproject-toml") except OSError: console.print("❌ Failed to create pyproject.toml. Please check your disk permissions and available space.") @@ -611,8 +539,8 @@ def create_empty_pyproject_toml(pyproject_toml_path: Path) -> None: def install_github_actions(override_formatter_check: bool = False) -> None: # noqa: FBT001, FBT002 try: config, _config_file_path = parse_config_file(override_formatter_check=override_formatter_check) - ph("cli-github-actions-install-started") + try: repo = Repo(config["module_root"], search_parent_directories=True) except git.InvalidGitRepositoryError: @@ -625,136 +553,97 @@ def install_github_actions(override_formatter_check: bool = False) -> None: # n workflows_path = git_root / ".github" / "workflows" optimize_yaml_path = workflows_path / "codeflash.yaml" - actions_panel = Panel( - Text( - "πŸ€– GitHub Actions Setup\n\n" - "GitHub Actions will automatically optimize your code in every pull request. " - "This is the recommended way to use Codeflash for continuous optimization.", - style="blue", - ), - title="πŸ€– Continuous Optimization", - border_style="bright_blue", - ) - console.print(actions_panel) - console.print() - - # Check if the workflow file already exists + # Check if workflow exists if optimize_yaml_path.exists(): - result = prompts.select( + answer = prompts.select_or_exit( f"GitHub Actions workflow already exists at {optimize_yaml_path}. Overwrite?", choices=["No", "Yes"], default="No", ) - if result.command is None or result.value == "No": - skip_panel = Panel( - Text("⏩️ Skipping workflow creation.", style="yellow"), title="⏩️ Skipped", border_style="yellow" - ) - console.print(skip_panel) + if answer == "No": ph("cli-github-workflow-skipped") return - ph("cli-github-optimization-confirm-workflow-overwrite", {"confirm_overwrite": result.value == "Yes"}) - - result = prompts.select( - "Set up GitHub Actions for continuous optimization?", choices=["Yes", "No"], default="Yes" + ph("cli-github-optimization-confirm-workflow-overwrite", {"confirm_overwrite": True}) + + # Confirm setup + answer = prompts.select_or_exit( + "Set up GitHub Actions for continuous optimization?", + choices=["Yes", "No"], + default="Yes", + header=( + "πŸ€– GitHub Actions Setup\n\n" + "GitHub Actions will automatically optimize your code in every pull request. " + "This is the recommended way to use Codeflash for continuous optimization." + ), ) - if result.command is None or result.value == "No": - skip_panel = Panel( - Text("⏩️ Skipping GitHub Actions setup.", style="yellow"), title="⏩️ Skipped", border_style="yellow" - ) - console.print(skip_panel) + if answer == "No": ph("cli-github-workflow-skipped") return - ph("cli-github-optimization-confirm-workflow-creation", {"confirm_creation": result.value == "Yes"}) + + ph("cli-github-optimization-confirm-workflow-creation", {"confirm_creation": True}) workflows_path.mkdir(parents=True, exist_ok=True) - from importlib.resources import files + # Check for benchmark mode benchmark_mode = False benchmarks_root = config.get("benchmarks_root", "").strip() - if benchmarks_root and benchmarks_root != "": - benchmark_panel = Panel( - Text( + if benchmarks_root: + answer = prompts.select_or_exit( + "Run GitHub Actions in benchmark mode?", + choices=["Yes", "No"], + default="Yes", + header=( "πŸ“Š Benchmark Mode Available\n\n" "I noticed you've configured a benchmarks_root in your config. " - "Benchmark mode will show the performance impact of Codeflash's optimizations on your benchmarks.", - style="cyan", + "Benchmark mode will show the performance impact of Codeflash's optimizations on your benchmarks." ), - title="πŸ“Š Benchmark Mode", - border_style="bright_cyan", ) - console.print(benchmark_panel) - console.print() + benchmark_mode = answer == "Yes" - result = prompts.select("Run GitHub Actions in benchmark mode?", choices=["Yes", "No"], default="Yes") - benchmark_mode = (result.value == "Yes") if result.command is not None else False + # Create workflow file + from importlib.resources import files - optimize_yml_content = ( - files("codeflash").joinpath("cli_cmds", "workflows", "codeflash-optimize.yaml").read_text(encoding="utf-8") - ) - materialized_optimize_yml_content = customize_codeflash_yaml_content( - optimize_yml_content, config, git_root, benchmark_mode - ) - with optimize_yaml_path.open("w", encoding="utf8") as optimize_yml_file: - optimize_yml_file.write(materialized_optimize_yml_content) - # Success panel for workflow creation - workflow_success_panel = Panel( - Text( - f"βœ… Created GitHub action workflow at {optimize_yaml_path}\n\n" - "Your repository is now configured for continuous optimization!", - style="green", - justify="center", - ), - title="πŸŽ‰ Workflow Created!", - border_style="bright_green", + optimize_yml_content = (files("codeflash") / "cli_cmds" / "workflows" / "codeflash-optimize.yaml").read_text( + encoding="utf-8" ) - console.print(workflow_success_panel) - console.print() + materialized_content = customize_codeflash_yaml_content(optimize_yml_content, config, git_root, benchmark_mode) + optimize_yaml_path.write_text(materialized_content, encoding="utf8") + # Guide user to add GitHub secret try: existing_api_key = get_codeflash_api_key() except OSError: existing_api_key = None - # GitHub secrets setup panel - secrets_message = ( + secrets_url = get_github_secrets_page_url(repo) + secrets_header = ( + f"πŸŽ‰ Workflow Created!\n\n" + f"βœ… Created GitHub action workflow at {optimize_yaml_path}\n\n" + "Your repository is now configured for continuous optimization!\n\n" "πŸ” Next Step: Add API Key as GitHub Secret\n\n" "You'll need to add your CODEFLASH_API_KEY as a secret to your GitHub repository.\n\n" "πŸ“‹ Steps:\n" - "1. Press Enter to open your repo's secrets page\n" + "1. Select Yes to open your repo's secrets page\n" "2. Click 'New repository secret'\n" "3. Add your API key with the variable name CODEFLASH_API_KEY" ) - if existing_api_key: - secrets_message += f"\n\nπŸ”‘ Your API Key: {existing_api_key}" + secrets_header += f"\n\nπŸ”‘ Your API Key: {existing_api_key}" - secrets_panel = Panel( - Text(secrets_message, style="blue"), title="πŸ” GitHub Secrets Setup", border_style="bright_blue" + open_secrets = prompts.select_or_exit( + f"Open GitHub secrets page? ({secrets_url})", choices=["Yes", "No"], default="Yes", header=secrets_header ) - console.print(secrets_panel) - - console.print(f"\nπŸ“ Press Enter to open: {get_github_secrets_page_url(repo)}") - console.input() - - webbrowser.open(get_github_secrets_page_url(repo)) - - # Post-launch message panel - launch_panel = Panel( - Text( - "πŸ™ I opened your GitHub secrets page!\n\n" - "Note: If you see a 404, you probably don't have access to this repo's secrets. " - "Ask a repo admin to add it for you, or (not recommended) you can temporarily " - "hard-code your API key into the workflow file.", - style="cyan", + if open_secrets == "Yes": + webbrowser.open(secrets_url) + + prompts.confirm( + "Continue?", + default=True, + header=( + "πŸš€ Almost done!\n\n" + "Please edit, commit and push this GitHub actions file to your repo, and you're all set!\n\n" + "Note: If you see a 404 on the secrets page, you probably don't have access to this repo's secrets. " + "Ask a repo admin to add it for you." ), - title="🌐 Browser Opened", - border_style="bright_cyan", - ) - console.print(launch_panel) - console.input("Press Enter to continue...") - console.print() - console.print( - f"Please edit, commit and push this GitHub actions file to your repo, and you're all set!{LF}" - f"πŸš€ Codeflash is now configured to automatically optimize new Github PRs!{LF}" ) ph("cli-github-workflow-created") except KeyboardInterrupt: @@ -799,7 +688,7 @@ def get_codeflash_github_action_command(dep_manager: DependencyManager) -> str: return "codeflash" -def get_dependency_installation_commands(dep_manager: DependencyManager) -> tuple[str, str]: +def get_dependency_installation_commands(dep_manager: DependencyManager) -> str: """Generate commands to install the dependency manager and project dependencies.""" if dep_manager == DependencyManager.POETRY: return """| @@ -840,7 +729,7 @@ def get_github_action_working_directory(toml_path: Path, git_root: Path) -> str: def customize_codeflash_yaml_content( optimize_yml_content: str, - config: tuple[dict[str, Any], Path], + config: dict[str, Any], git_root: Path, benchmark_mode: bool = False, # noqa: FBT001, FBT002 ) -> str: @@ -920,13 +809,14 @@ def configure_pyproject_toml( if hasattr(setup_info, section.value): codeflash_section[section.get_toml_key()] = getattr(setup_info, section.value) else: - codeflash_section["module-root"] = setup_info.module_root - codeflash_section["tests-root"] = setup_info.tests_root - codeflash_section["ignore-paths"] = setup_info.ignore_paths - if not setup_info.enable_telemetry: - codeflash_section["disable-telemetry"] = not setup_info.enable_telemetry - if setup_info.git_remote not in ["", "origin"]: - codeflash_section["git-remote"] = setup_info.git_remote + cli_info = cast("CLISetupInfo", setup_info) + codeflash_section["module-root"] = cli_info.module_root + codeflash_section["tests-root"] = cli_info.tests_root + codeflash_section["ignore-paths"] = cli_info.ignore_paths + if not cli_info.enable_telemetry: + codeflash_section["disable-telemetry"] = not cli_info.enable_telemetry + if cli_info.git_remote not in ["", "origin"]: + codeflash_section["git-remote"] = cli_info.git_remote formatter = setup_info.formatter @@ -956,6 +846,26 @@ def configure_pyproject_toml( return True +def prompt_github_app_install(owner: str, repo: str) -> None: + """Prompt user to install GitHub app and wait for confirmation.""" + app_url = "https://github.com/apps/codeflash-ai/installations/select_target" + + open_page = prompts.select_or_exit( + f"Open GitHub App installation page? ({app_url})", + choices=["Yes", "No"], + default="Yes", + header=( + f"πŸ™ GitHub App Installation\n\n" + f"You'll need to install the Codeflash GitHub app for {owner}/{repo}.\n\n" + "I'll open the installation page where you can select your repository." + ), + ) + if open_page == "Yes": + webbrowser.open(app_url) + + prompts.confirm("Continue once you've completed the installation?", default=True) + + def install_github_app(git_remote: str) -> None: try: git_repo = git.Repo(search_parent_directories=True) @@ -973,152 +883,82 @@ def install_github_app(git_remote: str) -> None: console.print( f"πŸ™ Looks like you've already installed the Codeflash GitHub app on this repository ({owner}/{repo})! Continuing…" ) + return - else: - try: - console.print( - f"Finally, you'll need to install the Codeflash GitHub app by choosing the repository you want to install Codeflash on.{LF}" - f"I will attempt to open the github app page - https://github.com/apps/codeflash-ai/installations/select_target {LF}" - f"Please, press ENTER to open the app installation page{LF}" - ) - console.input(">>> ") - webbrowser.open("https://github.com/apps/codeflash-ai/installations/select_target") - console.print( - f"Please, press ENTER once you've finished installing the github app from https://github.com/apps/codeflash-ai/installations/select_target{LF}" - ) - console.input(">>> ") - - count = 2 - while not is_github_app_installed_on_repo(owner, repo, suppress_errors=True): - if count == 0: - console.print( - f"❌ It looks like the Codeflash GitHub App is not installed on the repository {owner}/{repo}.{LF}" - f"You won't be able to create PRs with Codeflash until you install the app.{LF}" - f"In the meantime you can make local only optimizations by using the '--no-pr' flag with codeflash.{LF}" - ) - break - console.print( - f"❌ It looks like the Codeflash GitHub App is not installed on the repository {owner}/{repo}.{LF}" - f"Please install it from https://github.com/apps/codeflash-ai/installations/select_target {LF}" - f"Please, press ENTER to continue once you've finished installing the github app…{LF}" - ) - console.input(">>> ") - count -= 1 - except (KeyboardInterrupt, EOFError): - # leave empty line for the next prompt to be properly rendered - console.print() - - -# -def prompt_api_key() -> bool: - """Prompt user for API key via OAuth or manual entry.""" - # Check for existing API key + # Not installed - prompt for installation try: - existing_api_key = get_codeflash_api_key() - except OSError: - existing_api_key = None - - if existing_api_key: - display_key = f"{existing_api_key[:3]}****{existing_api_key[-4:]}" - api_key_panel = Panel( - Text( - f"πŸ”‘ I found a CODEFLASH_API_KEY in your environment [{display_key}]!\n\n" - "βœ… You're all set with API authentication!", - style="green", - justify="center", - ), - title="πŸ”‘ API Key Found", - border_style="bright_green", - ) - console.print(api_key_panel) - console.print() - return False - - # Prompt for authentication method - auth_choices = ["πŸ” Login in with Codeflash", "πŸ”‘ Use Codeflash API key"] + prompt_github_app_install(owner, repo) - result = prompts.select("How would you like to authenticate?", choices=auth_choices, default=auth_choices[0]) - if result.command is None: - apologize_and_exit() + # Verify installation with retries + max_retries = 2 + for attempt in range(max_retries + 1): + if is_github_app_installed_on_repo(owner, repo, suppress_errors=True): + console.print(f"βœ… GitHub App installed successfully for {owner}/{repo}!") + break - method = result.value + if attempt == max_retries: + console.print( + f"❌ GitHub App not detected on {owner}/{repo}.\n" + f"You won't be able to create PRs until you install it.\n" + f"Use the '--no-pr' flag for local-only optimizations." + ) + break - if method == auth_choices[1]: - enter_api_key_and_save_to_rc() - ph("cli-new-api-key-entered") - return True + console.print( + f"❌ GitHub App not detected on {owner}/{repo}.\nPress Enter to check again after installation..." + ) + console.input() + except (KeyboardInterrupt, EOFError): + console.print() # Clean line for next prompt - # Perform OAuth sign-in - api_key = perform_oauth_signin() - if not api_key: - apologize_and_exit() - - # Save API key +def save_api_key_and_set_env(api_key: str) -> None: + """Save API key to shell RC file and set environment variable.""" shell_rc_path = get_shell_rc_path() if not shell_rc_path.exists() and os.name == "nt": + shell_rc_path.parent.mkdir(parents=True, exist_ok=True) shell_rc_path.touch() console.print(f"βœ… Created {shell_rc_path}") result = save_api_key_to_rc(api_key) if is_successful(result): console.print(result.unwrap()) - console.print("βœ… Signed in successfully and API key saved!") else: console.print(result.failure()) console.input("Press Enter to continue...") os.environ["CODEFLASH_API_KEY"] = api_key - ph("cli-oauth-signin-completed") - return True def enter_api_key_and_save_to_rc() -> None: + """Prompt for API key with validation and save to shell RC file.""" browser_launched = False api_key = "" + while api_key == "": result = prompts.text( - f"Enter your Codeflash API key{' [or press Enter to open your API key page]' if not browser_launched else ''}" + f"Enter your Codeflash API key{' [or press Enter to open your API key page]' if not browser_launched else ''}", + validators=APIKeyValidator(), ) if result.command is None: apologize_and_exit() return + api_key = result.value.strip() - - if api_key: - # Validate API key format - if not api_key.startswith("cf-"): - console.print(f"❌ That key [{api_key}] seems to be invalid. It should start with a 'cf-' prefix. Please try again.") - api_key = "" # Reset to retry - continue - break - - if not browser_launched: + + # If empty, open browser and try again + if not api_key and not browser_launched: console.print( f"Opening your Codeflash API key page. Grab a key from there!{LF}" "You can also open this link manually: https://app.codeflash.ai/app/apikeys" ) webbrowser.open("https://app.codeflash.ai/app/apikeys") browser_launched = True # This does not work on remote consoles - shell_rc_path = get_shell_rc_path() - if not shell_rc_path.exists() and os.name == "nt": - # On Windows, create the appropriate file (PowerShell .ps1 or CMD .bat) in the user's home directory - shell_rc_path.parent.mkdir(parents=True, exist_ok=True) - shell_rc_path.touch() - console.print(f"βœ… Created {shell_rc_path}") get_user_id(api_key=api_key) # Used to verify whether the API key is valid. - result = save_api_key_to_rc(api_key) - if is_successful(result): - console.print(result.unwrap()) - else: - console.print(result.failure()) - console.input("Press Enter to continue...") - - os.environ["CODEFLASH_API_KEY"] = api_key + save_api_key_and_set_env(api_key) -def create_find_common_tags_file(args: Namespace, file_name: str) -> Path: - find_common_tags_content = """from __future__ import annotations +find_common_tags_content = """from __future__ import annotations def find_common_tags(articles: list[dict[str, list[str]]]) -> set[str]: @@ -1131,15 +971,15 @@ def find_common_tags(articles: list[dict[str, list[str]]]) -> set[str]: return set(common_tags) """ + +def create_find_common_tags_file(args: Namespace, file_name: str) -> Path: file_path = Path(args.module_root) / file_name lsp_enabled = is_LSP_enabled() if file_path.exists() and not lsp_enabled: - from rich.prompt import Confirm - - overwrite = Confirm.ask( - f"πŸ€” {file_path} already exists. Do you want to overwrite it?", default=True, show_default=False + answer = prompts.select_or_exit( + f"πŸ€” {file_path} already exists. Do you want to overwrite it?", choices=["Yes", "No"], default="Yes" ) - if not overwrite: + if answer == "No": apologize_and_exit() console.rule() @@ -1149,8 +989,7 @@ def find_common_tags(articles: list[dict[str, list[str]]]) -> set[str]: return file_path -def create_bubble_sort_file_and_test(args: Namespace) -> tuple[str, str]: - bubble_sort_content = """from typing import Union, List +bubble_sort_content = """from typing import Union, List def sorter(arr: Union[List[int],List[float]]) -> Union[List[int],List[float]]: for i in range(len(arr)): for j in range(len(arr) - 1): @@ -1160,6 +999,9 @@ def sorter(arr: Union[List[int],List[float]]) -> Union[List[int],List[float]]: arr[j + 1] = temp return arr """ + + +def create_bubble_sort_file_and_test(args: Namespace) -> tuple[str, str]: # Always use pytest for tests bubble_sort_test_content = f"""from {Path(args.module_root).name}.bubble_sort import sorter @@ -1179,12 +1021,10 @@ def test_sort(): bubble_sort_path = Path(args.module_root) / "bubble_sort.py" if bubble_sort_path.exists(): - from rich.prompt import Confirm - - overwrite = Confirm.ask( - f"πŸ€” {bubble_sort_path} already exists. Do you want to overwrite it?", default=True, show_default=False + answer = prompts.select_or_exit( + f"πŸ€” {bubble_sort_path} already exists. Do you want to overwrite it?", choices=["Yes", "No"], default="Yes" ) - if not overwrite: + if answer == "No": apologize_and_exit() console.rule() @@ -1242,14 +1082,3 @@ def run_end_to_end_test(args: Namespace, find_common_tags_path: Path) -> None: logger.info("🧹 Cleaning up…") find_common_tags_path.unlink(missing_ok=True) logger.info(f"πŸ—‘οΈ Deleted {find_common_tags_path}") - - -def ask_for_telemetry() -> bool: - """Prompt the user to enable or disable telemetry.""" - from rich.prompt import Confirm - - return Confirm.ask( - "⚑️ Help us improve Codeflash by sharing anonymous usage data (e.g. errors encountered)?", - default=True, - show_default=True, - ) diff --git a/codeflash/cli_cmds/themed_prompts.py b/codeflash/cli_cmds/themed_prompts.py index 9af2090df..8c42a2a64 100644 --- a/codeflash/cli_cmds/themed_prompts.py +++ b/codeflash/cli_cmds/themed_prompts.py @@ -5,11 +5,16 @@ from inquirer_textual.InquirerApp import InquirerApp from inquirer_textual.widgets.InquirerCheckbox import InquirerCheckbox from inquirer_textual.widgets.InquirerConfirm import InquirerConfirm +from inquirer_textual.widgets.InquirerMulti import InquirerMulti from inquirer_textual.widgets.InquirerSelect import InquirerSelect from inquirer_textual.widgets.InquirerText import InquirerText if TYPE_CHECKING: + from collections.abc import Iterable + from inquirer_textual.common.Choice import Choice + from inquirer_textual.widgets.InquirerWidget import InquirerWidget + from textual.validation import Validator class CodeflashThemedApp(InquirerApp): @@ -52,6 +57,13 @@ class CodeflashThemedApp(InquirerApp): Input:focus { border: solid $accent; } + InquirerHeader { + margin-bottom: 1; + } + InquirerHeader Static { + text-align: center; + color: #38bdf8; + } """ def get_theme_variable_defaults(self) -> dict[str, str]: @@ -66,29 +78,106 @@ def get_theme_variable_defaults(self) -> dict[str, str]: } +def create_app( + widget: InquirerWidget, header: str | list[str] | None = None, *, show_footer: bool = False +) -> CodeflashThemedApp: + app: CodeflashThemedApp = CodeflashThemedApp() + app.widget = widget + app.header = header + app.show_footer = show_footer + return app + + def select( # noqa: ANN201 - message: str, choices: list[str | Choice], default: str | Choice | None = None + message: str, + choices: list[str | Choice], + default: str | Choice | None = None, + header: str | list[str] | None = None, ): # type: ignore[no-untyped-def] widget = InquirerSelect(message, choices, default, mandatory=True) - app: CodeflashThemedApp = CodeflashThemedApp(widget, shortcuts=None, show_footer=False) + app = create_app(widget, header=header) return app.run(inline=True) -def confirm(message: str, *, default: bool = False): # noqa: ANN201 # type: ignore[no-untyped-def] +def confirm(message: str, *, default: bool = False, header: str | list[str] | None = None): # noqa: ANN201 # type: ignore[no-untyped-def] widget = InquirerConfirm(message, default=default, mandatory=True) - app: CodeflashThemedApp = CodeflashThemedApp(widget, shortcuts=None, show_footer=False) + app = create_app(widget, header=header) return app.run(inline=True) -def text(message: str): # noqa: ANN201 # type: ignore[no-untyped-def] - widget = InquirerText(message) - app: CodeflashThemedApp = CodeflashThemedApp(widget, shortcuts=None, show_footer=False) +def text( # noqa: ANN201 # type: ignore[no-untyped-def] + message: str, + validators: Validator | Iterable[Validator] | None = None, + header: str | list[str] | None = None, +): + widget = InquirerText(message, validators=validators) + app = create_app(widget, header=header) return app.run(inline=True) def checkbox( # noqa: ANN201 - message: str, choices: list[str | Choice], enabled: list[str | Choice] | None = None + message: str, + choices: list[str | Choice], + enabled: list[str | Choice] | None = None, + header: str | list[str] | None = None, ): # type: ignore[no-untyped-def] widget = InquirerCheckbox(message, choices, enabled) - app: CodeflashThemedApp = CodeflashThemedApp(widget, shortcuts=None, show_footer=False) + app = create_app(widget, header=header) return app.run(inline=True) + + +def multi(widgets: list[InquirerWidget], header: str | list[str] | None = None): # noqa: ANN201 # type: ignore[no-untyped-def] + multi_widget = InquirerMulti(widgets) + app = create_app(multi_widget, header=header) + return app.run(inline=True) + + +def select_or_exit( # noqa: ANN201 + message: str, + choices: list[str | Choice], + default: str | Choice | None = None, + exit_callback=None, # noqa: ANN001 + header: str | list[str] | None = None, +): # type: ignore[no-untyped-def] + """Select with automatic exit on cancellation.""" + result = select(message, choices, default, header=header) + if result.command is None: + if exit_callback: + exit_callback() + else: + from codeflash.cli_cmds.cli_common import apologize_and_exit + + apologize_and_exit() + return result.value + + +def text_or_exit( # noqa: ANN201 # type: ignore[no-untyped-def] + message: str, + validators=None, # noqa: ANN001 + exit_callback=None, # noqa: ANN001 + header: str | list[str] | None = None, +): + """Text input with automatic exit on cancellation.""" + result = text(message, validators, header=header) + if result.command is None: + if exit_callback: + exit_callback() + else: + from codeflash.cli_cmds.cli_common import apologize_and_exit + + apologize_and_exit() + return result.value + + +def checkbox_or_default( # noqa: ANN201 + message: str, + choices: list[str | Choice], + enabled: list[str | Choice] | None = None, + default_on_cancel=None, # noqa: ANN001 + header: str | list[str] | None = None, +): # type: ignore[no-untyped-def] + """Checkbox with default value on cancellation.""" + result = checkbox(message, choices, enabled, header=header) + if result.command is None: + return default_on_cancel if default_on_cancel is not None else [] + return result.value diff --git a/codeflash/cli_cmds/validators.py b/codeflash/cli_cmds/validators.py new file mode 100644 index 000000000..e1673bca9 --- /dev/null +++ b/codeflash/cli_cmds/validators.py @@ -0,0 +1,203 @@ +from __future__ import annotations + +from pathlib import Path +from typing import TYPE_CHECKING + +from textual.validation import Validator + +from codeflash.code_utils.code_utils import validate_relative_directory_path + +if TYPE_CHECKING: + from textual.validation import ValidationResult + + +class PathExistsValidator(Validator): + def __init__(self, failure_description: str | None = None) -> None: + super().__init__(failure_description=failure_description or "Path must exist and be a directory") + + def validate(self, value: str) -> ValidationResult: + if not value: + return self.failure("Path cannot be empty") + + path = Path(value) + if not path.exists(): + return self.failure(f"Path does not exist: {value}") + + if not path.is_dir(): + return self.failure(f"Path is not a directory: {value}") + + return self.success() + + +class RelativePathValidator(Validator): + def __init__(self, failure_description: str | None = None) -> None: + super().__init__(failure_description=failure_description or "Must be a valid relative directory path") + + def validate(self, value: str) -> ValidationResult: + if not value: + return self.failure("Path cannot be empty") + + is_valid, error_msg = validate_relative_directory_path(value) + if not is_valid: + return self.failure(error_msg) + + return self.success() + + +class APIKeyValidator(Validator): + def __init__(self, failure_description: str | None = None) -> None: + super().__init__( + failure_description=failure_description or "API key must start with 'cf-' prefix. Please try again." + ) + + def validate(self, value: str) -> ValidationResult: + # Allow empty for "press enter to open browser" flow + if not value: + return self.success() + + if not value.startswith("cf-"): + return self.failure(f"That key [{value}] seems to be invalid. It should start with a 'cf-' prefix.") + + return self.success() + + +class NotEqualPathValidator(Validator): + """Validator to ensure a path is not equal to another path.""" + + def __init__(self, exclude_path: Path | str, failure_description: str | None = None) -> None: + self.exclude_path = Path(exclude_path).resolve() + super().__init__( + failure_description=failure_description + or f"Path cannot be the same as {exclude_path}. Please choose a different directory." + ) + + def validate(self, value: str) -> ValidationResult: + if not value: + return self.success() + + try: + input_path = (Path.cwd() / Path(value)).resolve() + if input_path == self.exclude_path: + return self.failure( + f"Tests root cannot be the same as module root ({self.exclude_path}). " + "This can lead to unexpected behavior." + ) + except Exception: # noqa: S110 + # If path resolution fails, let other validators handle it + pass + + return self.success() + + +class DirectoryOrCreatableValidator(Validator): + """Validator that accepts existing directories or creates them if they don't exist.""" + + def __init__(self, create_if_missing: bool = True, failure_description: str | None = None) -> None: + self.create_if_missing = create_if_missing + super().__init__( + failure_description=failure_description or "Must be a valid directory path or creatable location" + ) + + def validate(self, value: str) -> ValidationResult: + if not value: + return self.failure("Path cannot be empty") + + path = Path(value) + + # Check if it exists and is a directory + if path.exists(): + if path.is_dir(): + return self.success() + return self.failure(f"Path exists but is not a directory: {value}") + + # Path doesn't exist - check if parent exists and is writable + if not self.create_if_missing: + return self.failure(f"Directory does not exist: {value}") + + parent = path.parent + if not parent.exists(): + return self.failure(f"Parent directory does not exist: {parent}") + + if not parent.is_dir(): + return self.failure(f"Parent path is not a directory: {parent}") + + # Check if we can write to parent (would be able to create directory) + import os + + if not os.access(parent, os.W_OK): + return self.failure(f"Cannot create directory - parent is not writable: {parent}") + + return self.success() + + +class TomlFileValidator(Validator): + """Validator to ensure path is a valid .toml file.""" + + def __init__(self, failure_description: str | None = None) -> None: + super().__init__(failure_description=failure_description or "Must be a valid .toml file") + + def validate(self, value: str) -> ValidationResult: + if not value: + return self.failure("Path cannot be empty") + + path = Path(value) + + if not path.exists(): + return self.failure(f"Configuration file not found: {value}") + + if not path.is_file(): + return self.failure(f"Configuration file is not a file: {value}") + + if path.suffix != ".toml": + return self.failure(f"Configuration file is not a .toml file: {value}") + + return self.success() + + +class PyprojectTomlValidator(Validator): + """Validator for pyproject.toml with codeflash configuration.""" + + def __init__(self, failure_description: str | None = None) -> None: + super().__init__(failure_description=failure_description or "Invalid pyproject.toml configuration") + + def validate(self, value: str) -> ValidationResult: + if not value: + return self.failure("Path cannot be empty") + + path = Path(value) + + # First check if it's a valid toml file + if not path.exists(): + return self.failure(f"Configuration file not found: {value}") + + if not path.is_file(): + return self.failure(f"Path is not a file: {value}") + + if path.suffix != ".toml": + return self.failure(f"File is not a .toml file: {value}") + + # Parse and validate codeflash configuration + try: + from codeflash.code_utils.config_parser import parse_config_file + + config, _ = parse_config_file(path) + except Exception as e: + return self.failure(f"Failed to parse configuration: {e}") + + # Validate module_root + module_root = config.get("module_root") + if not module_root: + return self.failure("Missing required field: 'module_root'") + + if not Path(module_root).is_dir(): + return self.failure(f"Invalid 'module_root': directory does not exist at {module_root}") + + # Validate tests_root + tests_root = config.get("tests_root") + if not tests_root: + return self.failure("Missing required field: 'tests_root'") + + if not Path(tests_root).is_dir(): + return self.failure(f"Invalid 'tests_root': directory does not exist at {tests_root}") + + return self.success() diff --git a/uv.lock b/uv.lock index c3a4f42fb..a5ab23a9d 100644 --- a/uv.lock +++ b/uv.lock @@ -374,7 +374,7 @@ dependencies = [ { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, { name = "platformdirs", version = "4.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "posthog", version = "6.9.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "posthog", version = "7.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "posthog", version = "7.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, { name = "pydantic" }, { name = "pygls" }, { name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, @@ -854,7 +854,7 @@ name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ @@ -999,14 +999,14 @@ wheels = [ [[package]] name = "importlib-metadata" -version = "8.7.0" +version = "8.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "zipp" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, + { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, ] [[package]] @@ -2712,7 +2712,7 @@ wheels = [ [[package]] name = "posthog" -version = "7.4.0" +version = "7.4.1" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.14'", @@ -2729,9 +2729,9 @@ dependencies = [ { name = "six", marker = "python_full_version >= '3.10'" }, { name = "typing-extensions", marker = "python_full_version >= '3.10'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/14/e5/5262d1604a3eb19b23d4e896bce87b4603fd39ec366a96b27e19e3299aef/posthog-7.4.0.tar.gz", hash = "sha256:1fb97b11960e24fcf0b80f0a6450b2311478e5a3ee6ea3c6f9284ff89060a876", size = 143780, upload-time = "2025-12-16T23:42:05.829Z" } +sdist = { url = "https://files.pythonhosted.org/packages/29/4b/2f6033b611071fb15131afdda2ef71bfac3d043814d68dd166d38e8a0c91/posthog-7.4.1.tar.gz", hash = "sha256:629ac6a93f13add1854fda27a7d6fa7cefc3083cb6cd4965c49d26b33edc9c83", size = 144100, upload-time = "2025-12-21T21:18:00.178Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/8b/13066693d7a6f94fb5da3407417bbbc3f6aa8487051294d0ef766c1567fa/posthog-7.4.0-py3-none-any.whl", hash = "sha256:f9d4e32c1c0f2110256b1aae7046ed90af312c1dbb1eecc6a9cb427733b22970", size = 166079, upload-time = "2025-12-16T23:42:04.33Z" }, + { url = "https://files.pythonhosted.org/packages/d9/3e/28405bcf7a54d5d9e93b8d25aa70f929d8f43402ed269c701aa436fede14/posthog-7.4.1-py3-none-any.whl", hash = "sha256:cbb13df2041e7f44bf41ee67c8ecfb3f7408652a90750a1cffab87f4a879120b", size = 166458, upload-time = "2025-12-21T21:17:58.807Z" }, ] [[package]] From 72ede6da68f611994a5a0ec2b06290ad1e72bd85 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Mon, 22 Dec 2025 02:23:53 -0500 Subject: [PATCH 10/12] deduplication --- codeflash/cli_cmds/cli.py | 20 +++--- codeflash/cli_cmds/cli_common.py | 49 +++++++++++++ codeflash/cli_cmds/cmd_init.py | 102 ++++----------------------- codeflash/code_utils/github_utils.py | 70 +++++++++++++++++- 4 files changed, 139 insertions(+), 102 deletions(-) diff --git a/codeflash/cli_cmds/cli.py b/codeflash/cli_cmds/cli.py index a6e28aaaa..0dabebd61 100644 --- a/codeflash/cli_cmds/cli.py +++ b/codeflash/cli_cmds/cli.py @@ -4,13 +4,12 @@ from pathlib import Path from codeflash.cli_cmds import logging_config -from codeflash.cli_cmds.cli_common import apologize_and_exit +from codeflash.cli_cmds.cli_common import apologize_and_exit, get_git_repo_or_none, parse_config_file_or_exit from codeflash.cli_cmds.cmd_init import init_codeflash, install_github_actions from codeflash.cli_cmds.console import logger from codeflash.cli_cmds.extension import install_vscode_extension from codeflash.code_utils import env_utils from codeflash.code_utils.code_utils import exit_with_message -from codeflash.code_utils.config_parser import parse_config_file from codeflash.lsp.helpers import is_LSP_enabled from codeflash.version import __version__ as version @@ -163,10 +162,7 @@ def process_and_validate_cmd_args(args: Namespace) -> Namespace: def process_pyproject_config(args: Namespace) -> Namespace: - try: - pyproject_config, pyproject_file_path = parse_config_file(args.config_file) - except ValueError as e: - exit_with_message(f"Error parsing config file: {e}", error_on_exit=True) + pyproject_config, pyproject_file_path = parse_config_file_or_exit(args.config_file) supported_keys = [ "module_root", "tests_root", @@ -248,21 +244,21 @@ def handle_optimize_all_arg_parsing(args: Namespace) -> Namespace: no_pr = getattr(args, "no_pr", False) if not no_pr: - import git - from codeflash.code_utils.git_utils import check_and_push_branch, get_repo_owner_and_name from codeflash.code_utils.github_utils import require_github_app_or_exit # Ensure that the user can actually open PRs on the repo. - try: - git_repo = git.Repo(search_parent_directories=True) - except git.exc.InvalidGitRepositoryError: + maybe_git_repo = get_git_repo_or_none() + if maybe_git_repo is None: mode = "--all" if hasattr(args, "all") else "--file" - logger.exception( + logger.error( f"I couldn't find a git repository in the current directory. " f"I need a git repository to run {mode} and open PRs for optimizations. Exiting..." ) apologize_and_exit() + # After None check and apologize_and_exit(), we know git_repo is not None + git_repo = maybe_git_repo + assert git_repo is not None # For mypy git_remote = getattr(args, "git_remote", None) if not check_and_push_branch(git_repo, git_remote=git_remote): exit_with_message("Branch is not pushed...", error_on_exit=True) diff --git a/codeflash/cli_cmds/cli_common.py b/codeflash/cli_cmds/cli_common.py index 845593fae..dd915a464 100644 --- a/codeflash/cli_cmds/cli_common.py +++ b/codeflash/cli_cmds/cli_common.py @@ -1,9 +1,15 @@ from __future__ import annotations import sys +from typing import TYPE_CHECKING, Any, Optional from codeflash.cli_cmds.console import console, logger +if TYPE_CHECKING: + from pathlib import Path + + from git import Repo + def apologize_and_exit() -> None: console.rule() @@ -13,3 +19,46 @@ def apologize_and_exit() -> None: console.rule() logger.info("πŸ‘‹ Exiting...") sys.exit(1) + + +def get_git_repo_or_none(search_path: Optional[Path] = None) -> Optional[Repo]: + """Get git repository or None if not in a git repo.""" + import git + + try: + if search_path: + return git.Repo(search_path, search_parent_directories=True) + return git.Repo(search_parent_directories=True) + except git.InvalidGitRepositoryError: + return None + + +def require_git_repo_or_exit(search_path: Optional[Path] = None, error_message: Optional[str] = None) -> Repo: + """Get git repository or exit with error.""" + repo = get_git_repo_or_none(search_path) + if repo is None: + if error_message: + logger.error(error_message) + else: + logger.error( + "I couldn't find a git repository in the current directory. " + "A git repository is required for this operation." + ) + apologize_and_exit() + # After checking for None and calling apologize_and_exit(), we know repo is not None + # but mypy doesn't understand apologize_and_exit() never returns, so we assert + assert repo is not None + return repo + + +def parse_config_file_or_exit(config_file: Optional[Path] = None, **kwargs: Any) -> tuple[dict[str, Any], Path]: + """Parse config file or exit with error.""" + from codeflash.code_utils.code_utils import exit_with_message + from codeflash.code_utils.config_parser import parse_config_file + + try: + return parse_config_file(config_file, **kwargs) + except ValueError as e: + exit_with_message(f"Error parsing config file: {e}", error_on_exit=True) + # exit_with_message never returns when error_on_exit=True, but mypy doesn't know that + raise # pragma: no cover diff --git a/codeflash/cli_cmds/cmd_init.py b/codeflash/cli_cmds/cmd_init.py index fc66b9912..89a84100d 100644 --- a/codeflash/cli_cmds/cmd_init.py +++ b/codeflash/cli_cmds/cmd_init.py @@ -10,17 +10,15 @@ from pathlib import Path from typing import TYPE_CHECKING, Any, Optional, Union, cast -import git import tomlkit -from git import InvalidGitRepositoryError, Repo from inquirer_textual.common.Choice import Choice from inquirer_textual.widgets.InquirerConfirm import InquirerConfirm from inquirer_textual.widgets.InquirerSelect import InquirerSelect from pydantic.dataclasses import dataclass -from codeflash.api.cfapi import get_user_id, is_github_app_installed_on_repo +from codeflash.api.cfapi import get_user_id from codeflash.cli_cmds import themed_prompts as prompts -from codeflash.cli_cmds.cli_common import apologize_and_exit +from codeflash.cli_cmds.cli_common import apologize_and_exit, get_git_repo_or_none from codeflash.cli_cmds.console import console, logger from codeflash.cli_cmds.extension import install_vscode_extension from codeflash.cli_cmds.validators import ( @@ -34,8 +32,8 @@ from codeflash.code_utils.compat import LF from codeflash.code_utils.config_parser import parse_config_file from codeflash.code_utils.env_utils import check_formatter_installed, get_codeflash_api_key -from codeflash.code_utils.git_utils import get_git_remotes, get_repo_owner_and_name -from codeflash.code_utils.github_utils import get_github_secrets_page_url +from codeflash.code_utils.git_utils import get_git_remotes +from codeflash.code_utils.github_utils import get_github_secrets_page_url, install_github_app from codeflash.code_utils.oauth_handler import perform_oauth_signin from codeflash.code_utils.shell_utils import get_shell_rc_path, is_powershell, save_api_key_to_rc from codeflash.either import is_successful @@ -236,11 +234,8 @@ def init_codeflash() -> None: project_name = check_for_toml_or_setup_file() - try: - repo = Repo(curdir, search_parent_directories=True) - git_remotes = get_git_remotes(repo) - except InvalidGitRepositoryError: - git_remotes = [] + repo = get_git_repo_or_none(curdir) + git_remotes = get_git_remotes(repo) if repo is not None else [] answers = collect_config(curdir, auth_status, project_name, git_remotes) git_remote = answers.git_remote @@ -257,11 +252,8 @@ def init_codeflash() -> None: if not configure_pyproject_toml(setup_info): apologize_and_exit() - try: - git.Repo(search_parent_directories=True) - in_git_repo = True - except git.InvalidGitRepositoryError: - in_git_repo = False + maybe_git_repo = get_git_repo_or_none() + in_git_repo = maybe_git_repo is not None integration_options = [Choice("πŸ“¦ VSCode Extension", data="vscode")] if in_git_repo: @@ -283,7 +275,8 @@ def init_codeflash() -> None: ) for choice in selected: if choice.data == "github_app": - install_github_app(git_remote) + if maybe_git_repo is not None: + install_github_app(maybe_git_repo, git_remote) elif choice.data == "github_actions": install_github_actions(override_formatter_check=True) elif choice.data == "vscode": @@ -541,9 +534,8 @@ def install_github_actions(override_formatter_check: bool = False) -> None: # n config, _config_file_path = parse_config_file(override_formatter_check=override_formatter_check) ph("cli-github-actions-install-started") - try: - repo = Repo(config["module_root"], search_parent_directories=True) - except git.InvalidGitRepositoryError: + repo = get_git_repo_or_none(Path(config["module_root"])) + if repo is None: console.print( "Skipping GitHub action installation for continuous optimization because you're not in a git repository." ) @@ -846,74 +838,8 @@ def configure_pyproject_toml( return True -def prompt_github_app_install(owner: str, repo: str) -> None: - """Prompt user to install GitHub app and wait for confirmation.""" - app_url = "https://github.com/apps/codeflash-ai/installations/select_target" - - open_page = prompts.select_or_exit( - f"Open GitHub App installation page? ({app_url})", - choices=["Yes", "No"], - default="Yes", - header=( - f"πŸ™ GitHub App Installation\n\n" - f"You'll need to install the Codeflash GitHub app for {owner}/{repo}.\n\n" - "I'll open the installation page where you can select your repository." - ), - ) - if open_page == "Yes": - webbrowser.open(app_url) - - prompts.confirm("Continue once you've completed the installation?", default=True) - - -def install_github_app(git_remote: str) -> None: - try: - git_repo = git.Repo(search_parent_directories=True) - except git.InvalidGitRepositoryError: - console.print("Skipping GitHub app installation because you're not in a git repository.") - return - - if git_remote not in get_git_remotes(git_repo): - console.print(f"Skipping GitHub app installation, remote ({git_remote}) does not exist in this repository.") - return - - owner, repo = get_repo_owner_and_name(git_repo, git_remote) - - if is_github_app_installed_on_repo(owner, repo, suppress_errors=True): - console.print( - f"πŸ™ Looks like you've already installed the Codeflash GitHub app on this repository ({owner}/{repo})! Continuing…" - ) - return - - # Not installed - prompt for installation - try: - prompt_github_app_install(owner, repo) - - # Verify installation with retries - max_retries = 2 - for attempt in range(max_retries + 1): - if is_github_app_installed_on_repo(owner, repo, suppress_errors=True): - console.print(f"βœ… GitHub App installed successfully for {owner}/{repo}!") - break - - if attempt == max_retries: - console.print( - f"❌ GitHub App not detected on {owner}/{repo}.\n" - f"You won't be able to create PRs until you install it.\n" - f"Use the '--no-pr' flag for local-only optimizations." - ) - break - - console.print( - f"❌ GitHub App not detected on {owner}/{repo}.\nPress Enter to check again after installation..." - ) - console.input() - except (KeyboardInterrupt, EOFError): - console.print() # Clean line for next prompt - - def save_api_key_and_set_env(api_key: str) -> None: - """Save API key to shell RC file and set environment variable.""" + """Save API key to shell RC and set env var.""" shell_rc_path = get_shell_rc_path() if not shell_rc_path.exists() and os.name == "nt": shell_rc_path.parent.mkdir(parents=True, exist_ok=True) @@ -931,7 +857,7 @@ def save_api_key_and_set_env(api_key: str) -> None: def enter_api_key_and_save_to_rc() -> None: - """Prompt for API key with validation and save to shell RC file.""" + """Prompt for API key and save to shell RC.""" browser_launched = False api_key = "" diff --git a/codeflash/code_utils/github_utils.py b/codeflash/code_utils/github_utils.py index c29dd5cca..4e40040c6 100644 --- a/codeflash/code_utils/github_utils.py +++ b/codeflash/code_utils/github_utils.py @@ -1,14 +1,16 @@ from __future__ import annotations +import webbrowser from typing import TYPE_CHECKING, Optional from codeflash.api.cfapi import is_github_app_installed_on_repo from codeflash.cli_cmds.cli_common import apologize_and_exit -from codeflash.cli_cmds.console import paneled_text +from codeflash.cli_cmds.console import console, paneled_text from codeflash.code_utils.compat import LF -from codeflash.code_utils.git_utils import get_repo_owner_and_name +from codeflash.code_utils.git_utils import get_git_remotes, get_repo_owner_and_name if TYPE_CHECKING: + import git from git import Repo @@ -38,3 +40,67 @@ def require_github_app_or_exit(owner: str, repo: str) -> None: def github_pr_url(owner: str, repo: str, pr_number: str) -> str: return f"https://github.com/{owner}/{repo}/pull/{pr_number}" + + +def prompt_github_app_install(owner: str, repo: str) -> None: + """Prompt user to install GitHub app.""" + # Avoid circular import + from codeflash.cli_cmds import themed_prompts as prompts + + app_url = "https://github.com/apps/codeflash-ai/installations/select_target" + + open_page = prompts.select_or_exit( + f"Open GitHub App installation page? ({app_url})", + choices=["Yes", "No"], + default="Yes", + header=( + f"πŸ™ GitHub App Installation\n\n" + f"You'll need to install the Codeflash GitHub app for {owner}/{repo}.\n\n" + "I'll open the installation page where you can select your repository." + ), + ) + if open_page == "Yes": + webbrowser.open(app_url) + + prompts.confirm("Continue once you've completed the installation?", default=True) + + +def install_github_app(git_repo: git.Repo, git_remote: str = "origin") -> None: + """Install GitHub app with user prompts and verification.""" + if git_remote not in get_git_remotes(git_repo): + console.print(f"Skipping GitHub app installation, remote ({git_remote}) does not exist in this repository.") + return + + owner, repo = get_repo_owner_and_name(git_repo, git_remote) + + if is_github_app_installed_on_repo(owner, repo, suppress_errors=True): + console.print( + f"πŸ™ Looks like you've already installed the Codeflash GitHub app on this repository ({owner}/{repo})! Continuing…" + ) + return + + # Not installed - prompt for installation + try: + prompt_github_app_install(owner, repo) + + # Verify installation with retries + max_retries = 2 + for attempt in range(max_retries + 1): + if is_github_app_installed_on_repo(owner, repo, suppress_errors=True): + console.print(f"βœ… GitHub App installed successfully for {owner}/{repo}!") + break + + if attempt == max_retries: + console.print( + f"❌ GitHub App not detected on {owner}/{repo}.\n" + f"You won't be able to create PRs until you install it.\n" + f"Use the '--no-pr' flag for local-only optimizations." + ) + break + + console.print( + f"❌ GitHub App not detected on {owner}/{repo}.\nPress Enter to check again after installation..." + ) + console.input() + except (KeyboardInterrupt, EOFError): + console.print() # Clean line for next prompt From ef15f71f4128326e94181fd4a07f698c544ca4e6 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Mon, 22 Dec 2025 02:33:19 -0500 Subject: [PATCH 11/12] update test suite --- tests/test_cmd_init.py | 45 +++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/tests/test_cmd_init.py b/tests/test_cmd_init.py index ee456783b..24d53a6ab 100644 --- a/tests/test_cmd_init.py +++ b/tests/test_cmd_init.py @@ -10,8 +10,8 @@ configure_pyproject_toml, get_formatter_cmds, get_valid_subdirs, - is_valid_pyproject_toml, ) +from codeflash.cli_cmds.validators import PyprojectTomlValidator @pytest.fixture @@ -27,28 +27,28 @@ def test_is_valid_pyproject_toml_with_empty_config(temp_dir: Path) -> None: """ ) f.flush() - valid, _, _message = is_valid_pyproject_toml(temp_dir / "pyproject.toml") - assert not valid - assert _message == "Missing required field: 'module_root'" + validator = PyprojectTomlValidator() + result = validator.validate(str(temp_dir / "pyproject.toml")) + assert not result.is_valid + assert "Missing required field: 'module_root'" in result.failure_descriptions[0] def test_is_valid_pyproject_toml_with_incorrect_module_root(temp_dir: Path) -> None: with (temp_dir / "pyproject.toml").open(mode="w") as f: - wrong_module_root = temp_dir / "invalid_directory" f.write( """[tool.codeflash] module-root = "invalid_directory" """ ) f.flush() - valid, config, _message = is_valid_pyproject_toml(temp_dir / "pyproject.toml") - assert not valid - assert _message == f"Invalid 'module_root': directory does not exist at {wrong_module_root}" + validator = PyprojectTomlValidator() + result = validator.validate(str(temp_dir / "pyproject.toml")) + assert not result.is_valid + assert "Invalid 'module_root'" in result.failure_descriptions[0] def test_is_valid_pyproject_toml_with_incorrect_tests_root(temp_dir: Path) -> None: with (temp_dir / "pyproject.toml").open(mode="w") as f: - wrong_tests_root = temp_dir / "incorrect_tests_root" f.write( """[tool.codeflash] module-root = "." @@ -56,9 +56,10 @@ def test_is_valid_pyproject_toml_with_incorrect_tests_root(temp_dir: Path) -> No """ ) f.flush() - valid, config, _message = is_valid_pyproject_toml(temp_dir / "pyproject.toml") - assert not valid - assert _message == f"Invalid 'tests_root': directory does not exist at {wrong_tests_root}" + validator = PyprojectTomlValidator() + result = validator.validate(str(temp_dir / "pyproject.toml")) + assert not result.is_valid + assert "Invalid 'tests_root'" in result.failure_descriptions[0] def test_is_valid_pyproject_toml_with_valid_config(temp_dir: Path) -> None: @@ -71,8 +72,9 @@ def test_is_valid_pyproject_toml_with_valid_config(temp_dir: Path) -> None: """ ) f.flush() - valid, config, _message = is_valid_pyproject_toml(temp_dir / "pyproject.toml") - assert valid + validator = PyprojectTomlValidator() + result = validator.validate(str(temp_dir / "pyproject.toml")) + assert result.is_valid def test_get_formatter_cmd(temp_dir: Path) -> None: @@ -114,8 +116,9 @@ def test_configure_pyproject_toml_for_cli(temp_dir: Path) -> None: formatter-cmds = ["black $file"] """ ) - valid, _, _ = is_valid_pyproject_toml(pyproject_path) - assert valid + validator = PyprojectTomlValidator() + result = validator.validate(str(pyproject_path)) + assert result.is_valid def test_configure_pyproject_toml_for_vscode_with_empty_config(temp_dir: Path) -> None: @@ -139,8 +142,9 @@ def test_configure_pyproject_toml_for_vscode_with_empty_config(temp_dir: Path) - formatter-cmds = ["black $file"] """ ) - valid, _, _ = is_valid_pyproject_toml(pyproject_path) - assert valid + validator = PyprojectTomlValidator() + result = validator.validate(str(pyproject_path)) + assert result.is_valid def test_configure_pyproject_toml_for_vscode_with_existing_config(temp_dir: Path) -> None: @@ -171,8 +175,9 @@ def test_configure_pyproject_toml_for_vscode_with_existing_config(temp_dir: Path formatter-cmds = ["disabled"] """ ) - valid, _, _ = is_valid_pyproject_toml(pyproject_path) - assert valid + validator = PyprojectTomlValidator() + result = validator.validate(str(pyproject_path)) + assert result.is_valid def test_get_valid_subdirs(temp_dir: Path) -> None: From 87f04d66b4499e3d9ed1099a3c78305187157959 Mon Sep 17 00:00:00 2001 From: Kevin Turcios Date: Mon, 22 Dec 2025 02:36:49 -0500 Subject: [PATCH 12/12] pre-commit --- codeflash/cli_cmds/cli_common.py | 2 +- codeflash/cli_cmds/themed_prompts.py | 4 +--- codeflash/cli_cmds/validators.py | 6 +++--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/codeflash/cli_cmds/cli_common.py b/codeflash/cli_cmds/cli_common.py index dd915a464..1dc0cbb9a 100644 --- a/codeflash/cli_cmds/cli_common.py +++ b/codeflash/cli_cmds/cli_common.py @@ -51,7 +51,7 @@ def require_git_repo_or_exit(search_path: Optional[Path] = None, error_message: return repo -def parse_config_file_or_exit(config_file: Optional[Path] = None, **kwargs: Any) -> tuple[dict[str, Any], Path]: +def parse_config_file_or_exit(config_file: Optional[Path] = None, **kwargs: Any) -> tuple[dict[str, Any], Path]: # noqa: ANN401 """Parse config file or exit with error.""" from codeflash.code_utils.code_utils import exit_with_message from codeflash.code_utils.config_parser import parse_config_file diff --git a/codeflash/cli_cmds/themed_prompts.py b/codeflash/cli_cmds/themed_prompts.py index 8c42a2a64..8957d8116 100644 --- a/codeflash/cli_cmds/themed_prompts.py +++ b/codeflash/cli_cmds/themed_prompts.py @@ -106,9 +106,7 @@ def confirm(message: str, *, default: bool = False, header: str | list[str] | No def text( # noqa: ANN201 # type: ignore[no-untyped-def] - message: str, - validators: Validator | Iterable[Validator] | None = None, - header: str | list[str] | None = None, + message: str, validators: Validator | Iterable[Validator] | None = None, header: str | list[str] | None = None ): widget = InquirerText(message, validators=validators) app = create_app(widget, header=header) diff --git a/codeflash/cli_cmds/validators.py b/codeflash/cli_cmds/validators.py index e1673bca9..e81e8d678 100644 --- a/codeflash/cli_cmds/validators.py +++ b/codeflash/cli_cmds/validators.py @@ -92,13 +92,13 @@ def validate(self, value: str) -> ValidationResult: class DirectoryOrCreatableValidator(Validator): """Validator that accepts existing directories or creates them if they don't exist.""" - def __init__(self, create_if_missing: bool = True, failure_description: str | None = None) -> None: + def __init__(self, *, create_if_missing: bool = True, failure_description: str | None = None) -> None: self.create_if_missing = create_if_missing super().__init__( failure_description=failure_description or "Must be a valid directory path or creatable location" ) - def validate(self, value: str) -> ValidationResult: + def validate(self, value: str) -> ValidationResult: # noqa: PLR0911 if not value: return self.failure("Path cannot be empty") @@ -160,7 +160,7 @@ class PyprojectTomlValidator(Validator): def __init__(self, failure_description: str | None = None) -> None: super().__init__(failure_description=failure_description or "Invalid pyproject.toml configuration") - def validate(self, value: str) -> ValidationResult: + def validate(self, value: str) -> ValidationResult: # noqa: PLR0911 if not value: return self.failure("Path cannot be empty")