From eec4b3669094832ddce69a10cf08b8ffa4276d69 Mon Sep 17 00:00:00 2001 From: Davis Vann Bennett Date: Thu, 13 Aug 2026 11:18:22 +0200 Subject: [PATCH 1/4] deps: bump cast-value.rs to >= 0.4.2 --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index e0fbfc08fc..af341172d5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -68,7 +68,7 @@ remote = [ gpu = [ "cupy-cuda12x; sys_platform != 'darwin'", ] -cast-value-rs = ["cast-value-rs"] +cast-value-rs = ["cast-value-rs>=0.4.2"] cli = ["typer"] optional = ["universal-pathlib"] From 582dc167cca1bd9551568d92e36a48a5f4fd63f1 Mon Sep 17 00:00:00 2001 From: Davis Vann Bennett Date: Thu, 13 Aug 2026 16:40:39 +0200 Subject: [PATCH 2/4] deps: update uv.lock for cast-value-rs >= 0.4.2 The pyproject floor alone left uv.lock pinning 0.4.0, so any lock-honoring install (uv sync --locked/--frozen) kept the version that silently transposes non-row-major input. Assisted-by: ClaudeCode:claude-fable-5 --- uv.lock | 122 +++++++++++++++++++++++++++----------------------------- 1 file changed, 58 insertions(+), 64 deletions(-) diff --git a/uv.lock b/uv.lock index 120b187e7d..b342de22d2 100644 --- a/uv.lock +++ b/uv.lock @@ -376,69 +376,63 @@ wheels = [ [[package]] name = "cast-value-rs" -version = "0.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/88/3659e7a3e5c861ad1c689145adf26cc1a47a9e3dd8367690bfaab9fae161/cast_value_rs-0.4.0.tar.gz", hash = "sha256:26d71727b0b20c84ddcc721eddfc338fcfc2bd7dc500e0727fded2112a3ce7c3", size = 48896, upload-time = "2026-04-01T21:02:33.292Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/0b/13bbb127b1695272ab391d8d81266ae4fbae3dbcbb3943b1c712bc32ea82/cast_value_rs-0.4.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f2f9c4ace575812436d74e84bf9c8e297e2c3c7d1aaccfa4507d4efc0b0b642c", size = 509234, upload-time = "2026-04-01T21:00:10.683Z" }, - { url = "https://files.pythonhosted.org/packages/1d/d7/fb1e893a6897dbba983854942a1c5bd9d2689ae5e640c1878856bfbad4f6/cast_value_rs-0.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:233aca7d1012056f064c0e13921d1ddcd0998824225614fdd72afc325114eafd", size = 465329, upload-time = "2026-04-01T21:00:12.221Z" }, - { url = "https://files.pythonhosted.org/packages/6c/61/087af77ba17979b0b6f4556793b36407f04457768f6127877ac50728c5fb/cast_value_rs-0.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0eaddd64f2e00a8545279a0d937d8e41c85df847b1d34d693199a5946489a8d", size = 494432, upload-time = "2026-04-01T21:00:13.501Z" }, - { url = "https://files.pythonhosted.org/packages/5d/98/c0c4239f1172d64eee3eeaa11aed9b096429d94f22e2d052ac8eaa55016b/cast_value_rs-0.4.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c15d16d459f43c66f4e913eef97aeb9f593e783344d276f93c86fc4785eadc8", size = 531316, upload-time = "2026-04-01T21:00:15.146Z" }, - { url = "https://files.pythonhosted.org/packages/4a/a6/cd954496bde7ca8d55018e389643a9a053e165cb0bb9e9ab08a6a5679bbd/cast_value_rs-0.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94f1430914a585f8475bc3b0617cc67d9eecb928cfe90548aa36a96ebdfed877", size = 659598, upload-time = "2026-04-01T21:00:16.71Z" }, - { url = "https://files.pythonhosted.org/packages/de/12/58e62a3ba13e68969a51b180b8d94c13754cd41dbb8a751f724de25c17dd/cast_value_rs-0.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6b7bc5a910c2554da173e050bf49c2b24086273ce72fb3d941e58d2387174a99", size = 562379, upload-time = "2026-04-01T21:00:17.975Z" }, - { url = "https://files.pythonhosted.org/packages/6d/20/d6e5555fbad2c7a89740d44c235a8db00913370fdec218fa7c5ba67b3d02/cast_value_rs-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b251eaf7dae58e51119b0f827fb348a72990ebe887e69d3a8b2c86f13b4c82ae", size = 556899, upload-time = "2026-04-01T21:00:19.45Z" }, - { url = "https://files.pythonhosted.org/packages/45/0d/d4f81048ba28c0867076a9e5fa65af849260c5643be1f8ebf6e356e51999/cast_value_rs-0.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f97ea32da52c147342afe89c5bbfd7edc9644c832b2f54deb3388afb0c1ae911", size = 587816, upload-time = "2026-04-01T21:00:20.827Z" }, - { url = "https://files.pythonhosted.org/packages/9d/d2/fe6ebbc017d75920b095150ae02aff387b710c24562ae23c96c9b388e787/cast_value_rs-0.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:52763c9da83e3e00dc8e63cd15b25bc9044bdd85148d67a3979fb396954c45be", size = 671468, upload-time = "2026-04-01T21:00:22.265Z" }, - { url = "https://files.pythonhosted.org/packages/5a/78/9ee727254cc74198e34571d97260590bbdd11b71f193ddccf8374fc14629/cast_value_rs-0.4.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e01e1941d035e1c640dfb900c89fab50787665640cd99ce403842de584720c68", size = 809484, upload-time = "2026-04-01T21:00:23.668Z" }, - { url = "https://files.pythonhosted.org/packages/9b/2b/07f75100dc76e600c3c9562e72d4be05a3a6bc4fc761d5a4dddb169f282a/cast_value_rs-0.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:840f3000310aa2846839cd547312371d3e5a73cc95ed750e6c726638cf6c762c", size = 803296, upload-time = "2026-04-01T21:00:25.433Z" }, - { url = "https://files.pythonhosted.org/packages/e3/9e/5b9d2e4fb157ddc8a5ee15d380e145078fad126f138630cf2bac5136971e/cast_value_rs-0.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ee3813bd223a45dd67a1a848ede57f6677183320152a315b3c69db8f745e9f2", size = 760952, upload-time = "2026-04-01T21:00:27.002Z" }, - { url = "https://files.pythonhosted.org/packages/8e/8e/6ff327c27b7e24161b5d04f7916bce044c3d7750695d1d7ed139f13e977f/cast_value_rs-0.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:bc91d540ddc6e16785e464867a980c4fb714dc0d83a16d2dfa604604403266bd", size = 442019, upload-time = "2026-04-01T21:00:28.322Z" }, - { url = "https://files.pythonhosted.org/packages/04/3f/ed6b219d7b62d32a0248940891c75dfc97e4df88e62966076cb0f5f9fc91/cast_value_rs-0.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:01a8161db167a4cf1d73b3eced2af01ed7bc0a6ffa937c3bd5ff33af79ba51c4", size = 387803, upload-time = "2026-04-01T21:00:30.151Z" }, - { url = "https://files.pythonhosted.org/packages/d3/9d/16d38e5cdb91df16b06f4145482aacc3d486789d4901d149c8e346ff121d/cast_value_rs-0.4.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:a4a3b92d45447ca8407ccc4e4c50dbffb5f0266b83bc4eec8d44de51c8a5e7cd", size = 509653, upload-time = "2026-04-01T21:00:31.422Z" }, - { url = "https://files.pythonhosted.org/packages/da/74/e293ca02ce1e0e8b3be08d2c28e450a3321eb2526af35b5c4e6837904181/cast_value_rs-0.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:63d06fc8ce800a98ce542da5a7631a39a19e3f1e99a25546e392bf415ccaaf0d", size = 465604, upload-time = "2026-04-01T21:00:32.759Z" }, - { url = "https://files.pythonhosted.org/packages/4f/6d/1b7f161028fa617c9e896b37f014dce393578bfda32362de5b9e7f623d2c/cast_value_rs-0.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e8a4b525b9cdf0b7fd62373e3452b62973943d441820bf49a71d6bb6ae4e55d", size = 494568, upload-time = "2026-04-01T21:00:34.277Z" }, - { url = "https://files.pythonhosted.org/packages/fc/7b/e1f51e320330ac75ffecf037dd100d66c89a0b534fa4adc7cd8ffb87b2aa/cast_value_rs-0.4.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d605e8d8bd5ec841c7b7e8302ef3fd944ed4af5d89f7ecdc60f71309712a319", size = 532007, upload-time = "2026-04-01T21:00:35.813Z" }, - { url = "https://files.pythonhosted.org/packages/03/b8/f2e109eee0dbdf611b608ee3384c9b5c8cf953c2dac80c9ce181c2a8e475/cast_value_rs-0.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9a77f9debac4f017748695b5e126f137fbc62df3f02ef90467f50791d5d2572", size = 660049, upload-time = "2026-04-01T21:00:37.062Z" }, - { url = "https://files.pythonhosted.org/packages/c6/f9/eafbe3622f0f2ec35979059ee693a25a219549ca727741d105a41246e35d/cast_value_rs-0.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dab9edb59f25165a934022b2372865cd19bdb187719c1df324b503f478524276", size = 562394, upload-time = "2026-04-01T21:00:38.754Z" }, - { url = "https://files.pythonhosted.org/packages/cb/ae/96c0bafb8f1dc3b55598dbb34b1febf92632f1f2c4a7d439866593c8fa0a/cast_value_rs-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:972df11faab7b0794f16c3d6f8040a9c6b9c55b5ffc23e232057d141103f9830", size = 556762, upload-time = "2026-04-01T21:00:39.977Z" }, - { url = "https://files.pythonhosted.org/packages/a4/47/db0182272fa794fba3c0102d28b9c7eaaab9755bae3ff4d603d66a6d0fe8/cast_value_rs-0.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a226c0ceb6397751bf92475b6f0d63f843ca81e8c7e94ce023d33e78b96e5d9f", size = 587838, upload-time = "2026-04-01T21:00:41.281Z" }, - { url = "https://files.pythonhosted.org/packages/08/74/733a8c1562f6001888652cf5867d6439fd92aae5db4ce8979d1150fa1c2e/cast_value_rs-0.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbe2bd7df06bc8cafd3fbbcb66ea3f8ccbb2273c771fbe3538f98205f455705c", size = 671420, upload-time = "2026-04-01T21:00:42.559Z" }, - { url = "https://files.pythonhosted.org/packages/b7/ff/725a0eb649a5a512c6aab87dfd9b2159c3fbe103a6ee1f63bbfe80969d34/cast_value_rs-0.4.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:efc00cfc1b376b920839424244fa7d79c7e2ee26b62e8c48ebc025e0bf350770", size = 809907, upload-time = "2026-04-01T21:00:44.147Z" }, - { url = "https://files.pythonhosted.org/packages/0a/66/abedf22ec734f387dddc8a8a2fb72587adbe1c48ce144649dcc63c86eb6d/cast_value_rs-0.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7dad4ecf608c7170f78ae45e0454b891c6c0e579c1190b68a5e448b714b79257", size = 803277, upload-time = "2026-04-01T21:00:45.545Z" }, - { url = "https://files.pythonhosted.org/packages/5f/1b/8f19f848ca622c3090be39759420820ff70ac414be41b1762c191de06394/cast_value_rs-0.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:15c89f529b4cc37ebac8b2f6e0a1f8a90e2b2b71703e6629d3ff579efab77323", size = 761021, upload-time = "2026-04-01T21:00:46.962Z" }, - { url = "https://files.pythonhosted.org/packages/fb/1a/684b634f621e35b4b0bbbde7ec28913b8925002b865e6f7b9d886dcccaef/cast_value_rs-0.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:a6247099de0b71e63f8156bbd97f9e964a1ddcc9b3d547b6a4839a0e911bdf54", size = 441797, upload-time = "2026-04-01T21:00:48.671Z" }, - { url = "https://files.pythonhosted.org/packages/cc/35/393c9a1ccd4f2b85b178bda2b3f73ee6aae133d03b9be18ddce43b2ee6f9/cast_value_rs-0.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:fb18be6232a4e6d616e1ba2555bf105e663d22091abd0c6371d8f1a4c1670c82", size = 387884, upload-time = "2026-04-01T21:00:49.936Z" }, - { url = "https://files.pythonhosted.org/packages/fb/a1/ac26f64f9ffda3d9f0b4a350b7a727da17ee5be417545743c84fd18ab5ef/cast_value_rs-0.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c51764b7fcedd5484ae4f7d8ee7a1f7f7a40736789f9c412f1ba780a6aba0cb", size = 490003, upload-time = "2026-04-01T21:00:51.191Z" }, - { url = "https://files.pythonhosted.org/packages/b6/e9/a74d2ecc6e8f5fa0bd23b8f45ae1f11800b3e079c31f4eaad120140ed942/cast_value_rs-0.4.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5afeb1555b24a73c2b344dbb19e91a83260751dc2f8f9e1d3d1b44535cd3f520", size = 518662, upload-time = "2026-04-01T21:00:52.513Z" }, - { url = "https://files.pythonhosted.org/packages/61/0d/7d25a5dc2e5f6a284684e39859607d41cb1fa5a3219d372facffd04c7ed9/cast_value_rs-0.4.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9111ce32ca83a61565d92200b462007af6b1aa8895c81ea4732057567784298", size = 652482, upload-time = "2026-04-01T21:00:53.765Z" }, - { url = "https://files.pythonhosted.org/packages/6a/36/d71bac4a6589fcb6d1320940bd8744cf2dcce65928d0de021c87d0356ae9/cast_value_rs-0.4.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aeab17fe7e6cc1881af272bc681f7ae3971e11d079e440efd9012ed7d9e074d3", size = 558125, upload-time = "2026-04-01T21:00:55.429Z" }, - { url = "https://files.pythonhosted.org/packages/86/9f/74a5dcb2dcfc3aaad6f9308d3ce0cf59be32b0d9563328c9331457888fd5/cast_value_rs-0.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b5b040dd4838d0e4b2dee603bf61bef5b0625c35a91e859b0abd103c275c4207", size = 666195, upload-time = "2026-04-01T21:00:57.05Z" }, - { url = "https://files.pythonhosted.org/packages/27/02/8c66fb39dd8c3efa05b3ee70c135aefc1631cf28cc08fca1d20515f34da4/cast_value_rs-0.4.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:59a55898bbf82d8d2b417960aac9db6fa195cd44451e7667076d5b8eb0b28ffd", size = 796949, upload-time = "2026-04-01T21:00:58.399Z" }, - { url = "https://files.pythonhosted.org/packages/cc/13/349a2f64e1a0ffa2d211c9282d1cc7b41ac5edf473d24ec95cbc9d2fbf70/cast_value_rs-0.4.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:a528723cef699de74bf7344d55e8b2f21e2fdaf24dda22cf9bbb0f75effb296f", size = 778419, upload-time = "2026-04-01T21:01:00.154Z" }, - { url = "https://files.pythonhosted.org/packages/b9/1b/926df4b577ed051920a63e13ac1435fdb9f7fbd5d28c2f7ec545050be675/cast_value_rs-0.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a8d7a887e44a3ef642f5b5e462b6352062ba8041ef6d90f4b31c816f63dbb34f", size = 741379, upload-time = "2026-04-01T21:01:01.996Z" }, - { url = "https://files.pythonhosted.org/packages/b9/36/3ec2848a1914655e85201f8def177526b4c17802b9530f17ad53de68c42a/cast_value_rs-0.4.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:4c73d47bd6d4e066b99482a48fc48a3a6220b42a282063125e3fa6c495754698", size = 509569, upload-time = "2026-04-01T21:01:03.308Z" }, - { url = "https://files.pythonhosted.org/packages/47/b9/2ea6f9de182e0b454e852435d26238bef8eb58995ff8a1b4c48bb00ae4bc/cast_value_rs-0.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:18d0bdec57d7e747bec3fb258c7d2d48389bd8f05df5f59f109f9a8ec1f41dc1", size = 465923, upload-time = "2026-04-01T21:01:04.68Z" }, - { url = "https://files.pythonhosted.org/packages/a9/15/feab5abdc6b02db474d840130b5a2a64afcb757db5f83446ca874eac6de5/cast_value_rs-0.4.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c03a09951fcb2433dd55d28ffffb04f5119d8abd5d231fc739a49908a9cab47b", size = 494033, upload-time = "2026-04-01T21:01:06.263Z" }, - { url = "https://files.pythonhosted.org/packages/94/f6/d40ec4d3db15e07864038bdf4c8ab11165a517fa88d507bc5b859573aadd/cast_value_rs-0.4.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84494970c1b3aa373100671b0b3a01f56c65a4dd5ed16b1be8c565ac6b3f0000", size = 532024, upload-time = "2026-04-01T21:01:07.574Z" }, - { url = "https://files.pythonhosted.org/packages/d5/88/0cc4718632c9e47e7558964fa1d78841737f19a49c68e6aa7ac1074faf61/cast_value_rs-0.4.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f95e67121c7ddbb1c06719694bb1559fd8d6e4e826ef1f93be7df5106b4f1c6", size = 661337, upload-time = "2026-04-01T21:01:09.152Z" }, - { url = "https://files.pythonhosted.org/packages/b8/4f/26acfba143169e319267dcc93ccf55a113ebb99fc6bb1209195ded2c5f60/cast_value_rs-0.4.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67079ea95b83b6c41471c35d7ae821d9148cf66739281c07bfd8f4ccbced5c8c", size = 562268, upload-time = "2026-04-01T21:01:10.547Z" }, - { url = "https://files.pythonhosted.org/packages/3e/19/c23c8ebae9a06bf919ed4788e80c90cbc23b6443e5adf797a59967b66602/cast_value_rs-0.4.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:259b1b315171e8e1bde0284828601c289f1c75dc782cdb215786aec3b79a05f5", size = 555358, upload-time = "2026-04-01T21:01:12.024Z" }, - { url = "https://files.pythonhosted.org/packages/05/dd/df59efda2ded4eddfb0d7f3f473a2efd638a5cc0775f3d91646293970572/cast_value_rs-0.4.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:84b733c91540247abee411d7052406a68f60ceaabb33a70a5eac7fd333d74220", size = 588031, upload-time = "2026-04-01T21:01:13.343Z" }, - { url = "https://files.pythonhosted.org/packages/8d/1f/97b1d82b696f0b77ae9cba4ca6368a9d0f3ee61a6b7907fd34b1d8e117e8/cast_value_rs-0.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c007832a316160c08642aed44bef1e2f3103488e29fb078f7c571c01e6f65caf", size = 671191, upload-time = "2026-04-01T21:01:14.627Z" }, - { url = "https://files.pythonhosted.org/packages/b8/99/343eebb11a372defd7b049c0f627d29c67450bd5f9fbf28241d1f7b0712f/cast_value_rs-0.4.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:d8b2b9b69314b4596beaadb6c98a955bd6b1d988f54ae4cd14ab804f6e1bd450", size = 810173, upload-time = "2026-04-01T21:01:16.267Z" }, - { url = "https://files.pythonhosted.org/packages/06/32/739a3ca0b9ef1f97929faf06a7b68b64b01cce0f9bcbeb885c0c51ac24e4/cast_value_rs-0.4.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:6a2de5f66441a174ec8cc63e672f2b6ddc4aada73fb98d795e0da17d9c41771a", size = 805596, upload-time = "2026-04-01T21:01:17.711Z" }, - { url = "https://files.pythonhosted.org/packages/24/3f/56b33108837f195730a3f9467f686010132f459f0fcd050d8de74b111f74/cast_value_rs-0.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2c0b31d3f8ef8857f7b0a7b2e6ef1b43e1a88263cb20406860ce38a06c727f1a", size = 759220, upload-time = "2026-04-01T21:01:19.29Z" }, - { url = "https://files.pythonhosted.org/packages/d4/a1/18cbe0d297ba384a75f1d4476d67e88b5525afab77bddad6b8478992a8f3/cast_value_rs-0.4.0-cp314-cp314-win32.whl", hash = "sha256:6339adbce2686ad8218a38d17b543d71c062fb341c1411be6c45ab425abd2c64", size = 373865, upload-time = "2026-04-01T21:01:21.1Z" }, - { url = "https://files.pythonhosted.org/packages/93/4c/2dc5a2347c150bd8aa1e67549f8e03368a4249f214548e237c191514ac0e/cast_value_rs-0.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:0dd4240cb62ddee6b2f794151a5d7b263dfb22cd8d0903598a1d900bd1d7b536", size = 443712, upload-time = "2026-04-01T21:01:22.768Z" }, - { url = "https://files.pythonhosted.org/packages/25/3b/4c560902bf7825c1c479c3f0084aedec73cd355d54931bad4995faeb0f3f/cast_value_rs-0.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:6852abf682a5e9fa2bab04ccd43dc24dfe1056653f1a92dcf1a0d9ebd07af2cc", size = 388130, upload-time = "2026-04-01T21:01:24.284Z" }, - { url = "https://files.pythonhosted.org/packages/b7/c0/f32d10128e6f0f5a58bc9adcb7525f5fa241bd682af0bb0fb7ce92b4f200/cast_value_rs-0.4.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4fbddd4e2b255219597c39092ba10d9873c9fe37a8189add459fe77f310b86e", size = 489885, upload-time = "2026-04-01T21:01:25.596Z" }, - { url = "https://files.pythonhosted.org/packages/bc/20/302156a38f1c7aef7f25864fd5895e831f5304a67d5af4d33874f676cdbf/cast_value_rs-0.4.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:01e053e5022cab8ce4a2e7605afe3e7c5685e3f56c90d05adcda69f8e5ec12d9", size = 517573, upload-time = "2026-04-01T21:01:26.887Z" }, - { url = "https://files.pythonhosted.org/packages/a0/cd/d1502aa5bf0fb0fb5d410d0dac67962c47df9ea6a8d0934cd95f15a09834/cast_value_rs-0.4.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2840f7b76085e472f510ec0e1802ae5799f85a5c2ed9d909a9790c15054f0480", size = 649447, upload-time = "2026-04-01T21:01:28.219Z" }, - { url = "https://files.pythonhosted.org/packages/0a/0a/f580ff584de55f1884cd8c15e1d2c9256188e58c5c981cd249894e2a87a4/cast_value_rs-0.4.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86a75d9ba1315c3ad33690e5f251ebfe053ed84cfe645d027d2e639f4a4c6dd7", size = 558318, upload-time = "2026-04-01T21:01:29.51Z" }, - { url = "https://files.pythonhosted.org/packages/2b/46/15f7318c2de3831689c0d9c40ed9a9179488d1650e1201e581df29fc10ea/cast_value_rs-0.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:4a56393964fea114ccb09d2c0fd14939e4aac0fb3178c7ff7af6b9f530f04267", size = 666217, upload-time = "2026-04-01T21:01:30.871Z" }, - { url = "https://files.pythonhosted.org/packages/3a/3f/716eb0d80ef6b7c9498487cefb86e603a0f893a2e11273fe6484659b46bf/cast_value_rs-0.4.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:ab4b8d4cbb7bfcf73690c36447d34af66bcab7fb7bdf8242ee33cb725e2ed736", size = 796289, upload-time = "2026-04-01T21:01:32.546Z" }, - { url = "https://files.pythonhosted.org/packages/fb/98/162a1d37a3d574783ff8d09286ffa33a108493c53367802e617f47607837/cast_value_rs-0.4.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3693cf1b91b624061bcd649be53b2dd367ea3c18c212790c9a84a050df40ecca", size = 777483, upload-time = "2026-04-01T21:01:33.867Z" }, - { url = "https://files.pythonhosted.org/packages/df/e3/6e3390fc9693d5a5e9ca0d677ca8666174a1e43328bdf57b9af23f138143/cast_value_rs-0.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:2a343f5cdddb17b7ae95ef9fa6013f8e66bd40ee97ceaa47e8972c021814df59", size = 744015, upload-time = "2026-04-01T21:01:35.143Z" }, +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/56/a4/634d1917ac49ea69291471e87eee9c1aa45d71d6da9b2cd5e1bfe82729de/cast_value_rs-0.4.2.tar.gz", hash = "sha256:fd621b8dd4f7e93bbffdb119882d85e2731c2f0fb1d30de85f29e8e04c044822", size = 86862, upload-time = "2026-08-13T09:16:59.199Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/c7/9db59d415df2d1c9f905c4da951fe023c6259a162584ef68bd81c171d448/cast_value_rs-0.4.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:6d8e1c6d7b0fec6b1060f83867d20ebd0cb1ac6fa2954cd82f418a31a96ac504", size = 494354, upload-time = "2026-08-13T09:14:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/8f/53/10ece0b4ba4a0c156674c2db7e5d05ce9b04efe72e191417546e111d645c/cast_value_rs-0.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8c953321ff7954e0fe1b25c1baf96f0a9cae0961b8a56ce63dc7b94e2ea7d85c", size = 458463, upload-time = "2026-08-13T09:14:43.371Z" }, + { url = "https://files.pythonhosted.org/packages/91/0b/e50ac2eb271eb6c34402b4abe317c795bc7d650d332d0bf422ae868aa2cd/cast_value_rs-0.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68492eef745691c80754cd027e216dbd5f7a4ce2e07fddfded3ee59bd947afb5", size = 487628, upload-time = "2026-08-13T09:14:44.86Z" }, + { url = "https://files.pythonhosted.org/packages/a9/0f/69befc7905af2e73a2739b26444787cd528331c041f37235f3853bf15f75/cast_value_rs-0.4.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fbf145ed6f724fa7f5ddc9715f78e0d450ac141fc05299c83b2e7d627793ddaf", size = 555538, upload-time = "2026-08-13T09:14:46.305Z" }, + { url = "https://files.pythonhosted.org/packages/4a/1b/4105fabec3268139bda3555422808211ec29428e17fa56566c1af7957c04/cast_value_rs-0.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73fb23256dda16e4e9f49bfedebe0e068f00ece85091b526c102618f66144216", size = 650896, upload-time = "2026-08-13T09:14:48.049Z" }, + { url = "https://files.pythonhosted.org/packages/83/2a/452cf37675af02c3ac8bfa01fc962cb744a1392c51bccfb6d1faca423067/cast_value_rs-0.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8184135c78ebcabb904574a1b3bc5704c131140feae1b58d65c888fe08b46029", size = 561036, upload-time = "2026-08-13T09:14:49.431Z" }, + { url = "https://files.pythonhosted.org/packages/d4/87/edb215d17da304a6b36489fc51b8eb785c5b041c2fcc5f200f16adde3133/cast_value_rs-0.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:686ea86aad1ffebd0b6793549043108600593a85032457eb88a3a0513a4100f5", size = 549187, upload-time = "2026-08-13T09:14:50.801Z" }, + { url = "https://files.pythonhosted.org/packages/63/82/0f9963ef0bcb434cd1244cb2620123c2d71763d429d017ceb98fbb6faf48/cast_value_rs-0.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d6c425d2803e13408755a0022faa9efd0ab0becdf3573a1a8a7af64b1adee4ba", size = 591027, upload-time = "2026-08-13T09:14:52.281Z" }, + { url = "https://files.pythonhosted.org/packages/90/97/b489f8048491f2ece21bf99d5a1fea3bbfaf3cd0e9f555ac4a0352c11d81/cast_value_rs-0.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:92556f1bb9d6b222736d967228565ec745c640c29bc291d1cb730a1011d3dcac", size = 665201, upload-time = "2026-08-13T09:14:53.769Z" }, + { url = "https://files.pythonhosted.org/packages/ce/9f/fabffd9788f0b2d3f49ca4582b8859ab58b929b1b8837ec0be1263399279/cast_value_rs-0.4.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1b0881c23a8f5ff1dc6c70542179f2fc9191e0b7fa7a02f65316fb48904cd8d1", size = 831085, upload-time = "2026-08-13T09:14:55.244Z" }, + { url = "https://files.pythonhosted.org/packages/b5/66/ca653bf9b51eb624615623611db28ec9428a351259fcf5625c5520faf759/cast_value_rs-0.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8a67648bf47d9b740388efaf6f05185f22dea783e97eba895efdd1dbafe8e3cc", size = 788462, upload-time = "2026-08-13T09:14:56.666Z" }, + { url = "https://files.pythonhosted.org/packages/f1/54/3a9280f791c8765a54f7814a010d2f460c7d5f5483be3e5634f4d9b38d75/cast_value_rs-0.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:decf297bc576675fff2139885fb88f84844e27b99e5d28eaa01909db7a327c4b", size = 753055, upload-time = "2026-08-13T09:14:58.302Z" }, + { url = "https://files.pythonhosted.org/packages/06/26/09f4618dbab2de8ea427e817c349b8391b4d559316de899e9b54dde6143e/cast_value_rs-0.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:79a8c13af39bf65014dd6567dc5fa7c42dfda246e4335ab52814f3dd6fb42cac", size = 442068, upload-time = "2026-08-13T09:15:00.414Z" }, + { url = "https://files.pythonhosted.org/packages/fc/49/7def5933625ff3c98e7d20cbd7de0aa1e83098ffa425a9df087764657767/cast_value_rs-0.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:b8af7de3639271ad9e62aba4d15ddd22819c706bd7c7859663fdbb022397bdad", size = 397846, upload-time = "2026-08-13T09:15:02.022Z" }, + { url = "https://files.pythonhosted.org/packages/6f/fc/1f48ae9ea1f10caf3bbc31b288d08137835d8965188f6ddcccdb3c7d398e/cast_value_rs-0.4.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:297445abc64891a2e62af93e4f35bb280f874ac548646d0a6b04a86d45e636a5", size = 494394, upload-time = "2026-08-13T09:15:03.604Z" }, + { url = "https://files.pythonhosted.org/packages/7f/f3/d633218979cd8839fcfbade64a277c0ff9d8ff59d21bbd8a59f1467085b4/cast_value_rs-0.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b8b6e0781b4ce61a559cc050d836a52157bd30b1f59d63fdeee79fbc19ab7e57", size = 458677, upload-time = "2026-08-13T09:15:04.947Z" }, + { url = "https://files.pythonhosted.org/packages/97/e4/96d72ccf5e00dd7af7bf55c96313df2ffba1f34a224f10430716232775c0/cast_value_rs-0.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8399dc89570c01537c07adc03fc2fc0e43a517be8a198e2f9e3f8a70dd003be0", size = 487289, upload-time = "2026-08-13T09:15:06.493Z" }, + { url = "https://files.pythonhosted.org/packages/93/30/18313de8c1d3826e9a6abd883b7a7981b19391f674dcd52ff2635d19f8ee/cast_value_rs-0.4.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:939417d72c9945ce24eb959e6b2cd32f7aa7d0a50a06a0fac484056b10b650dd", size = 555221, upload-time = "2026-08-13T09:15:08.28Z" }, + { url = "https://files.pythonhosted.org/packages/e9/1f/ed22b2e536ccbd4c5b234d869fc8f478347a45f7b940273023a0d6013134/cast_value_rs-0.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:101318e594ee998a5ccbc5ea7ed045cbd9fd22d45cac467c745fbd30309f1343", size = 650972, upload-time = "2026-08-13T09:15:10.103Z" }, + { url = "https://files.pythonhosted.org/packages/d7/d2/39f9ff9b678dfb01d206aec6be0f486137d5e9669ebadf0d1f356d2a7324/cast_value_rs-0.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d23bac26b2c2fe6a2368d10fbb072a71671f6e0d4d8cf9e893f62ed3530bbd1b", size = 560869, upload-time = "2026-08-13T09:15:11.602Z" }, + { url = "https://files.pythonhosted.org/packages/60/18/f63e8378db66b5a99e96c1422c68ba02a4e35de34355b90cf6d169d99ae6/cast_value_rs-0.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9d799a20d7517974d61d7c4dd54e5d7ef439e726012c087bada31bc644b1535", size = 548885, upload-time = "2026-08-13T09:15:13.18Z" }, + { url = "https://files.pythonhosted.org/packages/98/af/12349007b670b11e16d3be51c29ab2398550b2653dae692a5d788d3dda87/cast_value_rs-0.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b9f0f04815efcc47592474e91f61f24810139396696f0690f3d0bf0e6ff3bb4a", size = 590846, upload-time = "2026-08-13T09:15:14.67Z" }, + { url = "https://files.pythonhosted.org/packages/a3/cf/6a39df104923bc397ae58f90e21d1e87edd62d17f24fe3d6777e6c4d3e5f/cast_value_rs-0.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e69f81dab0b47c74c1f30c79198c412938b6c41510b8124dbd08fb36d13a8807", size = 665064, upload-time = "2026-08-13T09:15:16.527Z" }, + { url = "https://files.pythonhosted.org/packages/36/df/0a9ac5bae4e1d3b7b4a79795054d822c26bdbc3bedad71fe13e8ce666c4b/cast_value_rs-0.4.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:59e15ec495e8707447180e0111e65e083464da60236edd5c3387efedce3da997", size = 830909, upload-time = "2026-08-13T09:15:18.088Z" }, + { url = "https://files.pythonhosted.org/packages/2f/7d/9e99c969dd76087dbf731667982d8bb6b390d29c8f37c09dd330657b0487/cast_value_rs-0.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f9e787397588fabb28a146a28159150f44e8ef85a25abe364f989044f1b7159d", size = 788217, upload-time = "2026-08-13T09:15:19.706Z" }, + { url = "https://files.pythonhosted.org/packages/21/a9/5d7410d37be26bed1dc740c885a0c7fdb213b93e9b13ac76fb3282aa50ea/cast_value_rs-0.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5c66ca6ad21758993830a9f4d24263065727bf767e4524d79ded0c0b61e3da9d", size = 752817, upload-time = "2026-08-13T09:15:21.197Z" }, + { url = "https://files.pythonhosted.org/packages/65/10/9c18cb01104bb211c9b0d9a956fae3f1a40f743c35bbc6763d0114ec36a7/cast_value_rs-0.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:26fe305d5bd35d21c5ee72c5651892895447e175ba3019a24713c565d965c0ef", size = 442025, upload-time = "2026-08-13T09:15:22.575Z" }, + { url = "https://files.pythonhosted.org/packages/64/49/42a0b48a71aca3ebb0abd0948fa9d484723c3562af30a8d6904b874abb2f/cast_value_rs-0.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:9ce6678fc4b1bdc459178225347acd8019f1d22bca1e13ab86cc2a3e4ecb2f46", size = 397871, upload-time = "2026-08-13T09:15:23.906Z" }, + { url = "https://files.pythonhosted.org/packages/be/e9/baf39cd3991962705ffd055fce071e23e7707f62df3fb44af2ffe0e84d11/cast_value_rs-0.4.2-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:cefdcfd4d2b95e3b35fd98b3d3d865be9b3ef1bc1264db3bc1b8c50c5e8ac999", size = 495672, upload-time = "2026-08-13T09:15:25.168Z" }, + { url = "https://files.pythonhosted.org/packages/ed/9f/7ac6bf95d160f3fd89020aa952ffb4a49216b85a3fda02f84bc2c2612a2f/cast_value_rs-0.4.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbcec2cfd199c1e404f5bda71b273b4a7470762f4b55c1c21f09d60d2762e339", size = 458480, upload-time = "2026-08-13T09:15:26.647Z" }, + { url = "https://files.pythonhosted.org/packages/65/e5/46c2985ccbae41c8140f04f2acc9080761f10e8d2f8101c46083e632f812/cast_value_rs-0.4.2-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c224a9b30c2521cd06eac4bb1ac3860f41c902695e6f806344bc039d7a8a1d93", size = 486807, upload-time = "2026-08-13T09:15:28.129Z" }, + { url = "https://files.pythonhosted.org/packages/18/13/97851c45b275fbc9d42b5d5a340fd5ea430525b60c2eacfe6a36399d69ef/cast_value_rs-0.4.2-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1eaa7c3d5fe418a74928f78514f9baeaeb8e31b93db96b1761edd6144f0d2eff", size = 555335, upload-time = "2026-08-13T09:15:29.648Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b3/c84c1e820786ddb062b162112b80e5dfc1b5b54b11125618f38c1e18d075/cast_value_rs-0.4.2-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bddec46b36f29964c8d4bbe82b8270575fbe1c0fb41c404bb3da1778f390a24", size = 650347, upload-time = "2026-08-13T09:15:31.044Z" }, + { url = "https://files.pythonhosted.org/packages/60/38/52b4cc31570384e0286e28a03164a357d53a8aba7421ef83e500843d5449/cast_value_rs-0.4.2-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab3fd77144d26e2da2a113f862c05ea1cf465df347daf5deb6cf1689253fddfa", size = 561498, upload-time = "2026-08-13T09:15:32.485Z" }, + { url = "https://files.pythonhosted.org/packages/41/c8/313e1d016b0adfccd1ead2bb28d2c94313ab62534bd6e11db19a480d3b55/cast_value_rs-0.4.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4affe8668a2f17764ed978c2dddb2b49554f36a71389e6928a8a5523c1a4173", size = 548676, upload-time = "2026-08-13T09:15:33.912Z" }, + { url = "https://files.pythonhosted.org/packages/81/8b/a11f8e514598ebfc084507b0db390ecbdc6bfcffbf91ae666e0de93e6c25/cast_value_rs-0.4.2-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a67316b00ca01a78865d222badef2b1cb6c60ad5ebd360bf4fa3b224e87b8ffa", size = 590803, upload-time = "2026-08-13T09:15:35.384Z" }, + { url = "https://files.pythonhosted.org/packages/94/1e/ed86da6fe69eff312cc83e348cf4715d4168ab2699783febd24bfd477cd8/cast_value_rs-0.4.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9946054c77d7c5df579e9e99ebebd4d8a220cb04a6af1b6467112dfe07eee72d", size = 664118, upload-time = "2026-08-13T09:15:36.797Z" }, + { url = "https://files.pythonhosted.org/packages/0b/01/58a3eadff1233bd98d5809e2f6b5dc6d1b8c4c770664145f57fd0bdce756/cast_value_rs-0.4.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:95b064458233a7ef0525481eccfd2d37e86620d877ab1535ae809d37355cf131", size = 830686, upload-time = "2026-08-13T09:15:38.645Z" }, + { url = "https://files.pythonhosted.org/packages/e6/40/a234d9d06013a0bee08f662ab083b3a55decfa2dbb315094fdf06693d425/cast_value_rs-0.4.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:d7de068a1dcc65d1aaf4e93228198b588776bd25b62ef42478ab7efe5245a6f3", size = 787835, upload-time = "2026-08-13T09:15:40.078Z" }, + { url = "https://files.pythonhosted.org/packages/d6/72/93f906345d03972de52e3e74dd4ed12b56aab53bec85cc96020690ba6dbe/cast_value_rs-0.4.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae0cbdd44290a74e34519eb990b33bf0f8e96f0fde95ffc799913ff1aab27719", size = 753039, upload-time = "2026-08-13T09:15:41.702Z" }, + { url = "https://files.pythonhosted.org/packages/e3/a5/47b6db4f68da086db3f3768775f545b9b7f660cab8f61039c91de1f813c4/cast_value_rs-0.4.2-cp314-cp314-win32.whl", hash = "sha256:d438517530d3a8d6bc810ab6dee831c48b45287435513fea1b0476b5d4fda07d", size = 387092, upload-time = "2026-08-13T09:15:43.218Z" }, + { url = "https://files.pythonhosted.org/packages/d3/9c/5f71a5e94875bb999646227a583792dbbe9a2b257df0d961e8a2da879f9e/cast_value_rs-0.4.2-cp314-cp314-win_amd64.whl", hash = "sha256:7e7bb9faa4820b7eb0d99074fd61efff3a7392e72b6abe4b41c9d6b6d14fe457", size = 442126, upload-time = "2026-08-13T09:15:44.623Z" }, + { url = "https://files.pythonhosted.org/packages/95/1c/8e7546a044da8e92eafbb12594169301cc94e2a071fd3e34204595d0a05f/cast_value_rs-0.4.2-cp314-cp314-win_arm64.whl", hash = "sha256:1f57e762a06102d61e940548a6ab841e05ad1f51f1c4e2aa26bc27a8c59a5abc", size = 398200, upload-time = "2026-08-13T09:15:46.117Z" }, + { url = "https://files.pythonhosted.org/packages/a0/09/527646deeb622e5a597e4271e9e06d9d7cd24d64de77b8cb4ce250128c18/cast_value_rs-0.4.2-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:230f6440db74d2d11e513060d0e72aa3f897546465bc778d30aaeac90f8e733e", size = 485197, upload-time = "2026-08-13T09:15:47.622Z" }, + { url = "https://files.pythonhosted.org/packages/b9/79/aaa713cb151a902439b670a4774ea76d0a5dadf1f03954f6a34af2a6cb1e/cast_value_rs-0.4.2-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37538170dc1fedbfd62dd56670e443b881474e7eda7f583a3c989c83a9ff15fc", size = 538669, upload-time = "2026-08-13T09:15:49.148Z" }, + { url = "https://files.pythonhosted.org/packages/d3/b1/2cf4f4f13f74caaa4dab4ddf4924fdeeffb39920d5ec30a80112aa041efa/cast_value_rs-0.4.2-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:86d00b9cef0d38d0c5631ba63270c38c5d7c85aa87c609644f204919f939f0c9", size = 649341, upload-time = "2026-08-13T09:15:50.614Z" }, + { url = "https://files.pythonhosted.org/packages/39/8b/1faa6b27cda3dd793635c7945118e49188b6714d6bf23bb072efd718e467/cast_value_rs-0.4.2-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89434eebb7a12f66e99382e08c32648f055e24d9fce66274adef6620af2aebbd", size = 555253, upload-time = "2026-08-13T09:15:52.252Z" }, + { url = "https://files.pythonhosted.org/packages/8b/c2/d31f177025b51a3fda70c5888b92f5fd30ec53bc2df2c046fc9a2717cd36/cast_value_rs-0.4.2-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:704171aec75f417f5a70a3eb5f107fbfc79183620093c9d9074290920a5981f1", size = 547964, upload-time = "2026-08-13T09:15:53.669Z" }, + { url = "https://files.pythonhosted.org/packages/64/99/521c2d6347ca39deef237909dfee61c6d2cb806dcc20d74636e209bc646e/cast_value_rs-0.4.2-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2add2599d299436ec161661a8e119a69742c763a0936e542db92b1ce9d6e0c04", size = 574778, upload-time = "2026-08-13T09:15:55.479Z" }, + { url = "https://files.pythonhosted.org/packages/f0/70/35c7cb37839454aeb93b9576b42daebd8249dd59e3834cd1be020b4b0660/cast_value_rs-0.4.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:da5df79a926bdcc1f5494612f621027970a9702eb49d556068025166d4c0ace2", size = 662461, upload-time = "2026-08-13T09:15:56.97Z" }, + { url = "https://files.pythonhosted.org/packages/24/4f/a71bfaea1286bd12cc912733d650bd89a07c4430ee715202551c6e3eb0b0/cast_value_rs-0.4.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:5552e3c80d43de7a8a821793cb57da0dd3720a377051a5bf86bcabe094e87777", size = 814743, upload-time = "2026-08-13T09:15:58.652Z" }, + { url = "https://files.pythonhosted.org/packages/94/a3/b04e0f42dafeae30604abca079cce303ebb69ba24f3c4debbf211ecc781c/cast_value_rs-0.4.2-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:73978c6dd2ce45a05a59ec7090df8b3f2a579ee86db9b1c7df21ede17f32189e", size = 782340, upload-time = "2026-08-13T09:16:00.135Z" }, + { url = "https://files.pythonhosted.org/packages/3a/6c/913de75054092de796509dc04b92fc6ac1bf83dc86901f1f482667dead16/cast_value_rs-0.4.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:45d630592afb18880d4df0d7afb28b8cfc0ba6aa742d8db115f616df284b453a", size = 754068, upload-time = "2026-08-13T09:16:01.572Z" }, ] [[package]] @@ -3547,7 +3541,7 @@ test = [ [package.metadata] requires-dist = [ - { name = "cast-value-rs", marker = "extra == 'cast-value-rs'" }, + { name = "cast-value-rs", marker = "extra == 'cast-value-rs'", specifier = ">=0.4.2" }, { name = "cupy-cuda12x", marker = "sys_platform != 'darwin' and extra == 'gpu'" }, { name = "donfig", specifier = ">=0.8" }, { name = "fsspec", marker = "extra == 'remote'", specifier = ">=2023.10.0" }, From 806959edfc165a68fe50d34cb56fbc1dec27ead9 Mon Sep 17 00:00:00 2001 From: Davis Vann Bennett Date: Thu, 13 Aug 2026 16:46:04 +0200 Subject: [PATCH 3/4] fix(cast_value): enforce the cast-value-rs floor at runtime The pyproject floor only binds installs that go through the zarr[cast-value-rs] extra. An environment that already has an older cast-value-rs installed kept silently corrupting non-row-major input after upgrading zarr, which is the failure this floor exists to stop. Check the installed version at import and raise from _do_cast, so the error surfaces when the codec is used rather than breaking `import zarr` for everyone else. A backend without distribution metadata (a `maturin develop` build) has no version to compare and is left alone. Assisted-by: ClaudeCode:claude-fable-5 --- changes/4260.bugfix.md | 1 + src/zarr/codecs/cast_value.py | 45 ++++++++++++--- tests/test_codecs/test_cast_value.py | 84 ++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+), 9 deletions(-) create mode 100644 changes/4260.bugfix.md diff --git a/changes/4260.bugfix.md b/changes/4260.bugfix.md new file mode 100644 index 0000000000..b703c47a35 --- /dev/null +++ b/changes/4260.bugfix.md @@ -0,0 +1 @@ +The `cast_value` codec now requires `cast-value-rs>=0.4.2`. Earlier versions of that backend silently corrupted data when handed an array that was not row-major — the layout the `transpose` codec produces — so a `cast_value` codec next to a `transpose` codec would either write transposed values with no error or fail with `ValueError: Input array must be contiguous`. The minimum version is enforced at runtime as well as in the package metadata, so an environment that already has an older `cast-value-rs` installed now raises `ImportError` when the codec is used, instead of corrupting data. diff --git a/src/zarr/codecs/cast_value.py b/src/zarr/codecs/cast_value.py index eb8a4de248..b19a10c873 100644 --- a/src/zarr/codecs/cast_value.py +++ b/src/zarr/codecs/cast_value.py @@ -5,16 +5,18 @@ rounding, out-of-range handling, and explicit scalar mappings. Requires the optional ``cast-value-rs`` package for the actual casting -logic. Install it with: ``pip install cast-value-rs``. +logic. Install it with: ``pip install 'cast-value-rs>=0.4.2'``. """ from __future__ import annotations from collections.abc import Mapping from dataclasses import dataclass, replace +from importlib.metadata import PackageNotFoundError, version from typing import TYPE_CHECKING, Final, Literal, TypedDict, cast import numpy as np +from packaging.version import Version from zarr.abc.codec import ArrayArrayCodec from zarr.core.common import JSON, parse_named_configuration @@ -123,12 +125,40 @@ def parse_scalar_map(obj: ScalarMapJSON | ScalarMap) -> ScalarMap: # Backend: cast-value-rs # --------------------------------------------------------------------------- +# Versions below this silently transpose input arrays that are not row-major - +# the layout `transpose` hands to the next codec - writing corrupted data with +# no error. Keep in sync with the `cast-value-rs` extra in pyproject.toml. +CAST_VALUE_RS_MIN_VERSION: Final = "0.4.2" + +_INSTALL_HINT: Final = f"Install it with: pip install 'cast-value-rs>={CAST_VALUE_RS_MIN_VERSION}'" + + +def _check_backend_version() -> str | None: + """Return a message describing an unusable backend version, or `None` if it is usable.""" + try: + installed = version("cast-value-rs") + except PackageNotFoundError: + # Importable but without distribution metadata, e.g. a `maturin develop` + # build. There is no version to compare, so let it through. + return None + if Version(installed) < Version(CAST_VALUE_RS_MIN_VERSION): + return ( + f"The cast_value codec requires cast-value-rs >= {CAST_VALUE_RS_MIN_VERSION}, " + f"but version {installed} is installed. Earlier versions silently corrupt data " + f"when the input array is not row-major. {_INSTALL_HINT}" + ) + return None + + +# Set once at import; raised from `_do_cast`, so an unusable backend does not +# make `import zarr` fail for users who never touch this codec. +_BACKEND_ERROR: str | None try: from cast_value_rs import cast_array as cast_array_rs - - _HAS_RUST_BACKEND = True except ModuleNotFoundError: - _HAS_RUST_BACKEND = False + _BACKEND_ERROR = f"The cast_value codec requires the 'cast-value-rs' package. {_INSTALL_HINT}" +else: + _BACKEND_ERROR = _check_backend_version() def _check_representable( @@ -305,11 +335,8 @@ def _do_cast( target_dtype: np.dtype, scalar_map: Mapping[str | float | int, str | float | int] | None, ) -> np.ndarray: - if not _HAS_RUST_BACKEND: - raise ImportError( - "The cast_value codec requires the 'cast-value-rs' package. " - "Install it with: pip install cast-value-rs" - ) + if _BACKEND_ERROR is not None: + raise ImportError(_BACKEND_ERROR) scalar_map_entries: dict[float | int, float | int] | None = None if scalar_map is not None: src_dtype = arr.dtype diff --git a/tests/test_codecs/test_cast_value.py b/tests/test_codecs/test_cast_value.py index c43edb76e8..d6d9a6735d 100644 --- a/tests/test_codecs/test_cast_value.py +++ b/tests/test_codecs/test_cast_value.py @@ -477,3 +477,87 @@ def test_parse_scalar_map(case: Expect[Any, Any]) -> None: from zarr.codecs.cast_value import parse_scalar_map assert parse_scalar_map(case.input) == case.output + + +# --------------------------------------------------------------------------- +# Backend version guard +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize( + "case", + [ + Expect(input="0.4.2", output=None, id="exactly-minimum"), + Expect(input="0.4.3", output=None, id="newer-patch"), + Expect(input="0.5.0", output=None, id="newer-minor"), + Expect(input="1.0.0", output=None, id="newer-major"), + Expect(input="0.4.2.post1", output=None, id="post-release"), + Expect(input="0.4.0", output="0.4.0", id="known-corrupting"), + Expect(input="0.4.1", output="0.4.1", id="one-patch-below"), + Expect(input="0.3.0", output="0.3.0", id="older-minor"), + Expect(input="0.4.2.dev1", output="0.4.2.dev1", id="pre-release-of-minimum"), + ], + ids=lambda c: c.id, +) +def test_check_backend_version( + case: Expect[str, str | None], monkeypatch: pytest.MonkeyPatch +) -> None: + """Versions at or above the minimum pass; older ones report the installed version.""" + from zarr.codecs import cast_value as mod + + monkeypatch.setattr(mod, "version", lambda _: case.input) + result = mod._check_backend_version() + + if case.output is None: + assert result is None + else: + assert result is not None + assert case.output in result + assert mod.CAST_VALUE_RS_MIN_VERSION in result + + +def test_check_backend_version_allows_missing_metadata(monkeypatch: pytest.MonkeyPatch) -> None: + """A backend without distribution metadata is allowed: there is no version to compare.""" + from importlib.metadata import PackageNotFoundError + + from zarr.codecs import cast_value as mod + + def raise_not_found(_: str) -> str: + raise PackageNotFoundError + + monkeypatch.setattr(mod, "version", raise_not_found) + assert mod._check_backend_version() is None + + +def test_encode_rejects_outdated_backend(monkeypatch: pytest.MonkeyPatch) -> None: + """Using the codec with an outdated backend raises instead of corrupting data.""" + from zarr.codecs import cast_value as mod + + monkeypatch.setattr(mod, "_BACKEND_ERROR", "outdated backend") + codec = CastValue(data_type="uint16") + + with pytest.raises(ImportError, match="outdated backend"): + codec._do_cast( + np.arange(4, dtype=np.float32), target_dtype=np.dtype("uint16"), scalar_map=None + ) + + +def test_min_version_matches_pyproject() -> None: + """The runtime floor and the packaging floor must not drift apart.""" + import re + import tomllib + from pathlib import Path + + from zarr.codecs.cast_value import CAST_VALUE_RS_MIN_VERSION + + pyproject = Path(__file__).parents[2] / "pyproject.toml" + if not pyproject.is_file(): + pytest.skip("pyproject.toml is not available in an installed checkout") + + with pyproject.open("rb") as f: + extras = tomllib.load(f)["project"]["optional-dependencies"] + + (requirement,) = extras["cast-value-rs"] + match = re.fullmatch(r"cast-value-rs>=(?P[\w.]+)", requirement) + assert match is not None, f"unexpected requirement form: {requirement!r}" + assert match.group("version") == CAST_VALUE_RS_MIN_VERSION From 78ee7db74b1c55921b822bafa06a06fa7573c811 Mon Sep 17 00:00:00 2001 From: Raphael Jolivet Date: Thu, 13 Aug 2026 16:56:05 +0200 Subject: [PATCH 4/4] test(cast_value): cover cast_value next to the transpose codec Regression test for #4237: a cast_value codec on either side of a transpose codec must round-trip, because transpose hands the next codec a non-row-major view. Imported unchanged from #4238, where this test was written. The np.ascontiguousarray workaround that accompanied it there is deliberately left out: cast-value-rs 0.4.2 normalizes layout itself, and the workaround promotes 0-d arrays to shape (1,), breaking 0-d arrays. Co-authored-by: Raphael Jolivet Assisted-by: ClaudeCode:claude-fable-5 --- tests/test_codecs/test_cast_value.py | 50 ++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/tests/test_codecs/test_cast_value.py b/tests/test_codecs/test_cast_value.py index d6d9a6735d..c2e78770d9 100644 --- a/tests/test_codecs/test_cast_value.py +++ b/tests/test_codecs/test_cast_value.py @@ -4,10 +4,13 @@ import numpy as np import pytest +from numpy.testing import assert_array_equal import zarr from tests.conftest import Expect, ExpectFail +from zarr.codecs import BytesCodec, TransposeCodec from zarr.codecs.cast_value import CastValue +from zarr.storage import MemoryStore try: import cast_value_rs # noqa: F401 @@ -561,3 +564,50 @@ def test_min_version_matches_pyproject() -> None: match = re.fullmatch(r"cast-value-rs>=(?P[\w.]+)", requirement) assert match is not None, f"unexpected requirement form: {requirement!r}" assert match.group("version") == CAST_VALUE_RS_MIN_VERSION + + +# --------------------------------------------------------------------------- +# Non-contiguous input (regression for #4237) +# --------------------------------------------------------------------------- + + +@requires_cast_value_rs +def test_enforce_contiguous_arrays() -> None: + """ + Transpose codec produces non-contiguous arrays. + Ensure cast_value makes them contiguous before processing. + """ + data = np.arange(20, dtype=np.float32).reshape(5, 2, 2) + + def make_array(filters: list[Any]) -> Any: + return zarr.create_array( + store=MemoryStore(), + shape=data.shape, + dtype=data.dtype, + chunks=data.shape, + filters=filters, + serializer=BytesCodec(endian="little"), + compressors=None, + zarr_format=3, + ) + + # Cast before transpose + array = make_array( + [ + CastValue(data_type="uint16"), + TransposeCodec(order=(1, 2, 0)), + ] + ) + array[:] = data + assert_array_equal(array[:], data) + + # Cast after transpose + array = make_array( + [ + TransposeCodec(order=(1, 2, 0)), + CastValue(data_type="uint16"), + ] + ) + + array[:] = data + assert_array_equal(array[:], data)