From 0ee9a1a403af027d6ebac64817eda8167d281dd7 Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 2 Apr 2025 18:09:33 -0400 Subject: [PATCH 01/19] goose config and test --- src/ai_migrate/manifest.py | 7 + src/ai_migrate/test_manifest.py | 16 +- uv.lock | 474 ++++++++++++++++---------------- 3 files changed, 258 insertions(+), 239 deletions(-) diff --git a/src/ai_migrate/manifest.py b/src/ai_migrate/manifest.py index 3a9a431..5782ec5 100644 --- a/src/ai_migrate/manifest.py +++ b/src/ai_migrate/manifest.py @@ -5,6 +5,7 @@ from pydantic import BaseModel, Field SYSTEM_PROMPT_FILE = "system_prompt.md" +GOOSE_PROMPT_FILE = "goose_prompt.md" VERIFY_SCRIPT_FILE = "verify.py" @@ -69,6 +70,11 @@ def to_file_group(self) -> FileGroup: base_name = self.dir.split("/")[-1] return FileGroup(files=files, result=self.result, base_name=base_name) +class GooseConfig(BaseModel): + system_prompt: str = f"{{project_dir}}/{GOOSE_PROMPT_FILE}" + time_out_minutes: int = 15 + max_retries: int = 3 + class Manifest(BaseModel): eval_target_repo_ref: str = "" @@ -80,3 +86,4 @@ class Manifest(BaseModel): verify_cmd: str = f"{{py}} {{project_dir}}/{VERIFY_SCRIPT_FILE}" pre_verify_cmd: str = f"{{py}} {{project_dir}}/{VERIFY_SCRIPT_FILE} --pre" time: datetime = Field(default_factory=datetime.now) + goose: GooseConfig = Field(default_factory=GooseConfig) \ No newline at end of file diff --git a/src/ai_migrate/test_manifest.py b/src/ai_migrate/test_manifest.py index 972db47..1da3726 100644 --- a/src/ai_migrate/test_manifest.py +++ b/src/ai_migrate/test_manifest.py @@ -22,7 +22,8 @@ def test_valid_manifest(): "system_prompt": "{project_dir}/system_prompt.md", "verify_cmd": "{py} {project_dir}/verify.py", "pre_verify_cmd": "{py} {project_dir}/verify.py --pre", - "time": "2025-02-10T11:26:33.969758" + "time": "2025-02-10T11:26:33.969758", + "goose": {} } """ Manifest.model_validate_json(json) @@ -57,7 +58,12 @@ def test_valid_manifest_groups(): "system_prompt": "{project_dir}/system_prompt.md", "verify_cmd": "{py} {project_dir}/verify.py", "pre_verify_cmd": "{py} {project_dir}/verify.py --pre", - "time": "2025-02-10T11:26:33.969758" + "time": "2025-02-10T11:26:33.969758", + "goose": { + "system_prompt": "{project_dir}/goose_prompt.md", + "time_out_minutes": 15, + "max_retries": 3 + } } """ manifest = Manifest.model_validate_json(json) @@ -94,6 +100,12 @@ def test_valid_manifest_groups(): assert dir_glob_group_name.split("-")[1] != dir_group_name.split("-")[1] + assert manifest.goose.system_prompt == "{project_dir}/goose_prompt.md" + assert manifest.goose.time_out_minutes == 15 + assert manifest.goose.max_retries == 3 + + + def test_normalize_files(): """Test that Directory.to_file_group correctly converts Directory objects to FileGroup objects.""" diff --git a/uv.lock b/uv.lock index 3622a63..5e91f12 100644 --- a/uv.lock +++ b/uv.lock @@ -42,243 +42,243 @@ dev = [{ name = "ruff", specifier = ">=0.9.9" }] [[package]] name = "annotated-types" version = "0.7.0" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89" } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53" }, ] [[package]] name = "anyio" version = "4.9.0" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "idna" }, { name = "sniffio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c" }, ] [[package]] name = "certifi" version = "2025.1.31" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651" } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" }, ] [[package]] name = "charset-normalizer" version = "3.4.1" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, - { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, - { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, - { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, - { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, - { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, - { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, - { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, - { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, - { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, - { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, - { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, - { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, - { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3" } +wheels = [ + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85" }, ] [[package]] name = "click" version = "8.1.8" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2" }, ] [[package]] name = "colorama" version = "0.4.6" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" }, ] [[package]] name = "deprecated" version = "1.2.18" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", size = 2928744 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec" }, ] [[package]] name = "distro" version = "1.9.0" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed" } wheels = [ - { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2" }, ] [[package]] name = "eval-type-backport" version = "0.2.2" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/30/ea/8b0ac4469d4c347c6a385ff09dc3c048c2d021696664e26c7ee6791631b5/eval_type_backport-0.2.2.tar.gz", hash = "sha256:f0576b4cf01ebb5bd358d02314d31846af5e07678387486e2c798af0e7d849c1", size = 9079 } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/30/ea/8b0ac4469d4c347c6a385ff09dc3c048c2d021696664e26c7ee6791631b5/eval_type_backport-0.2.2.tar.gz", hash = "sha256:f0576b4cf01ebb5bd358d02314d31846af5e07678387486e2c798af0e7d849c1" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/31/55cd413eaccd39125368be33c46de24a1f639f2e12349b0361b4678f3915/eval_type_backport-0.2.2-py3-none-any.whl", hash = "sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a", size = 5830 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ce/31/55cd413eaccd39125368be33c46de24a1f639f2e12349b0361b4678f3915/eval_type_backport-0.2.2-py3-none-any.whl", hash = "sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a" }, ] [[package]] name = "griffe" version = "1.7.0" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "colorama" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cc/e1/7dded768fe1adf67879bcd86cf83476e7b19f13d95e6504b6c2b91092f8c/griffe-1.7.0.tar.gz", hash = "sha256:72e9c1593c7af92a387906293fc4a318c2e8e8aef501c64678c809794b4bdca4", size = 394351 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/cc/e1/7dded768fe1adf67879bcd86cf83476e7b19f13d95e6504b6c2b91092f8c/griffe-1.7.0.tar.gz", hash = "sha256:72e9c1593c7af92a387906293fc4a318c2e8e8aef501c64678c809794b4bdca4" } wheels = [ - { url = "https://files.pythonhosted.org/packages/66/b3/6201c5dc97ed76398eb419d17fe18db6b4b3ffb2baa2bae91b4c65126096/griffe-1.7.0-py3-none-any.whl", hash = "sha256:6b44efc53a3f290d42c4da521f42235177b3bd107877dd55955318a37930c572", size = 129118 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/66/b3/6201c5dc97ed76398eb419d17fe18db6b4b3ffb2baa2bae91b4c65126096/griffe-1.7.0-py3-none-any.whl", hash = "sha256:6b44efc53a3f290d42c4da521f42235177b3bd107877dd55955318a37930c572" }, ] [[package]] name = "h11" version = "0.14.0" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d" } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" }, ] [[package]] name = "httpcore" version = "1.0.7" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "certifi" }, { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c" } wheels = [ - { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd" }, ] [[package]] name = "httpx" version = "0.28.1" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "anyio" }, { name = "certifi" }, { name = "httpcore" }, { name = "idna" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad" }, ] [[package]] name = "idna" version = "3.10" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" }, ] [[package]] name = "importlib-metadata" version = "8.6.1" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "zipp" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/08/c1395a292bb23fd03bdf572a1357c5a733d3eecbab877641ceacab23db6e/importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580", size = 55767 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/33/08/c1395a292bb23fd03bdf572a1357c5a733d3eecbab877641ceacab23db6e/importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580" } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/9d/0fb148dc4d6fa4a7dd1d8378168d9b4cd8d4560a6fbf6f0121c5fc34eb68/importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e", size = 26971 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/79/9d/0fb148dc4d6fa4a7dd1d8378168d9b4cd8d4560a6fbf6f0121c5fc34eb68/importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e" }, ] [[package]] name = "iniconfig" version = "2.1.0" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760" }, ] [[package]] name = "jiter" version = "0.9.0" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/1e/c2/e4562507f52f0af7036da125bb699602ead37a2332af0788f8e0a3417f36/jiter-0.9.0.tar.gz", hash = "sha256:aadba0964deb424daa24492abc3d229c60c4a31bfee205aedbf1acc7639d7893", size = 162604 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/1b/4cd165c362e8f2f520fdb43245e2b414f42a255921248b4f8b9c8d871ff1/jiter-0.9.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2764891d3f3e8b18dce2cff24949153ee30c9239da7c00f032511091ba688ff7", size = 308197 }, - { url = "https://files.pythonhosted.org/packages/13/aa/7a890dfe29c84c9a82064a9fe36079c7c0309c91b70c380dc138f9bea44a/jiter-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:387b22fbfd7a62418d5212b4638026d01723761c75c1c8232a8b8c37c2f1003b", size = 318160 }, - { url = "https://files.pythonhosted.org/packages/6a/38/5888b43fc01102f733f085673c4f0be5a298f69808ec63de55051754e390/jiter-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d8da8629ccae3606c61d9184970423655fb4e33d03330bcdfe52d234d32f69", size = 341259 }, - { url = "https://files.pythonhosted.org/packages/3d/5e/bbdbb63305bcc01006de683b6228cd061458b9b7bb9b8d9bc348a58e5dc2/jiter-0.9.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1be73d8982bdc278b7b9377426a4b44ceb5c7952073dd7488e4ae96b88e1103", size = 363730 }, - { url = "https://files.pythonhosted.org/packages/75/85/53a3edc616992fe4af6814c25f91ee3b1e22f7678e979b6ea82d3bc0667e/jiter-0.9.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2228eaaaa111ec54b9e89f7481bffb3972e9059301a878d085b2b449fbbde635", size = 405126 }, - { url = "https://files.pythonhosted.org/packages/ae/b3/1ee26b12b2693bd3f0b71d3188e4e5d817b12e3c630a09e099e0a89e28fa/jiter-0.9.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11509bfecbc319459647d4ac3fd391d26fdf530dad00c13c4dadabf5b81f01a4", size = 393668 }, - { url = "https://files.pythonhosted.org/packages/11/87/e084ce261950c1861773ab534d49127d1517b629478304d328493f980791/jiter-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f22238da568be8bbd8e0650e12feeb2cfea15eda4f9fc271d3b362a4fa0604d", size = 352350 }, - { url = "https://files.pythonhosted.org/packages/f0/06/7dca84b04987e9df563610aa0bc154ea176e50358af532ab40ffb87434df/jiter-0.9.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17f5d55eb856597607562257c8e36c42bc87f16bef52ef7129b7da11afc779f3", size = 384204 }, - { url = "https://files.pythonhosted.org/packages/16/2f/82e1c6020db72f397dd070eec0c85ebc4df7c88967bc86d3ce9864148f28/jiter-0.9.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6a99bed9fbb02f5bed416d137944419a69aa4c423e44189bc49718859ea83bc5", size = 520322 }, - { url = "https://files.pythonhosted.org/packages/36/fd/4f0cd3abe83ce208991ca61e7e5df915aa35b67f1c0633eb7cf2f2e88ec7/jiter-0.9.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e057adb0cd1bd39606100be0eafe742de2de88c79df632955b9ab53a086b3c8d", size = 512184 }, - { url = "https://files.pythonhosted.org/packages/a0/3c/8a56f6d547731a0b4410a2d9d16bf39c861046f91f57c98f7cab3d2aa9ce/jiter-0.9.0-cp313-cp313-win32.whl", hash = "sha256:f7e6850991f3940f62d387ccfa54d1a92bd4bb9f89690b53aea36b4364bcab53", size = 206504 }, - { url = "https://files.pythonhosted.org/packages/f4/1c/0c996fd90639acda75ed7fa698ee5fd7d80243057185dc2f63d4c1c9f6b9/jiter-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7", size = 204943 }, - { url = "https://files.pythonhosted.org/packages/78/0f/77a63ca7aa5fed9a1b9135af57e190d905bcd3702b36aca46a01090d39ad/jiter-0.9.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0b2827fb88dda2cbecbbc3e596ef08d69bda06c6f57930aec8e79505dc17001", size = 317281 }, - { url = "https://files.pythonhosted.org/packages/f9/39/a3a1571712c2bf6ec4c657f0d66da114a63a2e32b7e4eb8e0b83295ee034/jiter-0.9.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062b756ceb1d40b0b28f326cba26cfd575a4918415b036464a52f08632731e5a", size = 350273 }, - { url = "https://files.pythonhosted.org/packages/ee/47/3729f00f35a696e68da15d64eb9283c330e776f3b5789bac7f2c0c4df209/jiter-0.9.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6f7838bc467ab7e8ef9f387bd6de195c43bad82a569c1699cb822f6609dd4cdf", size = 206867 }, +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/1e/c2/e4562507f52f0af7036da125bb699602ead37a2332af0788f8e0a3417f36/jiter-0.9.0.tar.gz", hash = "sha256:aadba0964deb424daa24492abc3d229c60c4a31bfee205aedbf1acc7639d7893" } +wheels = [ + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/e7/1b/4cd165c362e8f2f520fdb43245e2b414f42a255921248b4f8b9c8d871ff1/jiter-0.9.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2764891d3f3e8b18dce2cff24949153ee30c9239da7c00f032511091ba688ff7" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/13/aa/7a890dfe29c84c9a82064a9fe36079c7c0309c91b70c380dc138f9bea44a/jiter-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:387b22fbfd7a62418d5212b4638026d01723761c75c1c8232a8b8c37c2f1003b" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/6a/38/5888b43fc01102f733f085673c4f0be5a298f69808ec63de55051754e390/jiter-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d8da8629ccae3606c61d9184970423655fb4e33d03330bcdfe52d234d32f69" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/3d/5e/bbdbb63305bcc01006de683b6228cd061458b9b7bb9b8d9bc348a58e5dc2/jiter-0.9.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1be73d8982bdc278b7b9377426a4b44ceb5c7952073dd7488e4ae96b88e1103" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/75/85/53a3edc616992fe4af6814c25f91ee3b1e22f7678e979b6ea82d3bc0667e/jiter-0.9.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2228eaaaa111ec54b9e89f7481bffb3972e9059301a878d085b2b449fbbde635" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ae/b3/1ee26b12b2693bd3f0b71d3188e4e5d817b12e3c630a09e099e0a89e28fa/jiter-0.9.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11509bfecbc319459647d4ac3fd391d26fdf530dad00c13c4dadabf5b81f01a4" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/11/87/e084ce261950c1861773ab534d49127d1517b629478304d328493f980791/jiter-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f22238da568be8bbd8e0650e12feeb2cfea15eda4f9fc271d3b362a4fa0604d" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f0/06/7dca84b04987e9df563610aa0bc154ea176e50358af532ab40ffb87434df/jiter-0.9.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17f5d55eb856597607562257c8e36c42bc87f16bef52ef7129b7da11afc779f3" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/16/2f/82e1c6020db72f397dd070eec0c85ebc4df7c88967bc86d3ce9864148f28/jiter-0.9.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6a99bed9fbb02f5bed416d137944419a69aa4c423e44189bc49718859ea83bc5" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/36/fd/4f0cd3abe83ce208991ca61e7e5df915aa35b67f1c0633eb7cf2f2e88ec7/jiter-0.9.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e057adb0cd1bd39606100be0eafe742de2de88c79df632955b9ab53a086b3c8d" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a0/3c/8a56f6d547731a0b4410a2d9d16bf39c861046f91f57c98f7cab3d2aa9ce/jiter-0.9.0-cp313-cp313-win32.whl", hash = "sha256:f7e6850991f3940f62d387ccfa54d1a92bd4bb9f89690b53aea36b4364bcab53" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f4/1c/0c996fd90639acda75ed7fa698ee5fd7d80243057185dc2f63d4c1c9f6b9/jiter-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/78/0f/77a63ca7aa5fed9a1b9135af57e190d905bcd3702b36aca46a01090d39ad/jiter-0.9.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0b2827fb88dda2cbecbbc3e596ef08d69bda06c6f57930aec8e79505dc17001" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f9/39/a3a1571712c2bf6ec4c657f0d66da114a63a2e32b7e4eb8e0b83295ee034/jiter-0.9.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062b756ceb1d40b0b28f326cba26cfd575a4918415b036464a52f08632731e5a" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ee/47/3729f00f35a696e68da15d64eb9283c330e776f3b5789bac7f2c0c4df209/jiter-0.9.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6f7838bc467ab7e8ef9f387bd6de195c43bad82a569c1699cb822f6609dd4cdf" }, ] [[package]] name = "logfire-api" version = "3.11.0" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/6d/09/93ef3606ddb54c7362552ab6be2fb8068a0e24b0d6ba740440b62a753c56/logfire_api-3.11.0.tar.gz", hash = "sha256:e242f10e1f90e34a52e8d62bb410d2b2c4ff0dde15ce0a93414ee96af503e584", size = 47256 } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/6d/09/93ef3606ddb54c7362552ab6be2fb8068a0e24b0d6ba740440b62a753c56/logfire_api-3.11.0.tar.gz", hash = "sha256:e242f10e1f90e34a52e8d62bb410d2b2c4ff0dde15ce0a93414ee96af503e584" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/eb/83d994ab0b6ff23076c2668527a8fe4069d6dec4333878cb9e1a94c88aac/logfire_api-3.11.0-py3-none-any.whl", hash = "sha256:a556d18a21086d53d51e8775b2ef58a987ebaa372257a5af6668852f44ba17cc", size = 78122 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/b9/eb/83d994ab0b6ff23076c2668527a8fe4069d6dec4333878cb9e1a94c88aac/logfire_api-3.11.0-py3-none-any.whl", hash = "sha256:a556d18a21086d53d51e8775b2ef58a987ebaa372257a5af6668852f44ba17cc" }, ] [[package]] name = "markdown-it-py" version = "3.0.0" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb" } 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 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1" }, ] [[package]] name = "mdurl" version = "0.1.2" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8" }, ] [[package]] name = "openai" version = "1.68.2" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "anyio" }, { name = "distro" }, @@ -289,72 +289,72 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3f/6b/6b002d5d38794645437ae3ddb42083059d556558493408d39a0fcea608bc/openai-1.68.2.tar.gz", hash = "sha256:b720f0a95a1dbe1429c0d9bb62096a0d98057bcda82516f6e8af10284bdd5b19", size = 413429 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/3f/6b/6b002d5d38794645437ae3ddb42083059d556558493408d39a0fcea608bc/openai-1.68.2.tar.gz", hash = "sha256:b720f0a95a1dbe1429c0d9bb62096a0d98057bcda82516f6e8af10284bdd5b19" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/34/cebce15f64eb4a3d609a83ac3568d43005cc9a1cba9d7fde5590fd415423/openai-1.68.2-py3-none-any.whl", hash = "sha256:24484cb5c9a33b58576fdc5acf0e5f92603024a4e39d0b99793dfa1eb14c2b36", size = 606073 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/fd/34/cebce15f64eb4a3d609a83ac3568d43005cc9a1cba9d7fde5590fd415423/openai-1.68.2-py3-none-any.whl", hash = "sha256:24484cb5c9a33b58576fdc5acf0e5f92603024a4e39d0b99793dfa1eb14c2b36" }, ] [[package]] name = "opentelemetry-api" version = "1.31.1" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "deprecated" }, { name = "importlib-metadata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8a/cf/db26ab9d748bf50d6edf524fb863aa4da616ba1ce46c57a7dff1112b73fb/opentelemetry_api-1.31.1.tar.gz", hash = "sha256:137ad4b64215f02b3000a0292e077641c8611aab636414632a9b9068593b7e91", size = 64059 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/8a/cf/db26ab9d748bf50d6edf524fb863aa4da616ba1ce46c57a7dff1112b73fb/opentelemetry_api-1.31.1.tar.gz", hash = "sha256:137ad4b64215f02b3000a0292e077641c8611aab636414632a9b9068593b7e91" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/c8/86557ff0da32f3817bc4face57ea35cfdc2f9d3bcefd42311ef860dcefb7/opentelemetry_api-1.31.1-py3-none-any.whl", hash = "sha256:1511a3f470c9c8a32eeea68d4ea37835880c0eed09dd1a0187acc8b1301da0a1", size = 65197 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/6c/c8/86557ff0da32f3817bc4face57ea35cfdc2f9d3bcefd42311ef860dcefb7/opentelemetry_api-1.31.1-py3-none-any.whl", hash = "sha256:1511a3f470c9c8a32eeea68d4ea37835880c0eed09dd1a0187acc8b1301da0a1" }, ] [[package]] name = "packaging" version = "24.2" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759" }, ] [[package]] name = "pluggy" version = "1.5.0" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" }, ] [[package]] name = "prompt-toolkit" version = "3.0.50" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "wcwidth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/e1/bd15cb8ffdcfeeb2bdc215de3c3cffca11408d829e4b8416dcfe71ba8854/prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab", size = 429087 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a1/e1/bd15cb8ffdcfeeb2bdc215de3c3cffca11408d829e4b8416dcfe71ba8854/prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/ea/d836f008d33151c7a1f62caf3d8dd782e4d15f6a43897f64480c2b8de2ad/prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198", size = 387816 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/e4/ea/d836f008d33151c7a1f62caf3d8dd782e4d15f6a43897f64480c2b8de2ad/prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198" }, ] [[package]] name = "pydantic" version = "2.10.6" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "annotated-types" }, { name = "pydantic-core" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584" }, ] [[package]] name = "pydantic-ai-slim" version = "0.0.48" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "eval-type-backport" }, { name = "griffe" }, @@ -364,277 +364,277 @@ dependencies = [ { name = "pydantic-graph" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7e/a7/605b5e7d8edc2f2ca843f50cb237c11f6e997c3e3ceac29b8d66abc400df/pydantic_ai_slim-0.0.48.tar.gz", hash = "sha256:18fc5c63cb721a393dba6d1090bb58c3a2911a313ef99dbc0b07f6bf6dd2ee62", size = 108450 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/7e/a7/605b5e7d8edc2f2ca843f50cb237c11f6e997c3e3ceac29b8d66abc400df/pydantic_ai_slim-0.0.48.tar.gz", hash = "sha256:18fc5c63cb721a393dba6d1090bb58c3a2911a313ef99dbc0b07f6bf6dd2ee62" } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/25/21efaadca5ea8b47e6fc346c04eb2473557f1e45e19d40bba66d719c339a/pydantic_ai_slim-0.0.48-py3-none-any.whl", hash = "sha256:8e9a1a03108c842c247f745ad12ecc106801e5deca210dc46fede45baa0fa0c5", size = 141663 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/39/25/21efaadca5ea8b47e6fc346c04eb2473557f1e45e19d40bba66d719c339a/pydantic_ai_slim-0.0.48-py3-none-any.whl", hash = "sha256:8e9a1a03108c842c247f745ad12ecc106801e5deca210dc46fede45baa0fa0c5" }, ] [[package]] name = "pydantic-core" version = "2.27.2" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39" } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, - { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, - { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, - { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, - { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, - { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, - { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, - { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, - { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, - { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, - { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, - { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, - { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, - { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b" }, ] [[package]] name = "pydantic-graph" version = "0.0.48" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "httpx" }, { name = "logfire-api" }, { name = "pydantic" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2b/2a/d8f0e3cc53f5be33584e30cd069e31026b379dc90ec8e356a7d4a62c6d8b/pydantic_graph-0.0.48.tar.gz", hash = "sha256:24c9c419d20a30805e49c037d261735bae3bdffa69d98b7927ffd2b1a322df19", size = 20401 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/2b/2a/d8f0e3cc53f5be33584e30cd069e31026b379dc90ec8e356a7d4a62c6d8b/pydantic_graph-0.0.48.tar.gz", hash = "sha256:24c9c419d20a30805e49c037d261735bae3bdffa69d98b7927ffd2b1a322df19" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/77/74964c664e36fcf62cf024c854268f4d91f1df41982a4330d9dc275ca7d0/pydantic_graph-0.0.48-py3-none-any.whl", hash = "sha256:74b29538be00be64d56c61c5b99eaf180dbdcfb016c720ab72372093485b2114", size = 25818 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/20/77/74964c664e36fcf62cf024c854268f4d91f1df41982a4330d9dc275ca7d0/pydantic_graph-0.0.48-py3-none-any.whl", hash = "sha256:74b29538be00be64d56c61c5b99eaf180dbdcfb016c720ab72372093485b2114" }, ] [[package]] name = "pygments" version = "2.19.1" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c" }, ] [[package]] name = "pytest" version = "8.3.5" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845" } wheels = [ - { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820" }, ] [[package]] name = "pytest-asyncio" version = "0.26.0" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8e/c4/453c52c659521066969523e87d85d54139bbd17b78f09532fb8eb8cdb58e/pytest_asyncio-0.26.0.tar.gz", hash = "sha256:c4df2a697648241ff39e7f0e4a73050b03f123f760673956cf0d72a4990e312f", size = 54156 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/8e/c4/453c52c659521066969523e87d85d54139bbd17b78f09532fb8eb8cdb58e/pytest_asyncio-0.26.0.tar.gz", hash = "sha256:c4df2a697648241ff39e7f0e4a73050b03f123f760673956cf0d72a4990e312f" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/7f/338843f449ace853647ace35870874f69a764d251872ed1b4de9f234822c/pytest_asyncio-0.26.0-py3-none-any.whl", hash = "sha256:7b51ed894f4fbea1340262bdae5135797ebbe21d8638978e35d31c6d19f72fb0", size = 19694 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/20/7f/338843f449ace853647ace35870874f69a764d251872ed1b4de9f234822c/pytest_asyncio-0.26.0-py3-none-any.whl", hash = "sha256:7b51ed894f4fbea1340262bdae5135797ebbe21d8638978e35d31c6d19f72fb0" }, ] [[package]] name = "regex" version = "2024.11.6" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525 }, - { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324 }, - { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617 }, - { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023 }, - { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072 }, - { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130 }, - { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857 }, - { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006 }, - { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650 }, - { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545 }, - { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045 }, - { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182 }, - { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733 }, - { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122 }, - { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545 }, +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519" } +wheels = [ + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a" }, ] [[package]] name = "requests" version = "2.32.3" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "certifi" }, { name = "charset-normalizer" }, { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" }, ] [[package]] name = "rich" version = "13.9.4" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098" } wheels = [ - { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90" }, ] [[package]] name = "ruff" version = "0.11.2" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/90/61/fb87430f040e4e577e784e325351186976516faef17d6fcd921fe28edfd7/ruff-0.11.2.tar.gz", hash = "sha256:ec47591497d5a1050175bdf4e1a4e6272cddff7da88a2ad595e1e326041d8d94", size = 3857511 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/99/102578506f0f5fa29fd7e0df0a273864f79af044757aef73d1cae0afe6ad/ruff-0.11.2-py3-none-linux_armv6l.whl", hash = "sha256:c69e20ea49e973f3afec2c06376eb56045709f0212615c1adb0eda35e8a4e477", size = 10113146 }, - { url = "https://files.pythonhosted.org/packages/74/ad/5cd4ba58ab602a579997a8494b96f10f316e874d7c435bcc1a92e6da1b12/ruff-0.11.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2c5424cc1c4eb1d8ecabe6d4f1b70470b4f24a0c0171356290b1953ad8f0e272", size = 10867092 }, - { url = "https://files.pythonhosted.org/packages/fc/3e/d3f13619e1d152c7b600a38c1a035e833e794c6625c9a6cea6f63dbf3af4/ruff-0.11.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ecf20854cc73f42171eedb66f006a43d0a21bfb98a2523a809931cda569552d9", size = 10224082 }, - { url = "https://files.pythonhosted.org/packages/90/06/f77b3d790d24a93f38e3806216f263974909888fd1e826717c3ec956bbcd/ruff-0.11.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c543bf65d5d27240321604cee0633a70c6c25c9a2f2492efa9f6d4b8e4199bb", size = 10394818 }, - { url = "https://files.pythonhosted.org/packages/99/7f/78aa431d3ddebfc2418cd95b786642557ba8b3cb578c075239da9ce97ff9/ruff-0.11.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20967168cc21195db5830b9224be0e964cc9c8ecf3b5a9e3ce19876e8d3a96e3", size = 9952251 }, - { url = "https://files.pythonhosted.org/packages/30/3e/f11186d1ddfaca438c3bbff73c6a2fdb5b60e6450cc466129c694b0ab7a2/ruff-0.11.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:955a9ce63483999d9f0b8f0b4a3ad669e53484232853054cc8b9d51ab4c5de74", size = 11563566 }, - { url = "https://files.pythonhosted.org/packages/22/6c/6ca91befbc0a6539ee133d9a9ce60b1a354db12c3c5d11cfdbf77140f851/ruff-0.11.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:86b3a27c38b8fce73bcd262b0de32e9a6801b76d52cdb3ae4c914515f0cef608", size = 12208721 }, - { url = "https://files.pythonhosted.org/packages/19/b0/24516a3b850d55b17c03fc399b681c6a549d06ce665915721dc5d6458a5c/ruff-0.11.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3b66a03b248c9fcd9d64d445bafdf1589326bee6fc5c8e92d7562e58883e30f", size = 11662274 }, - { url = "https://files.pythonhosted.org/packages/d7/65/76be06d28ecb7c6070280cef2bcb20c98fbf99ff60b1c57d2fb9b8771348/ruff-0.11.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0397c2672db015be5aa3d4dac54c69aa012429097ff219392c018e21f5085147", size = 13792284 }, - { url = "https://files.pythonhosted.org/packages/ce/d2/4ceed7147e05852876f3b5f3fdc23f878ce2b7e0b90dd6e698bda3d20787/ruff-0.11.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:869bcf3f9abf6457fbe39b5a37333aa4eecc52a3b99c98827ccc371a8e5b6f1b", size = 11327861 }, - { url = "https://files.pythonhosted.org/packages/c4/78/4935ecba13706fd60ebe0e3dc50371f2bdc3d9bc80e68adc32ff93914534/ruff-0.11.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2a2b50ca35457ba785cd8c93ebbe529467594087b527a08d487cf0ee7b3087e9", size = 10276560 }, - { url = "https://files.pythonhosted.org/packages/81/7f/1b2435c3f5245d410bb5dc80f13ec796454c21fbda12b77d7588d5cf4e29/ruff-0.11.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7c69c74bf53ddcfbc22e6eb2f31211df7f65054bfc1f72288fc71e5f82db3eab", size = 9945091 }, - { url = "https://files.pythonhosted.org/packages/39/c4/692284c07e6bf2b31d82bb8c32f8840f9d0627d92983edaac991a2b66c0a/ruff-0.11.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6e8fb75e14560f7cf53b15bbc55baf5ecbe373dd5f3aab96ff7aa7777edd7630", size = 10977133 }, - { url = "https://files.pythonhosted.org/packages/94/cf/8ab81cb7dd7a3b0a3960c2769825038f3adcd75faf46dd6376086df8b128/ruff-0.11.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:842a472d7b4d6f5924e9297aa38149e5dcb1e628773b70e6387ae2c97a63c58f", size = 11378514 }, - { url = "https://files.pythonhosted.org/packages/d9/3a/a647fa4f316482dacf2fd68e8a386327a33d6eabd8eb2f9a0c3d291ec549/ruff-0.11.2-py3-none-win32.whl", hash = "sha256:aca01ccd0eb5eb7156b324cfaa088586f06a86d9e5314b0eb330cb48415097cc", size = 10319835 }, - { url = "https://files.pythonhosted.org/packages/86/54/3c12d3af58012a5e2cd7ebdbe9983f4834af3f8cbea0e8a8c74fa1e23b2b/ruff-0.11.2-py3-none-win_amd64.whl", hash = "sha256:3170150172a8f994136c0c66f494edf199a0bbea7a409f649e4bc8f4d7084080", size = 11373713 }, - { url = "https://files.pythonhosted.org/packages/d6/d4/dd813703af8a1e2ac33bf3feb27e8a5ad514c9f219df80c64d69807e7f71/ruff-0.11.2-py3-none-win_arm64.whl", hash = "sha256:52933095158ff328f4c77af3d74f0379e34fd52f175144cefc1b192e7ccd32b4", size = 10441990 }, +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/90/61/fb87430f040e4e577e784e325351186976516faef17d6fcd921fe28edfd7/ruff-0.11.2.tar.gz", hash = "sha256:ec47591497d5a1050175bdf4e1a4e6272cddff7da88a2ad595e1e326041d8d94" } +wheels = [ + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/62/99/102578506f0f5fa29fd7e0df0a273864f79af044757aef73d1cae0afe6ad/ruff-0.11.2-py3-none-linux_armv6l.whl", hash = "sha256:c69e20ea49e973f3afec2c06376eb56045709f0212615c1adb0eda35e8a4e477" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/74/ad/5cd4ba58ab602a579997a8494b96f10f316e874d7c435bcc1a92e6da1b12/ruff-0.11.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2c5424cc1c4eb1d8ecabe6d4f1b70470b4f24a0c0171356290b1953ad8f0e272" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/fc/3e/d3f13619e1d152c7b600a38c1a035e833e794c6625c9a6cea6f63dbf3af4/ruff-0.11.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ecf20854cc73f42171eedb66f006a43d0a21bfb98a2523a809931cda569552d9" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/90/06/f77b3d790d24a93f38e3806216f263974909888fd1e826717c3ec956bbcd/ruff-0.11.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c543bf65d5d27240321604cee0633a70c6c25c9a2f2492efa9f6d4b8e4199bb" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/99/7f/78aa431d3ddebfc2418cd95b786642557ba8b3cb578c075239da9ce97ff9/ruff-0.11.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20967168cc21195db5830b9224be0e964cc9c8ecf3b5a9e3ce19876e8d3a96e3" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/30/3e/f11186d1ddfaca438c3bbff73c6a2fdb5b60e6450cc466129c694b0ab7a2/ruff-0.11.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:955a9ce63483999d9f0b8f0b4a3ad669e53484232853054cc8b9d51ab4c5de74" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/22/6c/6ca91befbc0a6539ee133d9a9ce60b1a354db12c3c5d11cfdbf77140f851/ruff-0.11.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:86b3a27c38b8fce73bcd262b0de32e9a6801b76d52cdb3ae4c914515f0cef608" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/19/b0/24516a3b850d55b17c03fc399b681c6a549d06ce665915721dc5d6458a5c/ruff-0.11.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3b66a03b248c9fcd9d64d445bafdf1589326bee6fc5c8e92d7562e58883e30f" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/d7/65/76be06d28ecb7c6070280cef2bcb20c98fbf99ff60b1c57d2fb9b8771348/ruff-0.11.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0397c2672db015be5aa3d4dac54c69aa012429097ff219392c018e21f5085147" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ce/d2/4ceed7147e05852876f3b5f3fdc23f878ce2b7e0b90dd6e698bda3d20787/ruff-0.11.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:869bcf3f9abf6457fbe39b5a37333aa4eecc52a3b99c98827ccc371a8e5b6f1b" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/c4/78/4935ecba13706fd60ebe0e3dc50371f2bdc3d9bc80e68adc32ff93914534/ruff-0.11.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2a2b50ca35457ba785cd8c93ebbe529467594087b527a08d487cf0ee7b3087e9" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/81/7f/1b2435c3f5245d410bb5dc80f13ec796454c21fbda12b77d7588d5cf4e29/ruff-0.11.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7c69c74bf53ddcfbc22e6eb2f31211df7f65054bfc1f72288fc71e5f82db3eab" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/39/c4/692284c07e6bf2b31d82bb8c32f8840f9d0627d92983edaac991a2b66c0a/ruff-0.11.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6e8fb75e14560f7cf53b15bbc55baf5ecbe373dd5f3aab96ff7aa7777edd7630" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/94/cf/8ab81cb7dd7a3b0a3960c2769825038f3adcd75faf46dd6376086df8b128/ruff-0.11.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:842a472d7b4d6f5924e9297aa38149e5dcb1e628773b70e6387ae2c97a63c58f" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/d9/3a/a647fa4f316482dacf2fd68e8a386327a33d6eabd8eb2f9a0c3d291ec549/ruff-0.11.2-py3-none-win32.whl", hash = "sha256:aca01ccd0eb5eb7156b324cfaa088586f06a86d9e5314b0eb330cb48415097cc" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/86/54/3c12d3af58012a5e2cd7ebdbe9983f4834af3f8cbea0e8a8c74fa1e23b2b/ruff-0.11.2-py3-none-win_amd64.whl", hash = "sha256:3170150172a8f994136c0c66f494edf199a0bbea7a409f649e4bc8f4d7084080" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/d6/d4/dd813703af8a1e2ac33bf3feb27e8a5ad514c9f219df80c64d69807e7f71/ruff-0.11.2-py3-none-win_arm64.whl", hash = "sha256:52933095158ff328f4c77af3d74f0379e34fd52f175144cefc1b192e7ccd32b4" }, ] [[package]] name = "sniffio" version = "1.3.1" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2" }, ] [[package]] name = "tiktoken" version = "0.9.0" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "regex" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ea/cf/756fedf6981e82897f2d570dd25fa597eb3f4459068ae0572d7e888cfd6f/tiktoken-0.9.0.tar.gz", hash = "sha256:d02a5ca6a938e0490e1ff957bc48c8b078c88cb83977be1625b1fd8aac792c5d", size = 35991 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ea/cf/756fedf6981e82897f2d570dd25fa597eb3f4459068ae0572d7e888cfd6f/tiktoken-0.9.0.tar.gz", hash = "sha256:d02a5ca6a938e0490e1ff957bc48c8b078c88cb83977be1625b1fd8aac792c5d" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/11/09d936d37f49f4f494ffe660af44acd2d99eb2429d60a57c71318af214e0/tiktoken-0.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b0e8e05a26eda1249e824156d537015480af7ae222ccb798e5234ae0285dbdb", size = 1064919 }, - { url = "https://files.pythonhosted.org/packages/80/0e/f38ba35713edb8d4197ae602e80837d574244ced7fb1b6070b31c29816e0/tiktoken-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:27d457f096f87685195eea0165a1807fae87b97b2161fe8c9b1df5bd74ca6f63", size = 1007877 }, - { url = "https://files.pythonhosted.org/packages/fe/82/9197f77421e2a01373e27a79dd36efdd99e6b4115746ecc553318ecafbf0/tiktoken-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cf8ded49cddf825390e36dd1ad35cd49589e8161fdcb52aa25f0583e90a3e01", size = 1140095 }, - { url = "https://files.pythonhosted.org/packages/f2/bb/4513da71cac187383541facd0291c4572b03ec23c561de5811781bbd988f/tiktoken-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc156cb314119a8bb9748257a2eaebd5cc0753b6cb491d26694ed42fc7cb3139", size = 1195649 }, - { url = "https://files.pythonhosted.org/packages/fa/5c/74e4c137530dd8504e97e3a41729b1103a4ac29036cbfd3250b11fd29451/tiktoken-0.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cd69372e8c9dd761f0ab873112aba55a0e3e506332dd9f7522ca466e817b1b7a", size = 1258465 }, - { url = "https://files.pythonhosted.org/packages/de/a8/8f499c179ec900783ffe133e9aab10044481679bb9aad78436d239eee716/tiktoken-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:5ea0edb6f83dc56d794723286215918c1cde03712cbbafa0348b33448faf5b95", size = 894669 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/7a/11/09d936d37f49f4f494ffe660af44acd2d99eb2429d60a57c71318af214e0/tiktoken-0.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b0e8e05a26eda1249e824156d537015480af7ae222ccb798e5234ae0285dbdb" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/80/0e/f38ba35713edb8d4197ae602e80837d574244ced7fb1b6070b31c29816e0/tiktoken-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:27d457f096f87685195eea0165a1807fae87b97b2161fe8c9b1df5bd74ca6f63" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/fe/82/9197f77421e2a01373e27a79dd36efdd99e6b4115746ecc553318ecafbf0/tiktoken-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cf8ded49cddf825390e36dd1ad35cd49589e8161fdcb52aa25f0583e90a3e01" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f2/bb/4513da71cac187383541facd0291c4572b03ec23c561de5811781bbd988f/tiktoken-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc156cb314119a8bb9748257a2eaebd5cc0753b6cb491d26694ed42fc7cb3139" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/fa/5c/74e4c137530dd8504e97e3a41729b1103a4ac29036cbfd3250b11fd29451/tiktoken-0.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cd69372e8c9dd761f0ab873112aba55a0e3e506332dd9f7522ca466e817b1b7a" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/de/a8/8f499c179ec900783ffe133e9aab10044481679bb9aad78436d239eee716/tiktoken-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:5ea0edb6f83dc56d794723286215918c1cde03712cbbafa0348b33448faf5b95" }, ] [[package]] name = "tqdm" version = "4.67.1" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2" }, ] [[package]] name = "typing-extensions" version = "4.12.2" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" } wheels = [ - { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d" }, ] [[package]] name = "typing-inspection" version = "0.4.0" -source = { registry = "https://pypi.org/simple/" } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f" }, ] [[package]] name = "urllib3" version = "2.3.0" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df" }, ] [[package]] name = "wcwidth" version = "0.2.13" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859" }, ] [[package]] name = "wrapt" version = "1.17.2" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/b9/0ffd557a92f3b11d4c5d5e0c5e4ad057bd9eb8586615cdaf901409920b14/wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125", size = 53800 }, - { url = "https://files.pythonhosted.org/packages/c0/ef/8be90a0b7e73c32e550c73cfb2fa09db62234227ece47b0e80a05073b375/wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998", size = 38824 }, - { url = "https://files.pythonhosted.org/packages/36/89/0aae34c10fe524cce30fe5fc433210376bce94cf74d05b0d68344c8ba46e/wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5", size = 38920 }, - { url = "https://files.pythonhosted.org/packages/3b/24/11c4510de906d77e0cfb5197f1b1445d4fec42c9a39ea853d482698ac681/wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8", size = 88690 }, - { url = "https://files.pythonhosted.org/packages/71/d7/cfcf842291267bf455b3e266c0c29dcb675b5540ee8b50ba1699abf3af45/wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6", size = 80861 }, - { url = "https://files.pythonhosted.org/packages/d5/66/5d973e9f3e7370fd686fb47a9af3319418ed925c27d72ce16b791231576d/wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc", size = 89174 }, - { url = "https://files.pythonhosted.org/packages/a7/d3/8e17bb70f6ae25dabc1aaf990f86824e4fd98ee9cadf197054e068500d27/wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2", size = 86721 }, - { url = "https://files.pythonhosted.org/packages/6f/54/f170dfb278fe1c30d0ff864513cff526d624ab8de3254b20abb9cffedc24/wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b", size = 79763 }, - { url = "https://files.pythonhosted.org/packages/4a/98/de07243751f1c4a9b15c76019250210dd3486ce098c3d80d5f729cba029c/wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504", size = 87585 }, - { url = "https://files.pythonhosted.org/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a", size = 36676 }, - { url = "https://files.pythonhosted.org/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845", size = 38871 }, - { url = "https://files.pythonhosted.org/packages/3d/bc/30f903f891a82d402ffb5fda27ec1d621cc97cb74c16fea0b6141f1d4e87/wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192", size = 56312 }, - { url = "https://files.pythonhosted.org/packages/8a/04/c97273eb491b5f1c918857cd26f314b74fc9b29224521f5b83f872253725/wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b", size = 40062 }, - { url = "https://files.pythonhosted.org/packages/4e/ca/3b7afa1eae3a9e7fefe499db9b96813f41828b9fdb016ee836c4c379dadb/wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0", size = 40155 }, - { url = "https://files.pythonhosted.org/packages/89/be/7c1baed43290775cb9030c774bc53c860db140397047cc49aedaf0a15477/wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306", size = 113471 }, - { url = "https://files.pythonhosted.org/packages/32/98/4ed894cf012b6d6aae5f5cc974006bdeb92f0241775addad3f8cd6ab71c8/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb", size = 101208 }, - { url = "https://files.pythonhosted.org/packages/ea/fd/0c30f2301ca94e655e5e057012e83284ce8c545df7661a78d8bfca2fac7a/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681", size = 109339 }, - { url = "https://files.pythonhosted.org/packages/75/56/05d000de894c4cfcb84bcd6b1df6214297b8089a7bd324c21a4765e49b14/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6", size = 110232 }, - { url = "https://files.pythonhosted.org/packages/53/f8/c3f6b2cf9b9277fb0813418e1503e68414cd036b3b099c823379c9575e6d/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6", size = 100476 }, - { url = "https://files.pythonhosted.org/packages/a7/b1/0bb11e29aa5139d90b770ebbfa167267b1fc548d2302c30c8f7572851738/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f", size = 106377 }, - { url = "https://files.pythonhosted.org/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555", size = 37986 }, - { url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750 }, - { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 }, +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3" } +wheels = [ + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ce/b9/0ffd557a92f3b11d4c5d5e0c5e4ad057bd9eb8586615cdaf901409920b14/wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/c0/ef/8be90a0b7e73c32e550c73cfb2fa09db62234227ece47b0e80a05073b375/wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/36/89/0aae34c10fe524cce30fe5fc433210376bce94cf74d05b0d68344c8ba46e/wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/3b/24/11c4510de906d77e0cfb5197f1b1445d4fec42c9a39ea853d482698ac681/wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/71/d7/cfcf842291267bf455b3e266c0c29dcb675b5540ee8b50ba1699abf3af45/wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/d5/66/5d973e9f3e7370fd686fb47a9af3319418ed925c27d72ce16b791231576d/wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a7/d3/8e17bb70f6ae25dabc1aaf990f86824e4fd98ee9cadf197054e068500d27/wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/6f/54/f170dfb278fe1c30d0ff864513cff526d624ab8de3254b20abb9cffedc24/wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/4a/98/de07243751f1c4a9b15c76019250210dd3486ce098c3d80d5f729cba029c/wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/3d/bc/30f903f891a82d402ffb5fda27ec1d621cc97cb74c16fea0b6141f1d4e87/wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/8a/04/c97273eb491b5f1c918857cd26f314b74fc9b29224521f5b83f872253725/wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/4e/ca/3b7afa1eae3a9e7fefe499db9b96813f41828b9fdb016ee836c4c379dadb/wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/89/be/7c1baed43290775cb9030c774bc53c860db140397047cc49aedaf0a15477/wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/32/98/4ed894cf012b6d6aae5f5cc974006bdeb92f0241775addad3f8cd6ab71c8/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ea/fd/0c30f2301ca94e655e5e057012e83284ce8c545df7661a78d8bfca2fac7a/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/75/56/05d000de894c4cfcb84bcd6b1df6214297b8089a7bd324c21a4765e49b14/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/53/f8/c3f6b2cf9b9277fb0813418e1503e68414cd036b3b099c823379c9575e6d/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a7/b1/0bb11e29aa5139d90b770ebbfa167267b1fc548d2302c30c8f7572851738/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c" }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8" }, ] [[package]] name = "zipp" version = "3.21.0" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/50/bad581df71744867e9468ebd0bcd6505de3b275e06f202c2cb016e3ff56f/zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4", size = 24545 } +source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/3f/50/bad581df71744867e9468ebd0bcd6505de3b275e06f202c2cb016e3ff56f/zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931", size = 9630 }, + { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931" }, ] From 8302255babc378e7833eae7cf2b5b50cbc08e247 Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 2 Apr 2025 18:40:10 -0400 Subject: [PATCH 02/19] core goose loop need better prompt --- src/ai_migrate/migrate.py | 140 +++++++++++++++++++++++++++++++++++++- 1 file changed, 138 insertions(+), 2 deletions(-) diff --git a/src/ai_migrate/migrate.py b/src/ai_migrate/migrate.py index ad4388b..8ab3c9d 100644 --- a/src/ai_migrate/migrate.py +++ b/src/ai_migrate/migrate.py @@ -17,7 +17,7 @@ from .context import MigrationContext, ToolCallContext from .fake_llm_client import FakeLLMClient from .git_identity import environment_variables -from .manifest import FileGroup, FileEntry, Manifest +from .manifest import FileGroup, FileEntry, GooseConfig, Manifest from .eval_generator import generate_eval_from_migration @@ -349,6 +349,7 @@ async def run( target_basename: str = "", dont_create_evals: bool = False, tools: list[Tool] = None, + goose: Optional[GooseConfig] = None, ): """Run the migration process on the target files. Args: @@ -529,6 +530,7 @@ async def _run( target_dir_rel_path: Path | str | None = None, target_basename: str = None, tools: list[Tool] = None, + goose_config: Optional[GooseConfig] = None, ): if llm_fakes: client = FakeLLMClient(llm_fakes) @@ -568,6 +570,7 @@ async def _run( messages = combine_examples_into_conversation(examples, target, system_prompt) all_files_to_verify = set() + full_verify_cmd = [] iteration_messages = [] @@ -594,6 +597,7 @@ async def _run( cwd=worktree_root, ) + verification_complete = False for tries in range(int(os.getenv("AI_MIGRATE_MAX_TRIES", 10))): log(f"[agent] Running migration attempt {tries + 1}") @@ -716,6 +720,7 @@ async def _run( ) if verify_process.returncode == 0: + verification_complete = True log("Verification successful") if not dont_create_evals: @@ -789,4 +794,135 @@ async def _run( iteration_messages.append(iteration_message) else: - raise ValueError("Migration failed: Out of tries") + log("Migration failed: Out of tries") + + if verification_complete: + return True + + if goose_config: + for i in range(goose_config.max_retries): + log(f"Running migration attempt {i + 1} with Goose") + + if goose_config.system_prompt: + prompt = Path(goose_config.system_prompt).read_text() + else: + prompt = "" + + await subprocess_run( + ["goose", "run", "--text", prompt, "--with-builtin", "developer"], + check=True, + cwd=worktree_root, + ) + + goose_command = ["goose", "run", "--text", prompt, "--with-builtin", "developer"] + + goose_process = await asyncio.create_subprocess_exec( + *goose_command, + cwd=worktree_root, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + stdout, stderr = await goose_process.communicate() + goose_output = (stderr or stdout or b"").decode() + for line in goose_output.splitlines(): + log(f"[goose] {line}") + + verify_process = await asyncio.create_subprocess_exec( + *full_verify_cmd, + cwd=worktree_root, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + stdout, stderr = await verify_process.communicate() + status = "pass" if verify_process.returncode == 0 else "fail" + + + if target_dir: + git_path = Path(file_path).relative_to(worktree_root) + + # Only allow files inside target_dir_rel_path to be added + await subprocess_run( + ["git", "reset", "--", target_dir_rel_path], + cwd=worktree_root, + ) + + await subprocess_run( + ["git", "add", git_path], + cwd=worktree_root, + ) + else: + for file in written_files: + await subprocess_run( + ["git", "add", *written_files], + cwd=worktree_root, + ) + + commit_message = f"Goose attempt {i + 1} {status=}:\n\nGoose response:\n{goose_output}" + + if target_dir: + file_path = ( + Path(worktree_root) / target_dir_rel_path / target_basename / file + ) + git_path = Path(file_path).relative_to(worktree_root) + await subprocess_run( + ["git", "add", git_path], + cwd=worktree_root, + ) + else: + for file in written_files: + await subprocess_run( + ["git", "add", file], + cwd=worktree_root, + ) + + await subprocess_run( + ["git", "commit", "--allow-empty", "-m", commit_message], + check=True, + cwd=worktree_root, + env={**os.environ, **environment_variables()}, + ) + + # Clean up anything else goose may have added + await subprocess_run( + ["git", "reset", "--hard"], + cwd=worktree_root, + ) + + # Run verification again, in case goose cheated. + verify_process = await asyncio.create_subprocess_exec( + *full_verify_cmd, + cwd=worktree_root, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + stdout, stderr = await verify_process.communicate() + status = "pass" if verify_process.returncode == 0 else "fail" + + verification_output = (stderr or stdout or b"").decode() + await subprocess_run( + [ + "git", + "notes", + "--ref=migrator-verify", + "add", + "-f", + "-m", + verification_output, + ], + check=True, + cwd=worktree_root, + ) + + if verify_process.returncode == 0: + verification_complete = True + log("Verification successful") + break + else: + log("Verification failed:") + for line in verification_output.splitlines(): + log(f"[verify] {line}") + + if verification_complete: + return True + + raise ValueError("Migration failed: Out of tries") \ No newline at end of file From f8fa3875f527d2c29e826e6dca2bb23127364fc7 Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 2 Apr 2025 18:46:14 -0400 Subject: [PATCH 03/19] kill goose after timeout --- src/ai_migrate/migrate.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/ai_migrate/migrate.py b/src/ai_migrate/migrate.py index 8ab3c9d..7d3da6b 100644 --- a/src/ai_migrate/migrate.py +++ b/src/ai_migrate/migrate.py @@ -822,7 +822,23 @@ async def _run( stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) - stdout, stderr = await goose_process.communicate() + + async def kill_after_timeout(): + await asyncio.sleep(goose_config.timeout * 60) + if goose_process.returncode is None: + log(f"[goose] Killing process after {goose_config.timeout} minutes timeout") + goose_process.kill() + + timeout_task = asyncio.create_task(kill_after_timeout()) + + try: + stdout, stderr = await goose_process.communicate() + timeout_task.cancel() + except asyncio.CancelledError: + if goose_process.returncode is None: + goose_process.kill() + raise + goose_output = (stderr or stdout or b"").decode() for line in goose_output.splitlines(): log(f"[goose] {line}") @@ -861,7 +877,7 @@ async def _run( if target_dir: file_path = ( - Path(worktree_root) / target_dir_rel_path / target_basename / file + Path(worktree_root) / target_dir_rel_path / target_basename ) git_path = Path(file_path).relative_to(worktree_root) await subprocess_run( From 6f75214b0fd48124c7526f6b65bdb53451b21985 Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 2 Apr 2025 18:53:19 -0400 Subject: [PATCH 04/19] reasonable goose prompt --- src/ai_migrate/manifest.py | 3 +- src/ai_migrate/migrate.py | 59 ++++++++++++++++++++++++--------- src/ai_migrate/test_manifest.py | 2 -- 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/src/ai_migrate/manifest.py b/src/ai_migrate/manifest.py index 5782ec5..fc237eb 100644 --- a/src/ai_migrate/manifest.py +++ b/src/ai_migrate/manifest.py @@ -70,6 +70,7 @@ def to_file_group(self) -> FileGroup: base_name = self.dir.split("/")[-1] return FileGroup(files=files, result=self.result, base_name=base_name) + class GooseConfig(BaseModel): system_prompt: str = f"{{project_dir}}/{GOOSE_PROMPT_FILE}" time_out_minutes: int = 15 @@ -86,4 +87,4 @@ class Manifest(BaseModel): verify_cmd: str = f"{{py}} {{project_dir}}/{VERIFY_SCRIPT_FILE}" pre_verify_cmd: str = f"{{py}} {{project_dir}}/{VERIFY_SCRIPT_FILE} --pre" time: datetime = Field(default_factory=datetime.now) - goose: GooseConfig = Field(default_factory=GooseConfig) \ No newline at end of file + goose: GooseConfig = Field(default_factory=GooseConfig) diff --git a/src/ai_migrate/migrate.py b/src/ai_migrate/migrate.py index 7d3da6b..c11e464 100644 --- a/src/ai_migrate/migrate.py +++ b/src/ai_migrate/migrate.py @@ -795,26 +795,54 @@ async def _run( else: log("Migration failed: Out of tries") - + if verification_complete: return True - + if goose_config: for i in range(goose_config.max_retries): log(f"Running migration attempt {i + 1} with Goose") if goose_config.system_prompt: - prompt = Path(goose_config.system_prompt).read_text() + goose_extra = Path(goose_config.system_prompt).read_text() else: - prompt = "" + goose_extra = "" + + directory_instructions = ( + f"You may only make changes to the files inside {target_dir_rel_path}" + if target_dir + else f"You may only make changes to the files: {', '.join(target_files)}" + ) + + verify_cmd_str = " ".join(full_verify_cmd) + + goose_prompt = f""" +You are a helpful assistant that can help with code migration. The migration is almost done but is not passing verification. With as few changes as possible, make the migration pass verification. + +{directory_instructions} + +You may verify if the migration is corrrect by running the following command: + +{verify_cmd_str} +""" + + if goose_extra: + goose_prompt += f"\n\n{goose_extra}" await subprocess_run( - ["goose", "run", "--text", prompt, "--with-builtin", "developer"], + ["goose", "run", "--text", goose_prompt, "--with-builtin", "developer"], check=True, cwd=worktree_root, ) - goose_command = ["goose", "run", "--text", prompt, "--with-builtin", "developer"] + goose_command = [ + "goose", + "run", + "--text", + goose_prompt, + "--with-builtin", + "developer", + ] goose_process = await asyncio.create_subprocess_exec( *goose_command, @@ -826,11 +854,13 @@ async def _run( async def kill_after_timeout(): await asyncio.sleep(goose_config.timeout * 60) if goose_process.returncode is None: - log(f"[goose] Killing process after {goose_config.timeout} minutes timeout") + log( + f"[goose] Killing process after {goose_config.timeout} minutes timeout" + ) goose_process.kill() timeout_task = asyncio.create_task(kill_after_timeout()) - + try: stdout, stderr = await goose_process.communicate() timeout_task.cancel() @@ -838,7 +868,7 @@ async def kill_after_timeout(): if goose_process.returncode is None: goose_process.kill() raise - + goose_output = (stderr or stdout or b"").decode() for line in goose_output.splitlines(): log(f"[goose] {line}") @@ -851,7 +881,6 @@ async def kill_after_timeout(): ) stdout, stderr = await verify_process.communicate() status = "pass" if verify_process.returncode == 0 else "fail" - if target_dir: git_path = Path(file_path).relative_to(worktree_root) @@ -873,12 +902,12 @@ async def kill_after_timeout(): cwd=worktree_root, ) - commit_message = f"Goose attempt {i + 1} {status=}:\n\nGoose response:\n{goose_output}" + commit_message = ( + f"Goose attempt {i + 1} {status=}:\n\nGoose response:\n{goose_output}" + ) if target_dir: - file_path = ( - Path(worktree_root) / target_dir_rel_path / target_basename - ) + file_path = Path(worktree_root) / target_dir_rel_path / target_basename git_path = Path(file_path).relative_to(worktree_root) await subprocess_run( ["git", "add", git_path], @@ -941,4 +970,4 @@ async def kill_after_timeout(): if verification_complete: return True - raise ValueError("Migration failed: Out of tries") \ No newline at end of file + raise ValueError("Migration failed: Out of tries") diff --git a/src/ai_migrate/test_manifest.py b/src/ai_migrate/test_manifest.py index 1da3726..517f615 100644 --- a/src/ai_migrate/test_manifest.py +++ b/src/ai_migrate/test_manifest.py @@ -99,13 +99,11 @@ def test_valid_manifest_groups(): # The hash should be different because the glob pattern is different assert dir_glob_group_name.split("-")[1] != dir_group_name.split("-")[1] - assert manifest.goose.system_prompt == "{project_dir}/goose_prompt.md" assert manifest.goose.time_out_minutes == 15 assert manifest.goose.max_retries == 3 - def test_normalize_files(): """Test that Directory.to_file_group correctly converts Directory objects to FileGroup objects.""" From 30e0b9750cf204776b2130a02ab565caffcaf793 Mon Sep 17 00:00:00 2001 From: David Katz Date: Wed, 2 Apr 2025 18:55:05 -0400 Subject: [PATCH 05/19] rm verification complete --- src/ai_migrate/migrate.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/ai_migrate/migrate.py b/src/ai_migrate/migrate.py index c11e464..9a4fe07 100644 --- a/src/ai_migrate/migrate.py +++ b/src/ai_migrate/migrate.py @@ -597,7 +597,6 @@ async def _run( cwd=worktree_root, ) - verification_complete = False for tries in range(int(os.getenv("AI_MIGRATE_MAX_TRIES", 10))): log(f"[agent] Running migration attempt {tries + 1}") @@ -720,7 +719,6 @@ async def _run( ) if verify_process.returncode == 0: - verification_complete = True log("Verification successful") if not dont_create_evals: @@ -796,9 +794,6 @@ async def _run( else: log("Migration failed: Out of tries") - if verification_complete: - return True - if goose_config: for i in range(goose_config.max_retries): log(f"Running migration attempt {i + 1} with Goose") @@ -959,15 +954,11 @@ async def kill_after_timeout(): ) if verify_process.returncode == 0: - verification_complete = True log("Verification successful") - break + return True else: log("Verification failed:") for line in verification_output.splitlines(): log(f"[verify] {line}") - if verification_complete: - return True - raise ValueError("Migration failed: Out of tries") From d8ec6f9477fbe9055ed8cc3035c4a0403517d7eb Mon Sep 17 00:00:00 2001 From: David Katz Date: Thu, 3 Apr 2025 11:10:29 -0400 Subject: [PATCH 06/19] goose config + system dir fixed --- src/ai_migrate/migrate.py | 11 ++++++----- src/ai_migrate/projects.py | 3 +++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/ai_migrate/migrate.py b/src/ai_migrate/migrate.py index 9a4fe07..f718968 100644 --- a/src/ai_migrate/migrate.py +++ b/src/ai_migrate/migrate.py @@ -455,6 +455,7 @@ async def run( target_dir_rel_path=target_dir_rel_path, target_basename=target_basename, tools=tools, + goose=goose, ) @@ -530,7 +531,7 @@ async def _run( target_dir_rel_path: Path | str | None = None, target_basename: str = None, tools: list[Tool] = None, - goose_config: Optional[GooseConfig] = None, + goose: Optional[GooseConfig] = None, ): if llm_fakes: client = FakeLLMClient(llm_fakes) @@ -794,12 +795,12 @@ async def _run( else: log("Migration failed: Out of tries") - if goose_config: - for i in range(goose_config.max_retries): + if goose: + for i in range(goose.max_retries): log(f"Running migration attempt {i + 1} with Goose") - if goose_config.system_prompt: - goose_extra = Path(goose_config.system_prompt).read_text() + if goose.system_prompt: + goose_extra = Path(goose.system_prompt).read_text() else: goose_extra = "" diff --git a/src/ai_migrate/projects.py b/src/ai_migrate/projects.py index 580e0fe..997ba94 100644 --- a/src/ai_migrate/projects.py +++ b/src/ai_migrate/projects.py @@ -150,6 +150,8 @@ async def process_one_fileset(index, files: FileGroup, task_name: str): status_manager.get_logger(task_name, header=f"==> {log_file} <=="), log_buffer, ) + if manifest.goose: + manifest.goose.system_prompt = manifest.goose.system_prompt.format(project_dir=project_dir) try: await run_migration( @@ -169,6 +171,7 @@ async def process_one_fileset(index, files: FileGroup, task_name: str): target_dir=manifest.target_dir, target_basename=files.base_name, tools=tools, + goose=manifest.goose, ) new_result = "pass" await status_manager.mark_with_status(task_name, Status.PASSED) From 5eadaa1a873cb975330ed9938c3badbabd5a98c3 Mon Sep 17 00:00:00 2001 From: David Katz Date: Thu, 3 Apr 2025 11:14:02 -0400 Subject: [PATCH 07/19] more logistical fixes --- src/ai_migrate/migrate.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/ai_migrate/migrate.py b/src/ai_migrate/migrate.py index f718968..95c1b99 100644 --- a/src/ai_migrate/migrate.py +++ b/src/ai_migrate/migrate.py @@ -813,23 +813,25 @@ async def _run( verify_cmd_str = " ".join(full_verify_cmd) goose_prompt = f""" -You are a helpful assistant that can help with code migration. The migration is almost done but is not passing verification. With as few changes as possible, make the migration pass verification. +You are a helpful assistant fo code migration. The migration is almost done but is not passing verification. With as few changes as possible, make the migration pass verification. {directory_instructions} -You may verify if the migration is corrrect by running the following command: +You may verify if the migration is correct by running the following command: {verify_cmd_str} + +Keep trying until the migration passes verification. """ if goose_extra: goose_prompt += f"\n\n{goose_extra}" - await subprocess_run( - ["goose", "run", "--text", goose_prompt, "--with-builtin", "developer"], - check=True, - cwd=worktree_root, - ) + # await subprocess_run( + # ["goose", "run", "--text", goose_prompt, "--with-builtin", "developer"], + # check=True, + # cwd=worktree_root, + # ) goose_command = [ "goose", @@ -848,10 +850,10 @@ async def _run( ) async def kill_after_timeout(): - await asyncio.sleep(goose_config.timeout * 60) + await asyncio.sleep(goose.timeout * 60) if goose_process.returncode is None: log( - f"[goose] Killing process after {goose_config.timeout} minutes timeout" + f"[goose] Killing process after {goose.timeout} minutes timeout" ) goose_process.kill() From 5a567293ac73480cf29cc880cb2376a21d78aa41 Mon Sep 17 00:00:00 2001 From: David Katz Date: Thu, 3 Apr 2025 11:27:40 -0400 Subject: [PATCH 08/19] fix missing verify cmd --- src/ai_migrate/migrate.py | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/ai_migrate/migrate.py b/src/ai_migrate/migrate.py index 95c1b99..99408c7 100644 --- a/src/ai_migrate/migrate.py +++ b/src/ai_migrate/migrate.py @@ -571,7 +571,19 @@ async def _run( messages = combine_examples_into_conversation(examples, target, system_prompt) all_files_to_verify = set() - full_verify_cmd = [] + + def build_verify_cmd(all_files_to_verify: set[str]): + if target_dir: + return [ + *verify_cmd, + str(Path(target_dir_rel_path) / target_basename), + ] + return [ + *verify_cmd, + *[str(Path(worktree_root) / f) for f in all_files_to_verify], + ] + + full_verify_cmd = build_verify_cmd(all_files_to_verify) iteration_messages = [] @@ -656,17 +668,7 @@ async def _run( all_files_to_verify |= written_files - # Add the files to verify with the correct paths - if target_dir: - full_verify_cmd = [ - *verify_cmd, - str(Path(target_dir_rel_path) / target_basename), - ] - else: - full_verify_cmd = [ - *verify_cmd, - *[str(Path(worktree_root) / f) for f in all_files_to_verify], - ] + full_verify_cmd = build_verify_cmd(all_files_to_verify) log(f"Running verification: {full_verify_cmd}") verify_process = await asyncio.create_subprocess_exec( @@ -805,11 +807,13 @@ async def _run( goose_extra = "" directory_instructions = ( - f"You may only make changes to the files inside {target_dir_rel_path}" + f"You may only make changes to the files inside {target_dir_rel_path}/{target_basename}" if target_dir else f"You may only make changes to the files: {', '.join(target_files)}" ) + log(full_verify_cmd) + verify_cmd_str = " ".join(full_verify_cmd) goose_prompt = f""" @@ -842,6 +846,9 @@ async def _run( "developer", ] + log(directory_instructions) + log(f"Running goose: {goose_command}") + goose_process = await asyncio.create_subprocess_exec( *goose_command, cwd=worktree_root, From 85987037f3c9796f0124b22a8b28c7f8c9e83358 Mon Sep 17 00:00:00 2001 From: David Katz Date: Thu, 3 Apr 2025 11:34:29 -0400 Subject: [PATCH 09/19] fix log --- src/ai_migrate/migrate.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/ai_migrate/migrate.py b/src/ai_migrate/migrate.py index 99408c7..d057f94 100644 --- a/src/ai_migrate/migrate.py +++ b/src/ai_migrate/migrate.py @@ -812,12 +812,10 @@ def build_verify_cmd(all_files_to_verify: set[str]): else f"You may only make changes to the files: {', '.join(target_files)}" ) - log(full_verify_cmd) - verify_cmd_str = " ".join(full_verify_cmd) goose_prompt = f""" -You are a helpful assistant fo code migration. The migration is almost done but is not passing verification. With as few changes as possible, make the migration pass verification. +You are a helpful assistant for code migration. The migration is almost done but is not passing verification. With as few changes as possible, make the migration pass verification. {directory_instructions} @@ -846,7 +844,6 @@ def build_verify_cmd(all_files_to_verify: set[str]): "developer", ] - log(directory_instructions) log(f"Running goose: {goose_command}") goose_process = await asyncio.create_subprocess_exec( From 88c6d78d098ef175f497f1d473b2159ac74bafce Mon Sep 17 00:00:00 2001 From: David Katz Date: Thu, 3 Apr 2025 11:40:41 -0400 Subject: [PATCH 10/19] fix streaming --- src/ai_migrate/manifest.py | 2 +- src/ai_migrate/migrate.py | 33 ++++++++++++++++++++++++++------- src/ai_migrate/test_manifest.py | 4 ++-- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/ai_migrate/manifest.py b/src/ai_migrate/manifest.py index fc237eb..0ea3685 100644 --- a/src/ai_migrate/manifest.py +++ b/src/ai_migrate/manifest.py @@ -73,7 +73,7 @@ def to_file_group(self) -> FileGroup: class GooseConfig(BaseModel): system_prompt: str = f"{{project_dir}}/{GOOSE_PROMPT_FILE}" - time_out_minutes: int = 15 + timeout_seconds: int = 15 * 60 max_retries: int = 3 diff --git a/src/ai_migrate/migrate.py b/src/ai_migrate/migrate.py index d057f94..676d75e 100644 --- a/src/ai_migrate/migrate.py +++ b/src/ai_migrate/migrate.py @@ -854,26 +854,45 @@ def build_verify_cmd(all_files_to_verify: set[str]): ) async def kill_after_timeout(): - await asyncio.sleep(goose.timeout * 60) + await asyncio.sleep(goose.timeout_seconds) if goose_process.returncode is None: log( - f"[goose] Killing process after {goose.timeout} minutes timeout" + f"[goose] Killing process after {goose.timeout_seconds} seconds timeout" ) goose_process.kill() timeout_task = asyncio.create_task(kill_after_timeout()) - + + # Stream and collect output + output_lines = [] + + async def read_stream(stream, prefix): + while True: + line = await stream.readline() + if not line: + break + decoded = line.decode().rstrip() + log(f"[{prefix}] {decoded}") + output_lines.append(decoded) + + # Create tasks for reading stdout and stderr + stdout_task = asyncio.create_task(read_stream(goose_process.stdout, "goose")) + stderr_task = asyncio.create_task(read_stream(goose_process.stderr, "goose-err")) + try: - stdout, stderr = await goose_process.communicate() + # Wait for process to complete and streams to be fully read + await goose_process.wait() + await stdout_task + await stderr_task timeout_task.cancel() except asyncio.CancelledError: if goose_process.returncode is None: goose_process.kill() + stdout_task.cancel() + stderr_task.cancel() raise - goose_output = (stderr or stdout or b"").decode() - for line in goose_output.splitlines(): - log(f"[goose] {line}") + goose_output = "\n".join(output_lines) verify_process = await asyncio.create_subprocess_exec( *full_verify_cmd, diff --git a/src/ai_migrate/test_manifest.py b/src/ai_migrate/test_manifest.py index 517f615..738334e 100644 --- a/src/ai_migrate/test_manifest.py +++ b/src/ai_migrate/test_manifest.py @@ -61,7 +61,7 @@ def test_valid_manifest_groups(): "time": "2025-02-10T11:26:33.969758", "goose": { "system_prompt": "{project_dir}/goose_prompt.md", - "time_out_minutes": 15, + "timeout_seconds": 100, "max_retries": 3 } } @@ -100,7 +100,7 @@ def test_valid_manifest_groups(): assert dir_glob_group_name.split("-")[1] != dir_group_name.split("-")[1] assert manifest.goose.system_prompt == "{project_dir}/goose_prompt.md" - assert manifest.goose.time_out_minutes == 15 + assert manifest.goose.timeout_seconds == 100 assert manifest.goose.max_retries == 3 From 7923131b1d92c2d1ac266eb7466398134503529d Mon Sep 17 00:00:00 2001 From: David Katz Date: Thu, 3 Apr 2025 12:26:07 -0400 Subject: [PATCH 11/19] disable worktree reset + fix some goose git --- src/ai_migrate/migrate.py | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/src/ai_migrate/migrate.py b/src/ai_migrate/migrate.py index 676d75e..39b8b4e 100644 --- a/src/ai_migrate/migrate.py +++ b/src/ai_migrate/migrate.py @@ -432,11 +432,12 @@ async def run( check=True, cwd=git_root, ) - await subprocess_run( - ["git", "checkout", "--force", "-B", branch, start_point], - check=True, - cwd=worktree_root, - ) + # Temporarily don't checkout branch. Lets us skip to goose + # await subprocess_run( + # ["git", "checkout", "--force", "-B", branch, start_point], + # check=True, + # cwd=worktree_root, + # ) # If using target_dir, read files from original location instead of worktree target_root = source_git_root if target_dir else worktree_root @@ -892,16 +893,7 @@ async def read_stream(stream, prefix): stderr_task.cancel() raise - goose_output = "\n".join(output_lines) - - verify_process = await asyncio.create_subprocess_exec( - *full_verify_cmd, - cwd=worktree_root, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - stdout, stderr = await verify_process.communicate() - status = "pass" if verify_process.returncode == 0 else "fail" + goose_output = "\n".join(output_lines[-50:]) if target_dir: git_path = Path(file_path).relative_to(worktree_root) @@ -924,12 +916,11 @@ async def read_stream(stream, prefix): ) commit_message = ( - f"Goose attempt {i + 1} {status=}:\n\nGoose response:\n{goose_output}" + f"Goose attempt {i + 1}:\n\nGoose response:\n{goose_output}" ) if target_dir: - file_path = Path(worktree_root) / target_dir_rel_path / target_basename - git_path = Path(file_path).relative_to(worktree_root) + git_path = Path(target_dir_rel_path) / target_basename await subprocess_run( ["git", "add", git_path], cwd=worktree_root, @@ -948,13 +939,12 @@ async def read_stream(stream, prefix): env={**os.environ, **environment_variables()}, ) - # Clean up anything else goose may have added + # Clean up anything else goose may have added + run verification directly await subprocess_run( ["git", "reset", "--hard"], cwd=worktree_root, ) - # Run verification again, in case goose cheated. verify_process = await asyncio.create_subprocess_exec( *full_verify_cmd, cwd=worktree_root, @@ -962,7 +952,6 @@ async def read_stream(stream, prefix): stderr=subprocess.PIPE, ) stdout, stderr = await verify_process.communicate() - status = "pass" if verify_process.returncode == 0 else "fail" verification_output = (stderr or stdout or b"").decode() await subprocess_run( From 833062d7b75ae186bf6e2264d91d583038074a37 Mon Sep 17 00:00:00 2001 From: David Katz Date: Thu, 3 Apr 2025 13:31:48 -0400 Subject: [PATCH 12/19] fix git cmd, prompt --- src/ai_migrate/migrate.py | 44 ++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/ai_migrate/migrate.py b/src/ai_migrate/migrate.py index 39b8b4e..2e21e6b 100644 --- a/src/ai_migrate/migrate.py +++ b/src/ai_migrate/migrate.py @@ -808,9 +808,9 @@ def build_verify_cmd(all_files_to_verify: set[str]): goose_extra = "" directory_instructions = ( - f"You may only make changes to the files inside {target_dir_rel_path}/{target_basename}" + f"You may only make changes to the files inside {target_dir_rel_path}/{target_basename}. Under no circumstances should you touch any files outside of this directory. If I detect that you do, I will be very disappointed in you and you will be fired." if target_dir - else f"You may only make changes to the files: {', '.join(target_files)}" + else f"You may only make changes to the files: {', '.join(target_files)}. Under no circumstances should you touch any other files." ) verify_cmd_str = " ".join(full_verify_cmd) @@ -824,6 +824,8 @@ def build_verify_cmd(all_files_to_verify: set[str]): {verify_cmd_str} +The verification output may be large so pipe it to a file and read it from there. + Keep trying until the migration passes verification. """ @@ -895,25 +897,25 @@ async def read_stream(stream, prefix): goose_output = "\n".join(output_lines[-50:]) - if target_dir: - git_path = Path(file_path).relative_to(worktree_root) - - # Only allow files inside target_dir_rel_path to be added - await subprocess_run( - ["git", "reset", "--", target_dir_rel_path], - cwd=worktree_root, - ) - - await subprocess_run( - ["git", "add", git_path], - cwd=worktree_root, - ) - else: - for file in written_files: - await subprocess_run( - ["git", "add", *written_files], - cwd=worktree_root, - ) + # if target_dir: + # git_path = Path(file_path).relative_to(worktree_root) + + # # Only allow files inside target_dir_rel_path to be added + # await subprocess_run( + # ["git", "reset", "--", target_dir_rel_path], + # cwd=worktree_root, + # ) + + # await subprocess_run( + # ["git", "add", git_path], + # cwd=worktree_root, + # ) + # else: + # for file in written_files: + # await subprocess_run( + # ["git", "add", *written_files], + # cwd=worktree_root, + # ) commit_message = ( f"Goose attempt {i + 1}:\n\nGoose response:\n{goose_output}" From eccd627869cba48d50732beb5569ce7936988c2c Mon Sep 17 00:00:00 2001 From: David Katz Date: Thu, 3 Apr 2025 13:50:55 -0400 Subject: [PATCH 13/19] verify output --- src/ai_migrate/migrate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ai_migrate/migrate.py b/src/ai_migrate/migrate.py index 2e21e6b..3fb925d 100644 --- a/src/ai_migrate/migrate.py +++ b/src/ai_migrate/migrate.py @@ -824,7 +824,7 @@ def build_verify_cmd(all_files_to_verify: set[str]): {verify_cmd_str} -The verification output may be large so pipe it to a file and read it from there. +The verification output may be large so pipe it to a file verification_output.txt and read it from there. Keep trying until the migration passes verification. """ From 69dbcd0d80c69e109c631525d698521164d8b6f0 Mon Sep 17 00:00:00 2001 From: David Katz Date: Fri, 4 Apr 2025 17:01:24 -0400 Subject: [PATCH 14/19] git intr with exit code --- src/ai_migrate/migrate.py | 70 +-- src/ai_migrate/migrate.py.bak | 981 ++++++++++++++++++++++++++++++++++ 2 files changed, 1005 insertions(+), 46 deletions(-) create mode 100644 src/ai_migrate/migrate.py.bak diff --git a/src/ai_migrate/migrate.py b/src/ai_migrate/migrate.py index 3fb925d..bd73c48 100644 --- a/src/ai_migrate/migrate.py +++ b/src/ai_migrate/migrate.py @@ -799,6 +799,8 @@ def build_verify_cmd(all_files_to_verify: set[str]): log("Migration failed: Out of tries") if goose: + best_exit_code = float('inf') # Track best exit code so far + for i in range(goose.max_retries): log(f"Running migration attempt {i + 1} with Goose") @@ -832,12 +834,6 @@ def build_verify_cmd(all_files_to_verify: set[str]): if goose_extra: goose_prompt += f"\n\n{goose_extra}" - # await subprocess_run( - # ["goose", "run", "--text", goose_prompt, "--with-builtin", "developer"], - # check=True, - # cwd=worktree_root, - # ) - goose_command = [ "goose", "run", @@ -866,7 +862,6 @@ async def kill_after_timeout(): timeout_task = asyncio.create_task(kill_after_timeout()) - # Stream and collect output output_lines = [] async def read_stream(stream, prefix): @@ -878,12 +873,10 @@ async def read_stream(stream, prefix): log(f"[{prefix}] {decoded}") output_lines.append(decoded) - # Create tasks for reading stdout and stderr stdout_task = asyncio.create_task(read_stream(goose_process.stdout, "goose")) stderr_task = asyncio.create_task(read_stream(goose_process.stderr, "goose-err")) try: - # Wait for process to complete and streams to be fully read await goose_process.wait() await stdout_task await stderr_task @@ -897,28 +890,28 @@ async def read_stream(stream, prefix): goose_output = "\n".join(output_lines[-50:]) - # if target_dir: - # git_path = Path(file_path).relative_to(worktree_root) - - # # Only allow files inside target_dir_rel_path to be added - # await subprocess_run( - # ["git", "reset", "--", target_dir_rel_path], - # cwd=worktree_root, - # ) - - # await subprocess_run( - # ["git", "add", git_path], - # cwd=worktree_root, - # ) - # else: - # for file in written_files: - # await subprocess_run( - # ["git", "add", *written_files], - # cwd=worktree_root, - # ) + verify_process = await asyncio.create_subprocess_exec( + *full_verify_cmd, + cwd=worktree_root, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + stdout, stderr = await verify_process.communicate() + verification_output = (stderr or stdout or b"").decode() + current_exit_code = verify_process.returncode + + if current_exit_code > best_exit_code and best_exit_code != 0: + log(f"Exit code {current_exit_code} is worse than previous best {best_exit_code}, resetting changes") + await subprocess_run( + ["git", "reset", "--hard"], + cwd=worktree_root, + ) + continue + + best_exit_code = min(best_exit_code, current_exit_code) commit_message = ( - f"Goose attempt {i + 1}:\n\nGoose response:\n{goose_output}" + f"Goose attempt {i + 1}, remaining tests: {current_exit_code}:\n\nGoose response:\n{goose_output}" ) if target_dir: @@ -941,21 +934,6 @@ async def read_stream(stream, prefix): env={**os.environ, **environment_variables()}, ) - # Clean up anything else goose may have added + run verification directly - await subprocess_run( - ["git", "reset", "--hard"], - cwd=worktree_root, - ) - - verify_process = await asyncio.create_subprocess_exec( - *full_verify_cmd, - cwd=worktree_root, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - stdout, stderr = await verify_process.communicate() - - verification_output = (stderr or stdout or b"").decode() await subprocess_run( [ "git", @@ -970,11 +948,11 @@ async def read_stream(stream, prefix): cwd=worktree_root, ) - if verify_process.returncode == 0: + if current_exit_code == 0: log("Verification successful") return True else: - log("Verification failed:") + log(f"Verification failed with {current_exit_code} remaining test steps:") for line in verification_output.splitlines(): log(f"[verify] {line}") diff --git a/src/ai_migrate/migrate.py.bak b/src/ai_migrate/migrate.py.bak new file mode 100644 index 0000000..3fb925d --- /dev/null +++ b/src/ai_migrate/migrate.py.bak @@ -0,0 +1,981 @@ +import asyncio +import contextvars +import os +import shutil +import sys +import tempfile +import traceback +from dataclasses import dataclass +from pathlib import Path +import subprocess +from typing import Any, Iterable, Optional + +from pydantic_ai.messages import ToolCallPart +from pydantic_ai.tools import Tool + +from ai_migrate.llm_providers import DefaultClient +from .context import MigrationContext, ToolCallContext +from .fake_llm_client import FakeLLMClient +from .git_identity import environment_variables +from .manifest import FileGroup, FileEntry, GooseConfig, Manifest +from .eval_generator import generate_eval_from_migration + + +ROLE_ASSISTANT = "assistant" +ROLE_USER = "user" + +LOG_STREAM = contextvars.ContextVar("LOG_STREAM", default=sys.stdout) + + +def log(*args, **kwargs): + print(*args, **kwargs, file=LOG_STREAM.get(), flush=True) + + +@dataclass +class FileContent: + name: str + content: str + + +@dataclass +class MigrationExample: + name: Optional[str] + old_files: list[FileContent] + new_files: list[FileContent] + + +def read_file_pairs_from(examples_dir: str | Path) -> Iterable[MigrationExample]: + """ + Read pairs of files from the examples directory, matching .old and .new directories. + Returns an Iterable of MigrationExample containing all files in each directory pair. + + Sample dir: + examples/ + example1.old/ + src/ + file1.py + file2.py + example1.new/ + src/ + file1.py + file2.py + single.old.py + single.new.py + + Args: + examples_dir: Directory containing example migration pairs + + Returns: + Iterable[MigrationExample]: Iterator of migration examples + """ + examples_dir = Path(examples_dir) + + def get_files_recursively(directory: Path) -> list[FileContent]: + """Recursively get all files in a directory, maintaining relative paths.""" + files = [] + for item in directory.rglob("*"): + if item.is_file(): + relative_path = item.relative_to(directory) + files.append( + FileContent(name=str(relative_path), content=item.read_text()) + ) + return files + + old_dirs = [ + d for d in examples_dir.iterdir() if d.is_dir() and d.name.endswith(".old") + ] + + for old_dir in old_dirs: + base_name = old_dir.name.removesuffix(".old") + new_dir = old_dir.parent / f"{base_name}.new" + + if new_dir.exists() and new_dir.is_dir(): + old_files = get_files_recursively(old_dir) + new_files = get_files_recursively(new_dir) + + yield MigrationExample( + name=base_name, old_files=old_files, new_files=new_files + ) + + for file in examples_dir.iterdir(): + if file.is_file() and ".old." in file.name: + base, ext = file.name.split(".old.", 1) + new_file = file.parent / f"{base}.new.{ext}" + + if new_file.exists(): + old_content = FileContent( + name=f"{base}.{ext}", content=file.read_text() + ) + new_content = FileContent( + name=f"{base}.{ext}", content=new_file.read_text() + ) + + yield MigrationExample( + name=base, old_files=[old_content], new_files=[new_content] + ) + + +NBSP_REPLACEMENT_TOKEN = "" + + +def escape_nbsp(text: str) -> str: + """LLMs tokenize these as regular spaces. In source code they need to be preserved.""" + return text.replace("\u00a0", "") + + +def un_escape_nbsp(text: str) -> str: + """LLMs tokenize these as regular spaces. In source code they need to be preserved.""" + return text.replace("", "\u00a0") + + +LANGUAGE_EXTENSIONS = { + "bash": [".sh", ".bash"], + "python": [".py", ".pyx", ".pyi"], + "ruby": [".rb", ".rake"], + "javascript": [".js", ".jsx", ".mjs"], + "css": [".css", ".cssx"], + "html": [".html", ".htm", ".htmx"], + "typescript": [".ts", ".tsx"], + "java": [".java"], + "go": [".go"], + "rust": [".rs"], + "php": [".php"], + "swift": [".swift"], + "kotlin": [".kt", ".kts"], + "gradle": [".grad"], + "terraform": [".tf"], +} + + +def detect_language(filename: str) -> str: + extension = Path(filename).suffix + for language, extensions in LANGUAGE_EXTENSIONS.items(): + for e in extensions: + if e == extension: + return language + return "" + + +def wrap_in_code_block(text: str, filename: str | None) -> str: + language = detect_language(filename) + code_block = f"```{language}\n{text.strip()}\n```" + if filename: + code_block = f"### `{filename}`\n{code_block}" + return code_block + + +def migrate_prompt(example: MigrationExample) -> list[dict]: + """ + Create a prompt for migrating code based on a MigrationExample. + + Args: + example: MigrationExample containing old and new files + + Returns: + List of messages for the LLM conversation + """ + old_file_contents = "\n\n".join( + wrap_in_code_block(fc.content, fc.name) for fc in example.old_files + ) + user_message = { + "role": ROLE_USER, + "content": f"Migrate this code to the new format:\n\n{escape_nbsp(old_file_contents)}. " + "Return the full content for all files mentioned, don't leave anything out. " + "You can rename a file if necessary.", + } + + if example.new_files: + new_file_blocks = [ + wrap_in_code_block(fc.content, fc.name) for fc in example.new_files + ] + new_file_contents = "\n\n".join(new_file_blocks) + assistant_message = { + "role": ROLE_ASSISTANT, + "content": f"Here's the migrated code:\n{escape_nbsp(new_file_contents)}", + } + return [user_message, assistant_message] + return [user_message] + + +async def handle_tool_calls( + tools: list[Tool], tool_calls: list[dict[str, Any]], context: MigrationContext +) -> list[dict[str, str]]: + tool_results = [] + tools_by_name = {tool.name: tool for tool in tools} + for tool_call in tool_calls: + tool_call_message = ToolCallPart( + tool_call["function"]["name"], tool_call["function"]["arguments"] + ) + function = tool_call["function"] + if tool := tools_by_name.get(function["name"]): + try: + log("[agent] Running tool", tool.name, f"{tool_call_message=}") + result = await tool._run( + tool_call_message, + ToolCallContext( + deps=context, + model=None, + usage=None, + prompt="", + ), + ) + log("[agent] Tool result", result) + tool_results.append( + { + "tool_call_id": tool_call["id"], + "output": str(result.content), + } + ) + except Exception as e: + log( + "[agent] Error processing tool call", str(e), traceback.format_exc() + ) + tool_results.append( + { + "tool_call_id": tool_call["id"], + "output": f"Error processing tool call: {str(e)}", + } + ) + else: + tool_results.append( + { + "tool_call_id": tool_call["id"], + "output": f"Unknown tool call: {tool_call['function']['name']}", + } + ) + return tool_results + + +def combine_examples_into_conversation( + examples: list[MigrationExample], + target: MigrationExample, + system_prompt: str, +) -> list[dict]: + messages = [{"role": "system", "content": system_prompt}] + + for example in examples: + messages.extend(migrate_prompt(example)) + + messages.extend(migrate_prompt(target)) + + return messages + + +async def call_llm( + client: DefaultClient, + messages: list, + tools: list[Tool], + *, + context: MigrationContext, + temperature=0.1, +) -> tuple[dict, list[dict]]: + """Call LLM for completions + + Returns the response and the messages so far + """ + while True: + response, messages = await client.generate_completion( + messages=messages, + tools=[await tool.prepare_tool_def(None) for tool in tools], + temperature=temperature, + ) + + assistant_message = response["choices"][0]["message"] + + if not (tool_calls := assistant_message.get("tool_calls")): + return response, messages + + tool_results = await handle_tool_calls(tools, tool_calls, context) + + messages.append(assistant_message) + for result in tool_results: + messages.append( + { + "role": "tool", + "tool_call_id": result["tool_call_id"], + "content": result["output"], + } + ) + + for message in messages: + if message.get("content") == "": + del message["content"] + + +def filter_lines(text, match): + return "\n".join(line for line in text.splitlines() if match in line) + + +async def subprocess_run(cmd, prefix=None, **kwargs) -> str: + if not kwargs.get("stderr"): + kwargs["stderr"] = subprocess.STDOUT + kwargs["stdout"] = subprocess.PIPE + check = False + if "check" in kwargs: + check = kwargs.pop("check") + env = kwargs.pop("env", {}) + env = {**os.environ, "PYTHONUNBUFFERED": "1", **env} + process = await asyncio.create_subprocess_exec( + *cmd, + **kwargs, + env=env, + ) + stdout = [] + if not prefix: + prefix = cmd[0] + while not process.stdout.at_eof(): + data = await process.stdout.readline() + if not data: + break + line = data.decode().removesuffix("\n") + log(f"[{prefix}] {line}") + stdout.append(line) + await process.wait() + if check and process.returncode != 0: + raise subprocess.CalledProcessError(process.returncode, cmd) + return "\n".join(stdout) + + +async def run( + target_files: list[str], + system_prompt, + examples_dir, + verify_cmd, + pre_verify_cmd, + log_stream, + local_worktrees, + llm_fakes, + target_dir: str = "", + target_basename: str = "", + dont_create_evals: bool = False, + tools: list[Tool] = None, + goose: Optional[GooseConfig] = None, +): + """Run the migration process on the target files. + Args: + target_files: List of files to migrate + system_prompt: System prompt for the LLM + examples_dir: Directory containing example migrations + verify_cmd: Command to verify the migrated files + pre_verify_cmd: Command to run before migration + log_stream: Stream to write logs to + local_worktrees: Whether to create worktrees locally + dont_create_evals: If True, don't automatically create evaluations after successful migrations + """ + if log_stream: + LOG_STREAM.set(log_stream) + + source_git_root = Path( + ( + await subprocess_run(["git", "rev-parse", "--show-toplevel"], check=True) + ).strip() + ) + source_start_point = ( + await subprocess_run(["git", "rev-parse", "HEAD"], check=True) + ).strip() + + # If target_dir is specified, use it as the git root for the output + if target_dir: + target_dir_path = Path(target_dir) + try: + if not target_dir_path.exists(): + target_dir_path.mkdir(parents=True, exist_ok=True) + + target_git_root = Path( + ( + await subprocess_run( + ["git", "rev-parse", "--show-toplevel"], + check=True, + cwd=str(target_dir_path), + ) + ).strip() + ) + start_point = ( + await subprocess_run( + ["git", "rev-parse", "HEAD"], check=True, cwd=str(target_git_root) + ) + ).strip() + + target_dir_rel_path = target_dir_path.resolve().relative_to( + target_git_root.resolve() + ) + + git_root = target_git_root + except Exception as e: + log(f"Error finding git repository: {e}") + raise ValueError( + f"Error: target_dir '{target_dir}' is not in a git repository." + ) + else: + # Use the source repository as the git root + git_root = source_git_root + start_point = source_start_point + target_dir_rel_path = None + + # Get the relative paths of the target files + targets_in_repo = [ + Path(target_file).resolve().relative_to(source_git_root) + for target_file in target_files + ] + + file_flat = FileGroup(files=target_files).group_name() + worktree_name = f"ai-migrator-worktree-{git_root.name}-{file_flat}" + if local_worktrees: + worktree_root = git_root.parent / "ai-migrator-worktrees" / worktree_name + else: + worktree_root = Path(tempfile.gettempdir()) / worktree_name + branch = f"ai-migrator/{file_flat}" + + if not worktree_root.exists(): + await subprocess_run( + ["git", "worktree", "add", worktree_root, "HEAD"], + check=True, + cwd=git_root, + ) + # Temporarily don't checkout branch. Lets us skip to goose + # await subprocess_run( + # ["git", "checkout", "--force", "-B", branch, start_point], + # check=True, + # cwd=worktree_root, + # ) + + # If using target_dir, read files from original location instead of worktree + target_root = source_git_root if target_dir else worktree_root + targets_files = [target_root / target_in_repo for target_in_repo in targets_in_repo] + + return await _run( + targets_files, + system_prompt, + examples_dir, + verify_cmd, + pre_verify_cmd, + worktree_root, + llm_fakes, + dont_create_evals, + target_dir=target_dir, + target_dir_rel_path=target_dir_rel_path, + target_basename=target_basename, + tools=tools, + goose=goose, + ) + + +@dataclass +class CodeBlock: + filename: str | None + code: str + + +@dataclass +class CodeResponseResult: + code_blocks: list[CodeBlock] + other_text: str + + +def extract_code_blocks(markdown, replacement="") -> CodeResponseResult: + lines = markdown.splitlines() + filename = None + line_it = iter(lines) + result = CodeResponseResult([], "") + other_text = [] + + for line in line_it: + if line.lstrip().startswith("### ") and line.count("`") == 2: + start = line.find("`") + end = line.find("`", start + 1) + filename = line[start + 1 : end] + elif line.lstrip().startswith("```"): + code = [] + for line in line_it: + if line.lstrip().startswith("```"): + break + code.append(line) + result.code_blocks.append(CodeBlock(filename, "\n".join(code))) + filename = None + other_text.append(replacement) + else: + other_text.append(line) + + if other_text: + result.other_text = "\n".join(other_text) + + return result + + +class FailedPreVerification(Exception): + pass + + +async def remove_worktree(worktree_root: str | Path): + await asyncio.to_thread(shutil.rmtree, worktree_root, ignore_errors=True) + + +def build_messages( + initial_messages: list[dict], iteration_messages: list[list[dict]] +) -> list[dict]: + messages = initial_messages + for iteration_message in iteration_messages: + messages.extend(iteration_message) + return messages + + +async def _run( + target_files: list[str], + system_prompt: str, + examples_dir: str, + verify_cmd: str, + pre_verify_cmd: str, + worktree_root: str | Path, + llm_fakes: str | None, + dont_create_evals: bool = False, + target_dir: Path | str | None = None, + target_dir_rel_path: Path | str | None = None, + target_basename: str = None, + tools: list[Tool] = None, + goose: Optional[GooseConfig] = None, +): + if llm_fakes: + client = FakeLLMClient(llm_fakes) + else: + client = DefaultClient() + + verify_cmd = verify_cmd.split() + + examples = [*read_file_pairs_from(examples_dir)] + if not examples: + raise FileNotFoundError("No valid example pairs found in examples directory") + + system_prompt = Path(system_prompt).read_text() + + # TODO: Have some kind of configuration driven controls for how basename is transformed + if target_basename: + target_basename = ( + target_basename.replace("-", " ").replace("_", " ").title().replace(" ", "") + ) + + # Create target MigrationExample + target_file_contents = [] + for i, target_file in enumerate(target_files): + full_path = Path(target_file).absolute() + + if target_dir: + read_path = Path(target_files[i]).absolute() + short_name = full_path.name + content = read_path.read_text() + else: + short_name = full_path.relative_to(worktree_root) + content = full_path.read_text() + + target_file_contents.append(FileContent(name=str(short_name), content=content)) + + target = MigrationExample(name=None, old_files=target_file_contents, new_files=[]) + + messages = combine_examples_into_conversation(examples, target, system_prompt) + all_files_to_verify = set() + + def build_verify_cmd(all_files_to_verify: set[str]): + if target_dir: + return [ + *verify_cmd, + str(Path(target_dir_rel_path) / target_basename), + ] + return [ + *verify_cmd, + *[str(Path(worktree_root) / f) for f in all_files_to_verify], + ] + + full_verify_cmd = build_verify_cmd(all_files_to_verify) + + iteration_messages = [] + + if pre_verify_cmd: + log("Running pre-verification") + try: + await subprocess_run( + [*pre_verify_cmd.split(), *target_files], + prefix="pre-verify", + check=True, + cwd=worktree_root, + ) + except subprocess.CalledProcessError: + log( + "Pre-verification failed. The migration cannot continue until all files pass the pre-verify step" + ) + raise FailedPreVerification(f"file {target_files} failed pre-verification") + + if not target_dir: + for target_file in target_files: + os.remove(target_file) + await subprocess_run( + ["git", "add", target_file], + cwd=worktree_root, + ) + + for tries in range(int(os.getenv("AI_MIGRATE_MAX_TRIES", 10))): + log(f"[agent] Running migration attempt {tries + 1}") + + messages = build_messages(messages, iteration_messages) + log(f"[agent] Messages length: {client.count_tokens(messages)}") + while 0 < client.max_context_tokens() < client.count_tokens(messages): + log(f"Trimming iteration messages: {len(iteration_messages)}") + # Fall back to 3 examples + trim iterations 1 at a time. + messages = combine_examples_into_conversation( + examples[:3], target, system_prompt + ) + iteration_messages = iteration_messages[1:] + messages = build_messages(messages, iteration_messages) + + context = MigrationContext( + target_files=target_files, + target_dir=Path(target_dir) if target_dir else None, + ) + response, messages = await call_llm( + client, messages, tools or [], context=context + ) + + response_text = response["choices"][0]["message"]["content"] + parsed_result = extract_code_blocks(response_text) + + iteration_message = [] + if not parsed_result.code_blocks: + iteration_message.append({"role": ROLE_ASSISTANT, "content": response_text}) + iteration_message.append( + { + "role": ROLE_USER, + "content": "Include the full, complete code block. Do not omit any part of the file", + } + ) + continue + + written_files = set() + for code_block in parsed_result.code_blocks: + migrated_code = un_escape_nbsp(code_block.code) + + if code_block.filename: + written_files.add(code_block.filename) + if target_dir: + output_path = ( + Path(worktree_root) + / target_dir_rel_path + / target_basename + / code_block.filename + ) + else: + output_path = Path(worktree_root) / code_block.filename + output_path.parent.mkdir(parents=True, exist_ok=True) + + with open(output_path, "w") as f: + f.write(migrated_code) + + all_files_to_verify |= written_files + + full_verify_cmd = build_verify_cmd(all_files_to_verify) + + log(f"Running verification: {full_verify_cmd}") + verify_process = await asyncio.create_subprocess_exec( + *full_verify_cmd, + cwd=worktree_root, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + stdout, stderr = await verify_process.communicate() + + status = "pass" if verify_process.returncode == 0 else "fail" + + commit_message = f"Migration attempt {tries + 1} {status=}:\n\nLLM response:\n{parsed_result.other_text}" + + for file in written_files: + if target_dir: + file_path = ( + Path(worktree_root) / target_dir_rel_path / target_basename / file + ) + git_path = Path(file_path).relative_to(worktree_root) + await subprocess_run( + ["git", "add", git_path], + cwd=worktree_root, + ) + else: + await subprocess_run( + ["git", "add", file], + cwd=worktree_root, + ) + + await subprocess_run( + ["git", "commit", "--allow-empty", "-m", commit_message], + check=True, + cwd=worktree_root, + env={**os.environ, **environment_variables()}, + ) + + verification_output = (stderr or stdout or b"").decode() + await subprocess_run( + [ + "git", + "notes", + "--ref=migrator-verify", + "add", + "-f", + "-m", + verification_output, + ], + check=True, + cwd=worktree_root, + ) + + if verify_process.returncode == 0: + log("Verification successful") + + if not dont_create_evals: + original_contents = {} + for target_file in target_files: + full_path = Path(target_file).absolute() + short_name = full_path.relative_to(worktree_root) + try: + with open(full_path, "r") as f: + original_contents[str(short_name)] = f.read() + except Exception as e: + log(f"Error reading {full_path}: {e}") + + transformed_contents = {} + for file_path in written_files: + full_path = Path(worktree_root) / file_path + try: + with open(full_path, "r") as f: + transformed_contents[file_path] = f.read() + except Exception as e: + log(f"Error reading transformed file {full_path}: {e}") + + try: + project_dir = Path(examples_dir).parent + + eval_manifest = Manifest( + files=[ + FileEntry(filename=fname, result="pass") + for fname in written_files + ], + verify_cmd=" ".join(verify_cmd) + if isinstance(verify_cmd, list) + else verify_cmd, + ) + if pre_verify_cmd: + eval_manifest.pre_verify_cmd = pre_verify_cmd + + eval_dir = generate_eval_from_migration( + project_dir, + original_contents, + transformed_contents, + eval_manifest, + ) + log(f"Created evaluation at {eval_dir}") + except Exception as e: + log(f"Error creating evaluation: {e}") + log(f"Exception type: {type(e).__name__}") + + await remove_worktree(worktree_root) + break + log("Verification failed:") + for line in verification_output.splitlines(): + log(f"[verify] {line}") + + tool_call_extra = "" + if tools: + tool_call_extra = ( + f"Use the provided tools to help: {', '.join(tool.name for tool in tools)}" + "Then apply the necessary changes to the code. Don't guess or assume functionality." + "From now on, only re-write files, don't rename them." + ) + + iteration_message.append({"role": ROLE_ASSISTANT, "content": response_text}) + iteration_message.append( + { + "role": ROLE_USER, + "content": f"The code did not compile. The error was: {verification_output}. " + f"{tool_call_extra}", + } + ) + iteration_messages.append(iteration_message) + + else: + log("Migration failed: Out of tries") + + if goose: + for i in range(goose.max_retries): + log(f"Running migration attempt {i + 1} with Goose") + + if goose.system_prompt: + goose_extra = Path(goose.system_prompt).read_text() + else: + goose_extra = "" + + directory_instructions = ( + f"You may only make changes to the files inside {target_dir_rel_path}/{target_basename}. Under no circumstances should you touch any files outside of this directory. If I detect that you do, I will be very disappointed in you and you will be fired." + if target_dir + else f"You may only make changes to the files: {', '.join(target_files)}. Under no circumstances should you touch any other files." + ) + + verify_cmd_str = " ".join(full_verify_cmd) + + goose_prompt = f""" +You are a helpful assistant for code migration. The migration is almost done but is not passing verification. With as few changes as possible, make the migration pass verification. + +{directory_instructions} + +You may verify if the migration is correct by running the following command: + +{verify_cmd_str} + +The verification output may be large so pipe it to a file verification_output.txt and read it from there. + +Keep trying until the migration passes verification. +""" + + if goose_extra: + goose_prompt += f"\n\n{goose_extra}" + + # await subprocess_run( + # ["goose", "run", "--text", goose_prompt, "--with-builtin", "developer"], + # check=True, + # cwd=worktree_root, + # ) + + goose_command = [ + "goose", + "run", + "--text", + goose_prompt, + "--with-builtin", + "developer", + ] + + log(f"Running goose: {goose_command}") + + goose_process = await asyncio.create_subprocess_exec( + *goose_command, + cwd=worktree_root, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + + async def kill_after_timeout(): + await asyncio.sleep(goose.timeout_seconds) + if goose_process.returncode is None: + log( + f"[goose] Killing process after {goose.timeout_seconds} seconds timeout" + ) + goose_process.kill() + + timeout_task = asyncio.create_task(kill_after_timeout()) + + # Stream and collect output + output_lines = [] + + async def read_stream(stream, prefix): + while True: + line = await stream.readline() + if not line: + break + decoded = line.decode().rstrip() + log(f"[{prefix}] {decoded}") + output_lines.append(decoded) + + # Create tasks for reading stdout and stderr + stdout_task = asyncio.create_task(read_stream(goose_process.stdout, "goose")) + stderr_task = asyncio.create_task(read_stream(goose_process.stderr, "goose-err")) + + try: + # Wait for process to complete and streams to be fully read + await goose_process.wait() + await stdout_task + await stderr_task + timeout_task.cancel() + except asyncio.CancelledError: + if goose_process.returncode is None: + goose_process.kill() + stdout_task.cancel() + stderr_task.cancel() + raise + + goose_output = "\n".join(output_lines[-50:]) + + # if target_dir: + # git_path = Path(file_path).relative_to(worktree_root) + + # # Only allow files inside target_dir_rel_path to be added + # await subprocess_run( + # ["git", "reset", "--", target_dir_rel_path], + # cwd=worktree_root, + # ) + + # await subprocess_run( + # ["git", "add", git_path], + # cwd=worktree_root, + # ) + # else: + # for file in written_files: + # await subprocess_run( + # ["git", "add", *written_files], + # cwd=worktree_root, + # ) + + commit_message = ( + f"Goose attempt {i + 1}:\n\nGoose response:\n{goose_output}" + ) + + if target_dir: + git_path = Path(target_dir_rel_path) / target_basename + await subprocess_run( + ["git", "add", git_path], + cwd=worktree_root, + ) + else: + for file in written_files: + await subprocess_run( + ["git", "add", file], + cwd=worktree_root, + ) + + await subprocess_run( + ["git", "commit", "--allow-empty", "-m", commit_message], + check=True, + cwd=worktree_root, + env={**os.environ, **environment_variables()}, + ) + + # Clean up anything else goose may have added + run verification directly + await subprocess_run( + ["git", "reset", "--hard"], + cwd=worktree_root, + ) + + verify_process = await asyncio.create_subprocess_exec( + *full_verify_cmd, + cwd=worktree_root, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + stdout, stderr = await verify_process.communicate() + + verification_output = (stderr or stdout or b"").decode() + await subprocess_run( + [ + "git", + "notes", + "--ref=migrator-verify", + "add", + "-f", + "-m", + verification_output, + ], + check=True, + cwd=worktree_root, + ) + + if verify_process.returncode == 0: + log("Verification successful") + return True + else: + log("Verification failed:") + for line in verification_output.splitlines(): + log(f"[verify] {line}") + + raise ValueError("Migration failed: Out of tries") From 44451ba437aabe94104cf2ed70ed51105f014ba7 Mon Sep 17 00:00:00 2001 From: David Katz Date: Fri, 4 Apr 2025 17:03:55 -0400 Subject: [PATCH 15/19] clear external files before verify --- src/ai_migrate/migrate.py | 67 ++- src/ai_migrate/migrate.py.bak | 981 ---------------------------------- 2 files changed, 44 insertions(+), 1004 deletions(-) delete mode 100644 src/ai_migrate/migrate.py.bak diff --git a/src/ai_migrate/migrate.py b/src/ai_migrate/migrate.py index bd73c48..997ab72 100644 --- a/src/ai_migrate/migrate.py +++ b/src/ai_migrate/migrate.py @@ -772,7 +772,7 @@ def build_verify_cmd(all_files_to_verify: set[str]): log(f"Exception type: {type(e).__name__}") await remove_worktree(worktree_root) - break + return True log("Verification failed:") for line in verification_output.splitlines(): log(f"[verify] {line}") @@ -890,6 +890,35 @@ async def read_stream(stream, prefix): goose_output = "\n".join(output_lines[-50:]) + # First, reset any changes to files outside allowed directories + if target_dir: + # Reset everything, then we'll re-add only the allowed files + await subprocess_run( + ["git", "reset"], + cwd=worktree_root, + ) + + # Only add changes in the allowed directory + git_path = Path(target_dir_rel_path) / target_basename + await subprocess_run( + ["git", "add", git_path], + cwd=worktree_root, + ) + else: + # Reset everything, then we'll re-add only the allowed files + await subprocess_run( + ["git", "reset"], + cwd=worktree_root, + ) + + # Only add changes to the allowed files + for file in written_files: + await subprocess_run( + ["git", "add", file], + cwd=worktree_root, + ) + + # Now run verification on the clean state with only allowed changes verify_process = await asyncio.create_subprocess_exec( *full_verify_cmd, cwd=worktree_root, @@ -898,35 +927,25 @@ async def read_stream(stream, prefix): ) stdout, stderr = await verify_process.communicate() verification_output = (stderr or stdout or b"").decode() - current_exit_code = verify_process.returncode - - if current_exit_code > best_exit_code and best_exit_code != 0: - log(f"Exit code {current_exit_code} is worse than previous best {best_exit_code}, resetting changes") + exit_code = verify_process.returncode + + # If exit code is worse than our best so far (more failing tests), reset everything + if exit_code > best_exit_code and best_exit_code != 0: + log(f"Exit code {exit_code} is worse than previous best {best_exit_code}, resetting changes") await subprocess_run( ["git", "reset", "--hard"], cwd=worktree_root, ) continue - - best_exit_code = min(best_exit_code, current_exit_code) + # If this is better or equal to our best result so far, commit it + best_exit_code = min(best_exit_code, exit_code) + commit_message = ( - f"Goose attempt {i + 1}, remaining tests: {current_exit_code}:\n\nGoose response:\n{goose_output}" + f"Goose attempt {i + 1}, remaining tests: {exit_code}:\n\nGoose response:\n{goose_output}" ) - if target_dir: - git_path = Path(target_dir_rel_path) / target_basename - await subprocess_run( - ["git", "add", git_path], - cwd=worktree_root, - ) - else: - for file in written_files: - await subprocess_run( - ["git", "add", file], - cwd=worktree_root, - ) - + # Files have already been added above, just commit await subprocess_run( ["git", "commit", "--allow-empty", "-m", commit_message], check=True, @@ -934,6 +953,7 @@ async def read_stream(stream, prefix): env={**os.environ, **environment_variables()}, ) + # Log verification results await subprocess_run( [ "git", @@ -948,11 +968,12 @@ async def read_stream(stream, prefix): cwd=worktree_root, ) - if current_exit_code == 0: + # If all tests passed, exit successfully + if exit_code == 0: log("Verification successful") return True else: - log(f"Verification failed with {current_exit_code} remaining test steps:") + log(f"Verification failed with {exit_code} remaining test steps:") for line in verification_output.splitlines(): log(f"[verify] {line}") diff --git a/src/ai_migrate/migrate.py.bak b/src/ai_migrate/migrate.py.bak deleted file mode 100644 index 3fb925d..0000000 --- a/src/ai_migrate/migrate.py.bak +++ /dev/null @@ -1,981 +0,0 @@ -import asyncio -import contextvars -import os -import shutil -import sys -import tempfile -import traceback -from dataclasses import dataclass -from pathlib import Path -import subprocess -from typing import Any, Iterable, Optional - -from pydantic_ai.messages import ToolCallPart -from pydantic_ai.tools import Tool - -from ai_migrate.llm_providers import DefaultClient -from .context import MigrationContext, ToolCallContext -from .fake_llm_client import FakeLLMClient -from .git_identity import environment_variables -from .manifest import FileGroup, FileEntry, GooseConfig, Manifest -from .eval_generator import generate_eval_from_migration - - -ROLE_ASSISTANT = "assistant" -ROLE_USER = "user" - -LOG_STREAM = contextvars.ContextVar("LOG_STREAM", default=sys.stdout) - - -def log(*args, **kwargs): - print(*args, **kwargs, file=LOG_STREAM.get(), flush=True) - - -@dataclass -class FileContent: - name: str - content: str - - -@dataclass -class MigrationExample: - name: Optional[str] - old_files: list[FileContent] - new_files: list[FileContent] - - -def read_file_pairs_from(examples_dir: str | Path) -> Iterable[MigrationExample]: - """ - Read pairs of files from the examples directory, matching .old and .new directories. - Returns an Iterable of MigrationExample containing all files in each directory pair. - - Sample dir: - examples/ - example1.old/ - src/ - file1.py - file2.py - example1.new/ - src/ - file1.py - file2.py - single.old.py - single.new.py - - Args: - examples_dir: Directory containing example migration pairs - - Returns: - Iterable[MigrationExample]: Iterator of migration examples - """ - examples_dir = Path(examples_dir) - - def get_files_recursively(directory: Path) -> list[FileContent]: - """Recursively get all files in a directory, maintaining relative paths.""" - files = [] - for item in directory.rglob("*"): - if item.is_file(): - relative_path = item.relative_to(directory) - files.append( - FileContent(name=str(relative_path), content=item.read_text()) - ) - return files - - old_dirs = [ - d for d in examples_dir.iterdir() if d.is_dir() and d.name.endswith(".old") - ] - - for old_dir in old_dirs: - base_name = old_dir.name.removesuffix(".old") - new_dir = old_dir.parent / f"{base_name}.new" - - if new_dir.exists() and new_dir.is_dir(): - old_files = get_files_recursively(old_dir) - new_files = get_files_recursively(new_dir) - - yield MigrationExample( - name=base_name, old_files=old_files, new_files=new_files - ) - - for file in examples_dir.iterdir(): - if file.is_file() and ".old." in file.name: - base, ext = file.name.split(".old.", 1) - new_file = file.parent / f"{base}.new.{ext}" - - if new_file.exists(): - old_content = FileContent( - name=f"{base}.{ext}", content=file.read_text() - ) - new_content = FileContent( - name=f"{base}.{ext}", content=new_file.read_text() - ) - - yield MigrationExample( - name=base, old_files=[old_content], new_files=[new_content] - ) - - -NBSP_REPLACEMENT_TOKEN = "" - - -def escape_nbsp(text: str) -> str: - """LLMs tokenize these as regular spaces. In source code they need to be preserved.""" - return text.replace("\u00a0", "") - - -def un_escape_nbsp(text: str) -> str: - """LLMs tokenize these as regular spaces. In source code they need to be preserved.""" - return text.replace("", "\u00a0") - - -LANGUAGE_EXTENSIONS = { - "bash": [".sh", ".bash"], - "python": [".py", ".pyx", ".pyi"], - "ruby": [".rb", ".rake"], - "javascript": [".js", ".jsx", ".mjs"], - "css": [".css", ".cssx"], - "html": [".html", ".htm", ".htmx"], - "typescript": [".ts", ".tsx"], - "java": [".java"], - "go": [".go"], - "rust": [".rs"], - "php": [".php"], - "swift": [".swift"], - "kotlin": [".kt", ".kts"], - "gradle": [".grad"], - "terraform": [".tf"], -} - - -def detect_language(filename: str) -> str: - extension = Path(filename).suffix - for language, extensions in LANGUAGE_EXTENSIONS.items(): - for e in extensions: - if e == extension: - return language - return "" - - -def wrap_in_code_block(text: str, filename: str | None) -> str: - language = detect_language(filename) - code_block = f"```{language}\n{text.strip()}\n```" - if filename: - code_block = f"### `{filename}`\n{code_block}" - return code_block - - -def migrate_prompt(example: MigrationExample) -> list[dict]: - """ - Create a prompt for migrating code based on a MigrationExample. - - Args: - example: MigrationExample containing old and new files - - Returns: - List of messages for the LLM conversation - """ - old_file_contents = "\n\n".join( - wrap_in_code_block(fc.content, fc.name) for fc in example.old_files - ) - user_message = { - "role": ROLE_USER, - "content": f"Migrate this code to the new format:\n\n{escape_nbsp(old_file_contents)}. " - "Return the full content for all files mentioned, don't leave anything out. " - "You can rename a file if necessary.", - } - - if example.new_files: - new_file_blocks = [ - wrap_in_code_block(fc.content, fc.name) for fc in example.new_files - ] - new_file_contents = "\n\n".join(new_file_blocks) - assistant_message = { - "role": ROLE_ASSISTANT, - "content": f"Here's the migrated code:\n{escape_nbsp(new_file_contents)}", - } - return [user_message, assistant_message] - return [user_message] - - -async def handle_tool_calls( - tools: list[Tool], tool_calls: list[dict[str, Any]], context: MigrationContext -) -> list[dict[str, str]]: - tool_results = [] - tools_by_name = {tool.name: tool for tool in tools} - for tool_call in tool_calls: - tool_call_message = ToolCallPart( - tool_call["function"]["name"], tool_call["function"]["arguments"] - ) - function = tool_call["function"] - if tool := tools_by_name.get(function["name"]): - try: - log("[agent] Running tool", tool.name, f"{tool_call_message=}") - result = await tool._run( - tool_call_message, - ToolCallContext( - deps=context, - model=None, - usage=None, - prompt="", - ), - ) - log("[agent] Tool result", result) - tool_results.append( - { - "tool_call_id": tool_call["id"], - "output": str(result.content), - } - ) - except Exception as e: - log( - "[agent] Error processing tool call", str(e), traceback.format_exc() - ) - tool_results.append( - { - "tool_call_id": tool_call["id"], - "output": f"Error processing tool call: {str(e)}", - } - ) - else: - tool_results.append( - { - "tool_call_id": tool_call["id"], - "output": f"Unknown tool call: {tool_call['function']['name']}", - } - ) - return tool_results - - -def combine_examples_into_conversation( - examples: list[MigrationExample], - target: MigrationExample, - system_prompt: str, -) -> list[dict]: - messages = [{"role": "system", "content": system_prompt}] - - for example in examples: - messages.extend(migrate_prompt(example)) - - messages.extend(migrate_prompt(target)) - - return messages - - -async def call_llm( - client: DefaultClient, - messages: list, - tools: list[Tool], - *, - context: MigrationContext, - temperature=0.1, -) -> tuple[dict, list[dict]]: - """Call LLM for completions - - Returns the response and the messages so far - """ - while True: - response, messages = await client.generate_completion( - messages=messages, - tools=[await tool.prepare_tool_def(None) for tool in tools], - temperature=temperature, - ) - - assistant_message = response["choices"][0]["message"] - - if not (tool_calls := assistant_message.get("tool_calls")): - return response, messages - - tool_results = await handle_tool_calls(tools, tool_calls, context) - - messages.append(assistant_message) - for result in tool_results: - messages.append( - { - "role": "tool", - "tool_call_id": result["tool_call_id"], - "content": result["output"], - } - ) - - for message in messages: - if message.get("content") == "": - del message["content"] - - -def filter_lines(text, match): - return "\n".join(line for line in text.splitlines() if match in line) - - -async def subprocess_run(cmd, prefix=None, **kwargs) -> str: - if not kwargs.get("stderr"): - kwargs["stderr"] = subprocess.STDOUT - kwargs["stdout"] = subprocess.PIPE - check = False - if "check" in kwargs: - check = kwargs.pop("check") - env = kwargs.pop("env", {}) - env = {**os.environ, "PYTHONUNBUFFERED": "1", **env} - process = await asyncio.create_subprocess_exec( - *cmd, - **kwargs, - env=env, - ) - stdout = [] - if not prefix: - prefix = cmd[0] - while not process.stdout.at_eof(): - data = await process.stdout.readline() - if not data: - break - line = data.decode().removesuffix("\n") - log(f"[{prefix}] {line}") - stdout.append(line) - await process.wait() - if check and process.returncode != 0: - raise subprocess.CalledProcessError(process.returncode, cmd) - return "\n".join(stdout) - - -async def run( - target_files: list[str], - system_prompt, - examples_dir, - verify_cmd, - pre_verify_cmd, - log_stream, - local_worktrees, - llm_fakes, - target_dir: str = "", - target_basename: str = "", - dont_create_evals: bool = False, - tools: list[Tool] = None, - goose: Optional[GooseConfig] = None, -): - """Run the migration process on the target files. - Args: - target_files: List of files to migrate - system_prompt: System prompt for the LLM - examples_dir: Directory containing example migrations - verify_cmd: Command to verify the migrated files - pre_verify_cmd: Command to run before migration - log_stream: Stream to write logs to - local_worktrees: Whether to create worktrees locally - dont_create_evals: If True, don't automatically create evaluations after successful migrations - """ - if log_stream: - LOG_STREAM.set(log_stream) - - source_git_root = Path( - ( - await subprocess_run(["git", "rev-parse", "--show-toplevel"], check=True) - ).strip() - ) - source_start_point = ( - await subprocess_run(["git", "rev-parse", "HEAD"], check=True) - ).strip() - - # If target_dir is specified, use it as the git root for the output - if target_dir: - target_dir_path = Path(target_dir) - try: - if not target_dir_path.exists(): - target_dir_path.mkdir(parents=True, exist_ok=True) - - target_git_root = Path( - ( - await subprocess_run( - ["git", "rev-parse", "--show-toplevel"], - check=True, - cwd=str(target_dir_path), - ) - ).strip() - ) - start_point = ( - await subprocess_run( - ["git", "rev-parse", "HEAD"], check=True, cwd=str(target_git_root) - ) - ).strip() - - target_dir_rel_path = target_dir_path.resolve().relative_to( - target_git_root.resolve() - ) - - git_root = target_git_root - except Exception as e: - log(f"Error finding git repository: {e}") - raise ValueError( - f"Error: target_dir '{target_dir}' is not in a git repository." - ) - else: - # Use the source repository as the git root - git_root = source_git_root - start_point = source_start_point - target_dir_rel_path = None - - # Get the relative paths of the target files - targets_in_repo = [ - Path(target_file).resolve().relative_to(source_git_root) - for target_file in target_files - ] - - file_flat = FileGroup(files=target_files).group_name() - worktree_name = f"ai-migrator-worktree-{git_root.name}-{file_flat}" - if local_worktrees: - worktree_root = git_root.parent / "ai-migrator-worktrees" / worktree_name - else: - worktree_root = Path(tempfile.gettempdir()) / worktree_name - branch = f"ai-migrator/{file_flat}" - - if not worktree_root.exists(): - await subprocess_run( - ["git", "worktree", "add", worktree_root, "HEAD"], - check=True, - cwd=git_root, - ) - # Temporarily don't checkout branch. Lets us skip to goose - # await subprocess_run( - # ["git", "checkout", "--force", "-B", branch, start_point], - # check=True, - # cwd=worktree_root, - # ) - - # If using target_dir, read files from original location instead of worktree - target_root = source_git_root if target_dir else worktree_root - targets_files = [target_root / target_in_repo for target_in_repo in targets_in_repo] - - return await _run( - targets_files, - system_prompt, - examples_dir, - verify_cmd, - pre_verify_cmd, - worktree_root, - llm_fakes, - dont_create_evals, - target_dir=target_dir, - target_dir_rel_path=target_dir_rel_path, - target_basename=target_basename, - tools=tools, - goose=goose, - ) - - -@dataclass -class CodeBlock: - filename: str | None - code: str - - -@dataclass -class CodeResponseResult: - code_blocks: list[CodeBlock] - other_text: str - - -def extract_code_blocks(markdown, replacement="") -> CodeResponseResult: - lines = markdown.splitlines() - filename = None - line_it = iter(lines) - result = CodeResponseResult([], "") - other_text = [] - - for line in line_it: - if line.lstrip().startswith("### ") and line.count("`") == 2: - start = line.find("`") - end = line.find("`", start + 1) - filename = line[start + 1 : end] - elif line.lstrip().startswith("```"): - code = [] - for line in line_it: - if line.lstrip().startswith("```"): - break - code.append(line) - result.code_blocks.append(CodeBlock(filename, "\n".join(code))) - filename = None - other_text.append(replacement) - else: - other_text.append(line) - - if other_text: - result.other_text = "\n".join(other_text) - - return result - - -class FailedPreVerification(Exception): - pass - - -async def remove_worktree(worktree_root: str | Path): - await asyncio.to_thread(shutil.rmtree, worktree_root, ignore_errors=True) - - -def build_messages( - initial_messages: list[dict], iteration_messages: list[list[dict]] -) -> list[dict]: - messages = initial_messages - for iteration_message in iteration_messages: - messages.extend(iteration_message) - return messages - - -async def _run( - target_files: list[str], - system_prompt: str, - examples_dir: str, - verify_cmd: str, - pre_verify_cmd: str, - worktree_root: str | Path, - llm_fakes: str | None, - dont_create_evals: bool = False, - target_dir: Path | str | None = None, - target_dir_rel_path: Path | str | None = None, - target_basename: str = None, - tools: list[Tool] = None, - goose: Optional[GooseConfig] = None, -): - if llm_fakes: - client = FakeLLMClient(llm_fakes) - else: - client = DefaultClient() - - verify_cmd = verify_cmd.split() - - examples = [*read_file_pairs_from(examples_dir)] - if not examples: - raise FileNotFoundError("No valid example pairs found in examples directory") - - system_prompt = Path(system_prompt).read_text() - - # TODO: Have some kind of configuration driven controls for how basename is transformed - if target_basename: - target_basename = ( - target_basename.replace("-", " ").replace("_", " ").title().replace(" ", "") - ) - - # Create target MigrationExample - target_file_contents = [] - for i, target_file in enumerate(target_files): - full_path = Path(target_file).absolute() - - if target_dir: - read_path = Path(target_files[i]).absolute() - short_name = full_path.name - content = read_path.read_text() - else: - short_name = full_path.relative_to(worktree_root) - content = full_path.read_text() - - target_file_contents.append(FileContent(name=str(short_name), content=content)) - - target = MigrationExample(name=None, old_files=target_file_contents, new_files=[]) - - messages = combine_examples_into_conversation(examples, target, system_prompt) - all_files_to_verify = set() - - def build_verify_cmd(all_files_to_verify: set[str]): - if target_dir: - return [ - *verify_cmd, - str(Path(target_dir_rel_path) / target_basename), - ] - return [ - *verify_cmd, - *[str(Path(worktree_root) / f) for f in all_files_to_verify], - ] - - full_verify_cmd = build_verify_cmd(all_files_to_verify) - - iteration_messages = [] - - if pre_verify_cmd: - log("Running pre-verification") - try: - await subprocess_run( - [*pre_verify_cmd.split(), *target_files], - prefix="pre-verify", - check=True, - cwd=worktree_root, - ) - except subprocess.CalledProcessError: - log( - "Pre-verification failed. The migration cannot continue until all files pass the pre-verify step" - ) - raise FailedPreVerification(f"file {target_files} failed pre-verification") - - if not target_dir: - for target_file in target_files: - os.remove(target_file) - await subprocess_run( - ["git", "add", target_file], - cwd=worktree_root, - ) - - for tries in range(int(os.getenv("AI_MIGRATE_MAX_TRIES", 10))): - log(f"[agent] Running migration attempt {tries + 1}") - - messages = build_messages(messages, iteration_messages) - log(f"[agent] Messages length: {client.count_tokens(messages)}") - while 0 < client.max_context_tokens() < client.count_tokens(messages): - log(f"Trimming iteration messages: {len(iteration_messages)}") - # Fall back to 3 examples + trim iterations 1 at a time. - messages = combine_examples_into_conversation( - examples[:3], target, system_prompt - ) - iteration_messages = iteration_messages[1:] - messages = build_messages(messages, iteration_messages) - - context = MigrationContext( - target_files=target_files, - target_dir=Path(target_dir) if target_dir else None, - ) - response, messages = await call_llm( - client, messages, tools or [], context=context - ) - - response_text = response["choices"][0]["message"]["content"] - parsed_result = extract_code_blocks(response_text) - - iteration_message = [] - if not parsed_result.code_blocks: - iteration_message.append({"role": ROLE_ASSISTANT, "content": response_text}) - iteration_message.append( - { - "role": ROLE_USER, - "content": "Include the full, complete code block. Do not omit any part of the file", - } - ) - continue - - written_files = set() - for code_block in parsed_result.code_blocks: - migrated_code = un_escape_nbsp(code_block.code) - - if code_block.filename: - written_files.add(code_block.filename) - if target_dir: - output_path = ( - Path(worktree_root) - / target_dir_rel_path - / target_basename - / code_block.filename - ) - else: - output_path = Path(worktree_root) / code_block.filename - output_path.parent.mkdir(parents=True, exist_ok=True) - - with open(output_path, "w") as f: - f.write(migrated_code) - - all_files_to_verify |= written_files - - full_verify_cmd = build_verify_cmd(all_files_to_verify) - - log(f"Running verification: {full_verify_cmd}") - verify_process = await asyncio.create_subprocess_exec( - *full_verify_cmd, - cwd=worktree_root, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - stdout, stderr = await verify_process.communicate() - - status = "pass" if verify_process.returncode == 0 else "fail" - - commit_message = f"Migration attempt {tries + 1} {status=}:\n\nLLM response:\n{parsed_result.other_text}" - - for file in written_files: - if target_dir: - file_path = ( - Path(worktree_root) / target_dir_rel_path / target_basename / file - ) - git_path = Path(file_path).relative_to(worktree_root) - await subprocess_run( - ["git", "add", git_path], - cwd=worktree_root, - ) - else: - await subprocess_run( - ["git", "add", file], - cwd=worktree_root, - ) - - await subprocess_run( - ["git", "commit", "--allow-empty", "-m", commit_message], - check=True, - cwd=worktree_root, - env={**os.environ, **environment_variables()}, - ) - - verification_output = (stderr or stdout or b"").decode() - await subprocess_run( - [ - "git", - "notes", - "--ref=migrator-verify", - "add", - "-f", - "-m", - verification_output, - ], - check=True, - cwd=worktree_root, - ) - - if verify_process.returncode == 0: - log("Verification successful") - - if not dont_create_evals: - original_contents = {} - for target_file in target_files: - full_path = Path(target_file).absolute() - short_name = full_path.relative_to(worktree_root) - try: - with open(full_path, "r") as f: - original_contents[str(short_name)] = f.read() - except Exception as e: - log(f"Error reading {full_path}: {e}") - - transformed_contents = {} - for file_path in written_files: - full_path = Path(worktree_root) / file_path - try: - with open(full_path, "r") as f: - transformed_contents[file_path] = f.read() - except Exception as e: - log(f"Error reading transformed file {full_path}: {e}") - - try: - project_dir = Path(examples_dir).parent - - eval_manifest = Manifest( - files=[ - FileEntry(filename=fname, result="pass") - for fname in written_files - ], - verify_cmd=" ".join(verify_cmd) - if isinstance(verify_cmd, list) - else verify_cmd, - ) - if pre_verify_cmd: - eval_manifest.pre_verify_cmd = pre_verify_cmd - - eval_dir = generate_eval_from_migration( - project_dir, - original_contents, - transformed_contents, - eval_manifest, - ) - log(f"Created evaluation at {eval_dir}") - except Exception as e: - log(f"Error creating evaluation: {e}") - log(f"Exception type: {type(e).__name__}") - - await remove_worktree(worktree_root) - break - log("Verification failed:") - for line in verification_output.splitlines(): - log(f"[verify] {line}") - - tool_call_extra = "" - if tools: - tool_call_extra = ( - f"Use the provided tools to help: {', '.join(tool.name for tool in tools)}" - "Then apply the necessary changes to the code. Don't guess or assume functionality." - "From now on, only re-write files, don't rename them." - ) - - iteration_message.append({"role": ROLE_ASSISTANT, "content": response_text}) - iteration_message.append( - { - "role": ROLE_USER, - "content": f"The code did not compile. The error was: {verification_output}. " - f"{tool_call_extra}", - } - ) - iteration_messages.append(iteration_message) - - else: - log("Migration failed: Out of tries") - - if goose: - for i in range(goose.max_retries): - log(f"Running migration attempt {i + 1} with Goose") - - if goose.system_prompt: - goose_extra = Path(goose.system_prompt).read_text() - else: - goose_extra = "" - - directory_instructions = ( - f"You may only make changes to the files inside {target_dir_rel_path}/{target_basename}. Under no circumstances should you touch any files outside of this directory. If I detect that you do, I will be very disappointed in you and you will be fired." - if target_dir - else f"You may only make changes to the files: {', '.join(target_files)}. Under no circumstances should you touch any other files." - ) - - verify_cmd_str = " ".join(full_verify_cmd) - - goose_prompt = f""" -You are a helpful assistant for code migration. The migration is almost done but is not passing verification. With as few changes as possible, make the migration pass verification. - -{directory_instructions} - -You may verify if the migration is correct by running the following command: - -{verify_cmd_str} - -The verification output may be large so pipe it to a file verification_output.txt and read it from there. - -Keep trying until the migration passes verification. -""" - - if goose_extra: - goose_prompt += f"\n\n{goose_extra}" - - # await subprocess_run( - # ["goose", "run", "--text", goose_prompt, "--with-builtin", "developer"], - # check=True, - # cwd=worktree_root, - # ) - - goose_command = [ - "goose", - "run", - "--text", - goose_prompt, - "--with-builtin", - "developer", - ] - - log(f"Running goose: {goose_command}") - - goose_process = await asyncio.create_subprocess_exec( - *goose_command, - cwd=worktree_root, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - - async def kill_after_timeout(): - await asyncio.sleep(goose.timeout_seconds) - if goose_process.returncode is None: - log( - f"[goose] Killing process after {goose.timeout_seconds} seconds timeout" - ) - goose_process.kill() - - timeout_task = asyncio.create_task(kill_after_timeout()) - - # Stream and collect output - output_lines = [] - - async def read_stream(stream, prefix): - while True: - line = await stream.readline() - if not line: - break - decoded = line.decode().rstrip() - log(f"[{prefix}] {decoded}") - output_lines.append(decoded) - - # Create tasks for reading stdout and stderr - stdout_task = asyncio.create_task(read_stream(goose_process.stdout, "goose")) - stderr_task = asyncio.create_task(read_stream(goose_process.stderr, "goose-err")) - - try: - # Wait for process to complete and streams to be fully read - await goose_process.wait() - await stdout_task - await stderr_task - timeout_task.cancel() - except asyncio.CancelledError: - if goose_process.returncode is None: - goose_process.kill() - stdout_task.cancel() - stderr_task.cancel() - raise - - goose_output = "\n".join(output_lines[-50:]) - - # if target_dir: - # git_path = Path(file_path).relative_to(worktree_root) - - # # Only allow files inside target_dir_rel_path to be added - # await subprocess_run( - # ["git", "reset", "--", target_dir_rel_path], - # cwd=worktree_root, - # ) - - # await subprocess_run( - # ["git", "add", git_path], - # cwd=worktree_root, - # ) - # else: - # for file in written_files: - # await subprocess_run( - # ["git", "add", *written_files], - # cwd=worktree_root, - # ) - - commit_message = ( - f"Goose attempt {i + 1}:\n\nGoose response:\n{goose_output}" - ) - - if target_dir: - git_path = Path(target_dir_rel_path) / target_basename - await subprocess_run( - ["git", "add", git_path], - cwd=worktree_root, - ) - else: - for file in written_files: - await subprocess_run( - ["git", "add", file], - cwd=worktree_root, - ) - - await subprocess_run( - ["git", "commit", "--allow-empty", "-m", commit_message], - check=True, - cwd=worktree_root, - env={**os.environ, **environment_variables()}, - ) - - # Clean up anything else goose may have added + run verification directly - await subprocess_run( - ["git", "reset", "--hard"], - cwd=worktree_root, - ) - - verify_process = await asyncio.create_subprocess_exec( - *full_verify_cmd, - cwd=worktree_root, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - ) - stdout, stderr = await verify_process.communicate() - - verification_output = (stderr or stdout or b"").decode() - await subprocess_run( - [ - "git", - "notes", - "--ref=migrator-verify", - "add", - "-f", - "-m", - verification_output, - ], - check=True, - cwd=worktree_root, - ) - - if verify_process.returncode == 0: - log("Verification successful") - return True - else: - log("Verification failed:") - for line in verification_output.splitlines(): - log(f"[verify] {line}") - - raise ValueError("Migration failed: Out of tries") From 20b12fdd8ec6eb96c388d4c4dea10f9d0592e136 Mon Sep 17 00:00:00 2001 From: David Katz Date: Mon, 7 Apr 2025 13:14:57 -0400 Subject: [PATCH 16/19] ruff --- src/ai_migrate/migrate.py | 49 +++++++++++++++++++++----------------- src/ai_migrate/projects.py | 4 +++- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/ai_migrate/migrate.py b/src/ai_migrate/migrate.py index 997ab72..32f5baa 100644 --- a/src/ai_migrate/migrate.py +++ b/src/ai_migrate/migrate.py @@ -432,12 +432,13 @@ async def run( check=True, cwd=git_root, ) - # Temporarily don't checkout branch. Lets us skip to goose - # await subprocess_run( - # ["git", "checkout", "--force", "-B", branch, start_point], - # check=True, - # cwd=worktree_root, - # ) + + if int(os.getenv("AI_MIGRATE_MAX_TRIES", 10)) >= 1: + await subprocess_run( + ["git", "checkout", "--force", "-B", branch, start_point], + check=True, + cwd=worktree_root, + ) # If using target_dir, read files from original location instead of worktree target_root = source_git_root if target_dir else worktree_root @@ -799,8 +800,8 @@ def build_verify_cmd(all_files_to_verify: set[str]): log("Migration failed: Out of tries") if goose: - best_exit_code = float('inf') # Track best exit code so far - + best_exit_code = float("inf") # Track best exit code so far + for i in range(goose.max_retries): log(f"Running migration attempt {i + 1} with Goose") @@ -861,9 +862,9 @@ async def kill_after_timeout(): goose_process.kill() timeout_task = asyncio.create_task(kill_after_timeout()) - + output_lines = [] - + async def read_stream(stream, prefix): while True: line = await stream.readline() @@ -872,10 +873,14 @@ async def read_stream(stream, prefix): decoded = line.decode().rstrip() log(f"[{prefix}] {decoded}") output_lines.append(decoded) - - stdout_task = asyncio.create_task(read_stream(goose_process.stdout, "goose")) - stderr_task = asyncio.create_task(read_stream(goose_process.stderr, "goose-err")) - + + stdout_task = asyncio.create_task( + read_stream(goose_process.stdout, "goose") + ) + stderr_task = asyncio.create_task( + read_stream(goose_process.stderr, "goose-err") + ) + try: await goose_process.wait() await stdout_task @@ -897,7 +902,7 @@ async def read_stream(stream, prefix): ["git", "reset"], cwd=worktree_root, ) - + # Only add changes in the allowed directory git_path = Path(target_dir_rel_path) / target_basename await subprocess_run( @@ -910,14 +915,14 @@ async def read_stream(stream, prefix): ["git", "reset"], cwd=worktree_root, ) - + # Only add changes to the allowed files for file in written_files: await subprocess_run( ["git", "add", file], cwd=worktree_root, ) - + # Now run verification on the clean state with only allowed changes verify_process = await asyncio.create_subprocess_exec( *full_verify_cmd, @@ -931,7 +936,9 @@ async def read_stream(stream, prefix): # If exit code is worse than our best so far (more failing tests), reset everything if exit_code > best_exit_code and best_exit_code != 0: - log(f"Exit code {exit_code} is worse than previous best {best_exit_code}, resetting changes") + log( + f"Exit code {exit_code} is worse than previous best {best_exit_code}, resetting changes" + ) await subprocess_run( ["git", "reset", "--hard"], cwd=worktree_root, @@ -940,10 +947,8 @@ async def read_stream(stream, prefix): # If this is better or equal to our best result so far, commit it best_exit_code = min(best_exit_code, exit_code) - - commit_message = ( - f"Goose attempt {i + 1}, remaining tests: {exit_code}:\n\nGoose response:\n{goose_output}" - ) + + commit_message = f"Goose attempt {i + 1}, remaining tests: {exit_code}:\n\nGoose response:\n{goose_output}" # Files have already been added above, just commit await subprocess_run( diff --git a/src/ai_migrate/projects.py b/src/ai_migrate/projects.py index 997ba94..0f73075 100644 --- a/src/ai_migrate/projects.py +++ b/src/ai_migrate/projects.py @@ -151,7 +151,9 @@ async def process_one_fileset(index, files: FileGroup, task_name: str): log_buffer, ) if manifest.goose: - manifest.goose.system_prompt = manifest.goose.system_prompt.format(project_dir=project_dir) + manifest.goose.system_prompt = manifest.goose.system_prompt.format( + project_dir=project_dir + ) try: await run_migration( From 76ee121b88c3b27d3dc75fc4092be52d67ec147e Mon Sep 17 00:00:00 2001 From: David Katz Date: Mon, 7 Apr 2025 13:33:30 -0400 Subject: [PATCH 17/19] clean up comments --- src/ai_migrate/migrate.py | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/ai_migrate/migrate.py b/src/ai_migrate/migrate.py index 32f5baa..5f4ef73 100644 --- a/src/ai_migrate/migrate.py +++ b/src/ai_migrate/migrate.py @@ -811,7 +811,7 @@ def build_verify_cmd(all_files_to_verify: set[str]): goose_extra = "" directory_instructions = ( - f"You may only make changes to the files inside {target_dir_rel_path}/{target_basename}. Under no circumstances should you touch any files outside of this directory. If I detect that you do, I will be very disappointed in you and you will be fired." + f"You may only make changes to the files inside {target_dir_rel_path}/{target_basename}. Under no circumstances should you touch any files outside of this directory. If I detect that you do, I will be very disappointed in you and will switch to a smarter model." if target_dir else f"You may only make changes to the files: {', '.join(target_files)}. Under no circumstances should you touch any other files." ) @@ -895,35 +895,29 @@ async def read_stream(stream, prefix): goose_output = "\n".join(output_lines[-50:]) - # First, reset any changes to files outside allowed directories if target_dir: - # Reset everything, then we'll re-add only the allowed files await subprocess_run( ["git", "reset"], cwd=worktree_root, ) - # Only add changes in the allowed directory git_path = Path(target_dir_rel_path) / target_basename await subprocess_run( ["git", "add", git_path], cwd=worktree_root, ) else: - # Reset everything, then we'll re-add only the allowed files await subprocess_run( ["git", "reset"], cwd=worktree_root, ) - # Only add changes to the allowed files for file in written_files: await subprocess_run( ["git", "add", file], cwd=worktree_root, ) - # Now run verification on the clean state with only allowed changes verify_process = await asyncio.create_subprocess_exec( *full_verify_cmd, cwd=worktree_root, @@ -934,7 +928,6 @@ async def read_stream(stream, prefix): verification_output = (stderr or stdout or b"").decode() exit_code = verify_process.returncode - # If exit code is worse than our best so far (more failing tests), reset everything if exit_code > best_exit_code and best_exit_code != 0: log( f"Exit code {exit_code} is worse than previous best {best_exit_code}, resetting changes" @@ -945,12 +938,10 @@ async def read_stream(stream, prefix): ) continue - # If this is better or equal to our best result so far, commit it best_exit_code = min(best_exit_code, exit_code) commit_message = f"Goose attempt {i + 1}, remaining tests: {exit_code}:\n\nGoose response:\n{goose_output}" - # Files have already been added above, just commit await subprocess_run( ["git", "commit", "--allow-empty", "-m", commit_message], check=True, @@ -958,7 +949,6 @@ async def read_stream(stream, prefix): env={**os.environ, **environment_variables()}, ) - # Log verification results await subprocess_run( [ "git", @@ -973,7 +963,6 @@ async def read_stream(stream, prefix): cwd=worktree_root, ) - # If all tests passed, exit successfully if exit_code == 0: log("Verification successful") return True From 5aff48ee227d0a78a782d634aaef85523a94733a Mon Sep 17 00:00:00 2001 From: David Katz Date: Tue, 8 Apr 2025 12:23:45 -0400 Subject: [PATCH 18/19] review changes --- src/ai_migrate/manifest.py | 4 +-- src/ai_migrate/migrate.py | 47 +++++++++++++++------------------ src/ai_migrate/projects.py | 8 +++--- src/ai_migrate/test_manifest.py | 10 +++---- 4 files changed, 32 insertions(+), 37 deletions(-) diff --git a/src/ai_migrate/manifest.py b/src/ai_migrate/manifest.py index 0ea3685..4fed3ea 100644 --- a/src/ai_migrate/manifest.py +++ b/src/ai_migrate/manifest.py @@ -72,7 +72,7 @@ def to_file_group(self) -> FileGroup: class GooseConfig(BaseModel): - system_prompt: str = f"{{project_dir}}/{GOOSE_PROMPT_FILE}" + user_prompt: str = f"{{project_dir}}/{GOOSE_PROMPT_FILE}" timeout_seconds: int = 15 * 60 max_retries: int = 3 @@ -87,4 +87,4 @@ class Manifest(BaseModel): verify_cmd: str = f"{{py}} {{project_dir}}/{VERIFY_SCRIPT_FILE}" pre_verify_cmd: str = f"{{py}} {{project_dir}}/{VERIFY_SCRIPT_FILE} --pre" time: datetime = Field(default_factory=datetime.now) - goose: GooseConfig = Field(default_factory=GooseConfig) + goose_config: GooseConfig = Field(default_factory=GooseConfig) diff --git a/src/ai_migrate/migrate.py b/src/ai_migrate/migrate.py index 5f4ef73..3cd6222 100644 --- a/src/ai_migrate/migrate.py +++ b/src/ai_migrate/migrate.py @@ -349,7 +349,7 @@ async def run( target_basename: str = "", dont_create_evals: bool = False, tools: list[Tool] = None, - goose: Optional[GooseConfig] = None, + goose_config: Optional[GooseConfig] = None, ): """Run the migration process on the target files. Args: @@ -457,7 +457,7 @@ async def run( target_dir_rel_path=target_dir_rel_path, target_basename=target_basename, tools=tools, - goose=goose, + goose_config=goose_config, ) @@ -533,7 +533,7 @@ async def _run( target_dir_rel_path: Path | str | None = None, target_basename: str = None, tools: list[Tool] = None, - goose: Optional[GooseConfig] = None, + goose_config: Optional[GooseConfig] = None, ): if llm_fakes: client = FakeLLMClient(llm_fakes) @@ -799,16 +799,15 @@ def build_verify_cmd(all_files_to_verify: set[str]): else: log("Migration failed: Out of tries") - if goose: + if goose_config: best_exit_code = float("inf") # Track best exit code so far - for i in range(goose.max_retries): + for i in range(goose_config.max_retries): log(f"Running migration attempt {i + 1} with Goose") - if goose.system_prompt: - goose_extra = Path(goose.system_prompt).read_text() - else: - goose_extra = "" + goose_user_extra = "" + if goose_config.user_prompt: + goose_user_extra = Path(goose_config.user_prompt).read_text() directory_instructions = ( f"You may only make changes to the files inside {target_dir_rel_path}/{target_basename}. Under no circumstances should you touch any files outside of this directory. If I detect that you do, I will be very disappointed in you and will switch to a smarter model." @@ -818,22 +817,18 @@ def build_verify_cmd(all_files_to_verify: set[str]): verify_cmd_str = " ".join(full_verify_cmd) - goose_prompt = f""" -You are a helpful assistant for code migration. The migration is almost done but is not passing verification. With as few changes as possible, make the migration pass verification. - -{directory_instructions} - -You may verify if the migration is correct by running the following command: - -{verify_cmd_str} - -The verification output may be large so pipe it to a file verification_output.txt and read it from there. - -Keep trying until the migration passes verification. -""" + goose_prompt = ( + "You are a helpful assistant for code migration. The migration is almost done but is not passing verification. " + "With as few changes as possible, make the migration pass verification. " + f"{directory_instructions} " + "You may verify if the migration is correct by running the following command: " + f"{verify_cmd_str} " + "The verification output may be large so pipe it to a file verification_output.txt and read it from there. " + "Keep trying until the migration passes verification." + ) - if goose_extra: - goose_prompt += f"\n\n{goose_extra}" + if goose_user_extra: + goose_prompt += f"\n\n{goose_user_extra}" goose_command = [ "goose", @@ -854,10 +849,10 @@ def build_verify_cmd(all_files_to_verify: set[str]): ) async def kill_after_timeout(): - await asyncio.sleep(goose.timeout_seconds) + await asyncio.sleep(goose_config.timeout_seconds) if goose_process.returncode is None: log( - f"[goose] Killing process after {goose.timeout_seconds} seconds timeout" + f"[goose] Killing process after {goose_config.timeout_seconds} seconds timeout" ) goose_process.kill() diff --git a/src/ai_migrate/projects.py b/src/ai_migrate/projects.py index 0f73075..9790052 100644 --- a/src/ai_migrate/projects.py +++ b/src/ai_migrate/projects.py @@ -150,9 +150,9 @@ async def process_one_fileset(index, files: FileGroup, task_name: str): status_manager.get_logger(task_name, header=f"==> {log_file} <=="), log_buffer, ) - if manifest.goose: - manifest.goose.system_prompt = manifest.goose.system_prompt.format( - project_dir=project_dir + if manifest.goose_config: + manifest.goose_config.user_prompt = ( + manifest.goose_config.user_prompt.format(project_dir=project_dir) ) try: @@ -173,7 +173,7 @@ async def process_one_fileset(index, files: FileGroup, task_name: str): target_dir=manifest.target_dir, target_basename=files.base_name, tools=tools, - goose=manifest.goose, + goose_config=manifest.goose_config, ) new_result = "pass" await status_manager.mark_with_status(task_name, Status.PASSED) diff --git a/src/ai_migrate/test_manifest.py b/src/ai_migrate/test_manifest.py index 738334e..b57831e 100644 --- a/src/ai_migrate/test_manifest.py +++ b/src/ai_migrate/test_manifest.py @@ -59,8 +59,8 @@ def test_valid_manifest_groups(): "verify_cmd": "{py} {project_dir}/verify.py", "pre_verify_cmd": "{py} {project_dir}/verify.py --pre", "time": "2025-02-10T11:26:33.969758", - "goose": { - "system_prompt": "{project_dir}/goose_prompt.md", + "goose_config": { + "user_prompt": "{project_dir}/goose_prompt.md", "timeout_seconds": 100, "max_retries": 3 } @@ -99,9 +99,9 @@ def test_valid_manifest_groups(): # The hash should be different because the glob pattern is different assert dir_glob_group_name.split("-")[1] != dir_group_name.split("-")[1] - assert manifest.goose.system_prompt == "{project_dir}/goose_prompt.md" - assert manifest.goose.timeout_seconds == 100 - assert manifest.goose.max_retries == 3 + assert manifest.goose_config.user_prompt == "{project_dir}/goose_prompt.md" + assert manifest.goose_config.timeout_seconds == 100 + assert manifest.goose_config.max_retries == 3 def test_normalize_files(): From d3bd34d8a39eb3f38a180e17e16ac8fb7e8cff07 Mon Sep 17 00:00:00 2001 From: David Katz Date: Tue, 8 Apr 2025 12:24:09 -0400 Subject: [PATCH 19/19] fix lock --- uv.lock | 474 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 237 insertions(+), 237 deletions(-) diff --git a/uv.lock b/uv.lock index 5e91f12..3622a63 100644 --- a/uv.lock +++ b/uv.lock @@ -42,243 +42,243 @@ dev = [{ name = "ruff", specifier = ">=0.9.9" }] [[package]] name = "annotated-types" version = "0.7.0" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89" } +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53" }, + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, ] [[package]] name = "anyio" version = "4.9.0" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "idna" }, { name = "sniffio" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028" } +sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c" }, + { url = "https://files.pythonhosted.org/packages/a1/ee/48ca1a7c89ffec8b6a0c5d02b89c305671d5ffd8d3c94acf8b8c408575bb/anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c", size = 100916 }, ] [[package]] name = "certifi" version = "2025.1.31" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651" } +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/ab/c9f1e32b7b1bf505bf26f0ef697775960db7932abeb7b516de930ba2705f/certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", size = 167577 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" }, + { url = "https://files.pythonhosted.org/packages/38/fc/bce832fd4fd99766c04d1ee0eead6b0ec6486fb100ae5e74c1d91292b982/certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe", size = 166393 }, ] [[package]] name = "charset-normalizer" version = "3.4.1" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3" } -wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85" }, +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/16/b0/572805e227f01586461c80e0fd25d65a2115599cc9dad142fee4b747c357/charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", size = 123188 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/94/ce8e6f63d18049672c76d07d119304e1e2d7c6098f0841b51c666e9f44a0/charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", size = 195698 }, + { url = "https://files.pythonhosted.org/packages/24/2e/dfdd9770664aae179a96561cc6952ff08f9a8cd09a908f259a9dfa063568/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", size = 140162 }, + { url = "https://files.pythonhosted.org/packages/24/4e/f646b9093cff8fc86f2d60af2de4dc17c759de9d554f130b140ea4738ca6/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", size = 150263 }, + { url = "https://files.pythonhosted.org/packages/5e/67/2937f8d548c3ef6e2f9aab0f6e21001056f692d43282b165e7c56023e6dd/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", size = 142966 }, + { url = "https://files.pythonhosted.org/packages/52/ed/b7f4f07de100bdb95c1756d3a4d17b90c1a3c53715c1a476f8738058e0fa/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", size = 144992 }, + { url = "https://files.pythonhosted.org/packages/96/2c/d49710a6dbcd3776265f4c923bb73ebe83933dfbaa841c5da850fe0fd20b/charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", size = 147162 }, + { url = "https://files.pythonhosted.org/packages/b4/41/35ff1f9a6bd380303dea55e44c4933b4cc3c4850988927d4082ada230273/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", size = 140972 }, + { url = "https://files.pythonhosted.org/packages/fb/43/c6a0b685fe6910d08ba971f62cd9c3e862a85770395ba5d9cad4fede33ab/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", size = 149095 }, + { url = "https://files.pythonhosted.org/packages/4c/ff/a9a504662452e2d2878512115638966e75633519ec11f25fca3d2049a94a/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", size = 152668 }, + { url = "https://files.pythonhosted.org/packages/6c/71/189996b6d9a4b932564701628af5cee6716733e9165af1d5e1b285c530ed/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", size = 150073 }, + { url = "https://files.pythonhosted.org/packages/e4/93/946a86ce20790e11312c87c75ba68d5f6ad2208cfb52b2d6a2c32840d922/charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", size = 145732 }, + { url = "https://files.pythonhosted.org/packages/cd/e5/131d2fb1b0dddafc37be4f3a2fa79aa4c037368be9423061dccadfd90091/charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", size = 95391 }, + { url = "https://files.pythonhosted.org/packages/27/f2/4f9a69cc7712b9b5ad8fdb87039fd89abba997ad5cbe690d1835d40405b0/charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", size = 102702 }, + { url = "https://files.pythonhosted.org/packages/0e/f6/65ecc6878a89bb1c23a086ea335ad4bf21a588990c3f535a227b9eea9108/charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", size = 49767 }, ] [[package]] name = "click" version = "8.1.8" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2" }, + { url = "https://files.pythonhosted.org/packages/7e/d4/7ebdbd03970677812aac39c869717059dbb71a4cfc033ca6e5221787892c/click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", size = 98188 }, ] [[package]] name = "colorama" version = "0.4.6" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44" } +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" }, + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] [[package]] name = "deprecated" version = "1.2.18" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "wrapt" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d" } +sdist = { url = "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", size = 2928744 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec" }, + { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998 }, ] [[package]] name = "distro" version = "1.9.0" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed" } +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2" }, + { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277 }, ] [[package]] name = "eval-type-backport" version = "0.2.2" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/30/ea/8b0ac4469d4c347c6a385ff09dc3c048c2d021696664e26c7ee6791631b5/eval_type_backport-0.2.2.tar.gz", hash = "sha256:f0576b4cf01ebb5bd358d02314d31846af5e07678387486e2c798af0e7d849c1" } +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/30/ea/8b0ac4469d4c347c6a385ff09dc3c048c2d021696664e26c7ee6791631b5/eval_type_backport-0.2.2.tar.gz", hash = "sha256:f0576b4cf01ebb5bd358d02314d31846af5e07678387486e2c798af0e7d849c1", size = 9079 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ce/31/55cd413eaccd39125368be33c46de24a1f639f2e12349b0361b4678f3915/eval_type_backport-0.2.2-py3-none-any.whl", hash = "sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a" }, + { url = "https://files.pythonhosted.org/packages/ce/31/55cd413eaccd39125368be33c46de24a1f639f2e12349b0361b4678f3915/eval_type_backport-0.2.2-py3-none-any.whl", hash = "sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a", size = 5830 }, ] [[package]] name = "griffe" version = "1.7.0" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "colorama" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/cc/e1/7dded768fe1adf67879bcd86cf83476e7b19f13d95e6504b6c2b91092f8c/griffe-1.7.0.tar.gz", hash = "sha256:72e9c1593c7af92a387906293fc4a318c2e8e8aef501c64678c809794b4bdca4" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/e1/7dded768fe1adf67879bcd86cf83476e7b19f13d95e6504b6c2b91092f8c/griffe-1.7.0.tar.gz", hash = "sha256:72e9c1593c7af92a387906293fc4a318c2e8e8aef501c64678c809794b4bdca4", size = 394351 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/66/b3/6201c5dc97ed76398eb419d17fe18db6b4b3ffb2baa2bae91b4c65126096/griffe-1.7.0-py3-none-any.whl", hash = "sha256:6b44efc53a3f290d42c4da521f42235177b3bd107877dd55955318a37930c572" }, + { url = "https://files.pythonhosted.org/packages/66/b3/6201c5dc97ed76398eb419d17fe18db6b4b3ffb2baa2bae91b4c65126096/griffe-1.7.0-py3-none-any.whl", hash = "sha256:6b44efc53a3f290d42c4da521f42235177b3bd107877dd55955318a37930c572", size = 129118 }, ] [[package]] name = "h11" version = "0.14.0" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d" } +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" }, + { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, ] [[package]] name = "httpcore" version = "1.0.7" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "certifi" }, { name = "h11" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/41/d7d0a89eb493922c37d343b607bc1b5da7f5be7e383740b4753ad8943e90/httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c", size = 85196 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd" }, + { url = "https://files.pythonhosted.org/packages/87/f5/72347bc88306acb359581ac4d52f23c0ef445b57157adedb9aee0cd689d2/httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd", size = 78551 }, ] [[package]] name = "httpx" version = "0.28.1" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "anyio" }, { name = "certifi" }, { name = "httpcore" }, { name = "idna" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad" }, + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, ] [[package]] name = "idna" version = "3.10" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9" } +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" }, + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, ] [[package]] name = "importlib-metadata" version = "8.6.1" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "zipp" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/33/08/c1395a292bb23fd03bdf572a1357c5a733d3eecbab877641ceacab23db6e/importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580" } +sdist = { url = "https://files.pythonhosted.org/packages/33/08/c1395a292bb23fd03bdf572a1357c5a733d3eecbab877641ceacab23db6e/importlib_metadata-8.6.1.tar.gz", hash = "sha256:310b41d755445d74569f993ccfc22838295d9fe005425094fad953d7f15c8580", size = 55767 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/79/9d/0fb148dc4d6fa4a7dd1d8378168d9b4cd8d4560a6fbf6f0121c5fc34eb68/importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e" }, + { url = "https://files.pythonhosted.org/packages/79/9d/0fb148dc4d6fa4a7dd1d8378168d9b4cd8d4560a6fbf6f0121c5fc34eb68/importlib_metadata-8.6.1-py3-none-any.whl", hash = "sha256:02a89390c1e15fdfdc0d7c6b25cb3e62650d0494005c97d6f148bf5b9787525e", size = 26971 }, ] [[package]] name = "iniconfig" version = "2.1.0" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7" } +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760" }, + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 }, ] [[package]] name = "jiter" version = "0.9.0" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/1e/c2/e4562507f52f0af7036da125bb699602ead37a2332af0788f8e0a3417f36/jiter-0.9.0.tar.gz", hash = "sha256:aadba0964deb424daa24492abc3d229c60c4a31bfee205aedbf1acc7639d7893" } -wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/e7/1b/4cd165c362e8f2f520fdb43245e2b414f42a255921248b4f8b9c8d871ff1/jiter-0.9.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2764891d3f3e8b18dce2cff24949153ee30c9239da7c00f032511091ba688ff7" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/13/aa/7a890dfe29c84c9a82064a9fe36079c7c0309c91b70c380dc138f9bea44a/jiter-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:387b22fbfd7a62418d5212b4638026d01723761c75c1c8232a8b8c37c2f1003b" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/6a/38/5888b43fc01102f733f085673c4f0be5a298f69808ec63de55051754e390/jiter-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d8da8629ccae3606c61d9184970423655fb4e33d03330bcdfe52d234d32f69" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/3d/5e/bbdbb63305bcc01006de683b6228cd061458b9b7bb9b8d9bc348a58e5dc2/jiter-0.9.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1be73d8982bdc278b7b9377426a4b44ceb5c7952073dd7488e4ae96b88e1103" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/75/85/53a3edc616992fe4af6814c25f91ee3b1e22f7678e979b6ea82d3bc0667e/jiter-0.9.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2228eaaaa111ec54b9e89f7481bffb3972e9059301a878d085b2b449fbbde635" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ae/b3/1ee26b12b2693bd3f0b71d3188e4e5d817b12e3c630a09e099e0a89e28fa/jiter-0.9.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11509bfecbc319459647d4ac3fd391d26fdf530dad00c13c4dadabf5b81f01a4" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/11/87/e084ce261950c1861773ab534d49127d1517b629478304d328493f980791/jiter-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f22238da568be8bbd8e0650e12feeb2cfea15eda4f9fc271d3b362a4fa0604d" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f0/06/7dca84b04987e9df563610aa0bc154ea176e50358af532ab40ffb87434df/jiter-0.9.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17f5d55eb856597607562257c8e36c42bc87f16bef52ef7129b7da11afc779f3" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/16/2f/82e1c6020db72f397dd070eec0c85ebc4df7c88967bc86d3ce9864148f28/jiter-0.9.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6a99bed9fbb02f5bed416d137944419a69aa4c423e44189bc49718859ea83bc5" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/36/fd/4f0cd3abe83ce208991ca61e7e5df915aa35b67f1c0633eb7cf2f2e88ec7/jiter-0.9.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e057adb0cd1bd39606100be0eafe742de2de88c79df632955b9ab53a086b3c8d" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a0/3c/8a56f6d547731a0b4410a2d9d16bf39c861046f91f57c98f7cab3d2aa9ce/jiter-0.9.0-cp313-cp313-win32.whl", hash = "sha256:f7e6850991f3940f62d387ccfa54d1a92bd4bb9f89690b53aea36b4364bcab53" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f4/1c/0c996fd90639acda75ed7fa698ee5fd7d80243057185dc2f63d4c1c9f6b9/jiter-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/78/0f/77a63ca7aa5fed9a1b9135af57e190d905bcd3702b36aca46a01090d39ad/jiter-0.9.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0b2827fb88dda2cbecbbc3e596ef08d69bda06c6f57930aec8e79505dc17001" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f9/39/a3a1571712c2bf6ec4c657f0d66da114a63a2e32b7e4eb8e0b83295ee034/jiter-0.9.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062b756ceb1d40b0b28f326cba26cfd575a4918415b036464a52f08632731e5a" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ee/47/3729f00f35a696e68da15d64eb9283c330e776f3b5789bac7f2c0c4df209/jiter-0.9.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6f7838bc467ab7e8ef9f387bd6de195c43bad82a569c1699cb822f6609dd4cdf" }, +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/c2/e4562507f52f0af7036da125bb699602ead37a2332af0788f8e0a3417f36/jiter-0.9.0.tar.gz", hash = "sha256:aadba0964deb424daa24492abc3d229c60c4a31bfee205aedbf1acc7639d7893", size = 162604 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/1b/4cd165c362e8f2f520fdb43245e2b414f42a255921248b4f8b9c8d871ff1/jiter-0.9.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:2764891d3f3e8b18dce2cff24949153ee30c9239da7c00f032511091ba688ff7", size = 308197 }, + { url = "https://files.pythonhosted.org/packages/13/aa/7a890dfe29c84c9a82064a9fe36079c7c0309c91b70c380dc138f9bea44a/jiter-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:387b22fbfd7a62418d5212b4638026d01723761c75c1c8232a8b8c37c2f1003b", size = 318160 }, + { url = "https://files.pythonhosted.org/packages/6a/38/5888b43fc01102f733f085673c4f0be5a298f69808ec63de55051754e390/jiter-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d8da8629ccae3606c61d9184970423655fb4e33d03330bcdfe52d234d32f69", size = 341259 }, + { url = "https://files.pythonhosted.org/packages/3d/5e/bbdbb63305bcc01006de683b6228cd061458b9b7bb9b8d9bc348a58e5dc2/jiter-0.9.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1be73d8982bdc278b7b9377426a4b44ceb5c7952073dd7488e4ae96b88e1103", size = 363730 }, + { url = "https://files.pythonhosted.org/packages/75/85/53a3edc616992fe4af6814c25f91ee3b1e22f7678e979b6ea82d3bc0667e/jiter-0.9.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2228eaaaa111ec54b9e89f7481bffb3972e9059301a878d085b2b449fbbde635", size = 405126 }, + { url = "https://files.pythonhosted.org/packages/ae/b3/1ee26b12b2693bd3f0b71d3188e4e5d817b12e3c630a09e099e0a89e28fa/jiter-0.9.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:11509bfecbc319459647d4ac3fd391d26fdf530dad00c13c4dadabf5b81f01a4", size = 393668 }, + { url = "https://files.pythonhosted.org/packages/11/87/e084ce261950c1861773ab534d49127d1517b629478304d328493f980791/jiter-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f22238da568be8bbd8e0650e12feeb2cfea15eda4f9fc271d3b362a4fa0604d", size = 352350 }, + { url = "https://files.pythonhosted.org/packages/f0/06/7dca84b04987e9df563610aa0bc154ea176e50358af532ab40ffb87434df/jiter-0.9.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17f5d55eb856597607562257c8e36c42bc87f16bef52ef7129b7da11afc779f3", size = 384204 }, + { url = "https://files.pythonhosted.org/packages/16/2f/82e1c6020db72f397dd070eec0c85ebc4df7c88967bc86d3ce9864148f28/jiter-0.9.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:6a99bed9fbb02f5bed416d137944419a69aa4c423e44189bc49718859ea83bc5", size = 520322 }, + { url = "https://files.pythonhosted.org/packages/36/fd/4f0cd3abe83ce208991ca61e7e5df915aa35b67f1c0633eb7cf2f2e88ec7/jiter-0.9.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e057adb0cd1bd39606100be0eafe742de2de88c79df632955b9ab53a086b3c8d", size = 512184 }, + { url = "https://files.pythonhosted.org/packages/a0/3c/8a56f6d547731a0b4410a2d9d16bf39c861046f91f57c98f7cab3d2aa9ce/jiter-0.9.0-cp313-cp313-win32.whl", hash = "sha256:f7e6850991f3940f62d387ccfa54d1a92bd4bb9f89690b53aea36b4364bcab53", size = 206504 }, + { url = "https://files.pythonhosted.org/packages/f4/1c/0c996fd90639acda75ed7fa698ee5fd7d80243057185dc2f63d4c1c9f6b9/jiter-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:c8ae3bf27cd1ac5e6e8b7a27487bf3ab5f82318211ec2e1346a5b058756361f7", size = 204943 }, + { url = "https://files.pythonhosted.org/packages/78/0f/77a63ca7aa5fed9a1b9135af57e190d905bcd3702b36aca46a01090d39ad/jiter-0.9.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f0b2827fb88dda2cbecbbc3e596ef08d69bda06c6f57930aec8e79505dc17001", size = 317281 }, + { url = "https://files.pythonhosted.org/packages/f9/39/a3a1571712c2bf6ec4c657f0d66da114a63a2e32b7e4eb8e0b83295ee034/jiter-0.9.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:062b756ceb1d40b0b28f326cba26cfd575a4918415b036464a52f08632731e5a", size = 350273 }, + { url = "https://files.pythonhosted.org/packages/ee/47/3729f00f35a696e68da15d64eb9283c330e776f3b5789bac7f2c0c4df209/jiter-0.9.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6f7838bc467ab7e8ef9f387bd6de195c43bad82a569c1699cb822f6609dd4cdf", size = 206867 }, ] [[package]] name = "logfire-api" version = "3.11.0" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/6d/09/93ef3606ddb54c7362552ab6be2fb8068a0e24b0d6ba740440b62a753c56/logfire_api-3.11.0.tar.gz", hash = "sha256:e242f10e1f90e34a52e8d62bb410d2b2c4ff0dde15ce0a93414ee96af503e584" } +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/6d/09/93ef3606ddb54c7362552ab6be2fb8068a0e24b0d6ba740440b62a753c56/logfire_api-3.11.0.tar.gz", hash = "sha256:e242f10e1f90e34a52e8d62bb410d2b2c4ff0dde15ce0a93414ee96af503e584", size = 47256 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/b9/eb/83d994ab0b6ff23076c2668527a8fe4069d6dec4333878cb9e1a94c88aac/logfire_api-3.11.0-py3-none-any.whl", hash = "sha256:a556d18a21086d53d51e8775b2ef58a987ebaa372257a5af6668852f44ba17cc" }, + { url = "https://files.pythonhosted.org/packages/b9/eb/83d994ab0b6ff23076c2668527a8fe4069d6dec4333878cb9e1a94c88aac/logfire_api-3.11.0-py3-none-any.whl", hash = "sha256:a556d18a21086d53d51e8775b2ef58a987ebaa372257a5af6668852f44ba17cc", size = 78122 }, ] [[package]] name = "markdown-it-py" version = "3.0.0" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb" } +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1" }, + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528 }, ] [[package]] name = "mdurl" version = "0.1.2" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" } +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8" }, + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, ] [[package]] name = "openai" version = "1.68.2" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "anyio" }, { name = "distro" }, @@ -289,72 +289,72 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/3f/6b/6b002d5d38794645437ae3ddb42083059d556558493408d39a0fcea608bc/openai-1.68.2.tar.gz", hash = "sha256:b720f0a95a1dbe1429c0d9bb62096a0d98057bcda82516f6e8af10284bdd5b19" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/6b/6b002d5d38794645437ae3ddb42083059d556558493408d39a0fcea608bc/openai-1.68.2.tar.gz", hash = "sha256:b720f0a95a1dbe1429c0d9bb62096a0d98057bcda82516f6e8af10284bdd5b19", size = 413429 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/fd/34/cebce15f64eb4a3d609a83ac3568d43005cc9a1cba9d7fde5590fd415423/openai-1.68.2-py3-none-any.whl", hash = "sha256:24484cb5c9a33b58576fdc5acf0e5f92603024a4e39d0b99793dfa1eb14c2b36" }, + { url = "https://files.pythonhosted.org/packages/fd/34/cebce15f64eb4a3d609a83ac3568d43005cc9a1cba9d7fde5590fd415423/openai-1.68.2-py3-none-any.whl", hash = "sha256:24484cb5c9a33b58576fdc5acf0e5f92603024a4e39d0b99793dfa1eb14c2b36", size = 606073 }, ] [[package]] name = "opentelemetry-api" version = "1.31.1" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "deprecated" }, { name = "importlib-metadata" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/8a/cf/db26ab9d748bf50d6edf524fb863aa4da616ba1ce46c57a7dff1112b73fb/opentelemetry_api-1.31.1.tar.gz", hash = "sha256:137ad4b64215f02b3000a0292e077641c8611aab636414632a9b9068593b7e91" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/cf/db26ab9d748bf50d6edf524fb863aa4da616ba1ce46c57a7dff1112b73fb/opentelemetry_api-1.31.1.tar.gz", hash = "sha256:137ad4b64215f02b3000a0292e077641c8611aab636414632a9b9068593b7e91", size = 64059 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/6c/c8/86557ff0da32f3817bc4face57ea35cfdc2f9d3bcefd42311ef860dcefb7/opentelemetry_api-1.31.1-py3-none-any.whl", hash = "sha256:1511a3f470c9c8a32eeea68d4ea37835880c0eed09dd1a0187acc8b1301da0a1" }, + { url = "https://files.pythonhosted.org/packages/6c/c8/86557ff0da32f3817bc4face57ea35cfdc2f9d3bcefd42311ef860dcefb7/opentelemetry_api-1.31.1-py3-none-any.whl", hash = "sha256:1511a3f470c9c8a32eeea68d4ea37835880c0eed09dd1a0187acc8b1301da0a1", size = 65197 }, ] [[package]] name = "packaging" version = "24.2" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" } +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759" }, + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, ] [[package]] name = "pluggy" version = "1.5.0" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1" } +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/96/2d/02d4312c973c6050a18b314a5ad0b3210edb65a906f868e31c111dede4a6/pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", size = 67955 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" }, + { url = "https://files.pythonhosted.org/packages/88/5f/e351af9a41f866ac3f1fac4ca0613908d9a41741cfcf2228f4ad853b697d/pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669", size = 20556 }, ] [[package]] name = "prompt-toolkit" version = "3.0.50" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "wcwidth" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a1/e1/bd15cb8ffdcfeeb2bdc215de3c3cffca11408d829e4b8416dcfe71ba8854/prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/e1/bd15cb8ffdcfeeb2bdc215de3c3cffca11408d829e4b8416dcfe71ba8854/prompt_toolkit-3.0.50.tar.gz", hash = "sha256:544748f3860a2623ca5cd6d2795e7a14f3d0e1c3c9728359013f79877fc89bab", size = 429087 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/e4/ea/d836f008d33151c7a1f62caf3d8dd782e4d15f6a43897f64480c2b8de2ad/prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198" }, + { url = "https://files.pythonhosted.org/packages/e4/ea/d836f008d33151c7a1f62caf3d8dd782e4d15f6a43897f64480c2b8de2ad/prompt_toolkit-3.0.50-py3-none-any.whl", hash = "sha256:9b6427eb19e479d98acff65196a307c555eb567989e6d88ebbb1b509d9779198", size = 387816 }, ] [[package]] name = "pydantic" version = "2.10.6" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "annotated-types" }, { name = "pydantic-core" }, { name = "typing-extensions" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584" }, + { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, ] [[package]] name = "pydantic-ai-slim" version = "0.0.48" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "eval-type-backport" }, { name = "griffe" }, @@ -364,277 +364,277 @@ dependencies = [ { name = "pydantic-graph" }, { name = "typing-inspection" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/7e/a7/605b5e7d8edc2f2ca843f50cb237c11f6e997c3e3ceac29b8d66abc400df/pydantic_ai_slim-0.0.48.tar.gz", hash = "sha256:18fc5c63cb721a393dba6d1090bb58c3a2911a313ef99dbc0b07f6bf6dd2ee62" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/a7/605b5e7d8edc2f2ca843f50cb237c11f6e997c3e3ceac29b8d66abc400df/pydantic_ai_slim-0.0.48.tar.gz", hash = "sha256:18fc5c63cb721a393dba6d1090bb58c3a2911a313ef99dbc0b07f6bf6dd2ee62", size = 108450 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/39/25/21efaadca5ea8b47e6fc346c04eb2473557f1e45e19d40bba66d719c339a/pydantic_ai_slim-0.0.48-py3-none-any.whl", hash = "sha256:8e9a1a03108c842c247f745ad12ecc106801e5deca210dc46fede45baa0fa0c5" }, + { url = "https://files.pythonhosted.org/packages/39/25/21efaadca5ea8b47e6fc346c04eb2473557f1e45e19d40bba66d719c339a/pydantic_ai_slim-0.0.48-py3-none-any.whl", hash = "sha256:8e9a1a03108c842c247f745ad12ecc106801e5deca210dc46fede45baa0fa0c5", size = 141663 }, ] [[package]] name = "pydantic-core" version = "2.27.2" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39" } +sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b" }, + { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, + { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, + { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, + { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, + { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, + { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, + { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, + { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, + { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, + { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, + { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, + { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, + { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, + { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, ] [[package]] name = "pydantic-graph" version = "0.0.48" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "httpx" }, { name = "logfire-api" }, { name = "pydantic" }, { name = "typing-inspection" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/2b/2a/d8f0e3cc53f5be33584e30cd069e31026b379dc90ec8e356a7d4a62c6d8b/pydantic_graph-0.0.48.tar.gz", hash = "sha256:24c9c419d20a30805e49c037d261735bae3bdffa69d98b7927ffd2b1a322df19" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/2a/d8f0e3cc53f5be33584e30cd069e31026b379dc90ec8e356a7d4a62c6d8b/pydantic_graph-0.0.48.tar.gz", hash = "sha256:24c9c419d20a30805e49c037d261735bae3bdffa69d98b7927ffd2b1a322df19", size = 20401 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/20/77/74964c664e36fcf62cf024c854268f4d91f1df41982a4330d9dc275ca7d0/pydantic_graph-0.0.48-py3-none-any.whl", hash = "sha256:74b29538be00be64d56c61c5b99eaf180dbdcfb016c720ab72372093485b2114" }, + { url = "https://files.pythonhosted.org/packages/20/77/74964c664e36fcf62cf024c854268f4d91f1df41982a4330d9dc275ca7d0/pydantic_graph-0.0.48-py3-none-any.whl", hash = "sha256:74b29538be00be64d56c61c5b99eaf180dbdcfb016c720ab72372093485b2114", size = 25818 }, ] [[package]] name = "pygments" version = "2.19.1" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f" } +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/2d/c3338d48ea6cc0feb8446d8e6937e1408088a72a39937982cc6111d17f84/pygments-2.19.1.tar.gz", hash = "sha256:61c16d2a8576dc0649d9f39e089b5f02bcd27fba10d8fb4dcc28173f7a45151f", size = 4968581 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c" }, + { url = "https://files.pythonhosted.org/packages/8a/0b/9fcc47d19c48b59121088dd6da2488a49d5f72dacf8262e2790a1d2c7d15/pygments-2.19.1-py3-none-any.whl", hash = "sha256:9ea1544ad55cecf4b8242fab6dd35a93bbce657034b0611ee383099054ab6d8c", size = 1225293 }, ] [[package]] name = "pytest" version = "8.3.5" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820" }, + { url = "https://files.pythonhosted.org/packages/30/3d/64ad57c803f1fa1e963a7946b6e0fea4a70df53c1a7fed304586539c2bac/pytest-8.3.5-py3-none-any.whl", hash = "sha256:c69214aa47deac29fad6c2a4f590b9c4a9fdb16a403176fe154b79c0b4d4d820", size = 343634 }, ] [[package]] name = "pytest-asyncio" version = "0.26.0" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/8e/c4/453c52c659521066969523e87d85d54139bbd17b78f09532fb8eb8cdb58e/pytest_asyncio-0.26.0.tar.gz", hash = "sha256:c4df2a697648241ff39e7f0e4a73050b03f123f760673956cf0d72a4990e312f" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/c4/453c52c659521066969523e87d85d54139bbd17b78f09532fb8eb8cdb58e/pytest_asyncio-0.26.0.tar.gz", hash = "sha256:c4df2a697648241ff39e7f0e4a73050b03f123f760673956cf0d72a4990e312f", size = 54156 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/20/7f/338843f449ace853647ace35870874f69a764d251872ed1b4de9f234822c/pytest_asyncio-0.26.0-py3-none-any.whl", hash = "sha256:7b51ed894f4fbea1340262bdae5135797ebbe21d8638978e35d31c6d19f72fb0" }, + { url = "https://files.pythonhosted.org/packages/20/7f/338843f449ace853647ace35870874f69a764d251872ed1b4de9f234822c/pytest_asyncio-0.26.0-py3-none-any.whl", hash = "sha256:7b51ed894f4fbea1340262bdae5135797ebbe21d8638978e35d31c6d19f72fb0", size = 19694 }, ] [[package]] name = "regex" version = "2024.11.6" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519" } -wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a" }, +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525 }, + { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324 }, + { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617 }, + { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023 }, + { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072 }, + { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130 }, + { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857 }, + { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006 }, + { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650 }, + { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545 }, + { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045 }, + { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182 }, + { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733 }, + { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122 }, + { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545 }, ] [[package]] name = "requests" version = "2.32.3" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "certifi" }, { name = "charset-normalizer" }, { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760" } +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" }, + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, ] [[package]] name = "rich" version = "13.9.4" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098" } +sdist = { url = "https://files.pythonhosted.org/packages/ab/3a/0316b28d0761c6734d6bc14e770d85506c986c85ffb239e688eeaab2c2bc/rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098", size = 223149 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90" }, + { url = "https://files.pythonhosted.org/packages/19/71/39c7c0d87f8d4e6c020a393182060eaefeeae6c01dab6a84ec346f2567df/rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90", size = 242424 }, ] [[package]] name = "ruff" version = "0.11.2" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/90/61/fb87430f040e4e577e784e325351186976516faef17d6fcd921fe28edfd7/ruff-0.11.2.tar.gz", hash = "sha256:ec47591497d5a1050175bdf4e1a4e6272cddff7da88a2ad595e1e326041d8d94" } -wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/62/99/102578506f0f5fa29fd7e0df0a273864f79af044757aef73d1cae0afe6ad/ruff-0.11.2-py3-none-linux_armv6l.whl", hash = "sha256:c69e20ea49e973f3afec2c06376eb56045709f0212615c1adb0eda35e8a4e477" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/74/ad/5cd4ba58ab602a579997a8494b96f10f316e874d7c435bcc1a92e6da1b12/ruff-0.11.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2c5424cc1c4eb1d8ecabe6d4f1b70470b4f24a0c0171356290b1953ad8f0e272" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/fc/3e/d3f13619e1d152c7b600a38c1a035e833e794c6625c9a6cea6f63dbf3af4/ruff-0.11.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ecf20854cc73f42171eedb66f006a43d0a21bfb98a2523a809931cda569552d9" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/90/06/f77b3d790d24a93f38e3806216f263974909888fd1e826717c3ec956bbcd/ruff-0.11.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c543bf65d5d27240321604cee0633a70c6c25c9a2f2492efa9f6d4b8e4199bb" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/99/7f/78aa431d3ddebfc2418cd95b786642557ba8b3cb578c075239da9ce97ff9/ruff-0.11.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20967168cc21195db5830b9224be0e964cc9c8ecf3b5a9e3ce19876e8d3a96e3" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/30/3e/f11186d1ddfaca438c3bbff73c6a2fdb5b60e6450cc466129c694b0ab7a2/ruff-0.11.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:955a9ce63483999d9f0b8f0b4a3ad669e53484232853054cc8b9d51ab4c5de74" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/22/6c/6ca91befbc0a6539ee133d9a9ce60b1a354db12c3c5d11cfdbf77140f851/ruff-0.11.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:86b3a27c38b8fce73bcd262b0de32e9a6801b76d52cdb3ae4c914515f0cef608" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/19/b0/24516a3b850d55b17c03fc399b681c6a549d06ce665915721dc5d6458a5c/ruff-0.11.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3b66a03b248c9fcd9d64d445bafdf1589326bee6fc5c8e92d7562e58883e30f" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/d7/65/76be06d28ecb7c6070280cef2bcb20c98fbf99ff60b1c57d2fb9b8771348/ruff-0.11.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0397c2672db015be5aa3d4dac54c69aa012429097ff219392c018e21f5085147" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ce/d2/4ceed7147e05852876f3b5f3fdc23f878ce2b7e0b90dd6e698bda3d20787/ruff-0.11.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:869bcf3f9abf6457fbe39b5a37333aa4eecc52a3b99c98827ccc371a8e5b6f1b" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/c4/78/4935ecba13706fd60ebe0e3dc50371f2bdc3d9bc80e68adc32ff93914534/ruff-0.11.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2a2b50ca35457ba785cd8c93ebbe529467594087b527a08d487cf0ee7b3087e9" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/81/7f/1b2435c3f5245d410bb5dc80f13ec796454c21fbda12b77d7588d5cf4e29/ruff-0.11.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7c69c74bf53ddcfbc22e6eb2f31211df7f65054bfc1f72288fc71e5f82db3eab" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/39/c4/692284c07e6bf2b31d82bb8c32f8840f9d0627d92983edaac991a2b66c0a/ruff-0.11.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6e8fb75e14560f7cf53b15bbc55baf5ecbe373dd5f3aab96ff7aa7777edd7630" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/94/cf/8ab81cb7dd7a3b0a3960c2769825038f3adcd75faf46dd6376086df8b128/ruff-0.11.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:842a472d7b4d6f5924e9297aa38149e5dcb1e628773b70e6387ae2c97a63c58f" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/d9/3a/a647fa4f316482dacf2fd68e8a386327a33d6eabd8eb2f9a0c3d291ec549/ruff-0.11.2-py3-none-win32.whl", hash = "sha256:aca01ccd0eb5eb7156b324cfaa088586f06a86d9e5314b0eb330cb48415097cc" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/86/54/3c12d3af58012a5e2cd7ebdbe9983f4834af3f8cbea0e8a8c74fa1e23b2b/ruff-0.11.2-py3-none-win_amd64.whl", hash = "sha256:3170150172a8f994136c0c66f494edf199a0bbea7a409f649e4bc8f4d7084080" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/d6/d4/dd813703af8a1e2ac33bf3feb27e8a5ad514c9f219df80c64d69807e7f71/ruff-0.11.2-py3-none-win_arm64.whl", hash = "sha256:52933095158ff328f4c77af3d74f0379e34fd52f175144cefc1b192e7ccd32b4" }, +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/90/61/fb87430f040e4e577e784e325351186976516faef17d6fcd921fe28edfd7/ruff-0.11.2.tar.gz", hash = "sha256:ec47591497d5a1050175bdf4e1a4e6272cddff7da88a2ad595e1e326041d8d94", size = 3857511 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/99/102578506f0f5fa29fd7e0df0a273864f79af044757aef73d1cae0afe6ad/ruff-0.11.2-py3-none-linux_armv6l.whl", hash = "sha256:c69e20ea49e973f3afec2c06376eb56045709f0212615c1adb0eda35e8a4e477", size = 10113146 }, + { url = "https://files.pythonhosted.org/packages/74/ad/5cd4ba58ab602a579997a8494b96f10f316e874d7c435bcc1a92e6da1b12/ruff-0.11.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2c5424cc1c4eb1d8ecabe6d4f1b70470b4f24a0c0171356290b1953ad8f0e272", size = 10867092 }, + { url = "https://files.pythonhosted.org/packages/fc/3e/d3f13619e1d152c7b600a38c1a035e833e794c6625c9a6cea6f63dbf3af4/ruff-0.11.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:ecf20854cc73f42171eedb66f006a43d0a21bfb98a2523a809931cda569552d9", size = 10224082 }, + { url = "https://files.pythonhosted.org/packages/90/06/f77b3d790d24a93f38e3806216f263974909888fd1e826717c3ec956bbcd/ruff-0.11.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c543bf65d5d27240321604cee0633a70c6c25c9a2f2492efa9f6d4b8e4199bb", size = 10394818 }, + { url = "https://files.pythonhosted.org/packages/99/7f/78aa431d3ddebfc2418cd95b786642557ba8b3cb578c075239da9ce97ff9/ruff-0.11.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20967168cc21195db5830b9224be0e964cc9c8ecf3b5a9e3ce19876e8d3a96e3", size = 9952251 }, + { url = "https://files.pythonhosted.org/packages/30/3e/f11186d1ddfaca438c3bbff73c6a2fdb5b60e6450cc466129c694b0ab7a2/ruff-0.11.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:955a9ce63483999d9f0b8f0b4a3ad669e53484232853054cc8b9d51ab4c5de74", size = 11563566 }, + { url = "https://files.pythonhosted.org/packages/22/6c/6ca91befbc0a6539ee133d9a9ce60b1a354db12c3c5d11cfdbf77140f851/ruff-0.11.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:86b3a27c38b8fce73bcd262b0de32e9a6801b76d52cdb3ae4c914515f0cef608", size = 12208721 }, + { url = "https://files.pythonhosted.org/packages/19/b0/24516a3b850d55b17c03fc399b681c6a549d06ce665915721dc5d6458a5c/ruff-0.11.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a3b66a03b248c9fcd9d64d445bafdf1589326bee6fc5c8e92d7562e58883e30f", size = 11662274 }, + { url = "https://files.pythonhosted.org/packages/d7/65/76be06d28ecb7c6070280cef2bcb20c98fbf99ff60b1c57d2fb9b8771348/ruff-0.11.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0397c2672db015be5aa3d4dac54c69aa012429097ff219392c018e21f5085147", size = 13792284 }, + { url = "https://files.pythonhosted.org/packages/ce/d2/4ceed7147e05852876f3b5f3fdc23f878ce2b7e0b90dd6e698bda3d20787/ruff-0.11.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:869bcf3f9abf6457fbe39b5a37333aa4eecc52a3b99c98827ccc371a8e5b6f1b", size = 11327861 }, + { url = "https://files.pythonhosted.org/packages/c4/78/4935ecba13706fd60ebe0e3dc50371f2bdc3d9bc80e68adc32ff93914534/ruff-0.11.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2a2b50ca35457ba785cd8c93ebbe529467594087b527a08d487cf0ee7b3087e9", size = 10276560 }, + { url = "https://files.pythonhosted.org/packages/81/7f/1b2435c3f5245d410bb5dc80f13ec796454c21fbda12b77d7588d5cf4e29/ruff-0.11.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7c69c74bf53ddcfbc22e6eb2f31211df7f65054bfc1f72288fc71e5f82db3eab", size = 9945091 }, + { url = "https://files.pythonhosted.org/packages/39/c4/692284c07e6bf2b31d82bb8c32f8840f9d0627d92983edaac991a2b66c0a/ruff-0.11.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6e8fb75e14560f7cf53b15bbc55baf5ecbe373dd5f3aab96ff7aa7777edd7630", size = 10977133 }, + { url = "https://files.pythonhosted.org/packages/94/cf/8ab81cb7dd7a3b0a3960c2769825038f3adcd75faf46dd6376086df8b128/ruff-0.11.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:842a472d7b4d6f5924e9297aa38149e5dcb1e628773b70e6387ae2c97a63c58f", size = 11378514 }, + { url = "https://files.pythonhosted.org/packages/d9/3a/a647fa4f316482dacf2fd68e8a386327a33d6eabd8eb2f9a0c3d291ec549/ruff-0.11.2-py3-none-win32.whl", hash = "sha256:aca01ccd0eb5eb7156b324cfaa088586f06a86d9e5314b0eb330cb48415097cc", size = 10319835 }, + { url = "https://files.pythonhosted.org/packages/86/54/3c12d3af58012a5e2cd7ebdbe9983f4834af3f8cbea0e8a8c74fa1e23b2b/ruff-0.11.2-py3-none-win_amd64.whl", hash = "sha256:3170150172a8f994136c0c66f494edf199a0bbea7a409f649e4bc8f4d7084080", size = 11373713 }, + { url = "https://files.pythonhosted.org/packages/d6/d4/dd813703af8a1e2ac33bf3feb27e8a5ad514c9f219df80c64d69807e7f71/ruff-0.11.2-py3-none-win_arm64.whl", hash = "sha256:52933095158ff328f4c77af3d74f0379e34fd52f175144cefc1b192e7ccd32b4", size = 10441990 }, ] [[package]] name = "sniffio" version = "1.3.1" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" } +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2" }, + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, ] [[package]] name = "tiktoken" version = "0.9.0" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "regex" }, { name = "requests" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ea/cf/756fedf6981e82897f2d570dd25fa597eb3f4459068ae0572d7e888cfd6f/tiktoken-0.9.0.tar.gz", hash = "sha256:d02a5ca6a938e0490e1ff957bc48c8b078c88cb83977be1625b1fd8aac792c5d" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/cf/756fedf6981e82897f2d570dd25fa597eb3f4459068ae0572d7e888cfd6f/tiktoken-0.9.0.tar.gz", hash = "sha256:d02a5ca6a938e0490e1ff957bc48c8b078c88cb83977be1625b1fd8aac792c5d", size = 35991 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/7a/11/09d936d37f49f4f494ffe660af44acd2d99eb2429d60a57c71318af214e0/tiktoken-0.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b0e8e05a26eda1249e824156d537015480af7ae222ccb798e5234ae0285dbdb" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/80/0e/f38ba35713edb8d4197ae602e80837d574244ced7fb1b6070b31c29816e0/tiktoken-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:27d457f096f87685195eea0165a1807fae87b97b2161fe8c9b1df5bd74ca6f63" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/fe/82/9197f77421e2a01373e27a79dd36efdd99e6b4115746ecc553318ecafbf0/tiktoken-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cf8ded49cddf825390e36dd1ad35cd49589e8161fdcb52aa25f0583e90a3e01" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f2/bb/4513da71cac187383541facd0291c4572b03ec23c561de5811781bbd988f/tiktoken-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc156cb314119a8bb9748257a2eaebd5cc0753b6cb491d26694ed42fc7cb3139" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/fa/5c/74e4c137530dd8504e97e3a41729b1103a4ac29036cbfd3250b11fd29451/tiktoken-0.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cd69372e8c9dd761f0ab873112aba55a0e3e506332dd9f7522ca466e817b1b7a" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/de/a8/8f499c179ec900783ffe133e9aab10044481679bb9aad78436d239eee716/tiktoken-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:5ea0edb6f83dc56d794723286215918c1cde03712cbbafa0348b33448faf5b95" }, + { url = "https://files.pythonhosted.org/packages/7a/11/09d936d37f49f4f494ffe660af44acd2d99eb2429d60a57c71318af214e0/tiktoken-0.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b0e8e05a26eda1249e824156d537015480af7ae222ccb798e5234ae0285dbdb", size = 1064919 }, + { url = "https://files.pythonhosted.org/packages/80/0e/f38ba35713edb8d4197ae602e80837d574244ced7fb1b6070b31c29816e0/tiktoken-0.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:27d457f096f87685195eea0165a1807fae87b97b2161fe8c9b1df5bd74ca6f63", size = 1007877 }, + { url = "https://files.pythonhosted.org/packages/fe/82/9197f77421e2a01373e27a79dd36efdd99e6b4115746ecc553318ecafbf0/tiktoken-0.9.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cf8ded49cddf825390e36dd1ad35cd49589e8161fdcb52aa25f0583e90a3e01", size = 1140095 }, + { url = "https://files.pythonhosted.org/packages/f2/bb/4513da71cac187383541facd0291c4572b03ec23c561de5811781bbd988f/tiktoken-0.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc156cb314119a8bb9748257a2eaebd5cc0753b6cb491d26694ed42fc7cb3139", size = 1195649 }, + { url = "https://files.pythonhosted.org/packages/fa/5c/74e4c137530dd8504e97e3a41729b1103a4ac29036cbfd3250b11fd29451/tiktoken-0.9.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cd69372e8c9dd761f0ab873112aba55a0e3e506332dd9f7522ca466e817b1b7a", size = 1258465 }, + { url = "https://files.pythonhosted.org/packages/de/a8/8f499c179ec900783ffe133e9aab10044481679bb9aad78436d239eee716/tiktoken-0.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:5ea0edb6f83dc56d794723286215918c1cde03712cbbafa0348b33448faf5b95", size = 894669 }, ] [[package]] name = "tqdm" version = "4.67.1" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2" } +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2" }, + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, ] [[package]] name = "typing-extensions" version = "4.12.2" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" } +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/df/db/f35a00659bc03fec321ba8bce9420de607a1d37f8342eee1863174c69557/typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8", size = 85321 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d" }, + { url = "https://files.pythonhosted.org/packages/26/9f/ad63fc0248c5379346306f8668cda6e2e2e9c95e01216d2b8ffd9ff037d0/typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", size = 37438 }, ] [[package]] name = "typing-inspection" version = "0.4.0" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } +source = { registry = "https://pypi.org/simple/" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122" } +sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f" }, + { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 }, ] [[package]] name = "urllib3" version = "2.3.0" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" } +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/63/e53da845320b757bf29ef6a9062f5c669fe997973f966045cb019c3f4b66/urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d", size = 307268 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df" }, + { url = "https://files.pythonhosted.org/packages/c8/19/4ec628951a74043532ca2cf5d97b7b14863931476d117c471e8e2b1eb39f/urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", size = 128369 }, ] [[package]] name = "wcwidth" version = "0.2.13" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" } +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859" }, + { url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 }, ] [[package]] name = "wrapt" version = "1.17.2" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3" } -wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ce/b9/0ffd557a92f3b11d4c5d5e0c5e4ad057bd9eb8586615cdaf901409920b14/wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/c0/ef/8be90a0b7e73c32e550c73cfb2fa09db62234227ece47b0e80a05073b375/wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/36/89/0aae34c10fe524cce30fe5fc433210376bce94cf74d05b0d68344c8ba46e/wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/3b/24/11c4510de906d77e0cfb5197f1b1445d4fec42c9a39ea853d482698ac681/wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/71/d7/cfcf842291267bf455b3e266c0c29dcb675b5540ee8b50ba1699abf3af45/wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/d5/66/5d973e9f3e7370fd686fb47a9af3319418ed925c27d72ce16b791231576d/wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a7/d3/8e17bb70f6ae25dabc1aaf990f86824e4fd98ee9cadf197054e068500d27/wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/6f/54/f170dfb278fe1c30d0ff864513cff526d624ab8de3254b20abb9cffedc24/wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/4a/98/de07243751f1c4a9b15c76019250210dd3486ce098c3d80d5f729cba029c/wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/3d/bc/30f903f891a82d402ffb5fda27ec1d621cc97cb74c16fea0b6141f1d4e87/wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/8a/04/c97273eb491b5f1c918857cd26f314b74fc9b29224521f5b83f872253725/wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/4e/ca/3b7afa1eae3a9e7fefe499db9b96813f41828b9fdb016ee836c4c379dadb/wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/89/be/7c1baed43290775cb9030c774bc53c860db140397047cc49aedaf0a15477/wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/32/98/4ed894cf012b6d6aae5f5cc974006bdeb92f0241775addad3f8cd6ab71c8/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/ea/fd/0c30f2301ca94e655e5e057012e83284ce8c545df7661a78d8bfca2fac7a/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/75/56/05d000de894c4cfcb84bcd6b1df6214297b8089a7bd324c21a4765e49b14/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/53/f8/c3f6b2cf9b9277fb0813418e1503e68414cd036b3b099c823379c9575e6d/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/a7/b1/0bb11e29aa5139d90b770ebbfa167267b1fc548d2302c30c8f7572851738/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c" }, - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8" }, +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/b9/0ffd557a92f3b11d4c5d5e0c5e4ad057bd9eb8586615cdaf901409920b14/wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125", size = 53800 }, + { url = "https://files.pythonhosted.org/packages/c0/ef/8be90a0b7e73c32e550c73cfb2fa09db62234227ece47b0e80a05073b375/wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998", size = 38824 }, + { url = "https://files.pythonhosted.org/packages/36/89/0aae34c10fe524cce30fe5fc433210376bce94cf74d05b0d68344c8ba46e/wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5", size = 38920 }, + { url = "https://files.pythonhosted.org/packages/3b/24/11c4510de906d77e0cfb5197f1b1445d4fec42c9a39ea853d482698ac681/wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8", size = 88690 }, + { url = "https://files.pythonhosted.org/packages/71/d7/cfcf842291267bf455b3e266c0c29dcb675b5540ee8b50ba1699abf3af45/wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6", size = 80861 }, + { url = "https://files.pythonhosted.org/packages/d5/66/5d973e9f3e7370fd686fb47a9af3319418ed925c27d72ce16b791231576d/wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc", size = 89174 }, + { url = "https://files.pythonhosted.org/packages/a7/d3/8e17bb70f6ae25dabc1aaf990f86824e4fd98ee9cadf197054e068500d27/wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2", size = 86721 }, + { url = "https://files.pythonhosted.org/packages/6f/54/f170dfb278fe1c30d0ff864513cff526d624ab8de3254b20abb9cffedc24/wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b", size = 79763 }, + { url = "https://files.pythonhosted.org/packages/4a/98/de07243751f1c4a9b15c76019250210dd3486ce098c3d80d5f729cba029c/wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504", size = 87585 }, + { url = "https://files.pythonhosted.org/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a", size = 36676 }, + { url = "https://files.pythonhosted.org/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845", size = 38871 }, + { url = "https://files.pythonhosted.org/packages/3d/bc/30f903f891a82d402ffb5fda27ec1d621cc97cb74c16fea0b6141f1d4e87/wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192", size = 56312 }, + { url = "https://files.pythonhosted.org/packages/8a/04/c97273eb491b5f1c918857cd26f314b74fc9b29224521f5b83f872253725/wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b", size = 40062 }, + { url = "https://files.pythonhosted.org/packages/4e/ca/3b7afa1eae3a9e7fefe499db9b96813f41828b9fdb016ee836c4c379dadb/wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0", size = 40155 }, + { url = "https://files.pythonhosted.org/packages/89/be/7c1baed43290775cb9030c774bc53c860db140397047cc49aedaf0a15477/wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306", size = 113471 }, + { url = "https://files.pythonhosted.org/packages/32/98/4ed894cf012b6d6aae5f5cc974006bdeb92f0241775addad3f8cd6ab71c8/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb", size = 101208 }, + { url = "https://files.pythonhosted.org/packages/ea/fd/0c30f2301ca94e655e5e057012e83284ce8c545df7661a78d8bfca2fac7a/wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681", size = 109339 }, + { url = "https://files.pythonhosted.org/packages/75/56/05d000de894c4cfcb84bcd6b1df6214297b8089a7bd324c21a4765e49b14/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6", size = 110232 }, + { url = "https://files.pythonhosted.org/packages/53/f8/c3f6b2cf9b9277fb0813418e1503e68414cd036b3b099c823379c9575e6d/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6", size = 100476 }, + { url = "https://files.pythonhosted.org/packages/a7/b1/0bb11e29aa5139d90b770ebbfa167267b1fc548d2302c30c8f7572851738/wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f", size = 106377 }, + { url = "https://files.pythonhosted.org/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555", size = 37986 }, + { url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750 }, + { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 }, ] [[package]] name = "zipp" version = "3.21.0" -source = { registry = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/simple" } -sdist = { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/3f/50/bad581df71744867e9468ebd0bcd6505de3b275e06f202c2cb016e3ff56f/zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4" } +source = { registry = "https://pypi.org/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/50/bad581df71744867e9468ebd0bcd6505de3b275e06f202c2cb016e3ff56f/zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4", size = 24545 } wheels = [ - { url = "https://global.block-artifacts.com/artifactory/api/pypi/block-pypi/packages/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931" }, + { url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931", size = 9630 }, ]