From 8eeddea7e9eccd940ca564b02aabc4c7e8a0a8f3 Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Tue, 29 Apr 2025 10:17:11 -0500 Subject: [PATCH 01/56] update project metadata and deps --- pyproject.toml | 17 ++- uv.lock | 362 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 342 insertions(+), 37 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index d059b8763..7e01894ec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "multidimio" -version = "0.9.2" +version = "1.0.0-alpha.1" description = "Cloud-native, scalable, and user-friendly multi dimensional energy data!" authors = [{ name = "Altay Sansal", email = "altay.sansal@tgs.com" }] requires-python = ">=3.11,<3.14" @@ -27,10 +27,14 @@ dependencies = [ "click-params (>=0.5.0,<0.6.0)", "dask (>=2024.12.0)", "fsspec (>=2024.10.0)", + "pint>=0.24.3,<0.25", "psutil (>=6.1.0,<7.0.0)", + "pydantic (>=2.8.2,<3.0.0)", + "pydantic-settings (>=2.4.0,<3.0.0)", "rich (>=13.9.4,<14.0.0)", "segy (>=0.4.0,<0.5.0)", "tqdm (>=4.67.0,<5.0.0)", + "xarray>=2025.3.1", "zarr (>=3.0.8,<4.0.0)", ] @@ -180,11 +184,16 @@ pretty = true show_column_numbers = true show_error_codes = true show_error_context = true -disallow_untyped_defs = true # for strict mypy: (this is the tricky one) -plugins = ["numpy.typing.mypy_plugin"] +disallow_untyped_defs = true # for strict mypy: (this is the tricky one) +plugins = ["pydantic.mypy", "numpy.typing.mypy_plugin"] + +[tool.pydantic-mypy] +init_forbid_extra = true +init_typed = true +warn_required_dynamic_aliases = true [tool.bumpversion] -current_version = "0.9.2" +current_version = "1.0.0-alpha.1" allow_dirty = true commit = false tag = false diff --git a/uv.lock b/uv.lock index fa5bd21f5..2e73c4199 100644 --- a/uv.lock +++ b/uv.lock @@ -276,6 +276,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537 }, ] +[[package]] +name = "bandit" +version = "1.8.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "pyyaml" }, + { name = "rich" }, + { name = "stevedore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1a/a5/144a45f8e67df9d66c3bc3f7e69a39537db8bff1189ab7cff4e9459215da/bandit-1.8.3.tar.gz", hash = "sha256:f5847beb654d309422985c36644649924e0ea4425c76dec2e89110b87506193a", size = 4232005 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/85/db74b9233e0aa27ec96891045c5e920a64dd5cbccd50f8e64e9460f48d35/bandit-1.8.3-py3-none-any.whl", hash = "sha256:28f04dc0d258e1dd0f99dee8eefa13d1cb5e3fde1a5ab0c523971f97b289bcd8", size = 129078 }, +] + [[package]] name = "beautifulsoup4" version = "4.13.3" @@ -289,6 +304,34 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16", size = 186015 }, ] +[[package]] +name = "black" +version = "24.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "mypy-extensions" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d8/0d/cc2fb42b8c50d80143221515dd7e4766995bd07c56c9a3ed30baf080b6dc/black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875", size = 645813 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/cc/7496bb63a9b06a954d3d0ac9fe7a73f3bf1cd92d7a58877c27f4ad1e9d41/black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad", size = 1607468 }, + { url = "https://files.pythonhosted.org/packages/2b/e3/69a738fb5ba18b5422f50b4f143544c664d7da40f09c13969b2fd52900e0/black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50", size = 1437270 }, + { url = "https://files.pythonhosted.org/packages/c9/9b/2db8045b45844665c720dcfe292fdaf2e49825810c0103e1191515fc101a/black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392", size = 1737061 }, + { url = "https://files.pythonhosted.org/packages/a3/95/17d4a09a5be5f8c65aa4a361444d95edc45def0de887810f508d3f65db7a/black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175", size = 1423293 }, + { url = "https://files.pythonhosted.org/packages/90/04/bf74c71f592bcd761610bbf67e23e6a3cff824780761f536512437f1e655/black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3", size = 1644256 }, + { url = "https://files.pythonhosted.org/packages/4c/ea/a77bab4cf1887f4b2e0bce5516ea0b3ff7d04ba96af21d65024629afedb6/black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65", size = 1448534 }, + { url = "https://files.pythonhosted.org/packages/4e/3e/443ef8bc1fbda78e61f79157f303893f3fddf19ca3c8989b163eb3469a12/black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f", size = 1761892 }, + { url = "https://files.pythonhosted.org/packages/52/93/eac95ff229049a6901bc84fec6908a5124b8a0b7c26ea766b3b8a5debd22/black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8", size = 1434796 }, + { url = "https://files.pythonhosted.org/packages/d0/a0/a993f58d4ecfba035e61fca4e9f64a2ecae838fc9f33ab798c62173ed75c/black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981", size = 1643986 }, + { url = "https://files.pythonhosted.org/packages/37/d5/602d0ef5dfcace3fb4f79c436762f130abd9ee8d950fa2abdbf8bbc555e0/black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b", size = 1448085 }, + { url = "https://files.pythonhosted.org/packages/47/6d/a3a239e938960df1a662b93d6230d4f3e9b4a22982d060fc38c42f45a56b/black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2", size = 1760928 }, + { url = "https://files.pythonhosted.org/packages/dd/cf/af018e13b0eddfb434df4d9cd1b2b7892bab119f7a20123e93f6910982e8/black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b", size = 1436875 }, + { url = "https://files.pythonhosted.org/packages/8d/a7/4b27c50537ebca8bec139b872861f9d2bf501c5ec51fcf897cb924d9e264/black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d", size = 206898 }, +] + [[package]] name = "bokeh" version = "3.7.2" @@ -697,6 +740,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/57/ff/f3b4b2d007c2a646b0f69440ab06224f9cf37a977a72cdb7b50632174e8a/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390", size = 4107081 }, ] +[[package]] +name = "darglint" +version = "1.8.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/2c/86e8549e349388c18ca8a4ff8661bb5347da550f598656d32a98eaaf91cc/darglint-1.8.1.tar.gz", hash = "sha256:080d5106df149b199822e7ee7deb9c012b49891538f14a11be681044f0bb20da", size = 74435 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/28/85d1e0396d64422c5218d68e5cdcc53153aa8a2c83c7dbc3ee1502adf3a1/darglint-1.8.1-py3-none-any.whl", hash = "sha256:5ae11c259c17b0701618a20c3da343a3eb98b3bc4b5a83d31cdd94f5ebdced8d", size = 120767 }, +] + [[package]] name = "dask" version = "2025.3.0" @@ -853,6 +905,97 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163 }, ] +[[package]] +name = "flake8" +version = "7.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mccabe" }, + { name = "pycodestyle" }, + { name = "pyflakes" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/c4/5842fc9fc94584c455543540af62fd9900faade32511fab650e9891ec225/flake8-7.2.0.tar.gz", hash = "sha256:fa558ae3f6f7dbf2b4f22663e5343b6b6023620461f8d4ff2019ef4b5ee70426", size = 48177 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/5c/0627be4c9976d56b1217cb5187b7504e7fd7d3503f8bfd312a04077bd4f7/flake8-7.2.0-py2.py3-none-any.whl", hash = "sha256:93b92ba5bdb60754a6da14fa3b93a9361fd00a59632ada61fd7b130436c40343", size = 57786 }, +] + +[[package]] +name = "flake8-bandit" +version = "4.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bandit" }, + { name = "flake8" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/77/1c/4f66a7a52a246d6c64312b5c40da3af3630cd60b27af81b137796af3c0bc/flake8_bandit-4.1.1.tar.gz", hash = "sha256:068e09287189cbfd7f986e92605adea2067630b75380c6b5733dab7d87f9a84e", size = 5403 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/5f/55bab0ac89f9ad9f4c6e38087faa80c252daec4ccb7776b4dac216ca9e3f/flake8_bandit-4.1.1-py3-none-any.whl", hash = "sha256:4c8a53eb48f23d4ef1e59293657181a3c989d0077c9952717e98a0eace43e06d", size = 4828 }, +] + +[[package]] +name = "flake8-bugbear" +version = "24.12.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "flake8" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/25/48ba712ff589b0149f21135234f9bb45c14d6689acc6151b5e2ff8ac2ae9/flake8_bugbear-24.12.12.tar.gz", hash = "sha256:46273cef0a6b6ff48ca2d69e472f41420a42a46e24b2a8972e4f0d6733d12a64", size = 82907 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/21/0a875f75fbe4008bd171e2fefa413536258fe6b4cfaaa087986de74588f4/flake8_bugbear-24.12.12-py3-none-any.whl", hash = "sha256:1b6967436f65ca22a42e5373aaa6f2d87966ade9aa38d4baf2a1be550767545e", size = 36664 }, +] + +[[package]] +name = "flake8-docstrings" +version = "1.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "flake8" }, + { name = "pydocstyle" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/93/24/f839e3a06e18f4643ccb81370909a497297909f15106e6af2fecdef46894/flake8_docstrings-1.7.0.tar.gz", hash = "sha256:4c8cc748dc16e6869728699e5d0d685da9a10b0ea718e090b1ba088e67a941af", size = 5995 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/7d/76a278fa43250441ed9300c344f889c7fb1817080c8fb8996b840bf421c2/flake8_docstrings-1.7.0-py2.py3-none-any.whl", hash = "sha256:51f2344026da083fc084166a9353f5082b01f72901df422f74b4d953ae88ac75", size = 4994 }, +] + +[[package]] +name = "flake8-rst-docstrings" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "flake8" }, + { name = "pygments" }, + { name = "restructuredtext-lint" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b2/e5/013d5858b69b4ba38ff259d55bd8d107009f212f296be0824b7c4a27d7ed/flake8-rst-docstrings-0.3.0.tar.gz", hash = "sha256:d1ce22b4bd37b73cd86b8d980e946ef198cfcc18ed82fedb674ceaa2f8d1afa4", size = 19865 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/bf/0e6933d78d172df672325622bf1b7f8364f4a6515da9e89398227c19d02e/flake8_rst_docstrings-0.3.0-py3-none-any.whl", hash = "sha256:f8c3c6892ff402292651c31983a38da082480ad3ba253743de52989bdc84ca1c", size = 10892 }, +] + +[[package]] +name = "flexcache" +version = "0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/b0/8a21e330561c65653d010ef112bf38f60890051d244ede197ddaa08e50c1/flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656", size = 15816 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32", size = 13263 }, +] + +[[package]] +name = "flexparser" +version = "0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/99/b4de7e39e8eaf8207ba1a8fa2241dd98b2ba72ae6e16960d8351736d8702/flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2", size = 31799 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846", size = 27625 }, +] + [[package]] name = "frozenlist" version = "1.5.0" @@ -1239,6 +1382,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320 }, ] +[[package]] +name = "isort" +version = "5.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/87/f9/c1eb8635a24e87ade2efce21e3ce8cd6b8630bb685ddc9cdaca1349b2eb5/isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109", size = 175303 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/b3/8def84f539e7d2289a02f0524b944b15d7c75dab7628bedf1c4f0992029c/isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6", size = 92310 }, +] + [[package]] name = "jedi" version = "0.19.2" @@ -1485,6 +1637,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, ] +[[package]] +name = "mccabe" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350 }, +] + [[package]] name = "mdit-py-plugins" version = "0.4.2" @@ -1644,17 +1805,21 @@ wheels = [ [[package]] name = "multidimio" -version = "0.9.1" +version = "1.0.0a1" source = { editable = "." } dependencies = [ { name = "click" }, { name = "click-params" }, { name = "dask" }, { name = "fsspec" }, + { name = "pint" }, { name = "psutil" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, { name = "rich" }, { name = "segy" }, { name = "tqdm" }, + { name = "xarray" }, { name = "zarr" }, ] @@ -1674,14 +1839,23 @@ lossy = [ [package.dev-dependencies] dev = [ + { name = "black" }, { name = "coverage", extra = ["toml"] }, + { name = "darglint" }, + { name = "flake8" }, + { name = "flake8-bandit" }, + { name = "flake8-bugbear" }, + { name = "flake8-docstrings" }, + { name = "flake8-rst-docstrings" }, + { name = "isort" }, { name = "mypy" }, + { name = "pep8-naming" }, { name = "pre-commit" }, { name = "pre-commit-hooks" }, { name = "pygments" }, { name = "pytest" }, { name = "pytest-dependency" }, - { name = "ruff" }, + { name = "pyupgrade" }, { name = "safety" }, { name = "typeguard" }, { name = "xdoctest", extra = ["colors"] }, @@ -1707,26 +1881,39 @@ requires-dist = [ { name = "distributed", marker = "extra == 'distributed'", specifier = ">=2024.12.0" }, { name = "fsspec", specifier = ">=2024.10.0" }, { name = "gcsfs", marker = "extra == 'cloud'", specifier = ">=2024.10.0" }, + { name = "pint", specifier = ">=0.24.3,<0.25" }, { name = "psutil", specifier = ">=6.1.0,<7.0.0" }, + { name = "pydantic", specifier = ">=2.8.2,<3.0.0" }, + { name = "pydantic-settings", specifier = ">=2.4.0,<3.0.0" }, { name = "rich", specifier = ">=13.9.4,<14.0.0" }, { name = "s3fs", marker = "extra == 'cloud'", specifier = "==2024.12.0" }, { name = "segy", specifier = ">=0.4.0,<0.5.0" }, { name = "tqdm", specifier = ">=4.67.0,<5.0.0" }, - { name = "zarr", specifier = ">=3.0.8,<4.0.0" }, + { name = "xarray", specifier = ">=2025.3.1" }, + { name = "zarr", specifier = ">=3.0.6,<4.0.0" }, { name = "zfpy", marker = "extra == 'lossy'", specifier = ">=1.0.1,<2.0.0" }, ] provides-extras = ["cloud", "distributed", "lossy"] [package.metadata.requires-dev] dev = [ + { name = "black", specifier = ">=24.10.0,<25" }, { name = "coverage", extras = ["toml"], specifier = ">=7.6.7,<8" }, + { name = "darglint", specifier = ">=1.8.1,<2" }, + { name = "flake8", specifier = ">=7.1.0,<8" }, + { name = "flake8-bandit", specifier = ">=4.1.1,<5" }, + { name = "flake8-bugbear", specifier = ">=24.4.26,<25" }, + { name = "flake8-docstrings", specifier = ">=1.7.0,<2" }, + { name = "flake8-rst-docstrings", specifier = ">=0.3.0,<0.4" }, + { name = "isort", specifier = ">=5.13.2,<6" }, { name = "mypy", specifier = ">=1.13.0,<2" }, + { name = "pep8-naming", specifier = ">=0.14.1,<0.15" }, { name = "pre-commit", specifier = ">=4.0.1,<5" }, { name = "pre-commit-hooks", specifier = ">=5.0.0,<6" }, { name = "pygments", specifier = ">=2.18.0,<3" }, { name = "pytest", specifier = ">=8.3.3,<9" }, { name = "pytest-dependency", specifier = ">=0.6.0,<0.7" }, - { name = "ruff", specifier = ">=0.11.8" }, + { name = "pyupgrade", specifier = ">=3.19.0,<4" }, { name = "safety", specifier = ">=3.2.3,<4" }, { name = "typeguard", specifier = ">=4.4.1,<5" }, { name = "xdoctest", extras = ["colors"], specifier = ">=1.2.0,<2" }, @@ -1735,7 +1922,7 @@ docs = [ { name = "furo", specifier = ">=2024.8.6" }, { name = "linkify-it-py", specifier = ">=2.0.3" }, { name = "myst-nb", specifier = ">=1.2.0" }, - { name = "sphinx", specifier = ">=8.2.3,<9" }, + { name = "sphinx", specifier = ">=8.1.3,<9" }, { name = "sphinx-autobuild", specifier = ">=2024.10.3" }, { name = "sphinx-click", specifier = ">=6.0.0,<7" }, { name = "sphinx-copybutton", specifier = ">=0.5.2,<0.6" }, @@ -2077,6 +2264,39 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl", hash = "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", size = 18905 }, ] +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, +] + +[[package]] +name = "pbr" +version = "6.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/d2/510cc0d218e753ba62a1bc1434651db3cd797a9716a0a66cc714cb4f0935/pbr-6.1.1.tar.gz", hash = "sha256:93ea72ce6989eb2eed99d0f75721474f69ad88128afdef5ac377eb797c4bf76b", size = 125702 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/ac/684d71315abc7b1214d59304e23a982472967f6bf4bde5a98f1503f648dc/pbr-6.1.1-py2.py3-none-any.whl", hash = "sha256:38d4daea5d9fa63b3f626131b9d34947fd0c8be9b05a29276870580050a25a76", size = 108997 }, +] + +[[package]] +name = "pep8-naming" +version = "0.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "flake8" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/be/8e/1de32e908d8b008bb9352bfe7749aedecb71e2793d36c7ee342716acd1ec/pep8-naming-0.14.1.tar.gz", hash = "sha256:1ef228ae80875557eb6c1549deafed4dabbf3261cfcafa12f773fe0db9be8a36", size = 16546 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/a2/450b71d1a87fcee50a7b994a53b1c68fc6a6b718df0eb035f2bffb2d3a4f/pep8_naming-0.14.1-py3-none-any.whl", hash = "sha256:63f514fc777d715f935faf185dedd679ab99526a7f2f503abb61587877f7b1c5", size = 8859 }, +] + [[package]] name = "pexpect" version = "4.9.0" @@ -2148,6 +2368,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/21/2c/5e05f58658cf49b6667762cca03d6e7d85cededde2caf2ab37b81f80e574/pillow-11.2.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:208653868d5c9ecc2b327f9b9ef34e0e42a4cdd172c2988fd81d62d2bc9bc044", size = 2674751 }, ] +[[package]] +name = "pint" +version = "0.24.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "flexcache" }, + { name = "flexparser" }, + { name = "platformdirs" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/20/bb/52b15ddf7b7706ed591134a895dbf6e41c8348171fb635e655e0a4bbb0ea/pint-0.24.4.tar.gz", hash = "sha256:35275439b574837a6cd3020a5a4a73645eb125ce4152a73a2f126bf164b91b80", size = 342225 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/16/bd2f5904557265882108dc2e04f18abc05ab0c2b7082ae9430091daf1d5c/Pint-0.24.4-py3-none-any.whl", hash = "sha256:aa54926c8772159fcf65f82cc0d34de6768c151b32ad1deb0331291c38fe7659", size = 302029 }, +] + [[package]] name = "platformdirs" version = "4.3.7" @@ -2359,6 +2594,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259 }, ] +[[package]] +name = "pycodestyle" +version = "2.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/6e/1f4a62078e4d95d82367f24e685aef3a672abfd27d1a868068fed4ed2254/pycodestyle-2.13.0.tar.gz", hash = "sha256:c8415bf09abe81d9c7f872502a6eee881fbe85d8763dd5b9924bb0a01d67efae", size = 39312 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/be/b00116df1bfb3e0bb5b45e29d604799f7b91dd861637e4d448b4e09e6a3e/pycodestyle-2.13.0-py2.py3-none-any.whl", hash = "sha256:35863c5974a271c7a726ed228a14a4f6daf49df369d8c50cd9a6f58a5e143ba9", size = 31424 }, +] + [[package]] name = "pycparser" version = "2.22" @@ -2442,6 +2686,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c", size = 30839 }, ] +[[package]] +name = "pydocstyle" +version = "6.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "snowballstemmer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/d5385ca59fd065e3c6a5fe19f9bc9d5ea7f2509fa8c9c22fb6b2031dd953/pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1", size = 36796 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/ea/99ddefac41971acad68f14114f38261c1f27dac0b3ec529824ebc739bdaa/pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019", size = 38038 }, +] + +[[package]] +name = "pyflakes" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/cc/1df338bd7ed1fa7c317081dcf29bf2f01266603b301e6858856d346a12b3/pyflakes-3.3.2.tar.gz", hash = "sha256:6dfd61d87b97fba5dcfaaf781171ac16be16453be6d816147989e7f6e6a9576b", size = 64175 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/40/b293a4fa769f3b02ab9e387c707c4cbdc34f073f945de0386107d4e669e6/pyflakes-3.3.2-py2.py3-none-any.whl", hash = "sha256:5039c8339cbb1944045f4ee5466908906180f13cc99cc9949348d10f82a5c32a", size = 63164 }, +] + [[package]] name = "pygments" version = "2.19.1" @@ -2520,6 +2785,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, ] +[[package]] +name = "pyupgrade" +version = "3.19.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tokenize-rt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/3a/efa8e75cf84d53f1b3f0113387ab120ef460396a4068e41b6cf18a3d216d/pyupgrade-3.19.1.tar.gz", hash = "sha256:d10e8c5f54b8327211828769e98d95d95e4715de632a3414f1eef3f51357b9e2", size = 45116 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dd/43/c6c1ff945c7900613f6e6ef2a8688639a247d62eb0ffa9935c599f69c08e/pyupgrade-3.19.1-py2.py3-none-any.whl", hash = "sha256:8c5b0bfacae5ff30fa136a53eb7f22c34ba007450d4099e9da8089dabb9e67c9", size = 62412 }, +] + [[package]] name = "pywin32" version = "310" @@ -2782,6 +3059,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179 }, ] +[[package]] +name = "restructuredtext-lint" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docutils" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/9c/6d8035cafa2d2d314f34e6cd9313a299de095b26e96f1c7312878f988eec/restructuredtext_lint-1.4.0.tar.gz", hash = "sha256:1b235c0c922341ab6c530390892eb9e92f90b9b75046063e047cacfb0f050c45", size = 16723 } + [[package]] name = "rich" version = "13.9.4" @@ -2934,31 +3220,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190 }, ] -[[package]] -name = "ruff" -version = "0.11.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/f6/adcf73711f31c9f5393862b4281c875a462d9f639f4ccdf69dc368311c20/ruff-0.11.8.tar.gz", hash = "sha256:6d742d10626f9004b781f4558154bb226620a7242080e11caeffab1a40e99df8", size = 4086399 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/60/c6aa9062fa518a9f86cb0b85248245cddcd892a125ca00441df77d79ef88/ruff-0.11.8-py3-none-linux_armv6l.whl", hash = "sha256:896a37516c594805e34020c4a7546c8f8a234b679a7716a3f08197f38913e1a3", size = 10272473 }, - { url = "https://files.pythonhosted.org/packages/a0/e4/0325e50d106dc87c00695f7bcd5044c6d252ed5120ebf423773e00270f50/ruff-0.11.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ab86d22d3d721a40dd3ecbb5e86ab03b2e053bc93c700dc68d1c3346b36ce835", size = 11040862 }, - { url = "https://files.pythonhosted.org/packages/e6/27/b87ea1a7be37fef0adbc7fd987abbf90b6607d96aa3fc67e2c5b858e1e53/ruff-0.11.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:258f3585057508d317610e8a412788cf726efeefa2fec4dba4001d9e6f90d46c", size = 10385273 }, - { url = "https://files.pythonhosted.org/packages/d3/f7/3346161570d789045ed47a86110183f6ac3af0e94e7fd682772d89f7f1a1/ruff-0.11.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:727d01702f7c30baed3fc3a34901a640001a2828c793525043c29f7614994a8c", size = 10578330 }, - { url = "https://files.pythonhosted.org/packages/c6/c3/327fb950b4763c7b3784f91d3038ef10c13b2d42322d4ade5ce13a2f9edb/ruff-0.11.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3dca977cc4fc8f66e89900fa415ffe4dbc2e969da9d7a54bfca81a128c5ac219", size = 10122223 }, - { url = "https://files.pythonhosted.org/packages/de/c7/ba686bce9adfeb6c61cb1bbadc17d58110fe1d602f199d79d4c880170f19/ruff-0.11.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c657fa987d60b104d2be8b052d66da0a2a88f9bd1d66b2254333e84ea2720c7f", size = 11697353 }, - { url = "https://files.pythonhosted.org/packages/53/8e/a4fb4a1ddde3c59e73996bb3ac51844ff93384d533629434b1def7a336b0/ruff-0.11.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f2e74b021d0de5eceb8bd32919f6ff8a9b40ee62ed97becd44993ae5b9949474", size = 12375936 }, - { url = "https://files.pythonhosted.org/packages/ad/a1/9529cb1e2936e2479a51aeb011307e7229225df9ac64ae064d91ead54571/ruff-0.11.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9b5ef39820abc0f2c62111f7045009e46b275f5b99d5e59dda113c39b7f4f38", size = 11850083 }, - { url = "https://files.pythonhosted.org/packages/3e/94/8f7eac4c612673ae15a4ad2bc0ee62e03c68a2d4f458daae3de0e47c67ba/ruff-0.11.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1dba3135ca503727aa4648152c0fa67c3b1385d3dc81c75cd8a229c4b2a1458", size = 14005834 }, - { url = "https://files.pythonhosted.org/packages/1e/7c/6f63b46b2be870cbf3f54c9c4154d13fac4b8827f22fa05ac835c10835b2/ruff-0.11.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f024d32e62faad0f76b2d6afd141b8c171515e4fb91ce9fd6464335c81244e5", size = 11503713 }, - { url = "https://files.pythonhosted.org/packages/3a/91/57de411b544b5fe072779678986a021d87c3ee5b89551f2ca41200c5d643/ruff-0.11.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d365618d3ad747432e1ae50d61775b78c055fee5936d77fb4d92c6f559741948", size = 10457182 }, - { url = "https://files.pythonhosted.org/packages/01/49/cfe73e0ce5ecdd3e6f1137bf1f1be03dcc819d1bfe5cff33deb40c5926db/ruff-0.11.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4d9aaa91035bdf612c8ee7266153bcf16005c7c7e2f5878406911c92a31633cb", size = 10101027 }, - { url = "https://files.pythonhosted.org/packages/56/21/a5cfe47c62b3531675795f38a0ef1c52ff8de62eaddf370d46634391a3fb/ruff-0.11.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0eba551324733efc76116d9f3a0d52946bc2751f0cd30661564117d6fd60897c", size = 11111298 }, - { url = "https://files.pythonhosted.org/packages/36/98/f76225f87e88f7cb669ae92c062b11c0a1e91f32705f829bd426f8e48b7b/ruff-0.11.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:161eb4cff5cfefdb6c9b8b3671d09f7def2f960cee33481dd898caf2bcd02304", size = 11566884 }, - { url = "https://files.pythonhosted.org/packages/de/7e/fff70b02e57852fda17bd43f99dda37b9bcf3e1af3d97c5834ff48d04715/ruff-0.11.8-py3-none-win32.whl", hash = "sha256:5b18caa297a786465cc511d7f8be19226acf9c0a1127e06e736cd4e1878c3ea2", size = 10451102 }, - { url = "https://files.pythonhosted.org/packages/7b/a9/eaa571eb70648c9bde3120a1d5892597de57766e376b831b06e7c1e43945/ruff-0.11.8-py3-none-win_amd64.whl", hash = "sha256:6e70d11043bef637c5617297bdedec9632af15d53ac1e1ba29c448da9341b0c4", size = 11597410 }, - { url = "https://files.pythonhosted.org/packages/cd/be/f6b790d6ae98f1f32c645f8540d5c96248b72343b0a56fab3a07f2941897/ruff-0.11.8-py3-none-win_arm64.whl", hash = "sha256:304432e4c4a792e3da85b7699feb3426a0908ab98bf29df22a31b0cdd098fac2", size = 10713129 }, -] - [[package]] name = "s3fs" version = "2024.12.0" @@ -3310,6 +3571,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/4b/528ccf7a982216885a1ff4908e886b8fb5f19862d1962f56a3fce2435a70/starlette-0.46.1-py3-none-any.whl", hash = "sha256:77c74ed9d2720138b25875133f3a2dae6d854af2ec37dceb56aef370c1d8a227", size = 71995 }, ] +[[package]] +name = "stevedore" +version = "5.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pbr" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/3f/13cacea96900bbd31bb05c6b74135f85d15564fc583802be56976c940470/stevedore-5.4.1.tar.gz", hash = "sha256:3135b5ae50fe12816ef291baff420acb727fcd356106e3e9cbfa9e5985cd6f4b", size = 513858 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/45/8c4ebc0c460e6ec38e62ab245ad3c7fc10b210116cea7c16d61602aa9558/stevedore-5.4.1-py3-none-any.whl", hash = "sha256:d10a31c7b86cba16c1f6e8d15416955fc797052351a56af15e608ad20811fcfe", size = 49533 }, +] + [[package]] name = "tabulate" version = "0.9.0" @@ -3328,6 +3601,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/27/44/aa5c8b10b2cce7a053018e0d132bd58e27527a0243c4985383d5b6fd93e9/tblib-3.1.0-py3-none-any.whl", hash = "sha256:670bb4582578134b3d81a84afa1b016128b429f3d48e6cbbaecc9d15675e984e", size = 12552 }, ] +[[package]] +name = "tokenize-rt" +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/0a/5854d8ced8c1e00193d1353d13db82d7f813f99bd5dcb776ce3e2a4c0d19/tokenize_rt-6.1.0.tar.gz", hash = "sha256:e8ee836616c0877ab7c7b54776d2fefcc3bde714449a206762425ae114b53c86", size = 5506 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/ba/576aac29b10dfa49a6ce650001d1bb31f81e734660555eaf144bfe5b8995/tokenize_rt-6.1.0-py2.py3-none-any.whl", hash = "sha256:d706141cdec4aa5f358945abe36b911b8cbdc844545da99e811250c0cee9b6fc", size = 6015 }, +] + [[package]] name = "tomli" version = "2.2.1" @@ -3667,6 +3949,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594 }, ] +[[package]] +name = "xarray" +version = "2025.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "packaging" }, + { name = "pandas" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7c/c4/6931c37cd418658d596e78794bdd1bcb67efec0aac3cdb720e37e03c1ea1/xarray-2025.3.1.tar.gz", hash = "sha256:0252c96a73528b29d1ed7f0ab28d928d2ec00ad809e47369803b184dece1e447", size = 3300778 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/fd/973deafd9f87085136a58573600646b408ae7af47859f35151f0d83d5090/xarray-2025.3.1-py3-none-any.whl", hash = "sha256:3404e313930c226db70a945377441ea3c957225d8ba2d429e764c099bb91a546", size = 1279327 }, +] + [[package]] name = "xdoctest" version = "1.2.0" @@ -3755,7 +4051,7 @@ wheels = [ [[package]] name = "zarr" -version = "3.0.8" +version = "3.0.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "donfig" }, @@ -3764,9 +4060,9 @@ dependencies = [ { name = "packaging" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/52/60/9652fd0536fbaca8d08cbc1a5572c52e0ce01773297df75da8bb47e45907/zarr-3.0.8.tar.gz", hash = "sha256:88505d095af899a88ae8ac4db02f4650ef0801d2ff6f65b6d1f0a45dcf760a6d", size = 256825 } +sdist = { url = "https://files.pythonhosted.org/packages/6f/bf/2820e8ad5f086ea5cd4c4d65eb5e0113f98145ddf5810cec1c75fb10fb98/zarr-3.0.6.tar.gz", hash = "sha256:6ef23c740e34917a2a1099471361537732942e49f0cabe95c9b7124cd0d6d84f", size = 240812 } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/3b/e20bdf84088c11f2c396d034506cbffadd53e024111c1aa4585c2aba1523/zarr-3.0.8-py3-none-any.whl", hash = "sha256:7f81e7aec086437d98882aa432209107114bd7f3a9f4958b2af9c6b5928a70a7", size = 205364 }, + { url = "https://files.pythonhosted.org/packages/fb/38/56a1c129577d20dc975a934ccc3f7f16276eab04ff0ffbe02ea348407a37/zarr-3.0.6-py3-none-any.whl", hash = "sha256:dba078726b6e4defb0ae6a852b7e7035ce163d89d485961681ece49191dcce82", size = 196357 }, ] [[package]] From 293a7144a60833794437c6173bb8cccddbde8fe8 Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Tue, 29 Apr 2025 10:17:33 -0500 Subject: [PATCH 02/56] update project metadata and deps --- noxfile.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/noxfile.py b/noxfile.py index d78994a09..281ec5258 100644 --- a/noxfile.py +++ b/noxfile.py @@ -257,6 +257,7 @@ def docs_build(session: Session) -> None: session_install_uv_package( session, [ + "autodoc-pydantic", "sphinx", "sphinx-click", "sphinx-copybutton", @@ -282,6 +283,7 @@ def docs(session: Session) -> None: session_install_uv_package( session, [ + "autodoc-pydantic", "sphinx", "sphinx-autobuild", "sphinx-click", From faacbaa86a66d17fc430de4e17282fc17807c6d6 Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Tue, 29 Apr 2025 14:42:57 -0500 Subject: [PATCH 03/56] add schemas --- src/mdio/schemas/__init__.py | 18 ++++ src/mdio/schemas/base.py | 43 +++++++++ src/mdio/schemas/builder.py | 156 +++++++++++++++++++++++++++++++ src/mdio/schemas/chunk_grid.py | 44 +++++++++ src/mdio/schemas/compressors.py | 159 ++++++++++++++++++++++++++++++++ src/mdio/schemas/core.py | 49 ++++++++++ src/mdio/schemas/dimension.py | 12 +++ src/mdio/schemas/dtype.py | 55 +++++++++++ src/mdio/schemas/metadata.py | 31 +++++++ src/mdio/schemas/units.py | 51 ++++++++++ src/mdio/schemas/v0/__init__.py | 6 ++ src/mdio/schemas/v0/dataset.py | 88 ++++++++++++++++++ src/mdio/schemas/v1/__init__.py | 6 ++ src/mdio/schemas/v1/dataset.py | 49 ++++++++++ src/mdio/schemas/v1/stats.py | 72 +++++++++++++++ src/mdio/schemas/v1/units.py | 126 +++++++++++++++++++++++++ src/mdio/schemas/v1/variable.py | 55 +++++++++++ 17 files changed, 1020 insertions(+) create mode 100644 src/mdio/schemas/__init__.py create mode 100644 src/mdio/schemas/base.py create mode 100644 src/mdio/schemas/builder.py create mode 100644 src/mdio/schemas/chunk_grid.py create mode 100644 src/mdio/schemas/compressors.py create mode 100644 src/mdio/schemas/core.py create mode 100644 src/mdio/schemas/dimension.py create mode 100644 src/mdio/schemas/dtype.py create mode 100644 src/mdio/schemas/metadata.py create mode 100644 src/mdio/schemas/units.py create mode 100644 src/mdio/schemas/v0/__init__.py create mode 100644 src/mdio/schemas/v0/dataset.py create mode 100644 src/mdio/schemas/v1/__init__.py create mode 100644 src/mdio/schemas/v1/dataset.py create mode 100644 src/mdio/schemas/v1/stats.py create mode 100644 src/mdio/schemas/v1/units.py create mode 100644 src/mdio/schemas/v1/variable.py diff --git a/src/mdio/schemas/__init__.py b/src/mdio/schemas/__init__.py new file mode 100644 index 000000000..17ae4dd3f --- /dev/null +++ b/src/mdio/schemas/__init__.py @@ -0,0 +1,18 @@ +"""MDIO schemas for different data types.""" + +from mdio.schemas.compressors import ZFP +from mdio.schemas.compressors import Blosc +from mdio.schemas.dimension import NamedDimension +from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredField +from mdio.schemas.dtype import StructuredType + + +__all__ = [ + "Blosc", + "ZFP", + "NamedDimension", + "ScalarType", + "StructuredField", + "StructuredType", +] diff --git a/src/mdio/schemas/base.py b/src/mdio/schemas/base.py new file mode 100644 index 000000000..d4bdfd480 --- /dev/null +++ b/src/mdio/schemas/base.py @@ -0,0 +1,43 @@ +"""Base models to subclass from.""" + +from pydantic import ConfigDict +from pydantic import Field +from pydantic.json_schema import GenerateJsonSchema + +from mdio.schemas.compressors import ZFP +from mdio.schemas.compressors import Blosc +from mdio.schemas.core import CamelCaseStrictModel +from mdio.schemas.dimension import NamedDimension +from mdio.schemas.dtype import DataTypeModel + + +JSON_SCHEMA_DIALECT = GenerateJsonSchema.schema_dialect + + +class BaseDataset(CamelCaseStrictModel): + """A base class for MDIO datasets. + + We add schema dialect to extend the config of `StrictCamelBaseModel`. + We use the default Pydantic schema generator `GenerateJsonSchema` to + define the JSON schema dialect accurately. + """ + + model_config = ConfigDict(json_schema_extra={"$schema": JSON_SCHEMA_DIALECT}) + + +class BaseArray(DataTypeModel, CamelCaseStrictModel): + """A base array schema.""" + + dimensions: list[NamedDimension] | list[str] = Field( + ..., description="List of Dimension collection or reference to dimension names." + ) + compressor: Blosc | ZFP | None = Field( + default=None, description="Compression settings." + ) + + +class NamedArray(BaseArray): + """An array with a name.""" + + name: str = Field(..., description="Name of the array.") + long_name: str | None = Field(default=None, description="Fully descriptive name.") diff --git a/src/mdio/schemas/builder.py b/src/mdio/schemas/builder.py new file mode 100644 index 000000000..9a0e6cbbb --- /dev/null +++ b/src/mdio/schemas/builder.py @@ -0,0 +1,156 @@ +"""Schema builders.""" + +from __future__ import annotations + +from typing import Any + +from mdio.schemas import NamedDimension +from mdio.schemas.v1.dataset import Dataset +from mdio.schemas.v1.dataset import DatasetMetadata +from mdio.schemas.v1.variable import Variable +from mdio.schemas.v1.variable import VariableMetadata + + +class VariableBuilder: + """Dataset builder.""" + + def __init__(self) -> None: + """Initialize the builder.""" + self.name = None + self.long_name = None + self.dtype = None + self.chunks = None + self.dims = None + self.coords = None + self.compressor = None + self.meta_dict = None + + def set_name(self, name: str) -> VariableBuilder: + """Set variable name.""" + self.name = name + return self + + def set_long_name(self, long_name: str) -> VariableBuilder: + """Add long, descriptive name to the variable.""" + self.long_name = long_name + return self + + def set_compressor(self, compressor: dict[str, Any]) -> VariableBuilder: + """Add long, descriptive name to the variable.""" + self.compressor = compressor + return self + + def add_dimension(self, *dimensions: str | dict[str, int]) -> VariableBuilder: + """Add a dimension to the dataset.""" + if self.dims is None: + self.dims = [] + + if isinstance(dimensions[0], str): + dims = list(dimensions) + elif isinstance(dimensions[0], dict): + dims = [ + NamedDimension(name=name, size=size) + for dim in dimensions + for name, size in dim.items() + ] + else: + raise NotImplementedError + + self.dims.extend(dims) + return self + + def add_coordinate(self, *names: str) -> VariableBuilder: + """Add a coordinate to the variable.""" + if self.coords is None: + self.coords = [] + + self.coords.extend(names) + return self + + def set_format(self, format_: str | dict[str, str]) -> VariableBuilder: + """Set variable format.""" + if isinstance(format_, dict): + fields = [{"name": n, "format": f} for n, f in format_.items()] + format_ = {"fields": fields} + + self.dtype = format_ + return self + + def set_chunks(self, chunks: list[int]) -> VariableBuilder: + """Set variable chunks.""" + if self.meta_dict is None: + self.meta_dict = {} + + self.meta_dict["chunkGrid"] = {"configuration": {"chunkShape": chunks}} + return self + + def set_units(self, units: dict[str, str]) -> VariableBuilder: + """Set variable units.""" + if self.meta_dict is None: + self.meta_dict = {} + + self.meta_dict["unitsV1"] = units + return self + + def add_attribute(self, key: str, value: Any) -> VariableBuilder: # noqa: ANN401 + """Add a user attribute to the variable metadata.""" + if self.meta_dict is None: + self.meta_dict = {} + + self.meta_dict["attributes"] = {key: value} + return self + + def build(self) -> Variable: + """Build the dataset model.""" + if self.chunks is not None and len(self.chunks) != len(self.dims): + msg = "Variable chunks must have same number of dimensions." + raise ValueError(msg) + + var_kwargs = {} + + if self.meta_dict is not None: + var_kwargs["metadata"] = VariableMetadata.model_validate(self.meta_dict) + + return Variable( + name=self.name, + long_name=self.long_name, + data_type=self.dtype, + dimensions=self.dims, + coordinates=self.coords, + compressor=self.compressor, + **var_kwargs, + ) + + +class DatasetBuilder: + """Dataset builder.""" + + def __init__(self) -> None: + """Initialize the builder.""" + self.variables = [] + self.name = None + self.metadata = None + + def set_name(self, name: str) -> DatasetBuilder: + """Set dataset name.""" + self.name = name + return self + + def add_variable(self, variable: Variable) -> DatasetBuilder: + """Add a variable to the dataset.""" + self.variables.append(variable) + return self + + def add_variables(self, variables: list[Variable]) -> DatasetBuilder: + """Add multiple variables to the dataset.""" + [self.add_variable(variable) for variable in variables] + return self + + def set_metadata(self, metadata: DatasetMetadata) -> DatasetBuilder: + """Add a metadata to the dataset.""" + self.metadata = metadata + return self + + def build(self) -> Dataset: + """Build the dataset model.""" + return Dataset(variables=self.variables, metadata=self.metadata) diff --git a/src/mdio/schemas/chunk_grid.py b/src/mdio/schemas/chunk_grid.py new file mode 100644 index 000000000..478f11cb7 --- /dev/null +++ b/src/mdio/schemas/chunk_grid.py @@ -0,0 +1,44 @@ +"""This module contains data models for Zarr's chunk grid.""" + +from __future__ import annotations + +from pydantic import Field + +from mdio.schemas.core import CamelCaseStrictModel + + +class RegularChunkShape(CamelCaseStrictModel): + """Represents regular chunk sizes along each dimension.""" + + chunk_shape: list[int] = Field( + ..., description="Lengths of the chunk along each dimension of the array." + ) + + +class RectilinearChunkShape(CamelCaseStrictModel): + """Represents irregular chunk sizes along each dimension.""" + + chunk_shape: list[list[int]] = Field( + ..., + description="Lengths of the chunk along each dimension of the array.", + ) + + +class RegularChunkGrid(CamelCaseStrictModel): + """Represents a rectangular and regularly spaced chunk grid.""" + + name: str = Field(default="regular", description="The name of the chunk grid.") + + configuration: RegularChunkShape = Field( + ..., description="Configuration of the regular chunk grid." + ) + + +class RectilinearChunkGrid(CamelCaseStrictModel): + """Represents a rectangular and irregularly spaced chunk grid.""" + + name: str = Field(default="rectilinear", description="The name of the chunk grid.") + + configuration: RectilinearChunkShape = Field( + ..., description="Configuration of the irregular chunk grid." + ) diff --git a/src/mdio/schemas/compressors.py b/src/mdio/schemas/compressors.py new file mode 100644 index 000000000..b550b98dd --- /dev/null +++ b/src/mdio/schemas/compressors.py @@ -0,0 +1,159 @@ +"""This module contains a Pydantic model to parameterize compressors. + +Important Objects: + - Blosc: A Pydantic model that represents a Blosc compression setup. + - ZFP: Class that represents the ZFP compression model. +""" + +from __future__ import annotations + +from enum import IntEnum +from enum import StrEnum + +from pydantic import Field +from pydantic import model_validator + +from mdio.schemas.core import CamelCaseStrictModel + + +class BloscAlgorithm(StrEnum): + """Enum for Blosc algorithm options.""" + + BLOSCLZ = "blosclz" + LZ4 = "lz4" + LZ4HC = "lz4hc" + ZLIB = "zlib" + ZSTD = "zstd" + + +class BloscShuffle(IntEnum): + """Enum for Blosc shuffle options.""" + + NOSHUFFLE = 0 + SHUFFLE = 1 + BITSHUFFLE = 2 + AUTOSHUFFLE = -1 + + +class Blosc(CamelCaseStrictModel): + """Data Model for Blosc options.""" + + name: str = Field(default="blosc", description="Name of the compressor.") + algorithm: BloscAlgorithm = Field( + default=BloscAlgorithm.LZ4, + description="The Blosc compression algorithm to be used.", + ) + level: int = Field(default=5, ge=0, le=9, description="The compression level.") + shuffle: BloscShuffle = Field( + default=BloscShuffle.SHUFFLE, + description="The shuffle strategy to be applied before compression.", + ) + blocksize: int = Field( + default=0, + description="The size of the block to be used for compression.", + ) + + def make_instance(self): # noqa: ANN201 + """Translate parameters to compressor kwargs..""" + from zarr.codecs import Blosc as _Blosc + + return _Blosc( + cname=self.algorithm, + clevel=self.level, + shuffle=self.shuffle, + blocksize=self.blocksize, + ) + + +zfp_mode_map = { + "fixed_rate": 2, + "fixed_precision": 3, + "fixed_accuracy": 4, + "reversible": 5, +} + + +class ZFPMode(StrEnum): + """Enum for ZFP algorithm modes.""" + + FIXED_RATE = "fixed_rate" + FIXED_PRECISION = "fixed_precision" + FIXED_ACCURACY = "fixed_accuracy" + REVERSIBLE = "reversible" + + @property + def int_code(self) -> int: + """Return the integer code of ZFP mode.""" + return zfp_mode_map[self.value] + + +class ZFP(CamelCaseStrictModel): + """Data Model for ZFP options.""" + + name: str = Field(default="zfp", description="Name of the compressor.") + mode: ZFPMode = Field() + + tolerance: float | None = Field( + default=None, + description="Fixed accuracy in terms of absolute error tolerance.", + ) + + rate: float | None = Field( + default=None, + description="Fixed rate in terms of number of compressed bits per value.", + ) + + precision: int | None = Field( + default=None, + description="Fixed precision in terms of number of uncompressed bits per value.", + ) + + write_header: bool = Field( + default=True, + description="Encode array shape, scalar type, and compression parameters.", + ) + + @model_validator(mode="after") + def check_requirements(self) -> ZFP: + """Check if ZFP parameters make sense.""" + mode = self.mode + + # Check if reversible mode is provided without other parameters. + if mode == ZFPMode.REVERSIBLE and any( + getattr(self, key) is not None for key in ["tolerance", "rate", "precision"] + ): + msg = "Other fields must be None in REVERSIBLE mode" + raise ValueError(msg) + + if mode == ZFPMode.FIXED_ACCURACY and self.tolerance is None: + msg = "Tolerance required for FIXED_ACCURACY mode" + raise ValueError(msg) + + if mode == ZFPMode.FIXED_RATE and self.rate is None: + msg = "Rate required for FIXED_RATE mode" + raise ValueError(msg) + + if mode == ZFPMode.FIXED_PRECISION and self.precision is None: + msg = "Precision required for FIXED_PRECISION mode" + raise ValueError(msg) + + return self + + def make_instance(self): # noqa: ANN201 + """Translate parameters to compressor kwargs..""" + from zarr.codecs import ZFPY as _ZFPY + + return _ZFPY( + mode=self.mode.int_code, + tolerance=self.tolerance, + rate=self.rate, + precision=self.precision, + ) + + +class CompressorModel(CamelCaseStrictModel): + """Model representing compressor configuration.""" + + compressor: Blosc | ZFP | None = Field( + default=None, description="Compression settings." + ) diff --git a/src/mdio/schemas/core.py b/src/mdio/schemas/core.py new file mode 100644 index 000000000..34a09066a --- /dev/null +++ b/src/mdio/schemas/core.py @@ -0,0 +1,49 @@ +"""This module implements the core components of the MDIO schemas.""" + +from __future__ import annotations + +from typing import Any +from typing import get_type_hints + +from pydantic import BaseModel +from pydantic import ConfigDict +from pydantic.alias_generators import to_camel + + +def model_fields(model: type[BaseModel]) -> dict[str, tuple[Any, Any]]: + """Extract Pydantic BaseModel fields. + + Args: + model: (Type) The model object for which the fields will be extracted. + + Returns: + A dictionary containing the fields of the model along with + their corresponding types and default values. + + Example: + >>> class MyModel(BaseModel): + ... name: str + ... age: int = 0 + ... + >>> model_fields(MyModel) + {'name': (str, ), 'age': (int, 0)} + """ + annotations = get_type_hints(model) + + fields = {} + for field_name, field in model.model_fields.items(): + fields[field_name] = (annotations[field_name], field) + + return fields + + +class StrictModel(BaseModel): + """A model with forbidden extras.""" + + model_config = ConfigDict(extra="forbid", populate_by_name=True) + + +class CamelCaseStrictModel(StrictModel): + """A model with forbidden extras and camel case aliases.""" + + model_config = ConfigDict(alias_generator=to_camel) diff --git a/src/mdio/schemas/dimension.py b/src/mdio/schemas/dimension.py new file mode 100644 index 000000000..62185a395 --- /dev/null +++ b/src/mdio/schemas/dimension.py @@ -0,0 +1,12 @@ +"""Dimension schema.""" + +from pydantic import Field + +from mdio.schemas.core import CamelCaseStrictModel + + +class NamedDimension(CamelCaseStrictModel): + """Represents a single dimension with a name and size.""" + + name: str = Field(..., description="Unique identifier for the dimension.") + size: int = Field(..., gt=0, description="Total size of the dimension.") diff --git a/src/mdio/schemas/dtype.py b/src/mdio/schemas/dtype.py new file mode 100644 index 000000000..5c2427b00 --- /dev/null +++ b/src/mdio/schemas/dtype.py @@ -0,0 +1,55 @@ +"""Schemas for scalar types. + +We take booleans, unsigned and signed integers, floats, and +complex numbers from numpy data types and allow those. +""" + +from __future__ import annotations + +from enum import StrEnum + +from pydantic import Field + +from mdio.schemas.core import CamelCaseStrictModel + + +class ScalarType(StrEnum): + """Scalar array data type.""" + + BOOL = "bool" + INT8 = "int8" + INT16 = "int16" + INT32 = "int32" + INT64 = "int64" + UINT8 = "uint8" + UINT16 = "uint16" + UINT32 = "uint32" + UINT64 = "uint64" + FLOAT16 = "float16" + FLOAT32 = "float32" + FLOAT64 = "float64" + FLOAT128 = "float128" + COMPLEX64 = "complex64" + COMPLEX128 = "complex128" + COMPLEX256 = "complex256" + + +class StructuredField(CamelCaseStrictModel): + """Structured array field with name, format.""" + + format: ScalarType = Field(...) + name: str = Field(...) + + +class StructuredType(CamelCaseStrictModel): + """Structured array type with packed fields.""" + + fields: list[StructuredField] = Field() + + +class DataTypeModel(CamelCaseStrictModel): + """Structured array type with fields and total item size.""" + + data_type: ScalarType | StructuredType = Field( + ..., description="Type of the array." + ) diff --git a/src/mdio/schemas/metadata.py b/src/mdio/schemas/metadata.py new file mode 100644 index 000000000..dc2d66767 --- /dev/null +++ b/src/mdio/schemas/metadata.py @@ -0,0 +1,31 @@ +"""Metadata schemas and conventions.""" + +from typing import Any + +from pydantic import Field + +from mdio.schemas.chunk_grid import RectilinearChunkGrid +from mdio.schemas.chunk_grid import RegularChunkGrid +from mdio.schemas.core import CamelCaseStrictModel + + +class ChunkGridMetadata(CamelCaseStrictModel): + """Definition of chunk grid.""" + + chunk_grid: RegularChunkGrid | RectilinearChunkGrid | None = Field( + default=None, + description="Chunk grid specification for the array.", + ) + + +class VersionedMetadataConvention(CamelCaseStrictModel): + """Data model for versioned metadata convention.""" + + +class UserAttributes(CamelCaseStrictModel): + """User defined attributes as key/value pairs.""" + + attributes: dict[str, Any] | None = Field( + default=None, + description="User defined attributes as key/value pairs.", + ) diff --git a/src/mdio/schemas/units.py b/src/mdio/schemas/units.py new file mode 100644 index 000000000..6844b4330 --- /dev/null +++ b/src/mdio/schemas/units.py @@ -0,0 +1,51 @@ +"""Common units for resource assessment data.""" + +from __future__ import annotations + +from enum import Enum +from enum import unique + +from pydantic import Field +from pydantic import create_model + +from mdio.schemas.core import CamelCaseStrictModel + + +@unique +class UnitEnum(str, Enum): + """An Enum representing units as strings, from pint.""" + + +def create_unit_model( + unit_enum: type[UnitEnum], + model_name: str, + quantity: str, + module: str, +) -> type[CamelCaseStrictModel]: + """Dynamically creates a pydantic model from a unit Enum. + + Args: + unit_enum: UnitEnum representing the units for a specific quantity. + model_name: The name of the model to be created. + quantity: String representing the quantity for which the unit model is created. + module: Name of the module in which the model is to be created. + This should be the `__name__` attribute of the module. + + Returns: + A Pydantic Model representing the unit model derived from the BaseModel. + + Example: + unit_enum = UnitEnum + model_name = "LengthUnitModel" + quantity = "length" + create_unit_model(unit_enum, model_name, quantity) + """ + fields = {quantity: (unit_enum, Field(..., description=f"Unit of {quantity}."))} + + return create_model( + model_name, + **fields, + __base__=CamelCaseStrictModel, + __doc__=f"Model representing units of {quantity}.", + __module__=module, + ) diff --git a/src/mdio/schemas/v0/__init__.py b/src/mdio/schemas/v0/__init__.py new file mode 100644 index 000000000..e74f484f1 --- /dev/null +++ b/src/mdio/schemas/v0/__init__.py @@ -0,0 +1,6 @@ +"""Schema specific to MDIO v0.""" + +from mdio.schemas.v0.dataset import DatasetModelV0 + + +__all__ = ["DatasetModelV0"] diff --git a/src/mdio/schemas/v0/dataset.py b/src/mdio/schemas/v0/dataset.py new file mode 100644 index 000000000..58c3ae72b --- /dev/null +++ b/src/mdio/schemas/v0/dataset.py @@ -0,0 +1,88 @@ +"""Dataset model for MDIO V0.""" + +from __future__ import annotations + +from pydantic import AwareDatetime +from pydantic import Field + +from mdio.schemas.base import BaseArray +from mdio.schemas.base import BaseDataset +from mdio.schemas.core import CamelCaseStrictModel +from mdio.schemas.core import StrictModel + + +class DimensionModelV0(CamelCaseStrictModel): + """Represents dimension schema for MDIO v0.""" + + name: str = Field(..., description="Name of the dimension.") + coords: list[int] = Field(..., description="Coordinate labels (ticks).") + + +class DatasetMetadataModelV0(StrictModel): + """Represents dataset attributes schema for MDIO v0.""" + + api_version: str = Field( + ..., + description="MDIO version.", + ) + + created: AwareDatetime = Field( + ..., + description="Creation time with TZ info.", + ) + + dimension: list[DimensionModelV0] = Field( + ..., + description="Dimensions.", + ) + + mean: float | None = Field( + default=None, + description="Mean value of the samples.", + ) + + # Statistical information + std: float | None = Field( + default=None, description="Standard deviation of the samples." + ) + + rms: float | None = Field( + default=None, description="Root mean squared value of the samples." + ) + + min: float | None = Field( + default=None, + description="Minimum value of the samples.", + ) + + max: float | None = Field( + default=None, + description="Maximum value of the samples.", + ) + + trace_count: int | None = Field( + default=None, description="Number of traces in the SEG-Y file." + ) + + +class VariableModelV0(BaseArray): + """Represents an MDIO v0 variable schema.""" + + +class DatasetModelV0(BaseDataset): + """Represents an MDIO v0 dataset schema.""" + + seismic: list[VariableModelV0] = Field( + ..., + description="Variable containing seismic.", + ) + + headers: list[VariableModelV0] = Field( + ..., + description="Variable containing headers.", + ) + + metadata: DatasetMetadataModelV0 = Field( + ..., + description="Dataset metadata.", + ) diff --git a/src/mdio/schemas/v1/__init__.py b/src/mdio/schemas/v1/__init__.py new file mode 100644 index 000000000..4f9bcdf36 --- /dev/null +++ b/src/mdio/schemas/v1/__init__.py @@ -0,0 +1,6 @@ +"""Schema specific to MDIO v1.""" + +from mdio.schemas.v1.dataset import Dataset + + +__all__ = ["Dataset"] diff --git a/src/mdio/schemas/v1/dataset.py b/src/mdio/schemas/v1/dataset.py new file mode 100644 index 000000000..f101093bb --- /dev/null +++ b/src/mdio/schemas/v1/dataset.py @@ -0,0 +1,49 @@ +"""Dataset model for MDIO V1.""" + +from pydantic import AwareDatetime +from pydantic import Field +from pydantic import create_model + +from mdio.schemas.base import BaseDataset +from mdio.schemas.core import CamelCaseStrictModel +from mdio.schemas.core import model_fields +from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.variable import Variable + + +class DatasetInfo(CamelCaseStrictModel): + """Contains information about a dataset.""" + + name: str = Field(..., description="Name or identifier for the dataset.") + + api_version: str = Field( + ..., + description="The version of the MDIO API that the dataset complies with.", + ) + + created_on: AwareDatetime = Field( + ..., + description=( + "The timestamp indicating when the dataset was first created, " + "including timezone information. Expressed in ISO 8601 format." + ), + ) + + +DatasetMetadata = create_model( + "DatasetMetadata", + **model_fields(DatasetInfo), + **model_fields(UserAttributes), + __base__=CamelCaseStrictModel, +) +DatasetMetadata.__doc__ = "The metadata about the dataset." + + +class Dataset(BaseDataset): + """Represents an MDIO v1 dataset. + + A dataset consists of variables and metadata. + """ + + variables: list[Variable] = Field(..., description="Variables in MDIO dataset") + metadata: DatasetMetadata = Field(..., description="Dataset metadata.") diff --git a/src/mdio/schemas/v1/stats.py b/src/mdio/schemas/v1/stats.py new file mode 100644 index 000000000..a8a319c02 --- /dev/null +++ b/src/mdio/schemas/v1/stats.py @@ -0,0 +1,72 @@ +"""Statistics schema for MDIO v1 arrays. + +This module provides two Histogram classes (CenteredBinHistogram and +EdgeDefinedHistogram),a summary statistics class, and a summary statistics +metadata class. + +SummaryStatistics: a class that represents the minimum summary statistics +of an array consisting of count, sum, sum of squares, min, max, and a histogram. + +SummaryStatisticsMetadata: represents metadata for statistics, with a field +for v1 of the stats. + +CenteredBinHistogram takes the center points of each bin in a histogram, +while EdgeDefinedHistogram takes the left edges and widths of each bin. +Both classes extend from the base class BaseHistogram, which represents +a histogram with count of each bin. +""" + +from __future__ import annotations + +from typing import TypeAlias + +from pydantic import Field + +from mdio.schemas.core import CamelCaseStrictModel +from mdio.schemas.metadata import VersionedMetadataConvention + + +class BaseHistogram(CamelCaseStrictModel): + """Represents a histogram with bin counts.""" + + counts: list[int] = Field(..., description="Count of each each bin.") + + +class CenteredBinHistogram(BaseHistogram): + """Class representing a center bin histogram.""" + + bin_centers: list[float | int] = Field(..., description="List of bin centers.") + + +class EdgeDefinedHistogram(BaseHistogram): + """A class representing an edge-defined histogram.""" + + bin_edges: list[float | int] = Field( + ..., description="The left edges of the histogram bins." + ) + bin_widths: list[float | int] = Field( + ..., description="The widths of the histogram bins." + ) + + +Histogram: TypeAlias = CenteredBinHistogram | EdgeDefinedHistogram + + +class SummaryStatistics(CamelCaseStrictModel): + """Data model for some statistics in MDIO v1 arrays.""" + + count: int = Field(..., description="The number of data points.") + sum: float = Field(..., description="The total of all data values.") + sum_squares: float = Field(..., description="The total of all data values squared.") + min: float = Field(..., description="The smallest value in the variable.") + max: float = Field(..., description="The largest value in the variable.") + histogram: Histogram = Field(..., description="Binned frequency distribution.") + + +class StatisticsMetadata(VersionedMetadataConvention): + """Data Model representing metadata for statistics.""" + + stats_v1: SummaryStatistics | list[SummaryStatistics] | None = Field( + default=None, + description="Minimal summary statistics.", + ) diff --git a/src/mdio/schemas/v1/units.py b/src/mdio/schemas/v1/units.py new file mode 100644 index 000000000..dd46296c0 --- /dev/null +++ b/src/mdio/schemas/v1/units.py @@ -0,0 +1,126 @@ +"""Unit schemas specific to MDIO v1.""" + +from __future__ import annotations + +from typing import TypeAlias + +from pint import UnitRegistry +from pydantic import Field + +from mdio.schemas.metadata import VersionedMetadataConvention +from mdio.schemas.units import UnitEnum +from mdio.schemas.units import create_unit_model + + +ureg = UnitRegistry() +ureg.default_format = "~C" # compact, abbreviated (symbol). + + +class LengthUnitEnum(UnitEnum): + """Enum class representing metric units of length.""" + + MILLIMETER = ureg.millimeter + CENTIMETER = ureg.centimeter + METER = ureg.meter + KILOMETER = ureg.kilometer + + INCH = ureg.inch + FOOT = ureg.foot + YARD = ureg.yard + MILE = ureg.mile + + +LengthUnitModel = create_unit_model( + LengthUnitEnum, "LengthUnitModel", "length", __name__ +) + + +class TimeUnitEnum(UnitEnum): + """Enum class representing units of time.""" + + NANOSECOND = ureg.nanosecond + MICROSECOND = ureg.microsecond + MILLISECOND = ureg.millisecond + SECOND = ureg.second + MINUTE = ureg.minute + HOUR = ureg.hour + DAY = ureg.day + + +TimeUnitModel = create_unit_model(TimeUnitEnum, "TimeUnitModel", "time", __name__) + + +class DensityUnitEnum(UnitEnum): + """Enum class representing units of density.""" + + GRAMS_PER_CC = ureg.gram / ureg.centimeter**3 + KILOGRAMS_PER_M3 = ureg.kilogram / ureg.meter**3 + POUNDS_PER_GAL = ureg.pounds / ureg.gallon + + +DensityUnitModel = create_unit_model( + DensityUnitEnum, "DensityUnitModel", "density", __name__ +) + + +class SpeedUnitEnum(UnitEnum): + """Enum class representing units of speed.""" + + METER_PER_SECOND = ureg.meter / ureg.second + FEET_PER_SECOND = ureg.feet / ureg.second + + +SpeedUnitModel = create_unit_model(SpeedUnitEnum, "SpeedUnitModel", "speed", __name__) + + +class AngleUnitEnum(UnitEnum): + """Enum class representing units of angle.""" + + DEGREES = ureg.degree + RADIANS = ureg.radian + + +AngleUnitModel = create_unit_model(AngleUnitEnum, "AngleUnitModel", "angle", __name__) + + +class FrequencyUnitEnum(UnitEnum): + """Enum class representing units of frequency.""" + + HERTZ = ureg.hertz + + +FrequencyUnitModel = create_unit_model( + FrequencyUnitEnum, "FrequencyUnitModel", "frequency", __name__ +) + + +class VoltageUnitEnum(UnitEnum): + """Enum class representing units of voltage.""" + + MICROVOLT = ureg.microvolt + MILLIVOLT = ureg.millivolt + VOLT = ureg.volt + + +VoltageUnitModel = create_unit_model( + VoltageUnitEnum, "VoltageUnitModel", "voltage", __name__ +) + + +# Composite model types +AllUnitModel: TypeAlias = ( + LengthUnitModel + | TimeUnitModel + | AngleUnitModel + | DensityUnitModel + | SpeedUnitModel + | FrequencyUnitModel + | VoltageUnitModel +) + + +# Versioned metadata conventions for units +class AllUnits(VersionedMetadataConvention): + """All Units.""" + + units_v1: AllUnitModel | list[AllUnitModel] | None = Field(default=None) diff --git a/src/mdio/schemas/v1/variable.py b/src/mdio/schemas/v1/variable.py new file mode 100644 index 000000000..22ad0bf33 --- /dev/null +++ b/src/mdio/schemas/v1/variable.py @@ -0,0 +1,55 @@ +"""This module defines `LabeledArray`, `Coordinate`, and `Variable`. + +`LabeledArray` is a basic array unit which includes basic properties like +name, dimension, data type, compressor etc. + +`Coordinate` extends the `LabeledArray` class, it represents the Coordinate +array in the MDIO format. It has dimensions which are fully defined and can hold +additional metadata. + +`Variable` is another class that extends the `LabeledArray`. It represents a +variable in MDIO format. It can have coordinates and can also hold metadata. +""" + +from pydantic import Field +from pydantic import create_model + +from mdio.schemas.base import NamedArray +from mdio.schemas.core import CamelCaseStrictModel +from mdio.schemas.core import model_fields +from mdio.schemas.dtype import ScalarType +from mdio.schemas.metadata import ChunkGridMetadata +from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.stats import StatisticsMetadata +from mdio.schemas.v1.units import AllUnits + + +class Coordinate(NamedArray): + """An MDIO coordinate array with metadata.""" + + data_type: ScalarType = Field(..., description="Data type of coordinate.") + metadata: list[AllUnits | UserAttributes] | None = Field( + default=None, description="Coordinate metadata." + ) + + +VariableMetadata = create_model( + "VariableMetadata", + **model_fields(ChunkGridMetadata), + **model_fields(AllUnits), + **model_fields(StatisticsMetadata), + **model_fields(UserAttributes), + __base__=CamelCaseStrictModel, +) + + +class Variable(NamedArray): + """An MDIO variable that has coordinates and metadata.""" + + coordinates: list[Coordinate] | list[str] | None = Field( + default=None, + description="Coordinates of the MDIO variable dimensions.", + ) + metadata: VariableMetadata | None = Field( + default=None, description="Variable metadata." + ) From 1a1e7436b96041df944b058c976da7b753f1db73 Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Tue, 29 Apr 2025 14:43:21 -0500 Subject: [PATCH 04/56] Relocate quickstart notebook to tutorials directory --- docs/tutorials/creation.ipynb | 1225 ++++++++++++++++++++++----------- 1 file changed, 838 insertions(+), 387 deletions(-) diff --git a/docs/tutorials/creation.ipynb b/docs/tutorials/creation.ipynb index af4d3b65d..d154c63f8 100644 --- a/docs/tutorials/creation.ipynb +++ b/docs/tutorials/creation.ipynb @@ -1,396 +1,847 @@ { "cells": [ { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "# Create an Empty MDIO\n", - "\n", - "```{article-info}\n", - ":author: Altay Sansal\n", - ":date: \"{sub-ref}`today`\"\n", - ":read-time: \"{sub-ref}`wordcount-minutes` min read\"\n", - ":class-container: sd-p-0 sd-outline-muted sd-rounded-3 sd-font-weight-light\n", - "```\n", - "\n", - "Here we will create an empty MDIO file and populate its fields.\n", - "\n", - "```{warning}\n", - "For plotting, the notebook requires [Matplotlib](https://matplotlib.org/) as a dependency. Please install it before executing using\n", - "`pip install matplotlib` or `conda install matplotlib`.\n", - "```\n", - "\n", - "We first need to import the configuration classes and create function to be able to create the empty MDIO." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-16T14:50:04.371422Z", - "start_time": "2025-04-16T14:50:04.368107Z" - }, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "import matplotlib.pyplot as plt\n", - "\n", - "from mdio import Dimension\n", - "from mdio import Grid\n", - "from mdio import MDIOCreateConfig\n", - "from mdio import MDIOReader\n", - "from mdio import MDIOVariableConfig\n", - "from mdio import MDIOWriter\n", - "from mdio import create_empty\n", - "from mdio.converters.segy import get_compressor\n", - "from mdio.segy.compat import mdio_segy_spec" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "pycharm": { - "name": "#%% md\n" - } - }, - "source": [ - "## Setting Up Grid Dimensions and Variable(s)\n", - "\n", - "Let's try to create an MDIO file in 3D with known `inline`, `crossline`, and `sample`\n", - "dimensions. This is exactly like a 3D Post-Stack dataset.\n", - "\n", - "We will use the standard `chunked_012` access pattern. All variable names must start\n", - "with `chunked_*` for `MDIOReader` to be able to open them with any access pattern.\n", - "\n", - "We will also use an MDIO private utility function to get the compressor easily. The\n", - "compressor is fully customizable, but this function gives us ones available in SEG-Y\n", - "ingestion.\n", - "\n", - "If we want headers, we can also provide `header_dtype` which is a Numpy `dtype`. Again,\n", - "we will be using the standard one MDIO uses for ingesting SEG-Ys. (Similar to SEG-Y Rev1).\n", - "\n", - "At the end we create empty MDIO on local disk or cloud, based on the path string." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-16T14:50:06.121450Z", - "start_time": "2025-04-16T14:50:06.002634Z" - }, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [], - "source": [ - "grid = Grid(\n", - " dims=[\n", - " Dimension(name=\"inline\", coords=range(100, 300, 1)), # 100-300 with step 1\n", - " Dimension(name=\"crossline\", coords=range(1000, 1600, 2)), # 1000-1600 with step 2\n", - " Dimension(name=\"sample\", coords=range(0, 3000, 4)), # 0-3 seconds 4ms sample rate\n", - " ]\n", - ")\n", - "\n", - "compressor = get_compressor(lossless=True)\n", - "header_dtype = mdio_segy_spec().trace.header.dtype\n", - "variable = MDIOVariableConfig(\n", - " name=\"chunked_012\",\n", - " dtype=\"float32\",\n", - " chunks=(128, 128, 128),\n", - " compressors=compressor,\n", - " header_dtype=header_dtype,\n", - ")\n", - "\n", - "create_conf = MDIOCreateConfig(path=\"demo.mdio\", grid=grid, variables=[variable])\n", - "create_empty(config=create_conf);" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Populating the MDIO\n", - "\n", - "Once empty MDIO is created, you can populate it with sample data, header data,\n", - "metadata, and statistics. The `live_mask` is automatically flipped to 1 after\n", - "every write. However, the consistency of the `live_mask` is up to the user. If\n", - "not populated correctly, at read time, traces may be skipped.\n", - "\n", - "We will read the usual stats and as you can see they're all empty. Text header\n", - "and binary header are only required if we are going to export this back to SEG-Y,\n", - "and can be modified. We can edit these if necessary using the writer." - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-16T14:50:09.974442Z", - "start_time": "2025-04-16T14:50:09.951257Z" - }, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "(['C00 ',\n", - " 'C01 ',\n", - " 'C02 ',\n", - " 'C03 ',\n", - " 'C04 '],\n", - " {},\n", - " {'rms': 0, 'min': 0, 'mean': 0, 'max': 0, 'std': 0})" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "writer = MDIOWriter(create_conf.path)\n", - "\n", - "# Truncate text header for display\n", - "writer.text_header[:5], writer.binary_header, writer.stats" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Updating File and Checking with `MDIOReader`.\n", - "\n", - "We write traces here, the headers are still empty. If you need the headers\n", - "populated, this is where they would be written to file as well.\n", - "\n", - "All the extra metadata we are writing is so that we can export back to SEG-Y\n", - "in the future. If that's not a requirement most of the metadata can be\n", - "omitted.\n", - "\n", - "If you already have an MDIO prior to this, all the metadata can be copied\n", - "over from the previous version." - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-16T14:50:12.498287Z", - "start_time": "2025-04-16T14:50:11.670230Z" - }, - "pycharm": { - "name": "#%%\n" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "({'data_sample_format': 1,\n", - " 'sample_interval': 4,\n", - " 'samples_per_trace': 750,\n", - " 'segy_revision_major': 1,\n", - " 'segy_revision_minor': 0},\n", - " {'rms': 3, 'min': -4, 'mean': 12, 'max': 4, 'std': 5})" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sample_dim = writer.grid.select_dim(\"sample\")\n", - "sample_interval = int(sample_dim.coords[1] - sample_dim.coords[0])\n", - "num_samples = sample_dim.size\n", - "writer.binary_header = {\n", - " \"data_sample_format\": 1,\n", - " \"sample_interval\": sample_interval,\n", - " \"samples_per_trace\": num_samples,\n", - " \"segy_revision_major\": 1,\n", - " \"segy_revision_minor\": 0,\n", - "}\n", - "\n", - "# Write some values to the file\n", - "writer[:5] = 1\n", - "writer[5:10] = 2\n", - "writer[50:100] = 3\n", - "writer[150:175] = -1\n", - "\n", - "# Write some made up stats\n", - "writer.stats = {\"mean\": 12, \"std\": 5, \"rms\": 3, \"min\": -4, \"max\": 4}\n", - "\n", - "reader = MDIOReader(create_conf.path)\n", - "reader.binary_header, reader.stats" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": "Plot some of the data we populated:" - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-16T14:50:14.256953Z", - "start_time": "2025-04-16T14:50:14.036094Z" - } - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAARWhJREFUeJzt3QucjnX+//HPjDkazIScyimRQw4bYkolZBxWREVJlGUTWkTSOkWlpJTWKbUObVapKFZOI6yclRJ2FinEmFJOo2EO9//x+f72uv/3PWYYzO2e+3u/no/H1T33fV33Pdc1Y769r+8xxOVyuQQAAAABL9TfJwAAAID8QbADAACwBMEOAADAEgQ7AAAASxDsAAAALEGwAwAAsATBDgAAwBIEOwAAAEsQ7AAAACxBsMNV88MPP0hISIjMmjVLgpFee79+/fx9GgD+9/c4evToix6nx+ixl/OZWtbpa1r2BbMePXpIpUqVLuvnj0tHsEO+cAqwrVu3SkENlLq98MILOR7TtWtXs79IkSJX/fwAXFm5o9u6devO268rZpYvX97s/+Mf/yi2OHr0qAwePFiqV68uhQsXlpiYGKlfv74p344fP+7v04Ofhfn7BBA8KlasKL///ruEh4f75ftHRUXJP//5Txk+fLjX66mpqfLpp5+a/QACj/7tzp07V5o0aeL1+po1a+TQoUMSGRl53nu0LAoLC7z/BW7ZskXatGkjp0+flkceecQEOqU31S+//LKsXbtWli9fLgVdoP78AwE1drhq9K5ZC+BChQr55ftrYbhr1y755ptvvF7XUHfu3Dm55557/HJeAK78b3v+/PmSkZHh9bqGPQ0+ZcqUOe89WhYFWrDQ2rj77rvPlKFff/21zJgxQ5544gmzvfPOO7Jv3z658847c32/1mBqoCoIAvHnHygIdvBbH7sJEyaY5z/++ON5xw4bNkwiIiLkt99+c7+2adMmadWqlcTGxprmh7vuuku+/PLLPH//+Ph4qVy5sinsPb3//vvmc4sXL37eezT0tW3bVsqVK2fu+qtUqSJjx46VzMxMr+P27NkjnTp1Mv8D0QLr+uuvly5dusiJEycueE7adBIaGipvvfVWnq8DgLeHHnpIjh07JitWrHC/pjdrH330kTz88MM5vienPl7anNuwYUPzN6x/69OnT8/xvWfPnpWBAwfKtddeK0WLFpV7773X1Azm1eeffy533HGHaULV92sZs3Pnzou+T8/np59+ktdff900w2ZXunRprxYJ7demTdDLli2TBg0aSHR0tPuavv/+e3nggQdMuaflaePGjeVf//rXeZ+pZVOtWrXMMddcc435HM8y9NSpUzJgwADzvbSMLFWqlLlJ/uqrry54Ldl//k5fxr1795o+eXFxcaasf+yxx+TMmTPnvf8f//iHCe16TXoNWt4ePHjwoj/DYECwg988+OCD5g/5ww8/PG+fvtayZUtTkKhVq1aZO9GTJ0/KqFGj5KWXXjJ3r82aNZPNmzdf0v8A5s2bZ+5c1S+//GKaLXIr/DWEar+7QYMGyZtvvmkKkpEjR8qzzz7r9T+QhIQE2bhxo/Tv318mT54svXv3NgXnhfq7aAGsn6UFrb4PwOXRUKE3btrVwjM86Y2V/g8/L3bs2GHKnJSUFBMyNFBoWbNgwYLzjv3Tn/4kb7zxhjlemz+1e4mGs7x47733zLFarrzyyisyYsQI05KgzcgXG2Tx2WefmSBz//33S14lJSWZck/DlpZh9erVM330brvtNhP4nnzySXnxxRclLS3NBFTP69Uawaeeekpq1qxprvf5558379ebbIfWFk6dOtXc2E6ZMsX0/dNz3L17t1zu/xc0LI4bN858rWWwfl9Per6PPvqoVK1a1YRcDZaJiYnm/xHH6WNoqmaBKzZz5kxNSq4tW7bkesz+/fvNMXqsIz4+3lW/fn2v4zZv3myOmzNnjnmelZXlqlq1qishIcF87Thz5oyrcuXKrnvuueeC5+Z831dffdX13Xffma///e9/m32TJ092FSlSxJWamurq3r27KyYmxuu9+j2y+/Of/+wqXLiwKy0tzTz/+uuvzWfOnz//guehx/Tt29d8/fTTT7tCQ0Nds2bNuuB7AOSt3Pnb3/7mKlq0qPtv9oEHHnDdfffd5uuKFSu62rZt6/Vefd+oUaPczzt06OCKiopy/fjjj+7Xdu3a5SpUqJA51rF9+3bz/Mknn/T6vIcffvi8z3TOT8sgderUKVdcXJyrV69eXu9NTk52xcbGnvd6dtdcc42rbt26ef756HXr91+6dKnX6wMGDPAqB51z0/K0UqVKrszMTPNa+/btXbVq1brg99Dzdsq13GjZqufiKfvPSr/W1x5//HGv4+677z5XiRIl3M9/+OEH8zt58cUXvY7bsWOHKyws7LzXgxE1dvCrzp07y7Zt20zfEMcHH3xgqvTbt29vnm/fvt00dWqtmja3aC2bbjrooXnz5qazcFZWVp6+nzYp1KlTx31nr00K+n20mSEneufp0LtI/b7ahKJNA//5z3/M69pcoPTuN6cmA09anumUJ3rnrE0J3bt3z9N5A7gwrd3R/mOLFy82f6v6mFtNfHbatUL/fjt06CAVKlRwv16jRg1TG+9pyZIl5lFrsjxprdHFaFOx1ihpDZpTjummfeYaNWokX3zxxQXfry0W2nR7KbT7SU7XcOutt3oNNtEaRG1p0FpDrUFU2hyqTcw6YCM3eozW4B0+fFjyg9YAetLyVst9vXb1ySefmPJef9+eP0PtBqM1eF9c5GcYDAh28Cvt46F9zDTMOcFHO0G3bt1aihUrZl7TUKc0BGmfFs9NOwxrf5eL9WXzpIW9fg/ty7F+/foLFv7a70U7K2t40/PR76kj0ZTzPbXg1KZaPZeSJUuaQlSbY3M6pzlz5ph92m9FC3cA+UP/Nlu0aGFu1vR//hrW8tpk+fPPP5tQqMEgu5tuusnrufYJ1jJL++Bd6LicOGWZdiHJXpZplxBtBr4QLYM0tF4KLZ+y02vI6Xw1yDr71dChQ03g0xCoP5u+ffue1695/Pjx8t1335lpZfQ4bcbWbiiXyzNYK6c7jtPfWn+G+v8JPZ/sP0Nt/k25yM8wGDAkBX6lgxL0jkz71D333HOmn9qBAwdM3xOHUxv36quvmv4dObmU+ec0UOngjF69ekmJEiVMP5mc6J21DtDQwnTMmDGmINdO1dopWAs8z1rC1157zXT41cEWWkDr3bz2EdHr0YEUjttvv93UQP7tb38zd5w5DdgAcHn0Jk3/rpOTk83NodYmFSROmaH97HIaqXuxUaI6YELLD+3Xq4PL8sKz1eFSadDTPnpa+7l06VL5+OOPTT867Rvs9HvTckzLcO2bp2WfltNafmu41t/Bpcpt1gSnX7T+DLVvtvahzOnYIsxFSrBDwWiO1Q68WoBozZ02i7Zr186937kz1oCld+RXSu8INWCtXr1a+vTpk2thqvu1CUALKM8pBPbv35/j8bVr1zabDorQmkD9HtOmTfOaFPnGG280d7hNmzY1I3G1w++lNq0AyJnWrv/5z382N1ROK0BeaG2PBiCnRs2TlkvZ5+PUcKHdRzxrvbIflxOnLNORo5dTlmm5uGHDBhOwrqTGX68hp/N1upfofoeO3NUyWjcNlB07djSDF/Tm2Jn7s2zZsqYM101rzG655RZzzOUEu7z8DDXkaU1ktWrV8v3zbUBTLPxOR1PpnZf2e9MmUh2er4WJQ0ei6h+zTo+ik3Lm1IxyqTRs6Yi3C41Gde4GnTtFpQWb3rF60r4f2efP0oCnzTXaTJyd9vHTPi7abKAFdUGZVwoIdFpboyM0tTnQ8+bwYvRvXbtQLFy40LQYOPRvVPveeXLCyqRJk7xe11GjF6PfQ29QdVR/enr6JZdl2v9MQ9TTTz8t//3vf8/br6Eqt9V1ss/7p7MJaEh0aJ/lt99+24ww1lGwSm9sPWktoe7TMlHPX5u7s3c50dCqLTE5lX35QYOl/r60xtCzbFb6/Fi2cw5G1NghX/397383VfbZ/eUvf8n1PVoQ3H333WbYuvYf0TtDTxqQtP+aFqg6+EGnIbjuuuvMfE7aUVYLykWLFl3SeWoTq24XotMBaP8O7dunTata/a9NKNkLE52KRQdEaH9BvYPUkKfHaeGjoTUnOmeUNttqAav9gPR/KP5akQOwyeUOSNKgoGWXNitqzZP+HTtzuH377bfu47Q7iNaW6Q2ehhotJ7TmXfvsXoyWVRo8u3XrZmq1dCoWrS3UMKlzyGktv3bTyI2WR9rkqeWGnofnyhPaRURvjnXal4vR6Zr0WC1TtWzTLiGzZ882rRFaG6hlrtJuKtpkrOelc+Rp0NXz0+latKVBu6toVxMtw+rWrWuC9cqVK81gC+2e4gt6k6/hVWsMdaCHDnjRc9Fz159N7969zZQrQc3fw3JhB2dYf27bwYMHc5zuxDFjxgyzT6cr+P3333P8HjqtSMeOHc3Q98jISDN8/sEHH3QlJibmebqTC8lpupMvv/zS1bhxY1d0dLSrXLlyrmeeeca1bNky83lffPGFOeb77783Q/SrVKlipksoXry4mWZh5cqVuU534vj000/NEP3OnTu7pxgAkH/TLOV1uhO1Zs0aM/1SRESE64YbbnBNmzbNPQ2HJy2jnnrqKVMWaZnRrl07U8ZdbLoTh5YdOn2TThWiZYaWHT169HBt3bo1T9d9+PBh18CBA13VqlUz79fpl/S8daqPEydOXPC6Hfv27XPdf//9ZvoV/Yxbb73VtXjxYq9jpk+f7rrzzjvdZa6e55AhQ9zf4+zZs+a5TsGiZbf+LPTrKVOmXPZ0Jz///LPXcbn9DD/++GNXkyZNzPfUrXr16qZ8TUpKcgW7EP2Pv8MlAAAArhx97AAAACxBsAMAALAEwQ4AAMAS1gQ7nc1fh2nrvDq6NMulLAwPAAUdZRyAoAl2OhGlLumk85LpkG8ddq3zBbG0CAAbUMYByCsrRsXq3WvDhg3d8//orOC6bp1OPqvz9QBAIKOMAxA0ExTrSgDbtm0zkxU6dHJFXa7Fc1btC9FC8vDhw2aSQ52EFkDg0XtUneBaZ713Jli1wZWWcZRvQHCVbwEf7H755RezrInOiu1Jnzvr3mWnS514LneiKxg4S6gACGwHDx40s+Hb4lLLOMo3ILjLt4APdpdj3LhxZvmY7H78qpIUK5K3O/1HGtaQ1BOB++Pr8tRR6dwvePrnZKSLdKl7s2RmBE+Nhb9+x3t3RMuQTjde9e+bIemyTpaYmqlgllv5dv3o4RL6v0XbHY0bJEloSNZ5x/4wtapknf2/tZID0aMJX0vXltslWGRkhsi9zz4qmVn21FRfTHjSTxL+3yNX/ftmxRWWtDuu/o1SZnqabFv6Yp7Kt8BNJv9TsmRJsybn0aNHvV7X57rGXU60SUM7Insu4q79VTTUFSuatz+M8JBwCQsJ3B9fdGRYnq/VBhnpIRIWEh5UTVH++h0XiSlkftZX3f96C9v2O77UMi638k1DXfZgFx4TIYVCzw92YeFRkpUVuMEuOjo8uMq3zFDzOwsJomAXVijSL+VMVkiE+Vn7S17Kt4D/VxAREWEWQdZFmD37lOjz3BZDjoyMNIsxe24AYEMZR/kGBLfArXLyoHen3bt3lwYNGsitt94qb7zxhqSmpspjjz3m71MDgCtGGQcgqIJd586d5eeff5aRI0dKcnKy1KtXT5YuXXpeZ2MACESUcQCCKtipfv36mQ0AbEQZByAvAr6PHQAAAP4PwQ4AAMASBDsAAABLEOwAAAAsQbADAACwBMEOAADAEgQ7AAAASxDsAAAALEGwAwAAsATBDgAAwBIEOwAAAEsQ7AAAACxBsAMAALAEwQ4AAMASBDsAAABLEOwAAAAsQbADAACwBMEOAADAEgQ7AAAASxDsAAAALEGwAwAAsATBDgAAwBIEOwAAAEsQ7AAAACxBsAMAALAEwQ4AAMASBDsAAABLEOwAAAAsQbADAACwBMEOAADAEgQ7AAAASxDsAAAALEGwAwAAsATBDgAAwBIEOwAAAEsQ7AAAACxBsAMAALAEwQ4AAMASBDsAAABLEOwAAAAsQbADAB9Zu3attGvXTsqVKychISGycOFCr/0ul0tGjhwpZcuWlejoaGnRooXs2bPH65hff/1VunbtKsWKFZO4uDjp2bOnnD59+ipfCYBAQbADAB9JTU2VunXryuTJk3PcP378eJk0aZJMmzZNNm3aJDExMZKQkCBpaWnuYzTU7dy5U1asWCGLFy82YbF3795X8SoABJIwf58AANiqdevWZsuJ1ta98cYbMnz4cGnfvr15bc6cOVK6dGlTs9elSxfZvXu3LF26VLZs2SINGjQwx7z11lvSpk0bmTBhgqkJBABP1NgBgB/s379fkpOTTfOrIzY2Vho1aiQbNmwwz/VRm1+dUKf0+NDQUFPDBwDZUWMHAH6goU5pDZ0nfe7s08dSpUp57Q8LC5PixYu7j8nu7NmzZnOcPHnSB2cPoKCixg4ALDJu3DhT8+ds5cuX9/cpAbiKCHYA4AdlypQxj0ePHvV6XZ87+/QxJSXFa39GRoYZKesck92wYcPkxIkT7u3gwYM+uwYABQ/BDgD8oHLlyiacJSYmejWbat+5+Ph481wfjx8/Ltu2bXMfs2rVKsnKyjJ98XISGRlppkbx3AAED/rYAYCP6Hxze/fu9RowsX37dtNHrkKFCjJgwAB54YUXpGrVqibojRgxwox07dChgzm+Ro0a0qpVK+nVq5eZEiU9PV369etnRswyIhZATgh2AOAjW7dulbvvvtv9fNCgQeaxe/fuMmvWLHnmmWfMXHc6L53WzDVp0sRMbxIVFeV+z/vvv2/CXPPmzc1o2E6dOpm57wAgJwQ7APCRpk2bmvnqcqOrUYwZM8ZsudHavblz5/roDAHYhj52AAAAliDYAQAAWIJgBwAAYIkCHexGjx5t+qB4btWrV3fv14Wy+/btKyVKlJAiRYqYTsXZ54QCAAAIFgU62KlatWrJkSNH3Nu6devc+wYOHCiLFi2S+fPny5o1a+Tw4cPSsWNHv54vAACAvxT4UbG6LmJOM6zrjOrvvvuuGS3WrFkz89rMmTPNvE8bN26Uxo0b++FsAQAA/KfA19jt2bPHTMR5ww03SNeuXeXAgQPmdZ2JXSfrbNGihftYbabVST83bNhwwc/UBbJ1hnfPDQAAINAV6GCnS+boJJ46YefUqVPNrO133HGHnDp1SpKTkyUiIkLi4uK83lO6dGmz70JYJBsAANioQDfFtm7d2v11nTp1TNCrWLGifPjhhxIdHX3Zn6uLZDszwCutsSPcAQCAQFega+yy09q5atWqmbUXtd/duXPnzDI8nnRUbE598jyxSDYAALBRaKAtqL1v3z4pW7as1K9fX8LDwyUxMdG9PykpyfTBi4+P9+t5AgAA+EOBboodPHiwtGvXzjS/6lQmo0aNkkKFCslDDz1k+sb17NnTNKnqWopa69a/f38T6hgRCwAAglGBDnaHDh0yIe7YsWNy7bXXSpMmTcxUJvq1mjhxooSGhpqJiXWka0JCgkyZMsXfpw0AAOAXBTrYzZs374L7o6KiZPLkyWYDAAAIdgHVxw4AAAC5I9gBAABYgmAHAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJgh0AAIAlCHYAAACWINgBAABYgmAHAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJgh0AAIAlCHYAAACWINgBAABYgmAHAABgCYIdAPjAuHHjpGHDhlK0aFEpVaqUdOjQQZKSkryOSUtLk759+0qJEiWkSJEi0qlTJzl69KjXMQcOHJC2bdtK4cKFzecMGTJEMjIyrvLVAAgUBDsA8IE1a9aY0LZx40ZZsWKFpKenS8uWLSU1NdV9zMCBA2XRokUyf/58c/zhw4elY8eO7v2ZmZkm1J07d07Wr18vs2fPllmzZsnIkSP9dFUACrowf58AANho6dKlXs81kGmN27Zt2+TOO++UEydOyLvvvitz586VZs2amWNmzpwpNWrUMGGwcePGsnz5ctm1a5esXLlSSpcuLfXq1ZOxY8fK0KFDZfTo0RIREeGnqwNQUFFjBwBXgQY5Vbx4cfOoAU9r8Vq0aOE+pnr16lKhQgXZsGGDea6PtWvXNqHOkZCQICdPnpSdO3fm+H3Onj1r9ntuAIIHwQ4AfCwrK0sGDBggt99+u9x8883mteTkZFPjFhcX53Wshjjd5xzjGeqc/c6+3Pr2xcbGurfy5cv76KoAFEQEOwDwMe1r991338m8efN8/r2GDRtmaged7eDBgz7/ngAKDvrYAYAP9evXTxYvXixr166V66+/3v16mTJlzKCI48ePe9Xa6ahY3eccs3nzZq/Pc0bNOsdkFxkZaTYAwYkaOwDwAZfLZULdggULZNWqVVK5cmWv/fXr15fw8HBJTEx0v6bToej0JvHx8ea5Pu7YsUNSUlLcx+gI22LFiknNmjWv4tUACBTU2AGAj5pfdcTrp59+auayc/rEab+36Oho89izZ08ZNGiQGVChYa1///4mzOmIWKXTo2iA69atm4wfP958xvDhw81nUysHICcEOwDwgalTp5rHpk2ber2uU5r06NHDfD1x4kQJDQ01ExPraFYd8TplyhT3sYUKFTLNuH369DGBLyYmRrp37y5jxoy5ylcDIFAQ7ADAR02xFxMVFSWTJ082W24qVqwoS5YsyeezA2Ar+tgBAABYgmAHAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJgh0AAIAlCHYAAACWINgBAABYgmAHAABgCYIdAACAJfwa7NauXSvt2rWTcuXKSUhIiCxcuNBrv8vlkpEjR0rZsmUlOjpaWrRoIXv27PE65tdff5WuXbtKsWLFJC4uTnr27CmnT5++ylcCAAAQ5MEuNTVV6tatK5MnT85x//jx42XSpEkybdo02bRpk8TExEhCQoKkpaW5j9FQt3PnTlmxYoUsXrzYhMXevXtfxasAAAAoGML8+c1bt25ttpxobd0bb7whw4cPl/bt25vX5syZI6VLlzY1e126dJHdu3fL0qVLZcuWLdKgQQNzzFtvvSVt2rSRCRMmmJpAAACAYFFg+9jt379fkpOTTfOrIzY2Vho1aiQbNmwwz/VRm1+dUKf0+NDQUFPDl5uzZ8/KyZMnvTYAAIBAV2CDnYY6pTV0nvS5s08fS5Uq5bU/LCxMihcv7j4mJ+PGjTMh0dnKly/vk2sAAAC4mgpssPOlYcOGyYkTJ9zbwYMH/X1KAAAA9ga7MmXKmMejR496va7PnX36mJKS4rU/IyPDjJR1jslJZGSkGUXruQEAAAS6AhvsKleubMJZYmKi+zXtC6d95+Lj481zfTx+/Lhs27bNfcyqVaskKyvL9MUDAAAIJn4dFavzze3du9drwMT27dtNH7kKFSrIgAED5IUXXpCqVauaoDdixAgz0rVDhw7m+Bo1akirVq2kV69eZkqU9PR06devnxkxy4hYAAAQbPwa7LZu3Sp33323+/mgQYPMY/fu3WXWrFnyzDPPmLnudF46rZlr0qSJmd4kKirK/Z7333/fhLnmzZub0bCdOnUyc98BAAAEG78Gu6ZNm5r56nKjq1GMGTPGbLnR2r25c+f66AwBAAACR4HtYwcAAIBLQ7ADAACwBMEOAADAEgQ7AAAASxDsAAAALEGwAwAAsATBDgAAwBIEOwAAAEsQ7AAAACxBsAMAALAEwQ4AAMASBDsAAABLEOwAAAAsQbADAACwBMEOAHxg6tSpUqdOHSlWrJjZ4uPj5fPPP3fvT0tLk759+0qJEiWkSJEi0qlTJzl69KjXZxw4cEDatm0rhQsXllKlSsmQIUMkIyPDD1cDIFAQ7ADAB66//np5+eWXZdu2bbJ161Zp1qyZtG/fXnbu3Gn2Dxw4UBYtWiTz58+XNWvWyOHDh6Vjx47u92dmZppQd+7cOVm/fr3Mnj1bZs2aJSNHjvTjVQEo6ML8fQIAYKN27dp5PX/xxRdNLd7GjRtN6Hv33Xdl7ty5JvCpmTNnSo0aNcz+xo0by/Lly2XXrl2ycuVKKV26tNSrV0/Gjh0rQ4cOldGjR0tERISfrgxAQUaNHQD4mNa+zZs3T1JTU02TrNbipaenS4sWLdzHVK9eXSpUqCAbNmwwz/Wxdu3aJtQ5EhIS5OTJk+5av5ycPXvWHOO5AQgeBDsA8JEdO3aY/nORkZHyxBNPyIIFC6RmzZqSnJxsatzi4uK8jtcQp/uUPnqGOme/sy8348aNk9jYWPdWvnx5n1wbgIKJYAcAPnLTTTfJ9u3bZdOmTdKnTx/p3r27aV71pWHDhsmJEyfc28GDB336/QAULPSxAwAf0Vq5G2+80Xxdv3592bJli7z55pvSuXNnMyji+PHjXrV2Oiq2TJky5mt93Lx5s9fnOaNmnWNyorWDugEITtTYAcBVkpWVZfrAacgLDw+XxMRE976kpCQzvYn2wVP6qE25KSkp7mNWrFhhpk7R5lwAyAk1dgDgoybR1q1bmwERp06dMiNgV69eLcuWLTN933r27CmDBg2S4sWLm7DWv39/E+Z0RKxq2bKlCXDdunWT8ePHm351w4cPN3PfUSMHIDcEOwDwAa1pe/TRR+XIkSMmyOlkxRrq7rnnHrN/4sSJEhoaaiYm1lo8HfE6ZcoU9/sLFSokixcvNn3zNPDFxMSYPnpjxozx41UBKOgIdgDgAzpP3YVERUXJ5MmTzZabihUrypIlS3xwdgBsRR87AAAASxDsAAAALEGwAwAAsMQVBTudh0mH6GdkZOTfGQEAAODqBbszZ86YofqFCxeWWrVqmbmXlA7Xf/nlly/vTAAAAHD1g53Oz/TNN9+YOZl0ZJdDF7T+4IMPruyMAAAAcPWmO1m4cKEJcDqRZkhIiPt1rb3bt2/f5Z0JAAAArn6N3c8//yylSpU67/XU1FSvoAcAAIACHuwaNGgg//rXv9zPnTD3zjvvuNc5BAAAQAA0xb700ktmDcRdu3aZEbFvvvmm+Xr9+vWyZs2a/D9LALiK/v3vf8v06dNN15KPPvpIrrvuOnnvvfekcuXK0qRJE3+fHgDkb42dFmzbt283oa527dqyfPly0zS7YcMGqV+//uV8JAAUCB9//LFZtzU6Olq+/vprs46rOnHihLmpBQAr14qtUqWKzJgxI3/PBgD87IUXXpBp06bJo48+KvPmzXO/fvvtt5t9AGBlsMvKypK9e/dKSkqK+drTnXfemR/nBgBXnU66nlMZFhsbK8ePH/fLOQGAT4Pdxo0b5eGHH5Yff/xRXC6X1z4dSJGZmXk5HwsAflemTBlz01qpUiWv19etWyc33HCD384LAHwW7J544gn3yNiyZcsyxQkAa/Tq1Uv+8pe/yN///ndTth0+fNj0Hx48eLCMGDHC36cHAPkf7Pbs2WNGit14442X83YAKLCeffZZ072kefPmZvlEbZaNjIw0wU6XTQQA64Jdo0aNTFMFwQ6AbbSW7q9//asMGTLElHOnT5+WmjVrSpEiRfx9agDgm2Cnd61PP/20JCcnm+lOwsPDvfbXqVPncj4WAAqMiIgIE+gAwPpg16lTJ/P4+OOPe93l6kAKBk8ACDQdO3bM87GffPKJT88FAK56sNu/f/8VfVMAKEh0KhMACNpgV7Fixfw/EwDwk5kzZ/r7FADg6ga7zz77zKwPq/3p9OsLuffee/Pj3ADAb3TydZ2sWN10001m2UQAsCbYdejQwQyW0MJNv84NfewABLKTJ09K3759zXJiTllWqFAh6dy5s0yePJlmWwAFWmheD9R5nZw7Vv06t41QByDQJyjetGmTLF682Cwhppt+vXXrVvnzn//s79MDAN+sFQsANtIQt2zZMmnSpIn7tYSEBJkxY4a0atXKr+cGAPkW7CZNmpTXQ+Wpp57K87EAUJCUKFEix+ZWfe2aa67xyzkBQL4Hu4kTJ+bpOO1jR7ADEKiGDx8ugwYNkvfee0/KlCljXtP+xboSBWvFArAm2DF3HYBgMHXqVLOUWIUKFcymDhw4YNaL/fnnn2X69OnuY7/66is/nikA+KiPnQ6Y2LFjh5nf7lKaKtauXSuvvvqqbNu2TY4cOSILFizwGnHbo0cPmT17ttd7tK/L0qVL3c9//fVXs8TZokWLJDQ01KyK8eabb7KuI4DLcqFR/wBgZbAbMGCAWSO2Z8+eJtTdeeedsmHDBilcuLDpeNy0adM8fU5qaqrUrVvXLE2W25I+2lnZc/JQvWv21LVrVxMKV6xYIenp6fLYY49J7969Ze7cuZdzaQCC3KhRo/x9CgBwdYPdRx99JI888oj5WmvKfvjhB/nPf/5j+qT89a9/lS+//DJPn6MTHut2IRrknH4u2e3evdvU3m3ZskUaNGhgXnvrrbekTZs2MmHCBClXrtwlXxsAOE6fPm2mcfJUrFgxv50PAOTbPHaefvnlF3fYWrJkiTzwwANSrVo1U/OmTbL5afXq1Wb+PJ35vU+fPnLs2DH3Pq0ljIuLc4c61aJFC9Mkq/NQ5ebs2bNmElLPDQCc/sRt27aVmJgY90hY3bSsYVQsACtr7EqXLi27du2SsmXLmhoz7Wyszpw5Y2Zozy/aDKtNtJUrV5Z9+/bJc889Z2r4NNDp93FWwvAUFhYmxYsXN/tyM27cOHn++efz7TwB2ENbI1wul/z97383ZZ2O9AcAq4Od9mN78MEHTbDTQk9ryZTWklWvXj3fTq5Lly7ur7VPX506daRKlSqmFq958+aX/bnDhg0z0xk4tMaufPnyV3y+AALfN998YwZ0aSsBAARFsBs9erTcfPPNcvDgQdMM6wxo0Fq0Z599VnzlhhtukJIlS5qpCDTYaXOwLtTtKSMjw4yUza1fntLzzT4IAwBUw4YNTdlGsAMQVNOd3H///V7PdT3F7t27iy8dOnTI9LHTmkIVHx9vvq/eXdevX9+8tmrVKtPZuVGjRj49FwB2euedd+SJJ56Qn376ydzAhoeHe+3XlgMAsCrYvfLKK1KpUiXp3Lmzea7Nsh9//LEJXDqYIq8Fn44409o3z07L27dvN33kdNN+cDovnda+aR+7Z555Rm688UYzl52qUaOG6Yeni3ZPmzbNTHfSr18/04TLiFgAl0MnIdbyRrucOLTLifa700ed4gkArBoVqyHK6ZOm88fp9vnnn5uQNXjw4Dx/ztatW+UPf/iD2ZT2e9OvR44caZp1v/32W7n33nvNiFudM09r5f797397NaO+//77pl+fNs3qNCe6cPfbb799OZcFAGZ0v5ZDOkjr+++/Nzecno8AYF2NnY44dYKdTkisNXYtW7Y0tXiX0gSqExnrXXBuli1bdtHP0Jo9JiMGkF9+/PFH+eyzz0zrAAAERY2dzuWknYuVTnfijIrVkEYzBYBA1qxZMzMyFgCCJtjp3HIPP/yw3HPPPWYwg7N6xNdff81dLoCA1q5dOxk4cKAZ/a99h7X2znO7XC+//LLpo6dLMjrS0tKkb9++UqJECbO+tfYpPnr0qNf7Dhw4YCZM1iUbdd7OIUOGmNH/AJBvTbETJ040za5aazd+/HhTIClds/XJJ5+8nI8EgAJBR8SqMWPGnLfvcgdP6LKH06dPP29gmQbIf/3rXzJ//nyzyoUO/tIbZ2dZRv1eGup0ANn69etNGfvoo4+akbovvfTSZV8jAHtdVrDTQiWnQRJaSAFAIMu+NuyV0tH/Xbt2lRkzZsgLL7zgfv3EiRPy7rvvmj7C2vyrZs6caUb7b9y4URo3bizLly83q/ysXLnSrIJRr149GTt2rAwdOtTUKEZEROTruQII0qZYpdMB9O/f3/Sv0+2pp55ixBgAZKNNrVrr5vRFduj8mzpFk+frOsK/QoUKZkSu0kdddUdDnUOne9LVcnbu3HkVrwKA1TV2OlpVpyHRu8fbb7/dvKZNBzVr1pRFixaZvncAEKhSU1NlzZo1pn/buXPnvPbpTWxezZs3T7766ivTFJvT7AJa4xYXF+f1uoY4Z61rffQMdc5+Z19Ozp49azaHhkAAweOygp0uG6bNrtoZOPvr2kRAsAMQqHQQmM6JeebMGRPwdEqlX375xT14Ia/BTvsg/+UvfzHzfEZFRcnVMm7cODO5O4DgdFlNsbt37zYTBuc0saf2BwGAQKU3rToy9rfffpPo6GjT303nttMJ0idMmJDnz9GmVl3L+pZbbpGwsDCzaS3gpEmTzNda86a1gbosoicdFeusda2P2UfJOs9zWw972LBhpv+eszlTUwEIDpcV7K699lqz9Fd2+pre0QJAoNJy7Omnn5bQ0FCzAo42a+qE7DoDwHPPPZfnz9HVcHbs2GE+z9kaNGhgBlI4X+tAtMTERPd7kpKSTPOvroOt9FE/QwOiQ2sAixUrZrq+5ERX5tH9nhuA4HFZTbG6Nmvv3r3NYInbbrvN3cdO15DVZcEAIFBp2NJQp/RGVYOWjlTV6UgupfaraNGicvPNN3u9FhMTY+asc17Xlg8tM7W5VwOYDkjTMKcjYpWu6KMBrlu3biZYar+64cOHmwEZnksrAsAVBbsRI0aYQuu1114z1f6qXLlyZvj9pXQsBoCCRteJ1cEOVatWlbvuususXa197N57773zgtqV0jlBNUTqxMRaM6gjXqdMmeLerzWGumxjnz59TODTYNi9e/cc59gDgMsKdjrjuc67pCtPaF+UU6dOmdc16AFAoNOJf51y7cUXXzQTAmuwqlatmrzzzjtX9NmrV6/2eq6DKiZPnmy23FSsWFGWLFlyRd8XQPC45GCnnX51ZnYdQKEIdABsUqtWLbPutdMUO23aNFmwYIFpEtUpngDAusETt956q5kSAABs0759e5kzZ475Wkesan+3119/XTp06CBTp0719+kBQP73sdP1YHXU2KFDh8wUANrvw1P29RABIFDohMLa90199NFHZloSvZH9+OOPTX87bZYFAKuCXZcuXcyj50AJXRxbmy8ud5FsACgIdGJip4uJrtXasWNHM8BBa+50PjsAsC7Y7d+/P//PBAAKgBtvvFEWLlwo9913n1k+UQeJKZ1LjjnhAFjZx05Hxeqkmjpay3PT13RtRAAIVNrcOnjwYKlUqZI0atTIPVmw1t7pVCgAYF2wmz59ulSvXj3H0WQ6ggwAAtX9999vJiXeunWrLF261GslCafvHQBY1RSrs5+XLVs2x6XGjhw5kh/nBQB+o+uwZl+LVWcDAAAra+x03URdQiw7fU1XoAAAAEAArRU7YMAASU9Pl2bNmpnXtH/dM888Y6ZBAQAAQIAEuyFDhsixY8fMfHbnzp1zL40zdOhQ99qxAAAACIBgp3PVvfLKKzJixAiztFh0dLRZMDsyMjL/zxAAAAC+C3aOIkWKSMOGDa/kIwAAAODPwRMAAAAoeAh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJgh0AAIAlCHYAAACWINgBAABYgmAHAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJgh0AAIAlCHYAAACWINgBAABYgmAHAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwA+MHr0aAkJCfHaqlev7t6flpYmffv2lRIlSkiRIkWkU6dOcvToUa/POHDggLRt21YKFy4spUqVkiFDhkhGRoYfrgZAoPBrsBs3bpw0bNhQihYtagqtDh06SFJSktcxFH4AAlWtWrXkyJEj7m3dunXufQMHDpRFixbJ/PnzZc2aNXL48GHp2LGje39mZqYp186dOyfr16+X2bNny6xZs2TkyJF+uhoAgcCvwU4LMw1tGzdulBUrVkh6erq0bNlSUlNT3cdQ+AEIVGFhYVKmTBn3VrJkSfP6iRMn5N1335XXX39dmjVrJvXr15eZM2eaMkzLQ7V8+XLZtWuX/OMf/5B69epJ69atZezYsTJ58mRT3gFAgQt2S5culR49epi72rp165pAprVv27ZtM/sp/AAEsj179ki5cuXkhhtukK5du5ryTWkZpzeyLVq0cB+rzbQVKlSQDRs2mOf6WLt2bSldurT7mISEBDl58qTs3LnTD1cDIBAUqD52GuRU8eLFfVr4nT171uz33AAgPzVq1MjcrOoN7NSpU2X//v1yxx13yKlTpyQ5OVkiIiIkLi7O6z1ajuk+pY+e5Zqz39mXG8o3ILiFSQGRlZUlAwYMkNtvv11uvvlm85qvCj/t2/f888/76EoAQEzrgaNOnTom6FWsWFE+/PBDiY6O9tn3pXwDgluBqbHTvnbfffedzJs3z+ffa9iwYaZ20NkOHjzo8+8JILjpDWq1atVk7969pr+ddhU5fvy41zE6MEz3KX3MPlDMee4ckxPKNyC4FYhg169fP1m8eLF88cUXcv3117tf91XhFxkZKcWKFfPaAMCXTp8+Lfv27ZOyZcua/sLh4eGSmJjo3q8zAmgfvPj4ePNcH3fs2CEpKSnuY3SQmZZXNWvWzPX7UL4Bwc2vwc7lcplQt2DBAlm1apVUrlzZa78vCz8A8KXBgwebkfw//PCDGfB13333SaFCheShhx6S2NhY6dmzpwwaNMjc0Gp/4scee8yUZ40bNzbv1xkCtAzr1q2bfPPNN7Js2TIZPny4ad3Q8AYABa6PnRZQc+fOlU8//dTMZef0idNCT/ugeBZ+OqBCw1r//v1zLfzGjx9vPoPCD4C/HTp0yIS4Y8eOybXXXitNmjQxo/n1azVx4kQJDQ01c3PqgAcd9DVlyhT3+zUEaktGnz59TJkXExMj3bt3lzFjxvjxqgAUdH4NdjpSTDVt2tTrdZ3SRKdBURR+AALRxfoLR0VFmWmZdMuNDrZYsmSJD84OgK3C/N0UezEUfgAAAAE0eAIAAABXjmAHAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJgh0AAIAlCHYAAACWINgBAABYgmAHAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJgh0AAIAlCHYAAACWINgBAABYgmAHAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJgh0AAIAlCHYAAACWINgBAABYgmAHAABgCYIdAACAJQh2AAAAliDYAYCP/PTTT/LII49IiRIlJDo6WmrXri1bt25173e5XDJy5EgpW7as2d+iRQvZs2eP12f8+uuv0rVrVylWrJjExcVJz5495fTp0364GgCBgGAHAD7w22+/ye233y7h4eHy+eefy65du+S1116Ta665xn3M+PHjZdKkSTJt2jTZtGmTxMTESEJCgqSlpbmP0VC3c+dOWbFihSxevFjWrl0rvXv39tNVASjowvx9AgBgo1deeUXKly8vM2fOdL9WuXJlr9q6N954Q4YPHy7t27c3r82ZM0dKly4tCxculC5dusju3btl6dKlsmXLFmnQoIE55q233pI2bdrIhAkTpFy5cn64MgAFGTV2AOADn332mQljDzzwgJQqVUr+8Ic/yIwZM9z79+/fL8nJyab51REbGyuNGjWSDRs2mOf6qM2vTqhTenxoaKip4cvJ2bNn5eTJk14bgOBBsAMAH/j+++9l6tSpUrVqVVm2bJn06dNHnnrqKZk9e7bZr6FOaQ2dJ33u7NNHDYWewsLCpHjx4u5jshs3bpwJiM6mtYYAggfBDgB8ICsrS2655RZ56aWXTG2d9ovr1auX6U/nS8OGDZMTJ064t4MHD/r0+wEoWAh2AOADOtK1Zs2aXq/VqFFDDhw4YL4uU6aMeTx69KjXMfrc2aePKSkpXvszMjLMSFnnmOwiIyPNCFrPDUDwINgBgA/oiNikpCSv1/773/9KxYoV3QMpNJwlJia692t/OO07Fx8fb57r4/Hjx2Xbtm3uY1atWmVqA7UvHgBkx6hYAPCBgQMHym233WaaYh988EHZvHmzvP3222ZTISEhMmDAAHnhhRdMPzwNeiNGjDAjXTt06OCu4WvVqpW7CTc9PV369etnRswyIhZATgh2AOADDRs2lAULFpg+b2PGjDHBTac30XnpHM8884ykpqaa/ndaM9ekSRMzvUlUVJT7mPfff9+EuebNm5vRsJ06dTJz3wFATgh2AOAjf/zjH82WG62109CnW250BOzcuXN9dIYAbEMfOwAAAEsQ7AAAACzh12CnE2lqP5SiRYuaSTi1w3D2UWRNmzY1zRWe2xNPPOF1jE4f0LZtWylcuLD5nCFDhpgpAQAAAIKJX/vYrVmzRvr27WvCnQax5557Tlq2bGkWy9bFsB06IsyzD4oGOEdmZqYJdTptwPr16+XIkSPy6KOPmoW3dTQaAABAsPBrsNPRX55mzZplatx0zqY777zTK8jlNhnn8uXLTRBcuXKlWYqnXr16MnbsWBk6dKiMHj1aIiIifH4dAAAABUGB6mOny984o8A86XD/kiVLys0332ymDjhz5ox7ny6SXbt2ba/1FhMSEsxEnzt37szx+7BINgAAsFGBme5EZ1LXyTp1tnYNcI6HH37YzNSuk3F+++23piZO++F98sknZr8uhJ3TItrOvtz69j3//PM+vR4AAICgDXba1+67776TdevWeb2uE3c6tGZO11/UiTr37dsnVapUuazvpbV+gwYNcj/XGrvy5ctfwdkDAAD4X4FoitVZ1RcvXixffPGFXH/99Rc81lkfce/eveZR+97ltIi2sy8nLJINAABs5Ndg53K5TKjTZXd0YWtdcuditm/fbh615s5ZJHvHjh2SkpLiPmbFihUmrNWsWdOHZw8AAFCwhPm7+VWXyvn000/NXHZOn7jY2FiJjo42za26v02bNlKiRAnTx04X1tYRs3Xq1DHH6vQoGuC6desm48ePN58xfPhw89laMwcAABAs/FpjN3XqVDMSVich1ho4Z/vggw/Mfp2qRKcx0fBWvXp1efrpp80C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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, ax = plt.subplots(1, 2, sharex=\"all\")\n", - "ax[0].imshow(writer.live_mask[:].T, aspect=\"auto\")\n", - "ax[1].imshow(reader[:, 150].T, aspect=\"auto\")\n", - "\n", - "ax[0].set_xlabel(\"inline\")\n", - "ax[0].set_ylabel(\"crossline\")\n", - "ax[1].set_xlabel(\"inline\")\n", - "ax[1].set_ylabel(\"sample\")\n", - "ax[0].set_title(\"Live Mask\")\n", - "ax[1].set_title(\"Middle Crossline\")\n", - "fig.tight_layout();" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Write to SEG-Y\n", - "\n", - "Because we populated all the fields necessary for SEG-Y output, we can call the\n", - "MDIO to SEGY converter and get a file out." - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-16T14:50:15.788812Z", - "start_time": "2025-04-16T14:50:15.009889Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Unwrapping MDIO Blocks: 100%|██████████| 7/7 [00:00<00:00, 10.55it/s]\n", - "Merging lines: 100%|██████████| 1/1 [00:00<00:00, 17.26it/s]" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[(0, 0, 0, 0, 0, 4, 4000, 750, 750, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0)]\n", - "[[1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " ...\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]\n", - " [1. 1. 1. ... 1. 1. 1.]]\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\n" - ] - } - ], - "source": [ - "from segy import SegyFile\n", - "\n", - "from mdio import mdio_to_segy\n", - "\n", - "mdio_to_segy(\"demo.mdio\", \"demo.segy\")\n", - "segy = SegyFile(\"demo.segy\")\n", - "print(segy.binary_header)\n", - "print(segy.sample[:100])" - ] - }, - { - "cell_type": "markdown", "metadata": {}, + "cell_type": "raw", "source": [ - "## Copying an Existing MDIO without Data and Headers\n", - "\n", - "We also provide a `create_empty_like` function which allows us to create an MDIO file\n", - "with the same structure and basic metadata as an existing one.\n", - "\n", - "This will carry over:\n", - "* All access patterns in source MDIO\n", - "* Grid (shape, coordinates, dimensions, etc)\n", - "* Text Header\n", - "* Binary Header\n", - "\n", - "It will **NOT** carry over:\n", - "* Trace data\n", - "* Header data\n", - "* Statistics\n", - "* Live Mask" + "{\n", + " \"cells\": [\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {\n", + " \"pycharm\": {\n", + " \"name\": \"#%% md\\n\"\n", + " }\n", + " },\n", + " \"source\": [\n", + " \"# Create an Empty MDIO\\n\",\n", + " \"\\n\",\n", + " \"```{article-info}\\n\",\n", + " \":author: Altay Sansal\\n\",\n", + " \":date: \\\"{sub-ref}`today`\\\"\\n\",\n", + " \":read-time: \\\"{sub-ref}`wordcount-minutes` min read\\\"\\n\",\n", + " \":class-container: sd-p-0 sd-outline-muted sd-rounded-3 sd-font-weight-light\\n\",\n", + " \"```\\n\",\n", + " \"\\n\",\n", + " \"Here we will create an empty MDIO file and populate its fields.\\n\",\n", + " \"\\n\",\n", + " \"```{warning}\\n\",\n", + " \"For plotting, the notebook requires [Matplotlib](https://matplotlib.org/) as a dependency. Please install it before executing using\\n\",\n", + " \"`pip install matplotlib` or `conda install matplotlib`.\\n\",\n", + " \"```\\n\",\n", + " \"\\n\",\n", + " \"We first need to import the configuration classes and create function to be able to create the empty MDIO.\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 2,\n", + " \"metadata\": {\n", + " \"ExecuteTime\": {\n", + " \"end_time\": \"2025-04-16T14:50:04.371422Z\",\n", + " \"start_time\": \"2025-04-16T14:50:04.368107Z\"\n", + " },\n", + " \"pycharm\": {\n", + " \"name\": \"#%%\\n\"\n", + " }\n", + " },\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"import matplotlib.pyplot as plt\\n\",\n", + " \"\\n\",\n", + " \"from mdio import Dimension\\n\",\n", + " \"from mdio import Grid\\n\",\n", + " \"from mdio import MDIOCreateConfig\\n\",\n", + " \"from mdio import MDIOReader\\n\",\n", + " \"from mdio import MDIOVariableConfig\\n\",\n", + " \"from mdio import MDIOWriter\\n\",\n", + " \"from mdio import create_empty\\n\",\n", + " \"from mdio.converters.segy import get_compressor\\n\",\n", + " \"from mdio.segy.compat import mdio_segy_spec\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {\n", + " \"pycharm\": {\n", + " \"name\": \"#%% md\\n\"\n", + " }\n", + " },\n", + " \"source\": [\n", + " \"## Setting Up Grid Dimensions and Variable(s)\\n\",\n", + " \"\\n\",\n", + " \"Let's try to create an MDIO file in 3D with known `inline`, `crossline`, and `sample`\\n\",\n", + " \"dimensions. This is exactly like a 3D Post-Stack dataset.\\n\",\n", + " \"\\n\",\n", + " \"We will use the standard `chunked_012` access pattern. All variable names must start\\n\",\n", + " \"with `chunked_*` for `MDIOReader` to be able to open them with any access pattern.\\n\",\n", + " \"\\n\",\n", + " \"We will also use an MDIO private utility function to get the compressor easily. The\\n\",\n", + " \"compressor is fully customizable, but this function gives us ones available in SEG-Y\\n\",\n", + " \"ingestion.\\n\",\n", + " \"\\n\",\n", + " \"If we want headers, we can also provide `header_dtype` which is a Numpy `dtype`. Again,\\n\",\n", + " \"we will be using the standard one MDIO uses for ingesting SEG-Ys. (Similar to SEG-Y Rev1).\\n\",\n", + " \"\\n\",\n", + " \"At the end we create empty MDIO on local disk or cloud, based on the path string.\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 3,\n", + " \"metadata\": {\n", + " \"ExecuteTime\": {\n", + " \"end_time\": \"2025-04-16T14:50:06.121450Z\",\n", + " \"start_time\": \"2025-04-16T14:50:06.002634Z\"\n", + " },\n", + " \"pycharm\": {\n", + " \"name\": \"#%%\\n\"\n", + " }\n", + " },\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"grid = Grid(\\n\",\n", + " \" dims=[\\n\",\n", + " \" Dimension(name=\\\"inline\\\", coords=range(100, 300, 1)), # 100-300 with step 1\\n\",\n", + " \" Dimension(name=\\\"crossline\\\", coords=range(1000, 1600, 2)), # 1000-1600 with step 2\\n\",\n", + " \" Dimension(name=\\\"sample\\\", coords=range(0, 3000, 4)), # 0-3 seconds 4ms sample rate\\n\",\n", + " \" ]\\n\",\n", + " \")\\n\",\n", + " \"\\n\",\n", + " \"compressor = get_compressor(lossless=True)\\n\",\n", + " \"header_dtype = mdio_segy_spec().trace.header.dtype\\n\",\n", + " \"variable = MDIOVariableConfig(\\n\",\n", + " \" name=\\\"chunked_012\\\",\\n\",\n", + " \" dtype=\\\"float32\\\",\\n\",\n", + " \" chunks=(128, 128, 128),\\n\",\n", + " \" compressors=compressor,\\n\",\n", + " \" header_dtype=header_dtype,\\n\",\n", + " \")\\n\",\n", + " \"\\n\",\n", + " \"create_conf = MDIOCreateConfig(path=\\\"demo.mdio\\\", grid=grid, variables=[variable])\\n\",\n", + " \"create_empty(config=create_conf);\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"## Populating the MDIO\\n\",\n", + " \"\\n\",\n", + " \"Once empty MDIO is created, you can populate it with sample data, header data,\\n\",\n", + " \"metadata, and statistics. The `live_mask` is automatically flipped to 1 after\\n\",\n", + " \"every write. However, the consistency of the `live_mask` is up to the user. If\\n\",\n", + " \"not populated correctly, at read time, traces may be skipped.\\n\",\n", + " \"\\n\",\n", + " \"We will read the usual stats and as you can see they're all empty. Text header\\n\",\n", + " \"and binary header are only required if we are going to export this back to SEG-Y,\\n\",\n", + " \"and can be modified. We can edit these if necessary using the writer.\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 4,\n", + " \"metadata\": {\n", + " \"ExecuteTime\": {\n", + " \"end_time\": \"2025-04-16T14:50:09.974442Z\",\n", + " \"start_time\": \"2025-04-16T14:50:09.951257Z\"\n", + " },\n", + " \"pycharm\": {\n", + " \"name\": \"#%%\\n\"\n", + " }\n", + " },\n", + " \"outputs\": [\n", + " {\n", + " \"data\": {\n", + " \"text/plain\": [\n", + " \"(['C00 ',\\n\",\n", + " \" 'C01 ',\\n\",\n", + " \" 'C02 ',\\n\",\n", + " \" 'C03 ',\\n\",\n", + " \" 'C04 '],\\n\",\n", + " \" {},\\n\",\n", + " \" {'rms': 0, 'min': 0, 'mean': 0, 'max': 0, 'std': 0})\"\n", + " ]\n", + " },\n", + " \"execution_count\": 4,\n", + " \"metadata\": {},\n", + " \"output_type\": \"execute_result\"\n", + " }\n", + " ],\n", + " \"source\": [\n", + " \"writer = MDIOWriter(create_conf.path)\\n\",\n", + " \"\\n\",\n", + " \"# Truncate text header for display\\n\",\n", + " \"writer.text_header[:5], writer.binary_header, writer.stats\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"## Updating File and Checking with `MDIOReader`.\\n\",\n", + " \"\\n\",\n", + " \"We write traces here, the headers are still empty. If you need the headers\\n\",\n", + " \"populated, this is where they would be written to file as well.\\n\",\n", + " \"\\n\",\n", + " \"All the extra metadata we are writing is so that we can export back to SEG-Y\\n\",\n", + " \"in the future. If that's not a requirement most of the metadata can be\\n\",\n", + " \"omitted.\\n\",\n", + " \"\\n\",\n", + " \"If you already have an MDIO prior to this, all the metadata can be copied\\n\",\n", + " \"over from the previous version.\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 5,\n", + " \"metadata\": {\n", + " \"ExecuteTime\": {\n", + " \"end_time\": \"2025-04-16T14:50:12.498287Z\",\n", + " \"start_time\": \"2025-04-16T14:50:11.670230Z\"\n", + " },\n", + " \"pycharm\": {\n", + " \"name\": \"#%%\\n\"\n", + " }\n", + " },\n", + " \"outputs\": [\n", + " {\n", + " \"data\": {\n", + " \"text/plain\": [\n", + " \"({'data_sample_format': 1,\\n\",\n", + " \" 'sample_interval': 4,\\n\",\n", + " \" 'samples_per_trace': 750,\\n\",\n", + " \" 'segy_revision_major': 1,\\n\",\n", + " \" 'segy_revision_minor': 0},\\n\",\n", + " \" {'rms': 3, 'min': -4, 'mean': 12, 'max': 4, 'std': 5})\"\n", + " ]\n", + " },\n", + " \"execution_count\": 5,\n", + " \"metadata\": {},\n", + " \"output_type\": \"execute_result\"\n", + " }\n", + " ],\n", + " \"source\": [\n", + " \"sample_dim = writer.grid.select_dim(\\\"sample\\\")\\n\",\n", + " \"sample_interval = int(sample_dim.coords[1] - sample_dim.coords[0])\\n\",\n", + " \"num_samples = sample_dim.size\\n\",\n", + " \"writer.binary_header = {\\n\",\n", + " \" \\\"data_sample_format\\\": 1,\\n\",\n", + " \" \\\"sample_interval\\\": sample_interval,\\n\",\n", + " \" \\\"samples_per_trace\\\": num_samples,\\n\",\n", + " \" \\\"segy_revision_major\\\": 1,\\n\",\n", + " \" \\\"segy_revision_minor\\\": 0,\\n\",\n", + " \"}\\n\",\n", + " \"\\n\",\n", + " \"# Write some values to the file\\n\",\n", + " \"writer[:5] = 1\\n\",\n", + " \"writer[5:10] = 2\\n\",\n", + " \"writer[50:100] = 3\\n\",\n", + " \"writer[150:175] = -1\\n\",\n", + " \"\\n\",\n", + " \"# Write some made up stats\\n\",\n", + " \"writer.stats = {\\\"mean\\\": 12, \\\"std\\\": 5, \\\"rms\\\": 3, \\\"min\\\": -4, \\\"max\\\": 4}\\n\",\n", + " \"\\n\",\n", + " \"reader = MDIOReader(create_conf.path)\\n\",\n", + " \"reader.binary_header, reader.stats\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": \"Plot some of the data we populated:\"\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 6,\n", + " \"metadata\": {\n", + " \"ExecuteTime\": {\n", + " \"end_time\": \"2025-04-16T14:50:14.256953Z\",\n", + " \"start_time\": \"2025-04-16T14:50:14.036094Z\"\n", + " }\n", + " },\n", + " \"outputs\": [\n", + " {\n", + " \"data\": {\n", + " \"image/png\": \"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+wEoWAh2AOADOtK1Zs2aXq/VqFFDDhw4YL4uU6aMeTx69KjXMfrc2aePKSkpXvszMjLMSFnnmOwiIyPNCFrPDUDwINgBgA/oiNikpCSv1/773/9KxYoV3QMpNJwlJia692t/OO07Fx8fb57r4/Hjx2Xbtm3uY1atWmVqA7UvHgBkx6hYAPCBgQMHym233WaaYh988EHZvHmzvP3222ZTISEhMmDAAHnhhRdMPzwNeiNGjDAjXTt06OCu4WvVqpW7CTc9PV369etnRswyIhZATgh2AOADDRs2lAULFpg+b2PGjDHBTac30XnpHM8884ykpqaa/ndaM9ekSRMzvUlUVJT7mPfff9+EuebNm5vRsJ06dTJz3wFATgh2AOAjf/zjH82WG62109CnW250BOzcuXN9dIYAbEMfOwAAAEsQ7AAAACzh12CnE2lqP5SiRYuaSTi1w3D2UWRNmzY1zRWe2xNPPOF1jE4f0LZtWylcuLD5nCFDhpgpAQAAAIKJX/vYrVmzRvr27WvCnQax5557Tlq2bGkWy9bFsB06IsyzD4oGOEdmZqYJdTptwPr16+XIkSPy6KOPmoW3dTQaAABAsPBrsNPRX55mzZplatx0zqY777zTK8jlNhnn8uXLTRBcuXKlWYqnXr16MnbsWBk6dKiMHj1aIiIifH4dAAAABUGB6mOny984o8A86XD/kiVLys0332ymDjhz5ox7ny6SXbt2ba/1FhMSEsxEnzt37szx+7BINgAAsFGBme5EZ1LXyTp1tnYNcI6HH37YzNSuk3F+++23piZO++F98sknZr8uhJ3TItrOvtz69j3//PM+vR4AAICgDXba1+67776TdevWeb2uE3c6tGZO11/UiTr37dsnVapUuazvpbV+gwYNcj/XGrvy5ctfwdkDAAD4X4FoitVZ1RcvXixffPGFXH/99Rc81lkfce/eveZR+97ltIi2sy8nLJINAABs5Ndg53K5TKjTZXd0YWtdcuditm/fbh615s5ZJHvHjh2SkpLiPmbFihUmrNWsWdOHZw8AAFCwhPm7+VWXyvn000/NXHZOn7jY2FiJjo42za26v02bNlKiRAnTx04X1tYRs3Xq1DHH6vQoGuC6desm48ePN58xfPhw89laMwcAABAs/FpjN3XqVDMSVich1ho4Z/vggw/Mfp2qRKcx0fBWvXp1efrpp80C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\",\n", + " \"text/plain\": [\n", + " \"
\"\n", + " ]\n", + " },\n", + " \"metadata\": {},\n", + " \"output_type\": \"display_data\"\n", + " }\n", + " ],\n", + " \"source\": [\n", + " \"fig, ax = plt.subplots(1, 2, sharex=\\\"all\\\")\\n\",\n", + " \"ax[0].imshow(writer.live_mask[:].T, aspect=\\\"auto\\\")\\n\",\n", + " \"ax[1].imshow(reader[:, 150].T, aspect=\\\"auto\\\")\\n\",\n", + " \"\\n\",\n", + " \"ax[0].set_xlabel(\\\"inline\\\")\\n\",\n", + " \"ax[0].set_ylabel(\\\"crossline\\\")\\n\",\n", + " \"ax[1].set_xlabel(\\\"inline\\\")\\n\",\n", + " \"ax[1].set_ylabel(\\\"sample\\\")\\n\",\n", + " \"ax[0].set_title(\\\"Live Mask\\\")\\n\",\n", + " \"ax[1].set_title(\\\"Middle Crossline\\\")\\n\",\n", + " \"fig.tight_layout();\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"## Write to SEG-Y\\n\",\n", + " \"\\n\",\n", + " \"Because we populated all the fields necessary for SEG-Y output, we can call the\\n\",\n", + " \"MDIO to SEGY converter and get a file out.\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 7,\n", + " \"metadata\": {\n", + " \"ExecuteTime\": {\n", + " \"end_time\": \"2025-04-16T14:50:15.788812Z\",\n", + " \"start_time\": \"2025-04-16T14:50:15.009889Z\"\n", + " }\n", + " },\n", + " \"outputs\": [\n", + " {\n", + " \"name\": \"stderr\",\n", + " \"output_type\": \"stream\",\n", + " \"text\": [\n", + " \"Unwrapping MDIO Blocks: 100%|██████████| 7/7 [00:00<00:00, 10.55it/s]\\n\",\n", + " \"Merging lines: 100%|██████████| 1/1 [00:00<00:00, 17.26it/s]\"\n", + " ]\n", + " },\n", + " {\n", + " \"name\": \"stdout\",\n", + " \"output_type\": \"stream\",\n", + " \"text\": [\n", + " \"[(0, 0, 0, 0, 0, 4, 4000, 750, 750, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0)]\\n\",\n", + " \"[[1. 1. 1. ... 1. 1. 1.]\\n\",\n", + " \" [1. 1. 1. ... 1. 1. 1.]\\n\",\n", + " \" [1. 1. 1. ... 1. 1. 1.]\\n\",\n", + " \" ...\\n\",\n", + " \" [1. 1. 1. ... 1. 1. 1.]\\n\",\n", + " \" [1. 1. 1. ... 1. 1. 1.]\\n\",\n", + " \" [1. 1. 1. ... 1. 1. 1.]]\\n\"\n", + " ]\n", + " },\n", + " {\n", + " \"name\": \"stderr\",\n", + " \"output_type\": \"stream\",\n", + " \"text\": [\n", + " \"\\n\"\n", + " ]\n", + " }\n", + " ],\n", + " \"source\": [\n", + " \"from segy import SegyFile\\n\",\n", + " \"\\n\",\n", + " \"from mdio import mdio_to_segy\\n\",\n", + " \"\\n\",\n", + " \"mdio_to_segy(\\\"demo.mdio\\\", \\\"demo.segy\\\")\\n\",\n", + " \"segy = SegyFile(\\\"demo.segy\\\")\\n\",\n", + " \"print(segy.binary_header)\\n\",\n", + " \"print(segy.sample[:100])\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"markdown\",\n", + " \"metadata\": {},\n", + " \"source\": [\n", + " \"## Copying an Existing MDIO without Data and Headers\\n\",\n", + " \"\\n\",\n", + " \"We also provide a `create_empty_like` function which allows us to create an MDIO file\\n\",\n", + " \"with the same structure and basic metadata as an existing one.\\n\",\n", + " \"\\n\",\n", + " \"This will carry over:\\n\",\n", + " \"* All access patterns in source MDIO\\n\",\n", + " \"* Grid (shape, coordinates, dimensions, etc)\\n\",\n", + " \"* Text Header\\n\",\n", + " \"* Binary Header\\n\",\n", + " \"\\n\",\n", + " \"It will **NOT** carry over:\\n\",\n", + " \"* Trace data\\n\",\n", + " \"* Header data\\n\",\n", + " \"* Statistics\\n\",\n", + " \"* Live Mask\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": 8,\n", + " \"metadata\": {\n", + " \"ExecuteTime\": {\n", + " \"end_time\": \"2025-04-16T14:50:17.246513Z\",\n", + " \"start_time\": \"2025-04-16T14:50:17.111779Z\"\n", + " }\n", + " },\n", + " \"outputs\": [],\n", + " \"source\": [\n", + " \"from mdio import create_empty_like\\n\",\n", + " \"\\n\",\n", + " \"copy_path = \\\"copy_of_existing.mdio\\\"\\n\",\n", + " \"create_empty_like(create_conf.path, copy_path)\\n\",\n", + " \"\\n\",\n", + " \"copy_reader = MDIOReader(copy_path)\\n\",\n", + " \"assert copy_reader.shape == reader.shape\\n\",\n", + " \"assert copy_reader.binary_header == reader.binary_header\\n\",\n", + " \"assert copy_reader.stats != reader.stats\"\n", + " ]\n", + " },\n", + " {\n", + " \"cell_type\": \"code\",\n", + " \"execution_count\": null,\n", + " \"metadata\": {},\n", + " \"outputs\": [],\n", + " \"source\": []\n", + " }\n", + " ],\n", + " \"metadata\": {\n", + " \"kernelspec\": {\n", + " \"display_name\": \"Python 3 (ipykernel)\",\n", + " \"language\": \"python\",\n", + " \"name\": \"python3\"\n", + " },\n", + " \"language_info\": {\n", + " \"codemirror_mode\": {\n", + " \"name\": \"ipython\",\n", + " \"version\": 3\n", + " },\n", + " \"file_extension\": \".py\",\n", + " \"mimetype\": \"text/x-python\",\n", + " \"name\": \"python\",\n", + " \"nbconvert_exporter\": \"python\",\n", + " \"pygments_lexer\": \"ipython3\",\n", + " \"version\": \"3.12.3\"\n", + " },\n", + " \"widgets\": {\n", + " \"application/vnd.jupyter.widget-state+json\": {\n", + " \"state\": {\n", + " \"104c0d4e90244ebc959e51a58794dcf4\": {\n", + " \"model_module\": \"@jupyter-widgets/base\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"LayoutModel\",\n", + " \"state\": {\n", + " \"display\": \"inline-flex\",\n", + " \"flex_flow\": \"row wrap\",\n", + " \"width\": \"100%\"\n", + " }\n", + " },\n", + " \"1c0f5b458ee1401eaa8de63c65802073\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HTMLStyleModel\",\n", + " \"state\": {\n", + " \"description_width\": \"\",\n", + " \"font_size\": null,\n", + " \"text_color\": null\n", + " }\n", + " },\n", + " \"21b25dd6080d42368afc06770d5e1755\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HTMLModel\",\n", + " \"state\": {\n", + " \"layout\": \"IPY_MODEL_35fb49026dac479eba87217c2f6bcb9a\",\n", + " \"style\": \"IPY_MODEL_3ab3e27c83aa423d9ecdac94e576f0fe\",\n", + " \"value\": \"Ingesting SEG-Y in 6 chunks: 100%\"\n", + " }\n", + " },\n", + " \"2693aae410f04e7587f0400b5eef1079\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"ProgressStyleModel\",\n", + " \"state\": {\n", + " \"description_width\": \"\"\n", + " }\n", + " },\n", + " \"318aea09479a479981dcfa29bc856c67\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"ProgressStyleModel\",\n", + " \"state\": {\n", + " \"description_width\": \"\"\n", + " }\n", + " },\n", + " \"35fb49026dac479eba87217c2f6bcb9a\": {\n", + " \"model_module\": \"@jupyter-widgets/base\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"LayoutModel\",\n", + " \"state\": {}\n", + " },\n", + " \"3ab3e27c83aa423d9ecdac94e576f0fe\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HTMLStyleModel\",\n", + " \"state\": {\n", + " \"description_width\": \"\",\n", + " \"font_size\": null,\n", + " \"text_color\": null\n", + " }\n", + " },\n", + " \"420b4a9492c54eb48d7779f38a09fd20\": {\n", + " \"model_module\": \"@jupyter-widgets/base\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"LayoutModel\",\n", + " \"state\": {\n", + " \"flex\": \"2\"\n", + " }\n", + " },\n", + " \"42afe4fae9dd4bc4a341a231cf7a9c32\": {\n", + " \"model_module\": \"@jupyter-widgets/base\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"LayoutModel\",\n", + " \"state\": {}\n", + " },\n", + " \"4df685a95de542ffab6f265df89b8949\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HTMLStyleModel\",\n", + " \"state\": {\n", + " \"description_width\": \"\",\n", + " \"font_size\": null,\n", + " \"text_color\": null\n", + " }\n", + " },\n", + " \"58eaddb54c8840da83d1f6503d6ba64f\": {\n", + " \"model_module\": \"@jupyter-widgets/base\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"LayoutModel\",\n", + " \"state\": {}\n", + " },\n", + " \"5b3e72b71f304230bc36bb91f9c173be\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HTMLStyleModel\",\n", + " \"state\": {\n", + " \"description_width\": \"\",\n", + " \"font_size\": null,\n", + " \"text_color\": null\n", + " }\n", + " },\n", + " \"5c1fab0ccc7e42c69c2b663b67ca9e3c\": {\n", + " \"model_module\": \"@jupyter-widgets/base\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"LayoutModel\",\n", + " \"state\": {}\n", + " },\n", + " \"63a54817ae8b4c8d85b30d8c97e7ed0d\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HBoxModel\",\n", + " \"state\": {\n", + " \"children\": [\n", + " \"IPY_MODEL_e170d60a55a14c489d32b101293a9d33\",\n", + " \"IPY_MODEL_662ad93cf7b3470f8e197350441f09ca\",\n", + " \"IPY_MODEL_ac4abab2367e461e956e4e0edb27be44\"\n", + " ],\n", + " \"layout\": \"IPY_MODEL_c59d6fe969a04f4da332ae2a6fdb9c77\"\n", + " }\n", + " },\n", + " \"63f87a2410ba47d38ad9f55a81357a29\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HTMLModel\",\n", + " \"state\": {\n", + " \"layout\": \"IPY_MODEL_ca48140488574a28a7469552441560e4\",\n", + " \"style\": \"IPY_MODEL_ae2037efb9cc459e84bcc28ca7243437\",\n", + " \"value\": \" 2/2 [00:03<00:00, 3.01s/block]\"\n", + " }\n", + " },\n", + " \"64eb2b9c8a094a1ea5f1991e5f09f5d9\": {\n", + " \"model_module\": \"@jupyter-widgets/base\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"LayoutModel\",\n", + " \"state\": {}\n", + " },\n", + " \"662ad93cf7b3470f8e197350441f09ca\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"FloatProgressModel\",\n", + " \"state\": {\n", + " \"bar_style\": \"success\",\n", + " \"layout\": \"IPY_MODEL_420b4a9492c54eb48d7779f38a09fd20\",\n", + " \"max\": 1,\n", + " \"style\": \"IPY_MODEL_d16e93f72f3d4aeda2f5deee87e9754f\",\n", + " \"value\": 1\n", + " }\n", + " },\n", + " \"74283969ff5446c89bb83b00a70226cf\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HTMLModel\",\n", + " \"state\": {\n", + " \"layout\": \"IPY_MODEL_5c1fab0ccc7e42c69c2b663b67ca9e3c\",\n", + " \"style\": \"IPY_MODEL_1c0f5b458ee1401eaa8de63c65802073\",\n", + " \"value\": \" 6/6 [00:09<00:00, 2.48s/block]\"\n", + " }\n", + " },\n", + " \"75cf0c1ed25e47aab20b060f3bb44fb8\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HBoxModel\",\n", + " \"state\": {\n", + " \"children\": [\n", + " \"IPY_MODEL_21b25dd6080d42368afc06770d5e1755\",\n", + " \"IPY_MODEL_c33f32b62a204ef094f67b10f8adbdc1\",\n", + " \"IPY_MODEL_74283969ff5446c89bb83b00a70226cf\"\n", + " ],\n", + " \"layout\": \"IPY_MODEL_91df4ac76fd744539d4237d6099f34a5\"\n", + " }\n", + " },\n", + " \"7ff32d7deac14f21ab0f0939fe09e440\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"ProgressStyleModel\",\n", + " \"state\": {\n", + " \"description_width\": \"\"\n", + " }\n", + " },\n", + " \"91df4ac76fd744539d4237d6099f34a5\": {\n", + " \"model_module\": \"@jupyter-widgets/base\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"LayoutModel\",\n", + " \"state\": {\n", + " \"display\": \"inline-flex\",\n", + " \"flex_flow\": \"row wrap\",\n", + " \"width\": \"100%\"\n", + " }\n", + " },\n", + " \"981634b52a7a4ffdae6186061c0b6482\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HBoxModel\",\n", + " \"state\": {\n", + " \"children\": [\n", + " \"IPY_MODEL_f65266f861cf40ef84e9ec74a8e0b44c\",\n", + " \"IPY_MODEL_9aaf514a5035413d8cbbad58aa0221f4\",\n", + " \"IPY_MODEL_63f87a2410ba47d38ad9f55a81357a29\"\n", + " ],\n", + " \"layout\": \"IPY_MODEL_104c0d4e90244ebc959e51a58794dcf4\"\n", + " }\n", + " },\n", + " \"9aaf514a5035413d8cbbad58aa0221f4\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"FloatProgressModel\",\n", + " \"state\": {\n", + " \"bar_style\": \"success\",\n", + " \"layout\": \"IPY_MODEL_b25523a221fd4b5e9211d07ef39cccf5\",\n", + " \"max\": 2,\n", + " \"style\": \"IPY_MODEL_318aea09479a479981dcfa29bc856c67\",\n", + " \"value\": 2\n", + " }\n", + " },\n", + " \"9fe5348964cd4f7880bcd33204bbc7a2\": {\n", + " \"model_module\": \"@jupyter-widgets/base\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"LayoutModel\",\n", + " \"state\": {}\n", + " },\n", + " \"a03d238db31145b881a1be478f9eb72f\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HTMLStyleModel\",\n", + " \"state\": {\n", + " \"description_width\": \"\",\n", + " \"font_size\": null,\n", + " \"text_color\": null\n", + " }\n", + " },\n", + " \"a6aabcd2e57348a49bb59477f6a9fd90\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"FloatProgressModel\",\n", + " \"state\": {\n", + " \"bar_style\": \"success\",\n", + " \"layout\": \"IPY_MODEL_cfb02c9c7447491ca00bbb6acd99bb79\",\n", + " \"max\": 26,\n", + " \"style\": \"IPY_MODEL_7ff32d7deac14f21ab0f0939fe09e440\",\n", + " \"value\": 26\n", + " }\n", + " },\n", + " \"ac4abab2367e461e956e4e0edb27be44\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HTMLModel\",\n", + " \"state\": {\n", + " \"layout\": \"IPY_MODEL_58eaddb54c8840da83d1f6503d6ba64f\",\n", + " \"style\": \"IPY_MODEL_a03d238db31145b881a1be478f9eb72f\",\n", + " \"value\": \" 3/? [00:00<00:00, 8.29block/s]\"\n", + " }\n", + " },\n", + " \"ae2037efb9cc459e84bcc28ca7243437\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HTMLStyleModel\",\n", + " \"state\": {\n", + " \"description_width\": \"\",\n", + " \"font_size\": null,\n", + " \"text_color\": null\n", + " }\n", + " },\n", + " \"b25523a221fd4b5e9211d07ef39cccf5\": {\n", + " \"model_module\": \"@jupyter-widgets/base\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"LayoutModel\",\n", + " \"state\": {\n", + " \"flex\": \"2\"\n", + " }\n", + " },\n", + " \"b9810ee38bbe43f4bba100e53379be65\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HTMLModel\",\n", + " \"state\": {\n", + " \"layout\": \"IPY_MODEL_42afe4fae9dd4bc4a341a231cf7a9c32\",\n", + " \"style\": \"IPY_MODEL_fdcea609ee7349629604217b625371d3\",\n", + " \"value\": \" 26/26 [00:01<00:00, 18.92block/s]\"\n", + " }\n", + " },\n", + " \"c33f32b62a204ef094f67b10f8adbdc1\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"FloatProgressModel\",\n", + " \"state\": {\n", + " \"bar_style\": \"success\",\n", + " \"layout\": \"IPY_MODEL_d23d88490a1b4941b8ca228b7d4a39cb\",\n", + " \"max\": 6,\n", + " \"style\": \"IPY_MODEL_2693aae410f04e7587f0400b5eef1079\",\n", + " \"value\": 6\n", + " }\n", + " },\n", + " \"c59d6fe969a04f4da332ae2a6fdb9c77\": {\n", + " \"model_module\": \"@jupyter-widgets/base\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"LayoutModel\",\n", + " \"state\": {\n", + " \"display\": \"inline-flex\",\n", + " \"flex_flow\": \"row wrap\",\n", + " \"width\": \"100%\"\n", + " }\n", + " },\n", + " \"ca48140488574a28a7469552441560e4\": {\n", + " \"model_module\": \"@jupyter-widgets/base\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"LayoutModel\",\n", + " \"state\": {}\n", + " },\n", + " \"cfb02c9c7447491ca00bbb6acd99bb79\": {\n", + " \"model_module\": \"@jupyter-widgets/base\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"LayoutModel\",\n", + " \"state\": {\n", + " \"flex\": \"2\"\n", + " }\n", + " },\n", + " \"d16e93f72f3d4aeda2f5deee87e9754f\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"ProgressStyleModel\",\n", + " \"state\": {\n", + " \"description_width\": \"\"\n", + " }\n", + " },\n", + " \"d23d88490a1b4941b8ca228b7d4a39cb\": {\n", + " \"model_module\": \"@jupyter-widgets/base\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"LayoutModel\",\n", + " \"state\": {\n", + " \"flex\": \"2\"\n", + " }\n", + " },\n", + " \"d565a20d37e84ed0a1195e9a90154960\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HBoxModel\",\n", + " \"state\": {\n", + " \"children\": [\n", + " \"IPY_MODEL_db696e15587c4a54b82886b3eb5a0c96\",\n", + " \"IPY_MODEL_a6aabcd2e57348a49bb59477f6a9fd90\",\n", + " \"IPY_MODEL_b9810ee38bbe43f4bba100e53379be65\"\n", + " ],\n", + " \"layout\": \"IPY_MODEL_eab4b060672b4dd5a73ca7bb8f782cd2\"\n", + " }\n", + " },\n", + " \"db696e15587c4a54b82886b3eb5a0c96\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HTMLModel\",\n", + " \"state\": {\n", + " \"layout\": \"IPY_MODEL_64eb2b9c8a094a1ea5f1991e5f09f5d9\",\n", + " \"style\": \"IPY_MODEL_5b3e72b71f304230bc36bb91f9c173be\",\n", + " \"value\": \"Step 1 / 2 Writing Blocks: 100%\"\n", + " }\n", + " },\n", + " \"e170d60a55a14c489d32b101293a9d33\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HTMLModel\",\n", + " \"state\": {\n", + " \"layout\": \"IPY_MODEL_9fe5348964cd4f7880bcd33204bbc7a2\",\n", + " \"style\": \"IPY_MODEL_4df685a95de542ffab6f265df89b8949\",\n", + " \"value\": \"Step 2 / 2 Concat Blocks: \"\n", + " }\n", + " },\n", + " \"e66368cda8124001b16459a0634029e2\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HTMLStyleModel\",\n", + " \"state\": {\n", + " \"description_width\": \"\",\n", + " \"font_size\": null,\n", + " \"text_color\": null\n", + " }\n", + " },\n", + " \"eab4b060672b4dd5a73ca7bb8f782cd2\": {\n", + " \"model_module\": \"@jupyter-widgets/base\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"LayoutModel\",\n", + " \"state\": {\n", + " \"display\": \"inline-flex\",\n", + " \"flex_flow\": \"row wrap\",\n", + " \"width\": \"100%\"\n", + " }\n", + " },\n", + " \"f65266f861cf40ef84e9ec74a8e0b44c\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HTMLModel\",\n", + " \"state\": {\n", + " \"layout\": \"IPY_MODEL_fff4199774534d9f982f03738fbb08e7\",\n", + " \"style\": \"IPY_MODEL_e66368cda8124001b16459a0634029e2\",\n", + " \"value\": \"Scanning SEG-Y for geometry attributes: 100%\"\n", + " }\n", + " },\n", + " \"fdcea609ee7349629604217b625371d3\": {\n", + " \"model_module\": \"@jupyter-widgets/controls\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"HTMLStyleModel\",\n", + " \"state\": {\n", + " \"description_width\": \"\",\n", + " \"font_size\": null,\n", + " \"text_color\": null\n", + " }\n", + " },\n", + " \"fff4199774534d9f982f03738fbb08e7\": {\n", + " \"model_module\": \"@jupyter-widgets/base\",\n", + " \"model_module_version\": \"2.0.0\",\n", + " \"model_name\": \"LayoutModel\",\n", + " \"state\": {}\n", + " }\n", + " },\n", + " \"version_major\": 2,\n", + " \"version_minor\": 0\n", + " }\n", + " }\n", + " },\n", + " \"nbformat\": 4,\n", + " \"nbformat_minor\": 4\n", + "}\n" ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-16T14:50:17.246513Z", - "start_time": "2025-04-16T14:50:17.111779Z" - } - }, - "outputs": [], - "source": [ - "from mdio import create_empty_like\n", - "\n", - "copy_path = \"copy_of_existing.mdio\"\n", - "create_empty_like(create_conf.path, copy_path)\n", - "\n", - "copy_reader = MDIOReader(copy_path)\n", - "assert copy_reader.shape == reader.shape\n", - "assert copy_reader.binary_header == reader.binary_header\n", - "assert copy_reader.stats != reader.stats" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From 3c8ea4dac89b261ea1002c1874b09e130ba06080 Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Tue, 29 Apr 2025 14:43:41 -0500 Subject: [PATCH 05/56] update docs dependencies --- docs/requirements.txt | 1 + uv.lock | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index c80a7d9db..cb04269ca 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,3 +1,4 @@ +autodoc-pydantic==2.2.0 furo==2024.8.6 linkify-it-py==2.0.3 myst-nb==1.2.0 diff --git a/uv.lock b/uv.lock index 2e73c4199..92ce6cdc0 100644 --- a/uv.lock +++ b/uv.lock @@ -1922,7 +1922,7 @@ docs = [ { name = "furo", specifier = ">=2024.8.6" }, { name = "linkify-it-py", specifier = ">=2.0.3" }, { name = "myst-nb", specifier = ">=1.2.0" }, - { name = "sphinx", specifier = ">=8.1.3,<9" }, + { name = "sphinx", specifier = ">=8.2.3,<9" }, { name = "sphinx-autobuild", specifier = ">=2024.10.3" }, { name = "sphinx-click", specifier = ">=6.0.0,<7" }, { name = "sphinx-copybutton", specifier = ">=0.5.2,<0.6" }, From 53ecaa9346b2be03e08ec4b986b28865a429a31d Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Tue, 29 Apr 2025 14:43:58 -0500 Subject: [PATCH 06/56] add new docs --- docs/api_reference.md | 1 + docs/conf.py | 10 ++ docs/data_models/chunk_grids.md | 154 +++++++++++++++++++ docs/data_models/compressors.md | 100 ++++++++++++ docs/data_models/data_types.md | 259 ++++++++++++++++++++++++++++++++ docs/data_models/dimensions.md | 33 ++++ docs/data_models/index.md | 10 ++ docs/data_models/version_0.md | 55 +++++++ docs/data_models/version_1.md | 131 ++++++++++++++++ docs/index.md | 11 ++ 10 files changed, 764 insertions(+) create mode 100644 docs/data_models/chunk_grids.md create mode 100644 docs/data_models/compressors.md create mode 100644 docs/data_models/data_types.md create mode 100644 docs/data_models/dimensions.md create mode 100644 docs/data_models/index.md create mode 100644 docs/data_models/version_0.md create mode 100644 docs/data_models/version_1.md diff --git a/docs/api_reference.md b/docs/api_reference.md index 0ceba4f56..f2ce3639d 100644 --- a/docs/api_reference.md +++ b/docs/api_reference.md @@ -71,4 +71,5 @@ and ```{eval-rst} .. automodule:: mdio.core.serialization :members: + :exclude-members: create_rechunk_plan, write_rechunked_values ``` diff --git a/docs/conf.py b/docs/conf.py index 899903246..aeb59636a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -17,6 +17,7 @@ "sphinx.ext.napoleon", "sphinx.ext.intersphinx", "sphinx.ext.autosummary", + "sphinxcontrib.autodoc_pydantic", "sphinx.ext.autosectionlabel", "sphinx_click", "sphinx_copybutton", @@ -38,6 +39,7 @@ intersphinx_mapping = { "python": ("https://docs.python.org/3", None), "numpy": ("https://numpy.org/doc/stable/", None), + "pydantic": ("https://docs.pydantic.dev/latest/", None), "zarr": ("https://zarr.readthedocs.io/en/stable/", None), } @@ -50,6 +52,14 @@ autoclass_content = "class" autosectionlabel_prefix_document = True +autodoc_pydantic_field_list_validators = False +autodoc_pydantic_field_swap_name_and_alias = True +autodoc_pydantic_field_show_alias = False +autodoc_pydantic_model_show_config_summary = False +autodoc_pydantic_model_show_validator_summary = False +autodoc_pydantic_model_show_validator_members = False +autodoc_pydantic_model_show_field_summary = False + html_theme = "furo" myst_number_code_blocks = ["python"] diff --git a/docs/data_models/chunk_grids.md b/docs/data_models/chunk_grids.md new file mode 100644 index 000000000..5f178a04b --- /dev/null +++ b/docs/data_models/chunk_grids.md @@ -0,0 +1,154 @@ +```{eval-rst} +:tocdepth: 3 +``` + +```{currentModule} mdio.schemas.chunk_grid + +``` + +# Chunk Grid Models + +```{article-info} +:author: Altay Sansal +:date: "{sub-ref}`today`" +:read-time: "{sub-ref}`wordcount-minutes` min read" +:class-container: sd-p-0 sd-outline-muted sd-rounded-3 sd-font-weight-light +``` + +The variables in MDIO data model can represent different types of chunk grids. +These grids are essential for managing multi-dimensional data arrays efficiently. +In this breakdown, we will explore four distinct data models within the MDIO schema, +each serving a specific purpose in data handling and organization. + +MDIO implements data models following the guidelines of the Zarr v3 spec and ZEPs: + +- [Zarr core specification (version 3)](https://zarr-specs.readthedocs.io/en/latest/v3/core/v3.0.html) +- [ZEP 1 — Zarr specification version 3](https://zarr.dev/zeps/accepted/ZEP0001.html) +- [ZEP 3 — Variable chunking](https://zarr.dev/zeps/draft/ZEP0003.html) + +## Regular Grid + +The regular grid models are designed to represent a rectangular and regularly +paced chunk grid. + +```{eval-rst} +.. autosummary:: + RegularChunkGrid + RegularChunkShape +``` + +For 1D array with `size = 31`{l=python}, we can divide it into 5 equally sized +chunks. Note that the last chunk will be truncated to match the size of the array. + +`{ "name": "regular", "configuration": { "chunkShape": [7] } }`{l=json} + +Using the above schema resulting array chunks will look like this: + +```bash + ←─ 7 ─→ ←─ 7 ─→ ←─ 7 ─→ ←─ 7 ─→ ↔ 3 +┌───────┬───────┬───────┬───────┬───┐ +└───────┴───────┴───────┴───────┴───┘ +``` + +For 2D array with shape `rows, cols = (7, 17)`{l=python}, we can divide it into 9 +equally sized chunks. + +`{ "name": "regular", "configuration": { "chunkShape": [3, 7] } }`{l=json} + +Using the above schema, the resulting 2D array chunks will look like below. +Note that the rows and columns are conceptual and visually not to scale. + +```bash + ←─ 7 ─→ ←─ 7 ─→ ↔ 3 +┌───────┬───────┬───┐ +│ ╎ ╎ │ ↑ +│ ╎ ╎ │ 3 +│ ╎ ╎ │ ↓ +├╶╶╶╶╶╶╶┼╶╶╶╶╶╶╶┼╶╶╶┤ +│ ╎ ╎ │ ↑ +│ ╎ ╎ │ 3 +│ ╎ ╎ │ ↓ +├╶╶╶╶╶╶╶┼╶╶╶╶╶╶╶┼╶╶╶┤ +│ ╎ ╎ │ ↕ 1 +└───────┴───────┴───┘ +``` + +## Rectilinear Grid + +The [RectilinearChunkGrid](RectilinearChunkGrid) model extends +the concept of chunk grids to accommodate rectangular and irregularly spaced chunks. +This model is useful in data structures where non-uniform chunk sizes are necessary. +[RectilinearChunkShape](RectilinearChunkShape) specifies the chunk sizes for each +dimension as a list allowing for irregular intervals. + +```{eval-rst} +.. autosummary:: + RectilinearChunkGrid + RectilinearChunkShape +``` + +:::{note} +It's important to ensure that the sum of the irregular spacings specified +in the `chunkShape` matches the size of the respective array dimension. +::: + +For 1D array with `size = 39`{l=python}, we can divide it into 5 irregular sized +chunks. + +`{ "name": "rectilinear", "configuration": { "chunkShape": [[10, 7, 5, 7, 10]] } }`{l=json} + +Using the above schema resulting array chunks will look like this: + +```bash + ←── 10 ──→ ←─ 7 ─→ ← 5 → ←─ 7 ─→ ←── 10 ──→ +┌──────────┬───────┬─────┬───────┬──────────┐ +└──────────┴───────┴─────┴───────┴──────────┘ +``` + +For 2D array with shape `rows, cols = (7, 25)`{l=python}, we can divide it into 12 +rectilinear (rectangular bur irregular) chunks. Note that the rows and columns are +conceptual and visually not to scale. + +`{ "name": "rectilinear", "configuration": { "chunkShape": [[3, 1, 3], [10, 5, 7, 3]] } }`{l=json} + +```bash + ←── 10 ──→ ← 5 → ←─ 7 ─→ ↔ 3 +┌──────────┬─────┬───────┬───┐ +│ ╎ ╎ ╎ │ ↑ +│ ╎ ╎ ╎ │ 3 +│ ╎ ╎ ╎ │ ↓ +├╶╶╶╶╶╶╶╶╶╶┼╶╶╶╶╶┼╶╶╶╶╶╶╶┼╶╶╶┤ +│ ╎ ╎ ╎ │ ↕ 1 +├╶╶╶╶╶╶╶╶╶╶┼╶╶╶╶╶┼╶╶╶╶╶╶╶┼╶╶╶┤ +│ ╎ ╎ ╎ │ ↑ +│ ╎ ╎ ╎ │ 3 +│ ╎ ╎ ╎ │ ↓ +└──────────┴─────┴───────┴───┘ +``` + +## Model Reference + +:::{dropdown} RegularChunkGrid +:animate: fade-in-slide-down + +```{eval-rst} +.. autopydantic_model:: RegularChunkGrid + +---------- + +.. autopydantic_model:: RegularChunkShape +``` + +::: +:::{dropdown} RectilinearChunkGrid +:animate: fade-in-slide-down + +```{eval-rst} +.. autopydantic_model:: RectilinearChunkGrid + +---------- + +.. autopydantic_model:: RectilinearChunkShape +``` + +::: diff --git a/docs/data_models/compressors.md b/docs/data_models/compressors.md new file mode 100644 index 000000000..17a1afd87 --- /dev/null +++ b/docs/data_models/compressors.md @@ -0,0 +1,100 @@ +```{eval-rst} +:tocdepth: 3 +``` + +```{currentModule} mdio.schemas.compressors + +``` + +# Compressors + +```{article-info} +:author: Altay Sansal +:date: "{sub-ref}`today`" +:read-time: "{sub-ref}`wordcount-minutes` min read" +:class-container: sd-p-0 sd-outline-muted sd-rounded-3 sd-font-weight-light +``` + +## Dataset Compression + +MDIO relies on [numcodecs] for data compression. We provide good defaults based +on opinionated and limited heuristics for each compressor for various energy datasets. +However, using these data models, the compression can be customized. + +[Numcodecs] is a project that a convenient interface to different compression +libraries. We selected the [Blosc] and [ZFP] compressors for lossless and lossy +compression of energy data. + +## Blosc + +A high-performance compressor optimized for binary data, combining fast compression +with a byte-shuffle filter for enhanced efficiency, particularly effective with +numerical arrays in multi-threaded environments. + +For more details about compression modes, see [Blosc Documentation]. + +```{eval-rst} +.. autosummary:: + Blosc +``` + +## ZFP + +ZFP is a compression algorithm tailored for floating-point and integer arrays, offering +lossy and lossless compression with customizable precision, well-suited for large +scientific datasets with a focus on balancing data fidelity and compression ratio. + +For more details about compression modes, see [ZFP Documentation]. + +```{eval-rst} +.. autosummary:: + ZFP +``` + +[numcodecs]: https://github.com/zarr-developers/numcodecs +[blosc]: https://github.com/Blosc/c-blosc +[blosc documentation]: https://www.blosc.org/python-blosc/python-blosc.html +[zfp]: https://github.com/LLNL/zfp +[zfp documentation]: https://computing.llnl.gov/projects/zfp + +## Model Reference + +::: +:::{dropdown} Blosc +:animate: fade-in-slide-down + +```{eval-rst} +.. autopydantic_model:: Blosc + +---------- + +.. autoclass:: BloscAlgorithm() + :members: + :undoc-members: + :member-order: bysource + +---------- + +.. autoclass:: BloscShuffle() + :members: + :undoc-members: + :member-order: bysource +``` + +::: + +:::{dropdown} ZFP +:animate: fade-in-slide-down + +```{eval-rst} +.. autopydantic_model:: ZFP + +---------- + +.. autoclass:: ZFPMode() + :members: + :undoc-members: + :member-order: bysource +``` + +::: diff --git a/docs/data_models/data_types.md b/docs/data_models/data_types.md new file mode 100644 index 000000000..b58ff5357 --- /dev/null +++ b/docs/data_models/data_types.md @@ -0,0 +1,259 @@ +```{eval-rst} +:tocdepth: 3 +``` + +```{currentModule} mdio.schemas.dtype + +``` + +# Data Types + +```{article-info} +:author: Altay Sansal +:date: "{sub-ref}`today`" +:read-time: "{sub-ref}`wordcount-minutes` min read" +:class-container: sd-p-0 sd-outline-muted sd-rounded-3 sd-font-weight-light +``` + +## Scalar Type + +Scalar types are used to represent numbers and boolean values in MDIO arrays. + +```{eval-rst} +.. autosummary:: + :nosignatures: + + ScalarType +``` + +These numbers can be integers (whole numbers without a decimal +point, like 1, -15, 204), floating-point numbers (numbers with a fractional part, +like 3.14, -0.001, 2.71828) in various 16-64 bit formats like `float32` etc. + +It is important to choose the right type for the content of the data for type safety, +memory efficiency, performance, and accuracy of the numbers represented. Most scientific +datasets are `float16`, `float32`, or `float64` values. However, there are many good +use cases for integer and complex values as well. + +The [`ScalarType`](#ScalarType)s MDIO supports can be viewed below with the tabs. + +:::::{tab-set} + +::::{tab-item} Boolean +:::{table} +:widths: auto +:align: center + +| Data Type | Options | Example Value | +| --------- | --------------- | ------------- | +| `bool` | `False`, `True` | `True` | + +::: +:::: + +::::{tab-item} Integers +:::{table} +:widths: auto +:align: center + +| Data Type | Range | Example Value | +| --------- | ----------------------------------------------------------- | ------------- | +| `int8` | `-128` to `127` | `45` | +| `int16` | `-32,768` to `32,767` | `1,234` | +| `int32` | `-2,147,483,648` to `2,147,483,647` | `2,024` | +| `int64` | `-9,223,372,036,854,775,808` to `9,223,372,036,854,775,807` | `987,654,321` | + +::: +:::: + +::::{tab-item} Unsigned Integers +:::{table} +:widths: auto +:align: center + +| Data Type | Range | Example Value | +| --------- | ----------------------------------- | --------------- | +| `uint8` | `0` to `255` | `200` | +| `uint16` | `0` to `65,535` | `50,000` | +| `uint32` | `0` to `4,294,967,295` | `3,000,000` | +| `uint64` | `0` to `18,446,744,073,709,551,615` | `5,000,000,000` | + +::: +:::: + +::::{tab-item} Floating Point +:::{table} +:widths: auto +:align: center + +| Data Type | Range | Example Value | +| --------- | ------------------------------------------------------- | -------------------- | +| `float16` | `-65,504` to `65,504` | `10.10` | +| `float32` | `-3.4028235e+38` to `3.4028235e+38` | `0.1234567` | +| `float64` | `-1.7976931348623157e+308` to `1.7976931348623157e+308` | `3.1415926535897932` | + +::: + +**Precision** + +- `float16`: 2 decimal places +- `float32`: 7 decimal places +- `float32`: 16 decimal places + +:::: + +::::{tab-item} Complex Numbers +:::{table} +:widths: auto +:align: center + +| Data Type | Range | Example Value | +| ------------ | ------------------------------------------------------- | ------------------ | +| `complex64` | `-3.4028235e+38` to `3.4028235e+38` | `3.14+2.71j` | +| `complex128` | `-1.7976931348623157e+308` to `1.7976931348623157e+308` | `2.71828+3.14159j` | + +::: +Ranges are for both real and imaginary parts. +:::: + +::::: + +## Structured Type + +Structured data type organizes and stores data in a fixed arrangement, allowing memory +efficient access and manipulation. + +```{eval-rst} +.. autosummary:: + :nosignatures: + + StructuredType + StructuredField +``` + +Structured data types are an essential component in handling complex data structures, +particularly in specialized domains like seismic data processing for subsurface +imaging applications. These data types allow for the organization of heterogeneous +data into a single, structured format. + +They are designed to be memory-efficient, which is vital for handling large seismic +datasets. Structured data types are adaptable, allowing for the addition or +modification of fields. + +A [`StructuredType`](#StructuredType) consists of [`StructuredField`](#StructuredField)s. +Fields can be different [numeric types](#numeric-types), and each represent a specific +attribute of the seismic data, like coordinate, line numbers, and time stamps. + +Each [`StructuredField`](#StructuredField) must specify a `name` and a data format +(`format`). + +All the structured fields will be packed and there will be no gaps between them. + +## Examples + +The table below illustrate [ScalarType](#ScalarType) ranges and shows an example each +type. + +Variable `foo` with type `float32`. + +```json +{ + "name": "foo", + "dataType": "float32", + "dimensions": ["x", "y"] +} +``` + +Variable `bar` with type `uint8`. + +```json +{ + "name": "bar", + "dataType": "uint8", + "dimensions": ["x", "y"] +} +``` + +Below are a couple examples of [StructuredType](#StructuredType) with varying lengths. + +We can specify a variable named `headers` that holds a 32-byte struct with +four `int32` values. + +```json +{ + "name": "headers", + "dataType": { + "fields": [ + { "name": "cdp-x", "format": "int32" }, + { "name": "cdp-y", "format": "int32" }, + { "name": "inline", "format": "int32" }, + { "name": "crossline", "format": "int32" } + ] + }, + "dimensions": ["inline", "crossline"] +} +``` + +This will yield an in-memory or on-disk struct that looks like this (for each element): + +```bash + ←─ 4 ─→ ←─ 4 ─→ ←─ 4 ─→ ←─ 4 ─→ = 16-bytes +┌───────┬───────┬───────┬───────┐ +│ int32 ╎ int32 ╎ int32 ╎ int32 │ ⋯ (next sample) +└───────┴───────┴───────┴───────┘ + └→ cdp-x └→ cdp-y └→ inline └→crossline +``` + +The below example shows mixing different data types. + +```json +{ + "name": "headers", + "dataType": { + "fields": [ + { "name": "cdp", "format": "uint32" }, + { "name": "offset", "format": "int16" }, + { "name": "cdp-x", "format": "float64" }, + { "name": "cdp-y", "format": "float64" } + ] + }, + "dimensions": ["inline", "crossline"] +} +``` + +This will yield an in-memory or on-disk struct that looks like this (for each element): + +```bash + ←── 4 ──→ ← 2 → ←─── 8 ───→ ←─── 8 ───→ = 24-bytes +┌─────────┬─────┬───────────┬───────────┐ +│ int32 ╎int16╎ float64 ╎ float64 │ ⋯ (next sample) +└─────────┴─────┴───────────┴───────────┘ + └→ cdp └→ offset └→ cdp-x └→ cdp-y +``` + +## Model Reference + +:::{dropdown} Scalar Types +:animate: fade-in-slide-down + +```{eval-rst} +.. autoclass:: ScalarType() + :members: + :undoc-members: + :member-order: bysource +``` + +::: + +:::{dropdown} Structured Type +:animate: fade-in-slide-down + +```{eval-rst} +.. autopydantic_model:: StructuredType + +---------- + +.. autopydantic_model:: StructuredField +``` + +::: diff --git a/docs/data_models/dimensions.md b/docs/data_models/dimensions.md new file mode 100644 index 000000000..c04b9206b --- /dev/null +++ b/docs/data_models/dimensions.md @@ -0,0 +1,33 @@ +```{eval-rst} +:tocdepth: 3 +``` + +```{currentModule} mdio.schemas.dimension + +``` + +# Dimensions + +```{article-info} +:author: Altay Sansal +:date: "{sub-ref}`today`" +:read-time: "{sub-ref}`wordcount-minutes` min read" +:class-container: sd-p-0 sd-outline-muted sd-rounded-3 sd-font-weight-light +``` + +## Intro + +```{eval-rst} +.. autosummary:: NamedDimension +``` + +## Reference + +:::{dropdown} Dimension +:open: + +```{eval-rst} +.. autopydantic_model:: NamedDimension +``` + +::: diff --git a/docs/data_models/index.md b/docs/data_models/index.md new file mode 100644 index 000000000..191f937b7 --- /dev/null +++ b/docs/data_models/index.md @@ -0,0 +1,10 @@ +# Dataset Models + +This section contains the data models for the MDIO format. + +```{toctree} +:maxdepth: 2 + +version_0 +version_1 +``` diff --git a/docs/data_models/version_0.md b/docs/data_models/version_0.md new file mode 100644 index 000000000..bac21ff6b --- /dev/null +++ b/docs/data_models/version_0.md @@ -0,0 +1,55 @@ +```{eval-rst} +:tocdepth: 3 +``` + +```{currentModule} mdio.schemas.v0.dataset + +``` + +# MDIO v0 + +```{article-info} +:author: Altay Sansal +:date: "{sub-ref}`today`" +:read-time: "{sub-ref}`wordcount-minutes` min read" +:class-container: sd-p-0 sd-outline-muted sd-rounded-3 sd-font-weight-light +``` + +## Intro + +```{eval-rst} +.. autosummary:: + + DatasetModelV0 + VariableModelV0 + DatasetMetadataModelV0 + DimensionModelV0 +``` + +## Reference + +:::{dropdown} Dataset +:open: + +```{eval-rst} +.. autopydantic_model:: DatasetModelV0 + :inherited-members: BaseModel + +.. autopydantic_model:: DatasetMetadataModelV0 + :inherited-members: BaseModel + +.. autopydantic_model:: DimensionModelV0 + :inherited-members: BaseModel +``` + +::: + +:::{dropdown} Variable +:open: + +```{eval-rst} +.. autopydantic_model:: VariableModelV0 + :inherited-members: BaseModel +``` + +::: diff --git a/docs/data_models/version_1.md b/docs/data_models/version_1.md new file mode 100644 index 000000000..caf0ed5c7 --- /dev/null +++ b/docs/data_models/version_1.md @@ -0,0 +1,131 @@ +```{eval-rst} +:tocdepth: 3 +``` + +```{currentModule} mdio.schemas.v1.dataset + +``` + +# MDIO v1 + +```{article-info} +:author: Altay Sansal +:date: "{sub-ref}`today`" +:read-time: "{sub-ref}`wordcount-minutes` min read" +:class-container: sd-p-0 sd-outline-muted sd-rounded-3 sd-font-weight-light +``` + +## Intro + +```{eval-rst} +.. autosummary:: Dataset +.. autosummary:: DatasetMetadata +``` + +## Reference + +:::{dropdown} Dataset +:open: + +```{eval-rst} +.. autopydantic_model:: Dataset + :inherited-members: BaseModel + +.. autopydantic_model:: DatasetMetadata + :inherited-members: BaseModel +``` + +::: +:::{dropdown} Variable + +```{eval-rst} +.. autopydantic_model:: mdio.schemas.v1.variable.Variable + :inherited-members: BaseModel + +.. autopydantic_model:: mdio.schemas.v1.variable.Coordinate + :inherited-members: BaseModel + +.. automodule:: mdio.schemas.metadata + :members: UserAttributes + +.. autopydantic_model:: mdio.schemas.v1.variable.VariableMetadata + :inherited-members: BaseModel +``` + +::: + +:::{dropdown} Units + +```{eval-rst} +.. autopydantic_model:: mdio.schemas.v1.units.AllUnits +``` + +```{eval-rst} +.. automodule:: mdio.schemas.v1.units + :members: LengthUnitModel, + TimeUnitModel, + AngleUnitModel, + DensityUnitModel, + SpeedUnitModel, + FrequencyUnitModel, + VoltageUnitModel +``` + +::: + +:::{dropdown} Stats + +```{eval-rst} +.. autopydantic_model:: mdio.schemas.v1.stats.StatisticsMetadata + +.. autopydantic_model:: mdio.schemas.v1.stats.SummaryStatistics + +.. autopydantic_model:: mdio.schemas.v1.stats.EdgeDefinedHistogram + :inherited-members: BaseModel + +.. autopydantic_model:: mdio.schemas.v1.stats.CenteredBinHistogram + :inherited-members: BaseModel +``` + +::: + +:::{dropdown} Enums + +```{eval-rst} +.. autoclass:: mdio.schemas.v1.units.AngleUnitEnum() + :members: + :undoc-members: + :member-order: bysource + +.. autoclass:: mdio.schemas.v1.units.DensityUnitEnum() + :members: + :undoc-members: + :member-order: bysource + +.. autoclass:: mdio.schemas.v1.units.FrequencyUnitEnum() + :members: + :undoc-members: + :member-order: bysource + +.. autoclass:: mdio.schemas.v1.units.LengthUnitEnum() + :members: + :undoc-members: + :member-order: bysource + +.. autoclass:: mdio.schemas.v1.units.SpeedUnitEnum() + :members: + :undoc-members: + :member-order: bysource + +.. autoclass:: mdio.schemas.v1.units.TimeUnitEnum() + :members: + :undoc-members: + :member-order: bysource + +.. autoclass:: mdio.schemas.v1.units.VoltageUnitEnum() + :members: + :undoc-members: + :member-order: bysource +``` + +::: diff --git a/docs/index.md b/docs/index.md index 9b6741077..ba4db72de 100644 --- a/docs/index.md +++ b/docs/index.md @@ -26,6 +26,17 @@ tutorials/index api_reference ``` +```{toctree} +:hidden: +:caption: Core Concepts and Structures + +data_models/index +data_models/dimensions +data_models/chunk_grids +data_models/data_types +data_models/compressors +``` + ```{toctree} :hidden: :caption: Community and Contribution From da09c4b8f7c216b098ee4925b1eb86fc5b251806 Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Tue, 29 Apr 2025 14:55:26 -0500 Subject: [PATCH 07/56] remove incorrect exclude --- docs/api_reference.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/api_reference.md b/docs/api_reference.md index f2ce3639d..0ceba4f56 100644 --- a/docs/api_reference.md +++ b/docs/api_reference.md @@ -71,5 +71,4 @@ and ```{eval-rst} .. automodule:: mdio.core.serialization :members: - :exclude-members: create_rechunk_plan, write_rechunked_values ``` From 0d59c9554f2b124fee50105fc20cbb31092d60ce Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Tue, 29 Apr 2025 15:33:52 -0500 Subject: [PATCH 08/56] remove duplicate doc directive --- docs/tutorials/creation.ipynb | 1225 ++++++++++++++++++++++----------- 1 file changed, 838 insertions(+), 387 deletions(-) diff --git a/docs/tutorials/creation.ipynb b/docs/tutorials/creation.ipynb index d154c63f8..25a67c4f8 100644 --- a/docs/tutorials/creation.ipynb +++ b/docs/tutorials/creation.ipynb @@ -7,396 +7,847 @@ "{\n", " \"cells\": [\n", " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {\n", - " \"pycharm\": {\n", - " \"name\": \"#%% md\\n\"\n", - " }\n", - " },\n", - " \"source\": [\n", - " \"# Create an Empty MDIO\\n\",\n", - " \"\\n\",\n", - " \"```{article-info}\\n\",\n", - " \":author: Altay Sansal\\n\",\n", - " \":date: \\\"{sub-ref}`today`\\\"\\n\",\n", - " \":read-time: \\\"{sub-ref}`wordcount-minutes` min read\\\"\\n\",\n", - " \":class-container: sd-p-0 sd-outline-muted sd-rounded-3 sd-font-weight-light\\n\",\n", - " \"```\\n\",\n", - " \"\\n\",\n", - " \"Here we will create an empty MDIO file and populate its fields.\\n\",\n", - " \"\\n\",\n", - " \"```{warning}\\n\",\n", - " \"For plotting, the notebook requires [Matplotlib](https://matplotlib.org/) as a dependency. Please install it before executing using\\n\",\n", - " \"`pip install matplotlib` or `conda install matplotlib`.\\n\",\n", - " \"```\\n\",\n", - " \"\\n\",\n", - " \"We first need to import the configuration classes and create function to be able to create the empty MDIO.\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 2,\n", - " \"metadata\": {\n", - " \"ExecuteTime\": {\n", - " \"end_time\": \"2025-04-16T14:50:04.371422Z\",\n", - " \"start_time\": \"2025-04-16T14:50:04.368107Z\"\n", - " },\n", - " \"pycharm\": {\n", - " \"name\": \"#%%\\n\"\n", - " }\n", - " },\n", - " \"outputs\": [],\n", - " \"source\": [\n", - " \"import matplotlib.pyplot as plt\\n\",\n", - " \"\\n\",\n", - " \"from mdio import Dimension\\n\",\n", - " \"from mdio import Grid\\n\",\n", - " \"from mdio import MDIOCreateConfig\\n\",\n", - " \"from mdio import MDIOReader\\n\",\n", - " \"from mdio import MDIOVariableConfig\\n\",\n", - " \"from mdio import MDIOWriter\\n\",\n", - " \"from mdio import create_empty\\n\",\n", - " \"from mdio.converters.segy import get_compressor\\n\",\n", - " \"from mdio.segy.compat import mdio_segy_spec\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {\n", - " \"pycharm\": {\n", - " \"name\": \"#%% md\\n\"\n", - " }\n", - " },\n", - " \"source\": [\n", - " \"## Setting Up Grid Dimensions and Variable(s)\\n\",\n", - " \"\\n\",\n", - " \"Let's try to create an MDIO file in 3D with known `inline`, `crossline`, and `sample`\\n\",\n", - " \"dimensions. This is exactly like a 3D Post-Stack dataset.\\n\",\n", - " \"\\n\",\n", - " \"We will use the standard `chunked_012` access pattern. All variable names must start\\n\",\n", - " \"with `chunked_*` for `MDIOReader` to be able to open them with any access pattern.\\n\",\n", - " \"\\n\",\n", - " \"We will also use an MDIO private utility function to get the compressor easily. The\\n\",\n", - " \"compressor is fully customizable, but this function gives us ones available in SEG-Y\\n\",\n", - " \"ingestion.\\n\",\n", - " \"\\n\",\n", - " \"If we want headers, we can also provide `header_dtype` which is a Numpy `dtype`. Again,\\n\",\n", - " \"we will be using the standard one MDIO uses for ingesting SEG-Ys. (Similar to SEG-Y Rev1).\\n\",\n", - " \"\\n\",\n", - " \"At the end we create empty MDIO on local disk or cloud, based on the path string.\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 3,\n", - " \"metadata\": {\n", - " \"ExecuteTime\": {\n", - " \"end_time\": \"2025-04-16T14:50:06.121450Z\",\n", - " \"start_time\": \"2025-04-16T14:50:06.002634Z\"\n", - " },\n", - " \"pycharm\": {\n", - " \"name\": \"#%%\\n\"\n", - " }\n", - " },\n", - " \"outputs\": [],\n", - " \"source\": [\n", - " \"grid = Grid(\\n\",\n", - " \" dims=[\\n\",\n", - " \" Dimension(name=\\\"inline\\\", coords=range(100, 300, 1)), # 100-300 with step 1\\n\",\n", - " \" Dimension(name=\\\"crossline\\\", coords=range(1000, 1600, 2)), # 1000-1600 with step 2\\n\",\n", - " \" Dimension(name=\\\"sample\\\", coords=range(0, 3000, 4)), # 0-3 seconds 4ms sample rate\\n\",\n", - " \" ]\\n\",\n", - " \")\\n\",\n", - " \"\\n\",\n", - " \"compressor = get_compressor(lossless=True)\\n\",\n", - " \"header_dtype = mdio_segy_spec().trace.header.dtype\\n\",\n", - " \"variable = MDIOVariableConfig(\\n\",\n", - " \" name=\\\"chunked_012\\\",\\n\",\n", - " \" dtype=\\\"float32\\\",\\n\",\n", - " \" chunks=(128, 128, 128),\\n\",\n", - " \" compressors=compressor,\\n\",\n", - " \" header_dtype=header_dtype,\\n\",\n", - " \")\\n\",\n", - " \"\\n\",\n", - " \"create_conf = MDIOCreateConfig(path=\\\"demo.mdio\\\", grid=grid, variables=[variable])\\n\",\n", - " \"create_empty(config=create_conf);\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", " \"metadata\": {},\n", + " \"cell_type\": \"raw\",\n", " \"source\": [\n", - " \"## Populating the MDIO\\n\",\n", - " \"\\n\",\n", - " \"Once empty MDIO is created, you can populate it with sample data, header data,\\n\",\n", - " \"metadata, and statistics. The `live_mask` is automatically flipped to 1 after\\n\",\n", - " \"every write. However, the consistency of the `live_mask` is up to the user. If\\n\",\n", - " \"not populated correctly, at read time, traces may be skipped.\\n\",\n", - " \"\\n\",\n", - " \"We will read the usual stats and as you can see they're all empty. Text header\\n\",\n", - " \"and binary header are only required if we are going to export this back to SEG-Y,\\n\",\n", - " \"and can be modified. We can edit these if necessary using the writer.\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 4,\n", - " \"metadata\": {\n", - " \"ExecuteTime\": {\n", - " \"end_time\": \"2025-04-16T14:50:09.974442Z\",\n", - " \"start_time\": \"2025-04-16T14:50:09.951257Z\"\n", - " },\n", - " \"pycharm\": {\n", - " \"name\": \"#%%\\n\"\n", - " }\n", - " },\n", - " \"outputs\": [\n", - " {\n", - " \"data\": {\n", - " \"text/plain\": [\n", - " \"(['C00 ',\\n\",\n", - " \" 'C01 ',\\n\",\n", - " \" 'C02 ',\\n\",\n", - " \" 'C03 ',\\n\",\n", - " \" 'C04 '],\\n\",\n", - " \" {},\\n\",\n", - " \" {'rms': 0, 'min': 0, 'mean': 0, 'max': 0, 'std': 0})\"\n", - " ]\n", - " },\n", - " \"execution_count\": 4,\n", - " \"metadata\": {},\n", - " \"output_type\": \"execute_result\"\n", - " }\n", - " ],\n", - " \"source\": [\n", - " \"writer = MDIOWriter(create_conf.path)\\n\",\n", - " \"\\n\",\n", - " \"# Truncate text header for display\\n\",\n", - " \"writer.text_header[:5], writer.binary_header, writer.stats\"\n", + " \"{\\n\",\n", + " \" \\\"cells\\\": [\\n\",\n", + " \" {\\n\",\n", + " \" \\\"cell_type\\\": \\\"markdown\\\",\\n\",\n", + " \" \\\"metadata\\\": {\\n\",\n", + " \" \\\"pycharm\\\": {\\n\",\n", + " \" \\\"name\\\": \\\"#%% md\\\\n\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"source\\\": [\\n\",\n", + " \" \\\"# Create an Empty MDIO\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"```{article-info}\\\\n\\\",\\n\",\n", + " \" \\\":author: Altay Sansal\\\\n\\\",\\n\",\n", + " \" \\\":date: \\\\\\\"{sub-ref}`today`\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\":read-time: \\\\\\\"{sub-ref}`wordcount-minutes` min read\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\":class-container: sd-p-0 sd-outline-muted sd-rounded-3 sd-font-weight-light\\\\n\\\",\\n\",\n", + " \" \\\"```\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"Here we will create an empty MDIO file and populate its fields.\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"```{warning}\\\\n\\\",\\n\",\n", + " \" \\\"For plotting, the notebook requires [Matplotlib](https://matplotlib.org/) as a dependency. Please install it before executing using\\\\n\\\",\\n\",\n", + " \" \\\"`pip install matplotlib` or `conda install matplotlib`.\\\\n\\\",\\n\",\n", + " \" \\\"```\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"We first need to import the configuration classes and create function to be able to create the empty MDIO.\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" },\\n\",\n", + " \" {\\n\",\n", + " \" \\\"cell_type\\\": \\\"code\\\",\\n\",\n", + " \" \\\"execution_count\\\": 2,\\n\",\n", + " \" \\\"metadata\\\": {\\n\",\n", + " \" \\\"ExecuteTime\\\": {\\n\",\n", + " \" \\\"end_time\\\": \\\"2025-04-16T14:50:04.371422Z\\\",\\n\",\n", + " \" \\\"start_time\\\": \\\"2025-04-16T14:50:04.368107Z\\\"\\n\",\n", + " \" },\\n\",\n", + " \" \\\"pycharm\\\": {\\n\",\n", + " \" \\\"name\\\": \\\"#%%\\\\n\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"outputs\\\": [],\\n\",\n", + " \" \\\"source\\\": [\\n\",\n", + " \" \\\"import matplotlib.pyplot as plt\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"from mdio import Dimension\\\\n\\\",\\n\",\n", + " \" \\\"from mdio import Grid\\\\n\\\",\\n\",\n", + " \" \\\"from mdio import MDIOCreateConfig\\\\n\\\",\\n\",\n", + " \" \\\"from mdio import MDIOReader\\\\n\\\",\\n\",\n", + " \" \\\"from mdio import MDIOVariableConfig\\\\n\\\",\\n\",\n", + " \" \\\"from mdio import MDIOWriter\\\\n\\\",\\n\",\n", + " \" \\\"from mdio import create_empty\\\\n\\\",\\n\",\n", + " \" \\\"from mdio.converters.segy import get_compressor\\\\n\\\",\\n\",\n", + " \" \\\"from mdio.segy.compat import mdio_segy_spec\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" },\\n\",\n", + " \" {\\n\",\n", + " \" \\\"cell_type\\\": \\\"markdown\\\",\\n\",\n", + " \" \\\"metadata\\\": {\\n\",\n", + " \" \\\"pycharm\\\": {\\n\",\n", + " \" \\\"name\\\": \\\"#%% md\\\\n\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"source\\\": [\\n\",\n", + " \" \\\"## Setting Up Grid Dimensions and Variable(s)\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"Let's try to create an MDIO file in 3D with known `inline`, `crossline`, and `sample`\\\\n\\\",\\n\",\n", + " \" \\\"dimensions. This is exactly like a 3D Post-Stack dataset.\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"We will use the standard `chunked_012` access pattern. All variable names must start\\\\n\\\",\\n\",\n", + " \" \\\"with `chunked_*` for `MDIOReader` to be able to open them with any access pattern.\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"We will also use an MDIO private utility function to get the compressor easily. The\\\\n\\\",\\n\",\n", + " \" \\\"compressor is fully customizable, but this function gives us ones available in SEG-Y\\\\n\\\",\\n\",\n", + " \" \\\"ingestion.\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"If we want headers, we can also provide `header_dtype` which is a Numpy `dtype`. Again,\\\\n\\\",\\n\",\n", + " \" \\\"we will be using the standard one MDIO uses for ingesting SEG-Ys. (Similar to SEG-Y Rev1).\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"At the end we create empty MDIO on local disk or cloud, based on the path string.\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" },\\n\",\n", + " \" {\\n\",\n", + " \" \\\"cell_type\\\": \\\"code\\\",\\n\",\n", + " \" \\\"execution_count\\\": 3,\\n\",\n", + " \" \\\"metadata\\\": {\\n\",\n", + " \" \\\"ExecuteTime\\\": {\\n\",\n", + " \" \\\"end_time\\\": \\\"2025-04-16T14:50:06.121450Z\\\",\\n\",\n", + " \" \\\"start_time\\\": \\\"2025-04-16T14:50:06.002634Z\\\"\\n\",\n", + " \" },\\n\",\n", + " \" \\\"pycharm\\\": {\\n\",\n", + " \" \\\"name\\\": \\\"#%%\\\\n\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"outputs\\\": [],\\n\",\n", + " \" \\\"source\\\": [\\n\",\n", + " \" \\\"grid = Grid(\\\\n\\\",\\n\",\n", + " \" \\\" dims=[\\\\n\\\",\\n\",\n", + " \" \\\" Dimension(name=\\\\\\\"inline\\\\\\\", coords=range(100, 300, 1)), # 100-300 with step 1\\\\n\\\",\\n\",\n", + " \" \\\" Dimension(name=\\\\\\\"crossline\\\\\\\", coords=range(1000, 1600, 2)), # 1000-1600 with step 2\\\\n\\\",\\n\",\n", + " \" \\\" Dimension(name=\\\\\\\"sample\\\\\\\", coords=range(0, 3000, 4)), # 0-3 seconds 4ms sample rate\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\")\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"compressor = get_compressor(lossless=True)\\\\n\\\",\\n\",\n", + " \" \\\"header_dtype = mdio_segy_spec().trace.header.dtype\\\\n\\\",\\n\",\n", + " \" \\\"variable = MDIOVariableConfig(\\\\n\\\",\\n\",\n", + " \" \\\" name=\\\\\\\"chunked_012\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" dtype=\\\\\\\"float32\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" chunks=(128, 128, 128),\\\\n\\\",\\n\",\n", + " \" \\\" compressors=compressor,\\\\n\\\",\\n\",\n", + " \" \\\" header_dtype=header_dtype,\\\\n\\\",\\n\",\n", + " \" \\\")\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"create_conf = MDIOCreateConfig(path=\\\\\\\"demo.mdio\\\\\\\", grid=grid, variables=[variable])\\\\n\\\",\\n\",\n", + " \" \\\"create_empty(config=create_conf);\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" },\\n\",\n", + " \" {\\n\",\n", + " \" \\\"cell_type\\\": \\\"markdown\\\",\\n\",\n", + " \" \\\"metadata\\\": {},\\n\",\n", + " \" \\\"source\\\": [\\n\",\n", + " \" \\\"## Populating the MDIO\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"Once empty MDIO is created, you can populate it with sample data, header data,\\\\n\\\",\\n\",\n", + " \" \\\"metadata, and statistics. The `live_mask` is automatically flipped to 1 after\\\\n\\\",\\n\",\n", + " \" \\\"every write. However, the consistency of the `live_mask` is up to the user. If\\\\n\\\",\\n\",\n", + " \" \\\"not populated correctly, at read time, traces may be skipped.\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"We will read the usual stats and as you can see they're all empty. Text header\\\\n\\\",\\n\",\n", + " \" \\\"and binary header are only required if we are going to export this back to SEG-Y,\\\\n\\\",\\n\",\n", + " \" \\\"and can be modified. We can edit these if necessary using the writer.\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" },\\n\",\n", + " \" {\\n\",\n", + " \" \\\"cell_type\\\": \\\"code\\\",\\n\",\n", + " \" \\\"execution_count\\\": 4,\\n\",\n", + " \" \\\"metadata\\\": {\\n\",\n", + " \" \\\"ExecuteTime\\\": {\\n\",\n", + " \" \\\"end_time\\\": \\\"2025-04-16T14:50:09.974442Z\\\",\\n\",\n", + " \" \\\"start_time\\\": \\\"2025-04-16T14:50:09.951257Z\\\"\\n\",\n", + " \" },\\n\",\n", + " \" \\\"pycharm\\\": {\\n\",\n", + " \" \\\"name\\\": \\\"#%%\\\\n\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"outputs\\\": [\\n\",\n", + " \" {\\n\",\n", + " \" \\\"data\\\": {\\n\",\n", + " \" \\\"text/plain\\\": [\\n\",\n", + " \" \\\"(['C00 ',\\\\n\\\",\\n\",\n", + " \" \\\" 'C01 ',\\\\n\\\",\\n\",\n", + " \" \\\" 'C02 ',\\\\n\\\",\\n\",\n", + " \" \\\" 'C03 ',\\\\n\\\",\\n\",\n", + " \" \\\" 'C04 '],\\\\n\\\",\\n\",\n", + " \" \\\" {},\\\\n\\\",\\n\",\n", + " \" \\\" {'rms': 0, 'min': 0, 'mean': 0, 'max': 0, 'std': 0})\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" },\\n\",\n", + " \" \\\"execution_count\\\": 4,\\n\",\n", + " \" \\\"metadata\\\": {},\\n\",\n", + " \" \\\"output_type\\\": \\\"execute_result\\\"\\n\",\n", + " \" }\\n\",\n", + " \" ],\\n\",\n", + " \" \\\"source\\\": [\\n\",\n", + " \" \\\"writer = MDIOWriter(create_conf.path)\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"# Truncate text header for display\\\\n\\\",\\n\",\n", + " \" \\\"writer.text_header[:5], writer.binary_header, writer.stats\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" },\\n\",\n", + " \" {\\n\",\n", + " \" \\\"cell_type\\\": \\\"markdown\\\",\\n\",\n", + " \" \\\"metadata\\\": {},\\n\",\n", + " \" \\\"source\\\": [\\n\",\n", + " \" \\\"## Updating File and Checking with `MDIOReader`.\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"We write traces here, the headers are still empty. If you need the headers\\\\n\\\",\\n\",\n", + " \" \\\"populated, this is where they would be written to file as well.\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"All the extra metadata we are writing is so that we can export back to SEG-Y\\\\n\\\",\\n\",\n", + " \" \\\"in the future. If that's not a requirement most of the metadata can be\\\\n\\\",\\n\",\n", + " \" \\\"omitted.\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"If you already have an MDIO prior to this, all the metadata can be copied\\\\n\\\",\\n\",\n", + " \" \\\"over from the previous version.\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" },\\n\",\n", + " \" {\\n\",\n", + " \" \\\"cell_type\\\": \\\"code\\\",\\n\",\n", + " \" \\\"execution_count\\\": 5,\\n\",\n", + " \" \\\"metadata\\\": {\\n\",\n", + " \" \\\"ExecuteTime\\\": {\\n\",\n", + " \" \\\"end_time\\\": \\\"2025-04-16T14:50:12.498287Z\\\",\\n\",\n", + " \" \\\"start_time\\\": \\\"2025-04-16T14:50:11.670230Z\\\"\\n\",\n", + " \" },\\n\",\n", + " \" \\\"pycharm\\\": {\\n\",\n", + " \" \\\"name\\\": \\\"#%%\\\\n\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"outputs\\\": [\\n\",\n", + " \" {\\n\",\n", + " \" \\\"data\\\": {\\n\",\n", + " \" \\\"text/plain\\\": [\\n\",\n", + " \" \\\"({'data_sample_format': 1,\\\\n\\\",\\n\",\n", + " \" \\\" 'sample_interval': 4,\\\\n\\\",\\n\",\n", + " \" \\\" 'samples_per_trace': 750,\\\\n\\\",\\n\",\n", + " \" \\\" 'segy_revision_major': 1,\\\\n\\\",\\n\",\n", + " \" \\\" 'segy_revision_minor': 0},\\\\n\\\",\\n\",\n", + " \" \\\" {'rms': 3, 'min': -4, 'mean': 12, 'max': 4, 'std': 5})\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" },\\n\",\n", + " \" \\\"execution_count\\\": 5,\\n\",\n", + " \" \\\"metadata\\\": {},\\n\",\n", + " \" \\\"output_type\\\": \\\"execute_result\\\"\\n\",\n", + " \" }\\n\",\n", + " \" ],\\n\",\n", + " \" \\\"source\\\": [\\n\",\n", + " \" \\\"sample_dim = writer.grid.select_dim(\\\\\\\"sample\\\\\\\")\\\\n\\\",\\n\",\n", + " \" \\\"sample_interval = int(sample_dim.coords[1] - sample_dim.coords[0])\\\\n\\\",\\n\",\n", + " \" \\\"num_samples = sample_dim.size\\\\n\\\",\\n\",\n", + " \" \\\"writer.binary_header = {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"data_sample_format\\\\\\\": 1,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"sample_interval\\\\\\\": sample_interval,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"samples_per_trace\\\\\\\": num_samples,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"segy_revision_major\\\\\\\": 1,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"segy_revision_minor\\\\\\\": 0,\\\\n\\\",\\n\",\n", + " \" \\\"}\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"# Write some values to the file\\\\n\\\",\\n\",\n", + " \" \\\"writer[:5] = 1\\\\n\\\",\\n\",\n", + " \" \\\"writer[5:10] = 2\\\\n\\\",\\n\",\n", + " \" \\\"writer[50:100] = 3\\\\n\\\",\\n\",\n", + " \" \\\"writer[150:175] = -1\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"# Write some made up stats\\\\n\\\",\\n\",\n", + " \" \\\"writer.stats = {\\\\\\\"mean\\\\\\\": 12, \\\\\\\"std\\\\\\\": 5, \\\\\\\"rms\\\\\\\": 3, \\\\\\\"min\\\\\\\": -4, \\\\\\\"max\\\\\\\": 4}\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"reader = MDIOReader(create_conf.path)\\\\n\\\",\\n\",\n", + " \" \\\"reader.binary_header, reader.stats\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" },\\n\",\n", + " \" {\\n\",\n", + " \" \\\"cell_type\\\": \\\"markdown\\\",\\n\",\n", + " \" \\\"metadata\\\": {},\\n\",\n", + " \" \\\"source\\\": \\\"Plot some of the data we populated:\\\"\\n\",\n", + " \" },\\n\",\n", + " \" {\\n\",\n", + " \" \\\"cell_type\\\": \\\"code\\\",\\n\",\n", + " \" \\\"execution_count\\\": 6,\\n\",\n", + " \" \\\"metadata\\\": {\\n\",\n", + " \" \\\"ExecuteTime\\\": {\\n\",\n", + " \" \\\"end_time\\\": \\\"2025-04-16T14:50:14.256953Z\\\",\\n\",\n", + " \" \\\"start_time\\\": \\\"2025-04-16T14:50:14.036094Z\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"outputs\\\": [\\n\",\n", + " \" {\\n\",\n", + " \" \\\"data\\\": {\\n\",\n", + " \" \\\"image/png\\\": \\\"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+wEoWAh2AOADOtK1Zs2aXq/VqFFDDhw4YL4uU6aMeTx69KjXMfrc2aePKSkpXvszMjLMSFnnmOwiIyPNCFrPDUDwINgBgA/oiNikpCSv1/773/9KxYoV3QMpNJwlJia692t/OO07Fx8fb57r4/Hjx2Xbtm3uY1atWmVqA7UvHgBkx6hYAPCBgQMHym233WaaYh988EHZvHmzvP3222ZTISEhMmDAAHnhhRdMPzwNeiNGjDAjXTt06OCu4WvVqpW7CTc9PV369etnRswyIhZATgh2AOADDRs2lAULFpg+b2PGjDHBTac30XnpHM8884ykpqaa/ndaM9ekSRMzvUlUVJT7mPfff9+EuebNm5vRsJ06dTJz3wFATgh2AOAjf/zjH82WG62109CnW250BOzcuXN9dIYAbEMfOwAAAEsQ7AAAACzh12CnE2lqP5SiRYuaSTi1w3D2UWRNmzY1zRWe2xNPPOF1jE4f0LZtWylcuLD5nCFDhpgpAQAAAIKJX/vYrVmzRvr27WvCnQax5557Tlq2bGkWy9bFsB06IsyzD4oGOEdmZqYJdTptwPr16+XIkSPy6KOPmoW3dTQaAABAsPBrsNPRX55mzZplatx0zqY777zTK8jlNhnn8uXLTRBcuXKlWYqnXr16MnbsWBk6dKiMHj1aIiIifH4dAAAABUGB6mOny984o8A86XD/kiVLys0332ymDjhz5ox7ny6SXbt2ba/1FhMSEsxEnzt37szx+7BINgAAsFGBme5EZ1LXyTp1tnYNcI6HH37YzNSuk3F+++23piZO++F98sknZr8uhJ3TItrOvtz69j3//PM+vR4AAICgDXba1+67776TdevWeb2uE3c6tGZO11/UiTr37dsnVapUuazvpbV+gwYNcj/XGrvy5ctfwdkDAAD4X4FoitVZ1RcvXixffPGFXH/99Rc81lkfce/eveZR+97ltIi2sy8nLJINAABs5Ndg53K5TKjTZXd0YWtdcuditm/fbh615s5ZJHvHjh2SkpLiPmbFihUmrNWsWdOHZw8AAFCwhPm7+VWXyvn000/NXHZOn7jY2FiJjo42za26v02bNlKiRAnTx04X1tYRs3Xq1DHH6vQoGuC6desm48ePN58xfPhw89laMwcAABAs/FpjN3XqVDMSVich1ho4Z/vggw/Mfp2qRKcx0fBWvXp1efrpp80C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\\\",\\n\",\n", + " \" \\\"text/plain\\\": [\\n\",\n", + " \" \\\"
\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" },\\n\",\n", + " \" \\\"metadata\\\": {},\\n\",\n", + " \" \\\"output_type\\\": \\\"display_data\\\"\\n\",\n", + " \" }\\n\",\n", + " \" ],\\n\",\n", + " \" \\\"source\\\": [\\n\",\n", + " \" \\\"fig, ax = plt.subplots(1, 2, sharex=\\\\\\\"all\\\\\\\")\\\\n\\\",\\n\",\n", + " \" \\\"ax[0].imshow(writer.live_mask[:].T, aspect=\\\\\\\"auto\\\\\\\")\\\\n\\\",\\n\",\n", + " \" \\\"ax[1].imshow(reader[:, 150].T, aspect=\\\\\\\"auto\\\\\\\")\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"ax[0].set_xlabel(\\\\\\\"inline\\\\\\\")\\\\n\\\",\\n\",\n", + " \" \\\"ax[0].set_ylabel(\\\\\\\"crossline\\\\\\\")\\\\n\\\",\\n\",\n", + " \" \\\"ax[1].set_xlabel(\\\\\\\"inline\\\\\\\")\\\\n\\\",\\n\",\n", + " \" \\\"ax[1].set_ylabel(\\\\\\\"sample\\\\\\\")\\\\n\\\",\\n\",\n", + " \" \\\"ax[0].set_title(\\\\\\\"Live Mask\\\\\\\")\\\\n\\\",\\n\",\n", + " \" \\\"ax[1].set_title(\\\\\\\"Middle Crossline\\\\\\\")\\\\n\\\",\\n\",\n", + " \" \\\"fig.tight_layout();\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" },\\n\",\n", + " \" {\\n\",\n", + " \" \\\"cell_type\\\": \\\"markdown\\\",\\n\",\n", + " \" \\\"metadata\\\": {},\\n\",\n", + " \" \\\"source\\\": [\\n\",\n", + " \" \\\"## Write to SEG-Y\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"Because we populated all the fields necessary for SEG-Y output, we can call the\\\\n\\\",\\n\",\n", + " \" \\\"MDIO to SEGY converter and get a file out.\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" },\\n\",\n", + " \" {\\n\",\n", + " \" \\\"cell_type\\\": \\\"code\\\",\\n\",\n", + " \" \\\"execution_count\\\": 7,\\n\",\n", + " \" \\\"metadata\\\": {\\n\",\n", + " \" \\\"ExecuteTime\\\": {\\n\",\n", + " \" \\\"end_time\\\": \\\"2025-04-16T14:50:15.788812Z\\\",\\n\",\n", + " \" \\\"start_time\\\": \\\"2025-04-16T14:50:15.009889Z\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"outputs\\\": [\\n\",\n", + " \" {\\n\",\n", + " \" \\\"name\\\": \\\"stderr\\\",\\n\",\n", + " \" \\\"output_type\\\": \\\"stream\\\",\\n\",\n", + " \" \\\"text\\\": [\\n\",\n", + " \" \\\"Unwrapping MDIO Blocks: 100%|██████████| 7/7 [00:00<00:00, 10.55it/s]\\\\n\\\",\\n\",\n", + " \" \\\"Merging lines: 100%|██████████| 1/1 [00:00<00:00, 17.26it/s]\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" },\\n\",\n", + " \" {\\n\",\n", + " \" \\\"name\\\": \\\"stdout\\\",\\n\",\n", + " \" \\\"output_type\\\": \\\"stream\\\",\\n\",\n", + " \" \\\"text\\\": [\\n\",\n", + " \" \\\"[(0, 0, 0, 0, 0, 4, 4000, 750, 750, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0)]\\\\n\\\",\\n\",\n", + " \" \\\"[[1. 1. 1. ... 1. 1. 1.]\\\\n\\\",\\n\",\n", + " \" \\\" [1. 1. 1. ... 1. 1. 1.]\\\\n\\\",\\n\",\n", + " \" \\\" [1. 1. 1. ... 1. 1. 1.]\\\\n\\\",\\n\",\n", + " \" \\\" ...\\\\n\\\",\\n\",\n", + " \" \\\" [1. 1. 1. ... 1. 1. 1.]\\\\n\\\",\\n\",\n", + " \" \\\" [1. 1. 1. ... 1. 1. 1.]\\\\n\\\",\\n\",\n", + " \" \\\" [1. 1. 1. ... 1. 1. 1.]]\\\\n\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" },\\n\",\n", + " \" {\\n\",\n", + " \" \\\"name\\\": \\\"stderr\\\",\\n\",\n", + " \" \\\"output_type\\\": \\\"stream\\\",\\n\",\n", + " \" \\\"text\\\": [\\n\",\n", + " \" \\\"\\\\n\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" }\\n\",\n", + " \" ],\\n\",\n", + " \" \\\"source\\\": [\\n\",\n", + " \" \\\"from segy import SegyFile\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"from mdio import mdio_to_segy\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"mdio_to_segy(\\\\\\\"demo.mdio\\\\\\\", \\\\\\\"demo.segy\\\\\\\")\\\\n\\\",\\n\",\n", + " \" \\\"segy = SegyFile(\\\\\\\"demo.segy\\\\\\\")\\\\n\\\",\\n\",\n", + " \" \\\"print(segy.binary_header)\\\\n\\\",\\n\",\n", + " \" \\\"print(segy.sample[:100])\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" },\\n\",\n", + " \" {\\n\",\n", + " \" \\\"cell_type\\\": \\\"markdown\\\",\\n\",\n", + " \" \\\"metadata\\\": {},\\n\",\n", + " \" \\\"source\\\": [\\n\",\n", + " \" \\\"## Copying an Existing MDIO without Data and Headers\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"We also provide a `create_empty_like` function which allows us to create an MDIO file\\\\n\\\",\\n\",\n", + " \" \\\"with the same structure and basic metadata as an existing one.\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"This will carry over:\\\\n\\\",\\n\",\n", + " \" \\\"* All access patterns in source MDIO\\\\n\\\",\\n\",\n", + " \" \\\"* Grid (shape, coordinates, dimensions, etc)\\\\n\\\",\\n\",\n", + " \" \\\"* Text Header\\\\n\\\",\\n\",\n", + " \" \\\"* Binary Header\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"It will **NOT** carry over:\\\\n\\\",\\n\",\n", + " \" \\\"* Trace data\\\\n\\\",\\n\",\n", + " \" \\\"* Header data\\\\n\\\",\\n\",\n", + " \" \\\"* Statistics\\\\n\\\",\\n\",\n", + " \" \\\"* Live Mask\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" },\\n\",\n", + " \" {\\n\",\n", + " \" \\\"cell_type\\\": \\\"code\\\",\\n\",\n", + " \" \\\"execution_count\\\": 8,\\n\",\n", + " \" \\\"metadata\\\": {\\n\",\n", + " \" \\\"ExecuteTime\\\": {\\n\",\n", + " \" \\\"end_time\\\": \\\"2025-04-16T14:50:17.246513Z\\\",\\n\",\n", + " \" \\\"start_time\\\": \\\"2025-04-16T14:50:17.111779Z\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"outputs\\\": [],\\n\",\n", + " \" \\\"source\\\": [\\n\",\n", + " \" \\\"from mdio import create_empty_like\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"copy_path = \\\\\\\"copy_of_existing.mdio\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\"create_empty_like(create_conf.path, copy_path)\\\\n\\\",\\n\",\n", + " \" \\\"\\\\n\\\",\\n\",\n", + " \" \\\"copy_reader = MDIOReader(copy_path)\\\\n\\\",\\n\",\n", + " \" \\\"assert copy_reader.shape == reader.shape\\\\n\\\",\\n\",\n", + " \" \\\"assert copy_reader.binary_header == reader.binary_header\\\\n\\\",\\n\",\n", + " \" \\\"assert copy_reader.stats != reader.stats\\\"\\n\",\n", + " \" ]\\n\",\n", + " \" },\\n\",\n", + " \" {\\n\",\n", + " \" \\\"cell_type\\\": \\\"code\\\",\\n\",\n", + " \" \\\"execution_count\\\": null,\\n\",\n", + " \" \\\"metadata\\\": {},\\n\",\n", + " \" \\\"outputs\\\": [],\\n\",\n", + " \" \\\"source\\\": []\\n\",\n", + " \" }\\n\",\n", + " \" ],\\n\",\n", + " \" \\\"metadata\\\": {\\n\",\n", + " \" \\\"kernelspec\\\": {\\n\",\n", + " \" \\\"display_name\\\": \\\"Python 3 (ipykernel)\\\",\\n\",\n", + " \" \\\"language\\\": \\\"python\\\",\\n\",\n", + " \" \\\"name\\\": \\\"python3\\\"\\n\",\n", + " \" },\\n\",\n", + " \" \\\"language_info\\\": {\\n\",\n", + " \" \\\"codemirror_mode\\\": {\\n\",\n", + " \" \\\"name\\\": \\\"ipython\\\",\\n\",\n", + " \" \\\"version\\\": 3\\n\",\n", + " \" },\\n\",\n", + " \" \\\"file_extension\\\": \\\".py\\\",\\n\",\n", + " \" \\\"mimetype\\\": \\\"text/x-python\\\",\\n\",\n", + " \" \\\"name\\\": \\\"python\\\",\\n\",\n", + " \" \\\"nbconvert_exporter\\\": \\\"python\\\",\\n\",\n", + " \" \\\"pygments_lexer\\\": \\\"ipython3\\\",\\n\",\n", + " \" \\\"version\\\": \\\"3.12.3\\\"\\n\",\n", + " \" },\\n\",\n", + " \" \\\"widgets\\\": {\\n\",\n", + " \" \\\"application/vnd.jupyter.widget-state+json\\\": {\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"104c0d4e90244ebc959e51a58794dcf4\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"display\\\": \\\"inline-flex\\\",\\n\",\n", + " \" \\\"flex_flow\\\": \\\"row wrap\\\",\\n\",\n", + " \" \\\"width\\\": \\\"100%\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"1c0f5b458ee1401eaa8de63c65802073\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HTMLStyleModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"description_width\\\": \\\"\\\",\\n\",\n", + " \" \\\"font_size\\\": null,\\n\",\n", + " \" \\\"text_color\\\": null\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"21b25dd6080d42368afc06770d5e1755\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HTMLModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"layout\\\": \\\"IPY_MODEL_35fb49026dac479eba87217c2f6bcb9a\\\",\\n\",\n", + " \" \\\"style\\\": \\\"IPY_MODEL_3ab3e27c83aa423d9ecdac94e576f0fe\\\",\\n\",\n", + " \" \\\"value\\\": \\\"Ingesting SEG-Y in 6 chunks: 100%\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"2693aae410f04e7587f0400b5eef1079\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"ProgressStyleModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"description_width\\\": \\\"\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"318aea09479a479981dcfa29bc856c67\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"ProgressStyleModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"description_width\\\": \\\"\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"35fb49026dac479eba87217c2f6bcb9a\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", + " \" \\\"state\\\": {}\\n\",\n", + " \" },\\n\",\n", + " \" \\\"3ab3e27c83aa423d9ecdac94e576f0fe\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HTMLStyleModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"description_width\\\": \\\"\\\",\\n\",\n", + " \" \\\"font_size\\\": null,\\n\",\n", + " \" \\\"text_color\\\": null\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"420b4a9492c54eb48d7779f38a09fd20\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"flex\\\": \\\"2\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"42afe4fae9dd4bc4a341a231cf7a9c32\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", + " \" \\\"state\\\": {}\\n\",\n", + " \" },\\n\",\n", + " \" \\\"4df685a95de542ffab6f265df89b8949\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HTMLStyleModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"description_width\\\": \\\"\\\",\\n\",\n", + " \" \\\"font_size\\\": null,\\n\",\n", + " \" \\\"text_color\\\": null\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"58eaddb54c8840da83d1f6503d6ba64f\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", + " \" \\\"state\\\": {}\\n\",\n", + " \" },\\n\",\n", + " \" \\\"5b3e72b71f304230bc36bb91f9c173be\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HTMLStyleModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"description_width\\\": \\\"\\\",\\n\",\n", + " \" \\\"font_size\\\": null,\\n\",\n", + " \" \\\"text_color\\\": null\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"5c1fab0ccc7e42c69c2b663b67ca9e3c\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", + " \" \\\"state\\\": {}\\n\",\n", + " \" },\\n\",\n", + " \" \\\"63a54817ae8b4c8d85b30d8c97e7ed0d\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HBoxModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"children\\\": [\\n\",\n", + " \" \\\"IPY_MODEL_e170d60a55a14c489d32b101293a9d33\\\",\\n\",\n", + " \" \\\"IPY_MODEL_662ad93cf7b3470f8e197350441f09ca\\\",\\n\",\n", + " \" \\\"IPY_MODEL_ac4abab2367e461e956e4e0edb27be44\\\"\\n\",\n", + " \" ],\\n\",\n", + " \" \\\"layout\\\": \\\"IPY_MODEL_c59d6fe969a04f4da332ae2a6fdb9c77\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"63f87a2410ba47d38ad9f55a81357a29\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HTMLModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"layout\\\": \\\"IPY_MODEL_ca48140488574a28a7469552441560e4\\\",\\n\",\n", + " \" \\\"style\\\": \\\"IPY_MODEL_ae2037efb9cc459e84bcc28ca7243437\\\",\\n\",\n", + " \" \\\"value\\\": \\\" 2/2 [00:03<00:00, 3.01s/block]\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"64eb2b9c8a094a1ea5f1991e5f09f5d9\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", + " \" \\\"state\\\": {}\\n\",\n", + " \" },\\n\",\n", + " \" \\\"662ad93cf7b3470f8e197350441f09ca\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"FloatProgressModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"bar_style\\\": \\\"success\\\",\\n\",\n", + " \" \\\"layout\\\": \\\"IPY_MODEL_420b4a9492c54eb48d7779f38a09fd20\\\",\\n\",\n", + " \" \\\"max\\\": 1,\\n\",\n", + " \" \\\"style\\\": \\\"IPY_MODEL_d16e93f72f3d4aeda2f5deee87e9754f\\\",\\n\",\n", + " \" \\\"value\\\": 1\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"74283969ff5446c89bb83b00a70226cf\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HTMLModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"layout\\\": \\\"IPY_MODEL_5c1fab0ccc7e42c69c2b663b67ca9e3c\\\",\\n\",\n", + " \" \\\"style\\\": \\\"IPY_MODEL_1c0f5b458ee1401eaa8de63c65802073\\\",\\n\",\n", + " \" \\\"value\\\": \\\" 6/6 [00:09<00:00, 2.48s/block]\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"75cf0c1ed25e47aab20b060f3bb44fb8\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HBoxModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"children\\\": [\\n\",\n", + " \" \\\"IPY_MODEL_21b25dd6080d42368afc06770d5e1755\\\",\\n\",\n", + " \" \\\"IPY_MODEL_c33f32b62a204ef094f67b10f8adbdc1\\\",\\n\",\n", + " \" \\\"IPY_MODEL_74283969ff5446c89bb83b00a70226cf\\\"\\n\",\n", + " \" ],\\n\",\n", + " \" \\\"layout\\\": \\\"IPY_MODEL_91df4ac76fd744539d4237d6099f34a5\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"7ff32d7deac14f21ab0f0939fe09e440\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"ProgressStyleModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"description_width\\\": \\\"\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"91df4ac76fd744539d4237d6099f34a5\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"display\\\": \\\"inline-flex\\\",\\n\",\n", + " \" \\\"flex_flow\\\": \\\"row wrap\\\",\\n\",\n", + " \" \\\"width\\\": \\\"100%\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"981634b52a7a4ffdae6186061c0b6482\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HBoxModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"children\\\": [\\n\",\n", + " \" \\\"IPY_MODEL_f65266f861cf40ef84e9ec74a8e0b44c\\\",\\n\",\n", + " \" \\\"IPY_MODEL_9aaf514a5035413d8cbbad58aa0221f4\\\",\\n\",\n", + " \" \\\"IPY_MODEL_63f87a2410ba47d38ad9f55a81357a29\\\"\\n\",\n", + " \" ],\\n\",\n", + " \" \\\"layout\\\": \\\"IPY_MODEL_104c0d4e90244ebc959e51a58794dcf4\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"9aaf514a5035413d8cbbad58aa0221f4\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"FloatProgressModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"bar_style\\\": \\\"success\\\",\\n\",\n", + " \" \\\"layout\\\": \\\"IPY_MODEL_b25523a221fd4b5e9211d07ef39cccf5\\\",\\n\",\n", + " \" \\\"max\\\": 2,\\n\",\n", + " \" \\\"style\\\": \\\"IPY_MODEL_318aea09479a479981dcfa29bc856c67\\\",\\n\",\n", + " \" \\\"value\\\": 2\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"9fe5348964cd4f7880bcd33204bbc7a2\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", + " \" \\\"state\\\": {}\\n\",\n", + " \" },\\n\",\n", + " \" \\\"a03d238db31145b881a1be478f9eb72f\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HTMLStyleModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"description_width\\\": \\\"\\\",\\n\",\n", + " \" \\\"font_size\\\": null,\\n\",\n", + " \" \\\"text_color\\\": null\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"a6aabcd2e57348a49bb59477f6a9fd90\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"FloatProgressModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"bar_style\\\": \\\"success\\\",\\n\",\n", + " \" \\\"layout\\\": \\\"IPY_MODEL_cfb02c9c7447491ca00bbb6acd99bb79\\\",\\n\",\n", + " \" \\\"max\\\": 26,\\n\",\n", + " \" \\\"style\\\": \\\"IPY_MODEL_7ff32d7deac14f21ab0f0939fe09e440\\\",\\n\",\n", + " \" \\\"value\\\": 26\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"ac4abab2367e461e956e4e0edb27be44\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HTMLModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"layout\\\": \\\"IPY_MODEL_58eaddb54c8840da83d1f6503d6ba64f\\\",\\n\",\n", + " \" \\\"style\\\": \\\"IPY_MODEL_a03d238db31145b881a1be478f9eb72f\\\",\\n\",\n", + " \" \\\"value\\\": \\\" 3/? [00:00<00:00, 8.29block/s]\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"ae2037efb9cc459e84bcc28ca7243437\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HTMLStyleModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"description_width\\\": \\\"\\\",\\n\",\n", + " \" \\\"font_size\\\": null,\\n\",\n", + " \" \\\"text_color\\\": null\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"b25523a221fd4b5e9211d07ef39cccf5\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"flex\\\": \\\"2\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"b9810ee38bbe43f4bba100e53379be65\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HTMLModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"layout\\\": \\\"IPY_MODEL_42afe4fae9dd4bc4a341a231cf7a9c32\\\",\\n\",\n", + " \" \\\"style\\\": \\\"IPY_MODEL_fdcea609ee7349629604217b625371d3\\\",\\n\",\n", + " \" \\\"value\\\": \\\" 26/26 [00:01<00:00, 18.92block/s]\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"c33f32b62a204ef094f67b10f8adbdc1\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"FloatProgressModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"bar_style\\\": \\\"success\\\",\\n\",\n", + " \" \\\"layout\\\": \\\"IPY_MODEL_d23d88490a1b4941b8ca228b7d4a39cb\\\",\\n\",\n", + " \" \\\"max\\\": 6,\\n\",\n", + " \" \\\"style\\\": \\\"IPY_MODEL_2693aae410f04e7587f0400b5eef1079\\\",\\n\",\n", + " \" \\\"value\\\": 6\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"c59d6fe969a04f4da332ae2a6fdb9c77\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"display\\\": \\\"inline-flex\\\",\\n\",\n", + " \" \\\"flex_flow\\\": \\\"row wrap\\\",\\n\",\n", + " \" \\\"width\\\": \\\"100%\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"ca48140488574a28a7469552441560e4\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", + " \" \\\"state\\\": {}\\n\",\n", + " \" },\\n\",\n", + " \" \\\"cfb02c9c7447491ca00bbb6acd99bb79\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"flex\\\": \\\"2\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"d16e93f72f3d4aeda2f5deee87e9754f\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"ProgressStyleModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"description_width\\\": \\\"\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"d23d88490a1b4941b8ca228b7d4a39cb\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"flex\\\": \\\"2\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"d565a20d37e84ed0a1195e9a90154960\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HBoxModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"children\\\": [\\n\",\n", + " \" \\\"IPY_MODEL_db696e15587c4a54b82886b3eb5a0c96\\\",\\n\",\n", + " \" \\\"IPY_MODEL_a6aabcd2e57348a49bb59477f6a9fd90\\\",\\n\",\n", + " \" \\\"IPY_MODEL_b9810ee38bbe43f4bba100e53379be65\\\"\\n\",\n", + " \" ],\\n\",\n", + " \" \\\"layout\\\": \\\"IPY_MODEL_eab4b060672b4dd5a73ca7bb8f782cd2\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"db696e15587c4a54b82886b3eb5a0c96\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HTMLModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"layout\\\": \\\"IPY_MODEL_64eb2b9c8a094a1ea5f1991e5f09f5d9\\\",\\n\",\n", + " \" \\\"style\\\": \\\"IPY_MODEL_5b3e72b71f304230bc36bb91f9c173be\\\",\\n\",\n", + " \" \\\"value\\\": \\\"Step 1 / 2 Writing Blocks: 100%\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"e170d60a55a14c489d32b101293a9d33\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HTMLModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"layout\\\": \\\"IPY_MODEL_9fe5348964cd4f7880bcd33204bbc7a2\\\",\\n\",\n", + " \" \\\"style\\\": \\\"IPY_MODEL_4df685a95de542ffab6f265df89b8949\\\",\\n\",\n", + " \" \\\"value\\\": \\\"Step 2 / 2 Concat Blocks: \\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"e66368cda8124001b16459a0634029e2\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HTMLStyleModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"description_width\\\": \\\"\\\",\\n\",\n", + " \" \\\"font_size\\\": null,\\n\",\n", + " \" \\\"text_color\\\": null\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"eab4b060672b4dd5a73ca7bb8f782cd2\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"display\\\": \\\"inline-flex\\\",\\n\",\n", + " \" \\\"flex_flow\\\": \\\"row wrap\\\",\\n\",\n", + " \" \\\"width\\\": \\\"100%\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"f65266f861cf40ef84e9ec74a8e0b44c\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HTMLModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"layout\\\": \\\"IPY_MODEL_fff4199774534d9f982f03738fbb08e7\\\",\\n\",\n", + " \" \\\"style\\\": \\\"IPY_MODEL_e66368cda8124001b16459a0634029e2\\\",\\n\",\n", + " \" \\\"value\\\": \\\"Scanning SEG-Y for geometry attributes: 100%\\\"\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"fdcea609ee7349629604217b625371d3\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"HTMLStyleModel\\\",\\n\",\n", + " \" \\\"state\\\": {\\n\",\n", + " \" \\\"description_width\\\": \\\"\\\",\\n\",\n", + " \" \\\"font_size\\\": null,\\n\",\n", + " \" \\\"text_color\\\": null\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"fff4199774534d9f982f03738fbb08e7\\\": {\\n\",\n", + " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", + " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", + " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", + " \" \\\"state\\\": {}\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"version_major\\\": 2,\\n\",\n", + " \" \\\"version_minor\\\": 0\\n\",\n", + " \" }\\n\",\n", + " \" }\\n\",\n", + " \" },\\n\",\n", + " \" \\\"nbformat\\\": 4,\\n\",\n", + " \" \\\"nbformat_minor\\\": 4\\n\",\n", + " \"}\\n\"\n", " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"## Updating File and Checking with `MDIOReader`.\\n\",\n", - " \"\\n\",\n", - " \"We write traces here, the headers are still empty. If you need the headers\\n\",\n", - " \"populated, this is where they would be written to file as well.\\n\",\n", - " \"\\n\",\n", - " \"All the extra metadata we are writing is so that we can export back to SEG-Y\\n\",\n", - " \"in the future. If that's not a requirement most of the metadata can be\\n\",\n", - " \"omitted.\\n\",\n", - " \"\\n\",\n", - " \"If you already have an MDIO prior to this, all the metadata can be copied\\n\",\n", - " \"over from the previous version.\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 5,\n", - " \"metadata\": {\n", - " \"ExecuteTime\": {\n", - " \"end_time\": \"2025-04-16T14:50:12.498287Z\",\n", - " \"start_time\": \"2025-04-16T14:50:11.670230Z\"\n", - " },\n", - " \"pycharm\": {\n", - " \"name\": \"#%%\\n\"\n", - " }\n", - " },\n", - " \"outputs\": [\n", - " {\n", - " \"data\": {\n", - " \"text/plain\": [\n", - " \"({'data_sample_format': 1,\\n\",\n", - " \" 'sample_interval': 4,\\n\",\n", - " \" 'samples_per_trace': 750,\\n\",\n", - " \" 'segy_revision_major': 1,\\n\",\n", - " \" 'segy_revision_minor': 0},\\n\",\n", - " \" {'rms': 3, 'min': -4, 'mean': 12, 'max': 4, 'std': 5})\"\n", - " ]\n", - " },\n", - " \"execution_count\": 5,\n", - " \"metadata\": {},\n", - " \"output_type\": \"execute_result\"\n", - " }\n", - " ],\n", - " \"source\": [\n", - " \"sample_dim = writer.grid.select_dim(\\\"sample\\\")\\n\",\n", - " \"sample_interval = int(sample_dim.coords[1] - sample_dim.coords[0])\\n\",\n", - " \"num_samples = sample_dim.size\\n\",\n", - " \"writer.binary_header = {\\n\",\n", - " \" \\\"data_sample_format\\\": 1,\\n\",\n", - " \" \\\"sample_interval\\\": sample_interval,\\n\",\n", - " \" \\\"samples_per_trace\\\": num_samples,\\n\",\n", - " \" \\\"segy_revision_major\\\": 1,\\n\",\n", - " \" \\\"segy_revision_minor\\\": 0,\\n\",\n", - " \"}\\n\",\n", - " \"\\n\",\n", - " \"# Write some values to the file\\n\",\n", - " \"writer[:5] = 1\\n\",\n", - " \"writer[5:10] = 2\\n\",\n", - " \"writer[50:100] = 3\\n\",\n", - " \"writer[150:175] = -1\\n\",\n", - " \"\\n\",\n", - " \"# Write some made up stats\\n\",\n", - " \"writer.stats = {\\\"mean\\\": 12, \\\"std\\\": 5, \\\"rms\\\": 3, \\\"min\\\": -4, \\\"max\\\": 4}\\n\",\n", - " \"\\n\",\n", - " \"reader = MDIOReader(create_conf.path)\\n\",\n", - " \"reader.binary_header, reader.stats\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": \"Plot some of the data we populated:\"\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 6,\n", - " \"metadata\": {\n", - " \"ExecuteTime\": {\n", - " \"end_time\": \"2025-04-16T14:50:14.256953Z\",\n", - " \"start_time\": \"2025-04-16T14:50:14.036094Z\"\n", - " }\n", - " },\n", - " \"outputs\": [\n", - " {\n", - " \"data\": {\n", - " \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAARWhJREFUeJzt3QucjnX+//HPjDkazIScyimRQw4bYkolZBxWREVJlGUTWkTSOkWlpJTWKbUObVapKFZOI6yclRJ2FinEmFJOo2EO9//x+f72uv/3PWYYzO2e+3u/no/H1T33fV33Pdc1Y769r+8xxOVyuQQAAAABL9TfJwAAAID8QbADAACwBMEOAADAEgQ7AAAASxDsAAAALEGwAwAAsATBDgAAwBIEOwAAAEsQ7AAAACxBsMNV88MPP0hISIjMmjVLgpFee79+/fx9GgD+9/c4evToix6nx+ixl/OZWtbpa1r2BbMePXpIpUqVLuvnj0tHsEO+cAqwrVu3SkENlLq98MILOR7TtWtXs79IkSJX/fwAXFm5o9u6devO268rZpYvX97s/+Mf/yi2OHr0qAwePFiqV68uhQsXlpiYGKlfv74p344fP+7v04Ofhfn7BBA8KlasKL///ruEh4f75ftHRUXJP//5Txk+fLjX66mpqfLpp5+a/QACj/7tzp07V5o0aeL1+po1a+TQoUMSGRl53nu0LAoLC7z/BW7ZskXatGkjp0+flkceecQEOqU31S+//LKsXbtWli9fLgVdoP78AwE1drhq9K5ZC+BChQr55ftrYbhr1y755ptvvF7XUHfu3Dm55557/HJeAK78b3v+/PmSkZHh9bqGPQ0+ZcqUOe89WhYFWrDQ2rj77rvPlKFff/21zJgxQ5544gmzvfPOO7Jv3z658847c32/1mBqoCoIAvHnHygIdvBbH7sJEyaY5z/++ON5xw4bNkwiIiLkt99+c7+2adMmadWqlcTGxprmh7vuuku+/PLLPH//+Ph4qVy5sinsPb3//vvmc4sXL37eezT0tW3bVsqVK2fu+qtUqSJjx46VzMxMr+P27NkjnTp1Mv8D0QLr+uuvly5dusiJEycueE7adBIaGipvvfVWnq8DgLeHHnpIjh07JitWrHC/pjdrH330kTz88MM5vienPl7anNuwYUPzN6x/69OnT8/xvWfPnpWBAwfKtddeK0WLFpV7773X1Azm1eeffy533HGHaULV92sZs3Pnzou+T8/np59+ktdff900w2ZXunRprxYJ7demTdDLli2TBg0aSHR0tPuavv/+e3nggQdMuaflaePGjeVf//rXeZ+pZVOtWrXMMddcc435HM8y9NSpUzJgwADzvbSMLFWqlLlJ/uqrry54Ldl//k5fxr1795o+eXFxcaasf+yxx+TMmTPnvf8f//iHCe16TXoNWt4ePHjwoj/DYECwg988+OCD5g/5ww8/PG+fvtayZUtTkKhVq1aZO9GTJ0/KqFGj5KWXXjJ3r82aNZPNmzdf0v8A5s2bZ+5c1S+//GKaLXIr/DWEar+7QYMGyZtvvmkKkpEjR8qzzz7r9T+QhIQE2bhxo/Tv318mT54svXv3NgXnhfq7aAGsn6UFrb4PwOXRUKE3btrVwjM86Y2V/g8/L3bs2GHKnJSUFBMyNFBoWbNgwYLzjv3Tn/4kb7zxhjlemz+1e4mGs7x47733zLFarrzyyisyYsQI05KgzcgXG2Tx2WefmSBz//33S14lJSWZck/DlpZh9erVM330brvtNhP4nnzySXnxxRclLS3NBFTP69Uawaeeekpq1qxprvf5558379ebbIfWFk6dOtXc2E6ZMsX0/dNz3L17t1zu/xc0LI4bN858rWWwfl9Per6PPvqoVK1a1YRcDZaJiYnm/xHH6WNoqmaBKzZz5kxNSq4tW7bkesz+/fvNMXqsIz4+3lW/fn2v4zZv3myOmzNnjnmelZXlqlq1qishIcF87Thz5oyrcuXKrnvuueeC5+Z831dffdX13Xffma///e9/m32TJ092FSlSxJWamurq3r27KyYmxuu9+j2y+/Of/+wqXLiwKy0tzTz/+uuvzWfOnz//guehx/Tt29d8/fTTT7tCQ0Nds2bNuuB7AOSt3Pnb3/7mKlq0qPtv9oEHHnDdfffd5uuKFSu62rZt6/Vefd+oUaPczzt06OCKiopy/fjjj+7Xdu3a5SpUqJA51rF9+3bz/Mknn/T6vIcffvi8z3TOT8sgderUKVdcXJyrV69eXu9NTk52xcbGnvd6dtdcc42rbt26ef756HXr91+6dKnX6wMGDPAqB51z0/K0UqVKrszMTPNa+/btXbVq1brg99Dzdsq13GjZqufiKfvPSr/W1x5//HGv4+677z5XiRIl3M9/+OEH8zt58cUXvY7bsWOHKyws7LzXgxE1dvCrzp07y7Zt20zfEMcHH3xgqvTbt29vnm/fvt00dWqtmja3aC2bbjrooXnz5qazcFZWVp6+nzYp1KlTx31nr00K+n20mSEneufp0LtI/b7ahKJNA//5z3/M69pcoPTuN6cmA09anumUJ3rnrE0J3bt3z9N5A7gwrd3R/mOLFy82f6v6mFtNfHbatUL/fjt06CAVKlRwv16jRg1TG+9pyZIl5lFrsjxprdHFaFOx1ihpDZpTjummfeYaNWokX3zxxQXfry0W2nR7KbT7SU7XcOutt3oNNtEaRG1p0FpDrUFU2hyqTcw6YCM3eozW4B0+fFjyg9YAetLyVst9vXb1ySefmPJef9+eP0PtBqM1eF9c5GcYDAh28Cvt46F9zDTMOcFHO0G3bt1aihUrZl7TUKc0BGmfFs9NOwxrf5eL9WXzpIW9fg/ty7F+/foLFv7a70U7K2t40/PR76kj0ZTzPbXg1KZaPZeSJUuaQlSbY3M6pzlz5ph92m9FC3cA+UP/Nlu0aGFu1vR//hrW8tpk+fPPP5tQqMEgu5tuusnrufYJ1jJL++Bd6LicOGWZdiHJXpZplxBtBr4QLYM0tF4KLZ+y02vI6Xw1yDr71dChQ03g0xCoP5u+ffue1695/Pjx8t1335lpZfQ4bcbWbiiXyzNYK6c7jtPfWn+G+v8JPZ/sP0Nt/k25yM8wGDAkBX6lgxL0jkz71D333HOmn9qBAwdM3xOHUxv36quvmv4dObmU+ec0UOngjF69ekmJEiVMP5mc6J21DtDQwnTMmDGmINdO1dopWAs8z1rC1157zXT41cEWWkDr3bz2EdHr0YEUjttvv93UQP7tb38zd5w5DdgAcHn0Jk3/rpOTk83NodYmFSROmaH97HIaqXuxUaI6YELLD+3Xq4PL8sKz1eFSadDTPnpa+7l06VL5+OOPTT867Rvs9HvTckzLcO2bp2WfltNafmu41t/Bpcpt1gSnX7T+DLVvtvahzOnYIsxFSrBDwWiO1Q68WoBozZ02i7Zr186937kz1oCld+RXSu8INWCtXr1a+vTpk2thqvu1CUALKM8pBPbv35/j8bVr1zabDorQmkD9HtOmTfOaFPnGG280d7hNmzY1I3G1w++lNq0AyJnWrv/5z382N1ROK0BeaG2PBiCnRs2TlkvZ5+PUcKHdRzxrvbIflxOnLNORo5dTlmm5uGHDBhOwrqTGX68hp/N1upfofoeO3NUyWjcNlB07djSDF/Tm2Jn7s2zZsqYM101rzG655RZzzOUEu7z8DDXkaU1ktWrV8v3zbUBTLPxOR1PpnZf2e9MmUh2er4WJQ0ei6h+zTo+ik3Lm1IxyqTRs6Yi3C41Gde4GnTtFpQWb3rF60r4f2efP0oCnzTXaTJyd9vHTPi7abKAFdUGZVwoIdFpboyM0tTnQ8+bwYvRvXbtQLFy40LQYOPRvVPveeXLCyqRJk7xe11GjF6PfQ29QdVR/enr6JZdl2v9MQ9TTTz8t//3vf8/br6Eqt9V1ss/7p7MJaEh0aJ/lt99+24ww1lGwSm9sPWktoe7TMlHPX5u7s3c50dCqLTE5lX35QYOl/r60xtCzbFb6/Fi2cw5G1NghX/397383VfbZ/eUvf8n1PVoQ3H333WbYuvYf0TtDTxqQtP+aFqg6+EGnIbjuuuvMfE7aUVYLykWLFl3SeWoTq24XotMBaP8O7dunTata/a9NKNkLE52KRQdEaH9BvYPUkKfHaeGjoTUnOmeUNttqAav9gPR/KP5akQOwyeUOSNKgoGWXNitqzZP+HTtzuH377bfu47Q7iNaW6Q2ehhotJ7TmXfvsXoyWVRo8u3XrZmq1dCoWrS3UMKlzyGktv3bTyI2WR9rkqeWGnofnyhPaRURvjnXal4vR6Zr0WC1TtWzTLiGzZ882rRFaG6hlrtJuKtpkrOelc+Rp0NXz0+latKVBu6toVxMtw+rWrWuC9cqVK81gC+2e4gt6k6/hVWsMdaCHDnjRc9Fz159N7969zZQrQc3fw3JhB2dYf27bwYMHc5zuxDFjxgyzT6cr+P3333P8HjqtSMeOHc3Q98jISDN8/sEHH3QlJibmebqTC8lpupMvv/zS1bhxY1d0dLSrXLlyrmeeeca1bNky83lffPGFOeb77783Q/SrVKlipksoXry4mWZh5cqVuU534vj000/NEP3OnTu7pxgAkH/TLOV1uhO1Zs0aM/1SRESE64YbbnBNmzbNPQ2HJy2jnnrqKVMWaZnRrl07U8ZdbLoTh5YdOn2TThWiZYaWHT169HBt3bo1T9d9+PBh18CBA13VqlUz79fpl/S8daqPEydOXPC6Hfv27XPdf//9ZvoV/Yxbb73VtXjxYq9jpk+f7rrzzjvdZa6e55AhQ9zf4+zZs+a5TsGiZbf+LPTrKVOmXPZ0Jz///LPXcbn9DD/++GNXkyZNzPfUrXr16qZ8TUpKcgW7EP2Pv8MlAAAArhx97AAAACxBsAMAALAEwQ4AAMAS1gQ7nc1fh2nrvDq6NMulLAwPAAUdZRyAoAl2OhGlLumk85LpkG8ddq3zBbG0CAAbUMYByCsrRsXq3WvDhg3d8//orOC6bp1OPqvz9QBAIKOMAxA0ExTrSgDbtm0zkxU6dHJFXa7Fc1btC9FC8vDhw2aSQ52EFkDg0XtUneBaZ713Jli1wZWWcZRvQHCVbwEf7H755RezrInOiu1Jnzvr3mWnS514LneiKxg4S6gACGwHDx40s+Hb4lLLOMo3ILjLt4APdpdj3LhxZvmY7H78qpIUK5K3O/1HGtaQ1BOB++Pr8tRR6dwvePrnZKSLdKl7s2RmBE+Nhb9+x3t3RMuQTjde9e+bIemyTpaYmqlgllv5dv3o4RL6v0XbHY0bJEloSNZ5x/4wtapknf2/tZID0aMJX0vXltslWGRkhsi9zz4qmVn21FRfTHjSTxL+3yNX/ftmxRWWtDuu/o1SZnqabFv6Yp7Kt8BNJv9TsmRJsybn0aNHvV7X57rGXU60SUM7Insu4q79VTTUFSuatz+M8JBwCQsJ3B9fdGRYnq/VBhnpIRIWEh5UTVH++h0XiSlkftZX3f96C9v2O77UMi638k1DXfZgFx4TIYVCzw92YeFRkpUVuMEuOjo8uMq3zFDzOwsJomAXVijSL+VMVkiE+Vn7S17Kt4D/VxAREWEWQdZFmD37lOjz3BZDjoyMNIsxe24AYEMZR/kGBLfArXLyoHen3bt3lwYNGsitt94qb7zxhqSmpspjjz3m71MDgCtGGQcgqIJd586d5eeff5aRI0dKcnKy1KtXT5YuXXpeZ2MACESUcQCCKtipfv36mQ0AbEQZByAvAr6PHQAAAP4PwQ4AAMASBDsAAABLEOwAAAAsQbADAACwBMEOAADAEgQ7AAAASxDsAAAALEGwAwAAsATBDgAAwBIEOwAAAEsQ7AAAACxBsAMAALAEwQ4AAMASBDsAAABLEOwAAAAsQbADAACwBMEOAADAEgQ7AAAASxDsAAAALEGwAwAAsATBDgAAwBIEOwAAAEsQ7AAAACxBsAMAALAEwQ4AAMASBDsAAABLEOwAAAAsQbADAACwBMEOAADAEgQ7AAAASxDsAAAALEGwAwAAsATBDgAAwBIEOwAAAEsQ7AAAACxBsAMAALAEwQ4AAMASBDsAAABLEOwAAAAsQbADAB9Zu3attGvXTsqVKychISGycOFCr/0ul0tGjhwpZcuWlejoaGnRooXs2bPH65hff/1VunbtKsWKFZO4uDjp2bOnnD59+ipfCYBAQbADAB9JTU2VunXryuTJk3PcP378eJk0aZJMmzZNNm3aJDExMZKQkCBpaWnuYzTU7dy5U1asWCGLFy82YbF3795X8SoABJIwf58AANiqdevWZsuJ1ta98cYbMnz4cGnfvr15bc6cOVK6dGlTs9elSxfZvXu3LF26VLZs2SINGjQwx7z11lvSpk0bmTBhgqkJBABP1NgBgB/s379fkpOTTfOrIzY2Vho1aiQbNmwwz/VRm1+dUKf0+NDQUFPDBwDZUWMHAH6goU5pDZ0nfe7s08dSpUp57Q8LC5PixYu7j8nu7NmzZnOcPHnSB2cPoKCixg4ALDJu3DhT8+ds5cuX9/cpAbiKCHYA4AdlypQxj0ePHvV6XZ87+/QxJSXFa39GRoYZKesck92wYcPkxIkT7u3gwYM+uwYABQ/BDgD8oHLlyiacJSYmejWbat+5+Ph481wfjx8/Ltu2bXMfs2rVKsnKyjJ98XISGRlppkbx3AAED/rYAYCP6Hxze/fu9RowsX37dtNHrkKFCjJgwAB54YUXpGrVqibojRgxwox07dChgzm+Ro0a0qpVK+nVq5eZEiU9PV369etnRswyIhZATgh2AOAjW7dulbvvvtv9fNCgQeaxe/fuMmvWLHnmmWfMXHc6L53WzDVp0sRMbxIVFeV+z/vvv2/CXPPmzc1o2E6dOpm57wAgJwQ7APCRpk2bmvnqcqOrUYwZM8ZsudHavblz5/roDAHYhj52AAAAliDYAQAAWIJgBwAAYIkCHexGjx5t+qB4btWrV3fv14Wy+/btKyVKlJAiRYqYTsXZ54QCAAAIFgU62KlatWrJkSNH3Nu6devc+wYOHCiLFi2S+fPny5o1a+Tw4cPSsWNHv54vAACAvxT4UbG6LmJOM6zrjOrvvvuuGS3WrFkz89rMmTPNvE8bN26Uxo0b++FsAQAA/KfA19jt2bPHTMR5ww03SNeuXeXAgQPmdZ2JXSfrbNGihftYbabVST83bNhwwc/UBbJ1hnfPDQAAINAV6GCnS+boJJ46YefUqVPNrO133HGHnDp1SpKTkyUiIkLi4uK83lO6dGmz70JYJBsAANioQDfFtm7d2v11nTp1TNCrWLGifPjhhxIdHX3Zn6uLZDszwCutsSPcAQCAQFega+yy09q5atWqmbUXtd/duXPnzDI8nnRUbE598jyxSDYAALBRaKAtqL1v3z4pW7as1K9fX8LDwyUxMdG9PykpyfTBi4+P9+t5AgAA+EOBboodPHiwtGvXzjS/6lQmo0aNkkKFCslDDz1k+sb17NnTNKnqWopa69a/f38T6hgRCwAAglGBDnaHDh0yIe7YsWNy7bXXSpMmTcxUJvq1mjhxooSGhpqJiXWka0JCgkyZMsXfpw0AAOAXBTrYzZs374L7o6KiZPLkyWYDAAAIdgHVxw4AAAC5I9gBAABYgmAHAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJgh0AAIAlCHYAAACWINgBAABYgmAHAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJgh0AAIAlCHYAAACWINgBAABYgmAHAABgCYIdAPjAuHHjpGHDhlK0aFEpVaqUdOjQQZKSkryOSUtLk759+0qJEiWkSJEi0qlTJzl69KjXMQcOHJC2bdtK4cKFzecMGTJEMjIyrvLVAAgUBDsA8IE1a9aY0LZx40ZZsWKFpKenS8uWLSU1NdV9zMCBA2XRokUyf/58c/zhw4elY8eO7v2ZmZkm1J07d07Wr18vs2fPllmzZsnIkSP9dFUACrowf58AANho6dKlXs81kGmN27Zt2+TOO++UEydOyLvvvitz586VZs2amWNmzpwpNWrUMGGwcePGsnz5ctm1a5esXLlSSpcuLfXq1ZOxY8fK0KFDZfTo0RIREeGnqwNQUFFjBwBXgQY5Vbx4cfOoAU9r8Vq0aOE+pnr16lKhQgXZsGGDea6PtWvXNqHOkZCQICdPnpSdO3fm+H3Onj1r9ntuAIIHwQ4AfCwrK0sGDBggt99+u9x8883mteTkZFPjFhcX53Wshjjd5xzjGeqc/c6+3Pr2xcbGurfy5cv76KoAFEQEOwDwMe1r991338m8efN8/r2GDRtmaged7eDBgz7/ngAKDvrYAYAP9evXTxYvXixr166V66+/3v16mTJlzKCI48ePe9Xa6ahY3eccs3nzZq/Pc0bNOsdkFxkZaTYAwYkaOwDwAZfLZULdggULZNWqVVK5cmWv/fXr15fw8HBJTEx0v6bToej0JvHx8ea5Pu7YsUNSUlLcx+gI22LFiknNmjWv4tUACBTU2AGAj5pfdcTrp59+auayc/rEab+36Oho89izZ08ZNGiQGVChYa1///4mzOmIWKXTo2iA69atm4wfP958xvDhw81nUysHICcEOwDwgalTp5rHpk2ber2uU5r06NHDfD1x4kQJDQ01ExPraFYd8TplyhT3sYUKFTLNuH369DGBLyYmRrp37y5jxoy5ylcDIFAQ7ADAR02xFxMVFSWTJ082W24qVqwoS5YsyeezA2Ar+tgBAABYgmAHAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJgh0AAIAlCHYAAACWINgBAABYgmAHAABgCYIdAACAJfwa7NauXSvt2rWTcuXKSUhIiCxcuNBrv8vlkpEjR0rZsmUlOjpaWrRoIXv27PE65tdff5WuXbtKsWLFJC4uTnr27CmnT5++ylcCAAAQ5MEuNTVV6tatK5MnT85x//jx42XSpEkybdo02bRpk8TExEhCQoKkpaW5j9FQt3PnTlmxYoUsXrzYhMXevXtfxasAAAAoGML8+c1bt25ttpxobd0bb7whw4cPl/bt25vX5syZI6VLlzY1e126dJHdu3fL0qVLZcuWLdKgQQNzzFtvvSVt2rSRCRMmmJpAAACAYFFg+9jt379fkpOTTfOrIzY2Vho1aiQbNmwwz/VRm1+dUKf0+NDQUFPDl5uzZ8/KyZMnvTYAAIBAV2CDnYY6pTV0nvS5s08fS5Uq5bU/LCxMihcv7j4mJ+PGjTMh0dnKly/vk2sAAAC4mgpssPOlYcOGyYkTJ9zbwYMH/X1KAAAA9ga7MmXKmMejR496va7PnX36mJKS4rU/IyPDjJR1jslJZGSkGUXruQEAAAS6AhvsKleubMJZYmKi+zXtC6d95+Lj481zfTx+/Lhs27bNfcyqVaskKyvL9MUDAAAIJn4dFavzze3du9drwMT27dtNH7kKFSrIgAED5IUXXpCqVauaoDdixAgz0rVDhw7m+Bo1akirVq2kV69eZkqU9PR06devnxkxy4hYAAAQbPwa7LZu3Sp33323+/mgQYPMY/fu3WXWrFnyzDPPmLnudF46rZlr0qSJmd4kKirK/Z7333/fhLnmzZub0bCdOnUyc98BAAAEG78Gu6ZNm5r56nKjq1GMGTPGbLnR2r25c+f66AwBAAACR4HtYwcAAIBLQ7ADAACwBMEOAADAEgQ7AAAASxDsAAAALEGwAwAAsATBDgAAwBIEOwAAAEsQ7AAAACxBsAMAALAEwQ4AAMASBDsAAABLEOwAAAAsQbADAACwBMEOAHxg6tSpUqdOHSlWrJjZ4uPj5fPPP3fvT0tLk759+0qJEiWkSJEi0qlTJzl69KjXZxw4cEDatm0rhQsXllKlSsmQIUMkIyPDD1cDIFAQ7ADAB66//np5+eWXZdu2bbJ161Zp1qyZtG/fXnbu3Gn2Dxw4UBYtWiTz58+XNWvWyOHDh6Vjx47u92dmZppQd+7cOVm/fr3Mnj1bZs2aJSNHjvTjVQEo6ML8fQIAYKN27dp5PX/xxRdNLd7GjRtN6Hv33Xdl7ty5JvCpmTNnSo0aNcz+xo0by/Lly2XXrl2ycuVKKV26tNSrV0/Gjh0rQ4cOldGjR0tERISfrgxAQUaNHQD4mNa+zZs3T1JTU02TrNbipaenS4sWLdzHVK9eXSpUqCAbNmwwz/Wxdu3aJtQ5EhIS5OTJk+5av5ycPXvWHOO5AQgeBDsA8JEdO3aY/nORkZHyxBNPyIIFC6RmzZqSnJxsatzi4uK8jtcQp/uUPnqGOme/sy8348aNk9jYWPdWvnx5n1wbgIKJYAcAPnLTTTfJ9u3bZdOmTdKnTx/p3r27aV71pWHDhsmJEyfc28GDB336/QAULPSxAwAf0Vq5G2+80Xxdv3592bJli7z55pvSuXNnMyji+PHjXrV2Oiq2TJky5mt93Lx5s9fnOaNmnWNyorWDugEITtTYAcBVkpWVZfrAacgLDw+XxMRE976kpCQzvYn2wVP6qE25KSkp7mNWrFhhpk7R5lwAyAk1dgDgoybR1q1bmwERp06dMiNgV69eLcuWLTN933r27CmDBg2S4sWLm7DWv39/E+Z0RKxq2bKlCXDdunWT8ePHm351w4cPN3PfUSMHIDcEOwDwAa1pe/TRR+XIkSMmyOlkxRrq7rnnHrN/4sSJEhoaaiYm1lo8HfE6ZcoU9/sLFSokixcvNn3zNPDFxMSYPnpjxozx41UBKOgIdgDgAzpP3YVERUXJ5MmTzZabihUrypIlS3xwdgBsRR87AAAASxDsAAAALEGwAwAAsMQVBTudh0mH6GdkZOTfGQEAAODqBbszZ86YofqFCxeWWrVqmbmXlA7Xf/nlly/vTAAAAHD1g53Oz/TNN9+YOZl0ZJdDF7T+4IMPruyMAAAAcPWmO1m4cKEJcDqRZkhIiPt1rb3bt2/f5Z0JAAAArn6N3c8//yylSpU67/XU1FSvoAcAAIACHuwaNGgg//rXv9zPnTD3zjvvuNc5BAAAQAA0xb700ktmDcRdu3aZEbFvvvmm+Xr9+vWyZs2a/D9LALiK/v3vf8v06dNN15KPPvpIrrvuOnnvvfekcuXK0qRJE3+fHgDkb42dFmzbt283oa527dqyfPly0zS7YcMGqV+//uV8JAAUCB9//LFZtzU6Olq+/vprs46rOnHihLmpBQAr14qtUqWKzJgxI3/PBgD87IUXXpBp06bJo48+KvPmzXO/fvvtt5t9AGBlsMvKypK9e/dKSkqK+drTnXfemR/nBgBXnU66nlMZFhsbK8ePH/fLOQGAT4Pdxo0b5eGHH5Yff/xRXC6X1z4dSJGZmXk5HwsAflemTBlz01qpUiWv19etWyc33HCD384LAHwW7J544gn3yNiyZcsyxQkAa/Tq1Uv+8pe/yN///ndTth0+fNj0Hx48eLCMGDHC36cHAPkf7Pbs2WNGit14442X83YAKLCeffZZ072kefPmZvlEbZaNjIw0wU6XTQQA64Jdo0aNTFMFwQ6AbbSW7q9//asMGTLElHOnT5+WmjVrSpEiRfx9agDgm2Cnd61PP/20JCcnm+lOwsPDvfbXqVPncj4WAAqMiIgIE+gAwPpg16lTJ/P4+OOPe93l6kAKBk8ACDQdO3bM87GffPKJT88FAK56sNu/f/8VfVMAKEh0KhMACNpgV7Fixfw/EwDwk5kzZ/r7FADg6ga7zz77zKwPq/3p9OsLuffee/Pj3ADAb3TydZ2sWN10001m2UQAsCbYdejQwQyW0MJNv84NfewABLKTJ09K3759zXJiTllWqFAh6dy5s0yePJlmWwAFWmheD9R5nZw7Vv06t41QByDQJyjetGmTLF682Cwhppt+vXXrVvnzn//s79MDAN+sFQsANtIQt2zZMmnSpIn7tYSEBJkxY4a0atXKr+cGAPkW7CZNmpTXQ+Wpp57K87EAUJCUKFEix+ZWfe2aa67xyzkBQL4Hu4kTJ+bpOO1jR7ADEKiGDx8ugwYNkvfee0/KlCljXtP+xboSBWvFArAm2DF3HYBgMHXqVLOUWIUKFcymDhw4YNaL/fnnn2X69OnuY7/66is/nikA+KiPnQ6Y2LFjh5nf7lKaKtauXSuvvvqqbNu2TY4cOSILFizwGnHbo0cPmT17ttd7tK/L0qVL3c9//fVXs8TZokWLJDQ01KyK8eabb7KuI4DLcqFR/wBgZbAbMGCAWSO2Z8+eJtTdeeedsmHDBilcuLDpeNy0adM8fU5qaqrUrVvXLE2W25I+2lnZc/JQvWv21LVrVxMKV6xYIenp6fLYY49J7969Ze7cuZdzaQCC3KhRo/x9CgBwdYPdRx99JI888oj5WmvKfvjhB/nPf/5j+qT89a9/lS+//DJPn6MTHut2IRrknH4u2e3evdvU3m3ZskUaNGhgXnvrrbekTZs2MmHCBClXrtwlXxsAOE6fPm2mcfJUrFgxv50PAOTbPHaefvnlF3fYWrJkiTzwwANSrVo1U/OmTbL5afXq1Wb+PJ35vU+fPnLs2DH3Pq0ljIuLc4c61aJFC9Mkq/NQ5ebs2bNmElLPDQCc/sRt27aVmJgY90hY3bSsYVQsACtr7EqXLi27du2SsmXLmhoz7Wyszpw5Y2Zozy/aDKtNtJUrV5Z9+/bJc889Z2r4NNDp93FWwvAUFhYmxYsXN/tyM27cOHn++efz7TwB2ENbI1wul/z97383ZZ2O9AcAq4Od9mN78MEHTbDTQk9ryZTWklWvXj3fTq5Lly7ur7VPX506daRKlSqmFq958+aX/bnDhg0z0xk4tMaufPnyV3y+AALfN998YwZ0aSsBAARFsBs9erTcfPPNcvDgQdMM6wxo0Fq0Z599VnzlhhtukJIlS5qpCDTYaXOwLtTtKSMjw4yUza1fntLzzT4IAwBUw4YNTdlGsAMQVNOd3H///V7PdT3F7t27iy8dOnTI9LHTmkIVHx9vvq/eXdevX9+8tmrVKtPZuVGjRj49FwB2euedd+SJJ56Qn376ydzAhoeHe+3XlgMAsCrYvfLKK1KpUiXp3Lmzea7Nsh9//LEJXDqYIq8Fn44409o3z07L27dvN33kdNN+cDovnda+aR+7Z555Rm688UYzl52qUaOG6Yeni3ZPmzbNTHfSr18/04TLiFgAl0MnIdbyRrucOLTLifa700ed4gkArBoVqyHK6ZOm88fp9vnnn5uQNXjw4Dx/ztatW+UPf/iD2ZT2e9OvR44caZp1v/32W7n33nvNiFudM09r5f797397NaO+//77pl+fNs3qNCe6cPfbb799OZcFAGZ0v5ZDOkjr+++/Nzecno8AYF2NnY44dYKdTkisNXYtW7Y0tXiX0gSqExnrXXBuli1bdtHP0Jo9JiMGkF9+/PFH+eyzz0zrAAAERY2dzuWknYuVTnfijIrVkEYzBYBA1qxZMzMyFgCCJtjp3HIPP/yw3HPPPWYwg7N6xNdff81dLoCA1q5dOxk4cKAZ/a99h7X2znO7XC+//LLpo6dLMjrS0tKkb9++UqJECbO+tfYpPnr0qNf7Dhw4YCZM1iUbdd7OIUOGmNH/AJBvTbETJ040za5aazd+/HhTIClds/XJJ5+8nI8EgAJBR8SqMWPGnLfvcgdP6LKH06dPP29gmQbIf/3rXzJ//nyzyoUO/tIbZ2dZRv1eGup0ANn69etNGfvoo4+akbovvfTSZV8jAHtdVrDTQiWnQRJaSAFAIMu+NuyV0tH/Xbt2lRkzZsgLL7zgfv3EiRPy7rvvmj7C2vyrZs6caUb7b9y4URo3bizLly83q/ysXLnSrIJRr149GTt2rAwdOtTUKEZEROTruQII0qZYpdMB9O/f3/Sv0+2pp55ixBgAZKNNrVrr5vRFduj8mzpFk+frOsK/QoUKZkSu0kdddUdDnUOne9LVcnbu3HkVrwKA1TV2OlpVpyHRu8fbb7/dvKZNBzVr1pRFixaZvncAEKhSU1NlzZo1pn/buXPnvPbpTWxezZs3T7766ivTFJvT7AJa4xYXF+f1uoY4Z61rffQMdc5+Z19Ozp49azaHhkAAweOygp0uG6bNrtoZOPvr2kRAsAMQqHQQmM6JeebMGRPwdEqlX375xT14Ia/BTvsg/+UvfzHzfEZFRcnVMm7cODO5O4DgdFlNsbt37zYTBuc0saf2BwGAQKU3rToy9rfffpPo6GjT303nttMJ0idMmJDnz9GmVl3L+pZbbpGwsDCzaS3gpEmTzNda86a1gbosoicdFeusda2P2UfJOs9zWw972LBhpv+eszlTUwEIDpcV7K699lqz9Fd2+pre0QJAoNJy7Omnn5bQ0FCzAo42a+qE7DoDwHPPPZfnz9HVcHbs2GE+z9kaNGhgBlI4X+tAtMTERPd7kpKSTPOvroOt9FE/QwOiQ2sAixUrZrq+5ERX5tH9nhuA4HFZTbG6Nmvv3r3NYInbbrvN3cdO15DVZcEAIFBp2NJQp/RGVYOWjlTV6UgupfaraNGicvPNN3u9FhMTY+asc17Xlg8tM7W5VwOYDkjTMKcjYpWu6KMBrlu3biZYar+64cOHmwEZnksrAsAVBbsRI0aYQuu1114z1f6qXLlyZvj9pXQsBoCCRteJ1cEOVatWlbvuususXa197N57773zgtqV0jlBNUTqxMRaM6gjXqdMmeLerzWGumxjnz59TODTYNi9e/cc59gDgMsKdjrjuc67pCtPaF+UU6dOmdc16AFAoNOJf51y7cUXXzQTAmuwqlatmrzzzjtX9NmrV6/2eq6DKiZPnmy23FSsWFGWLFlyRd8XQPC45GCnnX51ZnYdQKEIdABsUqtWLbPutdMUO23aNFmwYIFpEtUpngDAusETt956q5kSAABs0759e5kzZ475Wkesan+3119/XTp06CBTp0719+kBQP73sdP1YHXU2KFDh8wUANrvw1P29RABIFDohMLa90199NFHZloSvZH9+OOPTX87bZYFAKuCXZcuXcyj50AJXRxbmy8ud5FsACgIdGJip4uJrtXasWNHM8BBa+50PjsAsC7Y7d+/P//PBAAKgBtvvFEWLlwo9913n1k+UQeJKZ1LjjnhAFjZx05Hxeqkmjpay3PT13RtRAAIVNrcOnjwYKlUqZI0atTIPVmw1t7pVCgAYF2wmz59ulSvXj3H0WQ6ggwAAtX9999vJiXeunWrLF261GslCafvHQBY1RSrs5+XLVs2x6XGjhw5kh/nBQB+o+uwZl+LVWcDAAAra+x03URdQiw7fU1XoAAAAEAArRU7YMAASU9Pl2bNmpnXtH/dM888Y6ZBAQAAQIAEuyFDhsixY8fMfHbnzp1zL40zdOhQ99qxAAAACIBgp3PVvfLKKzJixAiztFh0dLRZMDsyMjL/zxAAAAC+C3aOIkWKSMOGDa/kIwAAAODPwRMAAAAoeAh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJgh0AAIAlCHYAAACWINgBAABYgmAHAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJgh0AAIAlCHYAAACWINgBAABYgmAHAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwA+MHr0aAkJCfHaqlev7t6flpYmffv2lRIlSkiRIkWkU6dOcvToUa/POHDggLRt21YKFy4spUqVkiFDhkhGRoYfrgZAoPBrsBs3bpw0bNhQihYtagqtDh06SFJSktcxFH4AAlWtWrXkyJEj7m3dunXufQMHDpRFixbJ/PnzZc2aNXL48GHp2LGje39mZqYp186dOyfr16+X2bNny6xZs2TkyJF+uhoAgcCvwU4LMw1tGzdulBUrVkh6erq0bNlSUlNT3cdQ+AEIVGFhYVKmTBn3VrJkSfP6iRMn5N1335XXX39dmjVrJvXr15eZM2eaMkzLQ7V8+XLZtWuX/OMf/5B69epJ69atZezYsTJ58mRT3gFAgQt2S5culR49epi72rp165pAprVv27ZtM/sp/AAEsj179ki5cuXkhhtukK5du5ryTWkZpzeyLVq0cB+rzbQVKlSQDRs2mOf6WLt2bSldurT7mISEBDl58qTs3LnTD1cDIBAUqD52GuRU8eLFfVr4nT171uz33AAgPzVq1MjcrOoN7NSpU2X//v1yxx13yKlTpyQ5OVkiIiIkLi7O6z1ajuk+pY+e5Zqz39mXG8o3ILiFSQGRlZUlAwYMkNtvv11uvvlm85qvCj/t2/f888/76EoAQEzrgaNOnTom6FWsWFE+/PBDiY6O9tn3pXwDgluBqbHTvnbfffedzJs3z+ffa9iwYaZ20NkOHjzo8+8JILjpDWq1atVk7969pr+ddhU5fvy41zE6MEz3KX3MPlDMee4ckxPKNyC4FYhg169fP1m8eLF88cUXcv3117tf91XhFxkZKcWKFfPaAMCXTp8+Lfv27ZOyZcua/sLh4eGSmJjo3q8zAmgfvPj4ePNcH3fs2CEpKSnuY3SQmZZXNWvWzPX7UL4Bwc2vwc7lcplQt2DBAlm1apVUrlzZa78vCz8A8KXBgwebkfw//PCDGfB13333SaFCheShhx6S2NhY6dmzpwwaNMjc0Gp/4scee8yUZ40bNzbv1xkCtAzr1q2bfPPNN7Js2TIZPny4ad3Q8AYABa6PnRZQc+fOlU8//dTMZef0idNCT/ugeBZ+OqBCw1r//v1zLfzGjx9vPoPCD4C/HTp0yIS4Y8eOybXXXitNmjQxo/n1azVx4kQJDQ01c3PqgAcd9DVlyhT3+zUEaktGnz59TJkXExMj3bt3lzFjxvjxqgAUdH4NdjpSTDVt2tTrdZ3SRKdBURR+AALRxfoLR0VFmWmZdMuNDrZYsmSJD84OgK3C/N0UezEUfgAAAAE0eAIAAABXjmAHAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJgh0AAIAlCHYAAACWINgBAABYgmAHAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJgh0AAIAlCHYAAACWINgBAABYgmAHAABgCYIdAACAJQh2AAAAliDYAQAAWIJgBwAAYAmCHQAAgCUIdgAAAJYg2AEAAFiCYAcAAGAJgh0AAIAlCHYAAACWINgBAABYgmAHAABgCYIdAACAJQh2AAAAliDYAYCP/PTTT/LII49IiRIlJDo6WmrXri1bt25173e5XDJy5EgpW7as2d+iRQvZs2eP12f8+uuv0rVrVylWrJjExcVJz5495fTp0364GgCBgGAHAD7w22+/ye233y7h4eHy+eefy65du+S1116Ta665xn3M+PHjZdKkSTJt2jTZtGmTxMTESEJCgqSlpbmP0VC3c+dOWbFihSxevFjWrl0rvXv39tNVASjowvx9AgBgo1deeUXKly8vM2fOdL9WuXJlr9q6N954Q4YPHy7t27c3r82ZM0dKly4tCxculC5dusju3btl6dKlsmXLFmnQoIE55q233pI2bdrIhAkTpFy5cn64MgAFGTV2AOADn332mQljDzzwgJQqVUr+8Ic/yIwZM9z79+/fL8nJyab51REbGyuNGjWSDRs2mOf6qM2vTqhTenxoaKip4cvJ2bNn5eTJk14bgOBBsAMAH/j+++9l6tSpUrVqVVm2bJn06dNHnnrqKZk9e7bZr6FOaQ2dJ33u7NNHDYWewsLCpHjx4u5jshs3bpwJiM6mtYYAggfBDgB8ICsrS2655RZ56aWXTG2d9ovr1auX6U/nS8OGDZMTJ064t4MHD/r0+wEoWAh2AOADOtK1Zs2aXq/VqFFDDhw4YL4uU6aMeTx69KjXMfrc2aePKSkpXvszMjLMSFnnmOwiIyPNCFrPDUDwINgBgA/oiNikpCSv1/773/9KxYoV3QMpNJwlJia692t/OO07Fx8fb57r4/Hjx2Xbtm3uY1atWmVqA7UvHgBkx6hYAPCBgQMHym233WaaYh988EHZvHmzvP3222ZTISEhMmDAAHnhhRdMPzwNeiNGjDAjXTt06OCu4WvVqpW7CTc9PV369etnRswyIhZATgh2AOADDRs2lAULFpg+b2PGjDHBTac30XnpHM8884ykpqaa/ndaM9ekSRMzvUlUVJT7mPfff9+EuebNm5vRsJ06dTJz3wFATgh2AOAjf/zjH82WG62109CnW250BOzcuXN9dIYAbEMfOwAAAEsQ7AAAACzh12CnE2lqP5SiRYuaSTi1w3D2UWRNmzY1zRWe2xNPPOF1jE4f0LZtWylcuLD5nCFDhpgpAQAAAIKJX/vYrVmzRvr27WvCnQax5557Tlq2bGkWy9bFsB06IsyzD4oGOEdmZqYJdTptwPr16+XIkSPy6KOPmoW3dTQaAABAsPBrsNPRX55mzZplatx0zqY777zTK8jlNhnn8uXLTRBcuXKlWYqnXr16MnbsWBk6dKiMHj1aIiIifH4dAAAABUGB6mOny984o8A86XD/kiVLys0332ymDjhz5ox7ny6SXbt2ba/1FhMSEsxEnzt37szx+7BINgAAsFGBme5EZ1LXyTp1tnYNcI6HH37YzNSuk3F+++23piZO++F98sknZr8uhJ3TItrOvtz69j3//PM+vR4AAICgDXba1+67776TdevWeb2uE3c6tGZO11/UiTr37dsnVapUuazvpbV+gwYNcj/XGrvy5ctfwdkDAAD4X4FoitVZ1RcvXixffPGFXH/99Rc81lkfce/eveZR+97ltIi2sy8nLJINAABs5Ndg53K5TKjTZXd0YWtdcuditm/fbh615s5ZJHvHjh2SkpLiPmbFihUmrNWsWdOHZw8AAFCwhPm7+VWXyvn000/NXHZOn7jY2FiJjo42za26v02bNlKiRAnTx04X1tYRs3Xq1DHH6vQoGuC6desm48ePN58xfPhw89laMwcAABAs/FpjN3XqVDMSVich1ho4Z/vggw/Mfp2qRKcx0fBWvXp1efrpp80C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\",\n", - " \"text/plain\": [\n", - " \"
\"\n", - " ]\n", - " },\n", - " \"metadata\": {},\n", - " \"output_type\": \"display_data\"\n", - " }\n", - " ],\n", - " \"source\": [\n", - " \"fig, ax = plt.subplots(1, 2, sharex=\\\"all\\\")\\n\",\n", - " \"ax[0].imshow(writer.live_mask[:].T, aspect=\\\"auto\\\")\\n\",\n", - " \"ax[1].imshow(reader[:, 150].T, aspect=\\\"auto\\\")\\n\",\n", - " \"\\n\",\n", - " \"ax[0].set_xlabel(\\\"inline\\\")\\n\",\n", - " \"ax[0].set_ylabel(\\\"crossline\\\")\\n\",\n", - " \"ax[1].set_xlabel(\\\"inline\\\")\\n\",\n", - " \"ax[1].set_ylabel(\\\"sample\\\")\\n\",\n", - " \"ax[0].set_title(\\\"Live Mask\\\")\\n\",\n", - " \"ax[1].set_title(\\\"Middle Crossline\\\")\\n\",\n", - " \"fig.tight_layout();\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"## Write to SEG-Y\\n\",\n", - " \"\\n\",\n", - " \"Because we populated all the fields necessary for SEG-Y output, we can call the\\n\",\n", - " \"MDIO to SEGY converter and get a file out.\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 7,\n", - " \"metadata\": {\n", - " \"ExecuteTime\": {\n", - " \"end_time\": \"2025-04-16T14:50:15.788812Z\",\n", - " \"start_time\": \"2025-04-16T14:50:15.009889Z\"\n", - " }\n", - " },\n", - " \"outputs\": [\n", - " {\n", - " \"name\": \"stderr\",\n", - " \"output_type\": \"stream\",\n", - " \"text\": [\n", - " \"Unwrapping MDIO Blocks: 100%|██████████| 7/7 [00:00<00:00, 10.55it/s]\\n\",\n", - " \"Merging lines: 100%|██████████| 1/1 [00:00<00:00, 17.26it/s]\"\n", - " ]\n", - " },\n", - " {\n", - " \"name\": \"stdout\",\n", - " \"output_type\": \"stream\",\n", - " \"text\": [\n", - " \"[(0, 0, 0, 0, 0, 4, 4000, 750, 750, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0)]\\n\",\n", - " \"[[1. 1. 1. ... 1. 1. 1.]\\n\",\n", - " \" [1. 1. 1. ... 1. 1. 1.]\\n\",\n", - " \" [1. 1. 1. ... 1. 1. 1.]\\n\",\n", - " \" ...\\n\",\n", - " \" [1. 1. 1. ... 1. 1. 1.]\\n\",\n", - " \" [1. 1. 1. ... 1. 1. 1.]\\n\",\n", - " \" [1. 1. 1. ... 1. 1. 1.]]\\n\"\n", - " ]\n", - " },\n", - " {\n", - " \"name\": \"stderr\",\n", - " \"output_type\": \"stream\",\n", - " \"text\": [\n", - " \"\\n\"\n", - " ]\n", - " }\n", - " ],\n", - " \"source\": [\n", - " \"from segy import SegyFile\\n\",\n", - " \"\\n\",\n", - " \"from mdio import mdio_to_segy\\n\",\n", - " \"\\n\",\n", - " \"mdio_to_segy(\\\"demo.mdio\\\", \\\"demo.segy\\\")\\n\",\n", - " \"segy = SegyFile(\\\"demo.segy\\\")\\n\",\n", - " \"print(segy.binary_header)\\n\",\n", - " \"print(segy.sample[:100])\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"markdown\",\n", - " \"metadata\": {},\n", - " \"source\": [\n", - " \"## Copying an Existing MDIO without Data and Headers\\n\",\n", - " \"\\n\",\n", - " \"We also provide a `create_empty_like` function which allows us to create an MDIO file\\n\",\n", - " \"with the same structure and basic metadata as an existing one.\\n\",\n", - " \"\\n\",\n", - " \"This will carry over:\\n\",\n", - " \"* All access patterns in source MDIO\\n\",\n", - " \"* Grid (shape, coordinates, dimensions, etc)\\n\",\n", - " \"* Text Header\\n\",\n", - " \"* Binary Header\\n\",\n", - " \"\\n\",\n", - " \"It will **NOT** carry over:\\n\",\n", - " \"* Trace data\\n\",\n", - " \"* Header data\\n\",\n", - " \"* Statistics\\n\",\n", - " \"* Live Mask\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": 8,\n", - " \"metadata\": {\n", - " \"ExecuteTime\": {\n", - " \"end_time\": \"2025-04-16T14:50:17.246513Z\",\n", - " \"start_time\": \"2025-04-16T14:50:17.111779Z\"\n", - " }\n", - " },\n", - " \"outputs\": [],\n", - " \"source\": [\n", - " \"from mdio import create_empty_like\\n\",\n", - " \"\\n\",\n", - " \"copy_path = \\\"copy_of_existing.mdio\\\"\\n\",\n", - " \"create_empty_like(create_conf.path, copy_path)\\n\",\n", - " \"\\n\",\n", - " \"copy_reader = MDIOReader(copy_path)\\n\",\n", - " \"assert copy_reader.shape == reader.shape\\n\",\n", - " \"assert copy_reader.binary_header == reader.binary_header\\n\",\n", - " \"assert copy_reader.stats != reader.stats\"\n", - " ]\n", - " },\n", - " {\n", - " \"cell_type\": \"code\",\n", - " \"execution_count\": null,\n", - " \"metadata\": {},\n", - " \"outputs\": [],\n", - " \"source\": []\n", " }\n", " ],\n", " \"metadata\": {\n", From 793f3f149cf0ca0140b3f0051f37d4434905ab68 Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Tue, 29 Apr 2025 15:38:15 -0500 Subject: [PATCH 09/56] fix creation notebook --- docs/tutorials/creation.ipynb | 1225 ++++++++++++++++++++++----------- 1 file changed, 838 insertions(+), 387 deletions(-) diff --git a/docs/tutorials/creation.ipynb b/docs/tutorials/creation.ipynb index 25a67c4f8..73ff5b67d 100644 --- a/docs/tutorials/creation.ipynb +++ b/docs/tutorials/creation.ipynb @@ -13,396 +13,847 @@ " \"{\\n\",\n", " \" \\\"cells\\\": [\\n\",\n", " \" {\\n\",\n", - " \" \\\"cell_type\\\": \\\"markdown\\\",\\n\",\n", - " \" \\\"metadata\\\": {\\n\",\n", - " \" \\\"pycharm\\\": {\\n\",\n", - " \" \\\"name\\\": \\\"#%% md\\\\n\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"source\\\": [\\n\",\n", - " \" \\\"# Create an Empty MDIO\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"```{article-info}\\\\n\\\",\\n\",\n", - " \" \\\":author: Altay Sansal\\\\n\\\",\\n\",\n", - " \" \\\":date: \\\\\\\"{sub-ref}`today`\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\":read-time: \\\\\\\"{sub-ref}`wordcount-minutes` min read\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\":class-container: sd-p-0 sd-outline-muted sd-rounded-3 sd-font-weight-light\\\\n\\\",\\n\",\n", - " \" \\\"```\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"Here we will create an empty MDIO file and populate its fields.\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"```{warning}\\\\n\\\",\\n\",\n", - " \" \\\"For plotting, the notebook requires [Matplotlib](https://matplotlib.org/) as a dependency. Please install it before executing using\\\\n\\\",\\n\",\n", - " \" \\\"`pip install matplotlib` or `conda install matplotlib`.\\\\n\\\",\\n\",\n", - " \" \\\"```\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"We first need to import the configuration classes and create function to be able to create the empty MDIO.\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" },\\n\",\n", - " \" {\\n\",\n", - " \" \\\"cell_type\\\": \\\"code\\\",\\n\",\n", - " \" \\\"execution_count\\\": 2,\\n\",\n", - " \" \\\"metadata\\\": {\\n\",\n", - " \" \\\"ExecuteTime\\\": {\\n\",\n", - " \" \\\"end_time\\\": \\\"2025-04-16T14:50:04.371422Z\\\",\\n\",\n", - " \" \\\"start_time\\\": \\\"2025-04-16T14:50:04.368107Z\\\"\\n\",\n", - " \" },\\n\",\n", - " \" \\\"pycharm\\\": {\\n\",\n", - " \" \\\"name\\\": \\\"#%%\\\\n\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"outputs\\\": [],\\n\",\n", - " \" \\\"source\\\": [\\n\",\n", - " \" \\\"import matplotlib.pyplot as plt\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"from mdio import Dimension\\\\n\\\",\\n\",\n", - " \" \\\"from mdio import Grid\\\\n\\\",\\n\",\n", - " \" \\\"from mdio import MDIOCreateConfig\\\\n\\\",\\n\",\n", - " \" \\\"from mdio import MDIOReader\\\\n\\\",\\n\",\n", - " \" \\\"from mdio import MDIOVariableConfig\\\\n\\\",\\n\",\n", - " \" \\\"from mdio import MDIOWriter\\\\n\\\",\\n\",\n", - " \" \\\"from mdio import create_empty\\\\n\\\",\\n\",\n", - " \" \\\"from mdio.converters.segy import get_compressor\\\\n\\\",\\n\",\n", - " \" \\\"from mdio.segy.compat import mdio_segy_spec\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" },\\n\",\n", - " \" {\\n\",\n", - " \" \\\"cell_type\\\": \\\"markdown\\\",\\n\",\n", - " \" \\\"metadata\\\": {\\n\",\n", - " \" \\\"pycharm\\\": {\\n\",\n", - " \" \\\"name\\\": \\\"#%% md\\\\n\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"source\\\": [\\n\",\n", - " \" \\\"## Setting Up Grid Dimensions and Variable(s)\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"Let's try to create an MDIO file in 3D with known `inline`, `crossline`, and `sample`\\\\n\\\",\\n\",\n", - " \" \\\"dimensions. This is exactly like a 3D Post-Stack dataset.\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"We will use the standard `chunked_012` access pattern. All variable names must start\\\\n\\\",\\n\",\n", - " \" \\\"with `chunked_*` for `MDIOReader` to be able to open them with any access pattern.\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"We will also use an MDIO private utility function to get the compressor easily. The\\\\n\\\",\\n\",\n", - " \" \\\"compressor is fully customizable, but this function gives us ones available in SEG-Y\\\\n\\\",\\n\",\n", - " \" \\\"ingestion.\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"If we want headers, we can also provide `header_dtype` which is a Numpy `dtype`. Again,\\\\n\\\",\\n\",\n", - " \" \\\"we will be using the standard one MDIO uses for ingesting SEG-Ys. (Similar to SEG-Y Rev1).\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"At the end we create empty MDIO on local disk or cloud, based on the path string.\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" },\\n\",\n", - " \" {\\n\",\n", - " \" \\\"cell_type\\\": \\\"code\\\",\\n\",\n", - " \" \\\"execution_count\\\": 3,\\n\",\n", - " \" \\\"metadata\\\": {\\n\",\n", - " \" \\\"ExecuteTime\\\": {\\n\",\n", - " \" \\\"end_time\\\": \\\"2025-04-16T14:50:06.121450Z\\\",\\n\",\n", - " \" \\\"start_time\\\": \\\"2025-04-16T14:50:06.002634Z\\\"\\n\",\n", - " \" },\\n\",\n", - " \" \\\"pycharm\\\": {\\n\",\n", - " \" \\\"name\\\": \\\"#%%\\\\n\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"outputs\\\": [],\\n\",\n", - " \" \\\"source\\\": [\\n\",\n", - " \" \\\"grid = Grid(\\\\n\\\",\\n\",\n", - " \" \\\" dims=[\\\\n\\\",\\n\",\n", - " \" \\\" Dimension(name=\\\\\\\"inline\\\\\\\", coords=range(100, 300, 1)), # 100-300 with step 1\\\\n\\\",\\n\",\n", - " \" \\\" Dimension(name=\\\\\\\"crossline\\\\\\\", coords=range(1000, 1600, 2)), # 1000-1600 with step 2\\\\n\\\",\\n\",\n", - " \" \\\" Dimension(name=\\\\\\\"sample\\\\\\\", coords=range(0, 3000, 4)), # 0-3 seconds 4ms sample rate\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\")\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"compressor = get_compressor(lossless=True)\\\\n\\\",\\n\",\n", - " \" \\\"header_dtype = mdio_segy_spec().trace.header.dtype\\\\n\\\",\\n\",\n", - " \" \\\"variable = MDIOVariableConfig(\\\\n\\\",\\n\",\n", - " \" \\\" name=\\\\\\\"chunked_012\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" dtype=\\\\\\\"float32\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" chunks=(128, 128, 128),\\\\n\\\",\\n\",\n", - " \" \\\" compressors=compressor,\\\\n\\\",\\n\",\n", - " \" \\\" header_dtype=header_dtype,\\\\n\\\",\\n\",\n", - " \" \\\")\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"create_conf = MDIOCreateConfig(path=\\\\\\\"demo.mdio\\\\\\\", grid=grid, variables=[variable])\\\\n\\\",\\n\",\n", - " \" \\\"create_empty(config=create_conf);\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" },\\n\",\n", - " \" {\\n\",\n", - " \" \\\"cell_type\\\": \\\"markdown\\\",\\n\",\n", " \" \\\"metadata\\\": {},\\n\",\n", + " \" \\\"cell_type\\\": \\\"raw\\\",\\n\",\n", " \" \\\"source\\\": [\\n\",\n", - " \" \\\"## Populating the MDIO\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"Once empty MDIO is created, you can populate it with sample data, header data,\\\\n\\\",\\n\",\n", - " \" \\\"metadata, and statistics. The `live_mask` is automatically flipped to 1 after\\\\n\\\",\\n\",\n", - " \" \\\"every write. However, the consistency of the `live_mask` is up to the user. If\\\\n\\\",\\n\",\n", - " \" \\\"not populated correctly, at read time, traces may be skipped.\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"We will read the usual stats and as you can see they're all empty. Text header\\\\n\\\",\\n\",\n", - " \" \\\"and binary header are only required if we are going to export this back to SEG-Y,\\\\n\\\",\\n\",\n", - " \" \\\"and can be modified. We can edit these if necessary using the writer.\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" },\\n\",\n", - " \" {\\n\",\n", - " \" \\\"cell_type\\\": \\\"code\\\",\\n\",\n", - " \" \\\"execution_count\\\": 4,\\n\",\n", - " \" \\\"metadata\\\": {\\n\",\n", - " \" \\\"ExecuteTime\\\": {\\n\",\n", - " \" \\\"end_time\\\": \\\"2025-04-16T14:50:09.974442Z\\\",\\n\",\n", - " \" \\\"start_time\\\": \\\"2025-04-16T14:50:09.951257Z\\\"\\n\",\n", - " \" },\\n\",\n", - " \" \\\"pycharm\\\": {\\n\",\n", - " \" \\\"name\\\": \\\"#%%\\\\n\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"outputs\\\": [\\n\",\n", - " \" {\\n\",\n", - " \" \\\"data\\\": {\\n\",\n", - " \" \\\"text/plain\\\": [\\n\",\n", - " \" \\\"(['C00 ',\\\\n\\\",\\n\",\n", - " \" \\\" 'C01 ',\\\\n\\\",\\n\",\n", - " \" \\\" 'C02 ',\\\\n\\\",\\n\",\n", - " \" \\\" 'C03 ',\\\\n\\\",\\n\",\n", - " \" \\\" 'C04 '],\\\\n\\\",\\n\",\n", - " \" \\\" {},\\\\n\\\",\\n\",\n", - " \" \\\" {'rms': 0, 'min': 0, 'mean': 0, 'max': 0, 'std': 0})\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" },\\n\",\n", - " \" \\\"execution_count\\\": 4,\\n\",\n", - " \" \\\"metadata\\\": {},\\n\",\n", - " \" \\\"output_type\\\": \\\"execute_result\\\"\\n\",\n", - " \" }\\n\",\n", - " \" ],\\n\",\n", - " \" \\\"source\\\": [\\n\",\n", - " \" \\\"writer = MDIOWriter(create_conf.path)\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"# Truncate text header for display\\\\n\\\",\\n\",\n", - " \" \\\"writer.text_header[:5], writer.binary_header, writer.stats\\\"\\n\",\n", + " \" \\\"{\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"cells\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"markdown\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"pycharm\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"#%% md\\\\\\\\n\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"# Create an Empty MDIO\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"```{article-info}\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\":author: Altay Sansal\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\":date: \\\\\\\\\\\\\\\"{sub-ref}`today`\\\\\\\\\\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\":read-time: \\\\\\\\\\\\\\\"{sub-ref}`wordcount-minutes` min read\\\\\\\\\\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\":class-container: sd-p-0 sd-outline-muted sd-rounded-3 sd-font-weight-light\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"```\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"Here we will create an empty MDIO file and populate its fields.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"```{warning}\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"For plotting, the notebook requires [Matplotlib](https://matplotlib.org/) as a dependency. Please install it before executing using\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"`pip install matplotlib` or `conda install matplotlib`.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"```\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"We first need to import the configuration classes and create function to be able to create the empty MDIO.\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"code\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"execution_count\\\\\\\": 2,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ExecuteTime\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"end_time\\\\\\\": \\\\\\\"2025-04-16T14:50:04.371422Z\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"start_time\\\\\\\": \\\\\\\"2025-04-16T14:50:04.368107Z\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"pycharm\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"#%%\\\\\\\\n\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"outputs\\\\\\\": [],\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"import matplotlib.pyplot as plt\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"from mdio import Dimension\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"from mdio import Grid\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"from mdio import MDIOCreateConfig\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"from mdio import MDIOReader\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"from mdio import MDIOVariableConfig\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"from mdio import MDIOWriter\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"from mdio import create_empty\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"from mdio.converters.segy import get_compressor\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"from mdio.segy.compat import mdio_segy_spec\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"markdown\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"pycharm\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"#%% md\\\\\\\\n\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"## Setting Up Grid Dimensions and Variable(s)\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"Let's try to create an MDIO file in 3D with known `inline`, `crossline`, and `sample`\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"dimensions. This is exactly like a 3D Post-Stack dataset.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"We will use the standard `chunked_012` access pattern. All variable names must start\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"with `chunked_*` for `MDIOReader` to be able to open them with any access pattern.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"We will also use an MDIO private utility function to get the compressor easily. The\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"compressor is fully customizable, but this function gives us ones available in SEG-Y\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ingestion.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"If we want headers, we can also provide `header_dtype` which is a Numpy `dtype`. Again,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"we will be using the standard one MDIO uses for ingesting SEG-Ys. (Similar to SEG-Y Rev1).\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"At the end we create empty MDIO on local disk or cloud, based on the path string.\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"code\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"execution_count\\\\\\\": 3,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ExecuteTime\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"end_time\\\\\\\": \\\\\\\"2025-04-16T14:50:06.121450Z\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"start_time\\\\\\\": \\\\\\\"2025-04-16T14:50:06.002634Z\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"pycharm\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"#%%\\\\\\\\n\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"outputs\\\\\\\": [],\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"grid = Grid(\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" dims=[\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" Dimension(name=\\\\\\\\\\\\\\\"inline\\\\\\\\\\\\\\\", coords=range(100, 300, 1)), # 100-300 with step 1\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" Dimension(name=\\\\\\\\\\\\\\\"crossline\\\\\\\\\\\\\\\", coords=range(1000, 1600, 2)), # 1000-1600 with step 2\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" Dimension(name=\\\\\\\\\\\\\\\"sample\\\\\\\\\\\\\\\", coords=range(0, 3000, 4)), # 0-3 seconds 4ms sample rate\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" ]\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"compressor = get_compressor(lossless=True)\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"header_dtype = mdio_segy_spec().trace.header.dtype\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"variable = MDIOVariableConfig(\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" name=\\\\\\\\\\\\\\\"chunked_012\\\\\\\\\\\\\\\",\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" dtype=\\\\\\\\\\\\\\\"float32\\\\\\\\\\\\\\\",\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" chunks=(128, 128, 128),\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" compressors=compressor,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" header_dtype=header_dtype,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"create_conf = MDIOCreateConfig(path=\\\\\\\\\\\\\\\"demo.mdio\\\\\\\\\\\\\\\", grid=grid, variables=[variable])\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"create_empty(config=create_conf);\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"markdown\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {},\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"## Populating the MDIO\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"Once empty MDIO is created, you can populate it with sample data, header data,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata, and statistics. The `live_mask` is automatically flipped to 1 after\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"every write. However, the consistency of the `live_mask` is up to the user. If\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"not populated correctly, at read time, traces may be skipped.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"We will read the usual stats and as you can see they're all empty. Text header\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"and binary header are only required if we are going to export this back to SEG-Y,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"and can be modified. We can edit these if necessary using the writer.\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"code\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"execution_count\\\\\\\": 4,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ExecuteTime\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"end_time\\\\\\\": \\\\\\\"2025-04-16T14:50:09.974442Z\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"start_time\\\\\\\": \\\\\\\"2025-04-16T14:50:09.951257Z\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"pycharm\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"#%%\\\\\\\\n\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"outputs\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"data\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"text/plain\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"(['C00 ',\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" 'C01 ',\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" 'C02 ',\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" 'C03 ',\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" 'C04 '],\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" {},\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" {'rms': 0, 'min': 0, 'mean': 0, 'max': 0, 'std': 0})\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"execution_count\\\\\\\": 4,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {},\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"output_type\\\\\\\": \\\\\\\"execute_result\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" ],\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"writer = MDIOWriter(create_conf.path)\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"# Truncate text header for display\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"writer.text_header[:5], writer.binary_header, writer.stats\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"markdown\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {},\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"## Updating File and Checking with `MDIOReader`.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"We write traces here, the headers are still empty. If you need the headers\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"populated, this is where they would be written to file as well.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"All the extra metadata we are writing is so that we can export back to SEG-Y\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"in the future. If that's not a requirement most of the metadata can be\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"omitted.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"If you already have an MDIO prior to this, all the metadata can be copied\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"over from the previous version.\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"code\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"execution_count\\\\\\\": 5,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ExecuteTime\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"end_time\\\\\\\": \\\\\\\"2025-04-16T14:50:12.498287Z\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"start_time\\\\\\\": \\\\\\\"2025-04-16T14:50:11.670230Z\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"pycharm\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"#%%\\\\\\\\n\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"outputs\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"data\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"text/plain\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"({'data_sample_format': 1,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" 'sample_interval': 4,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" 'samples_per_trace': 750,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" 'segy_revision_major': 1,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" 'segy_revision_minor': 0},\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" {'rms': 3, 'min': -4, 'mean': 12, 'max': 4, 'std': 5})\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"execution_count\\\\\\\": 5,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {},\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"output_type\\\\\\\": \\\\\\\"execute_result\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" ],\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"sample_dim = writer.grid.select_dim(\\\\\\\\\\\\\\\"sample\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"sample_interval = int(sample_dim.coords[1] - sample_dim.coords[0])\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"num_samples = sample_dim.size\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"writer.binary_header = {\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" \\\\\\\\\\\\\\\"data_sample_format\\\\\\\\\\\\\\\": 1,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" \\\\\\\\\\\\\\\"sample_interval\\\\\\\\\\\\\\\": sample_interval,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" \\\\\\\\\\\\\\\"samples_per_trace\\\\\\\\\\\\\\\": num_samples,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" \\\\\\\\\\\\\\\"segy_revision_major\\\\\\\\\\\\\\\": 1,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" \\\\\\\\\\\\\\\"segy_revision_minor\\\\\\\\\\\\\\\": 0,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"}\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"# Write some values to the file\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"writer[:5] = 1\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"writer[5:10] = 2\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"writer[50:100] = 3\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"writer[150:175] = -1\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"# Write some made up stats\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"writer.stats = {\\\\\\\\\\\\\\\"mean\\\\\\\\\\\\\\\": 12, \\\\\\\\\\\\\\\"std\\\\\\\\\\\\\\\": 5, \\\\\\\\\\\\\\\"rms\\\\\\\\\\\\\\\": 3, \\\\\\\\\\\\\\\"min\\\\\\\\\\\\\\\": -4, \\\\\\\\\\\\\\\"max\\\\\\\\\\\\\\\": 4}\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"reader = MDIOReader(create_conf.path)\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"reader.binary_header, reader.stats\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"markdown\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {},\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"source\\\\\\\": \\\\\\\"Plot some of the data we populated:\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"code\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"execution_count\\\\\\\": 6,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ExecuteTime\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"end_time\\\\\\\": \\\\\\\"2025-04-16T14:50:14.256953Z\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"start_time\\\\\\\": \\\\\\\"2025-04-16T14:50:14.036094Z\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"outputs\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"data\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"image/png\\\\\\\": \\\\\\\"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+wEoWAh2AOADOtK1Zs2aXq/VqFFDDhw4YL4uU6aMeTx69KjXMfrc2aePKSkpXvszMjLMSFnnmOwiIyPNCFrPDUDwINgBgA/oiNikpCSv1/773/9KxYoV3QMpNJwlJia692t/OO07Fx8fb57r4/Hjx2Xbtm3uY1atWmVqA7UvHgBkx6hYAPCBgQMHym233WaaYh988EHZvHmzvP3222ZTISEhMmDAAHnhhRdMPzwNeiNGjDAjXTt06OCu4WvVqpW7CTc9PV369etnRswyIhZATgh2AOADDRs2lAULFpg+b2PGjDHBTac30XnpHM8884ykpqaa/ndaM9ekSRMzvUlUVJT7mPfff9+EuebNm5vRsJ06dTJz3wFATgh2AOAjf/zjH82WG62109CnW250BOzcuXN9dIYAbEMfOwAAAEsQ7AAAACzh12CnE2lqP5SiRYuaSTi1w3D2UWRNmzY1zRWe2xNPPOF1jE4f0LZtWylcuLD5nCFDhpgpAQAAAIKJX/vYrVmzRvr27WvCnQax5557Tlq2bGkWy9bFsB06IsyzD4oGOEdmZqYJdTptwPr16+XIkSPy6KOPmoW3dTQaAABAsPBrsNPRX55mzZplatx0zqY777zTK8jlNhnn8uXLTRBcuXKlWYqnXr16MnbsWBk6dKiMHj1aIiIifH4dAAAABUGB6mOny984o8A86XD/kiVLys0332ymDjhz5ox7ny6SXbt2ba/1FhMSEsxEnzt37szx+7BINgAAsFGBme5EZ1LXyTp1tnYNcI6HH37YzNSuk3F+++23piZO++F98sknZr8uhJ3TItrOvtz69j3//PM+vR4AAICgDXba1+67776TdevWeb2uE3c6tGZO11/UiTr37dsnVapUuazvpbV+gwYNcj/XGrvy5ctfwdkDAAD4X4FoitVZ1RcvXixffPGFXH/99Rc81lkfce/eveZR+97ltIi2sy8nLJINAABs5Ndg53K5TKjTZXd0YWtdcuditm/fbh615s5ZJHvHjh2SkpLiPmbFihUmrNWsWdOHZw8AAFCwhPm7+VWXyvn000/NXHZOn7jY2FiJjo42za26v02bNlKiRAnTx04X1tYRs3Xq1DHH6vQoGuC6desm48ePN58xfPhw89laMwcAABAs/FpjN3XqVDMSVich1ho4Z/vggw/Mfp2qRKcx0fBWvXp1efrpp80C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\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"text/plain\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"
\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {},\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"output_type\\\\\\\": \\\\\\\"display_data\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" ],\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"fig, ax = plt.subplots(1, 2, sharex=\\\\\\\\\\\\\\\"all\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ax[0].imshow(writer.live_mask[:].T, aspect=\\\\\\\\\\\\\\\"auto\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ax[1].imshow(reader[:, 150].T, aspect=\\\\\\\\\\\\\\\"auto\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ax[0].set_xlabel(\\\\\\\\\\\\\\\"inline\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ax[0].set_ylabel(\\\\\\\\\\\\\\\"crossline\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ax[1].set_xlabel(\\\\\\\\\\\\\\\"inline\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ax[1].set_ylabel(\\\\\\\\\\\\\\\"sample\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ax[0].set_title(\\\\\\\\\\\\\\\"Live Mask\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ax[1].set_title(\\\\\\\\\\\\\\\"Middle Crossline\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"fig.tight_layout();\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"markdown\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {},\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"## Write to SEG-Y\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"Because we populated all the fields necessary for SEG-Y output, we can call the\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"MDIO to SEGY converter and get a file out.\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"code\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"execution_count\\\\\\\": 7,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ExecuteTime\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"end_time\\\\\\\": \\\\\\\"2025-04-16T14:50:15.788812Z\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"start_time\\\\\\\": \\\\\\\"2025-04-16T14:50:15.009889Z\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"outputs\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"stderr\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"output_type\\\\\\\": \\\\\\\"stream\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"text\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"Unwrapping MDIO Blocks: 100%|██████████| 7/7 [00:00<00:00, 10.55it/s]\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"Merging lines: 100%|██████████| 1/1 [00:00<00:00, 17.26it/s]\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"stdout\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"output_type\\\\\\\": \\\\\\\"stream\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"text\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"[(0, 0, 0, 0, 0, 4, 4000, 750, 750, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0)]\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"[[1. 1. 1. ... 1. 1. 1.]\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" [1. 1. 1. ... 1. 1. 1.]\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" [1. 1. 1. ... 1. 1. 1.]\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" ...\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" [1. 1. 1. ... 1. 1. 1.]\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" [1. 1. 1. ... 1. 1. 1.]\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\" [1. 1. 1. ... 1. 1. 1.]]\\\\\\\\n\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"stderr\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"output_type\\\\\\\": \\\\\\\"stream\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"text\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" ],\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"from segy import SegyFile\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"from mdio import mdio_to_segy\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"mdio_to_segy(\\\\\\\\\\\\\\\"demo.mdio\\\\\\\\\\\\\\\", \\\\\\\\\\\\\\\"demo.segy\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"segy = SegyFile(\\\\\\\\\\\\\\\"demo.segy\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"print(segy.binary_header)\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"print(segy.sample[:100])\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"markdown\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {},\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"## Copying an Existing MDIO without Data and Headers\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"We also provide a `create_empty_like` function which allows us to create an MDIO file\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"with the same structure and basic metadata as an existing one.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"This will carry over:\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"* All access patterns in source MDIO\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"* Grid (shape, coordinates, dimensions, etc)\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"* Text Header\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"* Binary Header\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"It will **NOT** carry over:\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"* Trace data\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"* Header data\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"* Statistics\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"* Live Mask\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"code\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"execution_count\\\\\\\": 8,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ExecuteTime\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"end_time\\\\\\\": \\\\\\\"2025-04-16T14:50:17.246513Z\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"start_time\\\\\\\": \\\\\\\"2025-04-16T14:50:17.111779Z\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"outputs\\\\\\\": [],\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"from mdio import create_empty_like\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"copy_path = \\\\\\\\\\\\\\\"copy_of_existing.mdio\\\\\\\\\\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"create_empty_like(create_conf.path, copy_path)\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"copy_reader = MDIOReader(copy_path)\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"assert copy_reader.shape == reader.shape\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"assert copy_reader.binary_header == reader.binary_header\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"assert copy_reader.stats != reader.stats\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ]\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"code\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"execution_count\\\\\\\": null,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {},\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"outputs\\\\\\\": [],\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"source\\\\\\\": []\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" ],\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"kernelspec\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"display_name\\\\\\\": \\\\\\\"Python 3 (ipykernel)\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"language\\\\\\\": \\\\\\\"python\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"python3\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"language_info\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"codemirror_mode\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"ipython\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"version\\\\\\\": 3\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"file_extension\\\\\\\": \\\\\\\".py\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"mimetype\\\\\\\": \\\\\\\"text/x-python\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"python\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"nbconvert_exporter\\\\\\\": \\\\\\\"python\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"pygments_lexer\\\\\\\": \\\\\\\"ipython3\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"version\\\\\\\": \\\\\\\"3.12.3\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"widgets\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"application/vnd.jupyter.widget-state+json\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"104c0d4e90244ebc959e51a58794dcf4\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"display\\\\\\\": \\\\\\\"inline-flex\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"flex_flow\\\\\\\": \\\\\\\"row wrap\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"width\\\\\\\": \\\\\\\"100%\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"1c0f5b458ee1401eaa8de63c65802073\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"font_size\\\\\\\": null,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"text_color\\\\\\\": null\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"21b25dd6080d42368afc06770d5e1755\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_35fb49026dac479eba87217c2f6bcb9a\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_3ab3e27c83aa423d9ecdac94e576f0fe\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"value\\\\\\\": \\\\\\\"Ingesting SEG-Y in 6 chunks: 100%\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"2693aae410f04e7587f0400b5eef1079\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"ProgressStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"318aea09479a479981dcfa29bc856c67\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"ProgressStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"35fb49026dac479eba87217c2f6bcb9a\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {}\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"3ab3e27c83aa423d9ecdac94e576f0fe\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"font_size\\\\\\\": null,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"text_color\\\\\\\": null\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"420b4a9492c54eb48d7779f38a09fd20\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"flex\\\\\\\": \\\\\\\"2\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"42afe4fae9dd4bc4a341a231cf7a9c32\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {}\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"4df685a95de542ffab6f265df89b8949\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"font_size\\\\\\\": null,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"text_color\\\\\\\": null\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"58eaddb54c8840da83d1f6503d6ba64f\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {}\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"5b3e72b71f304230bc36bb91f9c173be\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"font_size\\\\\\\": null,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"text_color\\\\\\\": null\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"5c1fab0ccc7e42c69c2b663b67ca9e3c\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {}\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"63a54817ae8b4c8d85b30d8c97e7ed0d\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HBoxModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"children\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"IPY_MODEL_e170d60a55a14c489d32b101293a9d33\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"IPY_MODEL_662ad93cf7b3470f8e197350441f09ca\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"IPY_MODEL_ac4abab2367e461e956e4e0edb27be44\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ],\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_c59d6fe969a04f4da332ae2a6fdb9c77\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"63f87a2410ba47d38ad9f55a81357a29\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_ca48140488574a28a7469552441560e4\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_ae2037efb9cc459e84bcc28ca7243437\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"value\\\\\\\": \\\\\\\" 2/2 [00:03<00:00, 3.01s/block]\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"64eb2b9c8a094a1ea5f1991e5f09f5d9\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {}\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"662ad93cf7b3470f8e197350441f09ca\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"FloatProgressModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"bar_style\\\\\\\": \\\\\\\"success\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_420b4a9492c54eb48d7779f38a09fd20\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"max\\\\\\\": 1,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_d16e93f72f3d4aeda2f5deee87e9754f\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"value\\\\\\\": 1\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"74283969ff5446c89bb83b00a70226cf\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_5c1fab0ccc7e42c69c2b663b67ca9e3c\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_1c0f5b458ee1401eaa8de63c65802073\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"value\\\\\\\": \\\\\\\" 6/6 [00:09<00:00, 2.48s/block]\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"75cf0c1ed25e47aab20b060f3bb44fb8\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HBoxModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"children\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"IPY_MODEL_21b25dd6080d42368afc06770d5e1755\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"IPY_MODEL_c33f32b62a204ef094f67b10f8adbdc1\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"IPY_MODEL_74283969ff5446c89bb83b00a70226cf\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ],\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_91df4ac76fd744539d4237d6099f34a5\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"7ff32d7deac14f21ab0f0939fe09e440\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"ProgressStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"91df4ac76fd744539d4237d6099f34a5\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"display\\\\\\\": \\\\\\\"inline-flex\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"flex_flow\\\\\\\": \\\\\\\"row wrap\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"width\\\\\\\": \\\\\\\"100%\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"981634b52a7a4ffdae6186061c0b6482\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HBoxModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"children\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"IPY_MODEL_f65266f861cf40ef84e9ec74a8e0b44c\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"IPY_MODEL_9aaf514a5035413d8cbbad58aa0221f4\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"IPY_MODEL_63f87a2410ba47d38ad9f55a81357a29\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ],\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_104c0d4e90244ebc959e51a58794dcf4\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"9aaf514a5035413d8cbbad58aa0221f4\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"FloatProgressModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"bar_style\\\\\\\": \\\\\\\"success\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_b25523a221fd4b5e9211d07ef39cccf5\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"max\\\\\\\": 2,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_318aea09479a479981dcfa29bc856c67\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"value\\\\\\\": 2\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"9fe5348964cd4f7880bcd33204bbc7a2\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {}\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"a03d238db31145b881a1be478f9eb72f\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"font_size\\\\\\\": null,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"text_color\\\\\\\": null\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"a6aabcd2e57348a49bb59477f6a9fd90\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"FloatProgressModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"bar_style\\\\\\\": \\\\\\\"success\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_cfb02c9c7447491ca00bbb6acd99bb79\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"max\\\\\\\": 26,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_7ff32d7deac14f21ab0f0939fe09e440\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"value\\\\\\\": 26\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ac4abab2367e461e956e4e0edb27be44\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_58eaddb54c8840da83d1f6503d6ba64f\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_a03d238db31145b881a1be478f9eb72f\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"value\\\\\\\": \\\\\\\" 3/? [00:00<00:00, 8.29block/s]\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ae2037efb9cc459e84bcc28ca7243437\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"font_size\\\\\\\": null,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"text_color\\\\\\\": null\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"b25523a221fd4b5e9211d07ef39cccf5\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"flex\\\\\\\": \\\\\\\"2\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"b9810ee38bbe43f4bba100e53379be65\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_42afe4fae9dd4bc4a341a231cf7a9c32\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_fdcea609ee7349629604217b625371d3\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"value\\\\\\\": \\\\\\\" 26/26 [00:01<00:00, 18.92block/s]\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"c33f32b62a204ef094f67b10f8adbdc1\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"FloatProgressModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"bar_style\\\\\\\": \\\\\\\"success\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_d23d88490a1b4941b8ca228b7d4a39cb\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"max\\\\\\\": 6,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_2693aae410f04e7587f0400b5eef1079\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"value\\\\\\\": 6\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"c59d6fe969a04f4da332ae2a6fdb9c77\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"display\\\\\\\": \\\\\\\"inline-flex\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"flex_flow\\\\\\\": \\\\\\\"row wrap\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"width\\\\\\\": \\\\\\\"100%\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"ca48140488574a28a7469552441560e4\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {}\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"cfb02c9c7447491ca00bbb6acd99bb79\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"flex\\\\\\\": \\\\\\\"2\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"d16e93f72f3d4aeda2f5deee87e9754f\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"ProgressStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"d23d88490a1b4941b8ca228b7d4a39cb\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"flex\\\\\\\": \\\\\\\"2\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"d565a20d37e84ed0a1195e9a90154960\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HBoxModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"children\\\\\\\": [\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"IPY_MODEL_db696e15587c4a54b82886b3eb5a0c96\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"IPY_MODEL_a6aabcd2e57348a49bb59477f6a9fd90\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"IPY_MODEL_b9810ee38bbe43f4bba100e53379be65\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" ],\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_eab4b060672b4dd5a73ca7bb8f782cd2\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"db696e15587c4a54b82886b3eb5a0c96\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_64eb2b9c8a094a1ea5f1991e5f09f5d9\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_5b3e72b71f304230bc36bb91f9c173be\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"value\\\\\\\": \\\\\\\"Step 1 / 2 Writing Blocks: 100%\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"e170d60a55a14c489d32b101293a9d33\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_9fe5348964cd4f7880bcd33204bbc7a2\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_4df685a95de542ffab6f265df89b8949\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"value\\\\\\\": \\\\\\\"Step 2 / 2 Concat Blocks: \\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"e66368cda8124001b16459a0634029e2\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"font_size\\\\\\\": null,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"text_color\\\\\\\": null\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"eab4b060672b4dd5a73ca7bb8f782cd2\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"display\\\\\\\": \\\\\\\"inline-flex\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"flex_flow\\\\\\\": \\\\\\\"row wrap\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"width\\\\\\\": \\\\\\\"100%\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"f65266f861cf40ef84e9ec74a8e0b44c\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_fff4199774534d9f982f03738fbb08e7\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_e66368cda8124001b16459a0634029e2\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"value\\\\\\\": \\\\\\\"Scanning SEG-Y for geometry attributes: 100%\\\\\\\"\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"fdcea609ee7349629604217b625371d3\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"font_size\\\\\\\": null,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"text_color\\\\\\\": null\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"fff4199774534d9f982f03738fbb08e7\\\\\\\": {\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"state\\\\\\\": {}\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"version_major\\\\\\\": 2,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"version_minor\\\\\\\": 0\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" }\\\\n\\\",\\n\",\n", + " \" \\\" },\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"nbformat\\\\\\\": 4,\\\\n\\\",\\n\",\n", + " \" \\\" \\\\\\\"nbformat_minor\\\\\\\": 4\\\\n\\\",\\n\",\n", + " \" \\\"}\\\\n\\\"\\n\",\n", " \" ]\\n\",\n", - " \" },\\n\",\n", - " \" {\\n\",\n", - " \" \\\"cell_type\\\": \\\"markdown\\\",\\n\",\n", - " \" \\\"metadata\\\": {},\\n\",\n", - " \" \\\"source\\\": [\\n\",\n", - " \" \\\"## Updating File and Checking with `MDIOReader`.\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"We write traces here, the headers are still empty. If you need the headers\\\\n\\\",\\n\",\n", - " \" \\\"populated, this is where they would be written to file as well.\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"All the extra metadata we are writing is so that we can export back to SEG-Y\\\\n\\\",\\n\",\n", - " \" \\\"in the future. If that's not a requirement most of the metadata can be\\\\n\\\",\\n\",\n", - " \" \\\"omitted.\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"If you already have an MDIO prior to this, all the metadata can be copied\\\\n\\\",\\n\",\n", - " \" \\\"over from the previous version.\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" },\\n\",\n", - " \" {\\n\",\n", - " \" \\\"cell_type\\\": \\\"code\\\",\\n\",\n", - " \" \\\"execution_count\\\": 5,\\n\",\n", - " \" \\\"metadata\\\": {\\n\",\n", - " \" \\\"ExecuteTime\\\": {\\n\",\n", - " \" \\\"end_time\\\": \\\"2025-04-16T14:50:12.498287Z\\\",\\n\",\n", - " \" \\\"start_time\\\": \\\"2025-04-16T14:50:11.670230Z\\\"\\n\",\n", - " \" },\\n\",\n", - " \" \\\"pycharm\\\": {\\n\",\n", - " \" \\\"name\\\": \\\"#%%\\\\n\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"outputs\\\": [\\n\",\n", - " \" {\\n\",\n", - " \" \\\"data\\\": {\\n\",\n", - " \" \\\"text/plain\\\": [\\n\",\n", - " \" \\\"({'data_sample_format': 1,\\\\n\\\",\\n\",\n", - " \" \\\" 'sample_interval': 4,\\\\n\\\",\\n\",\n", - " \" \\\" 'samples_per_trace': 750,\\\\n\\\",\\n\",\n", - " \" \\\" 'segy_revision_major': 1,\\\\n\\\",\\n\",\n", - " \" \\\" 'segy_revision_minor': 0},\\\\n\\\",\\n\",\n", - " \" \\\" {'rms': 3, 'min': -4, 'mean': 12, 'max': 4, 'std': 5})\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" },\\n\",\n", - " \" \\\"execution_count\\\": 5,\\n\",\n", - " \" \\\"metadata\\\": {},\\n\",\n", - " \" \\\"output_type\\\": \\\"execute_result\\\"\\n\",\n", - " \" }\\n\",\n", - " \" ],\\n\",\n", - " \" \\\"source\\\": [\\n\",\n", - " \" \\\"sample_dim = writer.grid.select_dim(\\\\\\\"sample\\\\\\\")\\\\n\\\",\\n\",\n", - " \" \\\"sample_interval = int(sample_dim.coords[1] - sample_dim.coords[0])\\\\n\\\",\\n\",\n", - " \" \\\"num_samples = sample_dim.size\\\\n\\\",\\n\",\n", - " \" \\\"writer.binary_header = {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"data_sample_format\\\\\\\": 1,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"sample_interval\\\\\\\": sample_interval,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"samples_per_trace\\\\\\\": num_samples,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"segy_revision_major\\\\\\\": 1,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"segy_revision_minor\\\\\\\": 0,\\\\n\\\",\\n\",\n", - " \" \\\"}\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"# Write some values to the file\\\\n\\\",\\n\",\n", - " \" \\\"writer[:5] = 1\\\\n\\\",\\n\",\n", - " \" \\\"writer[5:10] = 2\\\\n\\\",\\n\",\n", - " \" \\\"writer[50:100] = 3\\\\n\\\",\\n\",\n", - " \" \\\"writer[150:175] = -1\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"# Write some made up stats\\\\n\\\",\\n\",\n", - " \" \\\"writer.stats = {\\\\\\\"mean\\\\\\\": 12, \\\\\\\"std\\\\\\\": 5, \\\\\\\"rms\\\\\\\": 3, \\\\\\\"min\\\\\\\": -4, \\\\\\\"max\\\\\\\": 4}\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"reader = MDIOReader(create_conf.path)\\\\n\\\",\\n\",\n", - " \" \\\"reader.binary_header, reader.stats\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" },\\n\",\n", - " \" {\\n\",\n", - " \" \\\"cell_type\\\": \\\"markdown\\\",\\n\",\n", - " \" \\\"metadata\\\": {},\\n\",\n", - " \" \\\"source\\\": \\\"Plot some of the data we populated:\\\"\\n\",\n", - " \" },\\n\",\n", - " \" {\\n\",\n", - " \" \\\"cell_type\\\": \\\"code\\\",\\n\",\n", - " \" \\\"execution_count\\\": 6,\\n\",\n", - " \" \\\"metadata\\\": {\\n\",\n", - " \" \\\"ExecuteTime\\\": {\\n\",\n", - " \" \\\"end_time\\\": \\\"2025-04-16T14:50:14.256953Z\\\",\\n\",\n", - " \" \\\"start_time\\\": \\\"2025-04-16T14:50:14.036094Z\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"outputs\\\": [\\n\",\n", - " \" {\\n\",\n", - " \" \\\"data\\\": {\\n\",\n", - " \" \\\"image/png\\\": \\\"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+wEoWAh2AOADOtK1Zs2aXq/VqFFDDhw4YL4uU6aMeTx69KjXMfrc2aePKSkpXvszMjLMSFnnmOwiIyPNCFrPDUDwINgBgA/oiNikpCSv1/773/9KxYoV3QMpNJwlJia692t/OO07Fx8fb57r4/Hjx2Xbtm3uY1atWmVqA7UvHgBkx6hYAPCBgQMHym233WaaYh988EHZvHmzvP3222ZTISEhMmDAAHnhhRdMPzwNeiNGjDAjXTt06OCu4WvVqpW7CTc9PV369etnRswyIhZATgh2AOADDRs2lAULFpg+b2PGjDHBTac30XnpHM8884ykpqaa/ndaM9ekSRMzvUlUVJT7mPfff9+EuebNm5vRsJ06dTJz3wFATgh2AOAjf/zjH82WG62109CnW250BOzcuXN9dIYAbEMfOwAAAEsQ7AAAACzh12CnE2lqP5SiRYuaSTi1w3D2UWRNmzY1zRWe2xNPPOF1jE4f0LZtWylcuLD5nCFDhpgpAQAAAIKJX/vYrVmzRvr27WvCnQax5557Tlq2bGkWy9bFsB06IsyzD4oGOEdmZqYJdTptwPr16+XIkSPy6KOPmoW3dTQaAABAsPBrsNPRX55mzZplatx0zqY777zTK8jlNhnn8uXLTRBcuXKlWYqnXr16MnbsWBk6dKiMHj1aIiIifH4dAAAABUGB6mOny984o8A86XD/kiVLys0332ymDjhz5ox7ny6SXbt2ba/1FhMSEsxEnzt37szx+7BINgAAsFGBme5EZ1LXyTp1tnYNcI6HH37YzNSuk3F+++23piZO++F98sknZr8uhJ3TItrOvtz69j3//PM+vR4AAICgDXba1+67776TdevWeb2uE3c6tGZO11/UiTr37dsnVapUuazvpbV+gwYNcj/XGrvy5ctfwdkDAAD4X4FoitVZ1RcvXixffPGFXH/99Rc81lkfce/eveZR+97ltIi2sy8nLJINAABs5Ndg53K5TKjTZXd0YWtdcuditm/fbh615s5ZJHvHjh2SkpLiPmbFihUmrNWsWdOHZw8AAFCwhPm7+VWXyvn000/NXHZOn7jY2FiJjo42za26v02bNlKiRAnTx04X1tYRs3Xq1DHH6vQoGuC6desm48ePN58xfPhw89laMwcAABAs/FpjN3XqVDMSVich1ho4Z/vggw/Mfp2qRKcx0fBWvXp1efrpp80C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\\\",\\n\",\n", - " \" \\\"text/plain\\\": [\\n\",\n", - " \" \\\"
\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" },\\n\",\n", - " \" \\\"metadata\\\": {},\\n\",\n", - " \" \\\"output_type\\\": \\\"display_data\\\"\\n\",\n", - " \" }\\n\",\n", - " \" ],\\n\",\n", - " \" \\\"source\\\": [\\n\",\n", - " \" \\\"fig, ax = plt.subplots(1, 2, sharex=\\\\\\\"all\\\\\\\")\\\\n\\\",\\n\",\n", - " \" \\\"ax[0].imshow(writer.live_mask[:].T, aspect=\\\\\\\"auto\\\\\\\")\\\\n\\\",\\n\",\n", - " \" \\\"ax[1].imshow(reader[:, 150].T, aspect=\\\\\\\"auto\\\\\\\")\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"ax[0].set_xlabel(\\\\\\\"inline\\\\\\\")\\\\n\\\",\\n\",\n", - " \" \\\"ax[0].set_ylabel(\\\\\\\"crossline\\\\\\\")\\\\n\\\",\\n\",\n", - " \" \\\"ax[1].set_xlabel(\\\\\\\"inline\\\\\\\")\\\\n\\\",\\n\",\n", - " \" \\\"ax[1].set_ylabel(\\\\\\\"sample\\\\\\\")\\\\n\\\",\\n\",\n", - " \" \\\"ax[0].set_title(\\\\\\\"Live Mask\\\\\\\")\\\\n\\\",\\n\",\n", - " \" \\\"ax[1].set_title(\\\\\\\"Middle Crossline\\\\\\\")\\\\n\\\",\\n\",\n", - " \" \\\"fig.tight_layout();\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" },\\n\",\n", - " \" {\\n\",\n", - " \" \\\"cell_type\\\": \\\"markdown\\\",\\n\",\n", - " \" \\\"metadata\\\": {},\\n\",\n", - " \" \\\"source\\\": [\\n\",\n", - " \" \\\"## Write to SEG-Y\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"Because we populated all the fields necessary for SEG-Y output, we can call the\\\\n\\\",\\n\",\n", - " \" \\\"MDIO to SEGY converter and get a file out.\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" },\\n\",\n", - " \" {\\n\",\n", - " \" \\\"cell_type\\\": \\\"code\\\",\\n\",\n", - " \" \\\"execution_count\\\": 7,\\n\",\n", - " \" \\\"metadata\\\": {\\n\",\n", - " \" \\\"ExecuteTime\\\": {\\n\",\n", - " \" \\\"end_time\\\": \\\"2025-04-16T14:50:15.788812Z\\\",\\n\",\n", - " \" \\\"start_time\\\": \\\"2025-04-16T14:50:15.009889Z\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"outputs\\\": [\\n\",\n", - " \" {\\n\",\n", - " \" \\\"name\\\": \\\"stderr\\\",\\n\",\n", - " \" \\\"output_type\\\": \\\"stream\\\",\\n\",\n", - " \" \\\"text\\\": [\\n\",\n", - " \" \\\"Unwrapping MDIO Blocks: 100%|██████████| 7/7 [00:00<00:00, 10.55it/s]\\\\n\\\",\\n\",\n", - " \" \\\"Merging lines: 100%|██████████| 1/1 [00:00<00:00, 17.26it/s]\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" },\\n\",\n", - " \" {\\n\",\n", - " \" \\\"name\\\": \\\"stdout\\\",\\n\",\n", - " \" \\\"output_type\\\": \\\"stream\\\",\\n\",\n", - " \" \\\"text\\\": [\\n\",\n", - " \" \\\"[(0, 0, 0, 0, 0, 4, 4000, 750, 750, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0)]\\\\n\\\",\\n\",\n", - " \" \\\"[[1. 1. 1. ... 1. 1. 1.]\\\\n\\\",\\n\",\n", - " \" \\\" [1. 1. 1. ... 1. 1. 1.]\\\\n\\\",\\n\",\n", - " \" \\\" [1. 1. 1. ... 1. 1. 1.]\\\\n\\\",\\n\",\n", - " \" \\\" ...\\\\n\\\",\\n\",\n", - " \" \\\" [1. 1. 1. ... 1. 1. 1.]\\\\n\\\",\\n\",\n", - " \" \\\" [1. 1. 1. ... 1. 1. 1.]\\\\n\\\",\\n\",\n", - " \" \\\" [1. 1. 1. ... 1. 1. 1.]]\\\\n\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" },\\n\",\n", - " \" {\\n\",\n", - " \" \\\"name\\\": \\\"stderr\\\",\\n\",\n", - " \" \\\"output_type\\\": \\\"stream\\\",\\n\",\n", - " \" \\\"text\\\": [\\n\",\n", - " \" \\\"\\\\n\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" }\\n\",\n", - " \" ],\\n\",\n", - " \" \\\"source\\\": [\\n\",\n", - " \" \\\"from segy import SegyFile\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"from mdio import mdio_to_segy\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"mdio_to_segy(\\\\\\\"demo.mdio\\\\\\\", \\\\\\\"demo.segy\\\\\\\")\\\\n\\\",\\n\",\n", - " \" \\\"segy = SegyFile(\\\\\\\"demo.segy\\\\\\\")\\\\n\\\",\\n\",\n", - " \" \\\"print(segy.binary_header)\\\\n\\\",\\n\",\n", - " \" \\\"print(segy.sample[:100])\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" },\\n\",\n", - " \" {\\n\",\n", - " \" \\\"cell_type\\\": \\\"markdown\\\",\\n\",\n", - " \" \\\"metadata\\\": {},\\n\",\n", - " \" \\\"source\\\": [\\n\",\n", - " \" \\\"## Copying an Existing MDIO without Data and Headers\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"We also provide a `create_empty_like` function which allows us to create an MDIO file\\\\n\\\",\\n\",\n", - " \" \\\"with the same structure and basic metadata as an existing one.\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"This will carry over:\\\\n\\\",\\n\",\n", - " \" \\\"* All access patterns in source MDIO\\\\n\\\",\\n\",\n", - " \" \\\"* Grid (shape, coordinates, dimensions, etc)\\\\n\\\",\\n\",\n", - " \" \\\"* Text Header\\\\n\\\",\\n\",\n", - " \" \\\"* Binary Header\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"It will **NOT** carry over:\\\\n\\\",\\n\",\n", - " \" \\\"* Trace data\\\\n\\\",\\n\",\n", - " \" \\\"* Header data\\\\n\\\",\\n\",\n", - " \" \\\"* Statistics\\\\n\\\",\\n\",\n", - " \" \\\"* Live Mask\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" },\\n\",\n", - " \" {\\n\",\n", - " \" \\\"cell_type\\\": \\\"code\\\",\\n\",\n", - " \" \\\"execution_count\\\": 8,\\n\",\n", - " \" \\\"metadata\\\": {\\n\",\n", - " \" \\\"ExecuteTime\\\": {\\n\",\n", - " \" \\\"end_time\\\": \\\"2025-04-16T14:50:17.246513Z\\\",\\n\",\n", - " \" \\\"start_time\\\": \\\"2025-04-16T14:50:17.111779Z\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"outputs\\\": [],\\n\",\n", - " \" \\\"source\\\": [\\n\",\n", - " \" \\\"from mdio import create_empty_like\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"copy_path = \\\\\\\"copy_of_existing.mdio\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\"create_empty_like(create_conf.path, copy_path)\\\\n\\\",\\n\",\n", - " \" \\\"\\\\n\\\",\\n\",\n", - " \" \\\"copy_reader = MDIOReader(copy_path)\\\\n\\\",\\n\",\n", - " \" \\\"assert copy_reader.shape == reader.shape\\\\n\\\",\\n\",\n", - " \" \\\"assert copy_reader.binary_header == reader.binary_header\\\\n\\\",\\n\",\n", - " \" \\\"assert copy_reader.stats != reader.stats\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" },\\n\",\n", - " \" {\\n\",\n", - " \" \\\"cell_type\\\": \\\"code\\\",\\n\",\n", - " \" \\\"execution_count\\\": null,\\n\",\n", - " \" \\\"metadata\\\": {},\\n\",\n", - " \" \\\"outputs\\\": [],\\n\",\n", - " \" \\\"source\\\": []\\n\",\n", " \" }\\n\",\n", " \" ],\\n\",\n", " \" \\\"metadata\\\": {\\n\",\n", From 0e64e09d4e9aabb303aa3270c5caa174e82d916d Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Tue, 29 Apr 2025 16:10:07 -0500 Subject: [PATCH 10/56] Add basic unit test for v1 dataset schema validation --- tests/unit/test_schema.py | 54 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 tests/unit/test_schema.py diff --git a/tests/unit/test_schema.py b/tests/unit/test_schema.py new file mode 100644 index 000000000..1bccde5a0 --- /dev/null +++ b/tests/unit/test_schema.py @@ -0,0 +1,54 @@ +"""Test the schema for the v1 dataset.""" + +from mdio.schemas.v1 import Dataset as V1Dataset + + +TEST_SCHEMA = { + "metadata": { + "name": "test_dataset", + "api_version": "1.0.0", + "created_on": "2023-01-01T00:00:00Z", + }, + "variables": [ + { + "name": "actual_variable", + "data_type": "float32", + "dimensions": ["dim0", "dim1"], + "compressor": {"name": "blosc", "level": 3}, + "coordinates": ["coord"], + "metadata": { + "chunk_grid": { + "name": "regular", + "configuration": {"chunk_shape": [10, 20]}, + }, + }, + }, + { + "name": "coord", + "data_type": "float32", + "dimensions": ["dim0", "dim1"], + "metadata": { + "chunk_grid": { + "name": "regular", + "configuration": {"chunk_shape": [10, 20]}, + }, + "units_v1": {"length": "m"}, + }, + }, + { + "name": "dim0", + "data_type": "int32", + "dimensions": [{"name": "dim0", "size": 100}], + }, + { + "name": "dim1", + "data_type": "int32", + "dimensions": [{"name": "dim1", "size": 200}], + }, + ], +} + + +def test_dataset_schema_validation(): + """Test that the dataset schema validates correctly.""" + V1Dataset.model_validate(TEST_SCHEMA) From a1a312e41f7e79a98c04b1b5591a193fa5efa321 Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Wed, 30 Apr 2025 09:56:44 -0500 Subject: [PATCH 11/56] update lockfile --- uv.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uv.lock b/uv.lock index 92ce6cdc0..68edf47f8 100644 --- a/uv.lock +++ b/uv.lock @@ -1890,7 +1890,7 @@ requires-dist = [ { name = "segy", specifier = ">=0.4.0,<0.5.0" }, { name = "tqdm", specifier = ">=4.67.0,<5.0.0" }, { name = "xarray", specifier = ">=2025.3.1" }, - { name = "zarr", specifier = ">=3.0.6,<4.0.0" }, + { name = "zarr", specifier = ">=3.0.3,<3.0.7" }, { name = "zfpy", marker = "extra == 'lossy'", specifier = ">=1.0.1,<2.0.0" }, ] provides-extras = ["cloud", "distributed", "lossy"] From dfe775198e0f0289eddf7e0c9fd94142f67762bf Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Wed, 7 May 2025 09:32:28 -0500 Subject: [PATCH 12/56] fix broken creation nb --- docs/tutorials/creation.ipynb | 2127 ++++++--------------------------- 1 file changed, 387 insertions(+), 1740 deletions(-) diff --git a/docs/tutorials/creation.ipynb b/docs/tutorials/creation.ipynb index 73ff5b67d..af4d3b65d 100644 --- a/docs/tutorials/creation.ipynb +++ b/docs/tutorials/creation.ipynb @@ -1,1749 +1,396 @@ { "cells": [ { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "# Create an Empty MDIO\n", + "\n", + "```{article-info}\n", + ":author: Altay Sansal\n", + ":date: \"{sub-ref}`today`\"\n", + ":read-time: \"{sub-ref}`wordcount-minutes` min read\"\n", + ":class-container: sd-p-0 sd-outline-muted sd-rounded-3 sd-font-weight-light\n", + "```\n", + "\n", + "Here we will create an empty MDIO file and populate its fields.\n", + "\n", + "```{warning}\n", + "For plotting, the notebook requires [Matplotlib](https://matplotlib.org/) as a dependency. Please install it before executing using\n", + "`pip install matplotlib` or `conda install matplotlib`.\n", + "```\n", + "\n", + "We first need to import the configuration classes and create function to be able to create the empty MDIO." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-16T14:50:04.371422Z", + "start_time": "2025-04-16T14:50:04.368107Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "from mdio import Dimension\n", + "from mdio import Grid\n", + "from mdio import MDIOCreateConfig\n", + "from mdio import MDIOReader\n", + "from mdio import MDIOVariableConfig\n", + "from mdio import MDIOWriter\n", + "from mdio import create_empty\n", + "from mdio.converters.segy import get_compressor\n", + "from mdio.segy.compat import mdio_segy_spec" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "## Setting Up Grid Dimensions and Variable(s)\n", + "\n", + "Let's try to create an MDIO file in 3D with known `inline`, `crossline`, and `sample`\n", + "dimensions. This is exactly like a 3D Post-Stack dataset.\n", + "\n", + "We will use the standard `chunked_012` access pattern. All variable names must start\n", + "with `chunked_*` for `MDIOReader` to be able to open them with any access pattern.\n", + "\n", + "We will also use an MDIO private utility function to get the compressor easily. The\n", + "compressor is fully customizable, but this function gives us ones available in SEG-Y\n", + "ingestion.\n", + "\n", + "If we want headers, we can also provide `header_dtype` which is a Numpy `dtype`. Again,\n", + "we will be using the standard one MDIO uses for ingesting SEG-Ys. (Similar to SEG-Y Rev1).\n", + "\n", + "At the end we create empty MDIO on local disk or cloud, based on the path string." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-16T14:50:06.121450Z", + "start_time": "2025-04-16T14:50:06.002634Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [], + "source": [ + "grid = Grid(\n", + " dims=[\n", + " Dimension(name=\"inline\", coords=range(100, 300, 1)), # 100-300 with step 1\n", + " Dimension(name=\"crossline\", coords=range(1000, 1600, 2)), # 1000-1600 with step 2\n", + " Dimension(name=\"sample\", coords=range(0, 3000, 4)), # 0-3 seconds 4ms sample rate\n", + " ]\n", + ")\n", + "\n", + "compressor = get_compressor(lossless=True)\n", + "header_dtype = mdio_segy_spec().trace.header.dtype\n", + "variable = MDIOVariableConfig(\n", + " name=\"chunked_012\",\n", + " dtype=\"float32\",\n", + " chunks=(128, 128, 128),\n", + " compressors=compressor,\n", + " header_dtype=header_dtype,\n", + ")\n", + "\n", + "create_conf = MDIOCreateConfig(path=\"demo.mdio\", grid=grid, variables=[variable])\n", + "create_empty(config=create_conf);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Populating the MDIO\n", + "\n", + "Once empty MDIO is created, you can populate it with sample data, header data,\n", + "metadata, and statistics. The `live_mask` is automatically flipped to 1 after\n", + "every write. However, the consistency of the `live_mask` is up to the user. If\n", + "not populated correctly, at read time, traces may be skipped.\n", + "\n", + "We will read the usual stats and as you can see they're all empty. Text header\n", + "and binary header are only required if we are going to export this back to SEG-Y,\n", + "and can be modified. We can edit these if necessary using the writer." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-16T14:50:09.974442Z", + "start_time": "2025-04-16T14:50:09.951257Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(['C00 ',\n", + " 'C01 ',\n", + " 'C02 ',\n", + " 'C03 ',\n", + " 'C04 '],\n", + " {},\n", + " {'rms': 0, 'min': 0, 'mean': 0, 'max': 0, 'std': 0})" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "writer = MDIOWriter(create_conf.path)\n", + "\n", + "# Truncate text header for display\n", + "writer.text_header[:5], writer.binary_header, writer.stats" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Updating File and Checking with `MDIOReader`.\n", + "\n", + "We write traces here, the headers are still empty. If you need the headers\n", + "populated, this is where they would be written to file as well.\n", + "\n", + "All the extra metadata we are writing is so that we can export back to SEG-Y\n", + "in the future. If that's not a requirement most of the metadata can be\n", + "omitted.\n", + "\n", + "If you already have an MDIO prior to this, all the metadata can be copied\n", + "over from the previous version." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-16T14:50:12.498287Z", + "start_time": "2025-04-16T14:50:11.670230Z" + }, + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "({'data_sample_format': 1,\n", + " 'sample_interval': 4,\n", + " 'samples_per_trace': 750,\n", + " 'segy_revision_major': 1,\n", + " 'segy_revision_minor': 0},\n", + " {'rms': 3, 'min': -4, 'mean': 12, 'max': 4, 'std': 5})" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sample_dim = writer.grid.select_dim(\"sample\")\n", + "sample_interval = int(sample_dim.coords[1] - sample_dim.coords[0])\n", + "num_samples = sample_dim.size\n", + "writer.binary_header = {\n", + " \"data_sample_format\": 1,\n", + " \"sample_interval\": sample_interval,\n", + " \"samples_per_trace\": num_samples,\n", + " \"segy_revision_major\": 1,\n", + " \"segy_revision_minor\": 0,\n", + "}\n", + "\n", + "# Write some values to the file\n", + "writer[:5] = 1\n", + "writer[5:10] = 2\n", + "writer[50:100] = 3\n", + "writer[150:175] = -1\n", + "\n", + "# Write some made up stats\n", + "writer.stats = {\"mean\": 12, \"std\": 5, \"rms\": 3, \"min\": -4, \"max\": 4}\n", + "\n", + "reader = MDIOReader(create_conf.path)\n", + "reader.binary_header, reader.stats" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "Plot some of the data we populated:" + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-16T14:50:14.256953Z", + "start_time": "2025-04-16T14:50:14.036094Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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+wEoWAh2AOADOtK1Zs2aXq/VqFFDDhw4YL4uU6aMeTx69KjXMfrc2aePKSkpXvszMjLMSFnnmOwiIyPNCFrPDUDwINgBgA/oiNikpCSv1/773/9KxYoV3QMpNJwlJia692t/OO07Fx8fb57r4/Hjx2Xbtm3uY1atWmVqA7UvHgBkx6hYAPCBgQMHym233WaaYh988EHZvHmzvP3222ZTISEhMmDAAHnhhRdMPzwNeiNGjDAjXTt06OCu4WvVqpW7CTc9PV369etnRswyIhZATgh2AOADDRs2lAULFpg+b2PGjDHBTac30XnpHM8884ykpqaa/ndaM9ekSRMzvUlUVJT7mPfff9+EuebNm5vRsJ06dTJz3wFATgh2AOAjf/zjH82WG62109CnW250BOzcuXN9dIYAbEMfOwAAAEsQ7AAAACzh12CnE2lqP5SiRYuaSTi1w3D2UWRNmzY1zRWe2xNPPOF1jE4f0LZtWylcuLD5nCFDhpgpAQAAAIKJX/vYrVmzRvr27WvCnQax5557Tlq2bGkWy9bFsB06IsyzD4oGOEdmZqYJdTptwPr16+XIkSPy6KOPmoW3dTQaAABAsPBrsNPRX55mzZplatx0zqY777zTK8jlNhnn8uXLTRBcuXKlWYqnXr16MnbsWBk6dKiMHj1aIiIifH4dAAAABUGB6mOny984o8A86XD/kiVLys0332ymDjhz5ox7ny6SXbt2ba/1FhMSEsxEnzt37szx+7BINgAAsFGBme5EZ1LXyTp1tnYNcI6HH37YzNSuk3F+++23piZO++F98sknZr8uhJ3TItrOvtz69j3//PM+vR4AAICgDXba1+67776TdevWeb2uE3c6tGZO11/UiTr37dsnVapUuazvpbV+gwYNcj/XGrvy5ctfwdkDAAD4X4FoitVZ1RcvXixffPGFXH/99Rc81lkfce/eveZR+97ltIi2sy8nLJINAABs5Ndg53K5TKjTZXd0YWtdcuditm/fbh615s5ZJHvHjh2SkpLiPmbFihUmrNWsWdOHZw8AAFCwhPm7+VWXyvn000/NXHZOn7jY2FiJjo42za26v02bNlKiRAnTx04X1tYRs3Xq1DHH6vQoGuC6desm48ePN58xfPhw89laMwcAABAs/FpjN3XqVDMSVich1ho4Z/vggw/Mfp2qRKcx0fBWvXp1efrpp80C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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots(1, 2, sharex=\"all\")\n", + "ax[0].imshow(writer.live_mask[:].T, aspect=\"auto\")\n", + "ax[1].imshow(reader[:, 150].T, aspect=\"auto\")\n", + "\n", + "ax[0].set_xlabel(\"inline\")\n", + "ax[0].set_ylabel(\"crossline\")\n", + "ax[1].set_xlabel(\"inline\")\n", + "ax[1].set_ylabel(\"sample\")\n", + "ax[0].set_title(\"Live Mask\")\n", + "ax[1].set_title(\"Middle Crossline\")\n", + "fig.tight_layout();" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Write to SEG-Y\n", + "\n", + "Because we populated all the fields necessary for SEG-Y output, we can call the\n", + "MDIO to SEGY converter and get a file out." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-16T14:50:15.788812Z", + "start_time": "2025-04-16T14:50:15.009889Z" + } + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unwrapping MDIO Blocks: 100%|██████████| 7/7 [00:00<00:00, 10.55it/s]\n", + "Merging lines: 100%|██████████| 1/1 [00:00<00:00, 17.26it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(0, 0, 0, 0, 0, 4, 4000, 750, 750, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0)]\n", + "[[1. 1. 1. ... 1. 1. 1.]\n", + " [1. 1. 1. ... 1. 1. 1.]\n", + " [1. 1. 1. ... 1. 1. 1.]\n", + " ...\n", + " [1. 1. 1. ... 1. 1. 1.]\n", + " [1. 1. 1. ... 1. 1. 1.]\n", + " [1. 1. 1. ... 1. 1. 1.]]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "from segy import SegyFile\n", + "\n", + "from mdio import mdio_to_segy\n", + "\n", + "mdio_to_segy(\"demo.mdio\", \"demo.segy\")\n", + "segy = SegyFile(\"demo.segy\")\n", + "print(segy.binary_header)\n", + "print(segy.sample[:100])" + ] + }, + { + "cell_type": "markdown", "metadata": {}, - "cell_type": "raw", "source": [ - "{\n", - " \"cells\": [\n", - " {\n", - " \"metadata\": {},\n", - " \"cell_type\": \"raw\",\n", - " \"source\": [\n", - " \"{\\n\",\n", - " \" \\\"cells\\\": [\\n\",\n", - " \" {\\n\",\n", - " \" \\\"metadata\\\": {},\\n\",\n", - " \" \\\"cell_type\\\": \\\"raw\\\",\\n\",\n", - " \" \\\"source\\\": [\\n\",\n", - " \" \\\"{\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"cells\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"markdown\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"pycharm\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"#%% md\\\\\\\\n\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"# Create an Empty MDIO\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"```{article-info}\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\":author: Altay Sansal\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\":date: \\\\\\\\\\\\\\\"{sub-ref}`today`\\\\\\\\\\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\":read-time: \\\\\\\\\\\\\\\"{sub-ref}`wordcount-minutes` min read\\\\\\\\\\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\":class-container: sd-p-0 sd-outline-muted sd-rounded-3 sd-font-weight-light\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"```\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"Here we will create an empty MDIO file and populate its fields.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"```{warning}\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"For plotting, the notebook requires [Matplotlib](https://matplotlib.org/) as a dependency. Please install it before executing using\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"`pip install matplotlib` or `conda install matplotlib`.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"```\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"We first need to import the configuration classes and create function to be able to create the empty MDIO.\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"code\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"execution_count\\\\\\\": 2,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ExecuteTime\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"end_time\\\\\\\": \\\\\\\"2025-04-16T14:50:04.371422Z\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"start_time\\\\\\\": \\\\\\\"2025-04-16T14:50:04.368107Z\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"pycharm\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"#%%\\\\\\\\n\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"outputs\\\\\\\": [],\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"import matplotlib.pyplot as plt\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"from mdio import Dimension\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"from mdio import Grid\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"from mdio import MDIOCreateConfig\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"from mdio import MDIOReader\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"from mdio import MDIOVariableConfig\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"from mdio import MDIOWriter\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"from mdio import create_empty\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"from mdio.converters.segy import get_compressor\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"from mdio.segy.compat import mdio_segy_spec\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"markdown\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"pycharm\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"#%% md\\\\\\\\n\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"## Setting Up Grid Dimensions and Variable(s)\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"Let's try to create an MDIO file in 3D with known `inline`, `crossline`, and `sample`\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"dimensions. This is exactly like a 3D Post-Stack dataset.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"We will use the standard `chunked_012` access pattern. All variable names must start\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"with `chunked_*` for `MDIOReader` to be able to open them with any access pattern.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"We will also use an MDIO private utility function to get the compressor easily. The\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"compressor is fully customizable, but this function gives us ones available in SEG-Y\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ingestion.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"If we want headers, we can also provide `header_dtype` which is a Numpy `dtype`. Again,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"we will be using the standard one MDIO uses for ingesting SEG-Ys. (Similar to SEG-Y Rev1).\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"At the end we create empty MDIO on local disk or cloud, based on the path string.\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"code\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"execution_count\\\\\\\": 3,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ExecuteTime\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"end_time\\\\\\\": \\\\\\\"2025-04-16T14:50:06.121450Z\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"start_time\\\\\\\": \\\\\\\"2025-04-16T14:50:06.002634Z\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"pycharm\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"#%%\\\\\\\\n\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"outputs\\\\\\\": [],\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"grid = Grid(\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" dims=[\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" Dimension(name=\\\\\\\\\\\\\\\"inline\\\\\\\\\\\\\\\", coords=range(100, 300, 1)), # 100-300 with step 1\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" Dimension(name=\\\\\\\\\\\\\\\"crossline\\\\\\\\\\\\\\\", coords=range(1000, 1600, 2)), # 1000-1600 with step 2\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" Dimension(name=\\\\\\\\\\\\\\\"sample\\\\\\\\\\\\\\\", coords=range(0, 3000, 4)), # 0-3 seconds 4ms sample rate\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" ]\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"compressor = get_compressor(lossless=True)\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"header_dtype = mdio_segy_spec().trace.header.dtype\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"variable = MDIOVariableConfig(\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" name=\\\\\\\\\\\\\\\"chunked_012\\\\\\\\\\\\\\\",\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" dtype=\\\\\\\\\\\\\\\"float32\\\\\\\\\\\\\\\",\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" chunks=(128, 128, 128),\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" compressors=compressor,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" header_dtype=header_dtype,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"create_conf = MDIOCreateConfig(path=\\\\\\\\\\\\\\\"demo.mdio\\\\\\\\\\\\\\\", grid=grid, variables=[variable])\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"create_empty(config=create_conf);\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"markdown\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {},\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"## Populating the MDIO\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"Once empty MDIO is created, you can populate it with sample data, header data,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata, and statistics. The `live_mask` is automatically flipped to 1 after\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"every write. However, the consistency of the `live_mask` is up to the user. If\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"not populated correctly, at read time, traces may be skipped.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"We will read the usual stats and as you can see they're all empty. Text header\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"and binary header are only required if we are going to export this back to SEG-Y,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"and can be modified. We can edit these if necessary using the writer.\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"code\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"execution_count\\\\\\\": 4,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ExecuteTime\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"end_time\\\\\\\": \\\\\\\"2025-04-16T14:50:09.974442Z\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"start_time\\\\\\\": \\\\\\\"2025-04-16T14:50:09.951257Z\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"pycharm\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"#%%\\\\\\\\n\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"outputs\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"data\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"text/plain\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"(['C00 ',\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" 'C01 ',\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" 'C02 ',\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" 'C03 ',\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" 'C04 '],\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" {},\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" {'rms': 0, 'min': 0, 'mean': 0, 'max': 0, 'std': 0})\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"execution_count\\\\\\\": 4,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {},\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"output_type\\\\\\\": \\\\\\\"execute_result\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" ],\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"writer = MDIOWriter(create_conf.path)\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"# Truncate text header for display\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"writer.text_header[:5], writer.binary_header, writer.stats\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"markdown\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {},\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"## Updating File and Checking with `MDIOReader`.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"We write traces here, the headers are still empty. If you need the headers\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"populated, this is where they would be written to file as well.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"All the extra metadata we are writing is so that we can export back to SEG-Y\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"in the future. If that's not a requirement most of the metadata can be\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"omitted.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"If you already have an MDIO prior to this, all the metadata can be copied\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"over from the previous version.\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"code\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"execution_count\\\\\\\": 5,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ExecuteTime\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"end_time\\\\\\\": \\\\\\\"2025-04-16T14:50:12.498287Z\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"start_time\\\\\\\": \\\\\\\"2025-04-16T14:50:11.670230Z\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"pycharm\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"#%%\\\\\\\\n\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"outputs\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"data\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"text/plain\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"({'data_sample_format': 1,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" 'sample_interval': 4,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" 'samples_per_trace': 750,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" 'segy_revision_major': 1,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" 'segy_revision_minor': 0},\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" {'rms': 3, 'min': -4, 'mean': 12, 'max': 4, 'std': 5})\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"execution_count\\\\\\\": 5,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {},\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"output_type\\\\\\\": \\\\\\\"execute_result\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" ],\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"sample_dim = writer.grid.select_dim(\\\\\\\\\\\\\\\"sample\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"sample_interval = int(sample_dim.coords[1] - sample_dim.coords[0])\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"num_samples = sample_dim.size\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"writer.binary_header = {\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" \\\\\\\\\\\\\\\"data_sample_format\\\\\\\\\\\\\\\": 1,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" \\\\\\\\\\\\\\\"sample_interval\\\\\\\\\\\\\\\": sample_interval,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" \\\\\\\\\\\\\\\"samples_per_trace\\\\\\\\\\\\\\\": num_samples,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" \\\\\\\\\\\\\\\"segy_revision_major\\\\\\\\\\\\\\\": 1,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" \\\\\\\\\\\\\\\"segy_revision_minor\\\\\\\\\\\\\\\": 0,\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"}\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"# Write some values to the file\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"writer[:5] = 1\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"writer[5:10] = 2\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"writer[50:100] = 3\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"writer[150:175] = -1\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"# Write some made up stats\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"writer.stats = {\\\\\\\\\\\\\\\"mean\\\\\\\\\\\\\\\": 12, \\\\\\\\\\\\\\\"std\\\\\\\\\\\\\\\": 5, \\\\\\\\\\\\\\\"rms\\\\\\\\\\\\\\\": 3, \\\\\\\\\\\\\\\"min\\\\\\\\\\\\\\\": -4, \\\\\\\\\\\\\\\"max\\\\\\\\\\\\\\\": 4}\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"reader = MDIOReader(create_conf.path)\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"reader.binary_header, reader.stats\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"markdown\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {},\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"source\\\\\\\": \\\\\\\"Plot some of the data we populated:\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"code\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"execution_count\\\\\\\": 6,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ExecuteTime\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"end_time\\\\\\\": \\\\\\\"2025-04-16T14:50:14.256953Z\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"start_time\\\\\\\": \\\\\\\"2025-04-16T14:50:14.036094Z\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"outputs\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"data\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"image/png\\\\\\\": \\\\\\\"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+wEoWAh2AOADOtK1Zs2aXq/VqFFDDhw4YL4uU6aMeTx69KjXMfrc2aePKSkpXvszMjLMSFnnmOwiIyPNCFrPDUDwINgBgA/oiNikpCSv1/773/9KxYoV3QMpNJwlJia692t/OO07Fx8fb57r4/Hjx2Xbtm3uY1atWmVqA7UvHgBkx6hYAPCBgQMHym233WaaYh988EHZvHmzvP3222ZTISEhMmDAAHnhhRdMPzwNeiNGjDAjXTt06OCu4WvVqpW7CTc9PV369etnRswyIhZATgh2AOADDRs2lAULFpg+b2PGjDHBTac30XnpHM8884ykpqaa/ndaM9ekSRMzvUlUVJT7mPfff9+EuebNm5vRsJ06dTJz3wFATgh2AOAjf/zjH82WG62109CnW250BOzcuXN9dIYAbEMfOwAAAEsQ7AAAACzh12CnE2lqP5SiRYuaSTi1w3D2UWRNmzY1zRWe2xNPPOF1jE4f0LZtWylcuLD5nCFDhpgpAQAAAIKJX/vYrVmzRvr27WvCnQax5557Tlq2bGkWy9bFsB06IsyzD4oGOEdmZqYJdTptwPr16+XIkSPy6KOPmoW3dTQaAABAsPBrsNPRX55mzZplatx0zqY777zTK8jlNhnn8uXLTRBcuXKlWYqnXr16MnbsWBk6dKiMHj1aIiIifH4dAAAABUGB6mOny984o8A86XD/kiVLys0332ymDjhz5ox7ny6SXbt2ba/1FhMSEsxEnzt37szx+7BINgAAsFGBme5EZ1LXyTp1tnYNcI6HH37YzNSuk3F+++23piZO++F98sknZr8uhJ3TItrOvtz69j3//PM+vR4AAICgDXba1+67776TdevWeb2uE3c6tGZO11/UiTr37dsnVapUuazvpbV+gwYNcj/XGrvy5ctfwdkDAAD4X4FoitVZ1RcvXixffPGFXH/99Rc81lkfce/eveZR+97ltIi2sy8nLJINAABs5Ndg53K5TKjTZXd0YWtdcuditm/fbh615s5ZJHvHjh2SkpLiPmbFihUmrNWsWdOHZw8AAFCwhPm7+VWXyvn000/NXHZOn7jY2FiJjo42za26v02bNlKiRAnTx04X1tYRs3Xq1DHH6vQoGuC6desm48ePN58xfPhw89laMwcAABAs/FpjN3XqVDMSVich1ho4Z/vggw/Mfp2qRKcx0fBWvXp1efrpp80C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\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"text/plain\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"
\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {},\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"output_type\\\\\\\": \\\\\\\"display_data\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" ],\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"fig, ax = plt.subplots(1, 2, sharex=\\\\\\\\\\\\\\\"all\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ax[0].imshow(writer.live_mask[:].T, aspect=\\\\\\\\\\\\\\\"auto\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ax[1].imshow(reader[:, 150].T, aspect=\\\\\\\\\\\\\\\"auto\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ax[0].set_xlabel(\\\\\\\\\\\\\\\"inline\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ax[0].set_ylabel(\\\\\\\\\\\\\\\"crossline\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ax[1].set_xlabel(\\\\\\\\\\\\\\\"inline\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ax[1].set_ylabel(\\\\\\\\\\\\\\\"sample\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ax[0].set_title(\\\\\\\\\\\\\\\"Live Mask\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ax[1].set_title(\\\\\\\\\\\\\\\"Middle Crossline\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"fig.tight_layout();\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"markdown\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {},\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"## Write to SEG-Y\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"Because we populated all the fields necessary for SEG-Y output, we can call the\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"MDIO to SEGY converter and get a file out.\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"code\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"execution_count\\\\\\\": 7,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ExecuteTime\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"end_time\\\\\\\": \\\\\\\"2025-04-16T14:50:15.788812Z\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"start_time\\\\\\\": \\\\\\\"2025-04-16T14:50:15.009889Z\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"outputs\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"stderr\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"output_type\\\\\\\": \\\\\\\"stream\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"text\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"Unwrapping MDIO Blocks: 100%|██████████| 7/7 [00:00<00:00, 10.55it/s]\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"Merging lines: 100%|██████████| 1/1 [00:00<00:00, 17.26it/s]\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"stdout\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"output_type\\\\\\\": \\\\\\\"stream\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"text\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"[(0, 0, 0, 0, 0, 4, 4000, 750, 750, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0)]\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"[[1. 1. 1. ... 1. 1. 1.]\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" [1. 1. 1. ... 1. 1. 1.]\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" [1. 1. 1. ... 1. 1. 1.]\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" ...\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" [1. 1. 1. ... 1. 1. 1.]\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" [1. 1. 1. ... 1. 1. 1.]\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\" [1. 1. 1. ... 1. 1. 1.]]\\\\\\\\n\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"stderr\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"output_type\\\\\\\": \\\\\\\"stream\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"text\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" ],\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"from segy import SegyFile\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"from mdio import mdio_to_segy\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"mdio_to_segy(\\\\\\\\\\\\\\\"demo.mdio\\\\\\\\\\\\\\\", \\\\\\\\\\\\\\\"demo.segy\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"segy = SegyFile(\\\\\\\\\\\\\\\"demo.segy\\\\\\\\\\\\\\\")\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"print(segy.binary_header)\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"print(segy.sample[:100])\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"markdown\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {},\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"## Copying an Existing MDIO without Data and Headers\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"We also provide a `create_empty_like` function which allows us to create an MDIO file\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"with the same structure and basic metadata as an existing one.\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"This will carry over:\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"* All access patterns in source MDIO\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"* Grid (shape, coordinates, dimensions, etc)\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"* Text Header\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"* Binary Header\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"It will **NOT** carry over:\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"* Trace data\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"* Header data\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"* Statistics\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"* Live Mask\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"code\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"execution_count\\\\\\\": 8,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ExecuteTime\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"end_time\\\\\\\": \\\\\\\"2025-04-16T14:50:17.246513Z\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"start_time\\\\\\\": \\\\\\\"2025-04-16T14:50:17.111779Z\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"outputs\\\\\\\": [],\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"source\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"from mdio import create_empty_like\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"copy_path = \\\\\\\\\\\\\\\"copy_of_existing.mdio\\\\\\\\\\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"create_empty_like(create_conf.path, copy_path)\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"copy_reader = MDIOReader(copy_path)\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"assert copy_reader.shape == reader.shape\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"assert copy_reader.binary_header == reader.binary_header\\\\\\\\n\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"assert copy_reader.stats != reader.stats\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ]\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"cell_type\\\\\\\": \\\\\\\"code\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"execution_count\\\\\\\": null,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {},\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"outputs\\\\\\\": [],\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"source\\\\\\\": []\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" ],\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"metadata\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"kernelspec\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"display_name\\\\\\\": \\\\\\\"Python 3 (ipykernel)\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"language\\\\\\\": \\\\\\\"python\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"python3\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"language_info\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"codemirror_mode\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"ipython\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"version\\\\\\\": 3\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"file_extension\\\\\\\": \\\\\\\".py\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"mimetype\\\\\\\": \\\\\\\"text/x-python\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"name\\\\\\\": \\\\\\\"python\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"nbconvert_exporter\\\\\\\": \\\\\\\"python\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"pygments_lexer\\\\\\\": \\\\\\\"ipython3\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"version\\\\\\\": \\\\\\\"3.12.3\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"widgets\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"application/vnd.jupyter.widget-state+json\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"104c0d4e90244ebc959e51a58794dcf4\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"display\\\\\\\": \\\\\\\"inline-flex\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"flex_flow\\\\\\\": \\\\\\\"row wrap\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"width\\\\\\\": \\\\\\\"100%\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"1c0f5b458ee1401eaa8de63c65802073\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"font_size\\\\\\\": null,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"text_color\\\\\\\": null\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"21b25dd6080d42368afc06770d5e1755\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_35fb49026dac479eba87217c2f6bcb9a\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_3ab3e27c83aa423d9ecdac94e576f0fe\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"value\\\\\\\": \\\\\\\"Ingesting SEG-Y in 6 chunks: 100%\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"2693aae410f04e7587f0400b5eef1079\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"ProgressStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"318aea09479a479981dcfa29bc856c67\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"ProgressStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"35fb49026dac479eba87217c2f6bcb9a\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {}\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"3ab3e27c83aa423d9ecdac94e576f0fe\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"font_size\\\\\\\": null,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"text_color\\\\\\\": null\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"420b4a9492c54eb48d7779f38a09fd20\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"flex\\\\\\\": \\\\\\\"2\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"42afe4fae9dd4bc4a341a231cf7a9c32\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {}\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"4df685a95de542ffab6f265df89b8949\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"font_size\\\\\\\": null,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"text_color\\\\\\\": null\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"58eaddb54c8840da83d1f6503d6ba64f\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {}\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"5b3e72b71f304230bc36bb91f9c173be\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"font_size\\\\\\\": null,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"text_color\\\\\\\": null\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"5c1fab0ccc7e42c69c2b663b67ca9e3c\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {}\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"63a54817ae8b4c8d85b30d8c97e7ed0d\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HBoxModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"children\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"IPY_MODEL_e170d60a55a14c489d32b101293a9d33\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"IPY_MODEL_662ad93cf7b3470f8e197350441f09ca\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"IPY_MODEL_ac4abab2367e461e956e4e0edb27be44\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ],\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_c59d6fe969a04f4da332ae2a6fdb9c77\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"63f87a2410ba47d38ad9f55a81357a29\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_ca48140488574a28a7469552441560e4\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_ae2037efb9cc459e84bcc28ca7243437\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"value\\\\\\\": \\\\\\\" 2/2 [00:03<00:00, 3.01s/block]\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"64eb2b9c8a094a1ea5f1991e5f09f5d9\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {}\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"662ad93cf7b3470f8e197350441f09ca\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"FloatProgressModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"bar_style\\\\\\\": \\\\\\\"success\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_420b4a9492c54eb48d7779f38a09fd20\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"max\\\\\\\": 1,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_d16e93f72f3d4aeda2f5deee87e9754f\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"value\\\\\\\": 1\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"74283969ff5446c89bb83b00a70226cf\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_5c1fab0ccc7e42c69c2b663b67ca9e3c\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_1c0f5b458ee1401eaa8de63c65802073\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"value\\\\\\\": \\\\\\\" 6/6 [00:09<00:00, 2.48s/block]\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"75cf0c1ed25e47aab20b060f3bb44fb8\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HBoxModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"children\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"IPY_MODEL_21b25dd6080d42368afc06770d5e1755\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"IPY_MODEL_c33f32b62a204ef094f67b10f8adbdc1\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"IPY_MODEL_74283969ff5446c89bb83b00a70226cf\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ],\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_91df4ac76fd744539d4237d6099f34a5\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"7ff32d7deac14f21ab0f0939fe09e440\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"ProgressStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"91df4ac76fd744539d4237d6099f34a5\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"display\\\\\\\": \\\\\\\"inline-flex\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"flex_flow\\\\\\\": \\\\\\\"row wrap\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"width\\\\\\\": \\\\\\\"100%\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"981634b52a7a4ffdae6186061c0b6482\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HBoxModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"children\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"IPY_MODEL_f65266f861cf40ef84e9ec74a8e0b44c\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"IPY_MODEL_9aaf514a5035413d8cbbad58aa0221f4\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"IPY_MODEL_63f87a2410ba47d38ad9f55a81357a29\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ],\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_104c0d4e90244ebc959e51a58794dcf4\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"9aaf514a5035413d8cbbad58aa0221f4\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"FloatProgressModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"bar_style\\\\\\\": \\\\\\\"success\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_b25523a221fd4b5e9211d07ef39cccf5\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"max\\\\\\\": 2,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_318aea09479a479981dcfa29bc856c67\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"value\\\\\\\": 2\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"9fe5348964cd4f7880bcd33204bbc7a2\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {}\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"a03d238db31145b881a1be478f9eb72f\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"font_size\\\\\\\": null,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"text_color\\\\\\\": null\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"a6aabcd2e57348a49bb59477f6a9fd90\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"FloatProgressModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"bar_style\\\\\\\": \\\\\\\"success\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_cfb02c9c7447491ca00bbb6acd99bb79\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"max\\\\\\\": 26,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_7ff32d7deac14f21ab0f0939fe09e440\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"value\\\\\\\": 26\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ac4abab2367e461e956e4e0edb27be44\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_58eaddb54c8840da83d1f6503d6ba64f\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_a03d238db31145b881a1be478f9eb72f\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"value\\\\\\\": \\\\\\\" 3/? [00:00<00:00, 8.29block/s]\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ae2037efb9cc459e84bcc28ca7243437\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"font_size\\\\\\\": null,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"text_color\\\\\\\": null\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"b25523a221fd4b5e9211d07ef39cccf5\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"flex\\\\\\\": \\\\\\\"2\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"b9810ee38bbe43f4bba100e53379be65\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_42afe4fae9dd4bc4a341a231cf7a9c32\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_fdcea609ee7349629604217b625371d3\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"value\\\\\\\": \\\\\\\" 26/26 [00:01<00:00, 18.92block/s]\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"c33f32b62a204ef094f67b10f8adbdc1\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"FloatProgressModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"bar_style\\\\\\\": \\\\\\\"success\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_d23d88490a1b4941b8ca228b7d4a39cb\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"max\\\\\\\": 6,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_2693aae410f04e7587f0400b5eef1079\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"value\\\\\\\": 6\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"c59d6fe969a04f4da332ae2a6fdb9c77\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"display\\\\\\\": \\\\\\\"inline-flex\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"flex_flow\\\\\\\": \\\\\\\"row wrap\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"width\\\\\\\": \\\\\\\"100%\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"ca48140488574a28a7469552441560e4\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {}\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"cfb02c9c7447491ca00bbb6acd99bb79\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"flex\\\\\\\": \\\\\\\"2\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"d16e93f72f3d4aeda2f5deee87e9754f\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"ProgressStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"d23d88490a1b4941b8ca228b7d4a39cb\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"flex\\\\\\\": \\\\\\\"2\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"d565a20d37e84ed0a1195e9a90154960\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HBoxModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"children\\\\\\\": [\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"IPY_MODEL_db696e15587c4a54b82886b3eb5a0c96\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"IPY_MODEL_a6aabcd2e57348a49bb59477f6a9fd90\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"IPY_MODEL_b9810ee38bbe43f4bba100e53379be65\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" ],\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_eab4b060672b4dd5a73ca7bb8f782cd2\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"db696e15587c4a54b82886b3eb5a0c96\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_64eb2b9c8a094a1ea5f1991e5f09f5d9\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_5b3e72b71f304230bc36bb91f9c173be\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"value\\\\\\\": \\\\\\\"Step 1 / 2 Writing Blocks: 100%\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"e170d60a55a14c489d32b101293a9d33\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_9fe5348964cd4f7880bcd33204bbc7a2\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_4df685a95de542ffab6f265df89b8949\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"value\\\\\\\": \\\\\\\"Step 2 / 2 Concat Blocks: \\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"e66368cda8124001b16459a0634029e2\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"font_size\\\\\\\": null,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"text_color\\\\\\\": null\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"eab4b060672b4dd5a73ca7bb8f782cd2\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"display\\\\\\\": \\\\\\\"inline-flex\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"flex_flow\\\\\\\": \\\\\\\"row wrap\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"width\\\\\\\": \\\\\\\"100%\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"f65266f861cf40ef84e9ec74a8e0b44c\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"layout\\\\\\\": \\\\\\\"IPY_MODEL_fff4199774534d9f982f03738fbb08e7\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"style\\\\\\\": \\\\\\\"IPY_MODEL_e66368cda8124001b16459a0634029e2\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"value\\\\\\\": \\\\\\\"Scanning SEG-Y for geometry attributes: 100%\\\\\\\"\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"fdcea609ee7349629604217b625371d3\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/controls\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"HTMLStyleModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"description_width\\\\\\\": \\\\\\\"\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"font_size\\\\\\\": null,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"text_color\\\\\\\": null\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"fff4199774534d9f982f03738fbb08e7\\\\\\\": {\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module\\\\\\\": \\\\\\\"@jupyter-widgets/base\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_module_version\\\\\\\": \\\\\\\"2.0.0\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"model_name\\\\\\\": \\\\\\\"LayoutModel\\\\\\\",\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"state\\\\\\\": {}\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"version_major\\\\\\\": 2,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"version_minor\\\\\\\": 0\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" }\\\\n\\\",\\n\",\n", - " \" \\\" },\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"nbformat\\\\\\\": 4,\\\\n\\\",\\n\",\n", - " \" \\\" \\\\\\\"nbformat_minor\\\\\\\": 4\\\\n\\\",\\n\",\n", - " \" \\\"}\\\\n\\\"\\n\",\n", - " \" ]\\n\",\n", - " \" }\\n\",\n", - " \" ],\\n\",\n", - " \" \\\"metadata\\\": {\\n\",\n", - " \" \\\"kernelspec\\\": {\\n\",\n", - " \" \\\"display_name\\\": \\\"Python 3 (ipykernel)\\\",\\n\",\n", - " \" \\\"language\\\": \\\"python\\\",\\n\",\n", - " \" \\\"name\\\": \\\"python3\\\"\\n\",\n", - " \" },\\n\",\n", - " \" \\\"language_info\\\": {\\n\",\n", - " \" \\\"codemirror_mode\\\": {\\n\",\n", - " \" \\\"name\\\": \\\"ipython\\\",\\n\",\n", - " \" \\\"version\\\": 3\\n\",\n", - " \" },\\n\",\n", - " \" \\\"file_extension\\\": \\\".py\\\",\\n\",\n", - " \" \\\"mimetype\\\": \\\"text/x-python\\\",\\n\",\n", - " \" \\\"name\\\": \\\"python\\\",\\n\",\n", - " \" \\\"nbconvert_exporter\\\": \\\"python\\\",\\n\",\n", - " \" \\\"pygments_lexer\\\": \\\"ipython3\\\",\\n\",\n", - " \" \\\"version\\\": \\\"3.12.3\\\"\\n\",\n", - " \" },\\n\",\n", - " \" \\\"widgets\\\": {\\n\",\n", - " \" \\\"application/vnd.jupyter.widget-state+json\\\": {\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"104c0d4e90244ebc959e51a58794dcf4\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"display\\\": \\\"inline-flex\\\",\\n\",\n", - " \" \\\"flex_flow\\\": \\\"row wrap\\\",\\n\",\n", - " \" \\\"width\\\": \\\"100%\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"1c0f5b458ee1401eaa8de63c65802073\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HTMLStyleModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"description_width\\\": \\\"\\\",\\n\",\n", - " \" \\\"font_size\\\": null,\\n\",\n", - " \" \\\"text_color\\\": null\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"21b25dd6080d42368afc06770d5e1755\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HTMLModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"layout\\\": \\\"IPY_MODEL_35fb49026dac479eba87217c2f6bcb9a\\\",\\n\",\n", - " \" \\\"style\\\": \\\"IPY_MODEL_3ab3e27c83aa423d9ecdac94e576f0fe\\\",\\n\",\n", - " \" \\\"value\\\": \\\"Ingesting SEG-Y in 6 chunks: 100%\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"2693aae410f04e7587f0400b5eef1079\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"ProgressStyleModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"description_width\\\": \\\"\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"318aea09479a479981dcfa29bc856c67\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"ProgressStyleModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"description_width\\\": \\\"\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"35fb49026dac479eba87217c2f6bcb9a\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", - " \" \\\"state\\\": {}\\n\",\n", - " \" },\\n\",\n", - " \" \\\"3ab3e27c83aa423d9ecdac94e576f0fe\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HTMLStyleModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"description_width\\\": \\\"\\\",\\n\",\n", - " \" \\\"font_size\\\": null,\\n\",\n", - " \" \\\"text_color\\\": null\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"420b4a9492c54eb48d7779f38a09fd20\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"flex\\\": \\\"2\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"42afe4fae9dd4bc4a341a231cf7a9c32\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", - " \" \\\"state\\\": {}\\n\",\n", - " \" },\\n\",\n", - " \" \\\"4df685a95de542ffab6f265df89b8949\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HTMLStyleModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"description_width\\\": \\\"\\\",\\n\",\n", - " \" \\\"font_size\\\": null,\\n\",\n", - " \" \\\"text_color\\\": null\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"58eaddb54c8840da83d1f6503d6ba64f\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", - " \" \\\"state\\\": {}\\n\",\n", - " \" },\\n\",\n", - " \" \\\"5b3e72b71f304230bc36bb91f9c173be\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HTMLStyleModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"description_width\\\": \\\"\\\",\\n\",\n", - " \" \\\"font_size\\\": null,\\n\",\n", - " \" \\\"text_color\\\": null\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"5c1fab0ccc7e42c69c2b663b67ca9e3c\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", - " \" \\\"state\\\": {}\\n\",\n", - " \" },\\n\",\n", - " \" \\\"63a54817ae8b4c8d85b30d8c97e7ed0d\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HBoxModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"children\\\": [\\n\",\n", - " \" \\\"IPY_MODEL_e170d60a55a14c489d32b101293a9d33\\\",\\n\",\n", - " \" \\\"IPY_MODEL_662ad93cf7b3470f8e197350441f09ca\\\",\\n\",\n", - " \" \\\"IPY_MODEL_ac4abab2367e461e956e4e0edb27be44\\\"\\n\",\n", - " \" ],\\n\",\n", - " \" \\\"layout\\\": \\\"IPY_MODEL_c59d6fe969a04f4da332ae2a6fdb9c77\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"63f87a2410ba47d38ad9f55a81357a29\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HTMLModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"layout\\\": \\\"IPY_MODEL_ca48140488574a28a7469552441560e4\\\",\\n\",\n", - " \" \\\"style\\\": \\\"IPY_MODEL_ae2037efb9cc459e84bcc28ca7243437\\\",\\n\",\n", - " \" \\\"value\\\": \\\" 2/2 [00:03<00:00, 3.01s/block]\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"64eb2b9c8a094a1ea5f1991e5f09f5d9\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", - " \" \\\"state\\\": {}\\n\",\n", - " \" },\\n\",\n", - " \" \\\"662ad93cf7b3470f8e197350441f09ca\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"FloatProgressModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"bar_style\\\": \\\"success\\\",\\n\",\n", - " \" \\\"layout\\\": \\\"IPY_MODEL_420b4a9492c54eb48d7779f38a09fd20\\\",\\n\",\n", - " \" \\\"max\\\": 1,\\n\",\n", - " \" \\\"style\\\": \\\"IPY_MODEL_d16e93f72f3d4aeda2f5deee87e9754f\\\",\\n\",\n", - " \" \\\"value\\\": 1\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"74283969ff5446c89bb83b00a70226cf\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HTMLModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"layout\\\": \\\"IPY_MODEL_5c1fab0ccc7e42c69c2b663b67ca9e3c\\\",\\n\",\n", - " \" \\\"style\\\": \\\"IPY_MODEL_1c0f5b458ee1401eaa8de63c65802073\\\",\\n\",\n", - " \" \\\"value\\\": \\\" 6/6 [00:09<00:00, 2.48s/block]\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"75cf0c1ed25e47aab20b060f3bb44fb8\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HBoxModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"children\\\": [\\n\",\n", - " \" \\\"IPY_MODEL_21b25dd6080d42368afc06770d5e1755\\\",\\n\",\n", - " \" \\\"IPY_MODEL_c33f32b62a204ef094f67b10f8adbdc1\\\",\\n\",\n", - " \" \\\"IPY_MODEL_74283969ff5446c89bb83b00a70226cf\\\"\\n\",\n", - " \" ],\\n\",\n", - " \" \\\"layout\\\": \\\"IPY_MODEL_91df4ac76fd744539d4237d6099f34a5\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"7ff32d7deac14f21ab0f0939fe09e440\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"ProgressStyleModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"description_width\\\": \\\"\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"91df4ac76fd744539d4237d6099f34a5\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"display\\\": \\\"inline-flex\\\",\\n\",\n", - " \" \\\"flex_flow\\\": \\\"row wrap\\\",\\n\",\n", - " \" \\\"width\\\": \\\"100%\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"981634b52a7a4ffdae6186061c0b6482\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HBoxModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"children\\\": [\\n\",\n", - " \" \\\"IPY_MODEL_f65266f861cf40ef84e9ec74a8e0b44c\\\",\\n\",\n", - " \" \\\"IPY_MODEL_9aaf514a5035413d8cbbad58aa0221f4\\\",\\n\",\n", - " \" \\\"IPY_MODEL_63f87a2410ba47d38ad9f55a81357a29\\\"\\n\",\n", - " \" ],\\n\",\n", - " \" \\\"layout\\\": \\\"IPY_MODEL_104c0d4e90244ebc959e51a58794dcf4\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"9aaf514a5035413d8cbbad58aa0221f4\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"FloatProgressModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"bar_style\\\": \\\"success\\\",\\n\",\n", - " \" \\\"layout\\\": \\\"IPY_MODEL_b25523a221fd4b5e9211d07ef39cccf5\\\",\\n\",\n", - " \" \\\"max\\\": 2,\\n\",\n", - " \" \\\"style\\\": \\\"IPY_MODEL_318aea09479a479981dcfa29bc856c67\\\",\\n\",\n", - " \" \\\"value\\\": 2\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"9fe5348964cd4f7880bcd33204bbc7a2\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", - " \" \\\"state\\\": {}\\n\",\n", - " \" },\\n\",\n", - " \" \\\"a03d238db31145b881a1be478f9eb72f\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HTMLStyleModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"description_width\\\": \\\"\\\",\\n\",\n", - " \" \\\"font_size\\\": null,\\n\",\n", - " \" \\\"text_color\\\": null\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"a6aabcd2e57348a49bb59477f6a9fd90\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"FloatProgressModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"bar_style\\\": \\\"success\\\",\\n\",\n", - " \" \\\"layout\\\": \\\"IPY_MODEL_cfb02c9c7447491ca00bbb6acd99bb79\\\",\\n\",\n", - " \" \\\"max\\\": 26,\\n\",\n", - " \" \\\"style\\\": \\\"IPY_MODEL_7ff32d7deac14f21ab0f0939fe09e440\\\",\\n\",\n", - " \" \\\"value\\\": 26\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"ac4abab2367e461e956e4e0edb27be44\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HTMLModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"layout\\\": \\\"IPY_MODEL_58eaddb54c8840da83d1f6503d6ba64f\\\",\\n\",\n", - " \" \\\"style\\\": \\\"IPY_MODEL_a03d238db31145b881a1be478f9eb72f\\\",\\n\",\n", - " \" \\\"value\\\": \\\" 3/? [00:00<00:00, 8.29block/s]\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"ae2037efb9cc459e84bcc28ca7243437\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HTMLStyleModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"description_width\\\": \\\"\\\",\\n\",\n", - " \" \\\"font_size\\\": null,\\n\",\n", - " \" \\\"text_color\\\": null\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"b25523a221fd4b5e9211d07ef39cccf5\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"flex\\\": \\\"2\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"b9810ee38bbe43f4bba100e53379be65\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HTMLModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"layout\\\": \\\"IPY_MODEL_42afe4fae9dd4bc4a341a231cf7a9c32\\\",\\n\",\n", - " \" \\\"style\\\": \\\"IPY_MODEL_fdcea609ee7349629604217b625371d3\\\",\\n\",\n", - " \" \\\"value\\\": \\\" 26/26 [00:01<00:00, 18.92block/s]\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"c33f32b62a204ef094f67b10f8adbdc1\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"FloatProgressModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"bar_style\\\": \\\"success\\\",\\n\",\n", - " \" \\\"layout\\\": \\\"IPY_MODEL_d23d88490a1b4941b8ca228b7d4a39cb\\\",\\n\",\n", - " \" \\\"max\\\": 6,\\n\",\n", - " \" \\\"style\\\": \\\"IPY_MODEL_2693aae410f04e7587f0400b5eef1079\\\",\\n\",\n", - " \" \\\"value\\\": 6\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"c59d6fe969a04f4da332ae2a6fdb9c77\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"display\\\": \\\"inline-flex\\\",\\n\",\n", - " \" \\\"flex_flow\\\": \\\"row wrap\\\",\\n\",\n", - " \" \\\"width\\\": \\\"100%\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"ca48140488574a28a7469552441560e4\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", - " \" \\\"state\\\": {}\\n\",\n", - " \" },\\n\",\n", - " \" \\\"cfb02c9c7447491ca00bbb6acd99bb79\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"flex\\\": \\\"2\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"d16e93f72f3d4aeda2f5deee87e9754f\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"ProgressStyleModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"description_width\\\": \\\"\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"d23d88490a1b4941b8ca228b7d4a39cb\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"flex\\\": \\\"2\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"d565a20d37e84ed0a1195e9a90154960\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HBoxModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"children\\\": [\\n\",\n", - " \" \\\"IPY_MODEL_db696e15587c4a54b82886b3eb5a0c96\\\",\\n\",\n", - " \" \\\"IPY_MODEL_a6aabcd2e57348a49bb59477f6a9fd90\\\",\\n\",\n", - " \" \\\"IPY_MODEL_b9810ee38bbe43f4bba100e53379be65\\\"\\n\",\n", - " \" ],\\n\",\n", - " \" \\\"layout\\\": \\\"IPY_MODEL_eab4b060672b4dd5a73ca7bb8f782cd2\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"db696e15587c4a54b82886b3eb5a0c96\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HTMLModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"layout\\\": \\\"IPY_MODEL_64eb2b9c8a094a1ea5f1991e5f09f5d9\\\",\\n\",\n", - " \" \\\"style\\\": \\\"IPY_MODEL_5b3e72b71f304230bc36bb91f9c173be\\\",\\n\",\n", - " \" \\\"value\\\": \\\"Step 1 / 2 Writing Blocks: 100%\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"e170d60a55a14c489d32b101293a9d33\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HTMLModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"layout\\\": \\\"IPY_MODEL_9fe5348964cd4f7880bcd33204bbc7a2\\\",\\n\",\n", - " \" \\\"style\\\": \\\"IPY_MODEL_4df685a95de542ffab6f265df89b8949\\\",\\n\",\n", - " \" \\\"value\\\": \\\"Step 2 / 2 Concat Blocks: \\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"e66368cda8124001b16459a0634029e2\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HTMLStyleModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"description_width\\\": \\\"\\\",\\n\",\n", - " \" \\\"font_size\\\": null,\\n\",\n", - " \" \\\"text_color\\\": null\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"eab4b060672b4dd5a73ca7bb8f782cd2\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"display\\\": \\\"inline-flex\\\",\\n\",\n", - " \" \\\"flex_flow\\\": \\\"row wrap\\\",\\n\",\n", - " \" \\\"width\\\": \\\"100%\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"f65266f861cf40ef84e9ec74a8e0b44c\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HTMLModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"layout\\\": \\\"IPY_MODEL_fff4199774534d9f982f03738fbb08e7\\\",\\n\",\n", - " \" \\\"style\\\": \\\"IPY_MODEL_e66368cda8124001b16459a0634029e2\\\",\\n\",\n", - " \" \\\"value\\\": \\\"Scanning SEG-Y for geometry attributes: 100%\\\"\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"fdcea609ee7349629604217b625371d3\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/controls\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"HTMLStyleModel\\\",\\n\",\n", - " \" \\\"state\\\": {\\n\",\n", - " \" \\\"description_width\\\": \\\"\\\",\\n\",\n", - " \" \\\"font_size\\\": null,\\n\",\n", - " \" \\\"text_color\\\": null\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"fff4199774534d9f982f03738fbb08e7\\\": {\\n\",\n", - " \" \\\"model_module\\\": \\\"@jupyter-widgets/base\\\",\\n\",\n", - " \" \\\"model_module_version\\\": \\\"2.0.0\\\",\\n\",\n", - " \" \\\"model_name\\\": \\\"LayoutModel\\\",\\n\",\n", - " \" \\\"state\\\": {}\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"version_major\\\": 2,\\n\",\n", - " \" \\\"version_minor\\\": 0\\n\",\n", - " \" }\\n\",\n", - " \" }\\n\",\n", - " \" },\\n\",\n", - " \" \\\"nbformat\\\": 4,\\n\",\n", - " \" \\\"nbformat_minor\\\": 4\\n\",\n", - " \"}\\n\"\n", - " ]\n", - " }\n", - " ],\n", - " \"metadata\": {\n", - " \"kernelspec\": {\n", - " \"display_name\": \"Python 3 (ipykernel)\",\n", - " \"language\": \"python\",\n", - " \"name\": \"python3\"\n", - " },\n", - " \"language_info\": {\n", - " \"codemirror_mode\": {\n", - " \"name\": \"ipython\",\n", - " \"version\": 3\n", - " },\n", - " \"file_extension\": \".py\",\n", - " \"mimetype\": \"text/x-python\",\n", - " \"name\": \"python\",\n", - " \"nbconvert_exporter\": \"python\",\n", - " \"pygments_lexer\": \"ipython3\",\n", - " \"version\": \"3.12.3\"\n", - " },\n", - " \"widgets\": {\n", - " \"application/vnd.jupyter.widget-state+json\": {\n", - " \"state\": {\n", - " \"104c0d4e90244ebc959e51a58794dcf4\": {\n", - " \"model_module\": \"@jupyter-widgets/base\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"LayoutModel\",\n", - " \"state\": {\n", - " \"display\": \"inline-flex\",\n", - " \"flex_flow\": \"row wrap\",\n", - " \"width\": \"100%\"\n", - " }\n", - " },\n", - " \"1c0f5b458ee1401eaa8de63c65802073\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HTMLStyleModel\",\n", - " \"state\": {\n", - " \"description_width\": \"\",\n", - " \"font_size\": null,\n", - " \"text_color\": null\n", - " }\n", - " },\n", - " \"21b25dd6080d42368afc06770d5e1755\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HTMLModel\",\n", - " \"state\": {\n", - " \"layout\": \"IPY_MODEL_35fb49026dac479eba87217c2f6bcb9a\",\n", - " \"style\": \"IPY_MODEL_3ab3e27c83aa423d9ecdac94e576f0fe\",\n", - " \"value\": \"Ingesting SEG-Y in 6 chunks: 100%\"\n", - " }\n", - " },\n", - " \"2693aae410f04e7587f0400b5eef1079\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"ProgressStyleModel\",\n", - " \"state\": {\n", - " \"description_width\": \"\"\n", - " }\n", - " },\n", - " \"318aea09479a479981dcfa29bc856c67\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"ProgressStyleModel\",\n", - " \"state\": {\n", - " \"description_width\": \"\"\n", - " }\n", - " },\n", - " \"35fb49026dac479eba87217c2f6bcb9a\": {\n", - " \"model_module\": \"@jupyter-widgets/base\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"LayoutModel\",\n", - " \"state\": {}\n", - " },\n", - " \"3ab3e27c83aa423d9ecdac94e576f0fe\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HTMLStyleModel\",\n", - " \"state\": {\n", - " \"description_width\": \"\",\n", - " \"font_size\": null,\n", - " \"text_color\": null\n", - " }\n", - " },\n", - " \"420b4a9492c54eb48d7779f38a09fd20\": {\n", - " \"model_module\": \"@jupyter-widgets/base\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"LayoutModel\",\n", - " \"state\": {\n", - " \"flex\": \"2\"\n", - " }\n", - " },\n", - " \"42afe4fae9dd4bc4a341a231cf7a9c32\": {\n", - " \"model_module\": \"@jupyter-widgets/base\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"LayoutModel\",\n", - " \"state\": {}\n", - " },\n", - " \"4df685a95de542ffab6f265df89b8949\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HTMLStyleModel\",\n", - " \"state\": {\n", - " \"description_width\": \"\",\n", - " \"font_size\": null,\n", - " \"text_color\": null\n", - " }\n", - " },\n", - " \"58eaddb54c8840da83d1f6503d6ba64f\": {\n", - " \"model_module\": \"@jupyter-widgets/base\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"LayoutModel\",\n", - " \"state\": {}\n", - " },\n", - " \"5b3e72b71f304230bc36bb91f9c173be\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HTMLStyleModel\",\n", - " \"state\": {\n", - " \"description_width\": \"\",\n", - " \"font_size\": null,\n", - " \"text_color\": null\n", - " }\n", - " },\n", - " \"5c1fab0ccc7e42c69c2b663b67ca9e3c\": {\n", - " \"model_module\": \"@jupyter-widgets/base\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"LayoutModel\",\n", - " \"state\": {}\n", - " },\n", - " \"63a54817ae8b4c8d85b30d8c97e7ed0d\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HBoxModel\",\n", - " \"state\": {\n", - " \"children\": [\n", - " \"IPY_MODEL_e170d60a55a14c489d32b101293a9d33\",\n", - " \"IPY_MODEL_662ad93cf7b3470f8e197350441f09ca\",\n", - " \"IPY_MODEL_ac4abab2367e461e956e4e0edb27be44\"\n", - " ],\n", - " \"layout\": \"IPY_MODEL_c59d6fe969a04f4da332ae2a6fdb9c77\"\n", - " }\n", - " },\n", - " \"63f87a2410ba47d38ad9f55a81357a29\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HTMLModel\",\n", - " \"state\": {\n", - " \"layout\": \"IPY_MODEL_ca48140488574a28a7469552441560e4\",\n", - " \"style\": \"IPY_MODEL_ae2037efb9cc459e84bcc28ca7243437\",\n", - " \"value\": \" 2/2 [00:03<00:00, 3.01s/block]\"\n", - " }\n", - " },\n", - " \"64eb2b9c8a094a1ea5f1991e5f09f5d9\": {\n", - " \"model_module\": \"@jupyter-widgets/base\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"LayoutModel\",\n", - " \"state\": {}\n", - " },\n", - " \"662ad93cf7b3470f8e197350441f09ca\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"FloatProgressModel\",\n", - " \"state\": {\n", - " \"bar_style\": \"success\",\n", - " \"layout\": \"IPY_MODEL_420b4a9492c54eb48d7779f38a09fd20\",\n", - " \"max\": 1,\n", - " \"style\": \"IPY_MODEL_d16e93f72f3d4aeda2f5deee87e9754f\",\n", - " \"value\": 1\n", - " }\n", - " },\n", - " \"74283969ff5446c89bb83b00a70226cf\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HTMLModel\",\n", - " \"state\": {\n", - " \"layout\": \"IPY_MODEL_5c1fab0ccc7e42c69c2b663b67ca9e3c\",\n", - " \"style\": \"IPY_MODEL_1c0f5b458ee1401eaa8de63c65802073\",\n", - " \"value\": \" 6/6 [00:09<00:00, 2.48s/block]\"\n", - " }\n", - " },\n", - " \"75cf0c1ed25e47aab20b060f3bb44fb8\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HBoxModel\",\n", - " \"state\": {\n", - " \"children\": [\n", - " \"IPY_MODEL_21b25dd6080d42368afc06770d5e1755\",\n", - " \"IPY_MODEL_c33f32b62a204ef094f67b10f8adbdc1\",\n", - " \"IPY_MODEL_74283969ff5446c89bb83b00a70226cf\"\n", - " ],\n", - " \"layout\": \"IPY_MODEL_91df4ac76fd744539d4237d6099f34a5\"\n", - " }\n", - " },\n", - " \"7ff32d7deac14f21ab0f0939fe09e440\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"ProgressStyleModel\",\n", - " \"state\": {\n", - " \"description_width\": \"\"\n", - " }\n", - " },\n", - " \"91df4ac76fd744539d4237d6099f34a5\": {\n", - " \"model_module\": \"@jupyter-widgets/base\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"LayoutModel\",\n", - " \"state\": {\n", - " \"display\": \"inline-flex\",\n", - " \"flex_flow\": \"row wrap\",\n", - " \"width\": \"100%\"\n", - " }\n", - " },\n", - " \"981634b52a7a4ffdae6186061c0b6482\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HBoxModel\",\n", - " \"state\": {\n", - " \"children\": [\n", - " \"IPY_MODEL_f65266f861cf40ef84e9ec74a8e0b44c\",\n", - " \"IPY_MODEL_9aaf514a5035413d8cbbad58aa0221f4\",\n", - " \"IPY_MODEL_63f87a2410ba47d38ad9f55a81357a29\"\n", - " ],\n", - " \"layout\": \"IPY_MODEL_104c0d4e90244ebc959e51a58794dcf4\"\n", - " }\n", - " },\n", - " \"9aaf514a5035413d8cbbad58aa0221f4\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"FloatProgressModel\",\n", - " \"state\": {\n", - " \"bar_style\": \"success\",\n", - " \"layout\": \"IPY_MODEL_b25523a221fd4b5e9211d07ef39cccf5\",\n", - " \"max\": 2,\n", - " \"style\": \"IPY_MODEL_318aea09479a479981dcfa29bc856c67\",\n", - " \"value\": 2\n", - " }\n", - " },\n", - " \"9fe5348964cd4f7880bcd33204bbc7a2\": {\n", - " \"model_module\": \"@jupyter-widgets/base\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"LayoutModel\",\n", - " \"state\": {}\n", - " },\n", - " \"a03d238db31145b881a1be478f9eb72f\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HTMLStyleModel\",\n", - " \"state\": {\n", - " \"description_width\": \"\",\n", - " \"font_size\": null,\n", - " \"text_color\": null\n", - " }\n", - " },\n", - " \"a6aabcd2e57348a49bb59477f6a9fd90\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"FloatProgressModel\",\n", - " \"state\": {\n", - " \"bar_style\": \"success\",\n", - " \"layout\": \"IPY_MODEL_cfb02c9c7447491ca00bbb6acd99bb79\",\n", - " \"max\": 26,\n", - " \"style\": \"IPY_MODEL_7ff32d7deac14f21ab0f0939fe09e440\",\n", - " \"value\": 26\n", - " }\n", - " },\n", - " \"ac4abab2367e461e956e4e0edb27be44\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HTMLModel\",\n", - " \"state\": {\n", - " \"layout\": \"IPY_MODEL_58eaddb54c8840da83d1f6503d6ba64f\",\n", - " \"style\": \"IPY_MODEL_a03d238db31145b881a1be478f9eb72f\",\n", - " \"value\": \" 3/? [00:00<00:00, 8.29block/s]\"\n", - " }\n", - " },\n", - " \"ae2037efb9cc459e84bcc28ca7243437\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HTMLStyleModel\",\n", - " \"state\": {\n", - " \"description_width\": \"\",\n", - " \"font_size\": null,\n", - " \"text_color\": null\n", - " }\n", - " },\n", - " \"b25523a221fd4b5e9211d07ef39cccf5\": {\n", - " \"model_module\": \"@jupyter-widgets/base\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"LayoutModel\",\n", - " \"state\": {\n", - " \"flex\": \"2\"\n", - " }\n", - " },\n", - " \"b9810ee38bbe43f4bba100e53379be65\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HTMLModel\",\n", - " \"state\": {\n", - " \"layout\": \"IPY_MODEL_42afe4fae9dd4bc4a341a231cf7a9c32\",\n", - " \"style\": \"IPY_MODEL_fdcea609ee7349629604217b625371d3\",\n", - " \"value\": \" 26/26 [00:01<00:00, 18.92block/s]\"\n", - " }\n", - " },\n", - " \"c33f32b62a204ef094f67b10f8adbdc1\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"FloatProgressModel\",\n", - " \"state\": {\n", - " \"bar_style\": \"success\",\n", - " \"layout\": \"IPY_MODEL_d23d88490a1b4941b8ca228b7d4a39cb\",\n", - " \"max\": 6,\n", - " \"style\": \"IPY_MODEL_2693aae410f04e7587f0400b5eef1079\",\n", - " \"value\": 6\n", - " }\n", - " },\n", - " \"c59d6fe969a04f4da332ae2a6fdb9c77\": {\n", - " \"model_module\": \"@jupyter-widgets/base\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"LayoutModel\",\n", - " \"state\": {\n", - " \"display\": \"inline-flex\",\n", - " \"flex_flow\": \"row wrap\",\n", - " \"width\": \"100%\"\n", - " }\n", - " },\n", - " \"ca48140488574a28a7469552441560e4\": {\n", - " \"model_module\": \"@jupyter-widgets/base\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"LayoutModel\",\n", - " \"state\": {}\n", - " },\n", - " \"cfb02c9c7447491ca00bbb6acd99bb79\": {\n", - " \"model_module\": \"@jupyter-widgets/base\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"LayoutModel\",\n", - " \"state\": {\n", - " \"flex\": \"2\"\n", - " }\n", - " },\n", - " \"d16e93f72f3d4aeda2f5deee87e9754f\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"ProgressStyleModel\",\n", - " \"state\": {\n", - " \"description_width\": \"\"\n", - " }\n", - " },\n", - " \"d23d88490a1b4941b8ca228b7d4a39cb\": {\n", - " \"model_module\": \"@jupyter-widgets/base\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"LayoutModel\",\n", - " \"state\": {\n", - " \"flex\": \"2\"\n", - " }\n", - " },\n", - " \"d565a20d37e84ed0a1195e9a90154960\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HBoxModel\",\n", - " \"state\": {\n", - " \"children\": [\n", - " \"IPY_MODEL_db696e15587c4a54b82886b3eb5a0c96\",\n", - " \"IPY_MODEL_a6aabcd2e57348a49bb59477f6a9fd90\",\n", - " \"IPY_MODEL_b9810ee38bbe43f4bba100e53379be65\"\n", - " ],\n", - " \"layout\": \"IPY_MODEL_eab4b060672b4dd5a73ca7bb8f782cd2\"\n", - " }\n", - " },\n", - " \"db696e15587c4a54b82886b3eb5a0c96\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HTMLModel\",\n", - " \"state\": {\n", - " \"layout\": \"IPY_MODEL_64eb2b9c8a094a1ea5f1991e5f09f5d9\",\n", - " \"style\": \"IPY_MODEL_5b3e72b71f304230bc36bb91f9c173be\",\n", - " \"value\": \"Step 1 / 2 Writing Blocks: 100%\"\n", - " }\n", - " },\n", - " \"e170d60a55a14c489d32b101293a9d33\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HTMLModel\",\n", - " \"state\": {\n", - " \"layout\": \"IPY_MODEL_9fe5348964cd4f7880bcd33204bbc7a2\",\n", - " \"style\": \"IPY_MODEL_4df685a95de542ffab6f265df89b8949\",\n", - " \"value\": \"Step 2 / 2 Concat Blocks: \"\n", - " }\n", - " },\n", - " \"e66368cda8124001b16459a0634029e2\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HTMLStyleModel\",\n", - " \"state\": {\n", - " \"description_width\": \"\",\n", - " \"font_size\": null,\n", - " \"text_color\": null\n", - " }\n", - " },\n", - " \"eab4b060672b4dd5a73ca7bb8f782cd2\": {\n", - " \"model_module\": \"@jupyter-widgets/base\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"LayoutModel\",\n", - " \"state\": {\n", - " \"display\": \"inline-flex\",\n", - " \"flex_flow\": \"row wrap\",\n", - " \"width\": \"100%\"\n", - " }\n", - " },\n", - " \"f65266f861cf40ef84e9ec74a8e0b44c\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HTMLModel\",\n", - " \"state\": {\n", - " \"layout\": \"IPY_MODEL_fff4199774534d9f982f03738fbb08e7\",\n", - " \"style\": \"IPY_MODEL_e66368cda8124001b16459a0634029e2\",\n", - " \"value\": \"Scanning SEG-Y for geometry attributes: 100%\"\n", - " }\n", - " },\n", - " \"fdcea609ee7349629604217b625371d3\": {\n", - " \"model_module\": \"@jupyter-widgets/controls\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"HTMLStyleModel\",\n", - " \"state\": {\n", - " \"description_width\": \"\",\n", - " \"font_size\": null,\n", - " \"text_color\": null\n", - " }\n", - " },\n", - " \"fff4199774534d9f982f03738fbb08e7\": {\n", - " \"model_module\": \"@jupyter-widgets/base\",\n", - " \"model_module_version\": \"2.0.0\",\n", - " \"model_name\": \"LayoutModel\",\n", - " \"state\": {}\n", - " }\n", - " },\n", - " \"version_major\": 2,\n", - " \"version_minor\": 0\n", - " }\n", - " }\n", - " },\n", - " \"nbformat\": 4,\n", - " \"nbformat_minor\": 4\n", - "}\n" + "## Copying an Existing MDIO without Data and Headers\n", + "\n", + "We also provide a `create_empty_like` function which allows us to create an MDIO file\n", + "with the same structure and basic metadata as an existing one.\n", + "\n", + "This will carry over:\n", + "* All access patterns in source MDIO\n", + "* Grid (shape, coordinates, dimensions, etc)\n", + "* Text Header\n", + "* Binary Header\n", + "\n", + "It will **NOT** carry over:\n", + "* Trace data\n", + "* Header data\n", + "* Statistics\n", + "* Live Mask" ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "ExecuteTime": { + "end_time": "2025-04-16T14:50:17.246513Z", + "start_time": "2025-04-16T14:50:17.111779Z" + } + }, + "outputs": [], + "source": [ + "from mdio import create_empty_like\n", + "\n", + "copy_path = \"copy_of_existing.mdio\"\n", + "create_empty_like(create_conf.path, copy_path)\n", + "\n", + "copy_reader = MDIOReader(copy_path)\n", + "assert copy_reader.shape == reader.shape\n", + "assert copy_reader.binary_header == reader.binary_header\n", + "assert copy_reader.stats != reader.stats" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From f6b2c34487b912f8bbd21ba263a26efa2a652105 Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Wed, 7 May 2025 09:34:33 -0500 Subject: [PATCH 13/56] update lockfile --- uv.lock | 291 ++++++-------------------------------------------------- 1 file changed, 28 insertions(+), 263 deletions(-) diff --git a/uv.lock b/uv.lock index 68edf47f8..f68944290 100644 --- a/uv.lock +++ b/uv.lock @@ -276,21 +276,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537 }, ] -[[package]] -name = "bandit" -version = "1.8.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "pyyaml" }, - { name = "rich" }, - { name = "stevedore" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1a/a5/144a45f8e67df9d66c3bc3f7e69a39537db8bff1189ab7cff4e9459215da/bandit-1.8.3.tar.gz", hash = "sha256:f5847beb654d309422985c36644649924e0ea4425c76dec2e89110b87506193a", size = 4232005 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/88/85/db74b9233e0aa27ec96891045c5e920a64dd5cbccd50f8e64e9460f48d35/bandit-1.8.3-py3-none-any.whl", hash = "sha256:28f04dc0d258e1dd0f99dee8eefa13d1cb5e3fde1a5ab0c523971f97b289bcd8", size = 129078 }, -] - [[package]] name = "beautifulsoup4" version = "4.13.3" @@ -304,34 +289,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16", size = 186015 }, ] -[[package]] -name = "black" -version = "24.10.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "mypy-extensions" }, - { name = "packaging" }, - { name = "pathspec" }, - { name = "platformdirs" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d8/0d/cc2fb42b8c50d80143221515dd7e4766995bd07c56c9a3ed30baf080b6dc/black-24.10.0.tar.gz", hash = "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875", size = 645813 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/cc/7496bb63a9b06a954d3d0ac9fe7a73f3bf1cd92d7a58877c27f4ad1e9d41/black-24.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad", size = 1607468 }, - { url = "https://files.pythonhosted.org/packages/2b/e3/69a738fb5ba18b5422f50b4f143544c664d7da40f09c13969b2fd52900e0/black-24.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50", size = 1437270 }, - { url = "https://files.pythonhosted.org/packages/c9/9b/2db8045b45844665c720dcfe292fdaf2e49825810c0103e1191515fc101a/black-24.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392", size = 1737061 }, - { url = "https://files.pythonhosted.org/packages/a3/95/17d4a09a5be5f8c65aa4a361444d95edc45def0de887810f508d3f65db7a/black-24.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175", size = 1423293 }, - { url = "https://files.pythonhosted.org/packages/90/04/bf74c71f592bcd761610bbf67e23e6a3cff824780761f536512437f1e655/black-24.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3", size = 1644256 }, - { url = "https://files.pythonhosted.org/packages/4c/ea/a77bab4cf1887f4b2e0bce5516ea0b3ff7d04ba96af21d65024629afedb6/black-24.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65", size = 1448534 }, - { url = "https://files.pythonhosted.org/packages/4e/3e/443ef8bc1fbda78e61f79157f303893f3fddf19ca3c8989b163eb3469a12/black-24.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f", size = 1761892 }, - { url = "https://files.pythonhosted.org/packages/52/93/eac95ff229049a6901bc84fec6908a5124b8a0b7c26ea766b3b8a5debd22/black-24.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8", size = 1434796 }, - { url = "https://files.pythonhosted.org/packages/d0/a0/a993f58d4ecfba035e61fca4e9f64a2ecae838fc9f33ab798c62173ed75c/black-24.10.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981", size = 1643986 }, - { url = "https://files.pythonhosted.org/packages/37/d5/602d0ef5dfcace3fb4f79c436762f130abd9ee8d950fa2abdbf8bbc555e0/black-24.10.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b", size = 1448085 }, - { url = "https://files.pythonhosted.org/packages/47/6d/a3a239e938960df1a662b93d6230d4f3e9b4a22982d060fc38c42f45a56b/black-24.10.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2", size = 1760928 }, - { url = "https://files.pythonhosted.org/packages/dd/cf/af018e13b0eddfb434df4d9cd1b2b7892bab119f7a20123e93f6910982e8/black-24.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b", size = 1436875 }, - { url = "https://files.pythonhosted.org/packages/8d/a7/4b27c50537ebca8bec139b872861f9d2bf501c5ec51fcf897cb924d9e264/black-24.10.0-py3-none-any.whl", hash = "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d", size = 206898 }, -] - [[package]] name = "bokeh" version = "3.7.2" @@ -740,15 +697,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/57/ff/f3b4b2d007c2a646b0f69440ab06224f9cf37a977a72cdb7b50632174e8a/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390", size = 4107081 }, ] -[[package]] -name = "darglint" -version = "1.8.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d4/2c/86e8549e349388c18ca8a4ff8661bb5347da550f598656d32a98eaaf91cc/darglint-1.8.1.tar.gz", hash = "sha256:080d5106df149b199822e7ee7deb9c012b49891538f14a11be681044f0bb20da", size = 74435 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/28/85d1e0396d64422c5218d68e5cdcc53153aa8a2c83c7dbc3ee1502adf3a1/darglint-1.8.1-py3-none-any.whl", hash = "sha256:5ae11c259c17b0701618a20c3da343a3eb98b3bc4b5a83d31cdd94f5ebdced8d", size = 120767 }, -] - [[package]] name = "dask" version = "2025.3.0" @@ -905,73 +853,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163 }, ] -[[package]] -name = "flake8" -version = "7.2.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mccabe" }, - { name = "pycodestyle" }, - { name = "pyflakes" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e7/c4/5842fc9fc94584c455543540af62fd9900faade32511fab650e9891ec225/flake8-7.2.0.tar.gz", hash = "sha256:fa558ae3f6f7dbf2b4f22663e5343b6b6023620461f8d4ff2019ef4b5ee70426", size = 48177 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/83/5c/0627be4c9976d56b1217cb5187b7504e7fd7d3503f8bfd312a04077bd4f7/flake8-7.2.0-py2.py3-none-any.whl", hash = "sha256:93b92ba5bdb60754a6da14fa3b93a9361fd00a59632ada61fd7b130436c40343", size = 57786 }, -] - -[[package]] -name = "flake8-bandit" -version = "4.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "bandit" }, - { name = "flake8" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/77/1c/4f66a7a52a246d6c64312b5c40da3af3630cd60b27af81b137796af3c0bc/flake8_bandit-4.1.1.tar.gz", hash = "sha256:068e09287189cbfd7f986e92605adea2067630b75380c6b5733dab7d87f9a84e", size = 5403 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/5f/55bab0ac89f9ad9f4c6e38087faa80c252daec4ccb7776b4dac216ca9e3f/flake8_bandit-4.1.1-py3-none-any.whl", hash = "sha256:4c8a53eb48f23d4ef1e59293657181a3c989d0077c9952717e98a0eace43e06d", size = 4828 }, -] - -[[package]] -name = "flake8-bugbear" -version = "24.12.12" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "flake8" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c7/25/48ba712ff589b0149f21135234f9bb45c14d6689acc6151b5e2ff8ac2ae9/flake8_bugbear-24.12.12.tar.gz", hash = "sha256:46273cef0a6b6ff48ca2d69e472f41420a42a46e24b2a8972e4f0d6733d12a64", size = 82907 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/21/0a875f75fbe4008bd171e2fefa413536258fe6b4cfaaa087986de74588f4/flake8_bugbear-24.12.12-py3-none-any.whl", hash = "sha256:1b6967436f65ca22a42e5373aaa6f2d87966ade9aa38d4baf2a1be550767545e", size = 36664 }, -] - -[[package]] -name = "flake8-docstrings" -version = "1.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "flake8" }, - { name = "pydocstyle" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/93/24/f839e3a06e18f4643ccb81370909a497297909f15106e6af2fecdef46894/flake8_docstrings-1.7.0.tar.gz", hash = "sha256:4c8cc748dc16e6869728699e5d0d685da9a10b0ea718e090b1ba088e67a941af", size = 5995 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/7d/76a278fa43250441ed9300c344f889c7fb1817080c8fb8996b840bf421c2/flake8_docstrings-1.7.0-py2.py3-none-any.whl", hash = "sha256:51f2344026da083fc084166a9353f5082b01f72901df422f74b4d953ae88ac75", size = 4994 }, -] - -[[package]] -name = "flake8-rst-docstrings" -version = "0.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "flake8" }, - { name = "pygments" }, - { name = "restructuredtext-lint" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b2/e5/013d5858b69b4ba38ff259d55bd8d107009f212f296be0824b7c4a27d7ed/flake8-rst-docstrings-0.3.0.tar.gz", hash = "sha256:d1ce22b4bd37b73cd86b8d980e946ef198cfcc18ed82fedb674ceaa2f8d1afa4", size = 19865 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/bf/0e6933d78d172df672325622bf1b7f8364f4a6515da9e89398227c19d02e/flake8_rst_docstrings-0.3.0-py3-none-any.whl", hash = "sha256:f8c3c6892ff402292651c31983a38da082480ad3ba253743de52989bdc84ca1c", size = 10892 }, -] - [[package]] name = "flexcache" version = "0.3" @@ -1382,15 +1263,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320 }, ] -[[package]] -name = "isort" -version = "5.13.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/87/f9/c1eb8635a24e87ade2efce21e3ce8cd6b8630bb685ddc9cdaca1349b2eb5/isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109", size = 175303 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/b3/8def84f539e7d2289a02f0524b944b15d7c75dab7628bedf1c4f0992029c/isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6", size = 92310 }, -] - [[package]] name = "jedi" version = "0.19.2" @@ -1637,15 +1509,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, ] -[[package]] -name = "mccabe" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350 }, -] - [[package]] name = "mdit-py-plugins" version = "0.4.2" @@ -1839,23 +1702,14 @@ lossy = [ [package.dev-dependencies] dev = [ - { name = "black" }, { name = "coverage", extra = ["toml"] }, - { name = "darglint" }, - { name = "flake8" }, - { name = "flake8-bandit" }, - { name = "flake8-bugbear" }, - { name = "flake8-docstrings" }, - { name = "flake8-rst-docstrings" }, - { name = "isort" }, { name = "mypy" }, - { name = "pep8-naming" }, { name = "pre-commit" }, { name = "pre-commit-hooks" }, { name = "pygments" }, { name = "pytest" }, { name = "pytest-dependency" }, - { name = "pyupgrade" }, + { name = "ruff" }, { name = "safety" }, { name = "typeguard" }, { name = "xdoctest", extra = ["colors"] }, @@ -1890,30 +1744,21 @@ requires-dist = [ { name = "segy", specifier = ">=0.4.0,<0.5.0" }, { name = "tqdm", specifier = ">=4.67.0,<5.0.0" }, { name = "xarray", specifier = ">=2025.3.1" }, - { name = "zarr", specifier = ">=3.0.3,<3.0.7" }, + { name = "zarr", specifier = ">=3.0.4,<3.0.7" }, { name = "zfpy", marker = "extra == 'lossy'", specifier = ">=1.0.1,<2.0.0" }, ] provides-extras = ["cloud", "distributed", "lossy"] [package.metadata.requires-dev] dev = [ - { name = "black", specifier = ">=24.10.0,<25" }, { name = "coverage", extras = ["toml"], specifier = ">=7.6.7,<8" }, - { name = "darglint", specifier = ">=1.8.1,<2" }, - { name = "flake8", specifier = ">=7.1.0,<8" }, - { name = "flake8-bandit", specifier = ">=4.1.1,<5" }, - { name = "flake8-bugbear", specifier = ">=24.4.26,<25" }, - { name = "flake8-docstrings", specifier = ">=1.7.0,<2" }, - { name = "flake8-rst-docstrings", specifier = ">=0.3.0,<0.4" }, - { name = "isort", specifier = ">=5.13.2,<6" }, { name = "mypy", specifier = ">=1.13.0,<2" }, - { name = "pep8-naming", specifier = ">=0.14.1,<0.15" }, { name = "pre-commit", specifier = ">=4.0.1,<5" }, { name = "pre-commit-hooks", specifier = ">=5.0.0,<6" }, { name = "pygments", specifier = ">=2.18.0,<3" }, { name = "pytest", specifier = ">=8.3.3,<9" }, { name = "pytest-dependency", specifier = ">=0.6.0,<0.7" }, - { name = "pyupgrade", specifier = ">=3.19.0,<4" }, + { name = "ruff", specifier = ">=0.11.8" }, { name = "safety", specifier = ">=3.2.3,<4" }, { name = "typeguard", specifier = ">=4.4.1,<5" }, { name = "xdoctest", extras = ["colors"], specifier = ">=1.2.0,<2" }, @@ -2264,39 +2109,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl", hash = "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", size = 18905 }, ] -[[package]] -name = "pathspec" -version = "0.12.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, -] - -[[package]] -name = "pbr" -version = "6.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "setuptools" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/01/d2/510cc0d218e753ba62a1bc1434651db3cd797a9716a0a66cc714cb4f0935/pbr-6.1.1.tar.gz", hash = "sha256:93ea72ce6989eb2eed99d0f75721474f69ad88128afdef5ac377eb797c4bf76b", size = 125702 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/ac/684d71315abc7b1214d59304e23a982472967f6bf4bde5a98f1503f648dc/pbr-6.1.1-py2.py3-none-any.whl", hash = "sha256:38d4daea5d9fa63b3f626131b9d34947fd0c8be9b05a29276870580050a25a76", size = 108997 }, -] - -[[package]] -name = "pep8-naming" -version = "0.14.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "flake8" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/be/8e/1de32e908d8b008bb9352bfe7749aedecb71e2793d36c7ee342716acd1ec/pep8-naming-0.14.1.tar.gz", hash = "sha256:1ef228ae80875557eb6c1549deafed4dabbf3261cfcafa12f773fe0db9be8a36", size = 16546 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/a2/450b71d1a87fcee50a7b994a53b1c68fc6a6b718df0eb035f2bffb2d3a4f/pep8_naming-0.14.1-py3-none-any.whl", hash = "sha256:63f514fc777d715f935faf185dedd679ab99526a7f2f503abb61587877f7b1c5", size = 8859 }, -] - [[package]] name = "pexpect" version = "4.9.0" @@ -2594,15 +2406,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259 }, ] -[[package]] -name = "pycodestyle" -version = "2.13.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/04/6e/1f4a62078e4d95d82367f24e685aef3a672abfd27d1a868068fed4ed2254/pycodestyle-2.13.0.tar.gz", hash = "sha256:c8415bf09abe81d9c7f872502a6eee881fbe85d8763dd5b9924bb0a01d67efae", size = 39312 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/07/be/b00116df1bfb3e0bb5b45e29d604799f7b91dd861637e4d448b4e09e6a3e/pycodestyle-2.13.0-py2.py3-none-any.whl", hash = "sha256:35863c5974a271c7a726ed228a14a4f6daf49df369d8c50cd9a6f58a5e143ba9", size = 31424 }, -] - [[package]] name = "pycparser" version = "2.22" @@ -2686,27 +2489,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c", size = 30839 }, ] -[[package]] -name = "pydocstyle" -version = "6.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "snowballstemmer" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/d5385ca59fd065e3c6a5fe19f9bc9d5ea7f2509fa8c9c22fb6b2031dd953/pydocstyle-6.3.0.tar.gz", hash = "sha256:7ce43f0c0ac87b07494eb9c0b462c0b73e6ff276807f204d6b53edc72b7e44e1", size = 36796 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/36/ea/99ddefac41971acad68f14114f38261c1f27dac0b3ec529824ebc739bdaa/pydocstyle-6.3.0-py3-none-any.whl", hash = "sha256:118762d452a49d6b05e194ef344a55822987a462831ade91ec5c06fd2169d019", size = 38038 }, -] - -[[package]] -name = "pyflakes" -version = "3.3.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/cc/1df338bd7ed1fa7c317081dcf29bf2f01266603b301e6858856d346a12b3/pyflakes-3.3.2.tar.gz", hash = "sha256:6dfd61d87b97fba5dcfaaf781171ac16be16453be6d816147989e7f6e6a9576b", size = 64175 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/15/40/b293a4fa769f3b02ab9e387c707c4cbdc34f073f945de0386107d4e669e6/pyflakes-3.3.2-py2.py3-none-any.whl", hash = "sha256:5039c8339cbb1944045f4ee5466908906180f13cc99cc9949348d10f82a5c32a", size = 63164 }, -] - [[package]] name = "pygments" version = "2.19.1" @@ -2785,18 +2567,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, ] -[[package]] -name = "pyupgrade" -version = "3.19.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "tokenize-rt" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/35/3a/efa8e75cf84d53f1b3f0113387ab120ef460396a4068e41b6cf18a3d216d/pyupgrade-3.19.1.tar.gz", hash = "sha256:d10e8c5f54b8327211828769e98d95d95e4715de632a3414f1eef3f51357b9e2", size = 45116 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/dd/43/c6c1ff945c7900613f6e6ef2a8688639a247d62eb0ffa9935c599f69c08e/pyupgrade-3.19.1-py2.py3-none-any.whl", hash = "sha256:8c5b0bfacae5ff30fa136a53eb7f22c34ba007450d4099e9da8089dabb9e67c9", size = 62412 }, -] - [[package]] name = "pywin32" version = "310" @@ -3059,15 +2829,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179 }, ] -[[package]] -name = "restructuredtext-lint" -version = "1.4.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "docutils" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/48/9c/6d8035cafa2d2d314f34e6cd9313a299de095b26e96f1c7312878f988eec/restructuredtext_lint-1.4.0.tar.gz", hash = "sha256:1b235c0c922341ab6c530390892eb9e92f90b9b75046063e047cacfb0f050c45", size = 16723 } - [[package]] name = "rich" version = "13.9.4" @@ -3220,6 +2981,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190 }, ] +[[package]] +name = "ruff" +version = "0.11.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/f6/adcf73711f31c9f5393862b4281c875a462d9f639f4ccdf69dc368311c20/ruff-0.11.8.tar.gz", hash = "sha256:6d742d10626f9004b781f4558154bb226620a7242080e11caeffab1a40e99df8", size = 4086399 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/60/c6aa9062fa518a9f86cb0b85248245cddcd892a125ca00441df77d79ef88/ruff-0.11.8-py3-none-linux_armv6l.whl", hash = "sha256:896a37516c594805e34020c4a7546c8f8a234b679a7716a3f08197f38913e1a3", size = 10272473 }, + { url = "https://files.pythonhosted.org/packages/a0/e4/0325e50d106dc87c00695f7bcd5044c6d252ed5120ebf423773e00270f50/ruff-0.11.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ab86d22d3d721a40dd3ecbb5e86ab03b2e053bc93c700dc68d1c3346b36ce835", size = 11040862 }, + { url = "https://files.pythonhosted.org/packages/e6/27/b87ea1a7be37fef0adbc7fd987abbf90b6607d96aa3fc67e2c5b858e1e53/ruff-0.11.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:258f3585057508d317610e8a412788cf726efeefa2fec4dba4001d9e6f90d46c", size = 10385273 }, + { url = "https://files.pythonhosted.org/packages/d3/f7/3346161570d789045ed47a86110183f6ac3af0e94e7fd682772d89f7f1a1/ruff-0.11.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:727d01702f7c30baed3fc3a34901a640001a2828c793525043c29f7614994a8c", size = 10578330 }, + { url = "https://files.pythonhosted.org/packages/c6/c3/327fb950b4763c7b3784f91d3038ef10c13b2d42322d4ade5ce13a2f9edb/ruff-0.11.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3dca977cc4fc8f66e89900fa415ffe4dbc2e969da9d7a54bfca81a128c5ac219", size = 10122223 }, + { url = "https://files.pythonhosted.org/packages/de/c7/ba686bce9adfeb6c61cb1bbadc17d58110fe1d602f199d79d4c880170f19/ruff-0.11.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c657fa987d60b104d2be8b052d66da0a2a88f9bd1d66b2254333e84ea2720c7f", size = 11697353 }, + { url = "https://files.pythonhosted.org/packages/53/8e/a4fb4a1ddde3c59e73996bb3ac51844ff93384d533629434b1def7a336b0/ruff-0.11.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f2e74b021d0de5eceb8bd32919f6ff8a9b40ee62ed97becd44993ae5b9949474", size = 12375936 }, + { url = "https://files.pythonhosted.org/packages/ad/a1/9529cb1e2936e2479a51aeb011307e7229225df9ac64ae064d91ead54571/ruff-0.11.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9b5ef39820abc0f2c62111f7045009e46b275f5b99d5e59dda113c39b7f4f38", size = 11850083 }, + { url = "https://files.pythonhosted.org/packages/3e/94/8f7eac4c612673ae15a4ad2bc0ee62e03c68a2d4f458daae3de0e47c67ba/ruff-0.11.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1dba3135ca503727aa4648152c0fa67c3b1385d3dc81c75cd8a229c4b2a1458", size = 14005834 }, + { url = "https://files.pythonhosted.org/packages/1e/7c/6f63b46b2be870cbf3f54c9c4154d13fac4b8827f22fa05ac835c10835b2/ruff-0.11.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f024d32e62faad0f76b2d6afd141b8c171515e4fb91ce9fd6464335c81244e5", size = 11503713 }, + { url = "https://files.pythonhosted.org/packages/3a/91/57de411b544b5fe072779678986a021d87c3ee5b89551f2ca41200c5d643/ruff-0.11.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d365618d3ad747432e1ae50d61775b78c055fee5936d77fb4d92c6f559741948", size = 10457182 }, + { url = "https://files.pythonhosted.org/packages/01/49/cfe73e0ce5ecdd3e6f1137bf1f1be03dcc819d1bfe5cff33deb40c5926db/ruff-0.11.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4d9aaa91035bdf612c8ee7266153bcf16005c7c7e2f5878406911c92a31633cb", size = 10101027 }, + { url = "https://files.pythonhosted.org/packages/56/21/a5cfe47c62b3531675795f38a0ef1c52ff8de62eaddf370d46634391a3fb/ruff-0.11.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0eba551324733efc76116d9f3a0d52946bc2751f0cd30661564117d6fd60897c", size = 11111298 }, + { url = "https://files.pythonhosted.org/packages/36/98/f76225f87e88f7cb669ae92c062b11c0a1e91f32705f829bd426f8e48b7b/ruff-0.11.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:161eb4cff5cfefdb6c9b8b3671d09f7def2f960cee33481dd898caf2bcd02304", size = 11566884 }, + { url = "https://files.pythonhosted.org/packages/de/7e/fff70b02e57852fda17bd43f99dda37b9bcf3e1af3d97c5834ff48d04715/ruff-0.11.8-py3-none-win32.whl", hash = "sha256:5b18caa297a786465cc511d7f8be19226acf9c0a1127e06e736cd4e1878c3ea2", size = 10451102 }, + { url = "https://files.pythonhosted.org/packages/7b/a9/eaa571eb70648c9bde3120a1d5892597de57766e376b831b06e7c1e43945/ruff-0.11.8-py3-none-win_amd64.whl", hash = "sha256:6e70d11043bef637c5617297bdedec9632af15d53ac1e1ba29c448da9341b0c4", size = 11597410 }, + { url = "https://files.pythonhosted.org/packages/cd/be/f6b790d6ae98f1f32c645f8540d5c96248b72343b0a56fab3a07f2941897/ruff-0.11.8-py3-none-win_arm64.whl", hash = "sha256:304432e4c4a792e3da85b7699feb3426a0908ab98bf29df22a31b0cdd098fac2", size = 10713129 }, +] + [[package]] name = "s3fs" version = "2024.12.0" @@ -3571,18 +3357,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/4b/528ccf7a982216885a1ff4908e886b8fb5f19862d1962f56a3fce2435a70/starlette-0.46.1-py3-none-any.whl", hash = "sha256:77c74ed9d2720138b25875133f3a2dae6d854af2ec37dceb56aef370c1d8a227", size = 71995 }, ] -[[package]] -name = "stevedore" -version = "5.4.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pbr" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/28/3f/13cacea96900bbd31bb05c6b74135f85d15564fc583802be56976c940470/stevedore-5.4.1.tar.gz", hash = "sha256:3135b5ae50fe12816ef291baff420acb727fcd356106e3e9cbfa9e5985cd6f4b", size = 513858 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/45/8c4ebc0c460e6ec38e62ab245ad3c7fc10b210116cea7c16d61602aa9558/stevedore-5.4.1-py3-none-any.whl", hash = "sha256:d10a31c7b86cba16c1f6e8d15416955fc797052351a56af15e608ad20811fcfe", size = 49533 }, -] - [[package]] name = "tabulate" version = "0.9.0" @@ -3601,15 +3375,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/27/44/aa5c8b10b2cce7a053018e0d132bd58e27527a0243c4985383d5b6fd93e9/tblib-3.1.0-py3-none-any.whl", hash = "sha256:670bb4582578134b3d81a84afa1b016128b429f3d48e6cbbaecc9d15675e984e", size = 12552 }, ] -[[package]] -name = "tokenize-rt" -version = "6.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6b/0a/5854d8ced8c1e00193d1353d13db82d7f813f99bd5dcb776ce3e2a4c0d19/tokenize_rt-6.1.0.tar.gz", hash = "sha256:e8ee836616c0877ab7c7b54776d2fefcc3bde714449a206762425ae114b53c86", size = 5506 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/87/ba/576aac29b10dfa49a6ce650001d1bb31f81e734660555eaf144bfe5b8995/tokenize_rt-6.1.0-py2.py3-none-any.whl", hash = "sha256:d706141cdec4aa5f358945abe36b911b8cbdc844545da99e811250c0cee9b6fc", size = 6015 }, -] - [[package]] name = "tomli" version = "2.2.1" From dbec58e9f5339ff5db71bc56351a7821c552a1bd Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Wed, 7 May 2025 09:37:45 -0500 Subject: [PATCH 14/56] lint v1 files --- src/mdio/schemas/__init__.py | 1 - src/mdio/schemas/base.py | 5 +---- src/mdio/schemas/builder.py | 2 -- src/mdio/schemas/compressors.py | 4 +--- src/mdio/schemas/dtype.py | 4 +--- src/mdio/schemas/v0/__init__.py | 1 - src/mdio/schemas/v0/dataset.py | 12 +++--------- src/mdio/schemas/v1/__init__.py | 1 - src/mdio/schemas/v1/stats.py | 8 ++------ src/mdio/schemas/v1/units.py | 13 +++---------- src/mdio/schemas/v1/variable.py | 4 +--- tests/unit/test_schema.py | 3 +-- 12 files changed, 13 insertions(+), 45 deletions(-) diff --git a/src/mdio/schemas/__init__.py b/src/mdio/schemas/__init__.py index 17ae4dd3f..8d9d8b86e 100644 --- a/src/mdio/schemas/__init__.py +++ b/src/mdio/schemas/__init__.py @@ -7,7 +7,6 @@ from mdio.schemas.dtype import StructuredField from mdio.schemas.dtype import StructuredType - __all__ = [ "Blosc", "ZFP", diff --git a/src/mdio/schemas/base.py b/src/mdio/schemas/base.py index d4bdfd480..5684fa108 100644 --- a/src/mdio/schemas/base.py +++ b/src/mdio/schemas/base.py @@ -10,7 +10,6 @@ from mdio.schemas.dimension import NamedDimension from mdio.schemas.dtype import DataTypeModel - JSON_SCHEMA_DIALECT = GenerateJsonSchema.schema_dialect @@ -31,9 +30,7 @@ class BaseArray(DataTypeModel, CamelCaseStrictModel): dimensions: list[NamedDimension] | list[str] = Field( ..., description="List of Dimension collection or reference to dimension names." ) - compressor: Blosc | ZFP | None = Field( - default=None, description="Compression settings." - ) + compressor: Blosc | ZFP | None = Field(default=None, description="Compression settings.") class NamedArray(BaseArray): diff --git a/src/mdio/schemas/builder.py b/src/mdio/schemas/builder.py index 9a0e6cbbb..40908ff02 100644 --- a/src/mdio/schemas/builder.py +++ b/src/mdio/schemas/builder.py @@ -15,7 +15,6 @@ class VariableBuilder: """Dataset builder.""" def __init__(self) -> None: - """Initialize the builder.""" self.name = None self.long_name = None self.dtype = None @@ -126,7 +125,6 @@ class DatasetBuilder: """Dataset builder.""" def __init__(self) -> None: - """Initialize the builder.""" self.variables = [] self.name = None self.metadata = None diff --git a/src/mdio/schemas/compressors.py b/src/mdio/schemas/compressors.py index b550b98dd..e17948da2 100644 --- a/src/mdio/schemas/compressors.py +++ b/src/mdio/schemas/compressors.py @@ -154,6 +154,4 @@ def make_instance(self): # noqa: ANN201 class CompressorModel(CamelCaseStrictModel): """Model representing compressor configuration.""" - compressor: Blosc | ZFP | None = Field( - default=None, description="Compression settings." - ) + compressor: Blosc | ZFP | None = Field(default=None, description="Compression settings.") diff --git a/src/mdio/schemas/dtype.py b/src/mdio/schemas/dtype.py index 5c2427b00..af7f65820 100644 --- a/src/mdio/schemas/dtype.py +++ b/src/mdio/schemas/dtype.py @@ -50,6 +50,4 @@ class StructuredType(CamelCaseStrictModel): class DataTypeModel(CamelCaseStrictModel): """Structured array type with fields and total item size.""" - data_type: ScalarType | StructuredType = Field( - ..., description="Type of the array." - ) + data_type: ScalarType | StructuredType = Field(..., description="Type of the array.") diff --git a/src/mdio/schemas/v0/__init__.py b/src/mdio/schemas/v0/__init__.py index e74f484f1..9b9533049 100644 --- a/src/mdio/schemas/v0/__init__.py +++ b/src/mdio/schemas/v0/__init__.py @@ -2,5 +2,4 @@ from mdio.schemas.v0.dataset import DatasetModelV0 - __all__ = ["DatasetModelV0"] diff --git a/src/mdio/schemas/v0/dataset.py b/src/mdio/schemas/v0/dataset.py index 58c3ae72b..50103736c 100644 --- a/src/mdio/schemas/v0/dataset.py +++ b/src/mdio/schemas/v0/dataset.py @@ -42,13 +42,9 @@ class DatasetMetadataModelV0(StrictModel): ) # Statistical information - std: float | None = Field( - default=None, description="Standard deviation of the samples." - ) + std: float | None = Field(default=None, description="Standard deviation of the samples.") - rms: float | None = Field( - default=None, description="Root mean squared value of the samples." - ) + rms: float | None = Field(default=None, description="Root mean squared value of the samples.") min: float | None = Field( default=None, @@ -60,9 +56,7 @@ class DatasetMetadataModelV0(StrictModel): description="Maximum value of the samples.", ) - trace_count: int | None = Field( - default=None, description="Number of traces in the SEG-Y file." - ) + trace_count: int | None = Field(default=None, description="Number of traces in the SEG-Y file.") class VariableModelV0(BaseArray): diff --git a/src/mdio/schemas/v1/__init__.py b/src/mdio/schemas/v1/__init__.py index 4f9bcdf36..fb98d55ec 100644 --- a/src/mdio/schemas/v1/__init__.py +++ b/src/mdio/schemas/v1/__init__.py @@ -2,5 +2,4 @@ from mdio.schemas.v1.dataset import Dataset - __all__ = ["Dataset"] diff --git a/src/mdio/schemas/v1/stats.py b/src/mdio/schemas/v1/stats.py index a8a319c02..29d50add8 100644 --- a/src/mdio/schemas/v1/stats.py +++ b/src/mdio/schemas/v1/stats.py @@ -41,12 +41,8 @@ class CenteredBinHistogram(BaseHistogram): class EdgeDefinedHistogram(BaseHistogram): """A class representing an edge-defined histogram.""" - bin_edges: list[float | int] = Field( - ..., description="The left edges of the histogram bins." - ) - bin_widths: list[float | int] = Field( - ..., description="The widths of the histogram bins." - ) + bin_edges: list[float | int] = Field(..., description="The left edges of the histogram bins.") + bin_widths: list[float | int] = Field(..., description="The widths of the histogram bins.") Histogram: TypeAlias = CenteredBinHistogram | EdgeDefinedHistogram diff --git a/src/mdio/schemas/v1/units.py b/src/mdio/schemas/v1/units.py index dd46296c0..1913ff2ed 100644 --- a/src/mdio/schemas/v1/units.py +++ b/src/mdio/schemas/v1/units.py @@ -11,7 +11,6 @@ from mdio.schemas.units import UnitEnum from mdio.schemas.units import create_unit_model - ureg = UnitRegistry() ureg.default_format = "~C" # compact, abbreviated (symbol). @@ -30,9 +29,7 @@ class LengthUnitEnum(UnitEnum): MILE = ureg.mile -LengthUnitModel = create_unit_model( - LengthUnitEnum, "LengthUnitModel", "length", __name__ -) +LengthUnitModel = create_unit_model(LengthUnitEnum, "LengthUnitModel", "length", __name__) class TimeUnitEnum(UnitEnum): @@ -58,9 +55,7 @@ class DensityUnitEnum(UnitEnum): POUNDS_PER_GAL = ureg.pounds / ureg.gallon -DensityUnitModel = create_unit_model( - DensityUnitEnum, "DensityUnitModel", "density", __name__ -) +DensityUnitModel = create_unit_model(DensityUnitEnum, "DensityUnitModel", "density", __name__) class SpeedUnitEnum(UnitEnum): @@ -102,9 +97,7 @@ class VoltageUnitEnum(UnitEnum): VOLT = ureg.volt -VoltageUnitModel = create_unit_model( - VoltageUnitEnum, "VoltageUnitModel", "voltage", __name__ -) +VoltageUnitModel = create_unit_model(VoltageUnitEnum, "VoltageUnitModel", "voltage", __name__) # Composite model types diff --git a/src/mdio/schemas/v1/variable.py b/src/mdio/schemas/v1/variable.py index 22ad0bf33..519a89f42 100644 --- a/src/mdio/schemas/v1/variable.py +++ b/src/mdio/schemas/v1/variable.py @@ -50,6 +50,4 @@ class Variable(NamedArray): default=None, description="Coordinates of the MDIO variable dimensions.", ) - metadata: VariableMetadata | None = Field( - default=None, description="Variable metadata." - ) + metadata: VariableMetadata | None = Field(default=None, description="Variable metadata.") diff --git a/tests/unit/test_schema.py b/tests/unit/test_schema.py index 1bccde5a0..0b2a9f545 100644 --- a/tests/unit/test_schema.py +++ b/tests/unit/test_schema.py @@ -2,7 +2,6 @@ from mdio.schemas.v1 import Dataset as V1Dataset - TEST_SCHEMA = { "metadata": { "name": "test_dataset", @@ -49,6 +48,6 @@ } -def test_dataset_schema_validation(): +def test_dataset_schema_validation() -> None: """Test that the dataset schema validates correctly.""" V1Dataset.model_validate(TEST_SCHEMA) From ecb69d6d2a9ef4a8695243afda69c07c13de5d51 Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Tue, 27 May 2025 09:05:14 -0500 Subject: [PATCH 15/56] update lock file --- uv.lock | 1873 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 1001 insertions(+), 872 deletions(-) diff --git a/uv.lock b/uv.lock index f68944290..de95c4e6f 100644 --- a/uv.lock +++ b/uv.lock @@ -26,7 +26,7 @@ wheels = [ [[package]] name = "aiobotocore" -version = "2.21.1" +version = "2.22.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -37,9 +37,9 @@ dependencies = [ { name = "python-dateutil" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d2/dc/f5f872fb01ce37c09525cedc7ecfad7002ffe2a8a23f77d7d2c234399b51/aiobotocore-2.21.1.tar.gz", hash = "sha256:010357f43004413e92a9d066bb0db1f241aeb29ffed306e9197061ffc94e6577", size = 108900 } +sdist = { url = "https://files.pythonhosted.org/packages/9c/4c/113c4f5611103bba8e5252805fbee7944f5d9541addba9a96b091c0c4308/aiobotocore-2.22.0.tar.gz", hash = "sha256:11091477266b75c2b5d28421c1f2bc9a87d175d0b8619cb830805e7a113a170b", size = 110322 } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/67/026598918f92145156f2feb7957f57daefda20375cc2ac1a0692a9b8010b/aiobotocore-2.21.1-py3-none-any.whl", hash = "sha256:bd7c49a6d6f8a3d9444b0a94417c8da13813b5c7eec1c4f0ec2db7e8ce8f23e7", size = 78313 }, + { url = "https://files.pythonhosted.org/packages/00/8e/ffa5840cb7de19ada85bda1fae1ae22671a18992e9373f2e2df9db5389b5/aiobotocore-2.22.0-py3-none-any.whl", hash = "sha256:b4e6306f79df9d81daff1f9d63189a2dbee4b77ce3ab937304834e35eaaeeccf", size = 78930 }, ] [[package]] @@ -53,7 +53,7 @@ wheels = [ [[package]] name = "aiohttp" -version = "3.11.15" +version = "3.12.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -64,56 +64,59 @@ dependencies = [ { name = "propcache" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/19/18/31398875dc7b9815767370f60f44284155f2e1c1b87ec721c1b0ee61d1e5/aiohttp-3.11.15.tar.gz", hash = "sha256:b9b9a1e592ac8fcc4584baea240e41f77415e0de98932fdf19565aa3b6a02d0b", size = 7676625 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/44/31/5c8552b13041decee3facbe4a8e6342e9227cc472d7835df7f148049550a/aiohttp-3.11.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5bd37d615cd26d09321bd0168305f8508778712cf38aeffeed550274fb48a2ee", size = 708642 }, - { url = "https://files.pythonhosted.org/packages/ee/7f/4bf68f9eaabe8f06917832cd3828636346d6104454af8d5bb420bdc2876c/aiohttp-3.11.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a3d706afcc808f6add4208dfa13f911fd93c2a3dab6be484fee4fd0602a0867e", size = 468927 }, - { url = "https://files.pythonhosted.org/packages/dc/e5/7d931db76bf66f58853cb1d3e973c8a52fc4ba3832355949d2e8acdddef5/aiohttp-3.11.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:43625253e3dc018d34867b70909149f15f29eac0382802afe027f2fbf17bcb9c", size = 456037 }, - { url = "https://files.pythonhosted.org/packages/11/79/e463bcdcab7a5538211c4ef2bdadf3d31541d5bc21d09c93dc806c2978ec/aiohttp-3.11.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:437eee9e057a7907b11e4af2b18df56b6c795b28e0a3ac250691936cf6bf40eb", size = 1687945 }, - { url = "https://files.pythonhosted.org/packages/ed/a1/bcb81ee3c6231c440947bf30cad8846158a6da24987889a9a309c47a3a73/aiohttp-3.11.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec3dd04138bd30e6a3403dbd3ab5a5ccfb501597c5a95196cd816936ed55b777", size = 1752679 }, - { url = "https://files.pythonhosted.org/packages/b8/14/febdf2ccedf88633c7638d5ef8909f7cc86fbc35a2e816c7ae3a6c8543a6/aiohttp-3.11.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:85d73479b79172e7d667b466c170ca6097a334c09ecd83c95c210546031251b5", size = 1791270 }, - { url = "https://files.pythonhosted.org/packages/b5/73/c16af0ad6703396abb3b2c357194808d23e97f1b439da2beba675dab4fba/aiohttp-3.11.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae3a5d9f2fbe736fec7d24be25c57aa78c2d78d96540439ea68a8abbed9906fc", size = 1674466 }, - { url = "https://files.pythonhosted.org/packages/66/2d/79b72cecf79e5c72fdddaa319b731f81ca5121a2caa51ddf7afef0f1ad4e/aiohttp-3.11.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:269d145c593a65f78fb9a64dece90341561ddb2e91a96d42681132b2f706c42a", size = 1622282 }, - { url = "https://files.pythonhosted.org/packages/c2/a9/10b78cd9f21a820a6d0160682b80a0a08c2b359d9e7936da3a5a21e3f511/aiohttp-3.11.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0987dcf32e4c47f22634d32e4b0ffbc368bbcf2b33b408cd1a3d2dc0a6a5cd34", size = 1658241 }, - { url = "https://files.pythonhosted.org/packages/1a/01/04c934a64853b57e856d883436a839786a9c15ee27c212ee8b448f263e80/aiohttp-3.11.15-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:7cf4b2b5a0f7a738ecd759eaeaef800fc7c57683b7be9d8a43fcb86ca62701b4", size = 1666669 }, - { url = "https://files.pythonhosted.org/packages/f2/2d/60c992f21586703d16d9f957b187da86e33be8be8f8d8a555f31337508ad/aiohttp-3.11.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f1e0369f0dc8c895e718ce37147f56d46142d37596be183ab7a34192c5e6e4c5", size = 1652782 }, - { url = "https://files.pythonhosted.org/packages/9a/e0/5857ef2de285ee68744eba276cbe4ba4716107214fbad5d15cecf028a260/aiohttp-3.11.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:82ddf7f642b9c0b08063f3cf4e2818b22901bce8ebad05c232d9e295e77436a0", size = 1735636 }, - { url = "https://files.pythonhosted.org/packages/66/34/2f08d9bdc85a0a7299cbb945810720debed8b14b9b64b58935c50591d4a5/aiohttp-3.11.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c7eba0f90e27ec4af64db051f35387fa17128e6eeb58ee0f2318f2627168cc2", size = 1760389 }, - { url = "https://files.pythonhosted.org/packages/c4/51/a607071b04454f0fffa1f402b0d5bb09f15dec8ed630b1d591dbc56b1139/aiohttp-3.11.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5a61df20fa77792e83307e266f76790f7cb67980dd476948948de212ee7ec64c", size = 1694423 }, - { url = "https://files.pythonhosted.org/packages/47/a7/723dd995b43cec56cee27fb54b2ba8fc0372f965c879c5553bb8092f29ee/aiohttp-3.11.15-cp311-cp311-win32.whl", hash = "sha256:be11989cbc0728f81c0d022cef140ef8adb20d3012ad8f0ac61853bef571eb52", size = 416773 }, - { url = "https://files.pythonhosted.org/packages/a7/f4/5849b44fe9243f88001fff0e701b57a855a34fd38499a4c03e786da65ee5/aiohttp-3.11.15-cp311-cp311-win_amd64.whl", hash = "sha256:357355c9d51c8b12bbc7de43b27ce4b51f14cce050e00b5a87d0d5527d779395", size = 442948 }, - { url = "https://files.pythonhosted.org/packages/fb/9b/e3a30cfc8781af8f1175812a1a886f36b75c2ac92f1185ea48d1dc9ec2d3/aiohttp-3.11.15-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:433e7388b3063bba462b3362641988270b087a9ccae22390364f86b37a480c17", size = 704848 }, - { url = "https://files.pythonhosted.org/packages/ea/b2/abd592077b79638ddfe36681c45670278e9b4a070b3d958f58c46b6dad24/aiohttp-3.11.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d99981304065f4ea407dd7495f74f8b8c10f0e26733f8a47dc174ece73744d14", size = 464529 }, - { url = "https://files.pythonhosted.org/packages/c5/a1/85b0738f108806d3b1e1d83e8131cd7680c1266aad6f4d01737bee5cacc4/aiohttp-3.11.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3739daa52c0cff42f1c40f63b2fe818fcf41019d84c80a7add3224207a7060f", size = 456517 }, - { url = "https://files.pythonhosted.org/packages/c9/68/0460c66cafd826acd1bbd00e9fc9e1a7838ba56ca518540b1edccfd30cce/aiohttp-3.11.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fd82d0b3f73c59c80dade0ca8e0342de1ee261e147140ade65a465be670e83c", size = 1691717 }, - { url = "https://files.pythonhosted.org/packages/91/4b/f2d9c1d0a9e2c7faf080cfe4013b1ca637311fdf24b0023d1412f0cde0a1/aiohttp-3.11.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c930064b79cc0eb63678e376b819d546b0e2360264cd7544c32119496f646f35", size = 1736840 }, - { url = "https://files.pythonhosted.org/packages/c0/d0/9b989329a912806b58162064e914f943e61a99c8606c103ec5862b34ab24/aiohttp-3.11.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291f324f49ecede693dfb4820a412d1388cb10a2214ab60028252b505e105d6f", size = 1786852 }, - { url = "https://files.pythonhosted.org/packages/87/a8/e1294430720c67aa92039075fc87ff71485cb80acac948b74c1b7b3e6955/aiohttp-3.11.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65eb40e74e3126cba185da7a78815cf3a30140932193831b3bfd73c79965c723", size = 1698027 }, - { url = "https://files.pythonhosted.org/packages/ce/a8/35c7e118316cf27c8d42c5357b4893e31229117e69802da5d7874df2f690/aiohttp-3.11.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6d6d86443580f846ec9cf60f899b7cace34411f2ff5c95db5970047195e5bfa", size = 1626494 }, - { url = "https://files.pythonhosted.org/packages/48/0c/399e9aba5700591f2c1a9bdad24a4191d6aa497e6107852418c2c4254782/aiohttp-3.11.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8b4d8d78fbd5290204dcf43957a2184acd5cee358f203f24a3a97f7d7984eeb7", size = 1644005 }, - { url = "https://files.pythonhosted.org/packages/0e/48/f0c11b78775d5a6f07c721983229f365860090ff8d57f04a526decff30b6/aiohttp-3.11.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:94c552a4864ed292dadf1d341213374284a3af72e49bea02e70ce6f07cb37004", size = 1685236 }, - { url = "https://files.pythonhosted.org/packages/1c/4a/d3704524d11eab7c8f1b59a4b2c7b87129e3ac2cc8392b2072e5fd2ec277/aiohttp-3.11.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:23857adc919b64bba8a4db0eccb24e53fcaf85633e690ef1581c5562ed58cae7", size = 1650818 }, - { url = "https://files.pythonhosted.org/packages/65/87/12275b20f4a5f5016c114ff12ca6b77e423903bca082f55adf1e729d266f/aiohttp-3.11.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:eba325409a0f990f9b43ed18916cbf5b9779bc4c979b8887c444e7be9c38ccca", size = 1704447 }, - { url = "https://files.pythonhosted.org/packages/c9/99/a7709475303efac3fa929507ecdea1d7c9f9b49a14145eb0f382367f3997/aiohttp-3.11.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f1b6c639750bf2a228957e25fcab7a7ff11987c543d70bf73223369f0d7bdb27", size = 1735337 }, - { url = "https://files.pythonhosted.org/packages/36/b4/5d45c7343a38ff6b463ac860b9fe266f6bdc1c9a6b41ba4659ad3ede4a39/aiohttp-3.11.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2241d862dc6a3c0c2662a6934e79078d3a1e51a76c0dca5d65b30f3debee6c9b", size = 1697586 }, - { url = "https://files.pythonhosted.org/packages/84/d9/61da0272c2b3a00ddbc3176d0eee268624f8dbd5c791f0be3a973ed0c851/aiohttp-3.11.15-cp312-cp312-win32.whl", hash = "sha256:18733fa6bbe44698ff96138c1f1d682bbdf0846250a42c25c108eed328fef0d4", size = 411667 }, - { url = "https://files.pythonhosted.org/packages/c7/ae/c37d218057f9d69ac0423f049f989bbb8dfbe5bcc2404579c9a1958bddae/aiohttp-3.11.15-cp312-cp312-win_amd64.whl", hash = "sha256:0ec98c22030ea2a430cb11afddda7d4737b7e5c236c704f0d7d15504978598f7", size = 437969 }, - { url = "https://files.pythonhosted.org/packages/3f/38/8324c180c8d90ff9afc724f5882e33d6ae6061db954b409dd0bd03bf767f/aiohttp-3.11.15-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c37aa3eb8eb92f3793f0c1e73f212a76cbc8d363e9990df54b5b7099f75ce740", size = 697977 }, - { url = "https://files.pythonhosted.org/packages/5f/2b/fe647a80696877cb99bcd3324672e054112ed022dce201cdc1491bf16314/aiohttp-3.11.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5b5edd482ff0a8585b3f4e8b3681819447324166a43a5588800a5bca340dbf27", size = 461067 }, - { url = "https://files.pythonhosted.org/packages/63/d6/8b0b6ff2557df59125527bb87ec74344da940dfa4061f41a91857ff8c327/aiohttp-3.11.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d8c22c91bdb7417bd4f5119242dbd2e2140c0e9de47342c765f127f897eb57", size = 453367 }, - { url = "https://files.pythonhosted.org/packages/69/10/a9beb08734dfadf8e322efdb79a2b31098ec5b2f29bb7378533d3b4a145c/aiohttp-3.11.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b03093d4140d926965d23497a059ec59c8c07e602d2489ce5fb990f3a897db4", size = 1666611 }, - { url = "https://files.pythonhosted.org/packages/ca/ec/9a6724dd72a356298049913f4590b281fbe01386bc7d0e0c3cc6bff46af0/aiohttp-3.11.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05eea49d598c4ece6f285e00464de206f838b48ff21938d5aa9c394e115945b9", size = 1721916 }, - { url = "https://files.pythonhosted.org/packages/5a/61/dbcd2f2ff8f8282a56166b308dd9a1ca67ff844e05c20a7eade80f8fc99f/aiohttp-3.11.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63f8d6106566f98fcfde7a643c9da52d90679b8592dea76c4adfc3cd5d06d22c", size = 1774421 }, - { url = "https://files.pythonhosted.org/packages/4f/fe/fa6952f41486a18860804d685b978793bd4accd5dd2a5a49801ad76c16e2/aiohttp-3.11.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36a490f1ebe0b982366314c77f02258f87bd5d9bd362839dc6a24188447f37eb", size = 1677753 }, - { url = "https://files.pythonhosted.org/packages/4d/f4/e7ee9b27adae614dd30598cbbb64c6484fa475864392781da7bd3ab43871/aiohttp-3.11.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:73a7f6283634dd30f93b9a67c414c00517869478b50361c503535e075fa07eaf", size = 1608419 }, - { url = "https://files.pythonhosted.org/packages/30/c1/f0513cf705ea1e6366530f5b9f1683129e6f9a70e32ee0a730fcbf85f393/aiohttp-3.11.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0e97c1e55f6931f07ecaf53aef8352def8386adfd0cd3caa6429cc40e886d6a9", size = 1622394 }, - { url = "https://files.pythonhosted.org/packages/c9/b9/65c94e9578591b49ee4c7cf26131cd0c4e693f9173e78a9aba4f8c60d24d/aiohttp-3.11.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:d8370d31e6d8ecccd97cd791c466d0acb56527df51b0c105d7ea54c7fcc0f75b", size = 1660913 }, - { url = "https://files.pythonhosted.org/packages/65/28/bbeba6d8a30a42ba591f7feb333ff2a01ed1e2ee0b31bc7195354c2c605a/aiohttp-3.11.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c2de66177e087999568638c02639cf0248011b5c7fca69b006947153c534fcab", size = 1622763 }, - { url = "https://files.pythonhosted.org/packages/d1/39/e123f8dde599ec42da17cf094cfacd343569617c9bce68fe257e627395a9/aiohttp-3.11.15-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:edcddb97574402ff7481bc6f70819ba863e77b0be58a840ed5f59d52d2f20a71", size = 1687127 }, - { url = "https://files.pythonhosted.org/packages/35/cf/1eaaae2dd6f0ea36926cdd0af131d11315a3a06d0a6d9bc79f6e8b11c090/aiohttp-3.11.15-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:29cce2a7e009494e675018c0b1819a133befbab8629c797276c5d793bbdf1138", size = 1718485 }, - { url = "https://files.pythonhosted.org/packages/80/09/1824997f72def3567f451130b7618beab65cf5e99d11611dae87b251de82/aiohttp-3.11.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:825ec92391e3e4ddda74de79ed0f8b443e9b412a0c9c82618ca2163abd875df5", size = 1675221 }, - { url = "https://files.pythonhosted.org/packages/56/2f/c1e86f6452a9abae346b31c48bfd476984baa3a73978ad3eabf53139c513/aiohttp-3.11.15-cp313-cp313-win32.whl", hash = "sha256:430f9707f0c1239a92bff7769b0db185ef400278dc63c89f88ed1bd5153aab7a", size = 410657 }, - { url = "https://files.pythonhosted.org/packages/ef/9e/9913ed27bb195224c3fc6a41f0b169d6d93e3843cd792d24013a112ffb3e/aiohttp-3.11.15-cp313-cp313-win_amd64.whl", hash = "sha256:f30e6980ec5d6ad815a233e19e39fe27ea94b1081c31c8aa1df1b629da3737b8", size = 436351 }, +sdist = { url = "https://files.pythonhosted.org/packages/06/a2/a946c4f5c54233c97788c2278ea50beaadf45211f452f932b36ce322f660/aiohttp-3.12.2.tar.gz", hash = "sha256:0018956472ee535d2cad761a5bb88eb4ad80f94cd86472cee26a244799f7c79f", size = 7780423 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/39/9866f5996a7db870464e1f153b9f6a3412167ee79293f138bad09de783cd/aiohttp-3.12.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:536a37af26ed50bd4f3cf7d989955e5a987e9343f1a55f5393e7950a6ac93fce", size = 701750 }, + { url = "https://files.pythonhosted.org/packages/81/eb/187fba5f1c210bed03c4e4fe50b6cc64d18c6776e6d17887b527ee2fb806/aiohttp-3.12.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6f8fbb48953238e7ba8ab9dee6757a4f6b72cd6242eb7fe1cb004b24f91effee", size = 474015 }, + { url = "https://files.pythonhosted.org/packages/c5/e5/8f203120a8a932739face58614f8c93912ccd26c0b18da3f476b7372158b/aiohttp-3.12.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74190229bd54bc3df7090f634b0b7fe53c45fb41aae5fbfae462093ced35c950", size = 462282 }, + { url = "https://files.pythonhosted.org/packages/7d/0f/9c33853f4f1c6c75a0f1b3e7b6d955f5883bd14a189232115e2e0c8633f2/aiohttp-3.12.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7af4737ab145fb1ac6e2db24ee206ee9e9f3abb1f7c6b74bd75c9ce0d36fe286", size = 1732474 }, + { url = "https://files.pythonhosted.org/packages/e6/72/2dee9dd29a6ce5abbfa5ee7b75db00ce9c213aaea588476464285a3aee57/aiohttp-3.12.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2711392a2afe1dcf4a93b05a94ee25efa966971fa0bf3944f2ce101da182ce91", size = 1681143 }, + { url = "https://files.pythonhosted.org/packages/fc/2d/4eb92b7e42f7efb8ab22d0eca89e73b96653d6fbfb9847435ad29dee385d/aiohttp-3.12.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5169898d17a2ac30e31ea814832ad4cf6bb652459a031af40ed56c9d05894c80", size = 1779934 }, + { url = "https://files.pythonhosted.org/packages/41/df/c9dc8dd89e40e469386cfb0adbdf63be04e52a85562bae271c1a863de5b0/aiohttp-3.12.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a590566c5c139edfbeeb69de62c6868e6ef667322b0080489607acc39e92add", size = 1818982 }, + { url = "https://files.pythonhosted.org/packages/6f/b6/84fd20aca84651e373fd90187abe1daf7596ab5e79b6045b294496b73bea/aiohttp-3.12.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4be1c1adb604591a607abb9c4474eedc6add6739656ee91a9daddf35f7f9fa", size = 1721441 }, + { url = "https://files.pythonhosted.org/packages/86/9c/412603ca6e3be2656bc3b662828087f8b3a21f82fe20f94219ba7769a6dd/aiohttp-3.12.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0cf15667ecf20bfe545adb02882d895e10c8d5c821e46b1a62f22d5170c4803e", size = 1658517 }, + { url = "https://files.pythonhosted.org/packages/c1/70/d1735c170aebdc4eda456768bb8714529a90743fd1de1bff075e33292ee9/aiohttp-3.12.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:875df9e4ed4f24af643f4e35bf267be3cb25b9461d25da4a0d181877a2b401e4", size = 1706789 }, + { url = "https://files.pythonhosted.org/packages/61/80/c0f85511b8f315cab5a86615d155d9584cd5d6f1d48c94f92dc3dffd4a7f/aiohttp-3.12.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:722fe14a899ee049562417449a449dfc7c616fdb5409f8a0a2c459815473767f", size = 1701950 }, + { url = "https://files.pythonhosted.org/packages/5e/f5/95a835814bd34378ad18d05e3351e6bd1035263ec20480f69f3688fa04ec/aiohttp-3.12.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:59668d843c91bd22abc1f70674270ce38e1dad3020284cccecc60f492d6f88ae", size = 1682137 }, + { url = "https://files.pythonhosted.org/packages/89/35/ccf684cd9d343b1401be07f0c43793d8475fed2b2418e01f885bcdcd972b/aiohttp-3.12.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:64e48ed61d5c74b5a4a68fdb3fde664034e59788625ebf3fcae87fb5a2dbde7b", size = 1775737 }, + { url = "https://files.pythonhosted.org/packages/22/a8/0075064d24f4d4987ba8e73a67fc8c0c0075134abb087000316147d2bc77/aiohttp-3.12.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:7061bce1accdfce6e02c80ac10efcdfcae95718f97f77fc5fbe3273b16b8d4bf", size = 1796197 }, + { url = "https://files.pythonhosted.org/packages/4b/bc/de6c5969285b309a11582d0009cea97384f2cac9b2c88e3a35b642cd6d17/aiohttp-3.12.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ef392a613f53fc4c3e6ebba2c3b90729266139a3f534e7eba9bf04e2eac40287", size = 1709254 }, + { url = "https://files.pythonhosted.org/packages/c1/12/bf9ce81a2954b421cd6acb90a41777075baec3a3a21fb0dd10b483ed3652/aiohttp-3.12.2-cp311-cp311-win32.whl", hash = "sha256:e405ccdd3cada578e5bc4000b7d35b80a345c832089d23b04be30c0e7606fb80", size = 419267 }, + { url = "https://files.pythonhosted.org/packages/97/6c/db68994b49a2c50a4a8943ba3696f66906ab09d206243f91ea8ede7b7d87/aiohttp-3.12.2-cp311-cp311-win_amd64.whl", hash = "sha256:a84cf5db31efc14e811ef830288614bf40093befd445efe743dc015d01e6e92c", size = 443663 }, + { url = "https://files.pythonhosted.org/packages/84/25/17af725b3855ad54eb1cb8e45962b05856a7e4986b64fbc6158331d7b64e/aiohttp-3.12.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7679b2af5a1d43d8470672079baedc1a843e4f27a47b630fbe092833f9bc4e73", size = 692835 }, + { url = "https://files.pythonhosted.org/packages/cc/5d/770e9f17f0efeb1c40109535561ea7b0a3e9b654bd7853c27f3d62763086/aiohttp-3.12.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4d6941dd4d8f6dfd9292f391bc2e321c9583a9532b4e9b571b84f163bb3f8135", size = 467456 }, + { url = "https://files.pythonhosted.org/packages/d8/ef/48eda5cd949b8af818d892b5ddf07cb15f0cf133e14c4ac9734ff32ba0a6/aiohttp-3.12.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8345cea33295cc28945c8365ac44ba383ebb757a599b384d752347f40671e984", size = 460294 }, + { url = "https://files.pythonhosted.org/packages/94/1e/9724a45cb932b0c01c558493fac5f706a1a53740a77efc22c2f6764ce611/aiohttp-3.12.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8259a311666becf7049ae43c984208ac20eda5ea16aa5f26ea5d24b863f9afcd", size = 1707089 }, + { url = "https://files.pythonhosted.org/packages/8a/a1/3b267d691a79472e6a0d9909363c2dc6cad44e60deb99385ce41e7926b40/aiohttp-3.12.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a6f09589cb5928ee793210806d35d69fffc78d46eca9acaa2d38cc30b3f194e", size = 1689737 }, + { url = "https://files.pythonhosted.org/packages/d9/71/f04d5c86cfa5227ec2a54dd72b8de5b1930eb5c9ea75bd1c987b463cbb36/aiohttp-3.12.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c32972b485828f2b9326a95851520e9a92cdd97efe0a04ae62c7315e8d1098", size = 1744835 }, + { url = "https://files.pythonhosted.org/packages/eb/88/deab2324c7468d6405cf9bae287276edef14a00fd00d084b3010e194e8d9/aiohttp-3.12.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:851d226ecaf30ec7f12d9e9793081ecd0e66fea7f6345bcb5283b39e9ea79c71", size = 1790987 }, + { url = "https://files.pythonhosted.org/packages/17/49/0b7c3fb319c4a9c75c41ec066e578bfd3ee847a550ef579d9fb6d65af3fa/aiohttp-3.12.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7127241e62621eabe437cce249a4858e79896abcdafed4c6f7a90d14d449066", size = 1710431 }, + { url = "https://files.pythonhosted.org/packages/eb/23/3c366db7343384cd81b0ec9609019dc34e14d25b7099d9390cfa561bb49f/aiohttp-3.12.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bca43af1c77f83e88641e74d1bd24b6089bb518fa0e6be97805a048bdac6bbc3", size = 1626229 }, + { url = "https://files.pythonhosted.org/packages/99/3e/a6b7b55a38a6372b7e00f751778fc653cdd14770f1c20c5ed309f1b87768/aiohttp-3.12.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d913623c7e3be188fe5c718bce186e0bbc5977e74c12e4832d540c3637b9f47", size = 1687290 }, + { url = "https://files.pythonhosted.org/packages/3c/69/0542c4c125e40c47e26bab47d8aff50f831c5626a4d4ab9da7018ee2d15c/aiohttp-3.12.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b4924ca6bc74cb630e47edaf111f1d05e13dfe3c1e580c35277dc998965913d3", size = 1708743 }, + { url = "https://files.pythonhosted.org/packages/1d/0e/73a16e4008f78fa3538a1e564d0ecf026c7fd422f522e87af48337942f48/aiohttp-3.12.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a38e144942d4f0740dcb5be2ceb932cc45fc29e404fe64ffd5eef5bc62eafe39", size = 1649396 }, + { url = "https://files.pythonhosted.org/packages/98/23/0a9b1547260d554f2c484c2f5e9d3800eca31a387146e5e0a0cfb6bfe17e/aiohttp-3.12.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6c31782dae093a507b94792d9f32978bf154d051d5237fdedbb9e74d9464d5dd", size = 1728959 }, + { url = "https://files.pythonhosted.org/packages/31/d0/39b2b1111b81952015e7390ea07b404f417577e6ed4df1a683dc3d1a0a2f/aiohttp-3.12.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7f10d664b638f85acdeb7622f7b16773aaf7d67214a7c3b6075735f171d2f021", size = 1756933 }, + { url = "https://files.pythonhosted.org/packages/28/77/faf662e3b87e3d5a1ca3092c5cbeaa4349abdff3388bdc3c3c057302b380/aiohttp-3.12.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7181b4ebd70ad9731f4f7af03e3ed0ff003e49cefbf0b6846b5decb32abc30b7", size = 1716543 }, + { url = "https://files.pythonhosted.org/packages/d3/1a/c79bae467e39439d5ef044f121b280aa0398cb23ecd77ee49f8a1759dde7/aiohttp-3.12.2-cp312-cp312-win32.whl", hash = "sha256:d602fc26cb307993965e5f5dacb2aaa7fea4f01c6658250658bef51e48dd454e", size = 414002 }, + { url = "https://files.pythonhosted.org/packages/e2/dd/0d5f6aef062433cf88ea08ab2c8c3c1466e812311c9e0657370835ed27c9/aiohttp-3.12.2-cp312-cp312-win_amd64.whl", hash = "sha256:35df44dde19fcd146ed13e8847c70f8e138e91138f7615df2bd68b478ac04f99", size = 440104 }, + { url = "https://files.pythonhosted.org/packages/f9/ed/a341ddf8402cc4a177eb63a63d2aee2f177a94b1f2d53ef192e43e82760f/aiohttp-3.12.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e6dd24e72e7425b4eee49eeaa1a08742774f5a0c84041e80625aeba45812f92e", size = 687252 }, + { url = "https://files.pythonhosted.org/packages/e8/93/00e623a2c984d95a52e7f9e92d178828beb4a5d31b9231b0fda77fc13e98/aiohttp-3.12.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5293245b743d3e41fd4de631aed6018e0016488686ee70d3dbd9ac61cc040429", size = 464914 }, + { url = "https://files.pythonhosted.org/packages/5e/ad/4fea70b2d1994edf3c34220a41f0ac1263ee4b704343248f7d15fa8e3b8e/aiohttp-3.12.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b2c7bc896696ada3df4ffd787b80d08af53eb16658fd19623f469f89c5f95846", size = 457217 }, + { url = "https://files.pythonhosted.org/packages/fb/f1/f20c87b0baf096f2d36897fe4a9a0e703f32dbf7b3fcaae0a5a196f779dc/aiohttp-3.12.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e4991a7dcdd577a749429248321196dba6ade4315c6262e9b2ba9a3bb80e9cb", size = 1696029 }, + { url = "https://files.pythonhosted.org/packages/d9/4a/1b0507cfd73c1736e5cd607c7f16790747112c86e0c17860b1b635ad7d52/aiohttp-3.12.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:88f8d247c4b6cc75eb5ef1724998b3076f5f2f6b7d357560caa5b5da08228cb4", size = 1677295 }, + { url = "https://files.pythonhosted.org/packages/7d/ca/ffb5d548d6aa195797bebd5e3688821c40c2a6503363e5849d7114678a59/aiohttp-3.12.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e1f3968162f274ed8e97aad591da178fb04725a386a4852b1c0285f3a51390af", size = 1729363 }, + { url = "https://files.pythonhosted.org/packages/98/3e/e6cb54d8329b7c60b6678631c228339730632ea7c18dd6279e64ad134d52/aiohttp-3.12.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4de7a3a7e482f5832838047c1612c0c3d1f4309e3e2d4ea80cb1b7f5ab0c6bbe", size = 1778736 }, + { url = "https://files.pythonhosted.org/packages/2d/be/76db303c98159b6c0494fe4f14a6c57a28c81db9010d2d5d764219339f0a/aiohttp-3.12.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86ca0aa49854b195e314171756d06f81c1286541425a929950f7316d617cc3b1", size = 1701064 }, + { url = "https://files.pythonhosted.org/packages/c3/c1/d6d4abdeffaa9dee12b27c80919a1bda50aea22d5a1dc03c001a005b16ea/aiohttp-3.12.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bff129c6674f3a14c68a0f49337ebd8637440201cbd8af05df52cb2d7db0902", size = 1614772 }, + { url = "https://files.pythonhosted.org/packages/8c/69/da43fe30ef3323add2ac03b11cef91c50b648d544953732aeff9a47cdb5e/aiohttp-3.12.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62179517ef8d0abc950ab7e6545e97142bef3f58007da12b9cff5260e8084fd1", size = 1667793 }, + { url = "https://files.pythonhosted.org/packages/8c/03/367badf467bd9708b2eaa5fc36689b9b2e43489b63d8508fddc508ceaace/aiohttp-3.12.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:48d743fbc8a88dffb2d2e96f17f9e2310aaa672bd2103b198d7613361affd1a3", size = 1699458 }, + { url = "https://files.pythonhosted.org/packages/d2/12/c7443b288263b4ab3d8c6329de0be8df2967445aa9731b738da7b34f04ca/aiohttp-3.12.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:385f01fe9be53a0466fb66504b00ab00ca7faa0a285186327509cbbe1386363f", size = 1642052 }, + { url = "https://files.pythonhosted.org/packages/4e/76/2be34ed27931ab1a4cdd40eba3ef2d71bf0eff9d6c0ac8793e92f20f3ac1/aiohttp-3.12.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:631f4da6b1d503f9df883ba86846fa0ff455eae60497fab5f1d21683b2a2784e", size = 1718187 }, + { url = "https://files.pythonhosted.org/packages/43/39/84d014db48122973171c3cfcf23a2c3ba765163ef8169d6b959d9440152b/aiohttp-3.12.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7e071f1371f38c15dad609bb57d698fe4614b1817e7808966c643336f5615655", size = 1751656 }, + { url = "https://files.pythonhosted.org/packages/27/b6/7b13d143352494e943ae3f89b5286dc4ed85f8d5487a09f3dd86efb16eb3/aiohttp-3.12.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:166d8ba47fca7667dd3169be8bd0fb9ffd0f19fd80f0d5291b1e36ab0f77d02c", size = 1700547 }, + { url = "https://files.pythonhosted.org/packages/42/19/1b42589a0f80f14b1bc81ccc5fb0f8c4398fbd03b5886d1307c7aadd8279/aiohttp-3.12.2-cp313-cp313-win32.whl", hash = "sha256:01ac3cc4a0c81f87ed72c614066bfdee15358c5c2cdf30048dd8823826cbc61e", size = 413024 }, + { url = "https://files.pythonhosted.org/packages/d0/d7/00abc34b16f1ea9dc8cedffe45c0f454157472480e5b44b6c15f175aa9c6/aiohttp-3.12.2-cp313-cp313-win_amd64.whl", hash = "sha256:cbf833ca90fda31ec505e80f58f8011c64030fb8e368bce0d60f1f9aae162389", size = 438964 }, ] [[package]] @@ -139,11 +142,11 @@ wheels = [ [[package]] name = "alabaster" -version = "0.7.16" +version = "1.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c9/3e/13dd8e5ed9094e734ac430b5d0eb4f2bb001708a8b7856cbf8e084e001ba/alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", size = 23776 } +sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210 } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/34/d4e1c02d3bee589efb5dfa17f88ea08bdb3e3eac12bc475462aec52ed223/alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92", size = 13511 }, + { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929 }, ] [[package]] @@ -198,28 +201,28 @@ wheels = [ [[package]] name = "authlib" -version = "1.5.1" +version = "1.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/aa/e1c199d27ea06a13f9641746a9b19f15bd75b04b40b6bd72a89156c75d10/authlib-1.5.1.tar.gz", hash = "sha256:5cbc85ecb0667312c1cdc2f9095680bb735883b123fb509fde1e65b1c5df972e", size = 152534 } +sdist = { url = "https://files.pythonhosted.org/packages/a2/9d/b1e08d36899c12c8b894a44a5583ee157789f26fc4b176f8e4b6217b56e1/authlib-1.6.0.tar.gz", hash = "sha256:4367d32031b7af175ad3a323d571dc7257b7099d55978087ceae4a0d88cd3210", size = 158371 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/ae/4d289407515223677e7d105ec88bc707a115cce79464c6b56313beb0dd36/authlib-1.5.1-py2.py3-none-any.whl", hash = "sha256:8408861cbd9b4ea2ff759b00b6f02fd7d81ac5a56d0b2b22c08606c6049aae11", size = 231358 }, + { url = "https://files.pythonhosted.org/packages/84/29/587c189bbab1ccc8c86a03a5d0e13873df916380ef1be461ebe6acebf48d/authlib-1.6.0-py2.py3-none-any.whl", hash = "sha256:91685589498f79e8655e8a8947431ad6288831d643f11c55c2143ffcc738048d", size = 239981 }, ] [[package]] name = "azure-core" -version = "1.32.0" +version = "1.34.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "requests" }, { name = "six" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cc/ee/668328306a9e963a5ad9f152cd98c7adad86c822729fd1d2a01613ad1e67/azure_core-1.32.0.tar.gz", hash = "sha256:22b3c35d6b2dae14990f6c1be2912bf23ffe50b220e708a28ab1bb92b1c730e5", size = 279128 } +sdist = { url = "https://files.pythonhosted.org/packages/c9/29/ff7a519a315e41c85bab92a7478c6acd1cf0b14353139a08caee4c691f77/azure_core-1.34.0.tar.gz", hash = "sha256:bdb544989f246a0ad1c85d72eeb45f2f835afdcbc5b45e43f0dbde7461c81ece", size = 297999 } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/83/325bf5e02504dbd8b4faa98197a44cdf8a325ef259b48326a2b6f17f8383/azure_core-1.32.0-py3-none-any.whl", hash = "sha256:eac191a0efb23bfa83fddf321b27b122b4ec847befa3091fa736a5c32c50d7b4", size = 198855 }, + { url = "https://files.pythonhosted.org/packages/84/9e/5c87b49f65bb16571599bc789857d0ded2f53014d3392bc88a5d1f3ad779/azure_core-1.34.0-py3-none-any.whl", hash = "sha256:0615d3b756beccdb6624d1c0ae97284f38b78fb59a2a9839bf927c66fbbdddd6", size = 207409 }, ] [[package]] @@ -238,7 +241,7 @@ wheels = [ [[package]] name = "azure-identity" -version = "1.21.0" +version = "1.23.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "azure-core" }, @@ -247,9 +250,9 @@ dependencies = [ { name = "msal-extensions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b5/a1/f1a683672e7a88ea0e3119f57b6c7843ed52650fdcac8bfa66ed84e86e40/azure_identity-1.21.0.tar.gz", hash = "sha256:ea22ce6e6b0f429bc1b8d9212d5b9f9877bd4c82f1724bfa910760612c07a9a6", size = 266445 } +sdist = { url = "https://files.pythonhosted.org/packages/41/52/458c1be17a5d3796570ae2ed3c6b7b55b134b22d5ef8132b4f97046a9051/azure_identity-1.23.0.tar.gz", hash = "sha256:d9cdcad39adb49d4bb2953a217f62aec1f65bbb3c63c9076da2be2a47e53dde4", size = 265280 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/9f/1f9f3ef4f49729ee207a712a5971a9ca747f2ca47d9cbf13cf6953e3478a/azure_identity-1.21.0-py3-none-any.whl", hash = "sha256:258ea6325537352440f71b35c3dffe9d240eae4a5126c1b7ce5efd5766bd9fd9", size = 189190 }, + { url = "https://files.pythonhosted.org/packages/07/16/a51d47780f41e4b87bb2d454df6aea90a44a346e918ac189d3700f3d728d/azure_identity-1.23.0-py3-none-any.whl", hash = "sha256:dbbeb64b8e5eaa81c44c565f264b519ff2de7ff0e02271c49f3cb492762a50b0", size = 186097 }, ] [[package]] @@ -278,20 +281,20 @@ wheels = [ [[package]] name = "beautifulsoup4" -version = "4.13.3" +version = "4.13.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f0/3c/adaf39ce1fb4afdd21b611e3d530b183bb7759c9b673d60db0e347fd4439/beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b", size = 619516 } +sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/49/6abb616eb3cbab6a7cca303dc02fdf3836de2e0b834bf966a7f5271a34d8/beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16", size = 186015 }, + { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285 }, ] [[package]] name = "bokeh" -version = "3.7.2" +version = "3.7.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "contourpy" }, @@ -305,23 +308,23 @@ dependencies = [ { name = "tornado", marker = "sys_platform != 'emscripten'" }, { name = "xyzservices" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1d/8f/f41bb2fb9214bfe054055312d5744f354f536e08a3827fedaa75fb5238a3/bokeh-3.7.2.tar.gz", hash = "sha256:80c21885cec276431acd4db92f831c71eb999ea995470ce777e0c577b0cfc1d8", size = 6364893 } +sdist = { url = "https://files.pythonhosted.org/packages/75/18/12d0d6024177ad18ba65deffc363046d0cbafe116f8b964a9efa85d2800f/bokeh-3.7.3.tar.gz", hash = "sha256:70a89a9f797b103d5ee6ad15fb7944adda115cf0da996ed0b75cfba61cb12f2b", size = 6366610 } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/d2/5f2a3c80ab897eaccd15cc89aaebec2bf8b91bc8314fe9e43cf04d6e9edd/bokeh-3.7.2-py3-none-any.whl", hash = "sha256:efd9172a90cc233c1c21ef4813d58a8a6f97ee63c8e2f1b4f2389a64fcef0722", size = 7028135 }, + { url = "https://files.pythonhosted.org/packages/91/48/08b2382e739236aa3360b7976360ba3e0c043b6234e25951c18c1eb6fa06/bokeh-3.7.3-py3-none-any.whl", hash = "sha256:b0e79dd737f088865212e4fdcb0f3b95d087f0f088bf8ca186a300ab1641e2c7", size = 7031447 }, ] [[package]] name = "botocore" -version = "1.37.1" +version = "1.37.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jmespath" }, { name = "python-dateutil" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e5/01/3083bff25fd91193162298920cb093b9095609408416526d52b2826965b7/botocore-1.37.1.tar.gz", hash = "sha256:b194db8fb2a0ffba53568c364ae26166e7eec0445496b2ac86a6e142f3dd982f", size = 13578835 } +sdist = { url = "https://files.pythonhosted.org/packages/74/fb/b243ab806d2e1e6b8a475b731cc59a1f1e4709eded4884b988a27bbc996b/botocore-1.37.3.tar.gz", hash = "sha256:fe8403eb55a88faf9b0f9da6615e5bee7be056d75e17af66c3c8f0a3b0648da4", size = 13574648 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/20/352b2bf99f93ba18986615841786cbd0d38f7856bd49d4e154a540f04afe/botocore-1.37.1-py3-none-any.whl", hash = "sha256:c1db1bfc5d8c6b3b6d1ca6794f605294b4264e82a7e727b88e0fef9c2b9fbb9c", size = 13359164 }, + { url = "https://files.pythonhosted.org/packages/88/54/772118f15b5990173aa5264946cc8c9ff70c8f02d72ee6d63167a985188c/botocore-1.37.3-py3-none-any.whl", hash = "sha256:d01bd3bf4c80e61fa88d636ad9f5c9f60a551d71549b481386c6b4efe0bb2b2e", size = 13342066 }, ] [[package]] @@ -335,11 +338,11 @@ wheels = [ [[package]] name = "certifi" -version = "2025.1.31" +version = "2025.4.26" 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 } +sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705 } 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://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618 }, ] [[package]] @@ -398,62 +401,62 @@ wheels = [ [[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/72/80/41ef5d5a7935d2d3a773e3eaebf0a9350542f2cab4eac59a7a4741fbbbbe/charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", size = 194995 }, - { url = "https://files.pythonhosted.org/packages/7a/28/0b9fefa7b8b080ec492110af6d88aa3dea91c464b17d53474b6e9ba5d2c5/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", size = 139471 }, - { url = "https://files.pythonhosted.org/packages/71/64/d24ab1a997efb06402e3fc07317e94da358e2585165930d9d59ad45fcae2/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", size = 149831 }, - { url = "https://files.pythonhosted.org/packages/37/ed/be39e5258e198655240db5e19e0b11379163ad7070962d6b0c87ed2c4d39/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", size = 142335 }, - { url = "https://files.pythonhosted.org/packages/88/83/489e9504711fa05d8dde1574996408026bdbdbd938f23be67deebb5eca92/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", size = 143862 }, - { url = "https://files.pythonhosted.org/packages/c6/c7/32da20821cf387b759ad24627a9aca289d2822de929b8a41b6241767b461/charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", size = 145673 }, - { url = "https://files.pythonhosted.org/packages/68/85/f4288e96039abdd5aeb5c546fa20a37b50da71b5cf01e75e87f16cd43304/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", size = 140211 }, - { url = "https://files.pythonhosted.org/packages/28/a3/a42e70d03cbdabc18997baf4f0227c73591a08041c149e710045c281f97b/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", size = 148039 }, - { url = "https://files.pythonhosted.org/packages/85/e4/65699e8ab3014ecbe6f5c71d1a55d810fb716bbfd74f6283d5c2aa87febf/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", size = 151939 }, - { url = "https://files.pythonhosted.org/packages/b1/82/8e9fe624cc5374193de6860aba3ea8070f584c8565ee77c168ec13274bd2/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", size = 149075 }, - { url = "https://files.pythonhosted.org/packages/3d/7b/82865ba54c765560c8433f65e8acb9217cb839a9e32b42af4aa8e945870f/charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", size = 144340 }, - { url = "https://files.pythonhosted.org/packages/b5/b6/9674a4b7d4d99a0d2df9b215da766ee682718f88055751e1e5e753c82db0/charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", size = 95205 }, - { url = "https://files.pythonhosted.org/packages/1e/ab/45b180e175de4402dcf7547e4fb617283bae54ce35c27930a6f35b6bef15/charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", size = 102441 }, - { url = "https://files.pythonhosted.org/packages/0a/9a/dd1e1cdceb841925b7798369a09279bd1cf183cef0f9ddf15a3a6502ee45/charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", size = 196105 }, - { url = "https://files.pythonhosted.org/packages/d3/8c/90bfabf8c4809ecb648f39794cf2a84ff2e7d2a6cf159fe68d9a26160467/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", size = 140404 }, - { url = "https://files.pythonhosted.org/packages/ad/8f/e410d57c721945ea3b4f1a04b74f70ce8fa800d393d72899f0a40526401f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", size = 150423 }, - { url = "https://files.pythonhosted.org/packages/f0/b8/e6825e25deb691ff98cf5c9072ee0605dc2acfca98af70c2d1b1bc75190d/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", size = 143184 }, - { url = "https://files.pythonhosted.org/packages/3e/a2/513f6cbe752421f16d969e32f3583762bfd583848b763913ddab8d9bfd4f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", size = 145268 }, - { url = "https://files.pythonhosted.org/packages/74/94/8a5277664f27c3c438546f3eb53b33f5b19568eb7424736bdc440a88a31f/charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616", size = 147601 }, - { url = "https://files.pythonhosted.org/packages/7c/5f/6d352c51ee763623a98e31194823518e09bfa48be2a7e8383cf691bbb3d0/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", size = 141098 }, - { url = "https://files.pythonhosted.org/packages/78/d4/f5704cb629ba5ab16d1d3d741396aec6dc3ca2b67757c45b0599bb010478/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", size = 149520 }, - { url = "https://files.pythonhosted.org/packages/c5/96/64120b1d02b81785f222b976c0fb79a35875457fa9bb40827678e54d1bc8/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", size = 152852 }, - { url = "https://files.pythonhosted.org/packages/84/c9/98e3732278a99f47d487fd3468bc60b882920cef29d1fa6ca460a1fdf4e6/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", size = 150488 }, - { url = "https://files.pythonhosted.org/packages/13/0e/9c8d4cb99c98c1007cc11eda969ebfe837bbbd0acdb4736d228ccaabcd22/charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", size = 146192 }, - { url = "https://files.pythonhosted.org/packages/b2/21/2b6b5b860781a0b49427309cb8670785aa543fb2178de875b87b9cc97746/charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", size = 95550 }, - { url = "https://files.pythonhosted.org/packages/21/5b/1b390b03b1d16c7e382b561c5329f83cc06623916aab983e8ab9239c7d5c/charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", size = 102785 }, - { 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 }, +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794 }, + { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846 }, + { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350 }, + { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657 }, + { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260 }, + { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164 }, + { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571 }, + { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952 }, + { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959 }, + { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030 }, + { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015 }, + { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106 }, + { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402 }, + { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936 }, + { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790 }, + { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924 }, + { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626 }, + { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567 }, + { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957 }, + { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408 }, + { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399 }, + { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815 }, + { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537 }, + { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565 }, + { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357 }, + { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776 }, + { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622 }, + { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435 }, + { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653 }, + { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231 }, + { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243 }, + { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442 }, + { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147 }, + { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057 }, + { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454 }, + { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174 }, + { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166 }, + { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064 }, + { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641 }, + { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626 }, ] [[package]] name = "click" -version = "8.1.8" +version = "8.2.1" source = { registry = "https://pypi.org/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://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342 } 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://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215 }, ] [[package]] @@ -502,103 +505,110 @@ wheels = [ [[package]] name = "contourpy" -version = "1.3.1" +version = "1.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/25/c2/fc7193cc5383637ff390a712e88e4ded0452c9fbcf84abe3de5ea3df1866/contourpy-1.3.1.tar.gz", hash = "sha256:dfd97abd83335045a913e3bcc4a09c0ceadbe66580cf573fe961f4a825efa699", size = 13465753 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/bb/11250d2906ee2e8b466b5f93e6b19d525f3e0254ac8b445b56e618527718/contourpy-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3e8b974d8db2c5610fb4e76307e265de0edb655ae8169e8b21f41807ccbeec4b", size = 269555 }, - { url = "https://files.pythonhosted.org/packages/67/71/1e6e95aee21a500415f5d2dbf037bf4567529b6a4e986594d7026ec5ae90/contourpy-1.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:20914c8c973f41456337652a6eeca26d2148aa96dd7ac323b74516988bea89fc", size = 254549 }, - { url = "https://files.pythonhosted.org/packages/31/2c/b88986e8d79ac45efe9d8801ae341525f38e087449b6c2f2e6050468a42c/contourpy-1.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19d40d37c1c3a4961b4619dd9d77b12124a453cc3d02bb31a07d58ef684d3d86", size = 313000 }, - { url = "https://files.pythonhosted.org/packages/c4/18/65280989b151fcf33a8352f992eff71e61b968bef7432fbfde3a364f0730/contourpy-1.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:113231fe3825ebf6f15eaa8bc1f5b0ddc19d42b733345eae0934cb291beb88b6", size = 352925 }, - { url = "https://files.pythonhosted.org/packages/f5/c7/5fd0146c93220dbfe1a2e0f98969293b86ca9bc041d6c90c0e065f4619ad/contourpy-1.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4dbbc03a40f916a8420e420d63e96a1258d3d1b58cbdfd8d1f07b49fcbd38e85", size = 323693 }, - { url = "https://files.pythonhosted.org/packages/85/fc/7fa5d17daf77306840a4e84668a48ddff09e6bc09ba4e37e85ffc8e4faa3/contourpy-1.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a04ecd68acbd77fa2d39723ceca4c3197cb2969633836ced1bea14e219d077c", size = 326184 }, - { url = "https://files.pythonhosted.org/packages/ef/e7/104065c8270c7397c9571620d3ab880558957216f2b5ebb7e040f85eeb22/contourpy-1.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c414fc1ed8ee1dbd5da626cf3710c6013d3d27456651d156711fa24f24bd1291", size = 1268031 }, - { url = "https://files.pythonhosted.org/packages/e2/4a/c788d0bdbf32c8113c2354493ed291f924d4793c4a2e85b69e737a21a658/contourpy-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:31c1b55c1f34f80557d3830d3dd93ba722ce7e33a0b472cba0ec3b6535684d8f", size = 1325995 }, - { url = "https://files.pythonhosted.org/packages/a6/e6/a2f351a90d955f8b0564caf1ebe4b1451a3f01f83e5e3a414055a5b8bccb/contourpy-1.3.1-cp311-cp311-win32.whl", hash = "sha256:f611e628ef06670df83fce17805c344710ca5cde01edfdc72751311da8585375", size = 174396 }, - { url = "https://files.pythonhosted.org/packages/a8/7e/cd93cab453720a5d6cb75588cc17dcdc08fc3484b9de98b885924ff61900/contourpy-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b2bdca22a27e35f16794cf585832e542123296b4687f9fd96822db6bae17bfc9", size = 219787 }, - { url = "https://files.pythonhosted.org/packages/37/6b/175f60227d3e7f5f1549fcb374592be311293132207e451c3d7c654c25fb/contourpy-1.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ffa84be8e0bd33410b17189f7164c3589c229ce5db85798076a3fa136d0e509", size = 271494 }, - { url = "https://files.pythonhosted.org/packages/6b/6a/7833cfae2c1e63d1d8875a50fd23371394f540ce809d7383550681a1fa64/contourpy-1.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805617228ba7e2cbbfb6c503858e626ab528ac2a32a04a2fe88ffaf6b02c32bc", size = 255444 }, - { url = "https://files.pythonhosted.org/packages/7f/b3/7859efce66eaca5c14ba7619791b084ed02d868d76b928ff56890d2d059d/contourpy-1.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ade08d343436a94e633db932e7e8407fe7de8083967962b46bdfc1b0ced39454", size = 307628 }, - { url = "https://files.pythonhosted.org/packages/48/b2/011415f5e3f0a50b1e285a0bf78eb5d92a4df000553570f0851b6e309076/contourpy-1.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:47734d7073fb4590b4a40122b35917cd77be5722d80683b249dac1de266aac80", size = 347271 }, - { url = "https://files.pythonhosted.org/packages/84/7d/ef19b1db0f45b151ac78c65127235239a8cf21a59d1ce8507ce03e89a30b/contourpy-1.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ba94a401342fc0f8b948e57d977557fbf4d515f03c67682dd5c6191cb2d16ec", size = 318906 }, - { url = "https://files.pythonhosted.org/packages/ba/99/6794142b90b853a9155316c8f470d2e4821fe6f086b03e372aca848227dd/contourpy-1.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efa874e87e4a647fd2e4f514d5e91c7d493697127beb95e77d2f7561f6905bd9", size = 323622 }, - { url = "https://files.pythonhosted.org/packages/3c/0f/37d2c84a900cd8eb54e105f4fa9aebd275e14e266736778bb5dccbf3bbbb/contourpy-1.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1bf98051f1045b15c87868dbaea84f92408337d4f81d0e449ee41920ea121d3b", size = 1266699 }, - { url = "https://files.pythonhosted.org/packages/3a/8a/deb5e11dc7d9cc8f0f9c8b29d4f062203f3af230ba83c30a6b161a6effc9/contourpy-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:61332c87493b00091423e747ea78200659dc09bdf7fd69edd5e98cef5d3e9a8d", size = 1326395 }, - { url = "https://files.pythonhosted.org/packages/1a/35/7e267ae7c13aaf12322ccc493531f1e7f2eb8fba2927b9d7a05ff615df7a/contourpy-1.3.1-cp312-cp312-win32.whl", hash = "sha256:e914a8cb05ce5c809dd0fe350cfbb4e881bde5e2a38dc04e3afe1b3e58bd158e", size = 175354 }, - { url = "https://files.pythonhosted.org/packages/a1/35/c2de8823211d07e8a79ab018ef03960716c5dff6f4d5bff5af87fd682992/contourpy-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:08d9d449a61cf53033612cb368f3a1b26cd7835d9b8cd326647efe43bca7568d", size = 220971 }, - { url = "https://files.pythonhosted.org/packages/9a/e7/de62050dce687c5e96f946a93546910bc67e483fe05324439e329ff36105/contourpy-1.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a761d9ccfc5e2ecd1bf05534eda382aa14c3e4f9205ba5b1684ecfe400716ef2", size = 271548 }, - { url = "https://files.pythonhosted.org/packages/78/4d/c2a09ae014ae984c6bdd29c11e74d3121b25eaa117eca0bb76340efd7e1c/contourpy-1.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:523a8ee12edfa36f6d2a49407f705a6ef4c5098de4f498619787e272de93f2d5", size = 255576 }, - { url = "https://files.pythonhosted.org/packages/ab/8a/915380ee96a5638bda80cd061ccb8e666bfdccea38d5741cb69e6dbd61fc/contourpy-1.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece6df05e2c41bd46776fbc712e0996f7c94e0d0543af1656956d150c4ca7c81", size = 306635 }, - { url = "https://files.pythonhosted.org/packages/29/5c/c83ce09375428298acd4e6582aeb68b1e0d1447f877fa993d9bf6cd3b0a0/contourpy-1.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:573abb30e0e05bf31ed067d2f82500ecfdaec15627a59d63ea2d95714790f5c2", size = 345925 }, - { url = "https://files.pythonhosted.org/packages/29/63/5b52f4a15e80c66c8078a641a3bfacd6e07106835682454647aca1afc852/contourpy-1.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fa36448e6a3a1a9a2ba23c02012c43ed88905ec80163f2ffe2421c7192a5d7", size = 318000 }, - { url = "https://files.pythonhosted.org/packages/9a/e2/30ca086c692691129849198659bf0556d72a757fe2769eb9620a27169296/contourpy-1.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ea9924d28fc5586bf0b42d15f590b10c224117e74409dd7a0be3b62b74a501c", size = 322689 }, - { url = "https://files.pythonhosted.org/packages/6b/77/f37812ef700f1f185d348394debf33f22d531e714cf6a35d13d68a7003c7/contourpy-1.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b75aa69cb4d6f137b36f7eb2ace9280cfb60c55dc5f61c731fdf6f037f958a3", size = 1268413 }, - { url = "https://files.pythonhosted.org/packages/3f/6d/ce84e79cdd128542ebeb268f84abb4b093af78e7f8ec504676673d2675bc/contourpy-1.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:041b640d4ec01922083645a94bb3b2e777e6b626788f4095cf21abbe266413c1", size = 1326530 }, - { url = "https://files.pythonhosted.org/packages/72/22/8282f4eae20c73c89bee7a82a19c4e27af9b57bb602ecaa00713d5bdb54d/contourpy-1.3.1-cp313-cp313-win32.whl", hash = "sha256:36987a15e8ace5f58d4d5da9dca82d498c2bbb28dff6e5d04fbfcc35a9cb3a82", size = 175315 }, - { url = "https://files.pythonhosted.org/packages/e3/d5/28bca491f65312b438fbf076589dcde7f6f966b196d900777f5811b9c4e2/contourpy-1.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7895f46d47671fa7ceec40f31fae721da51ad34bdca0bee83e38870b1f47ffd", size = 220987 }, - { url = "https://files.pythonhosted.org/packages/2f/24/a4b285d6adaaf9746e4700932f579f1a7b6f9681109f694cfa233ae75c4e/contourpy-1.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9ddeb796389dadcd884c7eb07bd14ef12408aaae358f0e2ae24114d797eede30", size = 285001 }, - { url = "https://files.pythonhosted.org/packages/48/1d/fb49a401b5ca4f06ccf467cd6c4f1fd65767e63c21322b29b04ec40b40b9/contourpy-1.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19c1555a6801c2f084c7ddc1c6e11f02eb6a6016ca1318dd5452ba3f613a1751", size = 268553 }, - { url = "https://files.pythonhosted.org/packages/79/1e/4aef9470d13fd029087388fae750dccb49a50c012a6c8d1d634295caa644/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841ad858cff65c2c04bf93875e384ccb82b654574a6d7f30453a04f04af71342", size = 310386 }, - { url = "https://files.pythonhosted.org/packages/b0/34/910dc706ed70153b60392b5305c708c9810d425bde12499c9184a1100888/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4318af1c925fb9a4fb190559ef3eec206845f63e80fb603d47f2d6d67683901c", size = 349806 }, - { url = "https://files.pythonhosted.org/packages/31/3c/faee6a40d66d7f2a87f7102236bf4780c57990dd7f98e5ff29881b1b1344/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14c102b0eab282427b662cb590f2e9340a9d91a1c297f48729431f2dcd16e14f", size = 321108 }, - { url = "https://files.pythonhosted.org/packages/17/69/390dc9b20dd4bb20585651d7316cc3054b7d4a7b4f8b710b2b698e08968d/contourpy-1.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05e806338bfeaa006acbdeba0ad681a10be63b26e1b17317bfac3c5d98f36cda", size = 327291 }, - { url = "https://files.pythonhosted.org/packages/ef/74/7030b67c4e941fe1e5424a3d988080e83568030ce0355f7c9fc556455b01/contourpy-1.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4d76d5993a34ef3df5181ba3c92fabb93f1eaa5729504fb03423fcd9f3177242", size = 1263752 }, - { url = "https://files.pythonhosted.org/packages/f0/ed/92d86f183a8615f13f6b9cbfc5d4298a509d6ce433432e21da838b4b63f4/contourpy-1.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:89785bb2a1980c1bd87f0cb1517a71cde374776a5f150936b82580ae6ead44a1", size = 1318403 }, - { url = "https://files.pythonhosted.org/packages/b3/0e/c8e4950c77dcfc897c71d61e56690a0a9df39543d2164040301b5df8e67b/contourpy-1.3.1-cp313-cp313t-win32.whl", hash = "sha256:8eb96e79b9f3dcadbad2a3891672f81cdcab7f95b27f28f1c67d75f045b6b4f1", size = 185117 }, - { url = "https://files.pythonhosted.org/packages/c1/31/1ae946f11dfbd229222e6d6ad8e7bd1891d3d48bde5fbf7a0beb9491f8e3/contourpy-1.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:287ccc248c9e0d0566934e7d606201abd74761b5703d804ff3df8935f523d546", size = 236668 }, +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636 }, + { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636 }, + { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053 }, + { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985 }, + { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750 }, + { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246 }, + { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728 }, + { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762 }, + { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196 }, + { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017 }, + { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580 }, + { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530 }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688 }, + { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331 }, + { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963 }, + { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681 }, + { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674 }, + { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480 }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489 }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042 }, + { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630 }, + { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670 }, + { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694 }, + { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986 }, + { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060 }, + { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747 }, + { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895 }, + { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098 }, + { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535 }, + { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096 }, + { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090 }, + { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643 }, + { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443 }, + { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865 }, + { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162 }, + { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355 }, + { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935 }, + { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168 }, + { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550 }, + { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214 }, + { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807 }, + { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729 }, + { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791 }, ] [[package]] name = "coverage" -version = "7.8.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/19/4f/2251e65033ed2ce1e68f00f91a0294e0f80c80ae8c3ebbe2f12828c4cd53/coverage-7.8.0.tar.gz", hash = "sha256:7a3d62b3b03b4b6fd41a085f3574874cf946cb4604d2b4d3e8dca8cd570ca501", size = 811872 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2b/77/074d201adb8383addae5784cb8e2dac60bb62bfdf28b2b10f3a3af2fda47/coverage-7.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7ac22a0bb2c7c49f441f7a6d46c9c80d96e56f5a8bc6972529ed43c8b694e27", size = 211493 }, - { url = "https://files.pythonhosted.org/packages/a9/89/7a8efe585750fe59b48d09f871f0e0c028a7b10722b2172dfe021fa2fdd4/coverage-7.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf13d564d310c156d1c8e53877baf2993fb3073b2fc9f69790ca6a732eb4bfea", size = 211921 }, - { url = "https://files.pythonhosted.org/packages/e9/ef/96a90c31d08a3f40c49dbe897df4f1fd51fb6583821a1a1c5ee30cc8f680/coverage-7.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5761c70c017c1b0d21b0815a920ffb94a670c8d5d409d9b38857874c21f70d7", size = 244556 }, - { url = "https://files.pythonhosted.org/packages/89/97/dcd5c2ce72cee9d7b0ee8c89162c24972fb987a111b92d1a3d1d19100c61/coverage-7.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ff52d790c7e1628241ffbcaeb33e07d14b007b6eb00a19320c7b8a7024c040", size = 242245 }, - { url = "https://files.pythonhosted.org/packages/b2/7b/b63cbb44096141ed435843bbb251558c8e05cc835c8da31ca6ffb26d44c0/coverage-7.8.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d39fc4817fd67b3915256af5dda75fd4ee10621a3d484524487e33416c6f3543", size = 244032 }, - { url = "https://files.pythonhosted.org/packages/97/e3/7fa8c2c00a1ef530c2a42fa5df25a6971391f92739d83d67a4ee6dcf7a02/coverage-7.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b44674870709017e4b4036e3d0d6c17f06a0e6d4436422e0ad29b882c40697d2", size = 243679 }, - { url = "https://files.pythonhosted.org/packages/4f/b3/e0a59d8df9150c8a0c0841d55d6568f0a9195692136c44f3d21f1842c8f6/coverage-7.8.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8f99eb72bf27cbb167b636eb1726f590c00e1ad375002230607a844d9e9a2318", size = 241852 }, - { url = "https://files.pythonhosted.org/packages/9b/82/db347ccd57bcef150c173df2ade97976a8367a3be7160e303e43dd0c795f/coverage-7.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b571bf5341ba8c6bc02e0baeaf3b061ab993bf372d982ae509807e7f112554e9", size = 242389 }, - { url = "https://files.pythonhosted.org/packages/21/f6/3f7d7879ceb03923195d9ff294456241ed05815281f5254bc16ef71d6a20/coverage-7.8.0-cp311-cp311-win32.whl", hash = "sha256:e75a2ad7b647fd8046d58c3132d7eaf31b12d8a53c0e4b21fa9c4d23d6ee6d3c", size = 213997 }, - { url = "https://files.pythonhosted.org/packages/28/87/021189643e18ecf045dbe1e2071b2747901f229df302de01c998eeadf146/coverage-7.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3043ba1c88b2139126fc72cb48574b90e2e0546d4c78b5299317f61b7f718b78", size = 214911 }, - { url = "https://files.pythonhosted.org/packages/aa/12/4792669473297f7973518bec373a955e267deb4339286f882439b8535b39/coverage-7.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bbb5cc845a0292e0c520656d19d7ce40e18d0e19b22cb3e0409135a575bf79fc", size = 211684 }, - { url = "https://files.pythonhosted.org/packages/be/e1/2a4ec273894000ebedd789e8f2fc3813fcaf486074f87fd1c5b2cb1c0a2b/coverage-7.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4dfd9a93db9e78666d178d4f08a5408aa3f2474ad4d0e0378ed5f2ef71640cb6", size = 211935 }, - { url = "https://files.pythonhosted.org/packages/f8/3a/7b14f6e4372786709a361729164125f6b7caf4024ce02e596c4a69bccb89/coverage-7.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f017a61399f13aa6d1039f75cd467be388d157cd81f1a119b9d9a68ba6f2830d", size = 245994 }, - { url = "https://files.pythonhosted.org/packages/54/80/039cc7f1f81dcbd01ea796d36d3797e60c106077e31fd1f526b85337d6a1/coverage-7.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0915742f4c82208ebf47a2b154a5334155ed9ef9fe6190674b8a46c2fb89cb05", size = 242885 }, - { url = "https://files.pythonhosted.org/packages/10/e0/dc8355f992b6cc2f9dcd5ef6242b62a3f73264893bc09fbb08bfcab18eb4/coverage-7.8.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a40fcf208e021eb14b0fac6bdb045c0e0cab53105f93ba0d03fd934c956143a", size = 245142 }, - { url = "https://files.pythonhosted.org/packages/43/1b/33e313b22cf50f652becb94c6e7dae25d8f02e52e44db37a82de9ac357e8/coverage-7.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a1f406a8e0995d654b2ad87c62caf6befa767885301f3b8f6f73e6f3c31ec3a6", size = 244906 }, - { url = "https://files.pythonhosted.org/packages/05/08/c0a8048e942e7f918764ccc99503e2bccffba1c42568693ce6955860365e/coverage-7.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:77af0f6447a582fdc7de5e06fa3757a3ef87769fbb0fdbdeba78c23049140a47", size = 243124 }, - { url = "https://files.pythonhosted.org/packages/5b/62/ea625b30623083c2aad645c9a6288ad9fc83d570f9adb913a2abdba562dd/coverage-7.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f2d32f95922927186c6dbc8bc60df0d186b6edb828d299ab10898ef3f40052fe", size = 244317 }, - { url = "https://files.pythonhosted.org/packages/62/cb/3871f13ee1130a6c8f020e2f71d9ed269e1e2124aa3374d2180ee451cee9/coverage-7.8.0-cp312-cp312-win32.whl", hash = "sha256:769773614e676f9d8e8a0980dd7740f09a6ea386d0f383db6821df07d0f08545", size = 214170 }, - { url = "https://files.pythonhosted.org/packages/88/26/69fe1193ab0bfa1eb7a7c0149a066123611baba029ebb448500abd8143f9/coverage-7.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:e5d2b9be5b0693cf21eb4ce0ec8d211efb43966f6657807f6859aab3814f946b", size = 214969 }, - { url = "https://files.pythonhosted.org/packages/f3/21/87e9b97b568e223f3438d93072479c2f36cc9b3f6b9f7094b9d50232acc0/coverage-7.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5ac46d0c2dd5820ce93943a501ac5f6548ea81594777ca585bf002aa8854cacd", size = 211708 }, - { url = "https://files.pythonhosted.org/packages/75/be/882d08b28a0d19c9c4c2e8a1c6ebe1f79c9c839eb46d4fca3bd3b34562b9/coverage-7.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:771eb7587a0563ca5bb6f622b9ed7f9d07bd08900f7589b4febff05f469bea00", size = 211981 }, - { url = "https://files.pythonhosted.org/packages/7a/1d/ce99612ebd58082fbe3f8c66f6d8d5694976c76a0d474503fa70633ec77f/coverage-7.8.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42421e04069fb2cbcbca5a696c4050b84a43b05392679d4068acbe65449b5c64", size = 245495 }, - { url = "https://files.pythonhosted.org/packages/dc/8d/6115abe97df98db6b2bd76aae395fcc941d039a7acd25f741312ced9a78f/coverage-7.8.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:554fec1199d93ab30adaa751db68acec2b41c5602ac944bb19187cb9a41a8067", size = 242538 }, - { url = "https://files.pythonhosted.org/packages/cb/74/2f8cc196643b15bc096d60e073691dadb3dca48418f08bc78dd6e899383e/coverage-7.8.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aaeb00761f985007b38cf463b1d160a14a22c34eb3f6a39d9ad6fc27cb73008", size = 244561 }, - { url = "https://files.pythonhosted.org/packages/22/70/c10c77cd77970ac965734fe3419f2c98665f6e982744a9bfb0e749d298f4/coverage-7.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:581a40c7b94921fffd6457ffe532259813fc68eb2bdda60fa8cc343414ce3733", size = 244633 }, - { url = "https://files.pythonhosted.org/packages/38/5a/4f7569d946a07c952688debee18c2bb9ab24f88027e3d71fd25dbc2f9dca/coverage-7.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f319bae0321bc838e205bf9e5bc28f0a3165f30c203b610f17ab5552cff90323", size = 242712 }, - { url = "https://files.pythonhosted.org/packages/bb/a1/03a43b33f50475a632a91ea8c127f7e35e53786dbe6781c25f19fd5a65f8/coverage-7.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04bfec25a8ef1c5f41f5e7e5c842f6b615599ca8ba8391ec33a9290d9d2db3a3", size = 244000 }, - { url = "https://files.pythonhosted.org/packages/6a/89/ab6c43b1788a3128e4d1b7b54214548dcad75a621f9d277b14d16a80d8a1/coverage-7.8.0-cp313-cp313-win32.whl", hash = "sha256:dd19608788b50eed889e13a5d71d832edc34fc9dfce606f66e8f9f917eef910d", size = 214195 }, - { url = "https://files.pythonhosted.org/packages/12/12/6bf5f9a8b063d116bac536a7fb594fc35cb04981654cccb4bbfea5dcdfa0/coverage-7.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:a9abbccd778d98e9c7e85038e35e91e67f5b520776781d9a1e2ee9d400869487", size = 214998 }, - { url = "https://files.pythonhosted.org/packages/2a/e6/1e9df74ef7a1c983a9c7443dac8aac37a46f1939ae3499424622e72a6f78/coverage-7.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:18c5ae6d061ad5b3e7eef4363fb27a0576012a7447af48be6c75b88494c6cf25", size = 212541 }, - { url = "https://files.pythonhosted.org/packages/04/51/c32174edb7ee49744e2e81c4b1414ac9df3dacfcb5b5f273b7f285ad43f6/coverage-7.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:95aa6ae391a22bbbce1b77ddac846c98c5473de0372ba5c463480043a07bff42", size = 212767 }, - { url = "https://files.pythonhosted.org/packages/e9/8f/f454cbdb5212f13f29d4a7983db69169f1937e869a5142bce983ded52162/coverage-7.8.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e013b07ba1c748dacc2a80e69a46286ff145935f260eb8c72df7185bf048f502", size = 256997 }, - { url = "https://files.pythonhosted.org/packages/e6/74/2bf9e78b321216d6ee90a81e5c22f912fc428442c830c4077b4a071db66f/coverage-7.8.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d766a4f0e5aa1ba056ec3496243150698dc0481902e2b8559314368717be82b1", size = 252708 }, - { url = "https://files.pythonhosted.org/packages/92/4d/50d7eb1e9a6062bee6e2f92e78b0998848a972e9afad349b6cdde6fa9e32/coverage-7.8.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad80e6b4a0c3cb6f10f29ae4c60e991f424e6b14219d46f1e7d442b938ee68a4", size = 255046 }, - { url = "https://files.pythonhosted.org/packages/40/9e/71fb4e7402a07c4198ab44fc564d09d7d0ffca46a9fb7b0a7b929e7641bd/coverage-7.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b87eb6fc9e1bb8f98892a2458781348fa37e6925f35bb6ceb9d4afd54ba36c73", size = 256139 }, - { url = "https://files.pythonhosted.org/packages/49/1a/78d37f7a42b5beff027e807c2843185961fdae7fe23aad5a4837c93f9d25/coverage-7.8.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d1ba00ae33be84066cfbe7361d4e04dec78445b2b88bdb734d0d1cbab916025a", size = 254307 }, - { url = "https://files.pythonhosted.org/packages/58/e9/8fb8e0ff6bef5e170ee19d59ca694f9001b2ec085dc99b4f65c128bb3f9a/coverage-7.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f3c38e4e5ccbdc9198aecc766cedbb134b2d89bf64533973678dfcf07effd883", size = 255116 }, - { url = "https://files.pythonhosted.org/packages/56/b0/d968ecdbe6fe0a863de7169bbe9e8a476868959f3af24981f6a10d2b6924/coverage-7.8.0-cp313-cp313t-win32.whl", hash = "sha256:379fe315e206b14e21db5240f89dc0774bdd3e25c3c58c2c733c99eca96f1ada", size = 214909 }, - { url = "https://files.pythonhosted.org/packages/87/e9/d6b7ef9fecf42dfb418d93544af47c940aa83056c49e6021a564aafbc91f/coverage-7.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2e4b6b87bb0c846a9315e3ab4be2d52fac905100565f4b92f02c445c8799e257", size = 216068 }, - { url = "https://files.pythonhosted.org/packages/c4/f1/1da77bb4c920aa30e82fa9b6ea065da3467977c2e5e032e38e66f1c57ffd/coverage-7.8.0-pp39.pp310.pp311-none-any.whl", hash = "sha256:b8194fb8e50d556d5849753de991d390c5a1edeeba50f68e3a9253fbd8bf8ccd", size = 203443 }, - { url = "https://files.pythonhosted.org/packages/59/f1/4da7717f0063a222db253e7121bd6a56f6fb1ba439dcc36659088793347c/coverage-7.8.0-py3-none-any.whl", hash = "sha256:dbf364b4c5e7bae9250528167dfe40219b62e2d573c854d74be213e1e52069f7", size = 203435 }, +version = "7.8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/07/998afa4a0ecdf9b1981ae05415dad2d4e7716e1b1f00abbd91691ac09ac9/coverage-7.8.2.tar.gz", hash = "sha256:a886d531373a1f6ff9fad2a2ba4a045b68467b779ae729ee0b3b10ac20033b27", size = 812759 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/4d/1ff618ee9f134d0de5cc1661582c21a65e06823f41caf801aadf18811a8e/coverage-7.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b99058eef42e6a8dcd135afb068b3d53aff3921ce699e127602efff9956457a9", size = 211692 }, + { url = "https://files.pythonhosted.org/packages/96/fa/c3c1b476de96f2bc7a8ca01a9f1fcb51c01c6b60a9d2c3e66194b2bdb4af/coverage-7.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5feb7f2c3e6ea94d3b877def0270dff0947b8d8c04cfa34a17be0a4dc1836879", size = 212115 }, + { url = "https://files.pythonhosted.org/packages/f7/c2/5414c5a1b286c0f3881ae5adb49be1854ac5b7e99011501f81c8c1453065/coverage-7.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:670a13249b957bb9050fab12d86acef7bf8f6a879b9d1a883799276e0d4c674a", size = 244740 }, + { url = "https://files.pythonhosted.org/packages/cd/46/1ae01912dfb06a642ef3dd9cf38ed4996fda8fe884dab8952da616f81a2b/coverage-7.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0bdc8bf760459a4a4187b452213e04d039990211f98644c7292adf1e471162b5", size = 242429 }, + { url = "https://files.pythonhosted.org/packages/06/58/38c676aec594bfe2a87c7683942e5a30224791d8df99bcc8439fde140377/coverage-7.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07a989c867986c2a75f158f03fdb413128aad29aca9d4dbce5fc755672d96f11", size = 244218 }, + { url = "https://files.pythonhosted.org/packages/80/0c/95b1023e881ce45006d9abc250f76c6cdab7134a1c182d9713878dfefcb2/coverage-7.8.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2db10dedeb619a771ef0e2949ccba7b75e33905de959c2643a4607bef2f3fb3a", size = 243865 }, + { url = "https://files.pythonhosted.org/packages/57/37/0ae95989285a39e0839c959fe854a3ae46c06610439350d1ab860bf020ac/coverage-7.8.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e6ea7dba4e92926b7b5f0990634b78ea02f208d04af520c73a7c876d5a8d36cb", size = 242038 }, + { url = "https://files.pythonhosted.org/packages/4d/82/40e55f7c0eb5e97cc62cbd9d0746fd24e8caf57be5a408b87529416e0c70/coverage-7.8.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ef2f22795a7aca99fc3c84393a55a53dd18ab8c93fb431004e4d8f0774150f54", size = 242567 }, + { url = "https://files.pythonhosted.org/packages/f9/35/66a51adc273433a253989f0d9cc7aa6bcdb4855382cf0858200afe578861/coverage-7.8.2-cp311-cp311-win32.whl", hash = "sha256:641988828bc18a6368fe72355df5f1703e44411adbe49bba5644b941ce6f2e3a", size = 214194 }, + { url = "https://files.pythonhosted.org/packages/f6/8f/a543121f9f5f150eae092b08428cb4e6b6d2d134152c3357b77659d2a605/coverage-7.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8ab4a51cb39dc1933ba627e0875046d150e88478dbe22ce145a68393e9652975", size = 215109 }, + { url = "https://files.pythonhosted.org/packages/77/65/6cc84b68d4f35186463cd7ab1da1169e9abb59870c0f6a57ea6aba95f861/coverage-7.8.2-cp311-cp311-win_arm64.whl", hash = "sha256:8966a821e2083c74d88cca5b7dcccc0a3a888a596a04c0b9668a891de3a0cc53", size = 213521 }, + { url = "https://files.pythonhosted.org/packages/8d/2a/1da1ada2e3044fcd4a3254fb3576e160b8fe5b36d705c8a31f793423f763/coverage-7.8.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2f6fe3654468d061942591aef56686131335b7a8325684eda85dacdf311356c", size = 211876 }, + { url = "https://files.pythonhosted.org/packages/70/e9/3d715ffd5b6b17a8be80cd14a8917a002530a99943cc1939ad5bb2aa74b9/coverage-7.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76090fab50610798cc05241bf83b603477c40ee87acd358b66196ab0ca44ffa1", size = 212130 }, + { url = "https://files.pythonhosted.org/packages/a0/02/fdce62bb3c21649abfd91fbdcf041fb99be0d728ff00f3f9d54d97ed683e/coverage-7.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bd0a0a5054be160777a7920b731a0570284db5142abaaf81bcbb282b8d99279", size = 246176 }, + { url = "https://files.pythonhosted.org/packages/a7/52/decbbed61e03b6ffe85cd0fea360a5e04a5a98a7423f292aae62423b8557/coverage-7.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da23ce9a3d356d0affe9c7036030b5c8f14556bd970c9b224f9c8205505e3b99", size = 243068 }, + { url = "https://files.pythonhosted.org/packages/38/6c/d0e9c0cce18faef79a52778219a3c6ee8e336437da8eddd4ab3dbd8fadff/coverage-7.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9392773cffeb8d7e042a7b15b82a414011e9d2b5fdbbd3f7e6a6b17d5e21b20", size = 245328 }, + { url = "https://files.pythonhosted.org/packages/f0/70/f703b553a2f6b6c70568c7e398ed0789d47f953d67fbba36a327714a7bca/coverage-7.8.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:876cbfd0b09ce09d81585d266c07a32657beb3eaec896f39484b631555be0fe2", size = 245099 }, + { url = "https://files.pythonhosted.org/packages/ec/fb/4cbb370dedae78460c3aacbdad9d249e853f3bc4ce5ff0e02b1983d03044/coverage-7.8.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3da9b771c98977a13fbc3830f6caa85cae6c9c83911d24cb2d218e9394259c57", size = 243314 }, + { url = "https://files.pythonhosted.org/packages/39/9f/1afbb2cb9c8699b8bc38afdce00a3b4644904e6a38c7bf9005386c9305ec/coverage-7.8.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a990f6510b3292686713bfef26d0049cd63b9c7bb17e0864f133cbfd2e6167f", size = 244489 }, + { url = "https://files.pythonhosted.org/packages/79/fa/f3e7ec7d220bff14aba7a4786ae47043770cbdceeea1803083059c878837/coverage-7.8.2-cp312-cp312-win32.whl", hash = "sha256:bf8111cddd0f2b54d34e96613e7fbdd59a673f0cf5574b61134ae75b6f5a33b8", size = 214366 }, + { url = "https://files.pythonhosted.org/packages/54/aa/9cbeade19b7e8e853e7ffc261df885d66bf3a782c71cba06c17df271f9e6/coverage-7.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:86a323a275e9e44cdf228af9b71c5030861d4d2610886ab920d9945672a81223", size = 215165 }, + { url = "https://files.pythonhosted.org/packages/c4/73/e2528bf1237d2448f882bbebaec5c3500ef07301816c5c63464b9da4d88a/coverage-7.8.2-cp312-cp312-win_arm64.whl", hash = "sha256:820157de3a589e992689ffcda8639fbabb313b323d26388d02e154164c57b07f", size = 213548 }, + { url = "https://files.pythonhosted.org/packages/1a/93/eb6400a745ad3b265bac36e8077fdffcf0268bdbbb6c02b7220b624c9b31/coverage-7.8.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ea561010914ec1c26ab4188aef8b1567272ef6de096312716f90e5baa79ef8ca", size = 211898 }, + { url = "https://files.pythonhosted.org/packages/1b/7c/bdbf113f92683024406a1cd226a199e4200a2001fc85d6a6e7e299e60253/coverage-7.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cb86337a4fcdd0e598ff2caeb513ac604d2f3da6d53df2c8e368e07ee38e277d", size = 212171 }, + { url = "https://files.pythonhosted.org/packages/91/22/594513f9541a6b88eb0dba4d5da7d71596dadef6b17a12dc2c0e859818a9/coverage-7.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a4636ddb666971345541b59899e969f3b301143dd86b0ddbb570bd591f1e85", size = 245564 }, + { url = "https://files.pythonhosted.org/packages/1f/f4/2860fd6abeebd9f2efcfe0fd376226938f22afc80c1943f363cd3c28421f/coverage-7.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5040536cf9b13fb033f76bcb5e1e5cb3b57c4807fef37db9e0ed129c6a094257", size = 242719 }, + { url = "https://files.pythonhosted.org/packages/89/60/f5f50f61b6332451520e6cdc2401700c48310c64bc2dd34027a47d6ab4ca/coverage-7.8.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc67994df9bcd7e0150a47ef41278b9e0a0ea187caba72414b71dc590b99a108", size = 244634 }, + { url = "https://files.pythonhosted.org/packages/3b/70/7f4e919039ab7d944276c446b603eea84da29ebcf20984fb1fdf6e602028/coverage-7.8.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e6c86888fd076d9e0fe848af0a2142bf606044dc5ceee0aa9eddb56e26895a0", size = 244824 }, + { url = "https://files.pythonhosted.org/packages/26/45/36297a4c0cea4de2b2c442fe32f60c3991056c59cdc3cdd5346fbb995c97/coverage-7.8.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:684ca9f58119b8e26bef860db33524ae0365601492e86ba0b71d513f525e7050", size = 242872 }, + { url = "https://files.pythonhosted.org/packages/a4/71/e041f1b9420f7b786b1367fa2a375703889ef376e0d48de9f5723fb35f11/coverage-7.8.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8165584ddedb49204c4e18da083913bdf6a982bfb558632a79bdaadcdafd0d48", size = 244179 }, + { url = "https://files.pythonhosted.org/packages/bd/db/3c2bf49bdc9de76acf2491fc03130c4ffc51469ce2f6889d2640eb563d77/coverage-7.8.2-cp313-cp313-win32.whl", hash = "sha256:34759ee2c65362163699cc917bdb2a54114dd06d19bab860725f94ef45a3d9b7", size = 214393 }, + { url = "https://files.pythonhosted.org/packages/c6/dc/947e75d47ebbb4b02d8babb1fad4ad381410d5bc9da7cfca80b7565ef401/coverage-7.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:2f9bc608fbafaee40eb60a9a53dbfb90f53cc66d3d32c2849dc27cf5638a21e3", size = 215194 }, + { url = "https://files.pythonhosted.org/packages/90/31/a980f7df8a37eaf0dc60f932507fda9656b3a03f0abf188474a0ea188d6d/coverage-7.8.2-cp313-cp313-win_arm64.whl", hash = "sha256:9fe449ee461a3b0c7105690419d0b0aba1232f4ff6d120a9e241e58a556733f7", size = 213580 }, + { url = "https://files.pythonhosted.org/packages/8a/6a/25a37dd90f6c95f59355629417ebcb74e1c34e38bb1eddf6ca9b38b0fc53/coverage-7.8.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8369a7c8ef66bded2b6484053749ff220dbf83cba84f3398c84c51a6f748a008", size = 212734 }, + { url = "https://files.pythonhosted.org/packages/36/8b/3a728b3118988725f40950931abb09cd7f43b3c740f4640a59f1db60e372/coverage-7.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:159b81df53a5fcbc7d45dae3adad554fdbde9829a994e15227b3f9d816d00b36", size = 212959 }, + { url = "https://files.pythonhosted.org/packages/53/3c/212d94e6add3a3c3f412d664aee452045ca17a066def8b9421673e9482c4/coverage-7.8.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6fcbbd35a96192d042c691c9e0c49ef54bd7ed865846a3c9d624c30bb67ce46", size = 257024 }, + { url = "https://files.pythonhosted.org/packages/a4/40/afc03f0883b1e51bbe804707aae62e29c4e8c8bbc365c75e3e4ddeee9ead/coverage-7.8.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05364b9cc82f138cc86128dc4e2e1251c2981a2218bfcd556fe6b0fbaa3501be", size = 252867 }, + { url = "https://files.pythonhosted.org/packages/18/a2/3699190e927b9439c6ded4998941a3c1d6fa99e14cb28d8536729537e307/coverage-7.8.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46d532db4e5ff3979ce47d18e2fe8ecad283eeb7367726da0e5ef88e4fe64740", size = 255096 }, + { url = "https://files.pythonhosted.org/packages/b4/06/16e3598b9466456b718eb3e789457d1a5b8bfb22e23b6e8bbc307df5daf0/coverage-7.8.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4000a31c34932e7e4fa0381a3d6deb43dc0c8f458e3e7ea6502e6238e10be625", size = 256276 }, + { url = "https://files.pythonhosted.org/packages/a7/d5/4b5a120d5d0223050a53d2783c049c311eea1709fa9de12d1c358e18b707/coverage-7.8.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:43ff5033d657cd51f83015c3b7a443287250dc14e69910577c3e03bd2e06f27b", size = 254478 }, + { url = "https://files.pythonhosted.org/packages/ba/85/f9ecdb910ecdb282b121bfcaa32fa8ee8cbd7699f83330ee13ff9bbf1a85/coverage-7.8.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94316e13f0981cbbba132c1f9f365cac1d26716aaac130866ca812006f662199", size = 255255 }, + { url = "https://files.pythonhosted.org/packages/50/63/2d624ac7d7ccd4ebbd3c6a9eba9d7fc4491a1226071360d59dd84928ccb2/coverage-7.8.2-cp313-cp313t-win32.whl", hash = "sha256:3f5673888d3676d0a745c3d0e16da338c5eea300cb1f4ada9c872981265e76d8", size = 215109 }, + { url = "https://files.pythonhosted.org/packages/22/5e/7053b71462e970e869111c1853afd642212568a350eba796deefdfbd0770/coverage-7.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:2c08b05ee8d7861e45dc5a2cc4195c8c66dca5ac613144eb6ebeaff2d502e73d", size = 216268 }, + { url = "https://files.pythonhosted.org/packages/07/69/afa41aa34147655543dbe96994f8a246daf94b361ccf5edfd5df62ce066a/coverage-7.8.2-cp313-cp313t-win_arm64.whl", hash = "sha256:1e1448bb72b387755e1ff3ef1268a06617afd94188164960dba8d0245a46004b", size = 214071 }, + { url = "https://files.pythonhosted.org/packages/69/2f/572b29496d8234e4a7773200dd835a0d32d9e171f2d974f3fe04a9dbc271/coverage-7.8.2-pp39.pp310.pp311-none-any.whl", hash = "sha256:ec455eedf3ba0bbdf8f5a570012617eb305c63cb9f03428d39bf544cb2b94837", size = 203636 }, + { url = "https://files.pythonhosted.org/packages/a0/1a/0b9c32220ad694d66062f571cc5cedfa9997b64a591e8a500bb63de1bd40/coverage-7.8.2-py3-none-any.whl", hash = "sha256:726f32ee3713f7359696331a18daf0c3b3a70bb0ae71141b9d3c52be7c595e32", size = 203623 }, ] [package.optional-dependencies] @@ -660,46 +670,48 @@ wheels = [ [[package]] name = "cryptography" -version = "44.0.2" +version = "45.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cd/25/4ce80c78963834b8a9fd1cc1266be5ed8d1840785c0f2e1b73b8d128d505/cryptography-44.0.2.tar.gz", hash = "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0", size = 710807 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/92/ef/83e632cfa801b221570c5f58c0369db6fa6cef7d9ff859feab1aae1a8a0f/cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7", size = 6676361 }, - { url = "https://files.pythonhosted.org/packages/30/ec/7ea7c1e4c8fc8329506b46c6c4a52e2f20318425d48e0fe597977c71dbce/cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1", size = 3952350 }, - { url = "https://files.pythonhosted.org/packages/27/61/72e3afdb3c5ac510330feba4fc1faa0fe62e070592d6ad00c40bb69165e5/cryptography-44.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb", size = 4166572 }, - { url = "https://files.pythonhosted.org/packages/26/e4/ba680f0b35ed4a07d87f9e98f3ebccb05091f3bf6b5a478b943253b3bbd5/cryptography-44.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843", size = 3958124 }, - { url = "https://files.pythonhosted.org/packages/9c/e8/44ae3e68c8b6d1cbc59040288056df2ad7f7f03bbcaca6b503c737ab8e73/cryptography-44.0.2-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5", size = 3678122 }, - { url = "https://files.pythonhosted.org/packages/27/7b/664ea5e0d1eab511a10e480baf1c5d3e681c7d91718f60e149cec09edf01/cryptography-44.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c", size = 4191831 }, - { url = "https://files.pythonhosted.org/packages/2a/07/79554a9c40eb11345e1861f46f845fa71c9e25bf66d132e123d9feb8e7f9/cryptography-44.0.2-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a", size = 3960583 }, - { url = "https://files.pythonhosted.org/packages/bb/6d/858e356a49a4f0b591bd6789d821427de18432212e137290b6d8a817e9bf/cryptography-44.0.2-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308", size = 4191753 }, - { url = "https://files.pythonhosted.org/packages/b2/80/62df41ba4916067fa6b125aa8c14d7e9181773f0d5d0bd4dcef580d8b7c6/cryptography-44.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688", size = 4079550 }, - { url = "https://files.pythonhosted.org/packages/f3/cd/2558cc08f7b1bb40683f99ff4327f8dcfc7de3affc669e9065e14824511b/cryptography-44.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7", size = 4298367 }, - { url = "https://files.pythonhosted.org/packages/71/59/94ccc74788945bc3bd4cf355d19867e8057ff5fdbcac781b1ff95b700fb1/cryptography-44.0.2-cp37-abi3-win32.whl", hash = "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79", size = 2772843 }, - { url = "https://files.pythonhosted.org/packages/ca/2c/0d0bbaf61ba05acb32f0841853cfa33ebb7a9ab3d9ed8bb004bd39f2da6a/cryptography-44.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa", size = 3209057 }, - { url = "https://files.pythonhosted.org/packages/9e/be/7a26142e6d0f7683d8a382dd963745e65db895a79a280a30525ec92be890/cryptography-44.0.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3", size = 6677789 }, - { url = "https://files.pythonhosted.org/packages/06/88/638865be7198a84a7713950b1db7343391c6066a20e614f8fa286eb178ed/cryptography-44.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639", size = 3951919 }, - { url = "https://files.pythonhosted.org/packages/d7/fc/99fe639bcdf58561dfad1faa8a7369d1dc13f20acd78371bb97a01613585/cryptography-44.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd", size = 4167812 }, - { url = "https://files.pythonhosted.org/packages/53/7b/aafe60210ec93d5d7f552592a28192e51d3c6b6be449e7fd0a91399b5d07/cryptography-44.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181", size = 3958571 }, - { url = "https://files.pythonhosted.org/packages/16/32/051f7ce79ad5a6ef5e26a92b37f172ee2d6e1cce09931646eef8de1e9827/cryptography-44.0.2-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea", size = 3679832 }, - { url = "https://files.pythonhosted.org/packages/78/2b/999b2a1e1ba2206f2d3bca267d68f350beb2b048a41ea827e08ce7260098/cryptography-44.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699", size = 4193719 }, - { url = "https://files.pythonhosted.org/packages/72/97/430e56e39a1356e8e8f10f723211a0e256e11895ef1a135f30d7d40f2540/cryptography-44.0.2-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9", size = 3960852 }, - { url = "https://files.pythonhosted.org/packages/89/33/c1cf182c152e1d262cac56850939530c05ca6c8d149aa0dcee490b417e99/cryptography-44.0.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23", size = 4193906 }, - { url = "https://files.pythonhosted.org/packages/e1/99/87cf26d4f125380dc674233971069bc28d19b07f7755b29861570e513650/cryptography-44.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922", size = 4081572 }, - { url = "https://files.pythonhosted.org/packages/b3/9f/6a3e0391957cc0c5f84aef9fbdd763035f2b52e998a53f99345e3ac69312/cryptography-44.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4", size = 4298631 }, - { url = "https://files.pythonhosted.org/packages/e2/a5/5bc097adb4b6d22a24dea53c51f37e480aaec3465285c253098642696423/cryptography-44.0.2-cp39-abi3-win32.whl", hash = "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5", size = 2773792 }, - { url = "https://files.pythonhosted.org/packages/33/cf/1f7649b8b9a3543e042d3f348e398a061923ac05b507f3f4d95f11938aa9/cryptography-44.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6", size = 3210957 }, - { url = "https://files.pythonhosted.org/packages/d6/d7/f30e75a6aa7d0f65031886fa4a1485c2fbfe25a1896953920f6a9cfe2d3b/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d", size = 3887513 }, - { url = "https://files.pythonhosted.org/packages/9c/b4/7a494ce1032323ca9db9a3661894c66e0d7142ad2079a4249303402d8c71/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471", size = 4107432 }, - { url = "https://files.pythonhosted.org/packages/45/f8/6b3ec0bc56123b344a8d2b3264a325646d2dcdbdd9848b5e6f3d37db90b3/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615", size = 3891421 }, - { url = "https://files.pythonhosted.org/packages/57/ff/f3b4b2d007c2a646b0f69440ab06224f9cf37a977a72cdb7b50632174e8a/cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390", size = 4107081 }, +sdist = { url = "https://files.pythonhosted.org/packages/13/1f/9fa001e74a1993a9cadd2333bb889e50c66327b8594ac538ab8a04f915b7/cryptography-45.0.3.tar.gz", hash = "sha256:ec21313dd335c51d7877baf2972569f40a4291b76a0ce51391523ae358d05899", size = 744738 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/b2/2345dc595998caa6f68adf84e8f8b50d18e9fc4638d32b22ea8daedd4b7a/cryptography-45.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:7573d9eebaeceeb55285205dbbb8753ac1e962af3d9640791d12b36864065e71", size = 7056239 }, + { url = "https://files.pythonhosted.org/packages/71/3d/ac361649a0bfffc105e2298b720d8b862330a767dab27c06adc2ddbef96a/cryptography-45.0.3-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d377dde61c5d67eb4311eace661c3efda46c62113ff56bf05e2d679e02aebb5b", size = 4205541 }, + { url = "https://files.pythonhosted.org/packages/70/3e/c02a043750494d5c445f769e9c9f67e550d65060e0bfce52d91c1362693d/cryptography-45.0.3-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fae1e637f527750811588e4582988932c222f8251f7b7ea93739acb624e1487f", size = 4433275 }, + { url = "https://files.pythonhosted.org/packages/40/7a/9af0bfd48784e80eef3eb6fd6fde96fe706b4fc156751ce1b2b965dada70/cryptography-45.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ca932e11218bcc9ef812aa497cdf669484870ecbcf2d99b765d6c27a86000942", size = 4209173 }, + { url = "https://files.pythonhosted.org/packages/31/5f/d6f8753c8708912df52e67969e80ef70b8e8897306cd9eb8b98201f8c184/cryptography-45.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:af3f92b1dc25621f5fad065288a44ac790c5798e986a34d393ab27d2b27fcff9", size = 3898150 }, + { url = "https://files.pythonhosted.org/packages/8b/50/f256ab79c671fb066e47336706dc398c3b1e125f952e07d54ce82cf4011a/cryptography-45.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2f8f8f0b73b885ddd7f3d8c2b2234a7d3ba49002b0223f58cfde1bedd9563c56", size = 4466473 }, + { url = "https://files.pythonhosted.org/packages/62/e7/312428336bb2df0848d0768ab5a062e11a32d18139447a76dfc19ada8eed/cryptography-45.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9cc80ce69032ffa528b5e16d217fa4d8d4bb7d6ba8659c1b4d74a1b0f4235fca", size = 4211890 }, + { url = "https://files.pythonhosted.org/packages/e7/53/8a130e22c1e432b3c14896ec5eb7ac01fb53c6737e1d705df7e0efb647c6/cryptography-45.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c824c9281cb628015bfc3c59335163d4ca0540d49de4582d6c2637312907e4b1", size = 4466300 }, + { url = "https://files.pythonhosted.org/packages/ba/75/6bb6579688ef805fd16a053005fce93944cdade465fc92ef32bbc5c40681/cryptography-45.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:5833bb4355cb377ebd880457663a972cd044e7f49585aee39245c0d592904578", size = 4332483 }, + { url = "https://files.pythonhosted.org/packages/2f/11/2538f4e1ce05c6c4f81f43c1ef2bd6de7ae5e24ee284460ff6c77e42ca77/cryptography-45.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9bb5bf55dcb69f7067d80354d0a348368da907345a2c448b0babc4215ccd3497", size = 4573714 }, + { url = "https://files.pythonhosted.org/packages/f5/bb/e86e9cf07f73a98d84a4084e8fd420b0e82330a901d9cac8149f994c3417/cryptography-45.0.3-cp311-abi3-win32.whl", hash = "sha256:3ad69eeb92a9de9421e1f6685e85a10fbcfb75c833b42cc9bc2ba9fb00da4710", size = 2934752 }, + { url = "https://files.pythonhosted.org/packages/c7/75/063bc9ddc3d1c73e959054f1fc091b79572e716ef74d6caaa56e945b4af9/cryptography-45.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:97787952246a77d77934d41b62fb1b6f3581d83f71b44796a4158d93b8f5c490", size = 3412465 }, + { url = "https://files.pythonhosted.org/packages/71/9b/04ead6015229a9396890d7654ee35ef630860fb42dc9ff9ec27f72157952/cryptography-45.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:c92519d242703b675ccefd0f0562eb45e74d438e001f8ab52d628e885751fb06", size = 7031892 }, + { url = "https://files.pythonhosted.org/packages/46/c7/c7d05d0e133a09fc677b8a87953815c522697bdf025e5cac13ba419e7240/cryptography-45.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5edcb90da1843df85292ef3a313513766a78fbbb83f584a5a58fb001a5a9d57", size = 4196181 }, + { url = "https://files.pythonhosted.org/packages/08/7a/6ad3aa796b18a683657cef930a986fac0045417e2dc428fd336cfc45ba52/cryptography-45.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38deed72285c7ed699864f964a3f4cf11ab3fb38e8d39cfcd96710cd2b5bb716", size = 4423370 }, + { url = "https://files.pythonhosted.org/packages/4f/58/ec1461bfcb393525f597ac6a10a63938d18775b7803324072974b41a926b/cryptography-45.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5555365a50efe1f486eed6ac7062c33b97ccef409f5970a0b6f205a7cfab59c8", size = 4197839 }, + { url = "https://files.pythonhosted.org/packages/d4/3d/5185b117c32ad4f40846f579369a80e710d6146c2baa8ce09d01612750db/cryptography-45.0.3-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9e4253ed8f5948a3589b3caee7ad9a5bf218ffd16869c516535325fece163dcc", size = 3886324 }, + { url = "https://files.pythonhosted.org/packages/67/85/caba91a57d291a2ad46e74016d1f83ac294f08128b26e2a81e9b4f2d2555/cryptography-45.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cfd84777b4b6684955ce86156cfb5e08d75e80dc2585e10d69e47f014f0a5342", size = 4450447 }, + { url = "https://files.pythonhosted.org/packages/ae/d1/164e3c9d559133a38279215c712b8ba38e77735d3412f37711b9f8f6f7e0/cryptography-45.0.3-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:a2b56de3417fd5f48773ad8e91abaa700b678dc7fe1e0c757e1ae340779acf7b", size = 4200576 }, + { url = "https://files.pythonhosted.org/packages/71/7a/e002d5ce624ed46dfc32abe1deff32190f3ac47ede911789ee936f5a4255/cryptography-45.0.3-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:57a6500d459e8035e813bd8b51b671977fb149a8c95ed814989da682314d0782", size = 4450308 }, + { url = "https://files.pythonhosted.org/packages/87/ad/3fbff9c28cf09b0a71e98af57d74f3662dea4a174b12acc493de00ea3f28/cryptography-45.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f22af3c78abfbc7cbcdf2c55d23c3e022e1a462ee2481011d518c7fb9c9f3d65", size = 4325125 }, + { url = "https://files.pythonhosted.org/packages/f5/b4/51417d0cc01802304c1984d76e9592f15e4801abd44ef7ba657060520bf0/cryptography-45.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:232954730c362638544758a8160c4ee1b832dc011d2c41a306ad8f7cccc5bb0b", size = 4560038 }, + { url = "https://files.pythonhosted.org/packages/80/38/d572f6482d45789a7202fb87d052deb7a7b136bf17473ebff33536727a2c/cryptography-45.0.3-cp37-abi3-win32.whl", hash = "sha256:cb6ab89421bc90e0422aca911c69044c2912fc3debb19bb3c1bfe28ee3dff6ab", size = 2924070 }, + { url = "https://files.pythonhosted.org/packages/91/5a/61f39c0ff4443651cc64e626fa97ad3099249152039952be8f344d6b0c86/cryptography-45.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:d54ae41e6bd70ea23707843021c778f151ca258081586f0cfa31d936ae43d1b2", size = 3395005 }, + { url = "https://files.pythonhosted.org/packages/e7/d4/58a246342093a66af8935d6aa59f790cbb4731adae3937b538d054bdc2f9/cryptography-45.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:edd6d51869beb7f0d472e902ef231a9b7689508e83880ea16ca3311a00bf5ce7", size = 3589802 }, + { url = "https://files.pythonhosted.org/packages/96/61/751ebea58c87b5be533c429f01996050a72c7283b59eee250275746632ea/cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:555e5e2d3a53b4fabeca32835878b2818b3f23966a4efb0d566689777c5a12c8", size = 4146964 }, + { url = "https://files.pythonhosted.org/packages/8d/01/28c90601b199964de383da0b740b5156f5d71a1da25e7194fdf793d373ef/cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:25286aacb947286620a31f78f2ed1a32cded7be5d8b729ba3fb2c988457639e4", size = 4388103 }, + { url = "https://files.pythonhosted.org/packages/3d/ec/cd892180b9e42897446ef35c62442f5b8b039c3d63a05f618aa87ec9ebb5/cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:050ce5209d5072472971e6efbfc8ec5a8f9a841de5a4db0ebd9c2e392cb81972", size = 4150031 }, + { url = "https://files.pythonhosted.org/packages/db/d4/22628c2dedd99289960a682439c6d3aa248dff5215123ead94ac2d82f3f5/cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:dc10ec1e9f21f33420cc05214989544727e776286c1c16697178978327b95c9c", size = 4387389 }, + { url = "https://files.pythonhosted.org/packages/39/ec/ba3961abbf8ecb79a3586a4ff0ee08c9d7a9938b4312fb2ae9b63f48a8ba/cryptography-45.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:9eda14f049d7f09c2e8fb411dda17dd6b16a3c76a1de5e249188a32aeb92de19", size = 3337432 }, ] [[package]] name = "dask" -version = "2025.3.0" +version = "2025.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -711,9 +723,9 @@ dependencies = [ { name = "pyyaml" }, { name = "toolz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c3/f1/b4d8ccb5010ecba58a1799cb3c6b7ef5ed0d7d2add53adc1fc0d0ace56fe/dask-2025.3.0.tar.gz", hash = "sha256:322834f44ebc24abeb564c56ccb817c97d6e7af6be71ad0ad96b78b51f2e0e85", size = 10928728 } +sdist = { url = "https://files.pythonhosted.org/packages/3d/29/05feb8e2531c46d763547c66b7f5deb39b53d99b3be1b4ddddbd1cec6567/dask-2025.5.1.tar.gz", hash = "sha256:979d9536549de0e463f4cab8a8c66c3a2ef55791cd740d07d9bf58fab1d1076a", size = 10969324 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/8a/3609033a4bfd7c9b3e8a4e8a5d6e318dfc06ab2e2d3b5cb0e01a60458858/dask-2025.3.0-py3-none-any.whl", hash = "sha256:b5d72bb33788904a218fd7da1850238517592358ecc79c30bb5c188a71df506d", size = 1437133 }, + { url = "https://files.pythonhosted.org/packages/38/30/53b0844a7a4c6b041b111b24ca15cc9b8661a86fe1f6aaeb2d0d7f0fb1f2/dask-2025.5.1-py3-none-any.whl", hash = "sha256:3b85fdaa5f6f989dde49da6008415b1ae996985ebdfb1e40de2c997d9010371d", size = 1474226 }, ] [[package]] @@ -769,7 +781,7 @@ wheels = [ [[package]] name = "distributed" -version = "2025.3.0" +version = "2025.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -788,9 +800,9 @@ dependencies = [ { name = "urllib3" }, { name = "zict" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2d/24/161ef76cdf39f38b4092ceae233f02f8eb673b2ef3c3f0d478f479e28c30/distributed-2025.3.0.tar.gz", hash = "sha256:84a68c91db2a106c752ca7845fba8cd92ad4f3545c0fb2d9b6dec0f44b225539", size = 1112159 } +sdist = { url = "https://files.pythonhosted.org/packages/29/ba/45950f405d023a520a4d10753ef40209a465b86c8fdc131236ec29bcb15c/distributed-2025.5.1.tar.gz", hash = "sha256:cf1d62a2c17a0a9fc1544bd10bb7afd39f22f24aaa9e3df3209c44d2cfb16703", size = 1107874 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/f1/196d28df38200133574922a3fa20b58629bb11cdabe185cbd9943d6fd371/distributed-2025.3.0-py3-none-any.whl", hash = "sha256:ebdacd181873b39bc30185857a5a856f051efaaf42ef2a8f507708857acdc6a9", size = 1018811 }, + { url = "https://files.pythonhosted.org/packages/25/65/89601dcc7383f0e5109e59eab90677daa9abb260d821570cd6089c8894bf/distributed-2025.5.1-py3-none-any.whl", hash = "sha256:74782b965ddb24ce59c6441fa777e944b5962d82325cc41f228537b59bb7fbbe", size = 1014789 }, ] [[package]] @@ -879,56 +891,79 @@ wheels = [ [[package]] name = "frozenlist" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8f/ed/0f4cec13a93c02c47ec32d81d11c0c1efbadf4a471e3f3ce7cad366cbbd3/frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", size = 39930 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/79/43/0bed28bf5eb1c9e4301003b74453b8e7aa85fb293b31dde352aac528dafc/frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30", size = 94987 }, - { url = "https://files.pythonhosted.org/packages/bb/bf/b74e38f09a246e8abbe1e90eb65787ed745ccab6eaa58b9c9308e052323d/frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5", size = 54584 }, - { url = "https://files.pythonhosted.org/packages/2c/31/ab01375682f14f7613a1ade30149f684c84f9b8823a4391ed950c8285656/frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778", size = 52499 }, - { url = "https://files.pythonhosted.org/packages/98/a8/d0ac0b9276e1404f58fec3ab6e90a4f76b778a49373ccaf6a563f100dfbc/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a", size = 276357 }, - { url = "https://files.pythonhosted.org/packages/ad/c9/c7761084fa822f07dac38ac29f841d4587570dd211e2262544aa0b791d21/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869", size = 287516 }, - { url = "https://files.pythonhosted.org/packages/a1/ff/cd7479e703c39df7bdab431798cef89dc75010d8aa0ca2514c5b9321db27/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d", size = 283131 }, - { url = "https://files.pythonhosted.org/packages/59/a0/370941beb47d237eca4fbf27e4e91389fd68699e6f4b0ebcc95da463835b/frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45", size = 261320 }, - { url = "https://files.pythonhosted.org/packages/b8/5f/c10123e8d64867bc9b4f2f510a32042a306ff5fcd7e2e09e5ae5100ee333/frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d", size = 274877 }, - { url = "https://files.pythonhosted.org/packages/fa/79/38c505601ae29d4348f21706c5d89755ceded02a745016ba2f58bd5f1ea6/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3", size = 269592 }, - { url = "https://files.pythonhosted.org/packages/19/e2/39f3a53191b8204ba9f0bb574b926b73dd2efba2a2b9d2d730517e8f7622/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a", size = 265934 }, - { url = "https://files.pythonhosted.org/packages/d5/c9/3075eb7f7f3a91f1a6b00284af4de0a65a9ae47084930916f5528144c9dd/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9", size = 283859 }, - { url = "https://files.pythonhosted.org/packages/05/f5/549f44d314c29408b962fa2b0e69a1a67c59379fb143b92a0a065ffd1f0f/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2", size = 287560 }, - { url = "https://files.pythonhosted.org/packages/9d/f8/cb09b3c24a3eac02c4c07a9558e11e9e244fb02bf62c85ac2106d1eb0c0b/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf", size = 277150 }, - { url = "https://files.pythonhosted.org/packages/37/48/38c2db3f54d1501e692d6fe058f45b6ad1b358d82cd19436efab80cfc965/frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942", size = 45244 }, - { url = "https://files.pythonhosted.org/packages/ca/8c/2ddffeb8b60a4bce3b196c32fcc30d8830d4615e7b492ec2071da801b8ad/frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d", size = 51634 }, - { url = "https://files.pythonhosted.org/packages/79/73/fa6d1a96ab7fd6e6d1c3500700963eab46813847f01ef0ccbaa726181dd5/frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21", size = 94026 }, - { url = "https://files.pythonhosted.org/packages/ab/04/ea8bf62c8868b8eada363f20ff1b647cf2e93377a7b284d36062d21d81d1/frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d", size = 54150 }, - { url = "https://files.pythonhosted.org/packages/d0/9a/8e479b482a6f2070b26bda572c5e6889bb3ba48977e81beea35b5ae13ece/frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e", size = 51927 }, - { url = "https://files.pythonhosted.org/packages/e3/12/2aad87deb08a4e7ccfb33600871bbe8f0e08cb6d8224371387f3303654d7/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a", size = 282647 }, - { url = "https://files.pythonhosted.org/packages/77/f2/07f06b05d8a427ea0060a9cef6e63405ea9e0d761846b95ef3fb3be57111/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a", size = 289052 }, - { url = "https://files.pythonhosted.org/packages/bd/9f/8bf45a2f1cd4aa401acd271b077989c9267ae8463e7c8b1eb0d3f561b65e/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee", size = 291719 }, - { url = "https://files.pythonhosted.org/packages/41/d1/1f20fd05a6c42d3868709b7604c9f15538a29e4f734c694c6bcfc3d3b935/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6", size = 267433 }, - { url = "https://files.pythonhosted.org/packages/af/f2/64b73a9bb86f5a89fb55450e97cd5c1f84a862d4ff90d9fd1a73ab0f64a5/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e", size = 283591 }, - { url = "https://files.pythonhosted.org/packages/29/e2/ffbb1fae55a791fd6c2938dd9ea779509c977435ba3940b9f2e8dc9d5316/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9", size = 273249 }, - { url = "https://files.pythonhosted.org/packages/2e/6e/008136a30798bb63618a114b9321b5971172a5abddff44a100c7edc5ad4f/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039", size = 271075 }, - { url = "https://files.pythonhosted.org/packages/ae/f0/4e71e54a026b06724cec9b6c54f0b13a4e9e298cc8db0f82ec70e151f5ce/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784", size = 285398 }, - { url = "https://files.pythonhosted.org/packages/4d/36/70ec246851478b1c0b59f11ef8ade9c482ff447c1363c2bd5fad45098b12/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631", size = 294445 }, - { url = "https://files.pythonhosted.org/packages/37/e0/47f87544055b3349b633a03c4d94b405956cf2437f4ab46d0928b74b7526/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", size = 280569 }, - { url = "https://files.pythonhosted.org/packages/f9/7c/490133c160fb6b84ed374c266f42800e33b50c3bbab1652764e6e1fc498a/frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", size = 44721 }, - { url = "https://files.pythonhosted.org/packages/b1/56/4e45136ffc6bdbfa68c29ca56ef53783ef4c2fd395f7cbf99a2624aa9aaa/frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", size = 51329 }, - { url = "https://files.pythonhosted.org/packages/da/3b/915f0bca8a7ea04483622e84a9bd90033bab54bdf485479556c74fd5eaf5/frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", size = 91538 }, - { url = "https://files.pythonhosted.org/packages/c7/d1/a7c98aad7e44afe5306a2b068434a5830f1470675f0e715abb86eb15f15b/frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", size = 52849 }, - { url = "https://files.pythonhosted.org/packages/3a/c8/76f23bf9ab15d5f760eb48701909645f686f9c64fbb8982674c241fbef14/frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", size = 50583 }, - { url = "https://files.pythonhosted.org/packages/1f/22/462a3dd093d11df623179d7754a3b3269de3b42de2808cddef50ee0f4f48/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", size = 265636 }, - { url = "https://files.pythonhosted.org/packages/80/cf/e075e407fc2ae7328155a1cd7e22f932773c8073c1fc78016607d19cc3e5/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", size = 270214 }, - { url = "https://files.pythonhosted.org/packages/a1/58/0642d061d5de779f39c50cbb00df49682832923f3d2ebfb0fedf02d05f7f/frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", size = 273905 }, - { url = "https://files.pythonhosted.org/packages/ab/66/3fe0f5f8f2add5b4ab7aa4e199f767fd3b55da26e3ca4ce2cc36698e50c4/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", size = 250542 }, - { url = "https://files.pythonhosted.org/packages/f6/b8/260791bde9198c87a465224e0e2bb62c4e716f5d198fc3a1dacc4895dbd1/frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", size = 267026 }, - { url = "https://files.pythonhosted.org/packages/2e/a4/3d24f88c527f08f8d44ade24eaee83b2627793fa62fa07cbb7ff7a2f7d42/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", size = 257690 }, - { url = "https://files.pythonhosted.org/packages/de/9a/d311d660420b2beeff3459b6626f2ab4fb236d07afbdac034a4371fe696e/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", size = 253893 }, - { url = "https://files.pythonhosted.org/packages/c6/23/e491aadc25b56eabd0f18c53bb19f3cdc6de30b2129ee0bc39cd387cd560/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", size = 267006 }, - { url = "https://files.pythonhosted.org/packages/08/c4/ab918ce636a35fb974d13d666dcbe03969592aeca6c3ab3835acff01f79c/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", size = 276157 }, - { url = "https://files.pythonhosted.org/packages/c0/29/3b7a0bbbbe5a34833ba26f686aabfe982924adbdcafdc294a7a129c31688/frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", size = 264642 }, - { url = "https://files.pythonhosted.org/packages/ab/42/0595b3dbffc2e82d7fe658c12d5a5bafcd7516c6bf2d1d1feb5387caa9c1/frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", size = 44914 }, - { url = "https://files.pythonhosted.org/packages/17/c4/b7db1206a3fea44bf3b838ca61deb6f74424a8a5db1dd53ecb21da669be6/frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", size = 51167 }, - { url = "https://files.pythonhosted.org/packages/c6/c8/a5be5b7550c10858fcf9b0ea054baccab474da77d37f1e828ce043a3a5d4/frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", size = 11901 }, +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/f4/d744cba2da59b5c1d88823cf9e8a6c74e4659e2b27604ed973be2a0bf5ab/frozenlist-1.6.0.tar.gz", hash = "sha256:b99655c32c1c8e06d111e7f41c06c29a5318cb1835df23a45518e02a47c63b68", size = 42831 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/b5/bc883b5296ec902115c00be161da93bf661199c465ec4c483feec6ea4c32/frozenlist-1.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae8337990e7a45683548ffb2fee1af2f1ed08169284cd829cdd9a7fa7470530d", size = 160912 }, + { url = "https://files.pythonhosted.org/packages/6f/93/51b058b563d0704b39c56baa222828043aafcac17fd3734bec5dbeb619b1/frozenlist-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c952f69dd524558694818a461855f35d36cc7f5c0adddce37e962c85d06eac0", size = 124315 }, + { url = "https://files.pythonhosted.org/packages/c9/e0/46cd35219428d350558b874d595e132d1c17a9471a1bd0d01d518a261e7c/frozenlist-1.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f5fef13136c4e2dee91bfb9a44e236fff78fc2cd9f838eddfc470c3d7d90afe", size = 122230 }, + { url = "https://files.pythonhosted.org/packages/d1/0f/7ad2ce928ad06d6dd26a61812b959ded573d3e9d0ee6109d96c2be7172e9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:716bbba09611b4663ecbb7cd022f640759af8259e12a6ca939c0a6acd49eedba", size = 314842 }, + { url = "https://files.pythonhosted.org/packages/34/76/98cbbd8a20a5c3359a2004ae5e5b216af84a150ccbad67c8f8f30fb2ea91/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7b8c4dc422c1a3ffc550b465090e53b0bf4839047f3e436a34172ac67c45d595", size = 304919 }, + { url = "https://files.pythonhosted.org/packages/9a/fa/258e771ce3a44348c05e6b01dffc2bc67603fba95761458c238cd09a2c77/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b11534872256e1666116f6587a1592ef395a98b54476addb5e8d352925cb5d4a", size = 324074 }, + { url = "https://files.pythonhosted.org/packages/d5/a4/047d861fd8c538210e12b208c0479912273f991356b6bdee7ea8356b07c9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c6eceb88aaf7221f75be6ab498dc622a151f5f88d536661af3ffc486245a626", size = 321292 }, + { url = "https://files.pythonhosted.org/packages/c0/25/cfec8af758b4525676cabd36efcaf7102c1348a776c0d1ad046b8a7cdc65/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62c828a5b195570eb4b37369fcbbd58e96c905768d53a44d13044355647838ff", size = 301569 }, + { url = "https://files.pythonhosted.org/packages/87/2f/0c819372fa9f0c07b153124bf58683b8d0ca7bb73ea5ccde9b9ef1745beb/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1c6bd2c6399920c9622362ce95a7d74e7f9af9bfec05fff91b8ce4b9647845a", size = 313625 }, + { url = "https://files.pythonhosted.org/packages/50/5f/f0cf8b0fdedffdb76b3745aa13d5dbe404d63493cc211ce8250f2025307f/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49ba23817781e22fcbd45fd9ff2b9b8cdb7b16a42a4851ab8025cae7b22e96d0", size = 312523 }, + { url = "https://files.pythonhosted.org/packages/e1/6c/38c49108491272d3e84125bbabf2c2d0b304899b52f49f0539deb26ad18d/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:431ef6937ae0f853143e2ca67d6da76c083e8b1fe3df0e96f3802fd37626e606", size = 322657 }, + { url = "https://files.pythonhosted.org/packages/bd/4b/3bd3bad5be06a9d1b04b1c22be80b5fe65b502992d62fab4bdb25d9366ee/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9d124b38b3c299ca68433597ee26b7819209cb8a3a9ea761dfe9db3a04bba584", size = 303414 }, + { url = "https://files.pythonhosted.org/packages/5b/89/7e225a30bef6e85dbfe22622c24afe932e9444de3b40d58b1ea589a14ef8/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:118e97556306402e2b010da1ef21ea70cb6d6122e580da64c056b96f524fbd6a", size = 320321 }, + { url = "https://files.pythonhosted.org/packages/22/72/7e3acef4dd9e86366cb8f4d8f28e852c2b7e116927e9722b31a6f71ea4b0/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb3b309f1d4086b5533cf7bbcf3f956f0ae6469664522f1bde4feed26fba60f1", size = 323975 }, + { url = "https://files.pythonhosted.org/packages/d8/85/e5da03d20507e13c66ce612c9792b76811b7a43e3320cce42d95b85ac755/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54dece0d21dce4fdb188a1ffc555926adf1d1c516e493c2914d7c370e454bc9e", size = 316553 }, + { url = "https://files.pythonhosted.org/packages/ac/8e/6c609cbd0580ae8a0661c408149f196aade7d325b1ae7adc930501b81acb/frozenlist-1.6.0-cp311-cp311-win32.whl", hash = "sha256:654e4ba1d0b2154ca2f096bed27461cf6160bc7f504a7f9a9ef447c293caf860", size = 115511 }, + { url = "https://files.pythonhosted.org/packages/f2/13/a84804cfde6de12d44ed48ecbf777ba62b12ff09e761f76cdd1ff9e14bb1/frozenlist-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e911391bffdb806001002c1f860787542f45916c3baf764264a52765d5a5603", size = 120863 }, + { url = "https://files.pythonhosted.org/packages/9c/8a/289b7d0de2fbac832ea80944d809759976f661557a38bb8e77db5d9f79b7/frozenlist-1.6.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c5b9e42ace7d95bf41e19b87cec8f262c41d3510d8ad7514ab3862ea2197bfb1", size = 160193 }, + { url = "https://files.pythonhosted.org/packages/19/80/2fd17d322aec7f430549f0669f599997174f93ee17929ea5b92781ec902c/frozenlist-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ca9973735ce9f770d24d5484dcb42f68f135351c2fc81a7a9369e48cf2998a29", size = 123831 }, + { url = "https://files.pythonhosted.org/packages/99/06/f5812da431273f78c6543e0b2f7de67dfd65eb0a433978b2c9c63d2205e4/frozenlist-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6ac40ec76041c67b928ca8aaffba15c2b2ee3f5ae8d0cb0617b5e63ec119ca25", size = 121862 }, + { url = "https://files.pythonhosted.org/packages/d0/31/9e61c6b5fc493cf24d54881731204d27105234d09878be1a5983182cc4a5/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95b7a8a3180dfb280eb044fdec562f9b461614c0ef21669aea6f1d3dac6ee576", size = 316361 }, + { url = "https://files.pythonhosted.org/packages/9d/55/22ca9362d4f0222324981470fd50192be200154d51509ee6eb9baa148e96/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c444d824e22da6c9291886d80c7d00c444981a72686e2b59d38b285617cb52c8", size = 307115 }, + { url = "https://files.pythonhosted.org/packages/ae/39/4fff42920a57794881e7bb3898dc7f5f539261711ea411b43bba3cde8b79/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb52c8166499a8150bfd38478248572c924c003cbb45fe3bcd348e5ac7c000f9", size = 322505 }, + { url = "https://files.pythonhosted.org/packages/55/f2/88c41f374c1e4cf0092a5459e5f3d6a1e17ed274c98087a76487783df90c/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b35298b2db9c2468106278537ee529719228950a5fdda686582f68f247d1dc6e", size = 322666 }, + { url = "https://files.pythonhosted.org/packages/75/51/034eeb75afdf3fd03997856195b500722c0b1a50716664cde64e28299c4b/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d108e2d070034f9d57210f22fefd22ea0d04609fc97c5f7f5a686b3471028590", size = 302119 }, + { url = "https://files.pythonhosted.org/packages/2b/a6/564ecde55ee633270a793999ef4fd1d2c2b32b5a7eec903b1012cb7c5143/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e1be9111cb6756868ac242b3c2bd1f09d9aea09846e4f5c23715e7afb647103", size = 316226 }, + { url = "https://files.pythonhosted.org/packages/f1/c8/6c0682c32377f402b8a6174fb16378b683cf6379ab4d2827c580892ab3c7/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:94bb451c664415f02f07eef4ece976a2c65dcbab9c2f1705b7031a3a75349d8c", size = 312788 }, + { url = "https://files.pythonhosted.org/packages/b6/b8/10fbec38f82c5d163ca1750bfff4ede69713badf236a016781cf1f10a0f0/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d1a686d0b0949182b8faddea596f3fc11f44768d1f74d4cad70213b2e139d821", size = 325914 }, + { url = "https://files.pythonhosted.org/packages/62/ca/2bf4f3a1bd40cdedd301e6ecfdbb291080d5afc5f9ce350c0739f773d6b9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ea8e59105d802c5a38bdbe7362822c522230b3faba2aa35c0fa1765239b7dd70", size = 305283 }, + { url = "https://files.pythonhosted.org/packages/09/64/20cc13ccf94abc2a1f482f74ad210703dc78a590d0b805af1c9aa67f76f9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:abc4e880a9b920bc5020bf6a431a6bb40589d9bca3975c980495f63632e8382f", size = 319264 }, + { url = "https://files.pythonhosted.org/packages/20/ff/86c6a2bbe98cfc231519f5e6d712a0898488ceac804a917ce014f32e68f6/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a79713adfe28830f27a3c62f6b5406c37376c892b05ae070906f07ae4487046", size = 326482 }, + { url = "https://files.pythonhosted.org/packages/2f/da/8e381f66367d79adca245d1d71527aac774e30e291d41ef161ce2d80c38e/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a0318c2068e217a8f5e3b85e35899f5a19e97141a45bb925bb357cfe1daf770", size = 318248 }, + { url = "https://files.pythonhosted.org/packages/39/24/1a1976563fb476ab6f0fa9fefaac7616a4361dbe0461324f9fd7bf425dbe/frozenlist-1.6.0-cp312-cp312-win32.whl", hash = "sha256:853ac025092a24bb3bf09ae87f9127de9fe6e0c345614ac92536577cf956dfcc", size = 115161 }, + { url = "https://files.pythonhosted.org/packages/80/2e/fb4ed62a65f8cd66044706b1013f0010930d8cbb0729a2219561ea075434/frozenlist-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2bdfe2d7e6c9281c6e55523acd6c2bf77963cb422fdc7d142fb0cb6621b66878", size = 120548 }, + { url = "https://files.pythonhosted.org/packages/6f/e5/04c7090c514d96ca00887932417f04343ab94904a56ab7f57861bf63652d/frozenlist-1.6.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1d7fb014fe0fbfee3efd6a94fc635aeaa68e5e1720fe9e57357f2e2c6e1a647e", size = 158182 }, + { url = "https://files.pythonhosted.org/packages/e9/8f/60d0555c61eec855783a6356268314d204137f5e0c53b59ae2fc28938c99/frozenlist-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01bcaa305a0fdad12745502bfd16a1c75b14558dabae226852f9159364573117", size = 122838 }, + { url = "https://files.pythonhosted.org/packages/5a/a7/d0ec890e3665b4b3b7c05dc80e477ed8dc2e2e77719368e78e2cd9fec9c8/frozenlist-1.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b314faa3051a6d45da196a2c495e922f987dc848e967d8cfeaee8a0328b1cd4", size = 120980 }, + { url = "https://files.pythonhosted.org/packages/cc/19/9b355a5e7a8eba903a008579964192c3e427444752f20b2144b10bb336df/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da62fecac21a3ee10463d153549d8db87549a5e77eefb8c91ac84bb42bb1e4e3", size = 305463 }, + { url = "https://files.pythonhosted.org/packages/9c/8d/5b4c758c2550131d66935ef2fa700ada2461c08866aef4229ae1554b93ca/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1eb89bf3454e2132e046f9599fbcf0a4483ed43b40f545551a39316d0201cd1", size = 297985 }, + { url = "https://files.pythonhosted.org/packages/48/2c/537ec09e032b5865715726b2d1d9813e6589b571d34d01550c7aeaad7e53/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18689b40cb3936acd971f663ccb8e2589c45db5e2c5f07e0ec6207664029a9c", size = 311188 }, + { url = "https://files.pythonhosted.org/packages/31/2f/1aa74b33f74d54817055de9a4961eff798f066cdc6f67591905d4fc82a84/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e67ddb0749ed066b1a03fba812e2dcae791dd50e5da03be50b6a14d0c1a9ee45", size = 311874 }, + { url = "https://files.pythonhosted.org/packages/bf/f0/cfec18838f13ebf4b37cfebc8649db5ea71a1b25dacd691444a10729776c/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc5e64626e6682638d6e44398c9baf1d6ce6bc236d40b4b57255c9d3f9761f1f", size = 291897 }, + { url = "https://files.pythonhosted.org/packages/ea/a5/deb39325cbbea6cd0a46db8ccd76150ae2fcbe60d63243d9df4a0b8c3205/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:437cfd39564744ae32ad5929e55b18ebd88817f9180e4cc05e7d53b75f79ce85", size = 305799 }, + { url = "https://files.pythonhosted.org/packages/78/22/6ddec55c5243a59f605e4280f10cee8c95a449f81e40117163383829c241/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62dd7df78e74d924952e2feb7357d826af8d2f307557a779d14ddf94d7311be8", size = 302804 }, + { url = "https://files.pythonhosted.org/packages/5d/b7/d9ca9bab87f28855063c4d202936800219e39db9e46f9fb004d521152623/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a66781d7e4cddcbbcfd64de3d41a61d6bdde370fc2e38623f30b2bd539e84a9f", size = 316404 }, + { url = "https://files.pythonhosted.org/packages/a6/3a/1255305db7874d0b9eddb4fe4a27469e1fb63720f1fc6d325a5118492d18/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:482fe06e9a3fffbcd41950f9d890034b4a54395c60b5e61fae875d37a699813f", size = 295572 }, + { url = "https://files.pythonhosted.org/packages/2a/f2/8d38eeee39a0e3a91b75867cc102159ecccf441deb6ddf67be96d3410b84/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e4f9373c500dfc02feea39f7a56e4f543e670212102cc2eeb51d3a99c7ffbde6", size = 307601 }, + { url = "https://files.pythonhosted.org/packages/38/04/80ec8e6b92f61ef085422d7b196822820404f940950dde5b2e367bede8bc/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e69bb81de06827147b7bfbaeb284d85219fa92d9f097e32cc73675f279d70188", size = 314232 }, + { url = "https://files.pythonhosted.org/packages/3a/58/93b41fb23e75f38f453ae92a2f987274c64637c450285577bd81c599b715/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7613d9977d2ab4a9141dde4a149f4357e4065949674c5649f920fec86ecb393e", size = 308187 }, + { url = "https://files.pythonhosted.org/packages/6a/a2/e64df5c5aa36ab3dee5a40d254f3e471bb0603c225f81664267281c46a2d/frozenlist-1.6.0-cp313-cp313-win32.whl", hash = "sha256:4def87ef6d90429f777c9d9de3961679abf938cb6b7b63d4a7eb8a268babfce4", size = 114772 }, + { url = "https://files.pythonhosted.org/packages/a0/77/fead27441e749b2d574bb73d693530d59d520d4b9e9679b8e3cb779d37f2/frozenlist-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:37a8a52c3dfff01515e9bbbee0e6063181362f9de3db2ccf9bc96189b557cbfd", size = 119847 }, + { url = "https://files.pythonhosted.org/packages/df/bd/cc6d934991c1e5d9cafda83dfdc52f987c7b28343686aef2e58a9cf89f20/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:46138f5a0773d064ff663d273b309b696293d7a7c00a0994c5c13a5078134b64", size = 174937 }, + { url = "https://files.pythonhosted.org/packages/f2/a2/daf945f335abdbfdd5993e9dc348ef4507436936ab3c26d7cfe72f4843bf/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f88bc0a2b9c2a835cb888b32246c27cdab5740059fb3688852bf91e915399b91", size = 136029 }, + { url = "https://files.pythonhosted.org/packages/51/65/4c3145f237a31247c3429e1c94c384d053f69b52110a0d04bfc8afc55fb2/frozenlist-1.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:777704c1d7655b802c7850255639672e90e81ad6fa42b99ce5ed3fbf45e338dd", size = 134831 }, + { url = "https://files.pythonhosted.org/packages/77/38/03d316507d8dea84dfb99bdd515ea245628af964b2bf57759e3c9205cc5e/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ef8d41764c7de0dcdaf64f733a27352248493a85a80661f3c678acd27e31f2", size = 392981 }, + { url = "https://files.pythonhosted.org/packages/37/02/46285ef9828f318ba400a51d5bb616ded38db8466836a9cfa39f3903260b/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:da5cb36623f2b846fb25009d9d9215322318ff1c63403075f812b3b2876c8506", size = 371999 }, + { url = "https://files.pythonhosted.org/packages/0d/64/1212fea37a112c3c5c05bfb5f0a81af4836ce349e69be75af93f99644da9/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbb56587a16cf0fb8acd19e90ff9924979ac1431baea8681712716a8337577b0", size = 392200 }, + { url = "https://files.pythonhosted.org/packages/81/ce/9a6ea1763e3366e44a5208f76bf37c76c5da570772375e4d0be85180e588/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6154c3ba59cda3f954c6333025369e42c3acd0c6e8b6ce31eb5c5b8116c07e0", size = 390134 }, + { url = "https://files.pythonhosted.org/packages/bc/36/939738b0b495b2c6d0c39ba51563e453232813042a8d908b8f9544296c29/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e8246877afa3f1ae5c979fe85f567d220f86a50dc6c493b9b7d8191181ae01e", size = 365208 }, + { url = "https://files.pythonhosted.org/packages/b4/8b/939e62e93c63409949c25220d1ba8e88e3960f8ef6a8d9ede8f94b459d27/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0f6cce16306d2e117cf9db71ab3a9e8878a28176aeaf0dbe35248d97b28d0c", size = 385548 }, + { url = "https://files.pythonhosted.org/packages/62/38/22d2873c90102e06a7c5a3a5b82ca47e393c6079413e8a75c72bff067fa8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1b8e8cd8032ba266f91136d7105706ad57770f3522eac4a111d77ac126a25a9b", size = 391123 }, + { url = "https://files.pythonhosted.org/packages/44/78/63aaaf533ee0701549500f6d819be092c6065cb5c577edb70c09df74d5d0/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e2ada1d8515d3ea5378c018a5f6d14b4994d4036591a52ceaf1a1549dec8e1ad", size = 394199 }, + { url = "https://files.pythonhosted.org/packages/54/45/71a6b48981d429e8fbcc08454dc99c4c2639865a646d549812883e9c9dd3/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:cdb2c7f071e4026c19a3e32b93a09e59b12000751fc9b0b7758da899e657d215", size = 373854 }, + { url = "https://files.pythonhosted.org/packages/3f/f3/dbf2a5e11736ea81a66e37288bf9f881143a7822b288a992579ba1b4204d/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:03572933a1969a6d6ab509d509e5af82ef80d4a5d4e1e9f2e1cdd22c77a3f4d2", size = 395412 }, + { url = "https://files.pythonhosted.org/packages/b3/f1/c63166806b331f05104d8ea385c4acd511598568b1f3e4e8297ca54f2676/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:77effc978947548b676c54bbd6a08992759ea6f410d4987d69feea9cd0919911", size = 394936 }, + { url = "https://files.pythonhosted.org/packages/ef/ea/4f3e69e179a430473eaa1a75ff986526571215fefc6b9281cdc1f09a4eb8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a2bda8be77660ad4089caf2223fdbd6db1858462c4b85b67fbfa22102021e497", size = 391459 }, + { url = "https://files.pythonhosted.org/packages/d3/c3/0fc2c97dea550df9afd072a37c1e95421652e3206bbeaa02378b24c2b480/frozenlist-1.6.0-cp313-cp313t-win32.whl", hash = "sha256:a4d96dc5bcdbd834ec6b0f91027817214216b5b30316494d2b1aebffb87c534f", size = 128797 }, + { url = "https://files.pythonhosted.org/packages/ae/f5/79c9320c5656b1965634fe4be9c82b12a3305bdbc58ad9cb941131107b20/frozenlist-1.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e18036cb4caa17ea151fd5f3d70be9d354c99eb8cf817a3ccde8a7873b074348", size = 134709 }, + { url = "https://files.pythonhosted.org/packages/71/3e/b04a0adda73bd52b390d730071c0d577073d3d26740ee1bad25c3ad0f37b/frozenlist-1.6.0-py3-none-any.whl", hash = "sha256:535eec9987adb04701266b92745d6cdcef2e77669299359c3009c3404dd5d191", size = 12404 }, ] [[package]] @@ -991,29 +1026,29 @@ wheels = [ [[package]] name = "google-auth" -version = "2.38.0" +version = "2.40.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cachetools" }, { name = "pyasn1-modules" }, { name = "rsa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c6/eb/d504ba1daf190af6b204a9d4714d457462b486043744901a6eeea711f913/google_auth-2.38.0.tar.gz", hash = "sha256:8285113607d3b80a3f1543b75962447ba8a09fe85783432a784fdeef6ac094c4", size = 270866 } +sdist = { url = "https://files.pythonhosted.org/packages/66/84/f67f53c505a6b2c5da05c988e2a5483f5ba9eee4b1841d2e3ff22f547cd5/google_auth-2.40.2.tar.gz", hash = "sha256:a33cde547a2134273226fa4b853883559947ebe9207521f7afc707efbf690f58", size = 280990 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/47/603554949a37bca5b7f894d51896a9c534b9eab808e2520a748e081669d0/google_auth-2.38.0-py2.py3-none-any.whl", hash = "sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a", size = 210770 }, + { url = "https://files.pythonhosted.org/packages/6a/c7/e2d82e6702e2a9e2311c138f8e1100f21d08aed0231290872b229ae57a86/google_auth-2.40.2-py2.py3-none-any.whl", hash = "sha256:f7e568d42eedfded58734f6a60c58321896a621f7c116c411550a4b4a13da90b", size = 216102 }, ] [[package]] name = "google-auth-oauthlib" -version = "1.2.1" +version = "1.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "google-auth" }, { name = "requests-oauthlib" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/cc/0f/1772edb8d75ecf6280f1c7f51cbcebe274e8b17878b382f63738fd96cee5/google_auth_oauthlib-1.2.1.tar.gz", hash = "sha256:afd0cad092a2eaa53cd8e8298557d6de1034c6cb4a740500b5357b648af97263", size = 24970 } +sdist = { url = "https://files.pythonhosted.org/packages/fb/87/e10bf24f7bcffc1421b84d6f9c3377c30ec305d082cd737ddaa6d8f77f7c/google_auth_oauthlib-1.2.2.tar.gz", hash = "sha256:11046fb8d3348b296302dd939ace8af0a724042e8029c1b872d87fabc9f41684", size = 20955 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/8e/22a28dfbd218033e4eeaf3a0533b2b54852b6530da0c0fe934f0cc494b29/google_auth_oauthlib-1.2.1-py2.py3-none-any.whl", hash = "sha256:2d58a27262d55aa1b87678c3ba7142a080098cbc2024f903c62355deb235d91f", size = 24930 }, + { url = "https://files.pythonhosted.org/packages/ac/84/40ee070be95771acd2f4418981edb834979424565c3eec3cd88b6aa09d24/google_auth_oauthlib-1.2.2-py3-none-any.whl", hash = "sha256:fd619506f4b3908b5df17b65f39ca8d66ea56986e5472eb5978fd8f3786f00a2", size = 19072 }, ] [[package]] @@ -1087,74 +1122,102 @@ wheels = [ [[package]] name = "googleapis-common-protos" -version = "1.69.2" +version = "1.70.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1b/d7/ee9d56af4e6dbe958562b5020f46263c8a4628e7952070241fc0e9b182ae/googleapis_common_protos-1.69.2.tar.gz", hash = "sha256:3e1b904a27a33c821b4b749fd31d334c0c9c30e6113023d495e48979a3dc9c5f", size = 144496 } +sdist = { url = "https://files.pythonhosted.org/packages/39/24/33db22342cf4a2ea27c9955e6713140fedd51e8b141b5ce5260897020f1a/googleapis_common_protos-1.70.0.tar.gz", hash = "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257", size = 145903 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/53/d35476d547a286506f0a6a634ccf1e5d288fffd53d48f0bd5fef61d68684/googleapis_common_protos-1.69.2-py3-none-any.whl", hash = "sha256:0b30452ff9c7a27d80bfc5718954063e8ab53dd3697093d3bc99581f5fd24212", size = 293215 }, + { url = "https://files.pythonhosted.org/packages/86/f1/62a193f0227cf15a920390abe675f386dec35f7ae3ffe6da582d3ade42c7/googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8", size = 294530 }, ] [[package]] name = "greenlet" -version = "3.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/74/907bb43af91782e0366b0960af62a8ce1f9398e4291cac7beaeffbee0c04/greenlet-3.2.1.tar.gz", hash = "sha256:9f4dd4b4946b14bb3bf038f81e1d2e535b7d94f1b2a59fdba1293cd9c1a0a4d7", size = 184475 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/80/a6ee52c59f75a387ec1f0c0075cf7981fb4644e4162afd3401dabeaa83ca/greenlet-3.2.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:aa30066fd6862e1153eaae9b51b449a6356dcdb505169647f69e6ce315b9468b", size = 268609 }, - { url = "https://files.pythonhosted.org/packages/ad/11/bd7a900629a4dd0e691dda88f8c2a7bfa44d0c4cffdb47eb5302f87a30d0/greenlet-3.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b0f3a0a67786facf3b907a25db80efe74310f9d63cc30869e49c79ee3fcef7e", size = 628776 }, - { url = "https://files.pythonhosted.org/packages/46/f1/686754913fcc2707addadf815c884fd49c9f00a88e6dac277a1e1a8b8086/greenlet-3.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64a4d0052de53ab3ad83ba86de5ada6aeea8f099b4e6c9ccce70fb29bc02c6a2", size = 640827 }, - { url = "https://files.pythonhosted.org/packages/03/74/bef04fa04125f6bcae2c1117e52f99c5706ac6ee90b7300b49b3bc18fc7d/greenlet-3.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:852ef432919830022f71a040ff7ba3f25ceb9fe8f3ab784befd747856ee58530", size = 636752 }, - { url = "https://files.pythonhosted.org/packages/aa/08/e8d493ab65ae1e9823638b8d0bf5d6b44f062221d424c5925f03960ba3d0/greenlet-3.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4818116e75a0dd52cdcf40ca4b419e8ce5cb6669630cb4f13a6c384307c9543f", size = 635993 }, - { url = "https://files.pythonhosted.org/packages/1f/9d/3a3a979f2b019fb756c9a92cd5e69055aded2862ebd0437de109cf7472a2/greenlet-3.2.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9afa05fe6557bce1642d8131f87ae9462e2a8e8c46f7ed7929360616088a3975", size = 583927 }, - { url = "https://files.pythonhosted.org/packages/59/21/a00d27d9abb914c1213926be56b2a2bf47999cf0baf67d9ef5b105b8eb5b/greenlet-3.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5c12f0d17a88664757e81a6e3fc7c2452568cf460a2f8fb44f90536b2614000b", size = 1112891 }, - { url = "https://files.pythonhosted.org/packages/20/c7/922082bf41f0948a78d703d75261d5297f3db894758317409e4677dc1446/greenlet-3.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dbb4e1aa2000852937dd8f4357fb73e3911da426df8ca9b8df5db231922da474", size = 1138318 }, - { url = "https://files.pythonhosted.org/packages/34/d7/e05aa525d824ec32735ba7e66917e944a64866c1a95365b5bd03f3eb2c08/greenlet-3.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:cb5ee928ce5fedf9a4b0ccdc547f7887136c4af6109d8f2fe8e00f90c0db47f5", size = 295407 }, - { url = "https://files.pythonhosted.org/packages/f0/d1/e4777b188a04726f6cf69047830d37365b9191017f54caf2f7af336a6f18/greenlet-3.2.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:0ba2811509a30e5f943be048895a983a8daf0b9aa0ac0ead526dfb5d987d80ea", size = 270381 }, - { url = "https://files.pythonhosted.org/packages/59/e7/b5b738f5679247ddfcf2179c38945519668dced60c3164c20d55c1a7bb4a/greenlet-3.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4245246e72352b150a1588d43ddc8ab5e306bef924c26571aafafa5d1aaae4e8", size = 637195 }, - { url = "https://files.pythonhosted.org/packages/6c/9f/57968c88a5f6bc371364baf983a2e5549cca8f503bfef591b6dd81332cbc/greenlet-3.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7abc0545d8e880779f0c7ce665a1afc3f72f0ca0d5815e2b006cafc4c1cc5840", size = 651381 }, - { url = "https://files.pythonhosted.org/packages/40/81/1533c9a458e9f2ebccb3ae22f1463b2093b0eb448a88aac36182f1c2cd3d/greenlet-3.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6dcc6d604a6575c6225ac0da39df9335cc0c6ac50725063fa90f104f3dbdb2c9", size = 646110 }, - { url = "https://files.pythonhosted.org/packages/06/66/25f7e4b1468ebe4a520757f2e41c2a36a2f49a12e963431b82e9f98df2a0/greenlet-3.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2273586879affca2d1f414709bb1f61f0770adcabf9eda8ef48fd90b36f15d12", size = 648070 }, - { url = "https://files.pythonhosted.org/packages/d7/4c/49d366565c4c4d29e6f666287b9e2f471a66c3a3d8d5066692e347f09e27/greenlet-3.2.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ff38c869ed30fff07f1452d9a204ece1ec6d3c0870e0ba6e478ce7c1515acf22", size = 603816 }, - { url = "https://files.pythonhosted.org/packages/04/15/1612bb61506f44b6b8b6bebb6488702b1fe1432547e95dda57874303a1f5/greenlet-3.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e934591a7a4084fa10ee5ef50eb9d2ac8c4075d5c9cf91128116b5dca49d43b1", size = 1119572 }, - { url = "https://files.pythonhosted.org/packages/cc/2f/002b99dacd1610e825876f5cbbe7f86740aa2a6b76816e5eca41c8457e85/greenlet-3.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:063bcf7f8ee28eb91e7f7a8148c65a43b73fbdc0064ab693e024b5a940070145", size = 1147442 }, - { url = "https://files.pythonhosted.org/packages/c0/ba/82a2c3b9868644ee6011da742156247070f30e952f4d33f33857458450f2/greenlet-3.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7132e024ebeeeabbe661cf8878aac5d2e643975c4feae833142592ec2f03263d", size = 296207 }, - { url = "https://files.pythonhosted.org/packages/77/2a/581b3808afec55b2db838742527c40b4ce68b9b64feedff0fd0123f4b19a/greenlet-3.2.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:e1967882f0c42eaf42282a87579685c8673c51153b845fde1ee81be720ae27ac", size = 269119 }, - { url = "https://files.pythonhosted.org/packages/b0/f3/1c4e27fbdc84e13f05afc2baf605e704668ffa26e73a43eca93e1120813e/greenlet-3.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e77ae69032a95640a5fe8c857ec7bee569a0997e809570f4c92048691ce4b437", size = 637314 }, - { url = "https://files.pythonhosted.org/packages/fc/1a/9fc43cb0044f425f7252da9847893b6de4e3b20c0a748bce7ab3f063d5bc/greenlet-3.2.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3227c6ec1149d4520bc99edac3b9bc8358d0034825f3ca7572165cb502d8f29a", size = 651421 }, - { url = "https://files.pythonhosted.org/packages/8a/65/d47c03cdc62c6680206b7420c4a98363ee997e87a5e9da1e83bd7eeb57a8/greenlet-3.2.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ddda0197c5b46eedb5628d33dad034c455ae77708c7bf192686e760e26d6a0c", size = 645789 }, - { url = "https://files.pythonhosted.org/packages/2f/40/0faf8bee1b106c241780f377b9951dd4564ef0972de1942ef74687aa6bba/greenlet-3.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de62b542e5dcf0b6116c310dec17b82bb06ef2ceb696156ff7bf74a7a498d982", size = 648262 }, - { url = "https://files.pythonhosted.org/packages/e0/a8/73305f713183c2cb08f3ddd32eaa20a6854ba9c37061d682192db9b021c3/greenlet-3.2.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c07a0c01010df42f1f058b3973decc69c4d82e036a951c3deaf89ab114054c07", size = 606770 }, - { url = "https://files.pythonhosted.org/packages/c3/05/7d726e1fb7f8a6ac55ff212a54238a36c57db83446523c763e20cd30b837/greenlet-3.2.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2530bfb0abcd451ea81068e6d0a1aac6dabf3f4c23c8bd8e2a8f579c2dd60d95", size = 1117960 }, - { url = "https://files.pythonhosted.org/packages/bf/9f/2b6cb1bd9f1537e7b08c08705c4a1d7bd4f64489c67d102225c4fd262bda/greenlet-3.2.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1c472adfca310f849903295c351d297559462067f618944ce2650a1878b84123", size = 1145500 }, - { url = "https://files.pythonhosted.org/packages/e4/f6/339c6e707062319546598eb9827d3ca8942a3eccc610d4a54c1da7b62527/greenlet-3.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:24a496479bc8bd01c39aa6516a43c717b4cee7196573c47b1f8e1011f7c12495", size = 295994 }, - { url = "https://files.pythonhosted.org/packages/f1/72/2a251d74a596af7bb1717e891ad4275a3fd5ac06152319d7ad8c77f876af/greenlet-3.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:175d583f7d5ee57845591fc30d852b75b144eb44b05f38b67966ed6df05c8526", size = 629889 }, - { url = "https://files.pythonhosted.org/packages/29/2e/d7ed8bf97641bf704b6a43907c0e082cdf44d5bc026eb8e1b79283e7a719/greenlet-3.2.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3ecc9d33ca9428e4536ea53e79d781792cee114d2fa2695b173092bdbd8cd6d5", size = 635261 }, - { url = "https://files.pythonhosted.org/packages/1e/75/802aa27848a6fcb5e566f69c64534f572e310f0f12d41e9201a81e741551/greenlet-3.2.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f56382ac4df3860ebed8ed838f268f03ddf4e459b954415534130062b16bc32", size = 632523 }, - { url = "https://files.pythonhosted.org/packages/56/09/f7c1c3bab9b4c589ad356503dd71be00935e9c4db4db516ed88fc80f1187/greenlet-3.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc45a7189c91c0f89aaf9d69da428ce8301b0fd66c914a499199cfb0c28420fc", size = 628816 }, - { url = "https://files.pythonhosted.org/packages/79/e0/1bb90d30b5450eac2dffeaac6b692857c4bd642c21883b79faa8fa056cf2/greenlet-3.2.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51a2f49da08cff79ee42eb22f1658a2aed60c72792f0a0a95f5f0ca6d101b1fb", size = 593687 }, - { url = "https://files.pythonhosted.org/packages/c5/b5/adbe03c8b4c178add20cc716021183ae6b0326d56ba8793d7828c94286f6/greenlet-3.2.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:0c68bbc639359493420282d2f34fa114e992a8724481d700da0b10d10a7611b8", size = 1105754 }, - { url = "https://files.pythonhosted.org/packages/39/93/84582d7ef38dec009543ccadec6ab41079a6cbc2b8c0566bcd07bf1aaf6c/greenlet-3.2.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:e775176b5c203a1fa4be19f91da00fd3bff536868b77b237da3f4daa5971ae5d", size = 1125160 }, +version = "3.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/c1/a82edae11d46c0d83481aacaa1e578fea21d94a1ef400afd734d47ad95ad/greenlet-3.2.2.tar.gz", hash = "sha256:ad053d34421a2debba45aa3cc39acf454acbcd025b3fc1a9f8a0dee237abd485", size = 185797 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a3/9f/a47e19261747b562ce88219e5ed8c859d42c6e01e73da6fbfa3f08a7be13/greenlet-3.2.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:dcb9cebbf3f62cb1e5afacae90761ccce0effb3adaa32339a0670fe7805d8068", size = 268635 }, + { url = "https://files.pythonhosted.org/packages/11/80/a0042b91b66975f82a914d515e81c1944a3023f2ce1ed7a9b22e10b46919/greenlet-3.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf3fc9145141250907730886b031681dfcc0de1c158f3cc51c092223c0f381ce", size = 628786 }, + { url = "https://files.pythonhosted.org/packages/38/a2/8336bf1e691013f72a6ebab55da04db81a11f68e82bb691f434909fa1327/greenlet-3.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:efcdfb9df109e8a3b475c016f60438fcd4be68cd13a365d42b35914cdab4bb2b", size = 640866 }, + { url = "https://files.pythonhosted.org/packages/f8/7e/f2a3a13e424670a5d08826dab7468fa5e403e0fbe0b5f951ff1bc4425b45/greenlet-3.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4bd139e4943547ce3a56ef4b8b1b9479f9e40bb47e72cc906f0f66b9d0d5cab3", size = 636752 }, + { url = "https://files.pythonhosted.org/packages/fd/5d/ce4a03a36d956dcc29b761283f084eb4a3863401c7cb505f113f73af8774/greenlet-3.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71566302219b17ca354eb274dfd29b8da3c268e41b646f330e324e3967546a74", size = 636028 }, + { url = "https://files.pythonhosted.org/packages/4b/29/b130946b57e3ceb039238413790dd3793c5e7b8e14a54968de1fe449a7cf/greenlet-3.2.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3091bc45e6b0c73f225374fefa1536cd91b1e987377b12ef5b19129b07d93ebe", size = 583869 }, + { url = "https://files.pythonhosted.org/packages/ac/30/9f538dfe7f87b90ecc75e589d20cbd71635531a617a336c386d775725a8b/greenlet-3.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:44671c29da26539a5f142257eaba5110f71887c24d40df3ac87f1117df589e0e", size = 1112886 }, + { url = "https://files.pythonhosted.org/packages/be/92/4b7deeb1a1e9c32c1b59fdca1cac3175731c23311ddca2ea28a8b6ada91c/greenlet-3.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c23ea227847c9dbe0b3910f5c0dd95658b607137614eb821e6cbaecd60d81cc6", size = 1138355 }, + { url = "https://files.pythonhosted.org/packages/c5/eb/7551c751a2ea6498907b2fcbe31d7a54b602ba5e8eb9550a9695ca25d25c/greenlet-3.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:0a16fb934fcabfdfacf21d79e6fed81809d8cd97bc1be9d9c89f0e4567143d7b", size = 295437 }, + { url = "https://files.pythonhosted.org/packages/2c/a1/88fdc6ce0df6ad361a30ed78d24c86ea32acb2b563f33e39e927b1da9ea0/greenlet-3.2.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:df4d1509efd4977e6a844ac96d8be0b9e5aa5d5c77aa27ca9f4d3f92d3fcf330", size = 270413 }, + { url = "https://files.pythonhosted.org/packages/a6/2e/6c1caffd65490c68cd9bcec8cb7feb8ac7b27d38ba1fea121fdc1f2331dc/greenlet-3.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da956d534a6d1b9841f95ad0f18ace637668f680b1339ca4dcfb2c1837880a0b", size = 637242 }, + { url = "https://files.pythonhosted.org/packages/98/28/088af2cedf8823b6b7ab029a5626302af4ca1037cf8b998bed3a8d3cb9e2/greenlet-3.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c7b15fb9b88d9ee07e076f5a683027bc3befd5bb5d25954bb633c385d8b737e", size = 651444 }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0116ab876bb0bc7a81eadc21c3f02cd6100dcd25a1cf2a085a130a63a26a/greenlet-3.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:752f0e79785e11180ebd2e726c8a88109ded3e2301d40abced2543aa5d164275", size = 646067 }, + { url = "https://files.pythonhosted.org/packages/35/17/bb8f9c9580e28a94a9575da847c257953d5eb6e39ca888239183320c1c28/greenlet-3.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ae572c996ae4b5e122331e12bbb971ea49c08cc7c232d1bd43150800a2d6c65", size = 648153 }, + { url = "https://files.pythonhosted.org/packages/2c/ee/7f31b6f7021b8df6f7203b53b9cc741b939a2591dcc6d899d8042fcf66f2/greenlet-3.2.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02f5972ff02c9cf615357c17ab713737cccfd0eaf69b951084a9fd43f39833d3", size = 603865 }, + { url = "https://files.pythonhosted.org/packages/b5/2d/759fa59323b521c6f223276a4fc3d3719475dc9ae4c44c2fe7fc750f8de0/greenlet-3.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4fefc7aa68b34b9224490dfda2e70ccf2131368493add64b4ef2d372955c207e", size = 1119575 }, + { url = "https://files.pythonhosted.org/packages/30/05/356813470060bce0e81c3df63ab8cd1967c1ff6f5189760c1a4734d405ba/greenlet-3.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a31ead8411a027c2c4759113cf2bd473690517494f3d6e4bf67064589afcd3c5", size = 1147460 }, + { url = "https://files.pythonhosted.org/packages/07/f4/b2a26a309a04fb844c7406a4501331b9400e1dd7dd64d3450472fd47d2e1/greenlet-3.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:b24c7844c0a0afc3ccbeb0b807adeefb7eff2b5599229ecedddcfeb0ef333bec", size = 296239 }, + { url = "https://files.pythonhosted.org/packages/89/30/97b49779fff8601af20972a62cc4af0c497c1504dfbb3e93be218e093f21/greenlet-3.2.2-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:3ab7194ee290302ca15449f601036007873028712e92ca15fc76597a0aeb4c59", size = 269150 }, + { url = "https://files.pythonhosted.org/packages/21/30/877245def4220f684bc2e01df1c2e782c164e84b32e07373992f14a2d107/greenlet-3.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc5c43bb65ec3669452af0ab10729e8fdc17f87a1f2ad7ec65d4aaaefabf6bf", size = 637381 }, + { url = "https://files.pythonhosted.org/packages/8e/16/adf937908e1f913856b5371c1d8bdaef5f58f251d714085abeea73ecc471/greenlet-3.2.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:decb0658ec19e5c1f519faa9a160c0fc85a41a7e6654b3ce1b44b939f8bf1325", size = 651427 }, + { url = "https://files.pythonhosted.org/packages/ad/49/6d79f58fa695b618654adac64e56aff2eeb13344dc28259af8f505662bb1/greenlet-3.2.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6fadd183186db360b61cb34e81117a096bff91c072929cd1b529eb20dd46e6c5", size = 645795 }, + { url = "https://files.pythonhosted.org/packages/5a/e6/28ed5cb929c6b2f001e96b1d0698c622976cd8f1e41fe7ebc047fa7c6dd4/greenlet-3.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1919cbdc1c53ef739c94cf2985056bcc0838c1f217b57647cbf4578576c63825", size = 648398 }, + { url = "https://files.pythonhosted.org/packages/9d/70/b200194e25ae86bc57077f695b6cc47ee3118becf54130c5514456cf8dac/greenlet-3.2.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3885f85b61798f4192d544aac7b25a04ece5fe2704670b4ab73c2d2c14ab740d", size = 606795 }, + { url = "https://files.pythonhosted.org/packages/f8/c8/ba1def67513a941154ed8f9477ae6e5a03f645be6b507d3930f72ed508d3/greenlet-3.2.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:85f3e248507125bf4af607a26fd6cb8578776197bd4b66e35229cdf5acf1dfbf", size = 1117976 }, + { url = "https://files.pythonhosted.org/packages/c3/30/d0e88c1cfcc1b3331d63c2b54a0a3a4a950ef202fb8b92e772ca714a9221/greenlet-3.2.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1e76106b6fc55fa3d6fe1c527f95ee65e324a13b62e243f77b48317346559708", size = 1145509 }, + { url = "https://files.pythonhosted.org/packages/90/2e/59d6491834b6e289051b252cf4776d16da51c7c6ca6a87ff97e3a50aa0cd/greenlet-3.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:fe46d4f8e94e637634d54477b0cfabcf93c53f29eedcbdeecaf2af32029b4421", size = 296023 }, + { url = "https://files.pythonhosted.org/packages/65/66/8a73aace5a5335a1cba56d0da71b7bd93e450f17d372c5b7c5fa547557e9/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba30e88607fb6990544d84caf3c706c4b48f629e18853fc6a646f82db9629418", size = 629911 }, + { url = "https://files.pythonhosted.org/packages/48/08/c8b8ebac4e0c95dcc68ec99198842e7db53eda4ab3fb0a4e785690883991/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:055916fafad3e3388d27dd68517478933a97edc2fc54ae79d3bec827de2c64c4", size = 635251 }, + { url = "https://files.pythonhosted.org/packages/37/26/7db30868f73e86b9125264d2959acabea132b444b88185ba5c462cb8e571/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2593283bf81ca37d27d110956b79e8723f9aa50c4bcdc29d3c0543d4743d2763", size = 632620 }, + { url = "https://files.pythonhosted.org/packages/10/ec/718a3bd56249e729016b0b69bee4adea0dfccf6ca43d147ef3b21edbca16/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89c69e9a10670eb7a66b8cef6354c24671ba241f46152dd3eed447f79c29fb5b", size = 628851 }, + { url = "https://files.pythonhosted.org/packages/9b/9d/d1c79286a76bc62ccdc1387291464af16a4204ea717f24e77b0acd623b99/greenlet-3.2.2-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02a98600899ca1ca5d3a2590974c9e3ec259503b2d6ba6527605fcd74e08e207", size = 593718 }, + { url = "https://files.pythonhosted.org/packages/cd/41/96ba2bf948f67b245784cd294b84e3d17933597dffd3acdb367a210d1949/greenlet-3.2.2-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b50a8c5c162469c3209e5ec92ee4f95c8231b11db6a04db09bbe338176723bb8", size = 1105752 }, + { url = "https://files.pythonhosted.org/packages/68/3b/3b97f9d33c1f2eb081759da62bd6162159db260f602f048bc2f36b4c453e/greenlet-3.2.2-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:45f9f4853fb4cc46783085261c9ec4706628f3b57de3e68bae03e8f8b3c0de51", size = 1125170 }, ] [[package]] name = "h11" -version = "0.14.0" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515 }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" 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 } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784 }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/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 } 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://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, ] [[package]] name = "identify" -version = "2.6.9" +version = "2.6.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9b/98/a71ab060daec766acc30fb47dfca219d03de34a70d616a79a38c6066c5bf/identify-2.6.9.tar.gz", hash = "sha256:d40dfe3142a1421d8518e3d3985ef5ac42890683e32306ad614a29490abeb6bf", size = 99249 } +sdist = { url = "https://files.pythonhosted.org/packages/a2/88/d193a27416618628a5eea64e3223acd800b40749a96ffb322a9b55a49ed1/identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6", size = 99254 } wheels = [ - { url = "https://files.pythonhosted.org/packages/07/ce/0845144ed1f0e25db5e7a79c2354c1da4b5ce392b8966449d5db8dca18f1/identify-2.6.9-py2.py3-none-any.whl", hash = "sha256:c98b4322da415a8e5a70ff6e51fbc2d2932c015532d77e9f8537b4ba7813b150", size = 99101 }, + { url = "https://files.pythonhosted.org/packages/7a/cd/18f8da995b658420625f7ef13f037be53ae04ec5ad33f9b718240dcfd48c/identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2", size = 99145 }, ] [[package]] @@ -1177,14 +1240,14 @@ wheels = [ [[package]] name = "importlib-metadata" -version = "8.6.1" +version = "8.7.0" source = { registry = "https://pypi.org/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://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641 } 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://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656 }, ] [[package]] @@ -1298,16 +1361,16 @@ wheels = [ [[package]] name = "joblib" -version = "1.4.2" +version = "1.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/64/33/60135848598c076ce4b231e1b1895170f45fbcaeaa2c9d5e38b04db70c35/joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e", size = 2116621 } +sdist = { url = "https://files.pythonhosted.org/packages/dc/fe/0f5a938c54105553436dbff7a61dc4fed4b1b2c98852f8833beaf4d5968f/joblib-1.5.1.tar.gz", hash = "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444", size = 330475 } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/29/df4b9b42f2be0b623cbd5e2140cafcaa2bef0759a00b7b70104dcfe2fb51/joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6", size = 301817 }, + { url = "https://files.pythonhosted.org/packages/7d/4f/1195bbac8e0c2acc5f740661631d8d750dc38d4a32b23ee5df3cde6f4e0d/joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a", size = 307746 }, ] [[package]] name = "jsonschema" -version = "4.23.0" +version = "4.24.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, @@ -1315,9 +1378,9 @@ dependencies = [ { name = "referencing" }, { name = "rpds-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/2e/03362ee4034a4c917f697890ccd4aec0800ccf9ded7f511971c75451deec/jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4", size = 325778 } +sdist = { url = "https://files.pythonhosted.org/packages/bf/d3/1cf5326b923a53515d8f3a2cd442e6d7e94fcc444716e879ea70a0ce3177/jsonschema-4.24.0.tar.gz", hash = "sha256:0b4e8069eb12aedfa881333004bccaec24ecef5a8a6a4b6df142b2cc9599d196", size = 353480 } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/4a/4f9dbeb84e8850557c02365a0eee0649abe5eb1d84af92a25731c6c0f922/jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566", size = 88462 }, + { url = "https://files.pythonhosted.org/packages/a2/3d/023389198f69c722d039351050738d6755376c8fd343e91dc493ea485905/jsonschema-4.24.0-py3-none-any.whl", hash = "sha256:a462455f19f5faf404a7902952b6f0e3ce868f3ee09a359b05eca6673bd8412d", size = 88709 }, ] [[package]] @@ -1369,16 +1432,16 @@ wheels = [ [[package]] name = "jupyter-core" -version = "5.7.2" +version = "5.8.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "platformdirs" }, { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/00/11/b56381fa6c3f4cc5d2cf54a7dbf98ad9aa0b339ef7a601d6053538b079a7/jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9", size = 87629 } +sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/fb/108ecd1fe961941959ad0ee4e12ee7b8b1477247f30b1fdfd83ceaf017f0/jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", size = 28965 }, + { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880 }, ] [[package]] @@ -1487,14 +1550,11 @@ wheels = [ [[package]] name = "marshmallow" -version = "3.26.1" +version = "4.0.0" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ab/5e/5e53d26b42ab75491cda89b871dab9e97c840bf12c63ec58a1919710cd06/marshmallow-3.26.1.tar.gz", hash = "sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6", size = 221825 } +sdist = { url = "https://files.pythonhosted.org/packages/1e/ff/26df5a9f5ac57ccf693a5854916ab47243039d2aa9e0fe5f5a0331e7b74b/marshmallow-4.0.0.tar.gz", hash = "sha256:3b6e80aac299a7935cfb97ed01d1854fb90b5079430969af92118ea1b12a8d55", size = 220507 } wheels = [ - { url = "https://files.pythonhosted.org/packages/34/75/51952c7b2d3873b44a0028b1bd26a25078c18f92f256608e8d1dc61b39fd/marshmallow-3.26.1-py3-none-any.whl", hash = "sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c", size = 50878 }, + { url = "https://files.pythonhosted.org/packages/d6/26/6cc45d156f44dbe1d5696d9e54042e4dcaf7b946c0b86df6a97d29706f32/marshmallow-4.0.0-py3-none-any.whl", hash = "sha256:e7b0528337e9990fd64950f8a6b3a1baabed09ad17a0dfb844d701151f92d203", size = 48420 }, ] [[package]] @@ -1532,16 +1592,16 @@ wheels = [ [[package]] name = "msal" -version = "1.32.0" +version = "1.32.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "pyjwt", extra = ["crypto"] }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/aa/5f/ef42ef25fba682e83a8ee326a1a788e60c25affb58d014495349e37bce50/msal-1.32.0.tar.gz", hash = "sha256:5445fe3af1da6be484991a7ab32eaa82461dc2347de105b76af92c610c3335c2", size = 149817 } +sdist = { url = "https://files.pythonhosted.org/packages/3f/90/81dcc50f0be11a8c4dcbae1a9f761a26e5f905231330a7cacc9f04ec4c61/msal-1.32.3.tar.gz", hash = "sha256:5eea038689c78a5a70ca8ecbe1245458b55a857bd096efb6989c69ba15985d35", size = 151449 } wheels = [ - { url = "https://files.pythonhosted.org/packages/93/5a/2e663ef56a5d89eba962941b267ebe5be8c5ea340a9929d286e2f5fac505/msal-1.32.0-py3-none-any.whl", hash = "sha256:9dbac5384a10bbbf4dae5c7ea0d707d14e087b92c5aa4954b3feaa2d1aa0bcb7", size = 114655 }, + { url = "https://files.pythonhosted.org/packages/04/bf/81516b9aac7fd867709984d08eb4db1d2e3fe1df795c8e442cde9b568962/msal-1.32.3-py3-none-any.whl", hash = "sha256:b2798db57760b1961b142f027ffb7c8169536bf77316e99a0df5c4aaebb11569", size = 115358 }, ] [[package]] @@ -1599,71 +1659,79 @@ wheels = [ [[package]] name = "multidict" -version = "6.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/99/68/42bf1fb4272959aa7c0775caf53265c1a0da9d77f2d4e76326296c943811/multidict-6.3.0.tar.gz", hash = "sha256:2cf3e0781febf9f093eff3eca2d6dd7954ef2969ff46f6cd95173a4db8397fd8", size = 85840 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/72/82817e4ef98e180d4042b8311c0842567d75432f5536227994de7858cc4a/multidict-6.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:904895323a59dd50387cddd1337c3eac48ec0fe6cb4d2e4106dc1a3b80091727", size = 61822 }, - { url = "https://files.pythonhosted.org/packages/75/4f/89325dc60759f503bf90a885a356364bacb809b36af8b2268104e0e36e77/multidict-6.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1aa6e1a605c602c119a22368f7d3b9dfb102a7cd69edae5a89e55da34fd64c2b", size = 36629 }, - { url = "https://files.pythonhosted.org/packages/dc/bd/c7e5c7e195fa779e340033ceb09d13a7c99de1b13122e67cc84b8fea15d0/multidict-6.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72574693fad34d075a54fa771984a1a8809a9eff880b731152078e81c7d8c80f", size = 35881 }, - { url = "https://files.pythonhosted.org/packages/d6/b4/1097e84f2b5b27c50923c37a171f66a9a5931507af2aa0bf3f1b5ff379b9/multidict-6.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72d15a61b76fa4b814390c21defd772893d1152157e3297e6afb328ef32d1711", size = 241302 }, - { url = "https://files.pythonhosted.org/packages/f7/90/256968c41ae8c888b0c29ef20e73572ed39650c600b638508ff61917b1f5/multidict-6.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bf0d43f2c56b600c6895c25a420e4b46c6a5acf91d6c9a6300713496f70e63b", size = 254140 }, - { url = "https://files.pythonhosted.org/packages/0c/3d/0c4ee2ac266da5c63919208c90616f550146c9afcca82efb4a54e0c3ebb2/multidict-6.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6be1182387fb9a95fd8a8cbfab2f2b61d61ea0ab4699780d4300ea207c8f8d71", size = 249501 }, - { url = "https://files.pythonhosted.org/packages/3f/1e/1299a62d01b867c33f7426399d0f7d2c940a4777d1b4ce50bd115bf5d152/multidict-6.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ba7d12ff77cadb59519aba674cac3a0b16d0fc5abaa3ef79b5ff3806e52e991", size = 235545 }, - { url = "https://files.pythonhosted.org/packages/e0/ab/6f7d70da577d93a9c7e8fecf9719e86865b8dc70c7e83281ad65131a8020/multidict-6.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eeca775446b00826ec8ca34eed8c902c6a1ae7dc42d78094b1f73ecd38d1dcf8", size = 227731 }, - { url = "https://files.pythonhosted.org/packages/02/e3/3373b230cd63c60aaeea076e82f7728a6bccf61daf91bbb6f26353686dae/multidict-6.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a1a5f50ccc57a317db68582411ce6aca076ee3bc386290b416a5783e807afa1", size = 237998 }, - { url = "https://files.pythonhosted.org/packages/a0/5c/8ec19376bbb51b570f931be9c828f498ab1779ab18a598412226d2ce4da4/multidict-6.3.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6989ea9326f9a9171edc920a459003b1deffc6cb48605b8f2610846c7fbd201a", size = 233334 }, - { url = "https://files.pythonhosted.org/packages/11/22/ed4a2ed109a3c6eb8e72256cae382cad9bf53a6748e3b18b44671b1e03de/multidict-6.3.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9efe23b3d0671eeb8b1e70791612538dcdc1b39275563ca78f338aa0ce9619d2", size = 245813 }, - { url = "https://files.pythonhosted.org/packages/a5/d7/00b08fe59647e7cec9c0cb3ba8c6fc6d3688f31cf648aa768541b3c59a7c/multidict-6.3.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:560af476d03256a65bd4ff05c83e7869ec3c2b40579d4ed1ac74075ef19e02bf", size = 238766 }, - { url = "https://files.pythonhosted.org/packages/5c/99/2627bb3eb6ac215c263a62b8259fac55dc70cf4fc1b96260b43c7324ba03/multidict-6.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:091f3dfe63e9f48ae6c7da8d638e8d8e050ff11e348f69bafc20e65d11f7aa48", size = 234087 }, - { url = "https://files.pythonhosted.org/packages/da/b2/efedb9854d206d038d578529d3429f13b35d263462cc4d81c73eb741b392/multidict-6.3.0-cp311-cp311-win32.whl", hash = "sha256:38e60e400e07ba678a755cc89b09955a49acb0188d47aee2829ed4efc1ccb053", size = 34417 }, - { url = "https://files.pythonhosted.org/packages/d6/53/5a87558f5cdd37574d7ee72a61e7bfb41d3cc4acaa816f612141a72dbd74/multidict-6.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:65e763769cec2fa9c79b70555e3f2a7903747d127ab14ec9eaa5f00763bb4152", size = 37820 }, - { url = "https://files.pythonhosted.org/packages/82/60/6905d85104d39092a9f6b21123f1d2df85d30b22dbd01e795b47c9b6eb32/multidict-6.3.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2a83896925e3a2ddec736c48255572e6f15a95339024c02b800dab28e63461a3", size = 61868 }, - { url = "https://files.pythonhosted.org/packages/e6/db/9223dcc59aa26f48e3915e0ce9c31a989a8225e3c794e0d6390772de6f9c/multidict-6.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74e45386528db2d9346618276e8746507ec6ccb91512c5f02d2049ccafb0576e", size = 36835 }, - { url = "https://files.pythonhosted.org/packages/21/1b/f7080011d022bfc68c2b29c329012f2b3d19c446e77a0dc34e0cdfaed768/multidict-6.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc15e81587b652bbeba9d4d7d3707bcaaa1d7b4aab2024c14be477662003a211", size = 35737 }, - { url = "https://files.pythonhosted.org/packages/91/59/33391241661176e1691add307a72757faecf5ae035e16b93c527f52a1d51/multidict-6.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a716344c6e92551bdf842b999c7d7b34a13e32facf3e6c5942690c9883d45e3a", size = 245422 }, - { url = "https://files.pythonhosted.org/packages/44/4a/e4f70e767067c9fd31e45d625490c128da4d63689ad99342e5e87599e5a9/multidict-6.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:299070f503a9a99e4af38d07da784ced28377cc62b678084b9e2e48fa51c57d3", size = 255425 }, - { url = "https://files.pythonhosted.org/packages/2f/18/6c37d3e336e270cbe1deecf2b5669edde93dfabb15796c3e19362f06da0e/multidict-6.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e87a8635a7db577617b50bd2f2080744ed20e556750b97e4f9988e6d20d3941", size = 251939 }, - { url = "https://files.pythonhosted.org/packages/3b/47/76f9e21ad746262b70bc5992e69c840aec8f1501d3a974cc46678f334cf5/multidict-6.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ab4ea5f49166b990411c522c1f5f901014932ead15a463616ec93e10fff2c05", size = 246197 }, - { url = "https://files.pythonhosted.org/packages/88/4f/52b26ef6fef9b7dcc9083c5c9e3e621f300a06c7bb9a67aa0a167618ddc0/multidict-6.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2cef02d3878804909283549bc10d4789a14c610fcd286f17cd94a195b21fe469", size = 231438 }, - { url = "https://files.pythonhosted.org/packages/09/dc/425c013d902ccad1b666bd06bfd7e2124a7be473e812ab812318858e5194/multidict-6.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a466c14574152b7caed5d76f1e46ae2963d33f5b0eb2dd915fa33870183b0f26", size = 249942 }, - { url = "https://files.pythonhosted.org/packages/18/cb/277fe0a3d83e094716ee436d39a6707496d77c255fd235b0aed1e71deddc/multidict-6.3.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:883c07b404229e98d30b1ef64f07d4e3422d431ecd727c2ebba8549f70b2ba16", size = 243881 }, - { url = "https://files.pythonhosted.org/packages/28/eb/3087bc61a29d62c9637699ed4f6dfc98759bc8e54a899477b1a309a17afb/multidict-6.3.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:767ed12b1662fac32d84eb43707e4f778b12554fc12ce3c8f7793a02111a9e32", size = 256525 }, - { url = "https://files.pythonhosted.org/packages/10/a7/25f50ca151999ec32f1ade23be06cffe088e7ffe3fe826e05c1dbd84db6d/multidict-6.3.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ef116022119d3053ecce8ba62109c8b54a650a537b183e79de1db4078894a8", size = 252166 }, - { url = "https://files.pythonhosted.org/packages/c6/4d/ac24c83fa6fe19b05b03fb7a3ca283eed5f74c26d238a41411fcd90a0c3a/multidict-6.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ad737617d38c55c0b72cd3ea01bf5cbab0d75123de5e52c39643ddc6465cb5f", size = 248461 }, - { url = "https://files.pythonhosted.org/packages/55/a9/cc2ec0dbdcb252ca461711363089d14a6ae80f97d8f0dcaffa025d1d5d4c/multidict-6.3.0-cp312-cp312-win32.whl", hash = "sha256:3d783be54d076843f58bf061fdaf1071789fb924fb35a0eb84dbc2c8b68499a2", size = 34640 }, - { url = "https://files.pythonhosted.org/packages/9a/20/ad6bf2fd522c0ab35a942e35c8b21bc8197fad6890f66d725eebf03a8770/multidict-6.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:6fbe184451480c17f1f8dac160c9f3f6d243010fdb8416de4d3d7ee69ea65aa4", size = 37969 }, - { url = "https://files.pythonhosted.org/packages/9b/de/988a79bc03f03a191458d938236fb06fa7ba2e03e1fec6ce53c86ababd8a/multidict-6.3.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90c3c60985e7da13e44aeaaf2e1c10fe1b7825788a18c82b0f9eaeb6c4e9d9c6", size = 61608 }, - { url = "https://files.pythonhosted.org/packages/b8/30/a8e15a3ac94fba52c8a6eb85dc8552b39e60112002317f7542c890dbff15/multidict-6.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:80935f26af0eec490c4e52381a28f39b08c2bc4ef4562448890027e4a4cfa3a4", size = 36724 }, - { url = "https://files.pythonhosted.org/packages/06/49/88d4971e61d98b208c98eec56ae13af6fb128d73fee18e9bb568a7a0415a/multidict-6.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e18db3b38ac30d8cc1ddbdfc7f6d3d814c1abb8936c57bd1c09c5da02873c8c4", size = 35611 }, - { url = "https://files.pythonhosted.org/packages/e6/1b/08ba37f64d4eacfceec12cc11aecd0a6482cca2c57a94dafef41ed66dd0a/multidict-6.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c8836280abc310ea6260dac93126645d21284885008c317c2ac4281a90f1398", size = 245274 }, - { url = "https://files.pythonhosted.org/packages/bb/d9/f5c5a381cffef4bf500e710ca73d6ef00a2de9647abf7bcd0a9f032dd408/multidict-6.3.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5737f40ffb1926b8bf38d32fdac48a27c441b757f1bf44cbaa100dafef049a01", size = 256891 }, - { url = "https://files.pythonhosted.org/packages/17/23/553528d531fd8d93834365d8e6b7c0bda25c787a8b5ae738099266f34bd7/multidict-6.3.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6df1b707adab4858dfaa74877f60f07d9d6be01a57015cf4e62aa8f00f3576b", size = 253116 }, - { url = "https://files.pythonhosted.org/packages/07/d0/79229446cb1507ff5f83ae372a4648e703fda7a4f7729332da0858d47e4e/multidict-6.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:162af9c2e0743465a47e2b32d9b0a7c260b7843629b5e6f0a8a92819b5a40d27", size = 245941 }, - { url = "https://files.pythonhosted.org/packages/d4/c9/91b09bda811e212816776967a3232f8776aa846af4c44e0e9139cf73fc60/multidict-6.3.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc4e82c5db4e65703c842b0947699dd958a7262a8b854d1c19bbfe2d27be9333", size = 232343 }, - { url = "https://files.pythonhosted.org/packages/c4/94/2941f8605a3ff8aaaef31c1c8adfd7c889d78763efc4e7f963fbca96a6c4/multidict-6.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5a922601cb94f427dd96eec3a7c776537ce7490f2beb69e88a81859e537343e4", size = 249610 }, - { url = "https://files.pythonhosted.org/packages/e3/8b/04a18732ab7d29db3d6009d8cab1a737c3262cd06ba1764756edb66d9a96/multidict-6.3.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3da30fb560b37cede31306b890c982213a23fa7335d368cdc16cf7034170860b", size = 244832 }, - { url = "https://files.pythonhosted.org/packages/67/27/4fafdc178bb7c5a870ca449e922a0e069b77fda1ba4e1729fde385ca6314/multidict-6.3.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5a1996d963016e6486b6a672f64f868e6b4e7e9e2caf710994df11b04790903e", size = 256546 }, - { url = "https://files.pythonhosted.org/packages/a6/09/f2c0d6974d1b3ac922834eb159d39f4a7f61b4560373821e5028623645a1/multidict-6.3.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9584441b7a603a12aa382adf8c093ddc5a22328a108dabc6a4a112fa5b4facae", size = 252193 }, - { url = "https://files.pythonhosted.org/packages/e1/6b/7b2ec53aea30c3729ac6bd92bcc620584b08e1333621e0fe48dc5dc36fdb/multidict-6.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:71a8ce430f6c341725aefc0031626c484e0858fd95d1bf3625e0d27919d8edca", size = 247797 }, - { url = "https://files.pythonhosted.org/packages/fa/07/086ac59a24e05ba5748abc57298a27705bab824f47842494dfa4b50bff15/multidict-6.3.0-cp313-cp313-win32.whl", hash = "sha256:b7d3053742a9a559dda8598a52e0c1bcbd18258cc199cba52137ce8c8e92c537", size = 34662 }, - { url = "https://files.pythonhosted.org/packages/cf/a3/5e0b74e8c1507623b7564fa8bfd07e626d45fc05fbb03f6248902c00c749/multidict-6.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:6b7e30e4246c2cd5e6c2c907486d235e4f3e8a39979744e9e0b8090629c62da4", size = 37826 }, - { url = "https://files.pythonhosted.org/packages/33/0c/e92a3398e80339e356e7aa8b2566d075ed876f5c12e9ad08704c49301a1d/multidict-6.3.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:be034aa2841c57ea43a55bc123d8f3f41cc2d3d102a22390c863791ba6bf23f1", size = 66383 }, - { url = "https://files.pythonhosted.org/packages/02/23/21ea785c2bbd36ad832e4365ac518bc7c14c72cc8be117fccb853ac3ee1f/multidict-6.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:168a02178b7e980899f3475ff008436eaab035d50e39cb8f7de641bbe9bbc3a6", size = 38709 }, - { url = "https://files.pythonhosted.org/packages/42/7b/52f65ed679b25e16a453bbacc06892622710ad3fc31cfa5c61f862af99fd/multidict-6.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0c4a6ec469c30f4162745d6485b778432c497032b8a2cb3a0332eea9d3b6aef6", size = 38314 }, - { url = "https://files.pythonhosted.org/packages/2e/5b/923e8b22268e53be4f11d0abe3f7b091e5ee7d213e7ca837f215cbc22bdb/multidict-6.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b293804f4b53be6297bc2afdeaf15aff76c1b6be69f3a3da785143eebdfb656", size = 244220 }, - { url = "https://files.pythonhosted.org/packages/1f/9c/d0c515f234f2958771c7463f6a03383d36e4074f1eb00459ec3c7190e8dd/multidict-6.3.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5eb2a8415a891564054447a327a7ef7ec90e69e0e63d85d1ffb03f82e102c740", size = 243508 }, - { url = "https://files.pythonhosted.org/packages/64/41/9a1a3308b4b99302a4502758baba6bb79c853332f26ef5a90968737d4563/multidict-6.3.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db61c6ae9ee7268dc69a078ea22deaaf861350ad2e4c194c70798b8ec9789131", size = 238985 }, - { url = "https://files.pythonhosted.org/packages/40/68/fba5926f53ff3e7b19799399bd82e27cb3df5d569839d07b6b42827194f1/multidict-6.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88548dec2f6f69e547252fe3113bf1b3b08c0879f5b44633927be07ed18c5cc0", size = 238675 }, - { url = "https://files.pythonhosted.org/packages/f2/c6/3a5160331b9842905a3e8ae81527068318c9f6ebddfe7ed07853b97ba216/multidict-6.3.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:864684b36e0488715aac531785abe7514e872bfe83ecc768828e9ddaadeed320", size = 225747 }, - { url = "https://files.pythonhosted.org/packages/ed/0d/cc98fde65ee79beb0632c8d2f7a9e639e5175885d7c7ac2400f56bc78f73/multidict-6.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:71d92e846541669ae1d11e00906c408c1dc9890196e13f11d4d62bd235ac9ddb", size = 240611 }, - { url = "https://files.pythonhosted.org/packages/f6/73/580793855a587663b2e26aa9fa2fba3d16dbce26aff4cb92d48ae4814ff0/multidict-6.3.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:c5223ab45639ce93c7233d518f6c3199422b49dbd0ebfb1d7917b5da2636712e", size = 227815 }, - { url = "https://files.pythonhosted.org/packages/90/a6/ba293045efd338e4131726d7226c9d0870568486a6d025ec20dbf79f3972/multidict-6.3.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:56225de73d69f5ee6b783648eb1936e1bbe874a529cb1e15d64038904c54efb2", size = 239895 }, - { url = "https://files.pythonhosted.org/packages/4b/4a/ecda417af238696daafe921fbbdc96fa7e829656206442a785174377c61d/multidict-6.3.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:66c108d8e02da2febb0aa7d7002e14c4a0571460993c9edf8249393cdae7eeef", size = 233297 }, - { url = "https://files.pythonhosted.org/packages/73/90/8cea643f4e9b7f9c73b72032aa38f765e96db07636ea4b00f0420d9f6a5f/multidict-6.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b95d96a0640decaa24cd9cf386fd4d8a96c973aafa42dd9c65609f9f0d66cc34", size = 232030 }, - { url = "https://files.pythonhosted.org/packages/1b/37/8d42820299fbfbc774ed8247a75b16dfe2f09c4e0d1ae62ac751b6c25397/multidict-6.3.0-cp313-cp313t-win32.whl", hash = "sha256:6b25953a1d6a97746becbd663b49e3b436a5001c995a62662d65835a2ba996a7", size = 41166 }, - { url = "https://files.pythonhosted.org/packages/74/63/44bb663fdd4da768d55fb0406daa50e2ea1904da014a0972068e6a7e44d1/multidict-6.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d9c2b1ca98e5454b78cd434f29fc33eb8f8a2f343efc5f975225d92070b9f7f6", size = 44929 }, - { url = "https://files.pythonhosted.org/packages/65/66/730bb6dbfbf87df8a341707ebd468044ea6c530605d41b3f31b494f03d6a/multidict-6.3.0-py3-none-any.whl", hash = "sha256:9ca652d9c6f68535537d75502b549ed0ca07fa6d3908f84f29f92148ec7310f2", size = 10266 }, +version = "6.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/91/2f/a3470242707058fe856fe59241eee5635d79087100b7042a867368863a27/multidict-6.4.4.tar.gz", hash = "sha256:69ee9e6ba214b5245031b76233dd95408a0fd57fdb019ddcc1ead4790932a8e8", size = 90183 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/1b/4c6e638195851524a63972c5773c7737bea7e47b1ba402186a37773acee2/multidict-6.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4f5f29794ac0e73d2a06ac03fd18870adc0135a9d384f4a306a951188ed02f95", size = 65515 }, + { url = "https://files.pythonhosted.org/packages/25/d5/10e6bca9a44b8af3c7f920743e5fc0c2bcf8c11bf7a295d4cfe00b08fb46/multidict-6.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c04157266344158ebd57b7120d9b0b35812285d26d0e78193e17ef57bfe2979a", size = 38609 }, + { url = "https://files.pythonhosted.org/packages/26/b4/91fead447ccff56247edc7f0535fbf140733ae25187a33621771ee598a18/multidict-6.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bb61ffd3ab8310d93427e460f565322c44ef12769f51f77277b4abad7b6f7223", size = 37871 }, + { url = "https://files.pythonhosted.org/packages/3b/37/cbc977cae59277e99d15bbda84cc53b5e0c4929ffd91d958347200a42ad0/multidict-6.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e0ba18a9afd495f17c351d08ebbc4284e9c9f7971d715f196b79636a4d0de44", size = 226661 }, + { url = "https://files.pythonhosted.org/packages/15/cd/7e0b57fbd4dc2fc105169c4ecce5be1a63970f23bb4ec8c721b67e11953d/multidict-6.4.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9faf1b1dcaadf9f900d23a0e6d6c8eadd6a95795a0e57fcca73acce0eb912065", size = 223422 }, + { url = "https://files.pythonhosted.org/packages/f1/01/1de268da121bac9f93242e30cd3286f6a819e5f0b8896511162d6ed4bf8d/multidict-6.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a4d1cb1327c6082c4fce4e2a438483390964c02213bc6b8d782cf782c9b1471f", size = 235447 }, + { url = "https://files.pythonhosted.org/packages/d2/8c/8b9a5e4aaaf4f2de14e86181a3a3d7b105077f668b6a06f043ec794f684c/multidict-6.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:941f1bec2f5dbd51feeb40aea654c2747f811ab01bdd3422a48a4e4576b7d76a", size = 231455 }, + { url = "https://files.pythonhosted.org/packages/35/db/e1817dcbaa10b319c412769cf999b1016890849245d38905b73e9c286862/multidict-6.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5f8a146184da7ea12910a4cec51ef85e44f6268467fb489c3caf0cd512f29c2", size = 223666 }, + { url = "https://files.pythonhosted.org/packages/4a/e1/66e8579290ade8a00e0126b3d9a93029033ffd84f0e697d457ed1814d0fc/multidict-6.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:232b7237e57ec3c09be97206bfb83a0aa1c5d7d377faa019c68a210fa35831f1", size = 217392 }, + { url = "https://files.pythonhosted.org/packages/7b/6f/f8639326069c24a48c7747c2a5485d37847e142a3f741ff3340c88060a9a/multidict-6.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:55ae0721c1513e5e3210bca4fc98456b980b0c2c016679d3d723119b6b202c42", size = 228969 }, + { url = "https://files.pythonhosted.org/packages/d2/c3/3d58182f76b960eeade51c89fcdce450f93379340457a328e132e2f8f9ed/multidict-6.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:51d662c072579f63137919d7bb8fc250655ce79f00c82ecf11cab678f335062e", size = 217433 }, + { url = "https://files.pythonhosted.org/packages/e1/4b/f31a562906f3bd375f3d0e83ce314e4a660c01b16c2923e8229b53fba5d7/multidict-6.4.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0e05c39962baa0bb19a6b210e9b1422c35c093b651d64246b6c2e1a7e242d9fd", size = 225418 }, + { url = "https://files.pythonhosted.org/packages/99/89/78bb95c89c496d64b5798434a3deee21996114d4d2c28dd65850bf3a691e/multidict-6.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5b1cc3ab8c31d9ebf0faa6e3540fb91257590da330ffe6d2393d4208e638925", size = 235042 }, + { url = "https://files.pythonhosted.org/packages/74/91/8780a6e5885a8770442a8f80db86a0887c4becca0e5a2282ba2cae702bc4/multidict-6.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:93ec84488a384cd7b8a29c2c7f467137d8a73f6fe38bb810ecf29d1ade011a7c", size = 230280 }, + { url = "https://files.pythonhosted.org/packages/68/c1/fcf69cabd542eb6f4b892469e033567ee6991d361d77abdc55e3a0f48349/multidict-6.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b308402608493638763abc95f9dc0030bbd6ac6aff784512e8ac3da73a88af08", size = 223322 }, + { url = "https://files.pythonhosted.org/packages/b8/85/5b80bf4b83d8141bd763e1d99142a9cdfd0db83f0739b4797172a4508014/multidict-6.4.4-cp311-cp311-win32.whl", hash = "sha256:343892a27d1a04d6ae455ecece12904d242d299ada01633d94c4f431d68a8c49", size = 35070 }, + { url = "https://files.pythonhosted.org/packages/09/66/0bed198ffd590ab86e001f7fa46b740d58cf8ff98c2f254e4a36bf8861ad/multidict-6.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:73484a94f55359780c0f458bbd3c39cb9cf9c182552177d2136e828269dee529", size = 38667 }, + { url = "https://files.pythonhosted.org/packages/d2/b5/5675377da23d60875fe7dae6be841787755878e315e2f517235f22f59e18/multidict-6.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:dc388f75a1c00000824bf28b7633e40854f4127ede80512b44c3cfeeea1839a2", size = 64293 }, + { url = "https://files.pythonhosted.org/packages/34/a7/be384a482754bb8c95d2bbe91717bf7ccce6dc38c18569997a11f95aa554/multidict-6.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:98af87593a666f739d9dba5d0ae86e01b0e1a9cfcd2e30d2d361fbbbd1a9162d", size = 38096 }, + { url = "https://files.pythonhosted.org/packages/66/6d/d59854bb4352306145bdfd1704d210731c1bb2c890bfee31fb7bbc1c4c7f/multidict-6.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aff4cafea2d120327d55eadd6b7f1136a8e5a0ecf6fb3b6863e8aca32cd8e50a", size = 37214 }, + { url = "https://files.pythonhosted.org/packages/99/e0/c29d9d462d7cfc5fc8f9bf24f9c6843b40e953c0b55e04eba2ad2cf54fba/multidict-6.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:169c4ba7858176b797fe551d6e99040c531c775d2d57b31bcf4de6d7a669847f", size = 224686 }, + { url = "https://files.pythonhosted.org/packages/dc/4a/da99398d7fd8210d9de068f9a1b5f96dfaf67d51e3f2521f17cba4ee1012/multidict-6.4.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b9eb4c59c54421a32b3273d4239865cb14ead53a606db066d7130ac80cc8ec93", size = 231061 }, + { url = "https://files.pythonhosted.org/packages/21/f5/ac11add39a0f447ac89353e6ca46666847051103649831c08a2800a14455/multidict-6.4.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7cf3bd54c56aa16fdb40028d545eaa8d051402b61533c21e84046e05513d5780", size = 232412 }, + { url = "https://files.pythonhosted.org/packages/d9/11/4b551e2110cded705a3c13a1d4b6a11f73891eb5a1c449f1b2b6259e58a6/multidict-6.4.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f682c42003c7264134bfe886376299db4cc0c6cd06a3295b41b347044bcb5482", size = 231563 }, + { url = "https://files.pythonhosted.org/packages/4c/02/751530c19e78fe73b24c3da66618eda0aa0d7f6e7aa512e46483de6be210/multidict-6.4.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920f9cf2abdf6e493c519492d892c362007f113c94da4c239ae88429835bad1", size = 223811 }, + { url = "https://files.pythonhosted.org/packages/c7/cb/2be8a214643056289e51ca356026c7b2ce7225373e7a1f8c8715efee8988/multidict-6.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:530d86827a2df6504526106b4c104ba19044594f8722d3e87714e847c74a0275", size = 216524 }, + { url = "https://files.pythonhosted.org/packages/19/f3/6d5011ec375c09081f5250af58de85f172bfcaafebff286d8089243c4bd4/multidict-6.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ecde56ea2439b96ed8a8d826b50c57364612ddac0438c39e473fafad7ae1c23b", size = 229012 }, + { url = "https://files.pythonhosted.org/packages/67/9c/ca510785df5cf0eaf5b2a8132d7d04c1ce058dcf2c16233e596ce37a7f8e/multidict-6.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:dc8c9736d8574b560634775ac0def6bdc1661fc63fa27ffdfc7264c565bcb4f2", size = 226765 }, + { url = "https://files.pythonhosted.org/packages/36/c8/ca86019994e92a0f11e642bda31265854e6ea7b235642f0477e8c2e25c1f/multidict-6.4.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7f3d3b3c34867579ea47cbd6c1f2ce23fbfd20a273b6f9e3177e256584f1eacc", size = 222888 }, + { url = "https://files.pythonhosted.org/packages/c6/67/bc25a8e8bd522935379066950ec4e2277f9b236162a73548a2576d4b9587/multidict-6.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:87a728af265e08f96b6318ebe3c0f68b9335131f461efab2fc64cc84a44aa6ed", size = 234041 }, + { url = "https://files.pythonhosted.org/packages/f1/a0/70c4c2d12857fccbe607b334b7ee28b6b5326c322ca8f73ee54e70d76484/multidict-6.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9f193eeda1857f8e8d3079a4abd258f42ef4a4bc87388452ed1e1c4d2b0c8740", size = 231046 }, + { url = "https://files.pythonhosted.org/packages/c1/0f/52954601d02d39742aab01d6b92f53c1dd38b2392248154c50797b4df7f1/multidict-6.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be06e73c06415199200e9a2324a11252a3d62030319919cde5e6950ffeccf72e", size = 227106 }, + { url = "https://files.pythonhosted.org/packages/af/24/679d83ec4379402d28721790dce818e5d6b9f94ce1323a556fb17fa9996c/multidict-6.4.4-cp312-cp312-win32.whl", hash = "sha256:622f26ea6a7e19b7c48dd9228071f571b2fbbd57a8cd71c061e848f281550e6b", size = 35351 }, + { url = "https://files.pythonhosted.org/packages/52/ef/40d98bc5f986f61565f9b345f102409534e29da86a6454eb6b7c00225a13/multidict-6.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:5e2bcda30d5009996ff439e02a9f2b5c3d64a20151d34898c000a6281faa3781", size = 38791 }, + { url = "https://files.pythonhosted.org/packages/df/2a/e166d2ffbf4b10131b2d5b0e458f7cee7d986661caceae0de8753042d4b2/multidict-6.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:82ffabefc8d84c2742ad19c37f02cde5ec2a1ee172d19944d380f920a340e4b9", size = 64123 }, + { url = "https://files.pythonhosted.org/packages/8c/96/e200e379ae5b6f95cbae472e0199ea98913f03d8c9a709f42612a432932c/multidict-6.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6a2f58a66fe2c22615ad26156354005391e26a2f3721c3621504cd87c1ea87bf", size = 38049 }, + { url = "https://files.pythonhosted.org/packages/75/fb/47afd17b83f6a8c7fa863c6d23ac5ba6a0e6145ed8a6bcc8da20b2b2c1d2/multidict-6.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5883d6ee0fd9d8a48e9174df47540b7545909841ac82354c7ae4cbe9952603bd", size = 37078 }, + { url = "https://files.pythonhosted.org/packages/fa/70/1af3143000eddfb19fd5ca5e78393985ed988ac493bb859800fe0914041f/multidict-6.4.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9abcf56a9511653fa1d052bfc55fbe53dbee8f34e68bd6a5a038731b0ca42d15", size = 224097 }, + { url = "https://files.pythonhosted.org/packages/b1/39/d570c62b53d4fba844e0378ffbcd02ac25ca423d3235047013ba2f6f60f8/multidict-6.4.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6ed5ae5605d4ad5a049fad2a28bb7193400700ce2f4ae484ab702d1e3749c3f9", size = 230768 }, + { url = "https://files.pythonhosted.org/packages/fd/f8/ed88f2c4d06f752b015933055eb291d9bc184936903752c66f68fb3c95a7/multidict-6.4.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbfcb60396f9bcfa63e017a180c3105b8c123a63e9d1428a36544e7d37ca9e20", size = 231331 }, + { url = "https://files.pythonhosted.org/packages/9c/6f/8e07cffa32f483ab887b0d56bbd8747ac2c1acd00dc0af6fcf265f4a121e/multidict-6.4.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0f1987787f5f1e2076b59692352ab29a955b09ccc433c1f6b8e8e18666f608b", size = 230169 }, + { url = "https://files.pythonhosted.org/packages/e6/2b/5dcf173be15e42f330110875a2668ddfc208afc4229097312212dc9c1236/multidict-6.4.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0121ccce8c812047d8d43d691a1ad7641f72c4f730474878a5aeae1b8ead8c", size = 222947 }, + { url = "https://files.pythonhosted.org/packages/39/75/4ddcbcebe5ebcd6faa770b629260d15840a5fc07ce8ad295a32e14993726/multidict-6.4.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83ec4967114295b8afd120a8eec579920c882831a3e4c3331d591a8e5bfbbc0f", size = 215761 }, + { url = "https://files.pythonhosted.org/packages/6a/c9/55e998ae45ff15c5608e384206aa71a11e1b7f48b64d166db400b14a3433/multidict-6.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:995f985e2e268deaf17867801b859a282e0448633f1310e3704b30616d269d69", size = 227605 }, + { url = "https://files.pythonhosted.org/packages/04/49/c2404eac74497503c77071bd2e6f88c7e94092b8a07601536b8dbe99be50/multidict-6.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:d832c608f94b9f92a0ec8b7e949be7792a642b6e535fcf32f3e28fab69eeb046", size = 226144 }, + { url = "https://files.pythonhosted.org/packages/62/c5/0cd0c3c6f18864c40846aa2252cd69d308699cb163e1c0d989ca301684da/multidict-6.4.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d21c1212171cf7da703c5b0b7a0e85be23b720818aef502ad187d627316d5645", size = 221100 }, + { url = "https://files.pythonhosted.org/packages/71/7b/f2f3887bea71739a046d601ef10e689528d4f911d84da873b6be9194ffea/multidict-6.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:cbebaa076aaecad3d4bb4c008ecc73b09274c952cf6a1b78ccfd689e51f5a5b0", size = 232731 }, + { url = "https://files.pythonhosted.org/packages/e5/b3/d9de808349df97fa75ec1372758701b5800ebad3c46ae377ad63058fbcc6/multidict-6.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c93a6fb06cc8e5d3628b2b5fda215a5db01e8f08fc15fadd65662d9b857acbe4", size = 229637 }, + { url = "https://files.pythonhosted.org/packages/5e/57/13207c16b615eb4f1745b44806a96026ef8e1b694008a58226c2d8f5f0a5/multidict-6.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8cd8f81f1310182362fb0c7898145ea9c9b08a71081c5963b40ee3e3cac589b1", size = 225594 }, + { url = "https://files.pythonhosted.org/packages/3a/e4/d23bec2f70221604f5565000632c305fc8f25ba953e8ce2d8a18842b9841/multidict-6.4.4-cp313-cp313-win32.whl", hash = "sha256:3e9f1cd61a0ab857154205fb0b1f3d3ace88d27ebd1409ab7af5096e409614cd", size = 35359 }, + { url = "https://files.pythonhosted.org/packages/a7/7a/cfe1a47632be861b627f46f642c1d031704cc1c0f5c0efbde2ad44aa34bd/multidict-6.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:8ffb40b74400e4455785c2fa37eba434269149ec525fc8329858c862e4b35373", size = 38903 }, + { url = "https://files.pythonhosted.org/packages/68/7b/15c259b0ab49938a0a1c8f3188572802704a779ddb294edc1b2a72252e7c/multidict-6.4.4-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6a602151dbf177be2450ef38966f4be3467d41a86c6a845070d12e17c858a156", size = 68895 }, + { url = "https://files.pythonhosted.org/packages/f1/7d/168b5b822bccd88142e0a3ce985858fea612404edd228698f5af691020c9/multidict-6.4.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d2b9712211b860d123815a80b859075d86a4d54787e247d7fbee9db6832cf1c", size = 40183 }, + { url = "https://files.pythonhosted.org/packages/e0/b7/d4b8d98eb850ef28a4922ba508c31d90715fd9b9da3801a30cea2967130b/multidict-6.4.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d2fa86af59f8fc1972e121ade052145f6da22758f6996a197d69bb52f8204e7e", size = 39592 }, + { url = "https://files.pythonhosted.org/packages/18/28/a554678898a19583548e742080cf55d169733baf57efc48c2f0273a08583/multidict-6.4.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50855d03e9e4d66eab6947ba688ffb714616f985838077bc4b490e769e48da51", size = 226071 }, + { url = "https://files.pythonhosted.org/packages/ee/dc/7ba6c789d05c310e294f85329efac1bf5b450338d2542498db1491a264df/multidict-6.4.4-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5bce06b83be23225be1905dcdb6b789064fae92499fbc458f59a8c0e68718601", size = 222597 }, + { url = "https://files.pythonhosted.org/packages/24/4f/34eadbbf401b03768dba439be0fb94b0d187facae9142821a3d5599ccb3b/multidict-6.4.4-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66ed0731f8e5dfd8369a883b6e564aca085fb9289aacabd9decd70568b9a30de", size = 228253 }, + { url = "https://files.pythonhosted.org/packages/c0/e6/493225a3cdb0d8d80d43a94503fc313536a07dae54a3f030d279e629a2bc/multidict-6.4.4-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:329ae97fc2f56f44d91bc47fe0972b1f52d21c4b7a2ac97040da02577e2daca2", size = 226146 }, + { url = "https://files.pythonhosted.org/packages/2f/70/e411a7254dc3bff6f7e6e004303b1b0591358e9f0b7c08639941e0de8bd6/multidict-6.4.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c27e5dcf520923d6474d98b96749e6805f7677e93aaaf62656005b8643f907ab", size = 220585 }, + { url = "https://files.pythonhosted.org/packages/08/8f/beb3ae7406a619100d2b1fb0022c3bb55a8225ab53c5663648ba50dfcd56/multidict-6.4.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:058cc59b9e9b143cc56715e59e22941a5d868c322242278d28123a5d09cdf6b0", size = 212080 }, + { url = "https://files.pythonhosted.org/packages/9c/ec/355124e9d3d01cf8edb072fd14947220f357e1c5bc79c88dff89297e9342/multidict-6.4.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:69133376bc9a03f8c47343d33f91f74a99c339e8b58cea90433d8e24bb298031", size = 226558 }, + { url = "https://files.pythonhosted.org/packages/fd/22/d2b95cbebbc2ada3be3812ea9287dcc9712d7f1a012fad041770afddb2ad/multidict-6.4.4-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d6b15c55721b1b115c5ba178c77104123745b1417527ad9641a4c5e2047450f0", size = 212168 }, + { url = "https://files.pythonhosted.org/packages/4d/c5/62bfc0b2f9ce88326dbe7179f9824a939c6c7775b23b95de777267b9725c/multidict-6.4.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:a887b77f51d3d41e6e1a63cf3bc7ddf24de5939d9ff69441387dfefa58ac2e26", size = 217970 }, + { url = "https://files.pythonhosted.org/packages/79/74/977cea1aadc43ff1c75d23bd5bc4768a8fac98c14e5878d6ee8d6bab743c/multidict-6.4.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:632a3bf8f1787f7ef7d3c2f68a7bde5be2f702906f8b5842ad6da9d974d0aab3", size = 226980 }, + { url = "https://files.pythonhosted.org/packages/48/fc/cc4a1a2049df2eb84006607dc428ff237af38e0fcecfdb8a29ca47b1566c/multidict-6.4.4-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:a145c550900deb7540973c5cdb183b0d24bed6b80bf7bddf33ed8f569082535e", size = 220641 }, + { url = "https://files.pythonhosted.org/packages/3b/6a/a7444d113ab918701988d4abdde373dbdfd2def7bd647207e2bf645c7eac/multidict-6.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc5d83c6619ca5c9672cb78b39ed8542f1975a803dee2cda114ff73cbb076edd", size = 221728 }, + { url = "https://files.pythonhosted.org/packages/2b/b0/fdf4c73ad1c55e0f4dbbf2aa59dd37037334091f9a4961646d2b7ac91a86/multidict-6.4.4-cp313-cp313t-win32.whl", hash = "sha256:3312f63261b9df49be9d57aaa6abf53a6ad96d93b24f9cc16cf979956355ce6e", size = 41913 }, + { url = "https://files.pythonhosted.org/packages/8e/92/27989ecca97e542c0d01d05a98a5ae12198a243a9ee12563a0313291511f/multidict-6.4.4-cp313-cp313t-win_amd64.whl", hash = "sha256:ba852168d814b2c73333073e1c7116d9395bea69575a01b0b3c89d2d5a87c8fb", size = 46112 }, + { url = "https://files.pythonhosted.org/packages/84/5d/e17845bb0fa76334477d5de38654d27946d5b5d3695443987a094a71b440/multidict-6.4.4-py3-none-any.whl", hash = "sha256:bd4557071b561a8b3b6075c3ce93cf9bfb6182cb241805c3d66ced3b75eff4ac", size = 10481 }, ] [[package]] @@ -1744,7 +1812,7 @@ requires-dist = [ { name = "segy", specifier = ">=0.4.0,<0.5.0" }, { name = "tqdm", specifier = ">=4.67.0,<5.0.0" }, { name = "xarray", specifier = ">=2025.3.1" }, - { name = "zarr", specifier = ">=3.0.4,<3.0.7" }, + { name = "zarr", specifier = ">=3.0.8,<4.0.0" }, { name = "zfpy", marker = "extra == 'lossy'", specifier = ">=1.0.1,<2.0.0" }, ] provides-extras = ["cloud", "distributed", "lossy"] @@ -1807,11 +1875,11 @@ wheels = [ [[package]] name = "mypy-extensions" -version = "1.0.0" +version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963 }, ] [[package]] @@ -1854,11 +1922,11 @@ wheels = [ [[package]] name = "narwhals" -version = "1.33.0" +version = "1.41.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/85/fd/484aa8bb557f97a1781f38c78b79f795a2fa320e4165c4230f679937d1e8/narwhals-1.33.0.tar.gz", hash = "sha256:6233d2457debf4b5fe4a1da54530c6fe2d84326f4a8e3bca35bbbff580a347cb", size = 262554 } +sdist = { url = "https://files.pythonhosted.org/packages/32/fc/7b9a3689911662be59889b1b0b40e17d5dba6f98080994d86ca1f3154d41/narwhals-1.41.0.tar.gz", hash = "sha256:0ab2e5a1757a19b071e37ca74b53b0b5426789321d68939738337dfddea629b5", size = 488446 } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/c1/e9bc6b67c774e7c1f939c91ea535f18f7644fedc61b20d6baa861ad52b34/narwhals-1.33.0-py3-none-any.whl", hash = "sha256:f653319112fd121a1f1c18a40cf70dada773cdacfd53e62c2aa0afae43c17129", size = 322750 }, + { url = "https://files.pythonhosted.org/packages/c9/e0/ade8619846645461c012498f02b93a659e50f07d9d9a6ffefdf5ea2c02a0/narwhals-1.41.0-py3-none-any.whl", hash = "sha256:d958336b40952e4c4b7aeef259a7074851da0800cf902186a58f2faeff97be02", size = 357968 }, ] [[package]] @@ -1926,53 +1994,56 @@ wheels = [ [[package]] name = "numba" -version = "0.61.0" +version = "0.61.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "llvmlite" }, { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3c/88/c13a935f200fda51384411e49840a8e7f70c9cb1ee8d809dd0f2477cf7ef/numba-0.61.0.tar.gz", hash = "sha256:888d2e89b8160899e19591467e8fdd4970e07606e1fbc248f239c89818d5f925", size = 2816484 } +sdist = { url = "https://files.pythonhosted.org/packages/1c/a0/e21f57604304aa03ebb8e098429222722ad99176a4f979d34af1d1ee80da/numba-0.61.2.tar.gz", hash = "sha256:8750ee147940a6637b80ecf7f95062185ad8726c8c28a2295b8ec1160a196f7d", size = 2820615 } wheels = [ - { url = "https://files.pythonhosted.org/packages/63/8f/f983a7c859ccad73d3cc3f86fbba94f16e137cd1ee464631d61b624363b2/numba-0.61.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:bf64c2d0f3d161af603de3825172fb83c2600bcb1d53ae8ea568d4c53ba6ac08", size = 2768960 }, - { url = "https://files.pythonhosted.org/packages/be/1b/c33dc847d475d5b647b4ad5aefc38df7a72283763f4cda47745050375a81/numba-0.61.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:de5aa7904741425f28e1028b85850b31f0a245e9eb4f7c38507fb893283a066c", size = 2771862 }, - { url = "https://files.pythonhosted.org/packages/14/91/18b9f64b34ff318a14d072251480547f89ebfb864b2b7168e5dc5f64f502/numba-0.61.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:21c2fe25019267a608e2710a6a947f557486b4b0478b02e45a81cf606a05a7d4", size = 3825411 }, - { url = "https://files.pythonhosted.org/packages/f2/97/1a38030c2a331e273ace1de2b61988e33d80878fda8a5eedee0cd78399d3/numba-0.61.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:74250b26ed6a1428763e774dc5b2d4e70d93f73795635b5412b8346a4d054574", size = 3519604 }, - { url = "https://files.pythonhosted.org/packages/df/a7/56f547de8fc197963f238fd62beb5f1d2cace047602d0577956bf6840970/numba-0.61.0-cp311-cp311-win_amd64.whl", hash = "sha256:b72bbc8708e98b3741ad0c63f9929c47b623cc4ee86e17030a4f3e301e8401ac", size = 2827642 }, - { url = "https://files.pythonhosted.org/packages/63/c9/c61881e7f2e253e745209f078bbd428ce23b6cf901f7d93afe166720ff95/numba-0.61.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:152146ecdbb8d8176f294e9f755411e6f270103a11c3ff50cecc413f794e52c8", size = 2769758 }, - { url = "https://files.pythonhosted.org/packages/e1/28/ddec0147a4933f86ceaca580aa9bb767d5632ecdb1ece6cfb3eab4ac78e5/numba-0.61.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5cafa6095716fcb081618c28a8d27bf7c001e09696f595b41836dec114be2905", size = 2772445 }, - { url = "https://files.pythonhosted.org/packages/18/74/6a9f0e6c76c088f8a6aa702eab31734068061dca5cc0f34e8bc1eb447de1/numba-0.61.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ffe9fe373ed30638d6e20a0269f817b2c75d447141f55a675bfcf2d1fe2e87fb", size = 3882115 }, - { url = "https://files.pythonhosted.org/packages/53/68/d7c31e53f08e6b4669c9b5a3cd7c5fb9097220c5ef388bc099ca8ab9749f/numba-0.61.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9f25f7fef0206d55c1cfb796ad833cbbc044e2884751e56e798351280038484c", size = 3573296 }, - { url = "https://files.pythonhosted.org/packages/94/4f/8357a99a14f331b865a42cb4756ae37da85599b9c95e01277ea10361e91a/numba-0.61.0-cp312-cp312-win_amd64.whl", hash = "sha256:550d389573bc3b895e1ccb18289feea11d937011de4d278b09dc7ed585d1cdcb", size = 2828077 }, - { url = "https://files.pythonhosted.org/packages/3b/54/71fba18e4af5619f1ea8175ee92e82dd8e220bd6feb8c0153c6b814c8a60/numba-0.61.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:b96fafbdcf6f69b69855273e988696aae4974115a815f6818fef4af7afa1f6b8", size = 2768024 }, - { url = "https://files.pythonhosted.org/packages/39/76/2448b43d08e904aad1b1b9cd12835b19411e84a81aa9192f83642a5e0afd/numba-0.61.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f6c452dca1de8e60e593f7066df052dd8da09b243566ecd26d2b796e5d3087d", size = 2769541 }, - { url = "https://files.pythonhosted.org/packages/32/8f/4bb2374247ab988c9eac587b304b2947a36d605b9bb9ba4bf06e955c17d3/numba-0.61.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:44240e694d4aa321430c97b21453e46014fe6c7b8b7d932afa7f6a88cc5d7e5e", size = 3890102 }, - { url = "https://files.pythonhosted.org/packages/ab/bc/dc2d03555289ae5263f65c01d45eb186ce347585c191daf0e60021d5ed39/numba-0.61.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:764f0e47004f126f58c3b28e0a02374c420a9d15157b90806d68590f5c20cc89", size = 3580239 }, - { url = "https://files.pythonhosted.org/packages/61/08/71247ce560d2c222d9ca705c7d3547fc4069b96fc85d71aabeb890befe9f/numba-0.61.0-cp313-cp313-win_amd64.whl", hash = "sha256:074cd38c5b1f9c65a4319d1f3928165f48975ef0537ad43385b2bd908e6e2e35", size = 2828035 }, + { url = "https://files.pythonhosted.org/packages/3f/97/c99d1056aed767503c228f7099dc11c402906b42a4757fec2819329abb98/numba-0.61.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:efd3db391df53aaa5cfbee189b6c910a5b471488749fd6606c3f33fc984c2ae2", size = 2775825 }, + { url = "https://files.pythonhosted.org/packages/95/9e/63c549f37136e892f006260c3e2613d09d5120672378191f2dc387ba65a2/numba-0.61.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:49c980e4171948ffebf6b9a2520ea81feed113c1f4890747ba7f59e74be84b1b", size = 2778695 }, + { url = "https://files.pythonhosted.org/packages/97/c8/8740616c8436c86c1b9a62e72cb891177d2c34c2d24ddcde4c390371bf4c/numba-0.61.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3945615cd73c2c7eba2a85ccc9c1730c21cd3958bfcf5a44302abae0fb07bb60", size = 3829227 }, + { url = "https://files.pythonhosted.org/packages/fc/06/66e99ae06507c31d15ff3ecd1f108f2f59e18b6e08662cd5f8a5853fbd18/numba-0.61.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbfdf4eca202cebade0b7d43896978e146f39398909a42941c9303f82f403a18", size = 3523422 }, + { url = "https://files.pythonhosted.org/packages/0f/a4/2b309a6a9f6d4d8cfba583401c7c2f9ff887adb5d54d8e2e130274c0973f/numba-0.61.2-cp311-cp311-win_amd64.whl", hash = "sha256:76bcec9f46259cedf888041b9886e257ae101c6268261b19fda8cfbc52bec9d1", size = 2831505 }, + { url = "https://files.pythonhosted.org/packages/b4/a0/c6b7b9c615cfa3b98c4c63f4316e3f6b3bbe2387740277006551784218cd/numba-0.61.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:34fba9406078bac7ab052efbf0d13939426c753ad72946baaa5bf9ae0ebb8dd2", size = 2776626 }, + { url = "https://files.pythonhosted.org/packages/92/4a/fe4e3c2ecad72d88f5f8cd04e7f7cff49e718398a2fac02d2947480a00ca/numba-0.61.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ddce10009bc097b080fc96876d14c051cc0c7679e99de3e0af59014dab7dfe8", size = 2779287 }, + { url = "https://files.pythonhosted.org/packages/9a/2d/e518df036feab381c23a624dac47f8445ac55686ec7f11083655eb707da3/numba-0.61.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b1bb509d01f23d70325d3a5a0e237cbc9544dd50e50588bc581ba860c213546", size = 3885928 }, + { url = "https://files.pythonhosted.org/packages/10/0f/23cced68ead67b75d77cfcca3df4991d1855c897ee0ff3fe25a56ed82108/numba-0.61.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48a53a3de8f8793526cbe330f2a39fe9a6638efcbf11bd63f3d2f9757ae345cd", size = 3577115 }, + { url = "https://files.pythonhosted.org/packages/68/1d/ddb3e704c5a8fb90142bf9dc195c27db02a08a99f037395503bfbc1d14b3/numba-0.61.2-cp312-cp312-win_amd64.whl", hash = "sha256:97cf4f12c728cf77c9c1d7c23707e4d8fb4632b46275f8f3397de33e5877af18", size = 2831929 }, + { url = "https://files.pythonhosted.org/packages/0b/f3/0fe4c1b1f2569e8a18ad90c159298d862f96c3964392a20d74fc628aee44/numba-0.61.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:3a10a8fc9afac40b1eac55717cece1b8b1ac0b946f5065c89e00bde646b5b154", size = 2771785 }, + { url = "https://files.pythonhosted.org/packages/e9/71/91b277d712e46bd5059f8a5866862ed1116091a7cb03bd2704ba8ebe015f/numba-0.61.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d3bcada3c9afba3bed413fba45845f2fb9cd0d2b27dd58a1be90257e293d140", size = 2773289 }, + { url = "https://files.pythonhosted.org/packages/0d/e0/5ea04e7ad2c39288c0f0f9e8d47638ad70f28e275d092733b5817cf243c9/numba-0.61.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bdbca73ad81fa196bd53dc12e3aaf1564ae036e0c125f237c7644fe64a4928ab", size = 3893918 }, + { url = "https://files.pythonhosted.org/packages/17/58/064f4dcb7d7e9412f16ecf80ed753f92297e39f399c905389688cf950b81/numba-0.61.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5f154aaea625fb32cfbe3b80c5456d514d416fcdf79733dd69c0df3a11348e9e", size = 3584056 }, + { url = "https://files.pythonhosted.org/packages/af/a4/6d3a0f2d3989e62a18749e1e9913d5fa4910bbb3e3311a035baea6caf26d/numba-0.61.2-cp313-cp313-win_amd64.whl", hash = "sha256:59321215e2e0ac5fa928a8020ab00b8e57cda8a97384963ac0dfa4d4e6aa54e7", size = 2831846 }, ] [[package]] name = "numcodecs" -version = "0.15.1" +version = "0.16.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "deprecated" }, { name = "numpy" }, + { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/fc/bb532969eb8236984ba65e4f0079a7da885b8ac0ce1f0835decbb3938a62/numcodecs-0.15.1.tar.gz", hash = "sha256:eeed77e4d6636641a2cc605fbc6078c7a8f2cc40f3dfa2b3f61e52e6091b04ff", size = 6267275 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/fc/410f1cacaef0931f5daf06813b1b8a2442f7418ee284ec73fe5e830dca48/numcodecs-0.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:698f1d59511488b8fe215fadc1e679a4c70d894de2cca6d8bf2ab770eed34dfd", size = 1649501 }, - { url = "https://files.pythonhosted.org/packages/85/29/dff62fae04323035912c419a82dc9624fad7d08541dbfcd9ab78a3a40074/numcodecs-0.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bef8c8e64fab76677324a07672b10c31861775d03fc63ed5012ca384144e4bb9", size = 1187306 }, - { url = "https://files.pythonhosted.org/packages/a6/a8/908a226632ffabf19caf8c99f1b2898f2f22aac02795a6fe9d018fd6d9dd/numcodecs-0.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdfaef9f5f2ed8f65858db801f1953f1007c9613ee490a1c56233cd78b505ed5", size = 8891971 }, - { url = "https://files.pythonhosted.org/packages/2b/e8/058aac43e1300d588e99b2d0d5b771c8a43fa92ce9c9517da596869fc146/numcodecs-0.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:e2547fa3a7ffc9399cfd2936aecb620a3db285f2630c86c8a678e477741a4b3c", size = 840035 }, - { url = "https://files.pythonhosted.org/packages/e7/7e/f12fc32d3beedc6a8f1ec69ea0ba72e93cb99c0350feed2cff5d04679bc3/numcodecs-0.15.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b0a9d9cd29a0088220682dda4a9898321f7813ff7802be2bbb545f6e3d2f10ff", size = 1691889 }, - { url = "https://files.pythonhosted.org/packages/81/38/88e40d40288b73c3b3a390ed5614a34b0661d00255bdd4cfb91c32101364/numcodecs-0.15.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a34f0fe5e5f3b837bbedbeb98794a6d4a12eeeef8d4697b523905837900b5e1c", size = 1189149 }, - { url = "https://files.pythonhosted.org/packages/28/7d/7527d9180bc76011d6163c848c9cf02cd28a623c2c66cf543e1e86de7c5e/numcodecs-0.15.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3a09e22140f2c691f7df26303ff8fa2dadcf26d7d0828398c0bc09b69e5efa3", size = 8879163 }, - { url = "https://files.pythonhosted.org/packages/ab/bc/b6c3cde91c754860a3467a8c058dcf0b1a5ca14d82b1c5397c700cf8b1eb/numcodecs-0.15.1-cp312-cp312-win_amd64.whl", hash = "sha256:daed6066ffcf40082da847d318b5ab6123d69ceb433ba603cb87c323a541a8bc", size = 836785 }, - { url = "https://files.pythonhosted.org/packages/78/57/acbc54b3419e5be65015e47177c76c0a73e037fd3ae2cde5808169194d4d/numcodecs-0.15.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e3d82b70500cf61e8d115faa0d0a76be6ecdc24a16477ee3279d711699ad85f3", size = 1688220 }, - { url = "https://files.pythonhosted.org/packages/b6/56/9863fa6dc679f40a31bea5e9713ee5507a31dcd3ee82ea4b1a9268ce52e8/numcodecs-0.15.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1d471a1829ce52d3f365053a2bd1379e32e369517557c4027ddf5ac0d99c591e", size = 1180294 }, - { url = "https://files.pythonhosted.org/packages/fa/91/d96999b41e3146b6c0ce6bddc5ad85803cb4d743c95394562c2a4bb8cded/numcodecs-0.15.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1dfdea4a67108205edfce99c1cb6cd621343bc7abb7e16a041c966776920e7de", size = 8834323 }, - { url = "https://files.pythonhosted.org/packages/c3/32/233e5ede6568bdb044e6f99aaa9fa39827ff3109c6487fc137315f733586/numcodecs-0.15.1-cp313-cp313-win_amd64.whl", hash = "sha256:a4f7bdb26f1b34423cb56d48e75821223be38040907c9b5954eeb7463e7eb03c", size = 831955 }, +sdist = { url = "https://files.pythonhosted.org/packages/00/35/49da850ce5371da3930d099da364a73ce9ae4fc64075e521674b48f4804d/numcodecs-0.16.1.tar.gz", hash = "sha256:c47f20d656454568c6b4697ce02081e6bbb512f198738c6a56fafe8029c97fb1", size = 6268134 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/82/8d6ca1166dc9b020f383073c1c604e004f0495d243647a83e5d5fff2b7ad/numcodecs-0.16.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:5348a25aefbce37ea7c00c3363d36176155233c95597e5905a932e9620df960d", size = 1623980 }, + { url = "https://files.pythonhosted.org/packages/aa/4e/11258b7945c6cd3579f16228c803a13291d16ef7ef46f9551008090b6763/numcodecs-0.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2058b0a985470809c720d2457758b61e6c9495a49d5f20dfac9b5ebabd8848eb", size = 1153826 }, + { url = "https://files.pythonhosted.org/packages/a1/24/4099ccb29754fc1d2e55dbd9b540f58a24cab6e844dc996e37812c3fb79d/numcodecs-0.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b216b6d7bc207b85d41fddbc25b09fd00d76e265454db6e3fb09d5da0216397", size = 8263684 }, + { url = "https://files.pythonhosted.org/packages/04/e3/816a82b984dd7fb7a0afadd16842260ccfee23cc5edbda48a92649ee161b/numcodecs-0.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2308d56c4f84a5b942f8668b4adedd3d9cdd6a22e6e6e20768ec356c77050f38", size = 8788927 }, + { url = "https://files.pythonhosted.org/packages/6f/54/dbea8b17928670412db0efb20efc087b30c2a67b84b1605fa8a136e482af/numcodecs-0.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:acd8d68b4b815e62cb91e6064a53dac51ee99849350784ee16dd52cdbb4bc70f", size = 790259 }, + { url = "https://files.pythonhosted.org/packages/b7/ee/e2a903c88fed347dc74c70bbd7a8dab9aa22bb0dac68c5bc6393c2e9373b/numcodecs-0.16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1abe0651ecb6f207656ebfc802effa55c4ae3136cf172c295a067749a2699122", size = 1663434 }, + { url = "https://files.pythonhosted.org/packages/f2/f0/37819d4f6896b1ac43a164ffd3ab99d7cbf63bf63cb375fef97aedaef4f0/numcodecs-0.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:abb39b7102d0816c8563669cdddca40392d34d0cbf31e3e996706b244586a458", size = 1150402 }, + { url = "https://files.pythonhosted.org/packages/60/3c/5059a29750305b80b7428b1e6695878dea9ea3b537d7fba57875e4bbc2c7/numcodecs-0.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3359a951f8b23317f12736a7ad1e7375ec3d735465f92049c76d032ebca4c40", size = 8237455 }, + { url = "https://files.pythonhosted.org/packages/1b/f5/515f98d659ab0cbe3738da153eddae22186fd38f05a808511e10f04cf679/numcodecs-0.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82cc70592ec18060786b1bfa0da23afd2a7807d7975d766e626954d6628ec609", size = 8770711 }, + { url = "https://files.pythonhosted.org/packages/a2/3a/9fc6104f888af11bad804ebd32dffe0bcb83337f4525b4fe5b379942fefd/numcodecs-0.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:4b48ddc8a7d132b7808bc53eb2705342de5c1e39289d725f988bd143c0fd86df", size = 788701 }, + { url = "https://files.pythonhosted.org/packages/5e/1e/73ffb1074f03d52cb1c4f4deaba26a2008ca45262f3622ed26dbec7a7362/numcodecs-0.16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ad8ee940315f59188accfc3f2d39726a4ca0d76b49bf8d0018e121f01c49028", size = 1659453 }, + { url = "https://files.pythonhosted.org/packages/42/72/5affb1ce92b7a6becee17921de7c6b521a48fa61fc3d36d9f1eea2cf83f5/numcodecs-0.16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:179ca7bf3525a0f7379df7767d87dd495253de44597cb7e511198b28b09da633", size = 1143932 }, + { url = "https://files.pythonhosted.org/packages/e3/f1/b092679d84c67c6ed62e4df5781d89bbb089f24a0df4187cbab9db51cf6b/numcodecs-0.16.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e2babbb50bf348ae982818d5560af330eab0dcd925fb0e49509785ad57d11db", size = 8187716 }, + { url = "https://files.pythonhosted.org/packages/a8/e8/86e7741adb43261aff409b53c53c8bac2797bfca055d64dd65dc731d5141/numcodecs-0.16.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4b29d8d3284b72bfad4fb83d672a17f497ae86ee1ef8087bac7222b620d3d91", size = 8728650 }, + { url = "https://files.pythonhosted.org/packages/21/03/87c5c217232aa3515d350728c6dcefca252fa582246100ef68a51fbda456/numcodecs-0.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:06489635f43e1a959aea73cb830d78cf3adb07ac5f34daccb92091e4d9ac6b07", size = 785553 }, ] [package.optional-dependencies] @@ -1982,50 +2053,50 @@ crc32c = [ [[package]] name = "numpy" -version = "2.1.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/25/ca/1166b75c21abd1da445b97bf1fa2f14f423c6cfb4fc7c4ef31dccf9f6a94/numpy-2.1.3.tar.gz", hash = "sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761", size = 20166090 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/81/c8167192eba5247593cd9d305ac236847c2912ff39e11402e72ae28a4985/numpy-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d", size = 21156252 }, - { url = "https://files.pythonhosted.org/packages/da/74/5a60003fc3d8a718d830b08b654d0eea2d2db0806bab8f3c2aca7e18e010/numpy-2.1.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41", size = 13784119 }, - { url = "https://files.pythonhosted.org/packages/47/7c/864cb966b96fce5e63fcf25e1e4d957fe5725a635e5f11fe03f39dd9d6b5/numpy-2.1.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9", size = 5352978 }, - { url = "https://files.pythonhosted.org/packages/09/ac/61d07930a4993dd9691a6432de16d93bbe6aa4b1c12a5e573d468eefc1ca/numpy-2.1.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09", size = 6892570 }, - { url = "https://files.pythonhosted.org/packages/27/2f/21b94664f23af2bb52030653697c685022119e0dc93d6097c3cb45bce5f9/numpy-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a", size = 13896715 }, - { url = "https://files.pythonhosted.org/packages/7a/f0/80811e836484262b236c684a75dfc4ba0424bc670e765afaa911468d9f39/numpy-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b", size = 16339644 }, - { url = "https://files.pythonhosted.org/packages/fa/81/ce213159a1ed8eb7d88a2a6ef4fbdb9e4ffd0c76b866c350eb4e3c37e640/numpy-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee", size = 16712217 }, - { url = "https://files.pythonhosted.org/packages/7d/84/4de0b87d5a72f45556b2a8ee9fc8801e8518ec867fc68260c1f5dcb3903f/numpy-2.1.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0", size = 14399053 }, - { url = "https://files.pythonhosted.org/packages/7e/1c/e5fabb9ad849f9d798b44458fd12a318d27592d4bc1448e269dec070ff04/numpy-2.1.3-cp311-cp311-win32.whl", hash = "sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9", size = 6534741 }, - { url = "https://files.pythonhosted.org/packages/1e/48/a9a4b538e28f854bfb62e1dea3c8fea12e90216a276c7777ae5345ff29a7/numpy-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2", size = 12869487 }, - { url = "https://files.pythonhosted.org/packages/8a/f0/385eb9970309643cbca4fc6eebc8bb16e560de129c91258dfaa18498da8b/numpy-2.1.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e", size = 20849658 }, - { url = "https://files.pythonhosted.org/packages/54/4a/765b4607f0fecbb239638d610d04ec0a0ded9b4951c56dc68cef79026abf/numpy-2.1.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958", size = 13492258 }, - { url = "https://files.pythonhosted.org/packages/bd/a7/2332679479c70b68dccbf4a8eb9c9b5ee383164b161bee9284ac141fbd33/numpy-2.1.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8", size = 5090249 }, - { url = "https://files.pythonhosted.org/packages/c1/67/4aa00316b3b981a822c7a239d3a8135be2a6945d1fd11d0efb25d361711a/numpy-2.1.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564", size = 6621704 }, - { url = "https://files.pythonhosted.org/packages/5e/da/1a429ae58b3b6c364eeec93bf044c532f2ff7b48a52e41050896cf15d5b1/numpy-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512", size = 13606089 }, - { url = "https://files.pythonhosted.org/packages/9e/3e/3757f304c704f2f0294a6b8340fcf2be244038be07da4cccf390fa678a9f/numpy-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b", size = 16043185 }, - { url = "https://files.pythonhosted.org/packages/43/97/75329c28fea3113d00c8d2daf9bc5828d58d78ed661d8e05e234f86f0f6d/numpy-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc", size = 16410751 }, - { url = "https://files.pythonhosted.org/packages/ad/7a/442965e98b34e0ae9da319f075b387bcb9a1e0658276cc63adb8c9686f7b/numpy-2.1.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0", size = 14082705 }, - { url = "https://files.pythonhosted.org/packages/ac/b6/26108cf2cfa5c7e03fb969b595c93131eab4a399762b51ce9ebec2332e80/numpy-2.1.3-cp312-cp312-win32.whl", hash = "sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9", size = 6239077 }, - { url = "https://files.pythonhosted.org/packages/a6/84/fa11dad3404b7634aaab50733581ce11e5350383311ea7a7010f464c0170/numpy-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a", size = 12566858 }, - { url = "https://files.pythonhosted.org/packages/4d/0b/620591441457e25f3404c8057eb924d04f161244cb8a3680d529419aa86e/numpy-2.1.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f", size = 20836263 }, - { url = "https://files.pythonhosted.org/packages/45/e1/210b2d8b31ce9119145433e6ea78046e30771de3fe353f313b2778142f34/numpy-2.1.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598", size = 13507771 }, - { url = "https://files.pythonhosted.org/packages/55/44/aa9ee3caee02fa5a45f2c3b95cafe59c44e4b278fbbf895a93e88b308555/numpy-2.1.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57", size = 5075805 }, - { url = "https://files.pythonhosted.org/packages/78/d6/61de6e7e31915ba4d87bbe1ae859e83e6582ea14c6add07c8f7eefd8488f/numpy-2.1.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe", size = 6608380 }, - { url = "https://files.pythonhosted.org/packages/3e/46/48bdf9b7241e317e6cf94276fe11ba673c06d1fdf115d8b4ebf616affd1a/numpy-2.1.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43", size = 13602451 }, - { url = "https://files.pythonhosted.org/packages/70/50/73f9a5aa0810cdccda9c1d20be3cbe4a4d6ea6bfd6931464a44c95eef731/numpy-2.1.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56", size = 16039822 }, - { url = "https://files.pythonhosted.org/packages/ad/cd/098bc1d5a5bc5307cfc65ee9369d0ca658ed88fbd7307b0d49fab6ca5fa5/numpy-2.1.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a", size = 16411822 }, - { url = "https://files.pythonhosted.org/packages/83/a2/7d4467a2a6d984549053b37945620209e702cf96a8bc658bc04bba13c9e2/numpy-2.1.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef", size = 14079598 }, - { url = "https://files.pythonhosted.org/packages/e9/6a/d64514dcecb2ee70bfdfad10c42b76cab657e7ee31944ff7a600f141d9e9/numpy-2.1.3-cp313-cp313-win32.whl", hash = "sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f", size = 6236021 }, - { url = "https://files.pythonhosted.org/packages/bb/f9/12297ed8d8301a401e7d8eb6b418d32547f1d700ed3c038d325a605421a4/numpy-2.1.3-cp313-cp313-win_amd64.whl", hash = "sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed", size = 12560405 }, - { url = "https://files.pythonhosted.org/packages/a7/45/7f9244cd792e163b334e3a7f02dff1239d2890b6f37ebf9e82cbe17debc0/numpy-2.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f", size = 20859062 }, - { url = "https://files.pythonhosted.org/packages/b1/b4/a084218e7e92b506d634105b13e27a3a6645312b93e1c699cc9025adb0e1/numpy-2.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4", size = 13515839 }, - { url = "https://files.pythonhosted.org/packages/27/45/58ed3f88028dcf80e6ea580311dc3edefdd94248f5770deb980500ef85dd/numpy-2.1.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e", size = 5116031 }, - { url = "https://files.pythonhosted.org/packages/37/a8/eb689432eb977d83229094b58b0f53249d2209742f7de529c49d61a124a0/numpy-2.1.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0", size = 6629977 }, - { url = "https://files.pythonhosted.org/packages/42/a3/5355ad51ac73c23334c7caaed01adadfda49544f646fcbfbb4331deb267b/numpy-2.1.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408", size = 13575951 }, - { url = "https://files.pythonhosted.org/packages/c4/70/ea9646d203104e647988cb7d7279f135257a6b7e3354ea6c56f8bafdb095/numpy-2.1.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6", size = 16022655 }, - { url = "https://files.pythonhosted.org/packages/14/ce/7fc0612903e91ff9d0b3f2eda4e18ef9904814afcae5b0f08edb7f637883/numpy-2.1.3-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f", size = 16399902 }, - { url = "https://files.pythonhosted.org/packages/ef/62/1d3204313357591c913c32132a28f09a26357e33ea3c4e2fe81269e0dca1/numpy-2.1.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17", size = 14067180 }, - { url = "https://files.pythonhosted.org/packages/24/d7/78a40ed1d80e23a774cb8a34ae8a9493ba1b4271dde96e56ccdbab1620ef/numpy-2.1.3-cp313-cp313t-win32.whl", hash = "sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48", size = 6291907 }, - { url = "https://files.pythonhosted.org/packages/86/09/a5ab407bd7f5f5599e6a9261f964ace03a73e7c6928de906981c31c38082/numpy-2.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4", size = 12644098 }, +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963 }, + { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743 }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616 }, + { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579 }, + { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005 }, + { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570 }, + { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548 }, + { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521 }, + { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866 }, + { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455 }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348 }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362 }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103 }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382 }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462 }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618 }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511 }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783 }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506 }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190 }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828 }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006 }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765 }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736 }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719 }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072 }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213 }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632 }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532 }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885 }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467 }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144 }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217 }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014 }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935 }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122 }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143 }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260 }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225 }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374 }, ] [[package]] @@ -2039,11 +2110,11 @@ wheels = [ [[package]] name = "packaging" -version = "24.2" +version = "25.0" 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 } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727 } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 }, ] [[package]] @@ -2197,20 +2268,20 @@ wheels = [ [[package]] name = "platformdirs" -version = "4.3.7" +version = "4.3.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b6/2d/7d512a3913d60623e7eb945c6d1b4f0bddf1d0b7ada5225274c87e5b53d1/platformdirs-4.3.7.tar.gz", hash = "sha256:eb437d586b6a0986388f0d6f74aa0cde27b48d0e3d66843640bfb6bdcdb6e351", size = 21291 } +sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/45/59578566b3275b8fd9157885918fcd0c4d74162928a5310926887b856a51/platformdirs-4.3.7-py3-none-any.whl", hash = "sha256:a03875334331946f13c549dbd8f4bac7a13a50a895a0eb1e8c6a8ace80d40a94", size = 18499 }, + { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567 }, ] [[package]] name = "pluggy" -version = "1.5.0" +version = "1.6.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 } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412 } 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://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538 }, ] [[package]] @@ -2340,16 +2411,16 @@ wheels = [ [[package]] name = "protobuf" -version = "6.30.2" +version = "6.31.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c8/8c/cf2ac658216eebe49eaedf1e06bc06cbf6a143469236294a1171a51357c3/protobuf-6.30.2.tar.gz", hash = "sha256:35c859ae076d8c56054c25b59e5e59638d86545ed6e2b6efac6be0b6ea3ba048", size = 429315 } +sdist = { url = "https://files.pythonhosted.org/packages/13/48/718c1e104a2e89970a8ff3b06d87e152834b576c570a6908f8c17ba88d65/protobuf-6.31.0.tar.gz", hash = "sha256:314fab1a6a316469dc2dd46f993cbbe95c861ea6807da910becfe7475bc26ffe", size = 441644 } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/85/cd53abe6a6cbf2e0029243d6ae5fb4335da2996f6c177bb2ce685068e43d/protobuf-6.30.2-cp310-abi3-win32.whl", hash = "sha256:b12ef7df7b9329886e66404bef5e9ce6a26b54069d7f7436a0853ccdeb91c103", size = 419148 }, - { url = "https://files.pythonhosted.org/packages/97/e9/7b9f1b259d509aef2b833c29a1f3c39185e2bf21c9c1be1cd11c22cb2149/protobuf-6.30.2-cp310-abi3-win_amd64.whl", hash = "sha256:7653c99774f73fe6b9301b87da52af0e69783a2e371e8b599b3e9cb4da4b12b9", size = 431003 }, - { url = "https://files.pythonhosted.org/packages/8e/66/7f3b121f59097c93267e7f497f10e52ced7161b38295137a12a266b6c149/protobuf-6.30.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:0eb523c550a66a09a0c20f86dd554afbf4d32b02af34ae53d93268c1f73bc65b", size = 417579 }, - { url = "https://files.pythonhosted.org/packages/d0/89/bbb1bff09600e662ad5b384420ad92de61cab2ed0f12ace1fd081fd4c295/protobuf-6.30.2-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:50f32cc9fd9cb09c783ebc275611b4f19dfdfb68d1ee55d2f0c7fa040df96815", size = 317319 }, - { url = "https://files.pythonhosted.org/packages/28/50/1925de813499546bc8ab3ae857e3ec84efe7d2f19b34529d0c7c3d02d11d/protobuf-6.30.2-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:4f6c687ae8efae6cf6093389a596548214467778146b7245e886f35e1485315d", size = 316212 }, - { url = "https://files.pythonhosted.org/packages/e5/a1/93c2acf4ade3c5b557d02d500b06798f4ed2c176fa03e3c34973ca92df7f/protobuf-6.30.2-py3-none-any.whl", hash = "sha256:ae86b030e69a98e08c77beab574cbcb9fff6d031d57209f574a5aea1445f4b51", size = 167062 }, + { url = "https://files.pythonhosted.org/packages/b6/77/8671682038b08237c927215fa3296bc1c54e4086fe542c87017c1b626663/protobuf-6.31.0-cp310-abi3-win32.whl", hash = "sha256:10bd62802dfa0588649740a59354090eaf54b8322f772fbdcca19bc78d27f0d6", size = 423437 }, + { url = "https://files.pythonhosted.org/packages/e4/07/cc9b0cbf7593f6ef8cf87fa9b0e55cd74c5cb526dd89ad84aa7d6547ef8d/protobuf-6.31.0-cp310-abi3-win_amd64.whl", hash = "sha256:3e987c99fd634be8347246a02123250f394ba20573c953de133dc8b2c107dd71", size = 435118 }, + { url = "https://files.pythonhosted.org/packages/21/46/33f884aa8bc59114dc97e0d954ca4618c556483670236008c88fbb7e834f/protobuf-6.31.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2c812f0f96ceb6b514448cefeb1df54ec06dde456783f5099c0e2f8a0f2caa89", size = 425439 }, + { url = "https://files.pythonhosted.org/packages/9b/f2/9a676b50229ce37b12777d7b21de90ae7bc0f9505d07e72e2e8d47b8d165/protobuf-6.31.0-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:67ce50195e4e584275623b8e6bc6d3d3dfd93924bf6116b86b3b8975ab9e4571", size = 321950 }, + { url = "https://files.pythonhosted.org/packages/a1/a7/243fa2d3c1b7675d54744b32dacf30356f4c27c0d3ad940ca8745a1c6b2c/protobuf-6.31.0-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:5353e38844168a327acd2b2aa440044411cd8d1b6774d5701008bd1dba067c79", size = 320904 }, + { url = "https://files.pythonhosted.org/packages/ee/01/1ed1d482960a5718fd99c82f6d79120181947cfd4667ec3944d448ed44a3/protobuf-6.31.0-py3-none-any.whl", hash = "sha256:6ac2e82556e822c17a8d23aa1190bbc1d06efb9c261981da95c71c9da09e9e23", size = 168558 }, ] [[package]] @@ -2478,15 +2549,16 @@ wheels = [ [[package]] name = "pydantic-settings" -version = "2.8.1" +version = "2.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, + { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/88/82/c79424d7d8c29b994fb01d277da57b0a9b09cc03c3ff875f9bd8a86b2145/pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585", size = 83550 } +sdist = { url = "https://files.pythonhosted.org/packages/67/1d/42628a2c33e93f8e9acbde0d5d735fa0850f3e6a2f8cb1eb6c40b9a732ac/pydantic_settings-2.9.1.tar.gz", hash = "sha256:c509bf79d27563add44e8446233359004ed85066cd096d8b510f715e6ef5d268", size = 163234 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/53/a64f03044927dc47aafe029c42a5b7aabc38dfb813475e0e1bf71c4a59d0/pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c", size = 30839 }, + { url = "https://files.pythonhosted.org/packages/b6/5f/d6d641b490fd3ec2c4c13b4244d68deea3a1b970a97be64f34fb5504ff72/pydantic_settings-2.9.1-py3-none-any.whl", hash = "sha256:59b4f431b1defb26fe620c71a7d3968a710d719f5f4cdbbdb7926edeb770f6ef", size = 44356 }, ] [[package]] @@ -2677,61 +2749,61 @@ wheels = [ [[package]] name = "rapidfuzz" -version = "3.12.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/be/8dff25a6157dfbde9867720b1282157fe7b809e085130bb89d7655c62186/rapidfuzz-3.12.2.tar.gz", hash = "sha256:b0ba1ccc22fff782e7152a3d3d0caca44ec4e32dc48ba01c560b8593965b5aa3", size = 57907839 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/41/985b8786f7895f7a7f03f80b547e04a5b9f41187f43de386ad2f32b9f9fc/rapidfuzz-3.12.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e9c4d984621ae17404c58f8d06ed8b025e167e52c0e6a511dfec83c37e9220cd", size = 1960568 }, - { url = "https://files.pythonhosted.org/packages/90/9e/9278b4160bf86346fc5f110b5daf07af629343bfcd04a9366d355bc6104e/rapidfuzz-3.12.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f9132c55d330f0a1d34ce6730a76805323a6250d97468a1ca766a883d6a9a25", size = 1434362 }, - { url = "https://files.pythonhosted.org/packages/e7/53/fe3fb50111e203da4e82b8694c29cbf44101cdbf1efd7ef721cdf85e0aca/rapidfuzz-3.12.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b343b6cb4b2c3dbc8d2d4c5ee915b6088e3b144ddf8305a57eaab16cf9fc74", size = 1417839 }, - { url = "https://files.pythonhosted.org/packages/fd/c4/aa11749bc9d9c0539061d32f2c525d99e11588867d3d6e94693ccd4e0dd0/rapidfuzz-3.12.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24081077b571ec4ee6d5d7ea0e49bc6830bf05b50c1005028523b9cd356209f3", size = 5620525 }, - { url = "https://files.pythonhosted.org/packages/5f/62/463c618a5a8a44bf6b087325353e13dbd5bc19c44cc06134d3c9eff0d04a/rapidfuzz-3.12.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c988a4fc91856260355773bf9d32bebab2083d4c6df33fafeddf4330e5ae9139", size = 1671267 }, - { url = "https://files.pythonhosted.org/packages/ca/b6/ec87c56ed0fab59f8220f5b832d5c1dd374667bee73318a01392ccc8c23d/rapidfuzz-3.12.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:780b4469ee21cf62b1b2e8ada042941fd2525e45d5fb6a6901a9798a0e41153c", size = 1683415 }, - { url = "https://files.pythonhosted.org/packages/46/08/862e65a1022cbfa2935e7b3f04cdaa73b0967ebf4762ddf509735da47d73/rapidfuzz-3.12.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:edd84b0a323885493c893bad16098c5e3b3005d7caa995ae653da07373665d97", size = 3139234 }, - { url = "https://files.pythonhosted.org/packages/ee/fa/7e8c0d1d26a4b892344c743f17e2c8482f749b616cd651590bd60994b49f/rapidfuzz-3.12.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efa22059c765b3d8778083805b199deaaf643db070f65426f87d274565ddf36a", size = 2523730 }, - { url = "https://files.pythonhosted.org/packages/8a/52/1d5b80e990c2e9998e47be118c2dbabda75daa2a5f5ff978df1ed76d7f81/rapidfuzz-3.12.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:095776b11bb45daf7c2973dd61cc472d7ea7f2eecfa454aef940b4675659b92f", size = 7880525 }, - { url = "https://files.pythonhosted.org/packages/0c/18/9c8cd7378272590a1eb0855b587f3a1fbd3492bd1612825d675320eeeb1b/rapidfuzz-3.12.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7e2574cf4aa86065600b664a1ac7b8b8499107d102ecde836aaaa403fc4f1784", size = 2905180 }, - { url = "https://files.pythonhosted.org/packages/4b/94/992de5d0fc9269a93ce62979aced028e0939d3477ea99d87fd0e22f44e8d/rapidfuzz-3.12.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d5a3425a6c50fd8fbd991d8f085ddb504791dae6ef9cc3ab299fea2cb5374bef", size = 3548613 }, - { url = "https://files.pythonhosted.org/packages/9b/25/ed3a0317f118131ee297de5936e1587e48b059e6438f4bbf92ef3bbc4927/rapidfuzz-3.12.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:97fb05e1ddb7b71a054040af588b0634214ee87cea87900d309fafc16fd272a4", size = 4583047 }, - { url = "https://files.pythonhosted.org/packages/4d/27/10585a5a62ff6ebbefa3e836a3fd8c123e2ed0bbde8cfcdd7477032cd458/rapidfuzz-3.12.2-cp311-cp311-win32.whl", hash = "sha256:b4c5a0413589aef936892fbfa94b7ff6f7dd09edf19b5a7b83896cc9d4e8c184", size = 1863208 }, - { url = "https://files.pythonhosted.org/packages/38/4c/faacecf70a4e202a02f029ec6f6e04e910d95c4ef36d7d63b83b160f7f3e/rapidfuzz-3.12.2-cp311-cp311-win_amd64.whl", hash = "sha256:58d9ae5cf9246d102db2a2558b67fe7e73c533e5d769099747921232d88b9be2", size = 1630876 }, - { url = "https://files.pythonhosted.org/packages/a7/4b/4931da26e0677880a9a533ef75ccbe564c091aa4a3579aed0355c7e06900/rapidfuzz-3.12.2-cp311-cp311-win_arm64.whl", hash = "sha256:7635fe34246cd241c8e35eb83084e978b01b83d5ef7e5bf72a704c637f270017", size = 870896 }, - { url = "https://files.pythonhosted.org/packages/a7/d2/e071753227c9e9f7f3550b983f30565f6e994581529815fa5a8879e7cd10/rapidfuzz-3.12.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1d982a651253ffe8434d9934ff0c1089111d60502228464721a2a4587435e159", size = 1944403 }, - { url = "https://files.pythonhosted.org/packages/aa/d1/4a10d21cc97aa36f4019af24382b5b4dc5ea6444499883c1c1286c6089ba/rapidfuzz-3.12.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:02e6466caa0222d5233b1f05640873671cd99549a5c5ba4c29151634a1e56080", size = 1430287 }, - { url = "https://files.pythonhosted.org/packages/6a/2d/76d39ab0beeb884d432096fe288c41850e37608e0145264081d0cb809f3c/rapidfuzz-3.12.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e956b3f053e474abae69ac693a52742109d860ac2375fe88e9387d3277f4c96c", size = 1403693 }, - { url = "https://files.pythonhosted.org/packages/85/1a/719b0f6498c003627e4b83b841bdcd48b11de8a9908a9051c4d2a0bc2245/rapidfuzz-3.12.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2dee7d740a2d5418d4f964f39ab8d89923e6b945850db833e798a1969b19542a", size = 5555878 }, - { url = "https://files.pythonhosted.org/packages/af/48/14d952a73254b4b0e517141acd27979bd23948adaf197f6ca2dc722fde6a/rapidfuzz-3.12.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a057cdb0401e42c84b6516c9b1635f7aedd5e430c6e388bd5f6bcd1d6a0686bb", size = 1655301 }, - { url = "https://files.pythonhosted.org/packages/db/3f/b093e154e9752325d7459aa6dca43b7acbcaffa05133507e2403676e3e75/rapidfuzz-3.12.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dccf8d4fb5b86d39c581a59463c596b1d09df976da26ff04ae219604223d502f", size = 1678069 }, - { url = "https://files.pythonhosted.org/packages/d6/7e/88853ecae5b5456eb1a1d8a01cbd534e25b671735d5d974609cbae082542/rapidfuzz-3.12.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21d5b3793c6f5aecca595cd24164bf9d3c559e315ec684f912146fc4e769e367", size = 3137119 }, - { url = "https://files.pythonhosted.org/packages/4d/d2/b1f809b815aaf682ddac9c57929149f740b90feeb4f8da2f535c196de821/rapidfuzz-3.12.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:46a616c0e13cff2de1761b011e0b14bb73b110182f009223f1453d505c9a975c", size = 2491639 }, - { url = "https://files.pythonhosted.org/packages/61/e4/a908d7b8db6e52ba2f80f6f0d0709ef9fdedb767db4307084331742b67f0/rapidfuzz-3.12.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:19fa5bc4301a1ee55400d4a38a8ecf9522b0391fc31e6da5f4d68513fe5c0026", size = 7821561 }, - { url = "https://files.pythonhosted.org/packages/f3/83/0250c49deefff15c46f5e590d8ee6abbd0f056e20b85994db55c16ac6ead/rapidfuzz-3.12.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:544a47190a0d25971658a9365dba7095397b4ce3e897f7dd0a77ca2cf6fa984e", size = 2874048 }, - { url = "https://files.pythonhosted.org/packages/6c/3f/8d433d964c6e476476ee53eae5fa77b9f16b38d312eb1571e9099a6a3b12/rapidfuzz-3.12.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f21af27c5e001f0ba1b88c36a0936437dfe034c452548d998891c21125eb640f", size = 3522801 }, - { url = "https://files.pythonhosted.org/packages/82/85/4931bfa41ef837b1544838e46e0556640d18114b3da9cf05e10defff00ae/rapidfuzz-3.12.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b63170d9db00629b5b3f2862114d8d6ee19127eaba0eee43762d62a25817dbe0", size = 4567304 }, - { url = "https://files.pythonhosted.org/packages/b1/fe/fdae322869885115dd19a38c1da71b73a8832aa77757c93f460743d4f54c/rapidfuzz-3.12.2-cp312-cp312-win32.whl", hash = "sha256:6c7152d77b2eb6bfac7baa11f2a9c45fd5a2d848dbb310acd0953b3b789d95c9", size = 1845332 }, - { url = "https://files.pythonhosted.org/packages/ca/a4/2ccebda5fb8a266d163d57a42c2a6ef6f91815df5d89cf38c12e8aa6ed0b/rapidfuzz-3.12.2-cp312-cp312-win_amd64.whl", hash = "sha256:1a314d170ee272ac87579f25a6cf8d16a031e1f7a7b07663434b41a1473bc501", size = 1617926 }, - { url = "https://files.pythonhosted.org/packages/a5/bc/aa8a4dc4ebff966dd039cce017c614cfd202049b4d1a2daafee7d018521b/rapidfuzz-3.12.2-cp312-cp312-win_arm64.whl", hash = "sha256:d41e8231326e94fd07c4d8f424f6bed08fead6f5e6688d1e6e787f1443ae7631", size = 864737 }, - { url = "https://files.pythonhosted.org/packages/96/59/2ea3b5bb82798eae73d6ee892264ebfe42727626c1f0e96c77120f0d5cf6/rapidfuzz-3.12.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:941f31038dba5d3dedcfcceba81d61570ad457c873a24ceb13f4f44fcb574260", size = 1936870 }, - { url = "https://files.pythonhosted.org/packages/54/85/4e486bf9ea05e771ad231731305ed701db1339157f630b76b246ce29cf71/rapidfuzz-3.12.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fe2dfc454ee51ba168a67b1e92b72aad251e45a074972cef13340bbad2fd9438", size = 1424231 }, - { url = "https://files.pythonhosted.org/packages/dc/60/aeea3eed402c40a8cf055d554678769fbee0dd95c22f04546070a22bb90e/rapidfuzz-3.12.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78fafaf7f5a48ee35ccd7928339080a0136e27cf97396de45259eca1d331b714", size = 1398055 }, - { url = "https://files.pythonhosted.org/packages/33/6b/757106f4c21fe3f20ce13ba3df560da60e52fe0dc390fd22bf613761669c/rapidfuzz-3.12.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0c7989ff32c077bb8fd53253fd6ca569d1bfebc80b17557e60750e6909ba4fe", size = 5526188 }, - { url = "https://files.pythonhosted.org/packages/1e/a2/7c680cdc5532746dba67ecf302eed975252657094e50ae334fa9268352e8/rapidfuzz-3.12.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96fa00bc105caa34b6cd93dca14a29243a3a7f0c336e4dcd36348d38511e15ac", size = 1648483 }, - { url = "https://files.pythonhosted.org/packages/f6/b0/ce942a1448b1a75d64af230dd746dede502224dd29ca9001665bbfd4bee6/rapidfuzz-3.12.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bccfb30c668620c5bc3490f2dc7d7da1cca0ead5a9da8b755e2e02e2ef0dff14", size = 1676076 }, - { url = "https://files.pythonhosted.org/packages/ba/71/81f77b08333200be6984b6cdf2bdfd7cfca4943f16b478a2f7838cba8d66/rapidfuzz-3.12.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f9b0adc3d894beb51f5022f64717b6114a6fabaca83d77e93ac7675911c8cc5", size = 3114169 }, - { url = "https://files.pythonhosted.org/packages/01/16/f3f34b207fdc8c61a33f9d2d61fc96b62c7dadca88bda1df1be4b94afb0b/rapidfuzz-3.12.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:32691aa59577f42864d5535cb6225d0f47e2c7bff59cf4556e5171e96af68cc1", size = 2485317 }, - { url = "https://files.pythonhosted.org/packages/b2/a6/b954f0766f644eb8dd8df44703e024ab4f5f15a8f8f5ea969963dd036f50/rapidfuzz-3.12.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:758b10380ad34c1f51753a070d7bb278001b5e6fcf544121c6df93170952d705", size = 7844495 }, - { url = "https://files.pythonhosted.org/packages/fb/8f/1dc604d05e07150a02b56a8ffc47df75ce316c65467259622c9edf098451/rapidfuzz-3.12.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:50a9c54c0147b468363119132d514c5024fbad1ed8af12bd8bd411b0119f9208", size = 2873242 }, - { url = "https://files.pythonhosted.org/packages/78/a9/9c649ace4b7f885e0a5fdcd1f33b057ebd83ecc2837693e6659bd944a2bb/rapidfuzz-3.12.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e3ceb87c11d2d0fbe8559bb795b0c0604b84cfc8bb7b8720b5c16e9e31e00f41", size = 3519124 }, - { url = "https://files.pythonhosted.org/packages/f5/81/ce0b774e540a2e22ec802e383131d7ead18347197304d584c4ccf7b8861a/rapidfuzz-3.12.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f7c9a003002434889255ff5676ca0f8934a478065ab5e702f75dc42639505bba", size = 4557831 }, - { url = "https://files.pythonhosted.org/packages/13/28/7bf0ee8d35efa7ab14e83d1795cdfd54833aa0428b6f87e987893136c372/rapidfuzz-3.12.2-cp313-cp313-win32.whl", hash = "sha256:cf165a76870cd875567941cf861dfd361a0a6e6a56b936c5d30042ddc9def090", size = 1842802 }, - { url = "https://files.pythonhosted.org/packages/ef/7e/792d609484776c8a40e1695ebd28b62196be9f8347b785b9104604dc7268/rapidfuzz-3.12.2-cp313-cp313-win_amd64.whl", hash = "sha256:55bcc003541f5f16ec0a73bf6de758161973f9e8d75161954380738dd147f9f2", size = 1615808 }, - { url = "https://files.pythonhosted.org/packages/4b/43/ca3d1018b392f49131843648e10b08ace23afe8dad3bee5f136e4346b7cd/rapidfuzz-3.12.2-cp313-cp313-win_arm64.whl", hash = "sha256:69f6ecdf1452139f2b947d0c169a605de578efdb72cbb2373cb0a94edca1fd34", size = 863535 }, - { url = "https://files.pythonhosted.org/packages/ee/4d/e910b70839d88d1c38ba806b0ddaa94b478cca8a09f4e7155b2b607c34b2/rapidfuzz-3.12.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9b1e6f48e1ffa0749261ee23a1c6462bdd0be5eac83093f4711de17a42ae78ad", size = 1860425 }, - { url = "https://files.pythonhosted.org/packages/fd/62/54914f63e185539fbcca65acb1f7c879740a278d240527ed5ddd40bd7690/rapidfuzz-3.12.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:1ae9ded463f2ca4ba1eb762913c5f14c23d2e120739a62b7f4cc102eab32dc90", size = 1369066 }, - { url = "https://files.pythonhosted.org/packages/56/4a/de2cfab279497d0b2529d3fec398f60cf8e27a51d667b6529081fbdb0af2/rapidfuzz-3.12.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dda45f47b559be72ecbce45c7f71dc7c97b9772630ab0f3286d97d2c3025ab71", size = 1365330 }, - { url = "https://files.pythonhosted.org/packages/dd/48/170c37cfdf04efa34e7cafc688a8517c9098c1d27e1513393ad71bf3165c/rapidfuzz-3.12.2-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3745c6443890265513a3c8777f2de4cb897aeb906a406f97741019be8ad5bcc", size = 5481251 }, - { url = "https://files.pythonhosted.org/packages/4e/2d/107c489443f6438780d2e40747d5880c8d9374a64e17487eb4085fe7f1f5/rapidfuzz-3.12.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36d3ef4f047ed1bc96fa29289f9e67a637ddca5e4f4d3dc7cb7f50eb33ec1664", size = 3060633 }, - { url = "https://files.pythonhosted.org/packages/09/f6/fa777f336629aee8938f3d5c95c09df38459d4eadbdbe34642889857fb6a/rapidfuzz-3.12.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:54bb69ebe5ca0bd7527357e348f16a4c0c52fe0c2fcc8a041010467dcb8385f7", size = 1555000 }, +version = "3.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/6895abc3a3d056b9698da3199b04c0e56226d530ae44a470edabf8b664f0/rapidfuzz-3.13.0.tar.gz", hash = "sha256:d2eaf3839e52cbcc0accbe9817a67b4b0fcf70aaeb229cfddc1c28061f9ce5d8", size = 57904226 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/17/9be9eff5a3c7dfc831c2511262082c6786dca2ce21aa8194eef1cb71d67a/rapidfuzz-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d395a5cad0c09c7f096433e5fd4224d83b53298d53499945a9b0e5a971a84f3a", size = 1999453 }, + { url = "https://files.pythonhosted.org/packages/75/67/62e57896ecbabe363f027d24cc769d55dd49019e576533ec10e492fcd8a2/rapidfuzz-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7b3eda607a019169f7187328a8d1648fb9a90265087f6903d7ee3a8eee01805", size = 1450881 }, + { url = "https://files.pythonhosted.org/packages/96/5c/691c5304857f3476a7b3df99e91efc32428cbe7d25d234e967cc08346c13/rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98e0bfa602e1942d542de077baf15d658bd9d5dcfe9b762aff791724c1c38b70", size = 1422990 }, + { url = "https://files.pythonhosted.org/packages/46/81/7a7e78f977496ee2d613154b86b203d373376bcaae5de7bde92f3ad5a192/rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bef86df6d59667d9655905b02770a0c776d2853971c0773767d5ef8077acd624", size = 5342309 }, + { url = "https://files.pythonhosted.org/packages/51/44/12fdd12a76b190fe94bf38d252bb28ddf0ab7a366b943e792803502901a2/rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fedd316c165beed6307bf754dee54d3faca2c47e1f3bcbd67595001dfa11e969", size = 1656881 }, + { url = "https://files.pythonhosted.org/packages/27/ae/0d933e660c06fcfb087a0d2492f98322f9348a28b2cc3791a5dbadf6e6fb/rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5158da7f2ec02a930be13bac53bb5903527c073c90ee37804090614cab83c29e", size = 1608494 }, + { url = "https://files.pythonhosted.org/packages/3d/2c/4b2f8aafdf9400e5599b6ed2f14bc26ca75f5a923571926ccbc998d4246a/rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b6f913ee4618ddb6d6f3e387b76e8ec2fc5efee313a128809fbd44e65c2bbb2", size = 3072160 }, + { url = "https://files.pythonhosted.org/packages/60/7d/030d68d9a653c301114101c3003b31ce01cf2c3224034cd26105224cd249/rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d25fdbce6459ccbbbf23b4b044f56fbd1158b97ac50994eaae2a1c0baae78301", size = 2491549 }, + { url = "https://files.pythonhosted.org/packages/8e/cd/7040ba538fc6a8ddc8816a05ecf46af9988b46c148ddd7f74fb0fb73d012/rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25343ccc589a4579fbde832e6a1e27258bfdd7f2eb0f28cb836d6694ab8591fc", size = 7584142 }, + { url = "https://files.pythonhosted.org/packages/c1/96/85f7536fbceb0aa92c04a1c37a3fc4fcd4e80649e9ed0fb585382df82edc/rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a9ad1f37894e3ffb76bbab76256e8a8b789657183870be11aa64e306bb5228fd", size = 2896234 }, + { url = "https://files.pythonhosted.org/packages/55/fd/460e78438e7019f2462fe9d4ecc880577ba340df7974c8a4cfe8d8d029df/rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5dc71ef23845bb6b62d194c39a97bb30ff171389c9812d83030c1199f319098c", size = 3437420 }, + { url = "https://files.pythonhosted.org/packages/cc/df/c3c308a106a0993befd140a414c5ea78789d201cf1dfffb8fd9749718d4f/rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b7f4c65facdb94f44be759bbd9b6dda1fa54d0d6169cdf1a209a5ab97d311a75", size = 4410860 }, + { url = "https://files.pythonhosted.org/packages/75/ee/9d4ece247f9b26936cdeaae600e494af587ce9bf8ddc47d88435f05cfd05/rapidfuzz-3.13.0-cp311-cp311-win32.whl", hash = "sha256:b5104b62711565e0ff6deab2a8f5dbf1fbe333c5155abe26d2cfd6f1849b6c87", size = 1843161 }, + { url = "https://files.pythonhosted.org/packages/c9/5a/d00e1f63564050a20279015acb29ecaf41646adfacc6ce2e1e450f7f2633/rapidfuzz-3.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:9093cdeb926deb32a4887ebe6910f57fbcdbc9fbfa52252c10b56ef2efb0289f", size = 1629962 }, + { url = "https://files.pythonhosted.org/packages/3b/74/0a3de18bc2576b794f41ccd07720b623e840fda219ab57091897f2320fdd/rapidfuzz-3.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:f70f646751b6aa9d05be1fb40372f006cc89d6aad54e9d79ae97bd1f5fce5203", size = 866631 }, + { url = "https://files.pythonhosted.org/packages/13/4b/a326f57a4efed8f5505b25102797a58e37ee11d94afd9d9422cb7c76117e/rapidfuzz-3.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a1a6a906ba62f2556372282b1ef37b26bca67e3d2ea957277cfcefc6275cca7", size = 1989501 }, + { url = "https://files.pythonhosted.org/packages/b7/53/1f7eb7ee83a06c400089ec7cb841cbd581c2edd7a4b21eb2f31030b88daa/rapidfuzz-3.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fd0975e015b05c79a97f38883a11236f5a24cca83aa992bd2558ceaa5652b26", size = 1445379 }, + { url = "https://files.pythonhosted.org/packages/07/09/de8069a4599cc8e6d194e5fa1782c561151dea7d5e2741767137e2a8c1f0/rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d4e13593d298c50c4f94ce453f757b4b398af3fa0fd2fde693c3e51195b7f69", size = 1405986 }, + { url = "https://files.pythonhosted.org/packages/5d/77/d9a90b39c16eca20d70fec4ca377fbe9ea4c0d358c6e4736ab0e0e78aaf6/rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed6f416bda1c9133000009d84d9409823eb2358df0950231cc936e4bf784eb97", size = 5310809 }, + { url = "https://files.pythonhosted.org/packages/1e/7d/14da291b0d0f22262d19522afaf63bccf39fc027c981233fb2137a57b71f/rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1dc82b6ed01acb536b94a43996a94471a218f4d89f3fdd9185ab496de4b2a981", size = 1629394 }, + { url = "https://files.pythonhosted.org/packages/b7/e4/79ed7e4fa58f37c0f8b7c0a62361f7089b221fe85738ae2dbcfb815e985a/rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9d824de871daa6e443b39ff495a884931970d567eb0dfa213d234337343835f", size = 1600544 }, + { url = "https://files.pythonhosted.org/packages/4e/20/e62b4d13ba851b0f36370060025de50a264d625f6b4c32899085ed51f980/rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d18228a2390375cf45726ce1af9d36ff3dc1f11dce9775eae1f1b13ac6ec50f", size = 3052796 }, + { url = "https://files.pythonhosted.org/packages/cd/8d/55fdf4387dec10aa177fe3df8dbb0d5022224d95f48664a21d6b62a5299d/rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f5fe634c9482ec5d4a6692afb8c45d370ae86755e5f57aa6c50bfe4ca2bdd87", size = 2464016 }, + { url = "https://files.pythonhosted.org/packages/9b/be/0872f6a56c0f473165d3b47d4170fa75263dc5f46985755aa9bf2bbcdea1/rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:694eb531889f71022b2be86f625a4209c4049e74be9ca836919b9e395d5e33b3", size = 7556725 }, + { url = "https://files.pythonhosted.org/packages/5d/f3/6c0750e484d885a14840c7a150926f425d524982aca989cdda0bb3bdfa57/rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:11b47b40650e06147dee5e51a9c9ad73bb7b86968b6f7d30e503b9f8dd1292db", size = 2859052 }, + { url = "https://files.pythonhosted.org/packages/6f/98/5a3a14701b5eb330f444f7883c9840b43fb29c575e292e09c90a270a6e07/rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:98b8107ff14f5af0243f27d236bcc6e1ef8e7e3b3c25df114e91e3a99572da73", size = 3390219 }, + { url = "https://files.pythonhosted.org/packages/e9/7d/f4642eaaeb474b19974332f2a58471803448be843033e5740965775760a5/rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b836f486dba0aceb2551e838ff3f514a38ee72b015364f739e526d720fdb823a", size = 4377924 }, + { url = "https://files.pythonhosted.org/packages/8e/83/fa33f61796731891c3e045d0cbca4436a5c436a170e7f04d42c2423652c3/rapidfuzz-3.13.0-cp312-cp312-win32.whl", hash = "sha256:4671ee300d1818d7bdfd8fa0608580d7778ba701817216f0c17fb29e6b972514", size = 1823915 }, + { url = "https://files.pythonhosted.org/packages/03/25/5ee7ab6841ca668567d0897905eebc79c76f6297b73bf05957be887e9c74/rapidfuzz-3.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e2065f68fb1d0bf65adc289c1bdc45ba7e464e406b319d67bb54441a1b9da9e", size = 1616985 }, + { url = "https://files.pythonhosted.org/packages/76/5e/3f0fb88db396cb692aefd631e4805854e02120a2382723b90dcae720bcc6/rapidfuzz-3.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:65cc97c2fc2c2fe23586599686f3b1ceeedeca8e598cfcc1b7e56dc8ca7e2aa7", size = 860116 }, + { url = "https://files.pythonhosted.org/packages/0a/76/606e71e4227790750f1646f3c5c873e18d6cfeb6f9a77b2b8c4dec8f0f66/rapidfuzz-3.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:09e908064d3684c541d312bd4c7b05acb99a2c764f6231bd507d4b4b65226c23", size = 1982282 }, + { url = "https://files.pythonhosted.org/packages/0a/f5/d0b48c6b902607a59fd5932a54e3518dae8223814db8349b0176e6e9444b/rapidfuzz-3.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:57c390336cb50d5d3bfb0cfe1467478a15733703af61f6dffb14b1cd312a6fae", size = 1439274 }, + { url = "https://files.pythonhosted.org/packages/59/cf/c3ac8c80d8ced6c1f99b5d9674d397ce5d0e9d0939d788d67c010e19c65f/rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0da54aa8547b3c2c188db3d1c7eb4d1bb6dd80baa8cdaeaec3d1da3346ec9caa", size = 1399854 }, + { url = "https://files.pythonhosted.org/packages/09/5d/ca8698e452b349c8313faf07bfa84e7d1c2d2edf7ccc67bcfc49bee1259a/rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df8e8c21e67afb9d7fbe18f42c6111fe155e801ab103c81109a61312927cc611", size = 5308962 }, + { url = "https://files.pythonhosted.org/packages/66/0a/bebada332854e78e68f3d6c05226b23faca79d71362509dbcf7b002e33b7/rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:461fd13250a2adf8e90ca9a0e1e166515cbcaa5e9c3b1f37545cbbeff9e77f6b", size = 1625016 }, + { url = "https://files.pythonhosted.org/packages/de/0c/9e58d4887b86d7121d1c519f7050d1be5eb189d8a8075f5417df6492b4f5/rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2b3dd5d206a12deca16870acc0d6e5036abeb70e3cad6549c294eff15591527", size = 1600414 }, + { url = "https://files.pythonhosted.org/packages/9b/df/6096bc669c1311568840bdcbb5a893edc972d1c8d2b4b4325c21d54da5b1/rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1343d745fbf4688e412d8f398c6e6d6f269db99a54456873f232ba2e7aeb4939", size = 3053179 }, + { url = "https://files.pythonhosted.org/packages/f9/46/5179c583b75fce3e65a5cd79a3561bd19abd54518cb7c483a89b284bf2b9/rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b1b065f370d54551dcc785c6f9eeb5bd517ae14c983d2784c064b3aa525896df", size = 2456856 }, + { url = "https://files.pythonhosted.org/packages/6b/64/e9804212e3286d027ac35bbb66603c9456c2bce23f823b67d2f5cabc05c1/rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:11b125d8edd67e767b2295eac6eb9afe0b1cdc82ea3d4b9257da4b8e06077798", size = 7567107 }, + { url = "https://files.pythonhosted.org/packages/8a/f2/7d69e7bf4daec62769b11757ffc31f69afb3ce248947aadbb109fefd9f65/rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c33f9c841630b2bb7e69a3fb5c84a854075bb812c47620978bddc591f764da3d", size = 2854192 }, + { url = "https://files.pythonhosted.org/packages/05/21/ab4ad7d7d0f653e6fe2e4ccf11d0245092bef94cdff587a21e534e57bda8/rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ae4574cb66cf1e85d32bb7e9ec45af5409c5b3970b7ceb8dea90168024127566", size = 3398876 }, + { url = "https://files.pythonhosted.org/packages/0f/a8/45bba94c2489cb1ee0130dcb46e1df4fa2c2b25269e21ffd15240a80322b/rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e05752418b24bbd411841b256344c26f57da1148c5509e34ea39c7eb5099ab72", size = 4377077 }, + { url = "https://files.pythonhosted.org/packages/0c/f3/5e0c6ae452cbb74e5436d3445467447e8c32f3021f48f93f15934b8cffc2/rapidfuzz-3.13.0-cp313-cp313-win32.whl", hash = "sha256:0e1d08cb884805a543f2de1f6744069495ef527e279e05370dd7c83416af83f8", size = 1822066 }, + { url = "https://files.pythonhosted.org/packages/96/e3/a98c25c4f74051df4dcf2f393176b8663bfd93c7afc6692c84e96de147a2/rapidfuzz-3.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9a7c6232be5f809cd39da30ee5d24e6cadd919831e6020ec6c2391f4c3bc9264", size = 1615100 }, + { url = "https://files.pythonhosted.org/packages/60/b1/05cd5e697c00cd46d7791915f571b38c8531f714832eff2c5e34537c49ee/rapidfuzz-3.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:3f32f15bacd1838c929b35c84b43618481e1b3d7a61b5ed2db0291b70ae88b53", size = 858976 }, + { url = "https://files.pythonhosted.org/packages/88/df/6060c5a9c879b302bd47a73fc012d0db37abf6544c57591bcbc3459673bd/rapidfuzz-3.13.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1ba007f4d35a45ee68656b2eb83b8715e11d0f90e5b9f02d615a8a321ff00c27", size = 1905935 }, + { url = "https://files.pythonhosted.org/packages/a2/6c/a0b819b829e20525ef1bd58fc776fb8d07a0c38d819e63ba2b7c311a2ed4/rapidfuzz-3.13.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d7a217310429b43be95b3b8ad7f8fc41aba341109dc91e978cd7c703f928c58f", size = 1383714 }, + { url = "https://files.pythonhosted.org/packages/6a/c1/3da3466cc8a9bfb9cd345ad221fac311143b6a9664b5af4adb95b5e6ce01/rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:558bf526bcd777de32b7885790a95a9548ffdcce68f704a81207be4a286c1095", size = 1367329 }, + { url = "https://files.pythonhosted.org/packages/da/f0/9f2a9043bfc4e66da256b15d728c5fc2d865edf0028824337f5edac36783/rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:202a87760f5145140d56153b193a797ae9338f7939eb16652dd7ff96f8faf64c", size = 5251057 }, + { url = "https://files.pythonhosted.org/packages/6a/ff/af2cb1d8acf9777d52487af5c6b34ce9d13381a753f991d95ecaca813407/rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcccc08f671646ccb1e413c773bb92e7bba789e3a1796fd49d23c12539fe2e4", size = 2992401 }, + { url = "https://files.pythonhosted.org/packages/c1/c5/c243b05a15a27b946180db0d1e4c999bef3f4221505dff9748f1f6c917be/rapidfuzz-3.13.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:1f219f1e3c3194d7a7de222f54450ce12bc907862ff9a8962d83061c1f923c86", size = 1553782 }, ] [[package]] @@ -2853,97 +2925,100 @@ wheels = [ [[package]] name = "rpds-py" -version = "0.24.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/b3/52b213298a0ba7097c7ea96bee95e1947aa84cc816d48cebb539770cdf41/rpds_py-0.24.0.tar.gz", hash = "sha256:772cc1b2cd963e7e17e6cc55fe0371fb9c704d63e44cacec7b9b7f523b78919e", size = 26863 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/80/e6/c1458bbfb257448fdb2528071f1f4e19e26798ed5ef6d47d7aab0cb69661/rpds_py-0.24.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2d3ee4615df36ab8eb16c2507b11e764dcc11fd350bbf4da16d09cda11fcedef", size = 377679 }, - { url = "https://files.pythonhosted.org/packages/dd/26/ea4181ef78f58b2c167548c6a833d7dc22408e5b3b181bda9dda440bb92d/rpds_py-0.24.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e13ae74a8a3a0c2f22f450f773e35f893484fcfacb00bb4344a7e0f4f48e1f97", size = 362571 }, - { url = "https://files.pythonhosted.org/packages/56/fa/1ec54dd492c64c280a2249a047fc3369e2789dc474eac20445ebfc72934b/rpds_py-0.24.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf86f72d705fc2ef776bb7dd9e5fbba79d7e1f3e258bf9377f8204ad0fc1c51e", size = 388012 }, - { url = "https://files.pythonhosted.org/packages/3a/be/bad8b0e0f7e58ef4973bb75e91c472a7d51da1977ed43b09989264bf065c/rpds_py-0.24.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c43583ea8517ed2e780a345dd9960896afc1327e8cf3ac8239c167530397440d", size = 394730 }, - { url = "https://files.pythonhosted.org/packages/35/56/ab417fc90c21826df048fc16e55316ac40876e4b790104ececcbce813d8f/rpds_py-0.24.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4cd031e63bc5f05bdcda120646a0d32f6d729486d0067f09d79c8db5368f4586", size = 448264 }, - { url = "https://files.pythonhosted.org/packages/b6/75/4c63862d5c05408589196c8440a35a14ea4ae337fa70ded1f03638373f06/rpds_py-0.24.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34d90ad8c045df9a4259c47d2e16a3f21fdb396665c94520dbfe8766e62187a4", size = 446813 }, - { url = "https://files.pythonhosted.org/packages/e7/0c/91cf17dffa9a38835869797a9f041056091ebba6a53963d3641207e3d467/rpds_py-0.24.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e838bf2bb0b91ee67bf2b889a1a841e5ecac06dd7a2b1ef4e6151e2ce155c7ae", size = 389438 }, - { url = "https://files.pythonhosted.org/packages/1b/b0/60e6c72727c978276e02851819f3986bc40668f115be72c1bc4d922c950f/rpds_py-0.24.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04ecf5c1ff4d589987b4d9882872f80ba13da7d42427234fce8f22efb43133bc", size = 420416 }, - { url = "https://files.pythonhosted.org/packages/a1/d7/f46f85b9f863fb59fd3c534b5c874c48bee86b19e93423b9da8784605415/rpds_py-0.24.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:630d3d8ea77eabd6cbcd2ea712e1c5cecb5b558d39547ac988351195db433f6c", size = 565236 }, - { url = "https://files.pythonhosted.org/packages/2a/d1/1467620ded6dd70afc45ec822cdf8dfe7139537780d1f3905de143deb6fd/rpds_py-0.24.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ebcb786b9ff30b994d5969213a8430cbb984cdd7ea9fd6df06663194bd3c450c", size = 592016 }, - { url = "https://files.pythonhosted.org/packages/5d/13/fb1ded2e6adfaa0c0833106c42feb290973f665300f4facd5bf5d7891d9c/rpds_py-0.24.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:174e46569968ddbbeb8a806d9922f17cd2b524aa753b468f35b97ff9c19cb718", size = 560123 }, - { url = "https://files.pythonhosted.org/packages/1e/df/09fc1857ac7cc2eb16465a7199c314cbce7edde53c8ef21d615410d7335b/rpds_py-0.24.0-cp311-cp311-win32.whl", hash = "sha256:5ef877fa3bbfb40b388a5ae1cb00636a624690dcb9a29a65267054c9ea86d88a", size = 222256 }, - { url = "https://files.pythonhosted.org/packages/ff/25/939b40bc4d54bf910e5ee60fb5af99262c92458f4948239e8c06b0b750e7/rpds_py-0.24.0-cp311-cp311-win_amd64.whl", hash = "sha256:e274f62cbd274359eff63e5c7e7274c913e8e09620f6a57aae66744b3df046d6", size = 234718 }, - { url = "https://files.pythonhosted.org/packages/1a/e0/1c55f4a3be5f1ca1a4fd1f3ff1504a1478c1ed48d84de24574c4fa87e921/rpds_py-0.24.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d8551e733626afec514b5d15befabea0dd70a343a9f23322860c4f16a9430205", size = 366945 }, - { url = "https://files.pythonhosted.org/packages/39/1b/a3501574fbf29118164314dbc800d568b8c1c7b3258b505360e8abb3902c/rpds_py-0.24.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e374c0ce0ca82e5b67cd61fb964077d40ec177dd2c4eda67dba130de09085c7", size = 351935 }, - { url = "https://files.pythonhosted.org/packages/dc/47/77d3d71c55f6a374edde29f1aca0b2e547325ed00a9da820cabbc9497d2b/rpds_py-0.24.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d69d003296df4840bd445a5d15fa5b6ff6ac40496f956a221c4d1f6f7b4bc4d9", size = 390817 }, - { url = "https://files.pythonhosted.org/packages/4e/ec/1e336ee27484379e19c7f9cc170f4217c608aee406d3ae3a2e45336bff36/rpds_py-0.24.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8212ff58ac6dfde49946bea57474a386cca3f7706fc72c25b772b9ca4af6b79e", size = 401983 }, - { url = "https://files.pythonhosted.org/packages/07/f8/39b65cbc272c635eaea6d393c2ad1ccc81c39eca2db6723a0ca4b2108fce/rpds_py-0.24.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:528927e63a70b4d5f3f5ccc1fa988a35456eb5d15f804d276709c33fc2f19bda", size = 451719 }, - { url = "https://files.pythonhosted.org/packages/32/05/05c2b27dd9c30432f31738afed0300659cb9415db0ff7429b05dfb09bbde/rpds_py-0.24.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a824d2c7a703ba6daaca848f9c3d5cb93af0505be505de70e7e66829affd676e", size = 442546 }, - { url = "https://files.pythonhosted.org/packages/7d/e0/19383c8b5d509bd741532a47821c3e96acf4543d0832beba41b4434bcc49/rpds_py-0.24.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d51febb7a114293ffd56c6cf4736cb31cd68c0fddd6aa303ed09ea5a48e029", size = 393695 }, - { url = "https://files.pythonhosted.org/packages/9d/15/39f14e96d94981d0275715ae8ea564772237f3fa89bc3c21e24de934f2c7/rpds_py-0.24.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3fab5f4a2c64a8fb64fc13b3d139848817a64d467dd6ed60dcdd6b479e7febc9", size = 427218 }, - { url = "https://files.pythonhosted.org/packages/22/b9/12da7124905a680f690da7a9de6f11de770b5e359f5649972f7181c8bf51/rpds_py-0.24.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9be4f99bee42ac107870c61dfdb294d912bf81c3c6d45538aad7aecab468b6b7", size = 568062 }, - { url = "https://files.pythonhosted.org/packages/88/17/75229017a2143d915f6f803721a6d721eca24f2659c5718a538afa276b4f/rpds_py-0.24.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:564c96b6076a98215af52f55efa90d8419cc2ef45d99e314fddefe816bc24f91", size = 596262 }, - { url = "https://files.pythonhosted.org/packages/aa/64/8e8a1d8bd1b6b638d6acb6d41ab2cec7f2067a5b8b4c9175703875159a7c/rpds_py-0.24.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:75a810b7664c17f24bf2ffd7f92416c00ec84b49bb68e6a0d93e542406336b56", size = 564306 }, - { url = "https://files.pythonhosted.org/packages/68/1c/a7eac8d8ed8cb234a9b1064647824c387753343c3fab6ed7c83481ed0be7/rpds_py-0.24.0-cp312-cp312-win32.whl", hash = "sha256:f6016bd950be4dcd047b7475fdf55fb1e1f59fc7403f387be0e8123e4a576d30", size = 224281 }, - { url = "https://files.pythonhosted.org/packages/bb/46/b8b5424d1d21f2f2f3f2d468660085318d4f74a8df8289e3dd6ad224d488/rpds_py-0.24.0-cp312-cp312-win_amd64.whl", hash = "sha256:998c01b8e71cf051c28f5d6f1187abbdf5cf45fc0efce5da6c06447cba997034", size = 239719 }, - { url = "https://files.pythonhosted.org/packages/9d/c3/3607abc770395bc6d5a00cb66385a5479fb8cd7416ddef90393b17ef4340/rpds_py-0.24.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3d2d8e4508e15fc05b31285c4b00ddf2e0eb94259c2dc896771966a163122a0c", size = 367072 }, - { url = "https://files.pythonhosted.org/packages/d8/35/8c7ee0fe465793e3af3298dc5a9f3013bd63e7a69df04ccfded8293a4982/rpds_py-0.24.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0f00c16e089282ad68a3820fd0c831c35d3194b7cdc31d6e469511d9bffc535c", size = 351919 }, - { url = "https://files.pythonhosted.org/packages/91/d3/7e1b972501eb5466b9aca46a9c31bcbbdc3ea5a076e9ab33f4438c1d069d/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:951cc481c0c395c4a08639a469d53b7d4afa252529a085418b82a6b43c45c240", size = 390360 }, - { url = "https://files.pythonhosted.org/packages/a2/a8/ccabb50d3c91c26ad01f9b09a6a3b03e4502ce51a33867c38446df9f896b/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c9ca89938dff18828a328af41ffdf3902405a19f4131c88e22e776a8e228c5a8", size = 400704 }, - { url = "https://files.pythonhosted.org/packages/53/ae/5fa5bf0f3bc6ce21b5ea88fc0ecd3a439e7cb09dd5f9ffb3dbe1b6894fc5/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed0ef550042a8dbcd657dfb284a8ee00f0ba269d3f2286b0493b15a5694f9fe8", size = 450839 }, - { url = "https://files.pythonhosted.org/packages/e3/ac/c4e18b36d9938247e2b54f6a03746f3183ca20e1edd7d3654796867f5100/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b2356688e5d958c4d5cb964af865bea84db29971d3e563fb78e46e20fe1848b", size = 441494 }, - { url = "https://files.pythonhosted.org/packages/bf/08/b543969c12a8f44db6c0f08ced009abf8f519191ca6985509e7c44102e3c/rpds_py-0.24.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78884d155fd15d9f64f5d6124b486f3d3f7fd7cd71a78e9670a0f6f6ca06fb2d", size = 393185 }, - { url = "https://files.pythonhosted.org/packages/da/7e/f6eb6a7042ce708f9dfc781832a86063cea8a125bbe451d663697b51944f/rpds_py-0.24.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6a4a535013aeeef13c5532f802708cecae8d66c282babb5cd916379b72110cf7", size = 426168 }, - { url = "https://files.pythonhosted.org/packages/38/b0/6cd2bb0509ac0b51af4bb138e145b7c4c902bb4b724d6fd143689d6e0383/rpds_py-0.24.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:84e0566f15cf4d769dade9b366b7b87c959be472c92dffb70462dd0844d7cbad", size = 567622 }, - { url = "https://files.pythonhosted.org/packages/64/b0/c401f4f077547d98e8b4c2ec6526a80e7cb04f519d416430ec1421ee9e0b/rpds_py-0.24.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:823e74ab6fbaa028ec89615ff6acb409e90ff45580c45920d4dfdddb069f2120", size = 595435 }, - { url = "https://files.pythonhosted.org/packages/9f/ec/7993b6e803294c87b61c85bd63e11142ccfb2373cf88a61ec602abcbf9d6/rpds_py-0.24.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c61a2cb0085c8783906b2f8b1f16a7e65777823c7f4d0a6aaffe26dc0d358dd9", size = 563762 }, - { url = "https://files.pythonhosted.org/packages/1f/29/4508003204cb2f461dc2b83dd85f8aa2b915bc98fe6046b9d50d4aa05401/rpds_py-0.24.0-cp313-cp313-win32.whl", hash = "sha256:60d9b630c8025b9458a9d114e3af579a2c54bd32df601c4581bd054e85258143", size = 223510 }, - { url = "https://files.pythonhosted.org/packages/f9/12/09e048d1814195e01f354155fb772fb0854bd3450b5f5a82224b3a319f0e/rpds_py-0.24.0-cp313-cp313-win_amd64.whl", hash = "sha256:6eea559077d29486c68218178ea946263b87f1c41ae7f996b1f30a983c476a5a", size = 239075 }, - { url = "https://files.pythonhosted.org/packages/d2/03/5027cde39bb2408d61e4dd0cf81f815949bb629932a6c8df1701d0257fc4/rpds_py-0.24.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:d09dc82af2d3c17e7dd17120b202a79b578d79f2b5424bda209d9966efeed114", size = 362974 }, - { url = "https://files.pythonhosted.org/packages/bf/10/24d374a2131b1ffafb783e436e770e42dfdb74b69a2cd25eba8c8b29d861/rpds_py-0.24.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5fc13b44de6419d1e7a7e592a4885b323fbc2f46e1f22151e3a8ed3b8b920405", size = 348730 }, - { url = "https://files.pythonhosted.org/packages/7a/d1/1ef88d0516d46cd8df12e5916966dbf716d5ec79b265eda56ba1b173398c/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c347a20d79cedc0a7bd51c4d4b7dbc613ca4e65a756b5c3e57ec84bd43505b47", size = 387627 }, - { url = "https://files.pythonhosted.org/packages/4e/35/07339051b8b901ecefd449ebf8e5522e92bcb95e1078818cbfd9db8e573c/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20f2712bd1cc26a3cc16c5a1bfee9ed1abc33d4cdf1aabd297fe0eb724df4272", size = 394094 }, - { url = "https://files.pythonhosted.org/packages/dc/62/ee89ece19e0ba322b08734e95441952062391065c157bbd4f8802316b4f1/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aad911555286884be1e427ef0dc0ba3929e6821cbeca2194b13dc415a462c7fd", size = 449639 }, - { url = "https://files.pythonhosted.org/packages/15/24/b30e9f9e71baa0b9dada3a4ab43d567c6b04a36d1cb531045f7a8a0a7439/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0aeb3329c1721c43c58cae274d7d2ca85c1690d89485d9c63a006cb79a85771a", size = 438584 }, - { url = "https://files.pythonhosted.org/packages/28/d9/49f7b8f3b4147db13961e19d5e30077cd0854ccc08487026d2cb2142aa4a/rpds_py-0.24.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a0f156e9509cee987283abd2296ec816225145a13ed0391df8f71bf1d789e2d", size = 391047 }, - { url = "https://files.pythonhosted.org/packages/49/b0/e66918d0972c33a259ba3cd7b7ff10ed8bd91dbcfcbec6367b21f026db75/rpds_py-0.24.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa6800adc8204ce898c8a424303969b7aa6a5e4ad2789c13f8648739830323b7", size = 418085 }, - { url = "https://files.pythonhosted.org/packages/e1/6b/99ed7ea0a94c7ae5520a21be77a82306aac9e4e715d4435076ead07d05c6/rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a18fc371e900a21d7392517c6f60fe859e802547309e94313cd8181ad9db004d", size = 564498 }, - { url = "https://files.pythonhosted.org/packages/28/26/1cacfee6b800e6fb5f91acecc2e52f17dbf8b0796a7c984b4568b6d70e38/rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:9168764133fd919f8dcca2ead66de0105f4ef5659cbb4fa044f7014bed9a1797", size = 590202 }, - { url = "https://files.pythonhosted.org/packages/a9/9e/57bd2f9fba04a37cef673f9a66b11ca8c43ccdd50d386c455cd4380fe461/rpds_py-0.24.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5f6e3cec44ba05ee5cbdebe92d052f69b63ae792e7d05f1020ac5e964394080c", size = 561771 }, - { url = "https://files.pythonhosted.org/packages/9f/cf/b719120f375ab970d1c297dbf8de1e3c9edd26fe92c0ed7178dd94b45992/rpds_py-0.24.0-cp313-cp313t-win32.whl", hash = "sha256:8ebc7e65ca4b111d928b669713865f021b7773350eeac4a31d3e70144297baba", size = 221195 }, - { url = "https://files.pythonhosted.org/packages/2d/e5/22865285789f3412ad0c3d7ec4dc0a3e86483b794be8a5d9ed5a19390900/rpds_py-0.24.0-cp313-cp313t-win_amd64.whl", hash = "sha256:675269d407a257b8c00a6b58205b72eec8231656506c56fd429d924ca00bb350", size = 237354 }, - { url = "https://files.pythonhosted.org/packages/65/53/40bcc246a8354530d51a26d2b5b9afd1deacfb0d79e67295cc74df362f52/rpds_py-0.24.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f9e0057a509e096e47c87f753136c9b10d7a91842d8042c2ee6866899a717c0d", size = 378386 }, - { url = "https://files.pythonhosted.org/packages/80/b0/5ea97dd2f53e3618560aa1f9674e896e63dff95a9b796879a201bc4c1f00/rpds_py-0.24.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6e109a454412ab82979c5b1b3aee0604eca4bbf9a02693bb9df027af2bfa91a", size = 363440 }, - { url = "https://files.pythonhosted.org/packages/57/9d/259b6eada6f747cdd60c9a5eb3efab15f6704c182547149926c38e5bd0d5/rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc1c892b1ec1f8cbd5da8de287577b455e388d9c328ad592eabbdcb6fc93bee5", size = 388816 }, - { url = "https://files.pythonhosted.org/packages/94/c1/faafc7183712f89f4b7620c3c15979ada13df137d35ef3011ae83e93b005/rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c39438c55983d48f4bb3487734d040e22dad200dab22c41e331cee145e7a50d", size = 395058 }, - { url = "https://files.pythonhosted.org/packages/6c/96/d7fa9d2a7b7604a61da201cc0306a355006254942093779d7121c64700ce/rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d7e8ce990ae17dda686f7e82fd41a055c668e13ddcf058e7fb5e9da20b57793", size = 448692 }, - { url = "https://files.pythonhosted.org/packages/96/37/a3146c6eebc65d6d8c96cc5ffdcdb6af2987412c789004213227fbe52467/rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9ea7f4174d2e4194289cb0c4e172d83e79a6404297ff95f2875cf9ac9bced8ba", size = 446462 }, - { url = "https://files.pythonhosted.org/packages/1f/13/6481dfd9ac7de43acdaaa416e3a7da40bc4bb8f5c6ca85e794100aa54596/rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb2954155bb8f63bb19d56d80e5e5320b61d71084617ed89efedb861a684baea", size = 390460 }, - { url = "https://files.pythonhosted.org/packages/61/e1/37e36bce65e109543cc4ff8d23206908649023549604fa2e7fbeba5342f7/rpds_py-0.24.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04f2b712a2206e13800a8136b07aaedc23af3facab84918e7aa89e4be0260032", size = 421609 }, - { url = "https://files.pythonhosted.org/packages/20/dd/1f1a923d6cd798b8582176aca8a0784676f1a0449fb6f07fce6ac1cdbfb6/rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:eda5c1e2a715a4cbbca2d6d304988460942551e4e5e3b7457b50943cd741626d", size = 565818 }, - { url = "https://files.pythonhosted.org/packages/56/ec/d8da6df6a1eb3a418944a17b1cb38dd430b9e5a2e972eafd2b06f10c7c46/rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:9abc80fe8c1f87218db116016de575a7998ab1629078c90840e8d11ab423ee25", size = 592627 }, - { url = "https://files.pythonhosted.org/packages/b3/14/c492b9c7d5dd133e13f211ddea6bb9870f99e4f73932f11aa00bc09a9be9/rpds_py-0.24.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6a727fd083009bc83eb83d6950f0c32b3c94c8b80a9b667c87f4bd1274ca30ba", size = 560885 }, +version = "0.25.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/a6/60184b7fc00dd3ca80ac635dd5b8577d444c57e8e8742cecabfacb829921/rpds_py-0.25.1.tar.gz", hash = "sha256:8960b6dac09b62dac26e75d7e2c4a22efb835d827a7278c34f72b2b84fa160e3", size = 27304 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/e1/df13fe3ddbbea43567e07437f097863b20c99318ae1f58a0fe389f763738/rpds_py-0.25.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5f048bbf18b1f9120685c6d6bb70cc1a52c8cc11bdd04e643d28d3be0baf666d", size = 373341 }, + { url = "https://files.pythonhosted.org/packages/7a/58/deef4d30fcbcbfef3b6d82d17c64490d5c94585a2310544ce8e2d3024f83/rpds_py-0.25.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4fbb0dbba559959fcb5d0735a0f87cdbca9e95dac87982e9b95c0f8f7ad10255", size = 359111 }, + { url = "https://files.pythonhosted.org/packages/bb/7e/39f1f4431b03e96ebaf159e29a0f82a77259d8f38b2dd474721eb3a8ac9b/rpds_py-0.25.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4ca54b9cf9d80b4016a67a0193ebe0bcf29f6b0a96f09db942087e294d3d4c2", size = 386112 }, + { url = "https://files.pythonhosted.org/packages/db/e7/847068a48d63aec2ae695a1646089620b3b03f8ccf9f02c122ebaf778f3c/rpds_py-0.25.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ee3e26eb83d39b886d2cb6e06ea701bba82ef30a0de044d34626ede51ec98b0", size = 400362 }, + { url = "https://files.pythonhosted.org/packages/3b/3d/9441d5db4343d0cee759a7ab4d67420a476cebb032081763de934719727b/rpds_py-0.25.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89706d0683c73a26f76a5315d893c051324d771196ae8b13e6ffa1ffaf5e574f", size = 522214 }, + { url = "https://files.pythonhosted.org/packages/a2/ec/2cc5b30d95f9f1a432c79c7a2f65d85e52812a8f6cbf8768724571710786/rpds_py-0.25.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2013ee878c76269c7b557a9a9c042335d732e89d482606990b70a839635feb7", size = 411491 }, + { url = "https://files.pythonhosted.org/packages/dc/6c/44695c1f035077a017dd472b6a3253553780837af2fac9b6ac25f6a5cb4d/rpds_py-0.25.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45e484db65e5380804afbec784522de84fa95e6bb92ef1bd3325d33d13efaebd", size = 386978 }, + { url = "https://files.pythonhosted.org/packages/b1/74/b4357090bb1096db5392157b4e7ed8bb2417dc7799200fcbaee633a032c9/rpds_py-0.25.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:48d64155d02127c249695abb87d39f0faf410733428d499867606be138161d65", size = 420662 }, + { url = "https://files.pythonhosted.org/packages/26/dd/8cadbebf47b96e59dfe8b35868e5c38a42272699324e95ed522da09d3a40/rpds_py-0.25.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:048893e902132fd6548a2e661fb38bf4896a89eea95ac5816cf443524a85556f", size = 563385 }, + { url = "https://files.pythonhosted.org/packages/c3/ea/92960bb7f0e7a57a5ab233662f12152085c7dc0d5468534c65991a3d48c9/rpds_py-0.25.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0317177b1e8691ab5879f4f33f4b6dc55ad3b344399e23df2e499de7b10a548d", size = 592047 }, + { url = "https://files.pythonhosted.org/packages/61/ad/71aabc93df0d05dabcb4b0c749277881f8e74548582d96aa1bf24379493a/rpds_py-0.25.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bffcf57826d77a4151962bf1701374e0fc87f536e56ec46f1abdd6a903354042", size = 557863 }, + { url = "https://files.pythonhosted.org/packages/93/0f/89df0067c41f122b90b76f3660028a466eb287cbe38efec3ea70e637ca78/rpds_py-0.25.1-cp311-cp311-win32.whl", hash = "sha256:cda776f1967cb304816173b30994faaf2fd5bcb37e73118a47964a02c348e1bc", size = 219627 }, + { url = "https://files.pythonhosted.org/packages/7c/8d/93b1a4c1baa903d0229374d9e7aa3466d751f1d65e268c52e6039c6e338e/rpds_py-0.25.1-cp311-cp311-win_amd64.whl", hash = "sha256:dc3c1ff0abc91444cd20ec643d0f805df9a3661fcacf9c95000329f3ddf268a4", size = 231603 }, + { url = "https://files.pythonhosted.org/packages/cb/11/392605e5247bead2f23e6888e77229fbd714ac241ebbebb39a1e822c8815/rpds_py-0.25.1-cp311-cp311-win_arm64.whl", hash = "sha256:5a3ddb74b0985c4387719fc536faced33cadf2172769540c62e2a94b7b9be1c4", size = 223967 }, + { url = "https://files.pythonhosted.org/packages/7f/81/28ab0408391b1dc57393653b6a0cf2014cc282cc2909e4615e63e58262be/rpds_py-0.25.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5ffe453cde61f73fea9430223c81d29e2fbf412a6073951102146c84e19e34c", size = 364647 }, + { url = "https://files.pythonhosted.org/packages/2c/9a/7797f04cad0d5e56310e1238434f71fc6939d0bc517192a18bb99a72a95f/rpds_py-0.25.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:115874ae5e2fdcfc16b2aedc95b5eef4aebe91b28e7e21951eda8a5dc0d3461b", size = 350454 }, + { url = "https://files.pythonhosted.org/packages/69/3c/93d2ef941b04898011e5d6eaa56a1acf46a3b4c9f4b3ad1bbcbafa0bee1f/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a714bf6e5e81b0e570d01f56e0c89c6375101b8463999ead3a93a5d2a4af91fa", size = 389665 }, + { url = "https://files.pythonhosted.org/packages/c1/57/ad0e31e928751dde8903a11102559628d24173428a0f85e25e187defb2c1/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:35634369325906bcd01577da4c19e3b9541a15e99f31e91a02d010816b49bfda", size = 403873 }, + { url = "https://files.pythonhosted.org/packages/16/ad/c0c652fa9bba778b4f54980a02962748479dc09632e1fd34e5282cf2556c/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4cb2b3ddc16710548801c6fcc0cfcdeeff9dafbc983f77265877793f2660309", size = 525866 }, + { url = "https://files.pythonhosted.org/packages/2a/39/3e1839bc527e6fcf48d5fec4770070f872cdee6c6fbc9b259932f4e88a38/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9ceca1cf097ed77e1a51f1dbc8d174d10cb5931c188a4505ff9f3e119dfe519b", size = 416886 }, + { url = "https://files.pythonhosted.org/packages/7a/95/dd6b91cd4560da41df9d7030a038298a67d24f8ca38e150562644c829c48/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2cd1a4b0c2b8c5e31ffff50d09f39906fe351389ba143c195566056c13a7ea", size = 390666 }, + { url = "https://files.pythonhosted.org/packages/64/48/1be88a820e7494ce0a15c2d390ccb7c52212370badabf128e6a7bb4cb802/rpds_py-0.25.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1de336a4b164c9188cb23f3703adb74a7623ab32d20090d0e9bf499a2203ad65", size = 425109 }, + { url = "https://files.pythonhosted.org/packages/cf/07/3e2a17927ef6d7720b9949ec1b37d1e963b829ad0387f7af18d923d5cfa5/rpds_py-0.25.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9fca84a15333e925dd59ce01da0ffe2ffe0d6e5d29a9eeba2148916d1824948c", size = 567244 }, + { url = "https://files.pythonhosted.org/packages/d2/e5/76cf010998deccc4f95305d827847e2eae9c568099c06b405cf96384762b/rpds_py-0.25.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:88ec04afe0c59fa64e2f6ea0dd9657e04fc83e38de90f6de201954b4d4eb59bd", size = 596023 }, + { url = "https://files.pythonhosted.org/packages/52/9a/df55efd84403736ba37a5a6377b70aad0fd1cb469a9109ee8a1e21299a1c/rpds_py-0.25.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8bd2f19e312ce3e1d2c635618e8a8d8132892bb746a7cf74780a489f0f6cdcb", size = 561634 }, + { url = "https://files.pythonhosted.org/packages/ab/aa/dc3620dd8db84454aaf9374bd318f1aa02578bba5e567f5bf6b79492aca4/rpds_py-0.25.1-cp312-cp312-win32.whl", hash = "sha256:e5e2f7280d8d0d3ef06f3ec1b4fd598d386cc6f0721e54f09109a8132182fbfe", size = 222713 }, + { url = "https://files.pythonhosted.org/packages/a3/7f/7cef485269a50ed5b4e9bae145f512d2a111ca638ae70cc101f661b4defd/rpds_py-0.25.1-cp312-cp312-win_amd64.whl", hash = "sha256:db58483f71c5db67d643857404da360dce3573031586034b7d59f245144cc192", size = 235280 }, + { url = "https://files.pythonhosted.org/packages/99/f2/c2d64f6564f32af913bf5f3f7ae41c7c263c5ae4c4e8f1a17af8af66cd46/rpds_py-0.25.1-cp312-cp312-win_arm64.whl", hash = "sha256:6d50841c425d16faf3206ddbba44c21aa3310a0cebc3c1cdfc3e3f4f9f6f5728", size = 225399 }, + { url = "https://files.pythonhosted.org/packages/2b/da/323848a2b62abe6a0fec16ebe199dc6889c5d0a332458da8985b2980dffe/rpds_py-0.25.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:659d87430a8c8c704d52d094f5ba6fa72ef13b4d385b7e542a08fc240cb4a559", size = 364498 }, + { url = "https://files.pythonhosted.org/packages/1f/b4/4d3820f731c80fd0cd823b3e95b9963fec681ae45ba35b5281a42382c67d/rpds_py-0.25.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68f6f060f0bbdfb0245267da014d3a6da9be127fe3e8cc4a68c6f833f8a23bb1", size = 350083 }, + { url = "https://files.pythonhosted.org/packages/d5/b1/3a8ee1c9d480e8493619a437dec685d005f706b69253286f50f498cbdbcf/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:083a9513a33e0b92cf6e7a6366036c6bb43ea595332c1ab5c8ae329e4bcc0a9c", size = 389023 }, + { url = "https://files.pythonhosted.org/packages/3b/31/17293edcfc934dc62c3bf74a0cb449ecd549531f956b72287203e6880b87/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:816568614ecb22b18a010c7a12559c19f6fe993526af88e95a76d5a60b8b75fb", size = 403283 }, + { url = "https://files.pythonhosted.org/packages/d1/ca/e0f0bc1a75a8925024f343258c8ecbd8828f8997ea2ac71e02f67b6f5299/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c6564c0947a7f52e4792983f8e6cf9bac140438ebf81f527a21d944f2fd0a40", size = 524634 }, + { url = "https://files.pythonhosted.org/packages/3e/03/5d0be919037178fff33a6672ffc0afa04ea1cfcb61afd4119d1b5280ff0f/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c4a128527fe415d73cf1f70a9a688d06130d5810be69f3b553bf7b45e8acf79", size = 416233 }, + { url = "https://files.pythonhosted.org/packages/05/7c/8abb70f9017a231c6c961a8941403ed6557664c0913e1bf413cbdc039e75/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a49e1d7a4978ed554f095430b89ecc23f42014a50ac385eb0c4d163ce213c325", size = 390375 }, + { url = "https://files.pythonhosted.org/packages/7a/ac/a87f339f0e066b9535074a9f403b9313fd3892d4a164d5d5f5875ac9f29f/rpds_py-0.25.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d74ec9bc0e2feb81d3f16946b005748119c0f52a153f6db6a29e8cd68636f295", size = 424537 }, + { url = "https://files.pythonhosted.org/packages/1f/8f/8d5c1567eaf8c8afe98a838dd24de5013ce6e8f53a01bd47fe8bb06b5533/rpds_py-0.25.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3af5b4cc10fa41e5bc64e5c198a1b2d2864337f8fcbb9a67e747e34002ce812b", size = 566425 }, + { url = "https://files.pythonhosted.org/packages/95/33/03016a6be5663b389c8ab0bbbcca68d9e96af14faeff0a04affcb587e776/rpds_py-0.25.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:79dc317a5f1c51fd9c6a0c4f48209c6b8526d0524a6904fc1076476e79b00f98", size = 595197 }, + { url = "https://files.pythonhosted.org/packages/33/8d/da9f4d3e208c82fda311bff0cf0a19579afceb77cf456e46c559a1c075ba/rpds_py-0.25.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1521031351865e0181bc585147624d66b3b00a84109b57fcb7a779c3ec3772cd", size = 561244 }, + { url = "https://files.pythonhosted.org/packages/e2/b3/39d5dcf7c5f742ecd6dbc88f6f84ae54184b92f5f387a4053be2107b17f1/rpds_py-0.25.1-cp313-cp313-win32.whl", hash = "sha256:5d473be2b13600b93a5675d78f59e63b51b1ba2d0476893415dfbb5477e65b31", size = 222254 }, + { url = "https://files.pythonhosted.org/packages/5f/19/2d6772c8eeb8302c5f834e6d0dfd83935a884e7c5ce16340c7eaf89ce925/rpds_py-0.25.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7b74e92a3b212390bdce1d93da9f6488c3878c1d434c5e751cbc202c5e09500", size = 234741 }, + { url = "https://files.pythonhosted.org/packages/5b/5a/145ada26cfaf86018d0eb304fe55eafdd4f0b6b84530246bb4a7c4fb5c4b/rpds_py-0.25.1-cp313-cp313-win_arm64.whl", hash = "sha256:dd326a81afe332ede08eb39ab75b301d5676802cdffd3a8f287a5f0b694dc3f5", size = 224830 }, + { url = "https://files.pythonhosted.org/packages/4b/ca/d435844829c384fd2c22754ff65889c5c556a675d2ed9eb0e148435c6690/rpds_py-0.25.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:a58d1ed49a94d4183483a3ce0af22f20318d4a1434acee255d683ad90bf78129", size = 359668 }, + { url = "https://files.pythonhosted.org/packages/1f/01/b056f21db3a09f89410d493d2f6614d87bb162499f98b649d1dbd2a81988/rpds_py-0.25.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f251bf23deb8332823aef1da169d5d89fa84c89f67bdfb566c49dea1fccfd50d", size = 345649 }, + { url = "https://files.pythonhosted.org/packages/e0/0f/e0d00dc991e3d40e03ca36383b44995126c36b3eafa0ccbbd19664709c88/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dbd586bfa270c1103ece2109314dd423df1fa3d9719928b5d09e4840cec0d72", size = 384776 }, + { url = "https://files.pythonhosted.org/packages/9f/a2/59374837f105f2ca79bde3c3cd1065b2f8c01678900924949f6392eab66d/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d273f136e912aa101a9274c3145dcbddbe4bac560e77e6d5b3c9f6e0ed06d34", size = 395131 }, + { url = "https://files.pythonhosted.org/packages/9c/dc/48e8d84887627a0fe0bac53f0b4631e90976fd5d35fff8be66b8e4f3916b/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:666fa7b1bd0a3810a7f18f6d3a25ccd8866291fbbc3c9b912b917a6715874bb9", size = 520942 }, + { url = "https://files.pythonhosted.org/packages/7c/f5/ee056966aeae401913d37befeeab57a4a43a4f00099e0a20297f17b8f00c/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:921954d7fbf3fccc7de8f717799304b14b6d9a45bbeec5a8d7408ccbf531faf5", size = 411330 }, + { url = "https://files.pythonhosted.org/packages/ab/74/b2cffb46a097cefe5d17f94ede7a174184b9d158a0aeb195f39f2c0361e8/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3d86373ff19ca0441ebeb696ef64cb58b8b5cbacffcda5a0ec2f3911732a194", size = 387339 }, + { url = "https://files.pythonhosted.org/packages/7f/9a/0ff0b375dcb5161c2b7054e7d0b7575f1680127505945f5cabaac890bc07/rpds_py-0.25.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c8980cde3bb8575e7c956a530f2c217c1d6aac453474bf3ea0f9c89868b531b6", size = 418077 }, + { url = "https://files.pythonhosted.org/packages/0d/a1/fda629bf20d6b698ae84c7c840cfb0e9e4200f664fc96e1f456f00e4ad6e/rpds_py-0.25.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8eb8c84ecea987a2523e057c0d950bcb3f789696c0499290b8d7b3107a719d78", size = 562441 }, + { url = "https://files.pythonhosted.org/packages/20/15/ce4b5257f654132f326f4acd87268e1006cc071e2c59794c5bdf4bebbb51/rpds_py-0.25.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:e43a005671a9ed5a650f3bc39e4dbccd6d4326b24fb5ea8be5f3a43a6f576c72", size = 590750 }, + { url = "https://files.pythonhosted.org/packages/fb/ab/e04bf58a8d375aeedb5268edcc835c6a660ebf79d4384d8e0889439448b0/rpds_py-0.25.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:58f77c60956501a4a627749a6dcb78dac522f249dd96b5c9f1c6af29bfacfb66", size = 558891 }, + { url = "https://files.pythonhosted.org/packages/90/82/cb8c6028a6ef6cd2b7991e2e4ced01c854b6236ecf51e81b64b569c43d73/rpds_py-0.25.1-cp313-cp313t-win32.whl", hash = "sha256:2cb9e5b5e26fc02c8a4345048cd9998c2aca7c2712bd1b36da0c72ee969a3523", size = 218718 }, + { url = "https://files.pythonhosted.org/packages/b6/97/5a4b59697111c89477d20ba8a44df9ca16b41e737fa569d5ae8bff99e650/rpds_py-0.25.1-cp313-cp313t-win_amd64.whl", hash = "sha256:401ca1c4a20cc0510d3435d89c069fe0a9ae2ee6495135ac46bdd49ec0495763", size = 232218 }, + { url = "https://files.pythonhosted.org/packages/49/74/48f3df0715a585cbf5d34919c9c757a4c92c1a9eba059f2d334e72471f70/rpds_py-0.25.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ee86d81551ec68a5c25373c5643d343150cc54672b5e9a0cafc93c1870a53954", size = 374208 }, + { url = "https://files.pythonhosted.org/packages/55/b0/9b01bb11ce01ec03d05e627249cc2c06039d6aa24ea5a22a39c312167c10/rpds_py-0.25.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89c24300cd4a8e4a51e55c31a8ff3918e6651b241ee8876a42cc2b2a078533ba", size = 359262 }, + { url = "https://files.pythonhosted.org/packages/a9/eb/5395621618f723ebd5116c53282052943a726dba111b49cd2071f785b665/rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:771c16060ff4e79584dc48902a91ba79fd93eade3aa3a12d6d2a4aadaf7d542b", size = 387366 }, + { url = "https://files.pythonhosted.org/packages/68/73/3d51442bdb246db619d75039a50ea1cf8b5b4ee250c3e5cd5c3af5981cd4/rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:785ffacd0ee61c3e60bdfde93baa6d7c10d86f15655bd706c89da08068dc5038", size = 400759 }, + { url = "https://files.pythonhosted.org/packages/b7/4c/3a32d5955d7e6cb117314597bc0f2224efc798428318b13073efe306512a/rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a40046a529cc15cef88ac5ab589f83f739e2d332cb4d7399072242400ed68c9", size = 523128 }, + { url = "https://files.pythonhosted.org/packages/be/95/1ffccd3b0bb901ae60b1dd4b1be2ab98bb4eb834cd9b15199888f5702f7b/rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:85fc223d9c76cabe5d0bff82214459189720dc135db45f9f66aa7cffbf9ff6c1", size = 411597 }, + { url = "https://files.pythonhosted.org/packages/ef/6d/6e6cd310180689db8b0d2de7f7d1eabf3fb013f239e156ae0d5a1a85c27f/rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0be9965f93c222fb9b4cc254235b3b2b215796c03ef5ee64f995b1b69af0762", size = 388053 }, + { url = "https://files.pythonhosted.org/packages/4a/87/ec4186b1fe6365ced6fa470960e68fc7804bafbe7c0cf5a36237aa240efa/rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8378fa4a940f3fb509c081e06cb7f7f2adae8cf46ef258b0e0ed7519facd573e", size = 421821 }, + { url = "https://files.pythonhosted.org/packages/7a/60/84f821f6bf4e0e710acc5039d91f8f594fae0d93fc368704920d8971680d/rpds_py-0.25.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:33358883a4490287e67a2c391dfaea4d9359860281db3292b6886bf0be3d8692", size = 564534 }, + { url = "https://files.pythonhosted.org/packages/41/3a/bc654eb15d3b38f9330fe0f545016ba154d89cdabc6177b0295910cd0ebe/rpds_py-0.25.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1d1fadd539298e70cac2f2cb36f5b8a65f742b9b9f1014dd4ea1f7785e2470bf", size = 592674 }, + { url = "https://files.pythonhosted.org/packages/2e/ba/31239736f29e4dfc7a58a45955c5db852864c306131fd6320aea214d5437/rpds_py-0.25.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9a46c2fb2545e21181445515960006e85d22025bd2fe6db23e76daec6eb689fe", size = 558781 }, ] [[package]] name = "rsa" -version = "4.9" +version = "4.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyasn1" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/aa/65/7d973b89c4d2351d7fb232c2e452547ddfa243e93131e7cfa766da627b52/rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21", size = 29711 } +sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034 } wheels = [ - { url = "https://files.pythonhosted.org/packages/49/97/fa78e3d2f65c02c8e1268b9aba606569fe97f6c8f7c2d74394553347c145/rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", size = 34315 }, + { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696 }, ] [[package]] name = "ruamel-yaml" -version = "0.18.10" +version = "0.18.11" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ruamel-yaml-clib", marker = "python_full_version < '3.13' and platform_python_implementation == 'CPython'" }, + { name = "ruamel-yaml-clib", marker = "platform_python_implementation == 'CPython'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ea/46/f44d8be06b85bc7c4d8c95d658be2b68f27711f279bf9dd0612a5e4794f5/ruamel.yaml-0.18.10.tar.gz", hash = "sha256:20c86ab29ac2153f80a428e1254a8adf686d3383df04490514ca3b79a362db58", size = 143447 } +sdist = { url = "https://files.pythonhosted.org/packages/9d/8f/dfbab2d5ec83da0605ab935fb43ffa8ab5828455e2c910b7314fdd18e0b8/ruamel.yaml-0.18.11.tar.gz", hash = "sha256:b586a3416676566ed45bf679a0909719f7ea7b58c03a9b6e03f905a1e2cd5076", size = 144299 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/36/dfc1ebc0081e6d39924a2cc53654497f967a084a436bb64402dfce4254d9/ruamel.yaml-0.18.10-py3-none-any.whl", hash = "sha256:30f22513ab2301b3d2b577adc121c6471f28734d3d9728581245f1e76468b4f1", size = 117729 }, + { url = "https://files.pythonhosted.org/packages/2e/62/615a16ebbca43fd4434843e9d346d795a134d0a1ff46101c858d93c9778d/ruamel.yaml-0.18.11-py3-none-any.whl", hash = "sha256:eca06c9fce6ee3220845c4c54e58376586e041a6127e4d1958e12a3142084897", size = 118313 }, ] [[package]] @@ -2983,27 +3058,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.11.8" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/f6/adcf73711f31c9f5393862b4281c875a462d9f639f4ccdf69dc368311c20/ruff-0.11.8.tar.gz", hash = "sha256:6d742d10626f9004b781f4558154bb226620a7242080e11caeffab1a40e99df8", size = 4086399 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/60/c6aa9062fa518a9f86cb0b85248245cddcd892a125ca00441df77d79ef88/ruff-0.11.8-py3-none-linux_armv6l.whl", hash = "sha256:896a37516c594805e34020c4a7546c8f8a234b679a7716a3f08197f38913e1a3", size = 10272473 }, - { url = "https://files.pythonhosted.org/packages/a0/e4/0325e50d106dc87c00695f7bcd5044c6d252ed5120ebf423773e00270f50/ruff-0.11.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ab86d22d3d721a40dd3ecbb5e86ab03b2e053bc93c700dc68d1c3346b36ce835", size = 11040862 }, - { url = "https://files.pythonhosted.org/packages/e6/27/b87ea1a7be37fef0adbc7fd987abbf90b6607d96aa3fc67e2c5b858e1e53/ruff-0.11.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:258f3585057508d317610e8a412788cf726efeefa2fec4dba4001d9e6f90d46c", size = 10385273 }, - { url = "https://files.pythonhosted.org/packages/d3/f7/3346161570d789045ed47a86110183f6ac3af0e94e7fd682772d89f7f1a1/ruff-0.11.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:727d01702f7c30baed3fc3a34901a640001a2828c793525043c29f7614994a8c", size = 10578330 }, - { url = "https://files.pythonhosted.org/packages/c6/c3/327fb950b4763c7b3784f91d3038ef10c13b2d42322d4ade5ce13a2f9edb/ruff-0.11.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3dca977cc4fc8f66e89900fa415ffe4dbc2e969da9d7a54bfca81a128c5ac219", size = 10122223 }, - { url = "https://files.pythonhosted.org/packages/de/c7/ba686bce9adfeb6c61cb1bbadc17d58110fe1d602f199d79d4c880170f19/ruff-0.11.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c657fa987d60b104d2be8b052d66da0a2a88f9bd1d66b2254333e84ea2720c7f", size = 11697353 }, - { url = "https://files.pythonhosted.org/packages/53/8e/a4fb4a1ddde3c59e73996bb3ac51844ff93384d533629434b1def7a336b0/ruff-0.11.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f2e74b021d0de5eceb8bd32919f6ff8a9b40ee62ed97becd44993ae5b9949474", size = 12375936 }, - { url = "https://files.pythonhosted.org/packages/ad/a1/9529cb1e2936e2479a51aeb011307e7229225df9ac64ae064d91ead54571/ruff-0.11.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9b5ef39820abc0f2c62111f7045009e46b275f5b99d5e59dda113c39b7f4f38", size = 11850083 }, - { url = "https://files.pythonhosted.org/packages/3e/94/8f7eac4c612673ae15a4ad2bc0ee62e03c68a2d4f458daae3de0e47c67ba/ruff-0.11.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1dba3135ca503727aa4648152c0fa67c3b1385d3dc81c75cd8a229c4b2a1458", size = 14005834 }, - { url = "https://files.pythonhosted.org/packages/1e/7c/6f63b46b2be870cbf3f54c9c4154d13fac4b8827f22fa05ac835c10835b2/ruff-0.11.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f024d32e62faad0f76b2d6afd141b8c171515e4fb91ce9fd6464335c81244e5", size = 11503713 }, - { url = "https://files.pythonhosted.org/packages/3a/91/57de411b544b5fe072779678986a021d87c3ee5b89551f2ca41200c5d643/ruff-0.11.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:d365618d3ad747432e1ae50d61775b78c055fee5936d77fb4d92c6f559741948", size = 10457182 }, - { url = "https://files.pythonhosted.org/packages/01/49/cfe73e0ce5ecdd3e6f1137bf1f1be03dcc819d1bfe5cff33deb40c5926db/ruff-0.11.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4d9aaa91035bdf612c8ee7266153bcf16005c7c7e2f5878406911c92a31633cb", size = 10101027 }, - { url = "https://files.pythonhosted.org/packages/56/21/a5cfe47c62b3531675795f38a0ef1c52ff8de62eaddf370d46634391a3fb/ruff-0.11.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0eba551324733efc76116d9f3a0d52946bc2751f0cd30661564117d6fd60897c", size = 11111298 }, - { url = "https://files.pythonhosted.org/packages/36/98/f76225f87e88f7cb669ae92c062b11c0a1e91f32705f829bd426f8e48b7b/ruff-0.11.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:161eb4cff5cfefdb6c9b8b3671d09f7def2f960cee33481dd898caf2bcd02304", size = 11566884 }, - { url = "https://files.pythonhosted.org/packages/de/7e/fff70b02e57852fda17bd43f99dda37b9bcf3e1af3d97c5834ff48d04715/ruff-0.11.8-py3-none-win32.whl", hash = "sha256:5b18caa297a786465cc511d7f8be19226acf9c0a1127e06e736cd4e1878c3ea2", size = 10451102 }, - { url = "https://files.pythonhosted.org/packages/7b/a9/eaa571eb70648c9bde3120a1d5892597de57766e376b831b06e7c1e43945/ruff-0.11.8-py3-none-win_amd64.whl", hash = "sha256:6e70d11043bef637c5617297bdedec9632af15d53ac1e1ba29c448da9341b0c4", size = 11597410 }, - { url = "https://files.pythonhosted.org/packages/cd/be/f6b790d6ae98f1f32c645f8540d5c96248b72343b0a56fab3a07f2941897/ruff-0.11.8-py3-none-win_arm64.whl", hash = "sha256:304432e4c4a792e3da85b7699feb3426a0908ab98bf29df22a31b0cdd098fac2", size = 10713129 }, +version = "0.11.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/53/ae4857030d59286924a8bdb30d213d6ff22d8f0957e738d0289990091dd8/ruff-0.11.11.tar.gz", hash = "sha256:7774173cc7c1980e6bf67569ebb7085989a78a103922fb83ef3dfe230cd0687d", size = 4186707 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/14/f2326676197bab099e2a24473158c21656fbf6a207c65f596ae15acb32b9/ruff-0.11.11-py3-none-linux_armv6l.whl", hash = "sha256:9924e5ae54125ed8958a4f7de320dab7380f6e9fa3195e3dc3b137c6842a0092", size = 10229049 }, + { url = "https://files.pythonhosted.org/packages/9a/f3/bff7c92dd66c959e711688b2e0768e486bbca46b2f35ac319bb6cce04447/ruff-0.11.11-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c8a93276393d91e952f790148eb226658dd275cddfde96c6ca304873f11d2ae4", size = 11053601 }, + { url = "https://files.pythonhosted.org/packages/e2/38/8e1a3efd0ef9d8259346f986b77de0f62c7a5ff4a76563b6b39b68f793b9/ruff-0.11.11-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d6e333dbe2e6ae84cdedefa943dfd6434753ad321764fd937eef9d6b62022bcd", size = 10367421 }, + { url = "https://files.pythonhosted.org/packages/b4/50/557ad9dd4fb9d0bf524ec83a090a3932d284d1a8b48b5906b13b72800e5f/ruff-0.11.11-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7885d9a5e4c77b24e8c88aba8c80be9255fa22ab326019dac2356cff42089fc6", size = 10581980 }, + { url = "https://files.pythonhosted.org/packages/c4/b2/e2ed82d6e2739ece94f1bdbbd1d81b712d3cdaf69f0a1d1f1a116b33f9ad/ruff-0.11.11-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1b5ab797fcc09121ed82e9b12b6f27e34859e4227080a42d090881be888755d4", size = 10089241 }, + { url = "https://files.pythonhosted.org/packages/3d/9f/b4539f037a5302c450d7c695c82f80e98e48d0d667ecc250e6bdeb49b5c3/ruff-0.11.11-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e231ff3132c1119ece836487a02785f099a43992b95c2f62847d29bace3c75ac", size = 11699398 }, + { url = "https://files.pythonhosted.org/packages/61/fb/32e029d2c0b17df65e6eaa5ce7aea5fbeaed22dddd9fcfbbf5fe37c6e44e/ruff-0.11.11-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:a97c9babe1d4081037a90289986925726b802d180cca784ac8da2bbbc335f709", size = 12427955 }, + { url = "https://files.pythonhosted.org/packages/6e/e3/160488dbb11f18c8121cfd588e38095ba779ae208292765972f7732bfd95/ruff-0.11.11-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8c4ddcbe8a19f59f57fd814b8b117d4fcea9bee7c0492e6cf5fdc22cfa563c8", size = 12069803 }, + { url = "https://files.pythonhosted.org/packages/ff/16/3b006a875f84b3d0bff24bef26b8b3591454903f6f754b3f0a318589dcc3/ruff-0.11.11-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6224076c344a7694c6fbbb70d4f2a7b730f6d47d2a9dc1e7f9d9bb583faf390b", size = 11242630 }, + { url = "https://files.pythonhosted.org/packages/65/0d/0338bb8ac0b97175c2d533e9c8cdc127166de7eb16d028a43c5ab9e75abd/ruff-0.11.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:882821fcdf7ae8db7a951df1903d9cb032bbe838852e5fc3c2b6c3ab54e39875", size = 11507310 }, + { url = "https://files.pythonhosted.org/packages/6f/bf/d7130eb26174ce9b02348b9f86d5874eafbf9f68e5152e15e8e0a392e4a3/ruff-0.11.11-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:dcec2d50756463d9df075a26a85a6affbc1b0148873da3997286caf1ce03cae1", size = 10441144 }, + { url = "https://files.pythonhosted.org/packages/b3/f3/4be2453b258c092ff7b1761987cf0749e70ca1340cd1bfb4def08a70e8d8/ruff-0.11.11-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:99c28505ecbaeb6594701a74e395b187ee083ee26478c1a795d35084d53ebd81", size = 10081987 }, + { url = "https://files.pythonhosted.org/packages/6c/6e/dfa4d2030c5b5c13db158219f2ec67bf333e8a7748dccf34cfa2a6ab9ebc/ruff-0.11.11-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9263f9e5aa4ff1dec765e99810f1cc53f0c868c5329b69f13845f699fe74f639", size = 11073922 }, + { url = "https://files.pythonhosted.org/packages/ff/f4/f7b0b0c3d32b593a20ed8010fa2c1a01f2ce91e79dda6119fcc51d26c67b/ruff-0.11.11-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:64ac6f885e3ecb2fdbb71de2701d4e34526651f1e8503af8fb30d4915a3fe345", size = 11568537 }, + { url = "https://files.pythonhosted.org/packages/d2/46/0e892064d0adc18bcc81deed9aaa9942a27fd2cd9b1b7791111ce468c25f/ruff-0.11.11-py3-none-win32.whl", hash = "sha256:1adcb9a18802268aaa891ffb67b1c94cd70578f126637118e8099b8e4adcf112", size = 10536492 }, + { url = "https://files.pythonhosted.org/packages/1b/d9/232e79459850b9f327e9f1dc9c047a2a38a6f9689e1ec30024841fc4416c/ruff-0.11.11-py3-none-win_amd64.whl", hash = "sha256:748b4bb245f11e91a04a4ff0f96e386711df0a30412b9fe0c74d5bdc0e4a531f", size = 11612562 }, + { url = "https://files.pythonhosted.org/packages/ce/eb/09c132cff3cc30b2e7244191dcce69437352d6d6709c0adf374f3e6f476e/ruff-0.11.11-py3-none-win_arm64.whl", hash = "sha256:6c51f136c0364ab1b774767aa8b86331bd8e9d414e2d107db7a2189f35ea1f7b", size = 10735951 }, ] [[package]] @@ -3022,13 +3097,14 @@ wheels = [ [[package]] name = "safety" -version = "3.3.1" +version = "3.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "authlib" }, { name = "click" }, { name = "dparse" }, { name = "filelock" }, + { name = "httpx" }, { name = "jinja2" }, { name = "marshmallow" }, { name = "nltk" }, @@ -3039,17 +3115,19 @@ dependencies = [ { name = "ruamel-yaml" }, { name = "safety-schemas" }, { name = "setuptools" }, + { name = "tenacity" }, + { name = "tomlkit" }, { name = "typer" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dc/55/873096606ff9cfad99cb3de8377461fb05217f65ad0690b9fe6a6e3afe95/safety-3.3.1.tar.gz", hash = "sha256:679834432d0ad64c54e0b864ac6715d4743a65f8db67512380ee7ee2011c206a", size = 219199 } +sdist = { url = "https://files.pythonhosted.org/packages/c2/31/e4875edebb8fd5885ff8e52d0522c44a4d9bc2abe26f11225b8e64b31868/safety-3.5.0.tar.gz", hash = "sha256:7223af388bde5323867eca5495f9817746289be9fd5b1896f168dc7082ea8ff1", size = 272371 } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/cc/9b0f8c95457aa1207c35eb5e8cf283c53ef115dc9cbf132475754ce31e4e/safety-3.3.1-py3-none-any.whl", hash = "sha256:243355a961403b873c1504e3e6f79ce36b86881d559722595632d788aa92b7ea", size = 206229 }, + { url = "https://files.pythonhosted.org/packages/b5/02/e7ef5f2d3a206771e885c25376d4515da8d4adfdd59ed526e847ddeee245/safety-3.5.0-py3-none-any.whl", hash = "sha256:b002e863e6e6bf111a1aafdf60e3a0378f8bc66221a3628c2230c7f2617c522e", size = 270668 }, ] [[package]] name = "safety-schemas" -version = "0.0.11" +version = "0.0.14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "dparse" }, @@ -3058,14 +3136,14 @@ dependencies = [ { name = "ruamel-yaml" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/91/a2/e75f7de6a0872ed80b4b09221a9640d5856a8c3730ba59534d3007c9ae3a/safety_schemas-0.0.11.tar.gz", hash = "sha256:10804372e077ca5a95e740cc507e73d9173663284006fcaaf5756179ba13ac9d", size = 43640 } +sdist = { url = "https://files.pythonhosted.org/packages/04/40/e5107b3e456ca4b78d1c0d5bd07be3377e673cc54949b18e5f3aed345067/safety_schemas-0.0.14.tar.gz", hash = "sha256:49953f7a59e919572be25595a8946f9cbbcd2066fe3e160c9467d9d1d6d7af6a", size = 53216 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1d/d5/4dc73cac358d75fbc0af4a5a2579393a4d0a65d51e93d234d7813b0216d9/safety_schemas-0.0.11-py3-none-any.whl", hash = "sha256:2af940c1c992d6891a6b84403a7c12fd445e20651752b1818b86c205690b3e03", size = 29114 }, + { url = "https://files.pythonhosted.org/packages/1f/7f/f3d1ac7eb0a6546eda3e82c0487233cea0774e511239769945dbd1dd01de/safety_schemas-0.0.14-py3-none-any.whl", hash = "sha256:0bf6fc4aa5e474651b714cc9e427c862792946bf052b61d5c7bec4eac4c0f254", size = 39268 }, ] [[package]] name = "segy" -version = "0.4.0" +version = "0.4.1.post2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "fsspec" }, @@ -3077,18 +3155,18 @@ dependencies = [ { name = "rapidfuzz" }, { name = "typer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/89/da/3bc5baf7f6fc10472a8833e8d9977094b9c8bd3f0f9306f22002ca7a0fda/segy-0.4.0.tar.gz", hash = "sha256:bf2d17dbf32e5cc86c443cf28b19ed90c67edad8ea6c69da39d0167f31d30daf", size = 43803 } +sdist = { url = "https://files.pythonhosted.org/packages/c7/99/b9a14e89212fac2895b1066fe4aae693e347c19497d229c477f9a37500a6/segy-0.4.1.post2.tar.gz", hash = "sha256:e45ab7d6008bd75e490638143329992a61af57916e064086ce559e77e62500e3", size = 60184 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/dc/11b184b4d75e56a3f671a93108dc49a775fc680280a5a06cc69d006eba62/segy-0.4.0-py3-none-any.whl", hash = "sha256:e6bb1419a6d916f5c5edd68b2a6162dcd3f7ee0ffa7f66342b950cecbc0dcf20", size = 53891 }, + { url = "https://files.pythonhosted.org/packages/90/b2/de392b38bc828b7fed331b329b41282a114eb55d8a54136726afe904effe/segy-0.4.1.post2-py3-none-any.whl", hash = "sha256:2269799ddfa57eb4adef278f0e14b7828c1fd8b192ee9ad4e355ec6fdbe6dd12", size = 54514 }, ] [[package]] name = "setuptools" -version = "78.1.0" +version = "80.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/5a/0db4da3bc908df06e5efae42b44e75c81dd52716e10192ff36d0c1c8e379/setuptools-78.1.0.tar.gz", hash = "sha256:18fd474d4a82a5f83dac888df697af65afa82dec7323d09c3e37d1f14288da54", size = 1367827 } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958 } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/21/f43f0a1fa8b06b32812e0975981f4677d28e0f3271601dc88ac5a5b83220/setuptools-78.1.0-py3-none-any.whl", hash = "sha256:3e386e96793c8702ae83d17b853fb93d3e09ef82ec62722e61da5cd22376dcd8", size = 1256108 }, + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486 }, ] [[package]] @@ -3120,11 +3198,11 @@ wheels = [ [[package]] name = "snowballstemmer" -version = "2.2.0" +version = "3.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/44/7b/af302bebf22c749c56c9c3e8ae13190b5b5db37a33d9068652e8f73b7089/snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", size = 86699 } +sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/dc/c02e01294f7265e63a7315fe086dd1df7dacb9f840a804da846b96d01b96/snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a", size = 93002 }, + { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274 }, ] [[package]] @@ -3138,11 +3216,11 @@ wheels = [ [[package]] name = "soupsieve" -version = "2.6" +version = "2.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/ce/fbaeed4f9fb8b2daa961f90591662df6a86c1abf25c548329a86920aedfb/soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", size = 101569 } +sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/c2/fe97d779f3ef3b15f05c94a2f1e3d21732574ed441687474db9d342a7315/soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9", size = 36186 }, + { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677 }, ] [[package]] @@ -3296,39 +3374,39 @@ wheels = [ [[package]] name = "sqlalchemy" -version = "2.0.40" +version = "2.0.41" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/c3/3f2bfa5e4dcd9938405fe2fab5b6ab94a9248a4f9536ea2fd497da20525f/sqlalchemy-2.0.40.tar.gz", hash = "sha256:d827099289c64589418ebbcaead0145cd19f4e3e8a93919a0100247af245fa00", size = 9664299 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/77/7e/55044a9ec48c3249bb38d5faae93f09579c35e862bb318ebd1ed7a1994a5/sqlalchemy-2.0.40-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f6bacab7514de6146a1976bc56e1545bee247242fab030b89e5f70336fc0003e", size = 2114025 }, - { url = "https://files.pythonhosted.org/packages/77/0f/dcf7bba95f847aec72f638750747b12d37914f71c8cc7c133cf326ab945c/sqlalchemy-2.0.40-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5654d1ac34e922b6c5711631f2da497d3a7bffd6f9f87ac23b35feea56098011", size = 2104419 }, - { url = "https://files.pythonhosted.org/packages/75/70/c86a5c20715e4fe903dde4c2fd44fc7e7a0d5fb52c1b954d98526f65a3ea/sqlalchemy-2.0.40-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35904d63412db21088739510216e9349e335f142ce4a04b69e2528020ee19ed4", size = 3222720 }, - { url = "https://files.pythonhosted.org/packages/12/cf/b891a8c1d0c27ce9163361664c2128c7a57de3f35000ea5202eb3a2917b7/sqlalchemy-2.0.40-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c7a80ed86d6aaacb8160a1caef6680d4ddd03c944d985aecee940d168c411d1", size = 3222682 }, - { url = "https://files.pythonhosted.org/packages/15/3f/7709d8c8266953d945435a96b7f425ae4172a336963756b58e996fbef7f3/sqlalchemy-2.0.40-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:519624685a51525ddaa7d8ba8265a1540442a2ec71476f0e75241eb8263d6f51", size = 3159542 }, - { url = "https://files.pythonhosted.org/packages/85/7e/717eaabaf0f80a0132dc2032ea8f745b7a0914451c984821a7c8737fb75a/sqlalchemy-2.0.40-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2ee5f9999a5b0e9689bed96e60ee53c3384f1a05c2dd8068cc2e8361b0df5b7a", size = 3179864 }, - { url = "https://files.pythonhosted.org/packages/e4/cc/03eb5dfcdb575cbecd2bd82487b9848f250a4b6ecfb4707e834b4ce4ec07/sqlalchemy-2.0.40-cp311-cp311-win32.whl", hash = "sha256:c0cae71e20e3c02c52f6b9e9722bca70e4a90a466d59477822739dc31ac18b4b", size = 2084675 }, - { url = "https://files.pythonhosted.org/packages/9a/48/440946bf9dc4dc231f4f31ef0d316f7135bf41d4b86aaba0c0655150d370/sqlalchemy-2.0.40-cp311-cp311-win_amd64.whl", hash = "sha256:574aea2c54d8f1dd1699449f332c7d9b71c339e04ae50163a3eb5ce4c4325ee4", size = 2110099 }, - { url = "https://files.pythonhosted.org/packages/92/06/552c1f92e880b57d8b92ce6619bd569b25cead492389b1d84904b55989d8/sqlalchemy-2.0.40-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9d3b31d0a1c44b74d3ae27a3de422dfccd2b8f0b75e51ecb2faa2bf65ab1ba0d", size = 2112620 }, - { url = "https://files.pythonhosted.org/packages/01/72/a5bc6e76c34cebc071f758161dbe1453de8815ae6e662393910d3be6d70d/sqlalchemy-2.0.40-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:37f7a0f506cf78c80450ed1e816978643d3969f99c4ac6b01104a6fe95c5490a", size = 2103004 }, - { url = "https://files.pythonhosted.org/packages/bf/fd/0e96c8e6767618ed1a06e4d7a167fe13734c2f8113c4cb704443e6783038/sqlalchemy-2.0.40-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bb933a650323e476a2e4fbef8997a10d0003d4da996aad3fd7873e962fdde4d", size = 3252440 }, - { url = "https://files.pythonhosted.org/packages/cd/6a/eb82e45b15a64266a2917a6833b51a334ea3c1991728fd905bfccbf5cf63/sqlalchemy-2.0.40-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6959738971b4745eea16f818a2cd086fb35081383b078272c35ece2b07012716", size = 3263277 }, - { url = "https://files.pythonhosted.org/packages/45/97/ebe41ab4530f50af99e3995ebd4e0204bf1b0dc0930f32250dde19c389fe/sqlalchemy-2.0.40-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:110179728e442dae85dd39591beb74072ae4ad55a44eda2acc6ec98ead80d5f2", size = 3198591 }, - { url = "https://files.pythonhosted.org/packages/e6/1c/a569c1b2b2f5ac20ba6846a1321a2bf52e9a4061001f282bf1c5528dcd69/sqlalchemy-2.0.40-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8040680eaacdce4d635f12c55c714f3d4c7f57da2bc47a01229d115bd319191", size = 3225199 }, - { url = "https://files.pythonhosted.org/packages/8f/91/87cc71a6b10065ca0209d19a4bb575378abda6085e72fa0b61ffb2201b84/sqlalchemy-2.0.40-cp312-cp312-win32.whl", hash = "sha256:650490653b110905c10adac69408380688cefc1f536a137d0d69aca1069dc1d1", size = 2082959 }, - { url = "https://files.pythonhosted.org/packages/2a/9f/14c511cda174aa1ad9b0e42b64ff5a71db35d08b0d80dc044dae958921e5/sqlalchemy-2.0.40-cp312-cp312-win_amd64.whl", hash = "sha256:2be94d75ee06548d2fc591a3513422b873490efb124048f50556369a834853b0", size = 2108526 }, - { url = "https://files.pythonhosted.org/packages/8c/18/4e3a86cc0232377bc48c373a9ba6a1b3fb79ba32dbb4eda0b357f5a2c59d/sqlalchemy-2.0.40-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:915866fd50dd868fdcc18d61d8258db1bf9ed7fbd6dfec960ba43365952f3b01", size = 2107887 }, - { url = "https://files.pythonhosted.org/packages/cb/60/9fa692b1d2ffc4cbd5f47753731fd332afed30137115d862d6e9a1e962c7/sqlalchemy-2.0.40-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a4c5a2905a9ccdc67a8963e24abd2f7afcd4348829412483695c59e0af9a705", size = 2098367 }, - { url = "https://files.pythonhosted.org/packages/4c/9f/84b78357ca641714a439eb3fbbddb17297dacfa05d951dbf24f28d7b5c08/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55028d7a3ebdf7ace492fab9895cbc5270153f75442a0472d8516e03159ab364", size = 3184806 }, - { url = "https://files.pythonhosted.org/packages/4b/7d/e06164161b6bfce04c01bfa01518a20cccbd4100d5c951e5a7422189191a/sqlalchemy-2.0.40-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cfedff6878b0e0d1d0a50666a817ecd85051d12d56b43d9d425455e608b5ba0", size = 3198131 }, - { url = "https://files.pythonhosted.org/packages/6d/51/354af20da42d7ec7b5c9de99edafbb7663a1d75686d1999ceb2c15811302/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bb19e30fdae77d357ce92192a3504579abe48a66877f476880238a962e5b96db", size = 3131364 }, - { url = "https://files.pythonhosted.org/packages/7a/2f/48a41ff4e6e10549d83fcc551ab85c268bde7c03cf77afb36303c6594d11/sqlalchemy-2.0.40-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:16d325ea898f74b26ffcd1cf8c593b0beed8714f0317df2bed0d8d1de05a8f26", size = 3159482 }, - { url = "https://files.pythonhosted.org/packages/33/ac/e5e0a807163652a35be878c0ad5cfd8b1d29605edcadfb5df3c512cdf9f3/sqlalchemy-2.0.40-cp313-cp313-win32.whl", hash = "sha256:a669cbe5be3c63f75bcbee0b266779706f1a54bcb1000f302685b87d1b8c1500", size = 2080704 }, - { url = "https://files.pythonhosted.org/packages/1c/cb/f38c61f7f2fd4d10494c1c135ff6a6ddb63508d0b47bccccd93670637309/sqlalchemy-2.0.40-cp313-cp313-win_amd64.whl", hash = "sha256:641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad", size = 2104564 }, - { url = "https://files.pythonhosted.org/packages/d1/7c/5fc8e802e7506fe8b55a03a2e1dab156eae205c91bee46305755e086d2e2/sqlalchemy-2.0.40-py3-none-any.whl", hash = "sha256:32587e2e1e359276957e6fe5dad089758bc042a971a8a09ae8ecf7a8fe23d07a", size = 1903894 }, +sdist = { url = "https://files.pythonhosted.org/packages/63/66/45b165c595ec89aa7dcc2c1cd222ab269bc753f1fc7a1e68f8481bd957bf/sqlalchemy-2.0.41.tar.gz", hash = "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9", size = 9689424 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/4e/b00e3ffae32b74b5180e15d2ab4040531ee1bef4c19755fe7926622dc958/sqlalchemy-2.0.41-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6375cd674fe82d7aa9816d1cb96ec592bac1726c11e0cafbf40eeee9a4516b5f", size = 2121232 }, + { url = "https://files.pythonhosted.org/packages/ef/30/6547ebb10875302074a37e1970a5dce7985240665778cfdee2323709f749/sqlalchemy-2.0.41-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f8c9fdd15a55d9465e590a402f42082705d66b05afc3ffd2d2eb3c6ba919560", size = 2110897 }, + { url = "https://files.pythonhosted.org/packages/9e/21/59df2b41b0f6c62da55cd64798232d7349a9378befa7f1bb18cf1dfd510a/sqlalchemy-2.0.41-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f9dc8c44acdee06c8fc6440db9eae8b4af8b01e4b1aee7bdd7241c22edff4f", size = 3273313 }, + { url = "https://files.pythonhosted.org/packages/62/e4/b9a7a0e5c6f79d49bcd6efb6e90d7536dc604dab64582a9dec220dab54b6/sqlalchemy-2.0.41-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c11ceb9a1f482c752a71f203a81858625d8df5746d787a4786bca4ffdf71c6", size = 3273807 }, + { url = "https://files.pythonhosted.org/packages/39/d8/79f2427251b44ddee18676c04eab038d043cff0e764d2d8bb08261d6135d/sqlalchemy-2.0.41-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:911cc493ebd60de5f285bcae0491a60b4f2a9f0f5c270edd1c4dbaef7a38fc04", size = 3209632 }, + { url = "https://files.pythonhosted.org/packages/d4/16/730a82dda30765f63e0454918c982fb7193f6b398b31d63c7c3bd3652ae5/sqlalchemy-2.0.41-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03968a349db483936c249f4d9cd14ff2c296adfa1290b660ba6516f973139582", size = 3233642 }, + { url = "https://files.pythonhosted.org/packages/04/61/c0d4607f7799efa8b8ea3c49b4621e861c8f5c41fd4b5b636c534fcb7d73/sqlalchemy-2.0.41-cp311-cp311-win32.whl", hash = "sha256:293cd444d82b18da48c9f71cd7005844dbbd06ca19be1ccf6779154439eec0b8", size = 2086475 }, + { url = "https://files.pythonhosted.org/packages/9d/8e/8344f8ae1cb6a479d0741c02cd4f666925b2bf02e2468ddaf5ce44111f30/sqlalchemy-2.0.41-cp311-cp311-win_amd64.whl", hash = "sha256:3d3549fc3e40667ec7199033a4e40a2f669898a00a7b18a931d3efb4c7900504", size = 2110903 }, + { url = "https://files.pythonhosted.org/packages/3e/2a/f1f4e068b371154740dd10fb81afb5240d5af4aa0087b88d8b308b5429c2/sqlalchemy-2.0.41-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:81f413674d85cfd0dfcd6512e10e0f33c19c21860342a4890c3a2b59479929f9", size = 2119645 }, + { url = "https://files.pythonhosted.org/packages/9b/e8/c664a7e73d36fbfc4730f8cf2bf930444ea87270f2825efbe17bf808b998/sqlalchemy-2.0.41-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:598d9ebc1e796431bbd068e41e4de4dc34312b7aa3292571bb3674a0cb415dd1", size = 2107399 }, + { url = "https://files.pythonhosted.org/packages/5c/78/8a9cf6c5e7135540cb682128d091d6afa1b9e48bd049b0d691bf54114f70/sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a104c5694dfd2d864a6f91b0956eb5d5883234119cb40010115fd45a16da5e70", size = 3293269 }, + { url = "https://files.pythonhosted.org/packages/3c/35/f74add3978c20de6323fb11cb5162702670cc7a9420033befb43d8d5b7a4/sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6145afea51ff0af7f2564a05fa95eb46f542919e6523729663a5d285ecb3cf5e", size = 3303364 }, + { url = "https://files.pythonhosted.org/packages/6a/d4/c990f37f52c3f7748ebe98883e2a0f7d038108c2c5a82468d1ff3eec50b7/sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b46fa6eae1cd1c20e6e6f44e19984d438b6b2d8616d21d783d150df714f44078", size = 3229072 }, + { url = "https://files.pythonhosted.org/packages/15/69/cab11fecc7eb64bc561011be2bd03d065b762d87add52a4ca0aca2e12904/sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41836fe661cc98abfae476e14ba1906220f92c4e528771a8a3ae6a151242d2ae", size = 3268074 }, + { url = "https://files.pythonhosted.org/packages/5c/ca/0c19ec16858585d37767b167fc9602593f98998a68a798450558239fb04a/sqlalchemy-2.0.41-cp312-cp312-win32.whl", hash = "sha256:a8808d5cf866c781150d36a3c8eb3adccfa41a8105d031bf27e92c251e3969d6", size = 2084514 }, + { url = "https://files.pythonhosted.org/packages/7f/23/4c2833d78ff3010a4e17f984c734f52b531a8c9060a50429c9d4b0211be6/sqlalchemy-2.0.41-cp312-cp312-win_amd64.whl", hash = "sha256:5b14e97886199c1f52c14629c11d90c11fbb09e9334fa7bb5f6d068d9ced0ce0", size = 2111557 }, + { url = "https://files.pythonhosted.org/packages/d3/ad/2e1c6d4f235a97eeef52d0200d8ddda16f6c4dd70ae5ad88c46963440480/sqlalchemy-2.0.41-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4eeb195cdedaf17aab6b247894ff2734dcead6c08f748e617bfe05bd5a218443", size = 2115491 }, + { url = "https://files.pythonhosted.org/packages/cf/8d/be490e5db8400dacc89056f78a52d44b04fbf75e8439569d5b879623a53b/sqlalchemy-2.0.41-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d4ae769b9c1c7757e4ccce94b0641bc203bbdf43ba7a2413ab2523d8d047d8dc", size = 2102827 }, + { url = "https://files.pythonhosted.org/packages/a0/72/c97ad430f0b0e78efaf2791342e13ffeafcbb3c06242f01a3bb8fe44f65d/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a62448526dd9ed3e3beedc93df9bb6b55a436ed1474db31a2af13b313a70a7e1", size = 3225224 }, + { url = "https://files.pythonhosted.org/packages/5e/51/5ba9ea3246ea068630acf35a6ba0d181e99f1af1afd17e159eac7e8bc2b8/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc56c9788617b8964ad02e8fcfeed4001c1f8ba91a9e1f31483c0dffb207002a", size = 3230045 }, + { url = "https://files.pythonhosted.org/packages/78/2f/8c14443b2acea700c62f9b4a8bad9e49fc1b65cfb260edead71fd38e9f19/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c153265408d18de4cc5ded1941dcd8315894572cddd3c58df5d5b5705b3fa28d", size = 3159357 }, + { url = "https://files.pythonhosted.org/packages/fc/b2/43eacbf6ccc5276d76cea18cb7c3d73e294d6fb21f9ff8b4eef9b42bbfd5/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f67766965996e63bb46cfbf2ce5355fc32d9dd3b8ad7e536a920ff9ee422e23", size = 3197511 }, + { url = "https://files.pythonhosted.org/packages/fa/2e/677c17c5d6a004c3c45334ab1dbe7b7deb834430b282b8a0f75ae220c8eb/sqlalchemy-2.0.41-cp313-cp313-win32.whl", hash = "sha256:bfc9064f6658a3d1cadeaa0ba07570b83ce6801a1314985bf98ec9b95d74e15f", size = 2082420 }, + { url = "https://files.pythonhosted.org/packages/e9/61/e8c1b9b6307c57157d328dd8b8348ddc4c47ffdf1279365a13b2b98b8049/sqlalchemy-2.0.41-cp313-cp313-win_amd64.whl", hash = "sha256:82ca366a844eb551daff9d2e6e7a9e5e76d2612c8564f58db6c19a726869c1df", size = 2108329 }, + { url = "https://files.pythonhosted.org/packages/1c/fc/9ba22f01b5cdacc8f5ed0d22304718d2c758fce3fd49a5372b886a86f37c/sqlalchemy-2.0.41-py3-none-any.whl", hash = "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576", size = 1911224 }, ] [[package]] @@ -3347,14 +3425,14 @@ wheels = [ [[package]] name = "starlette" -version = "0.46.1" +version = "0.46.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/04/1b/52b27f2e13ceedc79a908e29eac426a63465a1a01248e5f24aa36a62aeb3/starlette-0.46.1.tar.gz", hash = "sha256:3c88d58ee4bd1bb807c0d1acb381838afc7752f9ddaec81bbe4383611d833230", size = 2580102 } +sdist = { url = "https://files.pythonhosted.org/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5", size = 2580846 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/4b/528ccf7a982216885a1ff4908e886b8fb5f19862d1962f56a3fce2435a70/starlette-0.46.1-py3-none-any.whl", hash = "sha256:77c74ed9d2720138b25875133f3a2dae6d854af2ec37dceb56aef370c1d8a227", size = 71995 }, + { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037 }, ] [[package]] @@ -3375,6 +3453,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/27/44/aa5c8b10b2cce7a053018e0d132bd58e27527a0243c4985383d5b6fd93e9/tblib-3.1.0-py3-none-any.whl", hash = "sha256:670bb4582578134b3d81a84afa1b016128b429f3d48e6cbbaecc9d15675e984e", size = 12552 }, ] +[[package]] +name = "tenacity" +version = "9.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248 }, +] + [[package]] name = "tomli" version = "2.2.1" @@ -3414,6 +3501,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 }, ] +[[package]] +name = "tomlkit" +version = "0.13.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/09/a439bec5888f00a54b8b9f05fa94d7f901d6735ef4e55dcec9bc37b5d8fa/tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79", size = 192885 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde", size = 37955 }, +] + [[package]] name = "toolz" version = "1.0.0" @@ -3425,20 +3521,21 @@ wheels = [ [[package]] name = "tornado" -version = "6.4.2" +version = "6.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/59/45/a0daf161f7d6f36c3ea5fc0c2de619746cc3dd4c76402e9db545bd920f63/tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b", size = 501135 } +sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934 } wheels = [ - { url = "https://files.pythonhosted.org/packages/26/7e/71f604d8cea1b58f82ba3590290b66da1e72d840aeb37e0d5f7291bd30db/tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1", size = 436299 }, - { url = "https://files.pythonhosted.org/packages/96/44/87543a3b99016d0bf54fdaab30d24bf0af2e848f1d13d34a3a5380aabe16/tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803", size = 434253 }, - { url = "https://files.pythonhosted.org/packages/cb/fb/fdf679b4ce51bcb7210801ef4f11fdac96e9885daa402861751353beea6e/tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec", size = 437602 }, - { url = "https://files.pythonhosted.org/packages/4f/3b/e31aeffffc22b475a64dbeb273026a21b5b566f74dee48742817626c47dc/tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946", size = 436972 }, - { url = "https://files.pythonhosted.org/packages/22/55/b78a464de78051a30599ceb6983b01d8f732e6f69bf37b4ed07f642ac0fc/tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf", size = 437173 }, - { url = "https://files.pythonhosted.org/packages/79/5e/be4fb0d1684eb822c9a62fb18a3e44a06188f78aa466b2ad991d2ee31104/tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634", size = 437892 }, - { url = "https://files.pythonhosted.org/packages/f5/33/4f91fdd94ea36e1d796147003b490fe60a0215ac5737b6f9c65e160d4fe0/tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73", size = 437334 }, - { url = "https://files.pythonhosted.org/packages/2b/ae/c1b22d4524b0e10da2f29a176fb2890386f7bd1f63aacf186444873a88a0/tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c", size = 437261 }, - { url = "https://files.pythonhosted.org/packages/b5/25/36dbd49ab6d179bcfc4c6c093a51795a4f3bed380543a8242ac3517a1751/tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482", size = 438463 }, - { url = "https://files.pythonhosted.org/packages/61/cc/58b1adeb1bb46228442081e746fcdbc4540905c87e8add7c277540934edb/tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38", size = 438907 }, + { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948 }, + { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112 }, + { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672 }, + { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019 }, + { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252 }, + { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930 }, + { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351 }, + { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328 }, + { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396 }, + { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840 }, + { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596 }, ] [[package]] @@ -3491,11 +3588,23 @@ wheels = [ [[package]] name = "typing-extensions" -version = "4.13.0" +version = "4.13.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0e/3e/b00a62db91a83fff600de219b6ea9908e6918664899a2d85db222f4fbf19/typing_extensions-4.13.0.tar.gz", hash = "sha256:0a4ac55a5820789d87e297727d229866c9650f6521b64206413c4fbada24d95b", size = 106520 } +sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/86/39b65d676ec5732de17b7e3c476e45bb80ec64eb50737a8dce1a4178aba1/typing_extensions-4.13.0-py3-none-any.whl", hash = "sha256:c8dd92cc0d6425a97c18fbb9d1954e5ff92c1ca881a309c45f06ebc0b79058e5", size = 45683 }, + { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552 }, ] [[package]] @@ -3518,24 +3627,24 @@ wheels = [ [[package]] name = "urllib3" -version = "2.3.0" +version = "2.4.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 } +sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672 } 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://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680 }, ] [[package]] name = "uvicorn" -version = "0.34.0" +version = "0.34.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4b/4d/938bd85e5bf2edeec766267a5015ad969730bb91e31b44021dfe8b22df6c/uvicorn-0.34.0.tar.gz", hash = "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9", size = 76568 } +sdist = { url = "https://files.pythonhosted.org/packages/a6/ae/9bbb19b9e1c450cf9ecaef06463e40234d98d95bf572fab11b4f19ae5ded/uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328", size = 76815 } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/14/33a3a1352cfa71812a3a21e8c9bfb83f60b0011f5e36f2b1399d51928209/uvicorn-0.34.0-py3-none-any.whl", hash = "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", size = 62315 }, + { url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403", size = 62483 }, ] [[package]] @@ -3549,65 +3658,65 @@ wheels = [ [[package]] name = "virtualenv" -version = "20.30.0" +version = "20.31.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/e0/633e369b91bbc664df47dcb5454b6c7cf441e8f5b9d0c250ce9f0546401e/virtualenv-20.30.0.tar.gz", hash = "sha256:800863162bcaa5450a6e4d721049730e7f2dae07720e0902b0e4040bd6f9ada8", size = 4346945 } +sdist = { url = "https://files.pythonhosted.org/packages/56/2c/444f465fb2c65f40c3a104fd0c495184c4f2336d65baf398e3c75d72ea94/virtualenv-20.31.2.tar.gz", hash = "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af", size = 6076316 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/ed/3cfeb48175f0671ec430ede81f628f9fb2b1084c9064ca67ebe8c0ed6a05/virtualenv-20.30.0-py3-none-any.whl", hash = "sha256:e34302959180fca3af42d1800df014b35019490b119eba981af27f2fa486e5d6", size = 4329461 }, + { url = "https://files.pythonhosted.org/packages/f3/40/b1c265d4b2b62b58576588510fc4d1fe60a86319c8de99fd8e9fec617d2c/virtualenv-20.31.2-py3-none-any.whl", hash = "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11", size = 6057982 }, ] [[package]] name = "watchfiles" -version = "1.0.4" +version = "1.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f5/26/c705fc77d0a9ecdb9b66f1e2976d95b81df3cae518967431e7dbf9b5e219/watchfiles-1.0.4.tar.gz", hash = "sha256:6ba473efd11062d73e4f00c2b730255f9c1bdd73cd5f9fe5b5da8dbd4a717205", size = 94625 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/bb/8461adc4b1fed009546fb797fc0d5698dcfe5e289cb37e1b8f16a93cdc30/watchfiles-1.0.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:2a9f93f8439639dc244c4d2902abe35b0279102bca7bbcf119af964f51d53c19", size = 394869 }, - { url = "https://files.pythonhosted.org/packages/55/88/9ebf36b3547176d1709c320de78c1fa3263a46be31b5b1267571d9102686/watchfiles-1.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9eea33ad8c418847dd296e61eb683cae1c63329b6d854aefcd412e12d94ee235", size = 384905 }, - { url = "https://files.pythonhosted.org/packages/03/8a/04335ce23ef78d8c69f0913e8b20cf7d9233e3986543aeef95ef2d6e43d2/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31f1a379c9dcbb3f09cf6be1b7e83b67c0e9faabed0471556d9438a4a4e14202", size = 449944 }, - { url = "https://files.pythonhosted.org/packages/17/4e/c8d5dcd14fe637f4633616dabea8a4af0a10142dccf3b43e0f081ba81ab4/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ab594e75644421ae0a2484554832ca5895f8cab5ab62de30a1a57db460ce06c6", size = 456020 }, - { url = "https://files.pythonhosted.org/packages/5e/74/3e91e09e1861dd7fbb1190ce7bd786700dc0fbc2ccd33bb9fff5de039229/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc2eb5d14a8e0d5df7b36288979176fbb39672d45184fc4b1c004d7c3ce29317", size = 482983 }, - { url = "https://files.pythonhosted.org/packages/a1/3d/e64de2d1ce4eb6a574fd78ce3a28c279da263be9ef3cfcab6f708df192f2/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f68d8e9d5a321163ddacebe97091000955a1b74cd43724e346056030b0bacee", size = 520320 }, - { url = "https://files.pythonhosted.org/packages/2c/bd/52235f7063b57240c66a991696ed27e2a18bd6fcec8a1ea5a040b70d0611/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9ce064e81fe79faa925ff03b9f4c1a98b0bbb4a1b8c1b015afa93030cb21a49", size = 500988 }, - { url = "https://files.pythonhosted.org/packages/3a/b0/ff04194141a5fe650c150400dd9e42667916bc0f52426e2e174d779b8a74/watchfiles-1.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b77d5622ac5cc91d21ae9c2b284b5d5c51085a0bdb7b518dba263d0af006132c", size = 452573 }, - { url = "https://files.pythonhosted.org/packages/3d/9d/966164332c5a178444ae6d165082d4f351bd56afd9c3ec828eecbf190e6a/watchfiles-1.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1941b4e39de9b38b868a69b911df5e89dc43767feeda667b40ae032522b9b5f1", size = 615114 }, - { url = "https://files.pythonhosted.org/packages/94/df/f569ae4c1877f96ad4086c153a8eee5a19a3b519487bf5c9454a3438c341/watchfiles-1.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4f8c4998506241dedf59613082d1c18b836e26ef2a4caecad0ec41e2a15e4226", size = 613076 }, - { url = "https://files.pythonhosted.org/packages/15/ae/8ce5f29e65d5fa5790e3c80c289819c55e12be2e1b9f5b6a0e55e169b97d/watchfiles-1.0.4-cp311-cp311-win32.whl", hash = "sha256:4ebbeca9360c830766b9f0df3640b791be569d988f4be6c06d6fae41f187f105", size = 271013 }, - { url = "https://files.pythonhosted.org/packages/a4/c6/79dc4a7c598a978e5fafa135090aaf7bbb03b8dec7bada437dfbe578e7ed/watchfiles-1.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:05d341c71f3d7098920f8551d4df47f7b57ac5b8dad56558064c3431bdfc0b74", size = 284229 }, - { url = "https://files.pythonhosted.org/packages/37/3d/928633723211753f3500bfb138434f080363b87a1b08ca188b1ce54d1e05/watchfiles-1.0.4-cp311-cp311-win_arm64.whl", hash = "sha256:32b026a6ab64245b584acf4931fe21842374da82372d5c039cba6bf99ef722f3", size = 276824 }, - { url = "https://files.pythonhosted.org/packages/5b/1a/8f4d9a1461709756ace48c98f07772bc6d4519b1e48b5fa24a4061216256/watchfiles-1.0.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:229e6ec880eca20e0ba2f7e2249c85bae1999d330161f45c78d160832e026ee2", size = 391345 }, - { url = "https://files.pythonhosted.org/packages/bc/d2/6750b7b3527b1cdaa33731438432e7238a6c6c40a9924049e4cebfa40805/watchfiles-1.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5717021b199e8353782dce03bd8a8f64438832b84e2885c4a645f9723bf656d9", size = 381515 }, - { url = "https://files.pythonhosted.org/packages/4e/17/80500e42363deef1e4b4818729ed939aaddc56f82f4e72b2508729dd3c6b/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0799ae68dfa95136dde7c472525700bd48777875a4abb2ee454e3ab18e9fc712", size = 449767 }, - { url = "https://files.pythonhosted.org/packages/10/37/1427fa4cfa09adbe04b1e97bced19a29a3462cc64c78630787b613a23f18/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43b168bba889886b62edb0397cab5b6490ffb656ee2fcb22dec8bfeb371a9e12", size = 455677 }, - { url = "https://files.pythonhosted.org/packages/c5/7a/39e9397f3a19cb549a7d380412fd9e507d4854eddc0700bfad10ef6d4dba/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb2c46e275fbb9f0c92e7654b231543c7bbfa1df07cdc4b99fa73bedfde5c844", size = 482219 }, - { url = "https://files.pythonhosted.org/packages/45/2d/7113931a77e2ea4436cad0c1690c09a40a7f31d366f79c6f0a5bc7a4f6d5/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:857f5fc3aa027ff5e57047da93f96e908a35fe602d24f5e5d8ce64bf1f2fc733", size = 518830 }, - { url = "https://files.pythonhosted.org/packages/f9/1b/50733b1980fa81ef3c70388a546481ae5fa4c2080040100cd7bf3bf7b321/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55ccfd27c497b228581e2838d4386301227fc0cb47f5a12923ec2fe4f97b95af", size = 497997 }, - { url = "https://files.pythonhosted.org/packages/2b/b4/9396cc61b948ef18943e7c85ecfa64cf940c88977d882da57147f62b34b1/watchfiles-1.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c11ea22304d17d4385067588123658e9f23159225a27b983f343fcffc3e796a", size = 452249 }, - { url = "https://files.pythonhosted.org/packages/fb/69/0c65a5a29e057ad0dc691c2fa6c23b2983c7dabaa190ba553b29ac84c3cc/watchfiles-1.0.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:74cb3ca19a740be4caa18f238298b9d472c850f7b2ed89f396c00a4c97e2d9ff", size = 614412 }, - { url = "https://files.pythonhosted.org/packages/7f/b9/319fcba6eba5fad34327d7ce16a6b163b39741016b1996f4a3c96b8dd0e1/watchfiles-1.0.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7cce76c138a91e720d1df54014a047e680b652336e1b73b8e3ff3158e05061e", size = 611982 }, - { url = "https://files.pythonhosted.org/packages/f1/47/143c92418e30cb9348a4387bfa149c8e0e404a7c5b0585d46d2f7031b4b9/watchfiles-1.0.4-cp312-cp312-win32.whl", hash = "sha256:b045c800d55bc7e2cadd47f45a97c7b29f70f08a7c2fa13241905010a5493f94", size = 271822 }, - { url = "https://files.pythonhosted.org/packages/ea/94/b0165481bff99a64b29e46e07ac2e0df9f7a957ef13bec4ceab8515f44e3/watchfiles-1.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:c2acfa49dd0ad0bf2a9c0bb9a985af02e89345a7189be1efc6baa085e0f72d7c", size = 285441 }, - { url = "https://files.pythonhosted.org/packages/11/de/09fe56317d582742d7ca8c2ca7b52a85927ebb50678d9b0fa8194658f536/watchfiles-1.0.4-cp312-cp312-win_arm64.whl", hash = "sha256:22bb55a7c9e564e763ea06c7acea24fc5d2ee5dfc5dafc5cfbedfe58505e9f90", size = 277141 }, - { url = "https://files.pythonhosted.org/packages/08/98/f03efabec64b5b1fa58c0daab25c68ef815b0f320e54adcacd0d6847c339/watchfiles-1.0.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:8012bd820c380c3d3db8435e8cf7592260257b378b649154a7948a663b5f84e9", size = 390954 }, - { url = "https://files.pythonhosted.org/packages/16/09/4dd49ba0a32a45813debe5fb3897955541351ee8142f586303b271a02b40/watchfiles-1.0.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa216f87594f951c17511efe5912808dfcc4befa464ab17c98d387830ce07b60", size = 381133 }, - { url = "https://files.pythonhosted.org/packages/76/59/5aa6fc93553cd8d8ee75c6247763d77c02631aed21551a97d94998bf1dae/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c9953cf85529c05b24705639ffa390f78c26449e15ec34d5339e8108c7c407", size = 449516 }, - { url = "https://files.pythonhosted.org/packages/4c/aa/df4b6fe14b6317290b91335b23c96b488d365d65549587434817e06895ea/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7cf684aa9bba4cd95ecb62c822a56de54e3ae0598c1a7f2065d51e24637a3c5d", size = 454820 }, - { url = "https://files.pythonhosted.org/packages/5e/71/185f8672f1094ce48af33252c73e39b48be93b761273872d9312087245f6/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f44a39aee3cbb9b825285ff979ab887a25c5d336e5ec3574f1506a4671556a8d", size = 481550 }, - { url = "https://files.pythonhosted.org/packages/85/d7/50ebba2c426ef1a5cb17f02158222911a2e005d401caf5d911bfca58f4c4/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38320582736922be8c865d46520c043bff350956dfc9fbaee3b2df4e1740a4b", size = 518647 }, - { url = "https://files.pythonhosted.org/packages/f0/7a/4c009342e393c545d68987e8010b937f72f47937731225b2b29b7231428f/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39f4914548b818540ef21fd22447a63e7be6e24b43a70f7642d21f1e73371590", size = 497547 }, - { url = "https://files.pythonhosted.org/packages/0f/7c/1cf50b35412d5c72d63b2bf9a4fffee2e1549a245924960dd087eb6a6de4/watchfiles-1.0.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f12969a3765909cf5dc1e50b2436eb2c0e676a3c75773ab8cc3aa6175c16e902", size = 452179 }, - { url = "https://files.pythonhosted.org/packages/d6/a9/3db1410e1c1413735a9a472380e4f431ad9a9e81711cda2aaf02b7f62693/watchfiles-1.0.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:0986902677a1a5e6212d0c49b319aad9cc48da4bd967f86a11bde96ad9676ca1", size = 614125 }, - { url = "https://files.pythonhosted.org/packages/f2/e1/0025d365cf6248c4d1ee4c3d2e3d373bdd3f6aff78ba4298f97b4fad2740/watchfiles-1.0.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:308ac265c56f936636e3b0e3f59e059a40003c655228c131e1ad439957592303", size = 611911 }, - { url = "https://files.pythonhosted.org/packages/55/55/035838277d8c98fc8c917ac9beeb0cd6c59d675dc2421df5f9fcf44a0070/watchfiles-1.0.4-cp313-cp313-win32.whl", hash = "sha256:aee397456a29b492c20fda2d8961e1ffb266223625346ace14e4b6d861ba9c80", size = 271152 }, - { url = "https://files.pythonhosted.org/packages/f0/e5/96b8e55271685ddbadc50ce8bc53aa2dff278fb7ac4c2e473df890def2dc/watchfiles-1.0.4-cp313-cp313-win_amd64.whl", hash = "sha256:d6097538b0ae5c1b88c3b55afa245a66793a8fec7ada6755322e465fb1a0e8cc", size = 285216 }, +sdist = { url = "https://files.pythonhosted.org/packages/03/e2/8ed598c42057de7aa5d97c472254af4906ff0a59a66699d426fc9ef795d7/watchfiles-1.0.5.tar.gz", hash = "sha256:b7529b5dcc114679d43827d8c35a07c493ad6f083633d573d81c660abc5979e9", size = 94537 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/f4/41b591f59021786ef517e1cdc3b510383551846703e03f204827854a96f8/watchfiles-1.0.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:237f9be419e977a0f8f6b2e7b0475ababe78ff1ab06822df95d914a945eac827", size = 405336 }, + { url = "https://files.pythonhosted.org/packages/ae/06/93789c135be4d6d0e4f63e96eea56dc54050b243eacc28439a26482b5235/watchfiles-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0da39ff917af8b27a4bdc5a97ac577552a38aac0d260a859c1517ea3dc1a7c4", size = 395977 }, + { url = "https://files.pythonhosted.org/packages/d2/db/1cd89bd83728ca37054512d4d35ab69b5f12b8aa2ac9be3b0276b3bf06cc/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfcb3952350e95603f232a7a15f6c5f86c5375e46f0bd4ae70d43e3e063c13d", size = 455232 }, + { url = "https://files.pythonhosted.org/packages/40/90/d8a4d44ffe960517e487c9c04f77b06b8abf05eb680bed71c82b5f2cad62/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68b2dddba7a4e6151384e252a5632efcaa9bc5d1c4b567f3cb621306b2ca9f63", size = 459151 }, + { url = "https://files.pythonhosted.org/packages/6c/da/267a1546f26465dead1719caaba3ce660657f83c9d9c052ba98fb8856e13/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95cf944fcfc394c5f9de794ce581914900f82ff1f855326f25ebcf24d5397418", size = 489054 }, + { url = "https://files.pythonhosted.org/packages/b1/31/33850dfd5c6efb6f27d2465cc4c6b27c5a6f5ed53c6fa63b7263cf5f60f6/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf6cd9f83d7c023b1aba15d13f705ca7b7d38675c121f3cc4a6e25bd0857ee9", size = 523955 }, + { url = "https://files.pythonhosted.org/packages/09/84/b7d7b67856efb183a421f1416b44ca975cb2ea6c4544827955dfb01f7dc2/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:852de68acd6212cd6d33edf21e6f9e56e5d98c6add46f48244bd479d97c967c6", size = 502234 }, + { url = "https://files.pythonhosted.org/packages/71/87/6dc5ec6882a2254cfdd8b0718b684504e737273903b65d7338efaba08b52/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5730f3aa35e646103b53389d5bc77edfbf578ab6dab2e005142b5b80a35ef25", size = 454750 }, + { url = "https://files.pythonhosted.org/packages/3d/6c/3786c50213451a0ad15170d091570d4a6554976cf0df19878002fc96075a/watchfiles-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:18b3bd29954bc4abeeb4e9d9cf0b30227f0f206c86657674f544cb032296acd5", size = 631591 }, + { url = "https://files.pythonhosted.org/packages/1b/b3/1427425ade4e359a0deacce01a47a26024b2ccdb53098f9d64d497f6684c/watchfiles-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ba5552a1b07c8edbf197055bc9d518b8f0d98a1c6a73a293bc0726dce068ed01", size = 625370 }, + { url = "https://files.pythonhosted.org/packages/15/ba/f60e053b0b5b8145d682672024aa91370a29c5c921a88977eb565de34086/watchfiles-1.0.5-cp311-cp311-win32.whl", hash = "sha256:2f1fefb2e90e89959447bc0420fddd1e76f625784340d64a2f7d5983ef9ad246", size = 277791 }, + { url = "https://files.pythonhosted.org/packages/50/ed/7603c4e164225c12c0d4e8700b64bb00e01a6c4eeea372292a3856be33a4/watchfiles-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:b6e76ceb1dd18c8e29c73f47d41866972e891fc4cc7ba014f487def72c1cf096", size = 291622 }, + { url = "https://files.pythonhosted.org/packages/a2/c2/99bb7c96b4450e36877fde33690ded286ff555b5a5c1d925855d556968a1/watchfiles-1.0.5-cp311-cp311-win_arm64.whl", hash = "sha256:266710eb6fddc1f5e51843c70e3bebfb0f5e77cf4f27129278c70554104d19ed", size = 283699 }, + { url = "https://files.pythonhosted.org/packages/2a/8c/4f0b9bdb75a1bfbd9c78fad7d8854369283f74fe7cf03eb16be77054536d/watchfiles-1.0.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5eb568c2aa6018e26da9e6c86f3ec3fd958cee7f0311b35c2630fa4217d17f2", size = 401511 }, + { url = "https://files.pythonhosted.org/packages/dc/4e/7e15825def77f8bd359b6d3f379f0c9dac4eb09dd4ddd58fd7d14127179c/watchfiles-1.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a04059f4923ce4e856b4b4e5e783a70f49d9663d22a4c3b3298165996d1377f", size = 392715 }, + { url = "https://files.pythonhosted.org/packages/58/65/b72fb817518728e08de5840d5d38571466c1b4a3f724d190cec909ee6f3f/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e380c89983ce6e6fe2dd1e1921b9952fb4e6da882931abd1824c092ed495dec", size = 454138 }, + { url = "https://files.pythonhosted.org/packages/3e/a4/86833fd2ea2e50ae28989f5950b5c3f91022d67092bfec08f8300d8b347b/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fe43139b2c0fdc4a14d4f8d5b5d967f7a2777fd3d38ecf5b1ec669b0d7e43c21", size = 458592 }, + { url = "https://files.pythonhosted.org/packages/38/7e/42cb8df8be9a37e50dd3a818816501cf7a20d635d76d6bd65aae3dbbff68/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee0822ce1b8a14fe5a066f93edd20aada932acfe348bede8aa2149f1a4489512", size = 487532 }, + { url = "https://files.pythonhosted.org/packages/fc/fd/13d26721c85d7f3df6169d8b495fcac8ab0dc8f0945ebea8845de4681dab/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a0dbcb1c2d8f2ab6e0a81c6699b236932bd264d4cef1ac475858d16c403de74d", size = 522865 }, + { url = "https://files.pythonhosted.org/packages/a1/0d/7f9ae243c04e96c5455d111e21b09087d0eeaf9a1369e13a01c7d3d82478/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a2014a2b18ad3ca53b1f6c23f8cd94a18ce930c1837bd891262c182640eb40a6", size = 499887 }, + { url = "https://files.pythonhosted.org/packages/8e/0f/a257766998e26aca4b3acf2ae97dff04b57071e991a510857d3799247c67/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f6ae86d5cb647bf58f9f655fcf577f713915a5d69057a0371bc257e2553234", size = 454498 }, + { url = "https://files.pythonhosted.org/packages/81/79/8bf142575a03e0af9c3d5f8bcae911ee6683ae93a625d349d4ecf4c8f7df/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1a7bac2bde1d661fb31f4d4e8e539e178774b76db3c2c17c4bb3e960a5de07a2", size = 630663 }, + { url = "https://files.pythonhosted.org/packages/f1/80/abe2e79f610e45c63a70d271caea90c49bbf93eb00fa947fa9b803a1d51f/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ab626da2fc1ac277bbf752446470b367f84b50295264d2d313e28dc4405d663", size = 625410 }, + { url = "https://files.pythonhosted.org/packages/91/6f/bc7fbecb84a41a9069c2c6eb6319f7f7df113adf113e358c57fc1aff7ff5/watchfiles-1.0.5-cp312-cp312-win32.whl", hash = "sha256:9f4571a783914feda92018ef3901dab8caf5b029325b5fe4558c074582815249", size = 277965 }, + { url = "https://files.pythonhosted.org/packages/99/a5/bf1c297ea6649ec59e935ab311f63d8af5faa8f0b86993e3282b984263e3/watchfiles-1.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:360a398c3a19672cf93527f7e8d8b60d8275119c5d900f2e184d32483117a705", size = 291693 }, + { url = "https://files.pythonhosted.org/packages/7f/7b/fd01087cc21db5c47e5beae507b87965db341cce8a86f9eb12bf5219d4e0/watchfiles-1.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:1a2902ede862969077b97523987c38db28abbe09fb19866e711485d9fbf0d417", size = 283287 }, + { url = "https://files.pythonhosted.org/packages/c7/62/435766874b704f39b2fecd8395a29042db2b5ec4005bd34523415e9bd2e0/watchfiles-1.0.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0b289572c33a0deae62daa57e44a25b99b783e5f7aed81b314232b3d3c81a11d", size = 401531 }, + { url = "https://files.pythonhosted.org/packages/6e/a6/e52a02c05411b9cb02823e6797ef9bbba0bfaf1bb627da1634d44d8af833/watchfiles-1.0.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a056c2f692d65bf1e99c41045e3bdcaea3cb9e6b5a53dcaf60a5f3bd95fc9763", size = 392417 }, + { url = "https://files.pythonhosted.org/packages/3f/53/c4af6819770455932144e0109d4854437769672d7ad897e76e8e1673435d/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9dca99744991fc9850d18015c4f0438865414e50069670f5f7eee08340d8b40", size = 453423 }, + { url = "https://files.pythonhosted.org/packages/cb/d1/8e88df58bbbf819b8bc5cfbacd3c79e01b40261cad0fc84d1e1ebd778a07/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:894342d61d355446d02cd3988a7326af344143eb33a2fd5d38482a92072d9563", size = 458185 }, + { url = "https://files.pythonhosted.org/packages/ff/70/fffaa11962dd5429e47e478a18736d4e42bec42404f5ee3b92ef1b87ad60/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab44e1580924d1ffd7b3938e02716d5ad190441965138b4aa1d1f31ea0877f04", size = 486696 }, + { url = "https://files.pythonhosted.org/packages/39/db/723c0328e8b3692d53eb273797d9a08be6ffb1d16f1c0ba2bdbdc2a3852c/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6f9367b132078b2ceb8d066ff6c93a970a18c3029cea37bfd7b2d3dd2e5db8f", size = 522327 }, + { url = "https://files.pythonhosted.org/packages/cd/05/9fccc43c50c39a76b68343484b9da7b12d42d0859c37c61aec018c967a32/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2e55a9b162e06e3f862fb61e399fe9f05d908d019d87bf5b496a04ef18a970a", size = 499741 }, + { url = "https://files.pythonhosted.org/packages/23/14/499e90c37fa518976782b10a18b18db9f55ea73ca14641615056f8194bb3/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0125f91f70e0732a9f8ee01e49515c35d38ba48db507a50c5bdcad9503af5827", size = 453995 }, + { url = "https://files.pythonhosted.org/packages/61/d9/f75d6840059320df5adecd2c687fbc18960a7f97b55c300d20f207d48aef/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:13bb21f8ba3248386337c9fa51c528868e6c34a707f729ab041c846d52a0c69a", size = 629693 }, + { url = "https://files.pythonhosted.org/packages/fc/17/180ca383f5061b61406477218c55d66ec118e6c0c51f02d8142895fcf0a9/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:839ebd0df4a18c5b3c1b890145b5a3f5f64063c2a0d02b13c76d78fe5de34936", size = 624677 }, + { url = "https://files.pythonhosted.org/packages/bf/15/714d6ef307f803f236d69ee9d421763707899d6298d9f3183e55e366d9af/watchfiles-1.0.5-cp313-cp313-win32.whl", hash = "sha256:4a8ec1e4e16e2d5bafc9ba82f7aaecfeec990ca7cd27e84fb6f191804ed2fcfc", size = 277804 }, + { url = "https://files.pythonhosted.org/packages/a8/b4/c57b99518fadf431f3ef47a610839e46e5f8abf9814f969859d1c65c02c7/watchfiles-1.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:f436601594f15bf406518af922a89dcaab416568edb6f65c4e5bbbad1ea45c11", size = 291087 }, ] [[package]] @@ -3716,16 +3825,16 @@ wheels = [ [[package]] name = "xarray" -version = "2025.3.1" +version = "2025.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, { name = "packaging" }, { name = "pandas" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7c/c4/6931c37cd418658d596e78794bdd1bcb67efec0aac3cdb720e37e03c1ea1/xarray-2025.3.1.tar.gz", hash = "sha256:0252c96a73528b29d1ed7f0ab28d928d2ec00ad809e47369803b184dece1e447", size = 3300778 } +sdist = { url = "https://files.pythonhosted.org/packages/9b/29/37761364e137db13898cf5a790574dd7883f7355d5dfb42b66ee7a9a6318/xarray-2025.4.0.tar.gz", hash = "sha256:2a89cd6a1dfd589aa90ac45f4e483246f31fc641836db45dd2790bb78bd333dc", size = 2974151 } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/fd/973deafd9f87085136a58573600646b408ae7af47859f35151f0d83d5090/xarray-2025.3.1-py3-none-any.whl", hash = "sha256:3404e313930c226db70a945377441ea3c957225d8ba2d429e764c099bb91a546", size = 1279327 }, + { url = "https://files.pythonhosted.org/packages/a4/1e/96fd96419fec1a37da998a1ca3d558f2cae2f6f3cd5015170371b05a2b6b/xarray-2025.4.0-py3-none-any.whl", hash = "sha256:b27defd082c5cb85d32c695708de6bb05c2838fb7caaf3f952982e602a35b9b8", size = 1290171 }, ] [[package]] @@ -3745,78 +3854,98 @@ colors = [ [[package]] name = "xyzservices" -version = "2025.1.0" +version = "2025.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/47/11/3ae1c07b3446b643bec33822efeb0452e885a294172c4fe9551968211749/xyzservices-2025.1.0.tar.gz", hash = "sha256:5cdbb0907c20be1be066c6e2dc69c645842d1113a4e83e642065604a21f254ba", size = 1133574 } +sdist = { url = "https://files.pythonhosted.org/packages/00/af/c0f7f97bb320d14c089476f487b81f733238cc5603e0914f2e409f49d589/xyzservices-2025.4.0.tar.gz", hash = "sha256:6fe764713648fac53450fbc61a3c366cb6ae5335a1b2ae0c3796b495de3709d8", size = 1134722 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/6e/49408735dae940a0c1c225c6b908fd83bd6e3f5fae120f865754e72f78cb/xyzservices-2025.1.0-py3-none-any.whl", hash = "sha256:fa599956c5ab32dad1689960b3bb08fdcdbe0252cc82d84fc60ae415dc648907", size = 88368 }, + { url = "https://files.pythonhosted.org/packages/d6/7d/b77455d7c7c51255b2992b429107fab811b2e36ceaf76da1e55a045dc568/xyzservices-2025.4.0-py3-none-any.whl", hash = "sha256:8d4db9a59213ccb4ce1cf70210584f30b10795bff47627cdfb862b39ff6e10c9", size = 90391 }, ] [[package]] name = "yarl" -version = "1.18.3" +version = "1.20.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b7/9d/4b94a8e6d2b51b599516a5cb88e5bc99b4d8d4583e468057eaa29d5f0918/yarl-1.18.3.tar.gz", hash = "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1", size = 181062 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/93/282b5f4898d8e8efaf0790ba6d10e2245d2c9f30e199d1a85cae9356098c/yarl-1.18.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069", size = 141555 }, - { url = "https://files.pythonhosted.org/packages/6d/9c/0a49af78df099c283ca3444560f10718fadb8a18dc8b3edf8c7bd9fd7d89/yarl-1.18.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193", size = 94351 }, - { url = "https://files.pythonhosted.org/packages/5a/a1/205ab51e148fdcedad189ca8dd587794c6f119882437d04c33c01a75dece/yarl-1.18.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889", size = 92286 }, - { url = "https://files.pythonhosted.org/packages/ed/fe/88b690b30f3f59275fb674f5f93ddd4a3ae796c2b62e5bb9ece8a4914b83/yarl-1.18.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8", size = 340649 }, - { url = "https://files.pythonhosted.org/packages/07/eb/3b65499b568e01f36e847cebdc8d7ccb51fff716dbda1ae83c3cbb8ca1c9/yarl-1.18.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca", size = 356623 }, - { url = "https://files.pythonhosted.org/packages/33/46/f559dc184280b745fc76ec6b1954de2c55595f0ec0a7614238b9ebf69618/yarl-1.18.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8", size = 354007 }, - { url = "https://files.pythonhosted.org/packages/af/ba/1865d85212351ad160f19fb99808acf23aab9a0f8ff31c8c9f1b4d671fc9/yarl-1.18.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae", size = 344145 }, - { url = "https://files.pythonhosted.org/packages/94/cb/5c3e975d77755d7b3d5193e92056b19d83752ea2da7ab394e22260a7b824/yarl-1.18.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3", size = 336133 }, - { url = "https://files.pythonhosted.org/packages/19/89/b77d3fd249ab52a5c40859815765d35c91425b6bb82e7427ab2f78f5ff55/yarl-1.18.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb", size = 347967 }, - { url = "https://files.pythonhosted.org/packages/35/bd/f6b7630ba2cc06c319c3235634c582a6ab014d52311e7d7c22f9518189b5/yarl-1.18.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e", size = 346397 }, - { url = "https://files.pythonhosted.org/packages/18/1a/0b4e367d5a72d1f095318344848e93ea70da728118221f84f1bf6c1e39e7/yarl-1.18.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59", size = 350206 }, - { url = "https://files.pythonhosted.org/packages/b5/cf/320fff4367341fb77809a2d8d7fe75b5d323a8e1b35710aafe41fdbf327b/yarl-1.18.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d", size = 362089 }, - { url = "https://files.pythonhosted.org/packages/57/cf/aadba261d8b920253204085268bad5e8cdd86b50162fcb1b10c10834885a/yarl-1.18.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e", size = 366267 }, - { url = "https://files.pythonhosted.org/packages/54/58/fb4cadd81acdee6dafe14abeb258f876e4dd410518099ae9a35c88d8097c/yarl-1.18.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a", size = 359141 }, - { url = "https://files.pythonhosted.org/packages/9a/7a/4c571597589da4cd5c14ed2a0b17ac56ec9ee7ee615013f74653169e702d/yarl-1.18.3-cp311-cp311-win32.whl", hash = "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1", size = 84402 }, - { url = "https://files.pythonhosted.org/packages/ae/7b/8600250b3d89b625f1121d897062f629883c2f45339623b69b1747ec65fa/yarl-1.18.3-cp311-cp311-win_amd64.whl", hash = "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5", size = 91030 }, - { url = "https://files.pythonhosted.org/packages/33/85/bd2e2729752ff4c77338e0102914897512e92496375e079ce0150a6dc306/yarl-1.18.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50", size = 142644 }, - { url = "https://files.pythonhosted.org/packages/ff/74/1178322cc0f10288d7eefa6e4a85d8d2e28187ccab13d5b844e8b5d7c88d/yarl-1.18.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576", size = 94962 }, - { url = "https://files.pythonhosted.org/packages/be/75/79c6acc0261e2c2ae8a1c41cf12265e91628c8c58ae91f5ff59e29c0787f/yarl-1.18.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640", size = 92795 }, - { url = "https://files.pythonhosted.org/packages/6b/32/927b2d67a412c31199e83fefdce6e645247b4fb164aa1ecb35a0f9eb2058/yarl-1.18.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2", size = 332368 }, - { url = "https://files.pythonhosted.org/packages/19/e5/859fca07169d6eceeaa4fde1997c91d8abde4e9a7c018e371640c2da2b71/yarl-1.18.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75", size = 342314 }, - { url = "https://files.pythonhosted.org/packages/08/75/76b63ccd91c9e03ab213ef27ae6add2e3400e77e5cdddf8ed2dbc36e3f21/yarl-1.18.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512", size = 341987 }, - { url = "https://files.pythonhosted.org/packages/1a/e1/a097d5755d3ea8479a42856f51d97eeff7a3a7160593332d98f2709b3580/yarl-1.18.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba", size = 336914 }, - { url = "https://files.pythonhosted.org/packages/0b/42/e1b4d0e396b7987feceebe565286c27bc085bf07d61a59508cdaf2d45e63/yarl-1.18.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb", size = 325765 }, - { url = "https://files.pythonhosted.org/packages/7e/18/03a5834ccc9177f97ca1bbb245b93c13e58e8225276f01eedc4cc98ab820/yarl-1.18.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272", size = 344444 }, - { url = "https://files.pythonhosted.org/packages/c8/03/a713633bdde0640b0472aa197b5b86e90fbc4c5bc05b727b714cd8a40e6d/yarl-1.18.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6", size = 340760 }, - { url = "https://files.pythonhosted.org/packages/eb/99/f6567e3f3bbad8fd101886ea0276c68ecb86a2b58be0f64077396cd4b95e/yarl-1.18.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e", size = 346484 }, - { url = "https://files.pythonhosted.org/packages/8e/a9/84717c896b2fc6cb15bd4eecd64e34a2f0a9fd6669e69170c73a8b46795a/yarl-1.18.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb", size = 359864 }, - { url = "https://files.pythonhosted.org/packages/1e/2e/d0f5f1bef7ee93ed17e739ec8dbcb47794af891f7d165fa6014517b48169/yarl-1.18.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393", size = 364537 }, - { url = "https://files.pythonhosted.org/packages/97/8a/568d07c5d4964da5b02621a517532adb8ec5ba181ad1687191fffeda0ab6/yarl-1.18.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285", size = 357861 }, - { url = "https://files.pythonhosted.org/packages/7d/e3/924c3f64b6b3077889df9a1ece1ed8947e7b61b0a933f2ec93041990a677/yarl-1.18.3-cp312-cp312-win32.whl", hash = "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2", size = 84097 }, - { url = "https://files.pythonhosted.org/packages/34/45/0e055320daaabfc169b21ff6174567b2c910c45617b0d79c68d7ab349b02/yarl-1.18.3-cp312-cp312-win_amd64.whl", hash = "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477", size = 90399 }, - { url = "https://files.pythonhosted.org/packages/30/c7/c790513d5328a8390be8f47be5d52e141f78b66c6c48f48d241ca6bd5265/yarl-1.18.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb", size = 140789 }, - { url = "https://files.pythonhosted.org/packages/30/aa/a2f84e93554a578463e2edaaf2300faa61c8701f0898725842c704ba5444/yarl-1.18.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa", size = 94144 }, - { url = "https://files.pythonhosted.org/packages/c6/fc/d68d8f83714b221a85ce7866832cba36d7c04a68fa6a960b908c2c84f325/yarl-1.18.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782", size = 91974 }, - { url = "https://files.pythonhosted.org/packages/56/4e/d2563d8323a7e9a414b5b25341b3942af5902a2263d36d20fb17c40411e2/yarl-1.18.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0", size = 333587 }, - { url = "https://files.pythonhosted.org/packages/25/c9/cfec0bc0cac8d054be223e9f2c7909d3e8442a856af9dbce7e3442a8ec8d/yarl-1.18.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482", size = 344386 }, - { url = "https://files.pythonhosted.org/packages/ab/5d/4c532190113b25f1364d25f4c319322e86232d69175b91f27e3ebc2caf9a/yarl-1.18.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186", size = 345421 }, - { url = "https://files.pythonhosted.org/packages/23/d1/6cdd1632da013aa6ba18cee4d750d953104a5e7aac44e249d9410a972bf5/yarl-1.18.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58", size = 339384 }, - { url = "https://files.pythonhosted.org/packages/9a/c4/6b3c39bec352e441bd30f432cda6ba51681ab19bb8abe023f0d19777aad1/yarl-1.18.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53", size = 326689 }, - { url = "https://files.pythonhosted.org/packages/23/30/07fb088f2eefdc0aa4fc1af4e3ca4eb1a3aadd1ce7d866d74c0f124e6a85/yarl-1.18.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2", size = 345453 }, - { url = "https://files.pythonhosted.org/packages/63/09/d54befb48f9cd8eec43797f624ec37783a0266855f4930a91e3d5c7717f8/yarl-1.18.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8", size = 341872 }, - { url = "https://files.pythonhosted.org/packages/91/26/fd0ef9bf29dd906a84b59f0cd1281e65b0c3e08c6aa94b57f7d11f593518/yarl-1.18.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1", size = 347497 }, - { url = "https://files.pythonhosted.org/packages/d9/b5/14ac7a256d0511b2ac168d50d4b7d744aea1c1aa20c79f620d1059aab8b2/yarl-1.18.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a", size = 359981 }, - { url = "https://files.pythonhosted.org/packages/ca/b3/d493221ad5cbd18bc07e642894030437e405e1413c4236dd5db6e46bcec9/yarl-1.18.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10", size = 366229 }, - { url = "https://files.pythonhosted.org/packages/04/56/6a3e2a5d9152c56c346df9b8fb8edd2c8888b1e03f96324d457e5cf06d34/yarl-1.18.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8", size = 360383 }, - { url = "https://files.pythonhosted.org/packages/fd/b7/4b3c7c7913a278d445cc6284e59b2e62fa25e72758f888b7a7a39eb8423f/yarl-1.18.3-cp313-cp313-win32.whl", hash = "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d", size = 310152 }, - { url = "https://files.pythonhosted.org/packages/f5/d5/688db678e987c3e0fb17867970700b92603cadf36c56e5fb08f23e822a0c/yarl-1.18.3-cp313-cp313-win_amd64.whl", hash = "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c", size = 315723 }, - { url = "https://files.pythonhosted.org/packages/f5/4b/a06e0ec3d155924f77835ed2d167ebd3b211a7b0853da1cf8d8414d784ef/yarl-1.18.3-py3-none-any.whl", hash = "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b", size = 45109 }, +sdist = { url = "https://files.pythonhosted.org/packages/62/51/c0edba5219027f6eab262e139f73e2417b0f4efffa23bf562f6e18f76ca5/yarl-1.20.0.tar.gz", hash = "sha256:686d51e51ee5dfe62dec86e4866ee0e9ed66df700d55c828a615640adc885307", size = 185258 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/82/a59d8e21b20ffc836775fa7daedac51d16bb8f3010c4fcb495c4496aa922/yarl-1.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fdb5204d17cb32b2de2d1e21c7461cabfacf17f3645e4b9039f210c5d3378bf3", size = 145178 }, + { url = "https://files.pythonhosted.org/packages/ba/81/315a3f6f95947cfbf37c92d6fbce42a1a6207b6c38e8c2b452499ec7d449/yarl-1.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eaddd7804d8e77d67c28d154ae5fab203163bd0998769569861258e525039d2a", size = 96859 }, + { url = "https://files.pythonhosted.org/packages/ad/17/9b64e575583158551b72272a1023cdbd65af54fe13421d856b2850a6ddb7/yarl-1.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:634b7ba6b4a85cf67e9df7c13a7fb2e44fa37b5d34501038d174a63eaac25ee2", size = 94647 }, + { url = "https://files.pythonhosted.org/packages/2c/29/8f291e7922a58a21349683f6120a85701aeefaa02e9f7c8a2dc24fe3f431/yarl-1.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d409e321e4addf7d97ee84162538c7258e53792eb7c6defd0c33647d754172e", size = 355788 }, + { url = "https://files.pythonhosted.org/packages/26/6d/b4892c80b805c42c228c6d11e03cafabf81662d371b0853e7f0f513837d5/yarl-1.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ea52f7328a36960ba3231c6677380fa67811b414798a6e071c7085c57b6d20a9", size = 344613 }, + { url = "https://files.pythonhosted.org/packages/d7/0e/517aa28d3f848589bae9593717b063a544b86ba0a807d943c70f48fcf3bb/yarl-1.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8703517b924463994c344dcdf99a2d5ce9eca2b6882bb640aa555fb5efc706a", size = 370953 }, + { url = "https://files.pythonhosted.org/packages/5f/9b/5bd09d2f1ad6e6f7c2beae9e50db78edd2cca4d194d227b958955573e240/yarl-1.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:077989b09ffd2f48fb2d8f6a86c5fef02f63ffe6b1dd4824c76de7bb01e4f2e2", size = 369204 }, + { url = "https://files.pythonhosted.org/packages/9c/85/d793a703cf4bd0d4cd04e4b13cc3d44149470f790230430331a0c1f52df5/yarl-1.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0acfaf1da020253f3533526e8b7dd212838fdc4109959a2c53cafc6db611bff2", size = 358108 }, + { url = "https://files.pythonhosted.org/packages/6f/54/b6c71e13549c1f6048fbc14ce8d930ac5fb8bafe4f1a252e621a24f3f1f9/yarl-1.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4230ac0b97ec5eeb91d96b324d66060a43fd0d2a9b603e3327ed65f084e41f8", size = 346610 }, + { url = "https://files.pythonhosted.org/packages/a0/1a/d6087d58bdd0d8a2a37bbcdffac9d9721af6ebe50d85304d9f9b57dfd862/yarl-1.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a6a1e6ae21cdd84011c24c78d7a126425148b24d437b5702328e4ba640a8902", size = 365378 }, + { url = "https://files.pythonhosted.org/packages/02/84/e25ddff4cbc001dbc4af76f8d41a3e23818212dd1f0a52044cbc60568872/yarl-1.20.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:86de313371ec04dd2531f30bc41a5a1a96f25a02823558ee0f2af0beaa7ca791", size = 356919 }, + { url = "https://files.pythonhosted.org/packages/04/76/898ae362353bf8f64636495d222c8014c8e5267df39b1a9fe1e1572fb7d0/yarl-1.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dd59c9dd58ae16eaa0f48c3d0cbe6be8ab4dc7247c3ff7db678edecbaf59327f", size = 364248 }, + { url = "https://files.pythonhosted.org/packages/1b/b0/9d9198d83a622f1c40fdbf7bd13b224a6979f2e1fc2cf50bfb1d8773c495/yarl-1.20.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a0bc5e05f457b7c1994cc29e83b58f540b76234ba6b9648a4971ddc7f6aa52da", size = 378418 }, + { url = "https://files.pythonhosted.org/packages/c7/ce/1f50c1cc594cf5d3f5bf4a9b616fca68680deaec8ad349d928445ac52eb8/yarl-1.20.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c9471ca18e6aeb0e03276b5e9b27b14a54c052d370a9c0c04a68cefbd1455eb4", size = 383850 }, + { url = "https://files.pythonhosted.org/packages/89/1e/a59253a87b35bfec1a25bb5801fb69943330b67cfd266278eb07e0609012/yarl-1.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40ed574b4df723583a26c04b298b283ff171bcc387bc34c2683235e2487a65a5", size = 381218 }, + { url = "https://files.pythonhosted.org/packages/85/b0/26f87df2b3044b0ef1a7cf66d321102bdca091db64c5ae853fcb2171c031/yarl-1.20.0-cp311-cp311-win32.whl", hash = "sha256:db243357c6c2bf3cd7e17080034ade668d54ce304d820c2a58514a4e51d0cfd6", size = 86606 }, + { url = "https://files.pythonhosted.org/packages/33/46/ca335c2e1f90446a77640a45eeb1cd8f6934f2c6e4df7db0f0f36ef9f025/yarl-1.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:8c12cd754d9dbd14204c328915e23b0c361b88f3cffd124129955e60a4fbfcfb", size = 93374 }, + { url = "https://files.pythonhosted.org/packages/c3/e8/3efdcb83073df978bb5b1a9cc0360ce596680e6c3fac01f2a994ccbb8939/yarl-1.20.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e06b9f6cdd772f9b665e5ba8161968e11e403774114420737f7884b5bd7bdf6f", size = 147089 }, + { url = "https://files.pythonhosted.org/packages/60/c3/9e776e98ea350f76f94dd80b408eaa54e5092643dbf65fd9babcffb60509/yarl-1.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b9ae2fbe54d859b3ade40290f60fe40e7f969d83d482e84d2c31b9bff03e359e", size = 97706 }, + { url = "https://files.pythonhosted.org/packages/0c/5b/45cdfb64a3b855ce074ae607b9fc40bc82e7613b94e7612b030255c93a09/yarl-1.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d12b8945250d80c67688602c891237994d203d42427cb14e36d1a732eda480e", size = 95719 }, + { url = "https://files.pythonhosted.org/packages/2d/4e/929633b249611eeed04e2f861a14ed001acca3ef9ec2a984a757b1515889/yarl-1.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:087e9731884621b162a3e06dc0d2d626e1542a617f65ba7cc7aeab279d55ad33", size = 343972 }, + { url = "https://files.pythonhosted.org/packages/49/fd/047535d326c913f1a90407a3baf7ff535b10098611eaef2c527e32e81ca1/yarl-1.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:69df35468b66c1a6e6556248e6443ef0ec5f11a7a4428cf1f6281f1879220f58", size = 339639 }, + { url = "https://files.pythonhosted.org/packages/48/2f/11566f1176a78f4bafb0937c0072410b1b0d3640b297944a6a7a556e1d0b/yarl-1.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2992fe29002fd0d4cbaea9428b09af9b8686a9024c840b8a2b8f4ea4abc16f", size = 353745 }, + { url = "https://files.pythonhosted.org/packages/26/17/07dfcf034d6ae8837b33988be66045dd52f878dfb1c4e8f80a7343f677be/yarl-1.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c903e0b42aab48abfbac668b5a9d7b6938e721a6341751331bcd7553de2dcae", size = 354178 }, + { url = "https://files.pythonhosted.org/packages/15/45/212604d3142d84b4065d5f8cab6582ed3d78e4cc250568ef2a36fe1cf0a5/yarl-1.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf099e2432131093cc611623e0b0bcc399b8cddd9a91eded8bfb50402ec35018", size = 349219 }, + { url = "https://files.pythonhosted.org/packages/e6/e0/a10b30f294111c5f1c682461e9459935c17d467a760c21e1f7db400ff499/yarl-1.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a7f62f5dc70a6c763bec9ebf922be52aa22863d9496a9a30124d65b489ea672", size = 337266 }, + { url = "https://files.pythonhosted.org/packages/33/a6/6efa1d85a675d25a46a167f9f3e80104cde317dfdf7f53f112ae6b16a60a/yarl-1.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:54ac15a8b60382b2bcefd9a289ee26dc0920cf59b05368c9b2b72450751c6eb8", size = 360873 }, + { url = "https://files.pythonhosted.org/packages/77/67/c8ab718cb98dfa2ae9ba0f97bf3cbb7d45d37f13fe1fbad25ac92940954e/yarl-1.20.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:25b3bc0763a7aca16a0f1b5e8ef0f23829df11fb539a1b70476dcab28bd83da7", size = 360524 }, + { url = "https://files.pythonhosted.org/packages/bd/e8/c3f18660cea1bc73d9f8a2b3ef423def8dadbbae6c4afabdb920b73e0ead/yarl-1.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2586e36dc070fc8fad6270f93242124df68b379c3a251af534030a4a33ef594", size = 365370 }, + { url = "https://files.pythonhosted.org/packages/c9/99/33f3b97b065e62ff2d52817155a89cfa030a1a9b43fee7843ef560ad9603/yarl-1.20.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:866349da9d8c5290cfefb7fcc47721e94de3f315433613e01b435473be63daa6", size = 373297 }, + { url = "https://files.pythonhosted.org/packages/3d/89/7519e79e264a5f08653d2446b26d4724b01198a93a74d2e259291d538ab1/yarl-1.20.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:33bb660b390a0554d41f8ebec5cd4475502d84104b27e9b42f5321c5192bfcd1", size = 378771 }, + { url = "https://files.pythonhosted.org/packages/3a/58/6c460bbb884abd2917c3eef6f663a4a873f8dc6f498561fc0ad92231c113/yarl-1.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737e9f171e5a07031cbee5e9180f6ce21a6c599b9d4b2c24d35df20a52fabf4b", size = 375000 }, + { url = "https://files.pythonhosted.org/packages/3b/2a/dd7ed1aa23fea996834278d7ff178f215b24324ee527df53d45e34d21d28/yarl-1.20.0-cp312-cp312-win32.whl", hash = "sha256:839de4c574169b6598d47ad61534e6981979ca2c820ccb77bf70f4311dd2cc64", size = 86355 }, + { url = "https://files.pythonhosted.org/packages/ca/c6/333fe0338305c0ac1c16d5aa7cc4841208d3252bbe62172e0051006b5445/yarl-1.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:3d7dbbe44b443b0c4aa0971cb07dcb2c2060e4a9bf8d1301140a33a93c98e18c", size = 92904 }, + { url = "https://files.pythonhosted.org/packages/0f/6f/514c9bff2900c22a4f10e06297714dbaf98707143b37ff0bcba65a956221/yarl-1.20.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2137810a20b933b1b1b7e5cf06a64c3ed3b4747b0e5d79c9447c00db0e2f752f", size = 145030 }, + { url = "https://files.pythonhosted.org/packages/4e/9d/f88da3fa319b8c9c813389bfb3463e8d777c62654c7168e580a13fadff05/yarl-1.20.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:447c5eadd750db8389804030d15f43d30435ed47af1313303ed82a62388176d3", size = 96894 }, + { url = "https://files.pythonhosted.org/packages/cd/57/92e83538580a6968b2451d6c89c5579938a7309d4785748e8ad42ddafdce/yarl-1.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42fbe577272c203528d402eec8bf4b2d14fd49ecfec92272334270b850e9cd7d", size = 94457 }, + { url = "https://files.pythonhosted.org/packages/e9/ee/7ee43bd4cf82dddd5da97fcaddb6fa541ab81f3ed564c42f146c83ae17ce/yarl-1.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18e321617de4ab170226cd15006a565d0fa0d908f11f724a2c9142d6b2812ab0", size = 343070 }, + { url = "https://files.pythonhosted.org/packages/4a/12/b5eccd1109e2097bcc494ba7dc5de156e41cf8309fab437ebb7c2b296ce3/yarl-1.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4345f58719825bba29895011e8e3b545e6e00257abb984f9f27fe923afca2501", size = 337739 }, + { url = "https://files.pythonhosted.org/packages/7d/6b/0eade8e49af9fc2585552f63c76fa59ef469c724cc05b29519b19aa3a6d5/yarl-1.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d9b980d7234614bc4674468ab173ed77d678349c860c3af83b1fffb6a837ddc", size = 351338 }, + { url = "https://files.pythonhosted.org/packages/45/cb/aaaa75d30087b5183c7b8a07b4fb16ae0682dd149a1719b3a28f54061754/yarl-1.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af4baa8a445977831cbaa91a9a84cc09debb10bc8391f128da2f7bd070fc351d", size = 353636 }, + { url = "https://files.pythonhosted.org/packages/98/9d/d9cb39ec68a91ba6e66fa86d97003f58570327d6713833edf7ad6ce9dde5/yarl-1.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123393db7420e71d6ce40d24885a9e65eb1edefc7a5228db2d62bcab3386a5c0", size = 348061 }, + { url = "https://files.pythonhosted.org/packages/72/6b/103940aae893d0cc770b4c36ce80e2ed86fcb863d48ea80a752b8bda9303/yarl-1.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab47acc9332f3de1b39e9b702d9c916af7f02656b2a86a474d9db4e53ef8fd7a", size = 334150 }, + { url = "https://files.pythonhosted.org/packages/ef/b2/986bd82aa222c3e6b211a69c9081ba46484cffa9fab2a5235e8d18ca7a27/yarl-1.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4a34c52ed158f89876cba9c600b2c964dfc1ca52ba7b3ab6deb722d1d8be6df2", size = 362207 }, + { url = "https://files.pythonhosted.org/packages/14/7c/63f5922437b873795d9422cbe7eb2509d4b540c37ae5548a4bb68fd2c546/yarl-1.20.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:04d8cfb12714158abf2618f792c77bc5c3d8c5f37353e79509608be4f18705c9", size = 361277 }, + { url = "https://files.pythonhosted.org/packages/81/83/450938cccf732466953406570bdb42c62b5ffb0ac7ac75a1f267773ab5c8/yarl-1.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7dc63ad0d541c38b6ae2255aaa794434293964677d5c1ec5d0116b0e308031f5", size = 364990 }, + { url = "https://files.pythonhosted.org/packages/b4/de/af47d3a47e4a833693b9ec8e87debb20f09d9fdc9139b207b09a3e6cbd5a/yarl-1.20.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d02b591a64e4e6ca18c5e3d925f11b559c763b950184a64cf47d74d7e41877", size = 374684 }, + { url = "https://files.pythonhosted.org/packages/62/0b/078bcc2d539f1faffdc7d32cb29a2d7caa65f1a6f7e40795d8485db21851/yarl-1.20.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:95fc9876f917cac7f757df80a5dda9de59d423568460fe75d128c813b9af558e", size = 382599 }, + { url = "https://files.pythonhosted.org/packages/74/a9/4fdb1a7899f1fb47fd1371e7ba9e94bff73439ce87099d5dd26d285fffe0/yarl-1.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb769ae5760cd1c6a712135ee7915f9d43f11d9ef769cb3f75a23e398a92d384", size = 378573 }, + { url = "https://files.pythonhosted.org/packages/fd/be/29f5156b7a319e4d2e5b51ce622b4dfb3aa8d8204cd2a8a339340fbfad40/yarl-1.20.0-cp313-cp313-win32.whl", hash = "sha256:70e0c580a0292c7414a1cead1e076c9786f685c1fc4757573d2967689b370e62", size = 86051 }, + { url = "https://files.pythonhosted.org/packages/52/56/05fa52c32c301da77ec0b5f63d2d9605946fe29defacb2a7ebd473c23b81/yarl-1.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:4c43030e4b0af775a85be1fa0433119b1565673266a70bf87ef68a9d5ba3174c", size = 92742 }, + { url = "https://files.pythonhosted.org/packages/d4/2f/422546794196519152fc2e2f475f0e1d4d094a11995c81a465faf5673ffd/yarl-1.20.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b6c4c3d0d6a0ae9b281e492b1465c72de433b782e6b5001c8e7249e085b69051", size = 163575 }, + { url = "https://files.pythonhosted.org/packages/90/fc/67c64ddab6c0b4a169d03c637fb2d2a212b536e1989dec8e7e2c92211b7f/yarl-1.20.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8681700f4e4df891eafa4f69a439a6e7d480d64e52bf460918f58e443bd3da7d", size = 106121 }, + { url = "https://files.pythonhosted.org/packages/6d/00/29366b9eba7b6f6baed7d749f12add209b987c4cfbfa418404dbadc0f97c/yarl-1.20.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:84aeb556cb06c00652dbf87c17838eb6d92cfd317799a8092cee0e570ee11229", size = 103815 }, + { url = "https://files.pythonhosted.org/packages/28/f4/a2a4c967c8323c03689383dff73396281ced3b35d0ed140580825c826af7/yarl-1.20.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f166eafa78810ddb383e930d62e623d288fb04ec566d1b4790099ae0f31485f1", size = 408231 }, + { url = "https://files.pythonhosted.org/packages/0f/a1/66f7ffc0915877d726b70cc7a896ac30b6ac5d1d2760613603b022173635/yarl-1.20.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5d3d6d14754aefc7a458261027a562f024d4f6b8a798adb472277f675857b1eb", size = 390221 }, + { url = "https://files.pythonhosted.org/packages/41/15/cc248f0504610283271615e85bf38bc014224122498c2016d13a3a1b8426/yarl-1.20.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a8f64df8ed5d04c51260dbae3cc82e5649834eebea9eadfd829837b8093eb00", size = 411400 }, + { url = "https://files.pythonhosted.org/packages/5c/af/f0823d7e092bfb97d24fce6c7269d67fcd1aefade97d0a8189c4452e4d5e/yarl-1.20.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d9949eaf05b4d30e93e4034a7790634bbb41b8be2d07edd26754f2e38e491de", size = 411714 }, + { url = "https://files.pythonhosted.org/packages/83/70/be418329eae64b9f1b20ecdaac75d53aef098797d4c2299d82ae6f8e4663/yarl-1.20.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c366b254082d21cc4f08f522ac201d0d83a8b8447ab562732931d31d80eb2a5", size = 404279 }, + { url = "https://files.pythonhosted.org/packages/19/f5/52e02f0075f65b4914eb890eea1ba97e6fd91dd821cc33a623aa707b2f67/yarl-1.20.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91bc450c80a2e9685b10e34e41aef3d44ddf99b3a498717938926d05ca493f6a", size = 384044 }, + { url = "https://files.pythonhosted.org/packages/6a/36/b0fa25226b03d3f769c68d46170b3e92b00ab3853d73127273ba22474697/yarl-1.20.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c2aa4387de4bc3a5fe158080757748d16567119bef215bec643716b4fbf53f9", size = 416236 }, + { url = "https://files.pythonhosted.org/packages/cb/3a/54c828dd35f6831dfdd5a79e6c6b4302ae2c5feca24232a83cb75132b205/yarl-1.20.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d2cbca6760a541189cf87ee54ff891e1d9ea6406079c66341008f7ef6ab61145", size = 402034 }, + { url = "https://files.pythonhosted.org/packages/10/97/c7bf5fba488f7e049f9ad69c1b8fdfe3daa2e8916b3d321aa049e361a55a/yarl-1.20.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:798a5074e656f06b9fad1a162be5a32da45237ce19d07884d0b67a0aa9d5fdda", size = 407943 }, + { url = "https://files.pythonhosted.org/packages/fd/a4/022d2555c1e8fcff08ad7f0f43e4df3aba34f135bff04dd35d5526ce54ab/yarl-1.20.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f106e75c454288472dbe615accef8248c686958c2e7dd3b8d8ee2669770d020f", size = 423058 }, + { url = "https://files.pythonhosted.org/packages/4c/f6/0873a05563e5df29ccf35345a6ae0ac9e66588b41fdb7043a65848f03139/yarl-1.20.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3b60a86551669c23dc5445010534d2c5d8a4e012163218fc9114e857c0586fdd", size = 423792 }, + { url = "https://files.pythonhosted.org/packages/9e/35/43fbbd082708fa42e923f314c24f8277a28483d219e049552e5007a9aaca/yarl-1.20.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e429857e341d5e8e15806118e0294f8073ba9c4580637e59ab7b238afca836f", size = 422242 }, + { url = "https://files.pythonhosted.org/packages/ed/f7/f0f2500cf0c469beb2050b522c7815c575811627e6d3eb9ec7550ddd0bfe/yarl-1.20.0-cp313-cp313t-win32.whl", hash = "sha256:65a4053580fe88a63e8e4056b427224cd01edfb5f951498bfefca4052f0ce0ac", size = 93816 }, + { url = "https://files.pythonhosted.org/packages/3f/93/f73b61353b2a699d489e782c3f5998b59f974ec3156a2050a52dfd7e8946/yarl-1.20.0-cp313-cp313t-win_amd64.whl", hash = "sha256:53b2da3a6ca0a541c1ae799c349788d480e5144cac47dba0266c7cb6c76151fe", size = 101093 }, + { url = "https://files.pythonhosted.org/packages/ea/1f/70c57b3d7278e94ed22d85e09685d3f0a38ebdd8c5c73b65ba4c0d0fe002/yarl-1.20.0-py3-none-any.whl", hash = "sha256:5d0fe6af927a47a230f31e6004621fd0959eaa915fc62acfafa67ff7229a3124", size = 46124 }, ] [[package]] name = "zarr" -version = "3.0.6" +version = "3.0.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "donfig" }, @@ -3825,9 +3954,9 @@ dependencies = [ { name = "packaging" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6f/bf/2820e8ad5f086ea5cd4c4d65eb5e0113f98145ddf5810cec1c75fb10fb98/zarr-3.0.6.tar.gz", hash = "sha256:6ef23c740e34917a2a1099471361537732942e49f0cabe95c9b7124cd0d6d84f", size = 240812 } +sdist = { url = "https://files.pythonhosted.org/packages/52/60/9652fd0536fbaca8d08cbc1a5572c52e0ce01773297df75da8bb47e45907/zarr-3.0.8.tar.gz", hash = "sha256:88505d095af899a88ae8ac4db02f4650ef0801d2ff6f65b6d1f0a45dcf760a6d", size = 256825 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/38/56a1c129577d20dc975a934ccc3f7f16276eab04ff0ffbe02ea348407a37/zarr-3.0.6-py3-none-any.whl", hash = "sha256:dba078726b6e4defb0ae6a852b7e7035ce163d89d485961681ece49191dcce82", size = 196357 }, + { url = "https://files.pythonhosted.org/packages/00/3b/e20bdf84088c11f2c396d034506cbffadd53e024111c1aa4585c2aba1523/zarr-3.0.8-py3-none-any.whl", hash = "sha256:7f81e7aec086437d98882aa432209107114bd7f3a9f4958b2af9c6b5928a70a7", size = 205364 }, ] [[package]] @@ -3863,9 +3992,9 @@ wheels = [ [[package]] name = "zipp" -version = "3.21.0" +version = "3.22.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 } +sdist = { url = "https://files.pythonhosted.org/packages/12/b6/7b3d16792fdf94f146bed92be90b4eb4563569eca91513c8609aebf0c167/zipp-3.22.0.tar.gz", hash = "sha256:dd2f28c3ce4bc67507bfd3781d21b7bb2be31103b51a4553ad7d90b84e57ace5", size = 25257 } 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://files.pythonhosted.org/packages/ad/da/f64669af4cae46f17b90798a827519ce3737d31dbafad65d391e49643dc4/zipp-3.22.0-py3-none-any.whl", hash = "sha256:fe208f65f2aca48b81f9e6fd8cf7b8b32c26375266b009b413d45306b6148343", size = 9796 }, ] From 9dd9fbc88cadd4e23a0ddfd6cc1689db8aa26c17 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Tue, 24 Jun 2025 20:17:55 +0000 Subject: [PATCH 16/56] schema_v1-dataset_builder-add_dimension --- .devcontainer/Dockerfile.cli | 47 +++ .devcontainer/Dockerfile.dev | 61 ++++ .devcontainer/Dockerfile.nox | 49 +++ .devcontainer/devcontainer.json | 19 +- DEVELOPER_NOTES.md | 107 ++++++ src/mdio/schemas/v1/dataset_builder.py | 195 +++++++++++ tests/unit/v1/__init__.py | 1 + .../v1/test_dataset_builder_add_dimension.py | 307 ++++++++++++++++++ .../unit/v1/test_dataset_builder_internals.py | 208 ++++++++++++ tests/unit/v1/test_dataset_builder_state.py | 88 +++++ 10 files changed, 1073 insertions(+), 9 deletions(-) create mode 100644 .devcontainer/Dockerfile.cli create mode 100644 .devcontainer/Dockerfile.dev create mode 100644 .devcontainer/Dockerfile.nox create mode 100644 DEVELOPER_NOTES.md create mode 100644 src/mdio/schemas/v1/dataset_builder.py create mode 100644 tests/unit/v1/__init__.py create mode 100644 tests/unit/v1/test_dataset_builder_add_dimension.py create mode 100644 tests/unit/v1/test_dataset_builder_internals.py create mode 100644 tests/unit/v1/test_dataset_builder_state.py diff --git a/.devcontainer/Dockerfile.cli b/.devcontainer/Dockerfile.cli new file mode 100644 index 000000000..92720e34e --- /dev/null +++ b/.devcontainer/Dockerfile.cli @@ -0,0 +1,47 @@ +# HOW TO BUILD AND RUN THIS DOCKERFILE +# * Clone mdio-python and build a Docker image: +# git clone https://github.com/TGSAI/mdio-python.git +# cd mdio-python +# docker build -t mdio-cli -f .devcontainer/Dockerfile.cli . +# * Run /bin/bash in the Docker container: +# +# +# USAGE: +# docker run -it --rm --name mdio-cli mdio-cli --version +# docker run -it --rm --name mdio-cli mdio-cli --help +# +# LOCAL_DATA_DIR=$(pwd); \ +# docker run -it --rm -v $LOCAL_DATA_DIR:/DATA --name mdio-cli mdio-cli \ +# segy import \ +# /DATA/segy_file.segy \ +# /DATA/mdio_file.mdio \ +# -loc 181,185 \ +# -names inline,crossline +# +# LOCAL_DATA_DIR=$(pwd); \ +# docker run -it --rm -v $LOCAL_DATA_DIR:/DATA --name mdio-cli mdio-cli \ +# segy export \ +# /DATA/mdio_file.mdio \ +# /DATA/segy_file_copy.segy +# +FROM python:3.13-bookworm +# Create the user (https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user) +ENV USERNAME=python +ENV USER_UID=1000 +ENV USER_GID=$USER_UID +RUN groupadd --gid $USER_GID $USERNAME && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME + +# Set the default non-root user +USER $USERNAME + +# Add path to the user-installed packages +ENV PYTHONUSERBASE=/home/$USERNAME/.local +ENV PATH="$PYTHONUSERBASE/bin:$PATH" + +COPY --chown=$USERNAME:$USERNAME ./ /home/$USERNAME/mdio-python + +WORKDIR /home/$USERNAME/mdio-python +RUN pip install . + +ENTRYPOINT ["mdio"] +CMD ["--version"] diff --git a/.devcontainer/Dockerfile.dev b/.devcontainer/Dockerfile.dev new file mode 100644 index 000000000..05f135799 --- /dev/null +++ b/.devcontainer/Dockerfile.dev @@ -0,0 +1,61 @@ +# USAGE: +# This file will be used by the VS Code DevContainer extension +# to create a development environment for the mdio-python project. +# HOW TO RUN TESTS +# 1. Open the project in VS Code. +# 2. Open the Command Palette (Ctrl+Shift+P) and select "Dev Containers: Reopen in Container". +# 3. Once the container is running, open a terminal in VS Code. +# 4. Run the tests using the command: `nox -s test`. +# HOW TO MANUALLY BUILD AND RUN THE CONTAINER +# docker build -t mdio-dev -f .devcontainer/Dockerfile.dev . +# docker run -it --rm --entrypoint /bin/bash --name mdio-dev mdio-dev +# NOTES: +# 1. The container will be run as the non-root user 'vscode' with UID 1000. +# 2. The virtual environment will be setup at /home/vscode/venv +# 3. The project source code will be mounted at /workspaces/mdio-python +ARG PYTHON_VERSION="3.13" +ARG LINUX_DISTRO="bookworm" +ARG UV_VERSION="0.6.11" +ARG NOX_VERSION="2025.2.9" +FROM mcr.microsoft.com/devcontainers/python:1-${PYTHON_VERSION}-${LINUX_DISTRO} + +# Install git for nox pre-commit +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + git \ + && rm -rf /var/lib/apt/lists/* + +ENV USERNAME="vscode" +USER $USERNAME + +# # Add path to the user-installed packages +# ENV PYTHONUSERBASE=/home/$USERNAME/.local +# ENV PATH="$PYTHONUSERBASE/bin:$PATH" + +COPY --chown=$USERNAME:$USERNAME ./ /workspaces/mdio-python + +WORKDIR /workspaces/mdio-python + +ARG UV_VERSION +ARG NOX_VERSION +RUN python3 -m pip install uv==${UV_VERSION} nox==${NOX_VERSION} msgpack ipykernel + +# Initialize virtual environement in the container +ENV VIRTUAL_ENV="/home/$USERNAME/venv" +RUN python3 -m venv $VIRTUAL_ENV +ENV PATH="$VIRTUAL_ENV/bin:$PATH" + +# installing pytest is required for VS Code Python Testing +RUN pip install pytest pytest-cov pytest-mock pytest-asyncio + +# Install the project in editable mode +# This allows for live reloading of the code during development +RUN pip install -e . + +# RUN uv pip install snakeviz + + + + + + diff --git a/.devcontainer/Dockerfile.nox b/.devcontainer/Dockerfile.nox new file mode 100644 index 000000000..103673fd2 --- /dev/null +++ b/.devcontainer/Dockerfile.nox @@ -0,0 +1,49 @@ +# HOW TO BUILD AND RUN THIS DOCKERFILE +# 1. Make sure you have Docker installed and running. +# 2. Clone mdio-python and build the Docker image: +# git clone https://github.com/TGSAI/mdio-python.git +# cd mdio-python +# docker build -t mdio-nox -f .devcontainer/Dockerfile.nox . +# 3. Run /bin/bash in the Docker container : +# LOCAL_DATA_DIR=$(pwd); \ +# docker run -it --rm -v $LOCAL_DATA_DIR:/DATA --entrypoint /bin/bash --name mdio-nox mdio-nox +# +# USAGE: +# docker run -it --rm mdio-nox --list +# docker run -it --rm mdio-nox -s tests-3.13 +# docker run -it --rm mdio-nox --no-stop-on-first-error +# +# NOTE: nox will fail if run in the directory mounted from the host machine +ARG PYTHON_VERSION="3.13" +ARG LINUX_DISTRO="bookworm" +ARG UV_VERSION="0.6.11" +ARG NOX_VERSION="2025.2.9" +FROM python:${PYTHON_VERSION}-${LINUX_DISTRO} +ARG PYTHON_VERSION +ARG LINUX_DISTRO +RUN echo "Using python:${PYTHON_VERSION}-${LINUX_DISTRO}" +# Create the user (https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user) +ENV USERNAME=python +ENV USER_UID=1000 +ENV USER_GID=$USER_UID +RUN groupadd --gid $USER_GID $USERNAME && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME +# Set the default non-root user +USER $USERNAME + +# Add path to the user-installed packages +ENV PYTHONUSERBASE=/home/$USERNAME/.local +ENV PATH="$PYTHONUSERBASE/bin:$PATH" + +COPY --chown=$USERNAME:$USERNAME ./ /home/$USERNAME/mdio-python + +WORKDIR /home/$USERNAME/mdio-python +RUN pip install . + +# Install UV dependency manager and Nox test automator +ARG UV_VERSION +ARG NOX_VERSION +RUN echo "Using uv: $UV_VERSION and nox: $NOX_VERSION" +RUN python3 -m pip install uv==${UV_VERSION} nox==${NOX_VERSION} msgpack ipykernel + +ENTRYPOINT ["nox"] +CMD ["--list"] \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b618a5260..ea5dc99ef 100755 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,12 +2,12 @@ // README at: https://github.com/devcontainers/templates/tree/main/src/python { "build": { - "dockerfile": "Dockerfile", + "dockerfile": "Dockerfile.dev", "context": ".." }, // Use 'postCreateCommand' to run commands after the container is created. "postCreateCommand": { - "post_create_script": "bash ./.devcontainer/post-install.sh" + // "post_create_script": "bash ./.devcontainer/post-install.sh" }, // Forward 8787 to enable us to view dask dashboard "forwardPorts": [8787], @@ -16,8 +16,9 @@ // Configure properties specific to VS Code. "vscode": { "settings": { - "python.terminal.activateEnvInCurrentTerminal": true, - "python.defaultInterpreterPath": "/opt/venv/bin/python" + "python.testing.pytestArgs": ["tests"], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true }, "extensions": [ "ms-python.python", @@ -27,17 +28,17 @@ "ms-toolsai.jupyter-renderers", "vscode-icons-team.vscode-icons", "wayou.vscode-todo-highlight", - "streetsidesoftware.code-spell-checker" + "streetsidesoftware.code-spell-checker", + "eamodio.gitlens" ] } }, // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. // "remoteUser": "root", "updateRemoteUserUID": true, + "workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/mdio-python,type=bind", + "workspaceFolder": "/workspaces/mdio-python", "mounts": [ - // Re-use local Git configuration - "source=${localEnv:HOME}/.gitconfig,target=/home/vscode/.gitconfig_tmp,type=bind,consistency=cached", - "source=${localEnv:HOME}/.gitconfig,target=/root/.gitconfig_tmp,type=bind,consistency=cached", - "source=${localEnv:SCRATCH_DIR}/${localEnv:USER},target=/scratch/,type=bind,consistency=cached" + // "source=${localWorkspaceFolder}/../DATA/,target=/DATA/,type=bind,consistency=cached" ] } diff --git a/DEVELOPER_NOTES.md b/DEVELOPER_NOTES.md new file mode 100644 index 000000000..7dcda95de --- /dev/null +++ b/DEVELOPER_NOTES.md @@ -0,0 +1,107 @@ +# Developer Notes +What are the goals for MDIO v1: + +## Overall API design and implementation +1. Do we want to have a strongly-typed (see pydantic) or dynamic-typed (see dictionary args) API? + For example +```Python + # Strongly typed + builder.add_dimension( + "length", + size=100, + data_type=ScalarType.FLOAT32, + metadata=[ + AllUnits(units_v1=LengthUnitModel( + length=LengthUnitEnum.FOOT)), + UserAttributes( + attributes={"MGA": 51, "UnitSystem": "Imperial"}), + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape( + chunk_shape=[20]))), + StatisticsMetadata(stats_v1=SummaryStatistics( + count=100, + sum=1215.1, + sumSquares=125.12, + min=5.61, + max=10.84, + histogram=CenteredBinHistogram( + binCenters=[1, 2], + counts=[10, 15]))) + ] + ) + + # dynamically-typed + builder.add_dimension( + "depth", + size=100, + data_type=ScalarType.FLOAT32, + metadata={ + "unitsV1": {"length": "m"}, + "attributes": {"MGA": 51}, + "chunkGrid": {"name": "regular", "configuration": {"chunkShape": [20]}}, + "statsV1": { + "count": 100, + "sum": 1215.1, + "sumSquares": 125.12, + "min": 5.61, + "max": 10.84, + "histogram": {"binCenters": [1, 2], "counts": [10, 15]}, + }, + }, + ) +``` +2. How extensive the handling of the edge cases and the invalid arguments should be? This affects the ammount of validation code that needs to be written + For example, + * Should we validate in the code that the units list contain a single item for the dimensions units + or should we expect the developer to always pass a single-item list? + * Should we test the statistics for count > 0 or dim(binCenter) == dim(count) in the case above? + +## V1 Schema questions +1. Why do we allow default / empty names? +2. Adding a dimension with the same name multiple times: is it allowed or should it raise an error? + * It is currently allowed: the second request is ignored + * Adding a dimension with the same name, but the different size currently throws an error +3. Why do we allow methods with dictionary parameters (non-strongly-typed)? +4. For the add_dimension(): + * Can AllUnits / UserAttributes / ChunkGridMetadata / StatisticsMetadata be repeated in the metadata list? + * For units, chunkGrid, statsV1 dict should we validate structure of the data passed in? + * Do we validate the unit string supplied in dictionary parameters? What what if someone supplies ftUS instead of ft? + * Are multiple dimension attributes allowed (I assume yes)? +5. It is not clear, how RectilinearChunkGrid can be mapped to a single dimension + ```RectilinearChunkGrid(configuration=RectilinearChunkShape(chunk_shape=[[2,3,4],[2,3,4]]))``` +6. StatisticsMetadata accepts list[SummaryStatistics]. what does this mean and does it need to be tested? +7. The pydentic attribute names are different from the v1 schema attributes names. + 'statsV1' <-> 'stats_v1', 'unitsV1' <-> 'units_v1', 'chunkGrid' <-> 'chunk_grid' + Tgus, we will pass `units_v1` if we use the typesafe API and `'unitsV1` if we use dictionary API +8. Can we add two variables with the same name? +9. Why histogram (e.g., SummaryStatistics) does not have a `histogram_type` attribute? +10. Why 'ftUS' is not supported by the schema? + Units: what foot does the MDIO uses: the U.S. survey foot or the International Foot? + The U.S. survey foot is defined as 1200/3937 meters, while the international foot is defined as exactly 0.3048 meters. + https://www.axiomint.com/survey-foot-versus-international-foot-whats-the-difference/ + "The REAL issue is when ... applied to State Plane coordinates in the N2,000,000 and E6,000,000 range! + This ... moves a State Plane coordinate position 4 feet by 12 feet. + +## Unclear +* Did we have a notion of the fixed increment for inline & xline annotations? +* How is rotation of East/North axes relatively to inline/xline axes is handled +* How is right-handed and left-handed surveys are handled? +* add_variable - should dimensions argument be required?? + +(src/mdio/schemas/v1/dataset_builder.py) +## Design suggestions +1. Instead of trying to track the state, should we just return a wrapper/pimpl class with the permitted methods? +2. Should we rename add_dimension to add_dimension_variable / add_dimension_annotation to indicate that we not just + providing the dimension name, but also creating the dimension variable +4. add_variable - should we call it `append_variable`. add implies that either name or index must be provided. + +## Under constructions +* TODO: ??? refactor _BuilderState to make inner class ??? +* TODO: Need an example of EdgeDefinedHistogram for add_dimension with histogram + +## Bugs +1. I assume we do not want attribute.attribute in the contract (see docs\tutorials\builder.ipynb) + 'metadata': {'unitsV1': {'length': 'm'}, 'attributes': {'attributes': {'MGA': 51}}} + +https://osdu.pages.opengroup.org/platform/domain-data-mgmt-services/seismic/open-vds/vds/specification/Metadata.html \ No newline at end of file diff --git a/src/mdio/schemas/v1/dataset_builder.py b/src/mdio/schemas/v1/dataset_builder.py new file mode 100644 index 000000000..ea431e4c3 --- /dev/null +++ b/src/mdio/schemas/v1/dataset_builder.py @@ -0,0 +1,195 @@ +"""Builder pattern implementation for MDIO v1 schema models.""" + +from collections.abc import Mapping +from datetime import UTC +from datetime import datetime +from enum import Enum +from enum import auto +from typing import Any + +from pydantic import BaseModel +from zarr.core.chunk_key_encodings import V2ChunkKeyEncoding # noqa: F401 + +from mdio.schemas.compressors import ZFP +from mdio.schemas.compressors import Blosc +from mdio.schemas.dimension import NamedDimension +from mdio.schemas.dtype import ScalarType, StructuredType +from mdio.schemas.metadata import ChunkGridMetadata, UserAttributes +from mdio.schemas.v1.dataset import Dataset +from mdio.schemas.v1.stats import StatisticsMetadata, SummaryStatistics +from mdio.schemas.v1.units import AllUnitModel, AllUnits +from mdio.schemas.v1.variable import Coordinate, Variable, VariableMetadata + +# TODO: Why do we allow default names? +# TODO: Instead of trying to track the state, should we just return a wrapper class with permitted methods? +# TODO: refactor to make inner class +class _BuilderState(Enum): + """States for the template builder.""" + + INITIAL = auto() + HAS_DIMENSIONS = auto() + HAS_COORDINATES = auto() + HAS_VARIABLES = auto() + +def contains_dimension(dimensions: list[NamedDimension], name_or_NamedDimension: str | NamedDimension) -> bool: + """Check if a dimension with the given name exists in the list.""" + if isinstance(name_or_NamedDimension, str): + name = name_or_NamedDimension + return get_dimension(dimensions, name) is not None + elif isinstance(name_or_NamedDimension, NamedDimension): + named_dimension = name_or_NamedDimension + return get_dimension(dimensions, named_dimension.name, named_dimension.size) is not None + else: + msg = f"Expected str or NamedDimension, got {type(name_or_NamedDimension).__name__}" + raise TypeError(msg) + +def get_dimension(dimensions: list[NamedDimension], name: str, size: int | None = None) -> NamedDimension | None: + """Get a dimension by name from the list.""" + if dimensions is None: + return False + if not isinstance(name, str): + raise TypeError(f"Expected str, got {type(name).__name__}") + + nd = next((dim for dim in dimensions if dim.name == name), None) + if nd is None: + return None + if size is not None and nd.size != size: + msg = f"Dimension {name!r} found but size {nd.size} does not match expected size {size}" + raise ValueError(msg) + return nd + +def to_dictionary(val: BaseModel) -> dict[str, Any]: + """Convert a pydantic BaseModel to a dictionary.""" + if not isinstance(val, BaseModel): + raise TypeError(f"Expected BaseModel, got {type(val).__name__}") + return val.model_dump(mode="json", by_alias=True) + +class MDIODatasetBuilder: + """Builder for creating MDIO datasets with enforced build order. + + This builder implements the builder pattern to create MDIO datasets with a v1 schema. + It enforces a specific build order to ensure valid dataset construction: + 1. Must add dimensions first via add_dimension() + 2. Can optionally add coordinates via add_coordinate() + 3. Must add variables via add_variable() + 4. Must call build() to create the dataset. + """ + + def __init__(self, name: str, attributes: dict[str, Any] | None = None): + self.name = name + self.api_version = "1.0.0" # TODO(BrianMichell, #0): Pull from package metadata + self.created_on = datetime.now(UTC) + self.attributes = attributes + self._dimensions: list[NamedDimension] = [] + self._coordinates: list[Coordinate] = [] + self._variables: list[Variable] = [] + self._state = _BuilderState.INITIAL + self._unnamed_variable_counter = 0 + + + def _add_named_dimensions(self, dimensions: list[NamedDimension | str] | None) -> list[NamedDimension]: + if dimensions is None: + return [] + + added_dims = [] + for dim in dimensions: + if isinstance(dim, str): + if not contains_dimension(self._dimensions, dim): + raise ValueError(f"Dimension named {dim!r} is not found") + else: + if not isinstance(dim, NamedDimension): + raise TypeError(f"Expected NamedDimension or str, got {type(dim).__name__}") + if contains_dimension(self._dimensions, dim): + continue + self._dimensions.append(dim) + added_dims.append(dim) + return added_dims + + + def _make_VariableMetadata_from_list(metadata: list[AllUnits | UserAttributes]) -> Any: + metadata_dict = {} + for md in metadata: + # NOTE: the pydentic attribute names are different from the v1 schema attributes names + # 'statsV1' <-> 'stats_v1', 'unitsV1' <-> 'units_v1', 'chunkGrid' <-> 'chunk_grid' + if isinstance(md, AllUnits): + val = md.units_v1 + metadata_dict["unitsV1"] = to_dictionary(val) + elif isinstance(md, UserAttributes): + # NOTE: md.attributes is not pydantic type, but a dictionary + metadata_dict["attributes"] = to_dictionary(md)["attributes"] + elif isinstance(md, ChunkGridMetadata): + val = md.chunk_grid + metadata_dict["chunkGrid"] = to_dictionary(val) + elif isinstance(md, StatisticsMetadata): + val = md.stats_v1 + metadata_dict["statsV1"] = to_dictionary(val) + else: + raise TypeError(f"Unsupported metadata type: {type(md)}") + return VariableMetadata(**metadata_dict) + + + def _make_VariableMetadata_from_dict(metadata: dict[str, Any]) -> type[BaseModel]: + converted_dict = {} + for key, value in metadata.items(): + if key == "unitsV1" or key == "statsV1" or key == "chunkGrid" or key == "attributes": + # TODO: Should we validate the structure of the value passed in? + if not isinstance(value, dict): + raise TypeError(f"Invalid value for key '{key}': {value!r}. Expected a dictionary.") + else: + raise TypeError(f"Unsupported metadata key: '{key}'. Expected 'unitsV1', 'attributes', 'chunkGrid', or 'statsV1.") + converted_dict[key] = value + return VariableMetadata(**converted_dict) + + + def _make_VariableMetadata(metadata: list[AllUnits | UserAttributes] | dict[str, Any] | None = None) -> Any | None: + if metadata is None: + return None + + if isinstance(metadata, list): + return MDIODatasetBuilder._make_VariableMetadata_from_list(metadata) + + if isinstance(metadata, dict): + return MDIODatasetBuilder._make_VariableMetadata_from_dict(metadata) + + raise TypeError(f"Unsupported metadata type: {type(metadata)}") + + + def add_dimension( # noqa: PLR0913 + self, + name: str, + size: int, + long_name: str = None, + data_type: ScalarType | StructuredType = ScalarType.INT32, + metadata: list[AllUnits | UserAttributes] | None | dict[str, Any] = None, + ) -> "MDIODatasetBuilder": + """Add a dimension. + + This must be called at least once before adding coordinates or variables. + + Args: + name: Name of the dimension + size: Size of the dimension + long_name: Optional long name for the dimension variable + data_type: Data type for the dimension variable (defaults to INT32) + metadata: Optional metadata for the dimension variable + + Returns: + self: Returns self for method chaining + """ + + added_dims = self._add_named_dimensions([NamedDimension(name=name, size=size)]) + if added_dims: + # Create a variable for the dimension + dim_var = Variable( + name=name, + longName=long_name, + dimensions=added_dims, + dataType=data_type, + compressor=None, + coordinates=None, + metadata=MDIODatasetBuilder._make_VariableMetadata(metadata) + ) + self._variables.append(dim_var) + + self._state = _BuilderState.HAS_DIMENSIONS + return self diff --git a/tests/unit/v1/__init__.py b/tests/unit/v1/__init__.py new file mode 100644 index 000000000..3db3a8e50 --- /dev/null +++ b/tests/unit/v1/__init__.py @@ -0,0 +1 @@ +"""Unit tests for parts of the MDIO package related to the v1 schema""" \ No newline at end of file diff --git a/tests/unit/v1/test_dataset_builder_add_dimension.py b/tests/unit/v1/test_dataset_builder_add_dimension.py new file mode 100644 index 000000000..bac9a8383 --- /dev/null +++ b/tests/unit/v1/test_dataset_builder_add_dimension.py @@ -0,0 +1,307 @@ + +import pytest + +from datetime import datetime + +from mdio.schemas.chunk_grid import RectilinearChunkGrid, RectilinearChunkShape, RegularChunkGrid, RegularChunkShape +from mdio.schemas.dtype import ScalarType, StructuredType + +from mdio.schemas.dimension import NamedDimension +from mdio.schemas.metadata import ChunkGridMetadata, UserAttributes +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder, contains_dimension, get_dimension, _BuilderState +from mdio.schemas.v1.stats import CenteredBinHistogram, Histogram, StatisticsMetadata, SummaryStatistics +from mdio.schemas.v1.units import AllUnits, LengthUnitEnum, LengthUnitModel + +def test_add_dimension() -> None: + """Test adding a dimension to the dataset builder.""" + builder = MDIODatasetBuilder("Test Dataset Builder") + + builder.add_dimension(name="inline", size=2, long_name="Inline dimension") + assert len(builder._dimensions) == 1 + assert builder._dimensions[0] == NamedDimension(name="inline", size=2) + assert len(builder._variables) == 1 + assert builder._state == _BuilderState.HAS_DIMENSIONS + + +def test_add_dimension() -> None: + """Test dimension builder state transitions and functionality.""" + builder = MDIODatasetBuilder("test_dataset") + + # First dimension should change state to HAS_DIMENSIONS and create a variable + builder.add_dimension("x", 100, long_name="X Dimension") + assert builder._state == _BuilderState.HAS_DIMENSIONS + assert len(builder._dimensions) == 1 # noqa: PLR2004 + assert len(builder._variables) == 1 # noqa: PLR2004 + assert builder._dimensions[0].name == "x" + assert builder._dimensions[0].size == 100 # noqa: PLR2004 + var0 = builder._variables[0] + assert var0.name == "x" + assert var0.long_name == "X Dimension" + assert var0.data_type == ScalarType.INT32 + assert var0.dimensions[0].name == "x" + + # Adding another dimension should maintain state and create another variable + builder.add_dimension("y", 200, data_type=ScalarType.UINT32) + assert builder._state == _BuilderState.HAS_DIMENSIONS + assert len(builder._dimensions) == 2 # noqa: PLR2004 + assert len(builder._variables) == 2 # noqa: PLR2004 + assert builder._dimensions[1].name == "y" + assert builder._dimensions[1].size == 200 # noqa: PLR2004 + var1 = builder._variables[1] + assert var1.name == "y" + assert var1.data_type == ScalarType.UINT32 + assert var1.dimensions[0].name == "y" + + # TODO: Adding a dimension with the same: is allowed allowed (currently ignored) or should have raise an error? + builder.add_dimension("x", 100, long_name="X Dimension") + assert builder._state == _BuilderState.HAS_DIMENSIONS + assert len(builder._dimensions) == 2 # noqa: PLR2004 + assert len(builder._variables) == 2 # noqa: PLR2004 + + # Adding a dimension with the same name and different size throws an error + with pytest.raises(ValueError, match="Dimension 'x' found but size 100 does not match expected size 200"): + builder.add_dimension("x", 200, long_name="X Dimension") + assert builder._state == _BuilderState.HAS_DIMENSIONS + + + +def test_add_dimension_with_units() -> None: + """Test adding dimensions with units.""" + builder = MDIODatasetBuilder("test_dataset") + + # Add dimension with units as a dictionary + builder.add_dimension( + "depth", + size=100, + data_type=ScalarType.FLOAT32, + metadata={"unitsV1": {"length": "m"}}, + ) + assert len(builder._variables) == 1 + var0 = builder._variables[0] + assert var0.name == "depth" + assert var0.data_type == ScalarType.FLOAT32 + assert var0.metadata.units_v1.length == "m" + + # Add dimension with strongly-typed unit list of single-item + builder.add_dimension( + "length", + size=100, + data_type=ScalarType.FLOAT64, + metadata=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT))], + ) + assert len(builder._variables) == 2 + var1 = builder._variables[1] + assert var1.name == "length" + assert var1.data_type == ScalarType.FLOAT64 + assert var1.metadata.units_v1.length == "ft" + + +def test_add_dimension_with_attributes() -> None: + """Test adding dimensions with attributes.""" + builder = MDIODatasetBuilder("test_dataset") + + # Add dimension with attributes as dictionary + builder.add_dimension( + "depth", + size=100, + data_type=ScalarType.FLOAT32, + metadata={"attributes": {"MGA": 51, "UnitSystem": "Imperial"}} + ) + assert len(builder._variables) == 1 + var0 = builder._variables[0] + assert var0.name == "depth" + assert var0.data_type == ScalarType.FLOAT32 + assert var0.metadata.attributes["MGA"] == 51 # noqa: PLR2004 + assert var0.metadata.attributes["UnitSystem"] == "Imperial" + + # Add dimension with strongly-typed attribute list + builder.add_dimension( + "length", + size=100, + data_type=ScalarType.FLOAT32, + metadata=[UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"})] + ) + assert len(builder._variables) == 2 + var1 = builder._variables[1] + assert var1.name == "length" + assert var1.data_type == ScalarType.FLOAT32 + assert var1.metadata.attributes["MGA"] == 51 # noqa: PLR2004 + assert var1.metadata.attributes["UnitSystem"] == "Imperial" + + +def test_add_dimension_with_chunk_grid() -> None: + """Test adding dimensions with chunk grid.""" + builder = MDIODatasetBuilder("test_dataset") + + # Add dimension with chunk grid as dictionary + builder.add_dimension( + "depth", + size=100, + data_type=ScalarType.FLOAT32, + metadata={"chunkGrid": {"name": "regular", "configuration": {"chunkShape": [20]}}}, + ) + assert len(builder._variables) == 1 + var0 = builder._variables[0] + assert var0.name == "depth" + assert var0.data_type == ScalarType.FLOAT32 + assert var0.metadata.chunk_grid.name == "regular" + assert var0.metadata.chunk_grid.configuration.chunk_shape == [20] + + + # Add dimension with strongly-typed chunk grid + # TODO: It is not clear, how RectilinearChunkGrid can be mapped to a single dimension + # grid_definition = RectilinearChunkGrid(configuration=RectilinearChunkShape(chunk_shape=[[2,3,4],[2,3,4]])) + grid_definition = RegularChunkGrid(configuration=RegularChunkShape(chunk_shape=[20])) + builder.add_dimension( + "length", + size=100, + data_type=ScalarType.FLOAT32, + metadata=[ChunkGridMetadata(chunk_grid=grid_definition)] + ) + assert len(builder._variables) == 2 + var1 = builder._variables[1] + assert var1.name == "length" + assert var1.data_type == ScalarType.FLOAT32 + assert var1.metadata.chunk_grid.name == "regular" + assert var1.metadata.chunk_grid.configuration.chunk_shape == [20] + +def test_add_dimension_with_stats() -> None: + """Test adding dimensions with stats.""" + builder = MDIODatasetBuilder("test_dataset") + + # TODO: Are multiple statistic object supported? + # TODO: StatisticsMetadata accepts list[SummaryStatistics], what does this mean and does it need to be tested? + + # TODO: What is the proper spelling 'statsV1' or 'stats_v1'? Needs to be documented. + + # Add dimension with strongly-typed stats + builder.add_dimension( + "depth", + size=100, + data_type=ScalarType.FLOAT32, + metadata=[StatisticsMetadata(stats_v1=SummaryStatistics( + count=100, + sum=1215.1, + sumSquares=125.12, + min=5.61, + max=10.84, + # TODO: Also test EdgeDefinedHistogram + histogram=CenteredBinHistogram(binCenters=[1, 2], counts=[10, 15]) + ))] + ) + assert len(builder._variables) == 1 + var0 = builder._variables[0] + assert var0.name == "depth" + assert var0.data_type == ScalarType.FLOAT32 + assert var0.metadata.stats_v1.count == 100 # noqa: PLR2004 + assert var0.metadata.stats_v1.sum == 1215.1 # noqa: PLR2004 + + # Add dimension with dictionary stats + builder.add_dimension( + "length", + size=100, + data_type=ScalarType.FLOAT32, + metadata={ + "statsV1": { + "count": 100, + "sum": 1215.1, + "sumSquares": 125.12, + "min": 5.61, + "max": 10.84, + "histogram": {"binCenters": [1, 2], "counts": [10, 15]}, + } + }, + ) + assert len(builder._variables) == 2 + var1 = builder._variables[1] + assert var1.name == "length" + assert var1.data_type == ScalarType.FLOAT32 + assert var1.metadata.stats_v1.count == 100 # noqa: PLR2004 + assert var1.metadata.stats_v1.sum == 1215.1 # noqa: PLR2004 + +def test_add_dimension_with_full_metadata() -> None: + """Test adding dimensions with all metadata.""" + builder = MDIODatasetBuilder("test_dataset") + + # Add dimension with all metadata as dictionary + builder.add_dimension( + "depth", + size=100, + data_type=ScalarType.FLOAT32, + metadata={ + "unitsV1": {"length": "m"}, + "attributes": {"MGA": 51}, + "chunkGrid": {"name": "regular", "configuration": {"chunkShape": [20]}}, + "statsV1": { + "count": 100, + "sum": 1215.1, + "sumSquares": 125.12, + "min": 5.61, + "max": 10.84, + "histogram": {"binCenters": [1, 2], "counts": [10, 15]}, + }, + }, + ) + + assert len(builder._variables) == 1 + var0 = builder._variables[0] + assert var0.name == "depth" + assert var0.data_type == ScalarType.FLOAT32 + assert var0.metadata.units_v1.length == "m" + assert var0.metadata.attributes["MGA"] == 51 # noqa: PLR2004 + assert var0.metadata.chunk_grid.name == "regular" + assert var0.metadata.chunk_grid.configuration.chunk_shape == [20] # noqa: PLR2004 + assert var0.metadata.stats_v1.count == 100 # noqa: PLR2004 + assert var0.metadata.stats_v1.sum == 1215.1 # noqa: PLR2004 + assert var0.metadata.stats_v1.sum_squares == 125.12 # noqa: PLR2004 + assert var0.metadata.stats_v1.min == 5.61 # noqa: PLR2004 + assert var0.metadata.stats_v1.max == 10.84 # noqa: PLR2004 + assert var0.metadata.stats_v1.histogram.bin_centers == [1, 2] # noqa: PLR2004 + assert var0.metadata.stats_v1.histogram.counts == [10, 15] # noqa: PLR2004 + + # Add dimension with all strongly-typed metadata + builder.add_dimension( + "length", + size=100, + data_type=ScalarType.FLOAT32, + metadata=[ + AllUnits(units_v1=LengthUnitModel( + length=LengthUnitEnum.FOOT)), + UserAttributes( + attributes={"MGA": 51, "UnitSystem": "Imperial"}), + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape( + chunk_shape=[20]))), + StatisticsMetadata(stats_v1=SummaryStatistics( + count=100, + sum=1215.1, + sumSquares=125.12, + min=5.61, + max=10.84, + histogram=CenteredBinHistogram( + binCenters=[1, 2], + counts=[10, 15]))) + ] + ) + + assert len(builder._variables) == 2 + var1 = builder._variables[1] + assert var1.name == "length" + assert var1.data_type == ScalarType.FLOAT32 + assert var1.metadata.units_v1.length == "ft" + assert var1.metadata.attributes["MGA"] == 51 # noqa: PLR2004 + assert var1.metadata.attributes["UnitSystem"] == "Imperial" # noqa: PLR2004 + assert var1.metadata.chunk_grid.name == "regular" + assert var1.metadata.chunk_grid.configuration.chunk_shape == [20] # noqa: PLR2004 + assert var1.metadata.stats_v1.count == 100 # noqa: PLR2004 + assert var1.metadata.stats_v1.sum == 1215.1 # noqa: PLR2004 + assert var1.metadata.stats_v1.sum_squares == 125.12 # noqa: PLR2004 + assert var1.metadata.stats_v1.min == 5.61 # noqa: PLR2004 + assert var1.metadata.stats_v1.max == 10.84 # noqa: PLR2004 + assert var1.metadata.stats_v1.histogram.bin_centers == [1, 2] # noqa: PLR2004 + assert var1.metadata.stats_v1.histogram.counts == [10, 15] # noqa: PLR2004 + + + # j = builder.build().json() + # print(j) \ No newline at end of file diff --git a/tests/unit/v1/test_dataset_builder_internals.py b/tests/unit/v1/test_dataset_builder_internals.py new file mode 100644 index 000000000..100b55254 --- /dev/null +++ b/tests/unit/v1/test_dataset_builder_internals.py @@ -0,0 +1,208 @@ + +from datetime import datetime +from pydantic import BaseModel, Field +import pytest +from mdio.schemas.core import StrictModel +from mdio.schemas.dimension import NamedDimension +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder, contains_dimension, get_dimension, to_dictionary +from mdio.schemas.v1.units import LengthUnitEnum, LengthUnitModel +from mdio.schemas.v1.variable import VariableMetadata, AllUnits, UserAttributes + +def test__get_dimension() -> None: + """Test getting a dimension by name from the list of dimensions.""" + dimensions = [NamedDimension(name="inline", size=2), NamedDimension(name="crossline", size=3)] + + assert get_dimension([], "inline") is None + + assert get_dimension(dimensions, "inline") == NamedDimension(name="inline", size=2) + assert get_dimension(dimensions, "crossline") == NamedDimension(name="crossline", size=3) + assert get_dimension(dimensions, "time") is None + + with pytest.raises(TypeError, match="Expected str, got NoneType"): + get_dimension(dimensions, None) + with pytest.raises(TypeError, match="Expected str, got int"): + get_dimension(dimensions, 42) + with pytest.raises(ValueError, match="Dimension 'inline' found but size 2 does not match expected size 200"): + get_dimension(dimensions, "inline", size=200) + + +def test__contains_dimension() -> None: + """Test if a dimension with a given name exists in the list of dimensions.""" + dimensions = [NamedDimension(name="inline", size=2), NamedDimension(name="crossline", size=3)] + + assert contains_dimension([], "inline") is False + + assert contains_dimension(dimensions, "inline") is True + assert contains_dimension(dimensions, "crossline") is True + assert contains_dimension(dimensions, "time") is False + + with pytest.raises(TypeError, match="Expected str or NamedDimension, got NoneType"): + contains_dimension(dimensions, None) + with pytest.raises(TypeError, match="Expected str or NamedDimension, got int"): + contains_dimension(dimensions, 42) + with pytest.raises(ValueError, match="Dimension 'inline' found but size 2 does not match expected size 200"): + contains_dimension(dimensions, NamedDimension(name="inline", size=200)) + + + +def test__add_named_dimensions() -> None: + """Test adding named dimensions to a dataset.""" + + builder = MDIODatasetBuilder("Test Dataset Builder") + # + # Validate initial state + # + assert builder._dimensions is not None + assert len(builder._dimensions) == 0 + + # + # Validate that adding empty dimensions does not change the state + # + added_dims = builder._add_named_dimensions(None) + assert len(builder._dimensions) == 0 + assert len(added_dims) == 0 + added_dims = builder._add_named_dimensions([]) + assert len(builder._dimensions) == 0 + assert len(added_dims) == 0 + added_dims = builder._add_named_dimensions({}) + assert len(builder._dimensions) == 0 + assert len(added_dims) == 0 + + # + # Add named dimensions + # + inline_dim = NamedDimension(name="inline", size=2) + added_dims = builder._add_named_dimensions([inline_dim]) + assert len(builder._dimensions) == 1 + assert len(added_dims) == 1 + assert contains_dimension(added_dims, inline_dim) + + crossline_dim = NamedDimension(name="crossline", size=3) + time_dim = NamedDimension(name="time", size=4) + added_dims = builder._add_named_dimensions([crossline_dim, time_dim]) + assert len(builder._dimensions) == 3 + assert contains_dimension(builder._dimensions, inline_dim) + assert contains_dimension(builder._dimensions, crossline_dim) + assert contains_dimension(builder._dimensions, time_dim) + assert contains_dimension(added_dims, crossline_dim) + assert contains_dimension(added_dims, time_dim) + + # + # Add invalid object type + # + with pytest.raises(TypeError, match="Expected NamedDimension or str, got int"): + builder._add_named_dimensions([42]) + assert len(builder._dimensions) == 3 + + # + # Add dimensions with the same names again does nothing + # (make sure we are passing different instances) + # + inline_dim2 = NamedDimension(name=inline_dim.name, size=inline_dim.size) + crossline_dim2 = NamedDimension(name=crossline_dim.name, size=crossline_dim.size) + time_dim2 = NamedDimension(name=time_dim.name, size=time_dim.size) + added_dims = builder._add_named_dimensions([inline_dim2, crossline_dim2, time_dim2]) + # Validate that the dimensions and variables are not duplicated + assert len(builder._dimensions) == 3 + assert contains_dimension(builder._dimensions, inline_dim) + assert contains_dimension(builder._dimensions, crossline_dim) + assert contains_dimension(builder._dimensions, time_dim) + assert len(added_dims) == 0 + + # Add dimensions with the same name, but different size again + with pytest.raises(ValueError, match="Dimension 'inline' found but size 2 does not match expected size 200"): + inline_dim2 = NamedDimension(name="inline", size=200) + builder._add_named_dimensions([inline_dim2]) + assert len(builder._dimensions) == 3 + # + # Add existing dimension using its name + # + added_dims = builder._add_named_dimensions(["inline", "crossline"]) + assert len(builder._dimensions) == 3 + assert contains_dimension(builder._dimensions, inline_dim) + assert contains_dimension(builder._dimensions, crossline_dim) + assert contains_dimension(builder._dimensions, time_dim) + assert len(added_dims) == 0 + + # + # Add non-existing dimension using its name is not allowed + # + with pytest.raises(ValueError, match="Dimension named 'offset' is not found"): + builder._add_named_dimensions(["offset"]) + assert len(builder._dimensions) == 3 + assert contains_dimension(builder._dimensions, inline_dim) + assert contains_dimension(builder._dimensions, crossline_dim) + assert contains_dimension(builder._dimensions, time_dim) + + +def test__to_dictionary() -> None: + """Test converting a BaseModel to a dictionary.""" + + with pytest.raises(TypeError, match="Expected BaseModel, got datetime"): + # This should raise an error because datetime is not a BaseModel + to_dictionary(datetime.now()) + + class SomeModel(StrictModel): + count: int = Field(default=None, description="Samples count") + samples: list[float] = Field(default_factory=list, description="Samples.") + created: datetime = Field(default_factory=datetime.now, description="Creation time with TZ info.") + + m = SomeModel( + count = 3, + samples = [1.0, 2.0, 3.0], + created = datetime(2023, 10, 1, 12, 0, 0, tzinfo=None) + ) + result = to_dictionary(m) + assert isinstance(result, dict) + assert result == {'count': 3, 'created': '2023-10-01T12:00:00', 'samples': [1.0, 2.0, 3.0]} + + +def test__make_VariableMetadata_from_list() -> None: + """Test creating VariableMetadata from a strongly-typed list of AllUnits or UserAttributes.""" + + units = AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)) + attrs = UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}) + meta_list=[units, attrs] + + # TODO: I assume we do not want attribute.attribute in the contract: + # 'metadata': {'unitsV1': {'length': 'm'}, 'attributes': {'attributes': {'MGA': 51}}} + # TODO: Are multiple attributes allowed (I assume they are)? + metadata = MDIODatasetBuilder._make_VariableMetadata_from_list(meta_list) + assert isinstance(metadata, VariableMetadata) + assert metadata.units_v1.length == "ft" + assert metadata.attributes["MGA"] == 51 + assert metadata.attributes["UnitSystem"] == "Imperial" + + with pytest.raises(TypeError, match="Unsupported metadata type: "): + meta_list = ["ft"] + MDIODatasetBuilder._make_VariableMetadata_from_list(meta_list) + +def test__make_VariableMetadata_from_dict() -> None: + """Test creating VariableMetadata from a dictionary.""" + + # TODO: What is the key for units: it unitsV1 or units_v1? + # TODO: Are multiple attributes allowed (I assume they are)? + # TODO: Do we validate the unit string supplied in dictionary parameters? What what if someone supplies ftUS instead of ft? + meta_dict={"unitsV1": {"length": "ft"}, "attributes": {"MGA": 51, "UnitSystem": "Imperial"}} + metadata = MDIODatasetBuilder._make_VariableMetadata_from_dict(meta_dict) + assert isinstance(metadata, VariableMetadata) + assert metadata.units_v1.length == "ft" + assert metadata.attributes["MGA"] == 51 + assert metadata.attributes["UnitSystem"] == "Imperial" + + with pytest.raises(TypeError, match="Unsupported metadata key: 'units_v1'. Expected 'unitsV1', 'attributes', 'chunkGrid', or 'statsV1."): + meta_dict = {"units_v1": "ft"} + MDIODatasetBuilder._make_VariableMetadata_from_dict(meta_dict) + + with pytest.raises(TypeError, match="Invalid value for key 'attributes': 42. Expected a dictionary."): + meta_dict = {"attributes": 42} + MDIODatasetBuilder._make_VariableMetadata_from_dict(meta_dict) + + # *** We currently do not validate the structure of the value dictionaries *** + # Pass unit object with invalid structure + # with pytest.raises(TypeError, match="Invalid value format for key 'unitsV1': {'length': 'm', 'time': 'sec'}. "): + # meta_dict1 = {"unitsV1": {"length": "m", "time": "sec"}} + # MDIODatasetBuilder._make_VariableMetadata_from_dict(meta_dict1) + + + diff --git a/tests/unit/v1/test_dataset_builder_state.py b/tests/unit/v1/test_dataset_builder_state.py new file mode 100644 index 000000000..31c570a85 --- /dev/null +++ b/tests/unit/v1/test_dataset_builder_state.py @@ -0,0 +1,88 @@ + +from datetime import datetime +import pytest + +from mdio.schemas.v1.dataset_builder import _BuilderState, MDIODatasetBuilder + +def test_builder_initialization() -> None: + """Test basic builder initialization.""" + builder = MDIODatasetBuilder("test_dataset") + assert builder.name == "test_dataset" + assert builder.api_version == "1.0.0" + assert isinstance(builder.created_on, datetime) + assert len(builder._dimensions) == 0 + assert len(builder._coordinates) == 0 + assert len(builder._variables) == 0 + assert builder._state == _BuilderState.INITIAL + +def test_builder_add_dimension_state() -> None: + """Test coordinate builder before and after add_dimension.""" + builder = MDIODatasetBuilder("test_dataset") + assert builder._state == _BuilderState.INITIAL + + # One should be able to add dimension any time after the builder has been created + + # Add dimensions first + builder = builder.add_dimension("x", 100) + assert builder._state == _BuilderState.HAS_DIMENSIONS + builder = builder.add_dimension("y", 200) + assert builder._state == _BuilderState.HAS_DIMENSIONS + +@pytest.mark.skip(reason="Under construction.") +def test_coordinate_builder_state() -> None: + """Test coordinate builder state transitions and functionality.""" + builder = MDIODatasetBuilder("test_dataset") + + # Should not be able to add coordinates before dimensions + with pytest.raises( + ValueError, match="Must add at least one dimension before adding coordinates" + ): + builder.add_coordinate("x_coord", dimensions=["x"]) + + # Add dimensions first + builder = builder.add_dimension("x", 100) + builder = builder.add_dimension("y", 200) + + # Adding coordinate should change state to HAS_COORDINATES + builder = builder.add_coordinate("x_coord", dimensions=["x"], long_name="X Coordinate") + assert builder._state == _BuilderState.HAS_COORDINATES + assert len(builder._coordinates) == 1 # noqa: PLR2004 + assert builder._coordinates[0].name == "x_coord" + assert builder._coordinates[0].long_name == "X Coordinate" + assert builder._coordinates[0].dimensions[0].name == "x" + + # Adding another coordinate should maintain state + builder = builder.add_coordinate("y_coord", dimensions=["y"]) + assert builder._state == _BuilderState.HAS_COORDINATES + assert len(builder._coordinates) == 2 # noqa: PLR2004 + assert builder._coordinates[1].name == "y_coord" + assert builder._coordinates[1].dimensions[0].name == "y" + +@pytest.mark.skip(reason="Under construction.") +def test_variable_builder_state() -> None: + """Test variable builder state transitions and functionality.""" + builder = MDIODatasetBuilder("test_dataset") + + # Should not be able to add variables before dimensions + with pytest.raises(ValueError, match="Must add at least one dimension before adding variables"): + builder.add_variable("data", dimensions=["x"]) + + # Add dimension first + builder = builder.add_dimension("x", 100) + + # Adding variable should change state to HAS_VARIABLES + builder = builder.add_variable("data", dimensions=["x"], long_name="Data Variable") + assert builder._state == _BuilderState.HAS_VARIABLES + # One for dimension, one for variable + assert len(builder._variables) == 2 # noqa: PLR2004 + assert builder._variables[1].name == "data" + assert builder._variables[1].long_name == "Data Variable" + assert builder._variables[1].dimensions[0].name == "x" + + # Adding another variable should maintain state + builder = builder.add_variable("data2", dimensions=["x"]) + assert builder._state == _BuilderState.HAS_VARIABLES + # One for dimension, two for variables + assert len(builder._variables) == 3 # noqa: PLR2004 + assert builder._variables[2].name == "data2" + assert builder._variables[2].dimensions[0].name == "x" \ No newline at end of file From 5816f8367cd5d6b07ee4b9074bacb131ed00aa35 Mon Sep 17 00:00:00 2001 From: Brian Michell Date: Thu, 26 Jun 2025 08:54:16 -0500 Subject: [PATCH 17/56] V1 schema review (#553) * Update from list to discrete values for coordinate metadata * Add docs to help users understand difference * Update docs and fix case sensitivity. * Linting * Add CoordianteMetadata to docs --- docs/data_models/version_1.md | 3 +++ src/mdio/schemas/v1/variable.py | 26 ++++++++++++++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/docs/data_models/version_1.md b/docs/data_models/version_1.md index caf0ed5c7..2fd397538 100644 --- a/docs/data_models/version_1.md +++ b/docs/data_models/version_1.md @@ -45,6 +45,9 @@ .. autopydantic_model:: mdio.schemas.v1.variable.Coordinate :inherited-members: BaseModel +.. autopydantic_model:: mdio.schemas.v1.variable.CoordinateMetadata + :inherited-members: BaseModel + .. automodule:: mdio.schemas.metadata :members: UserAttributes diff --git a/src/mdio/schemas/v1/variable.py b/src/mdio/schemas/v1/variable.py index 519a89f42..93b591177 100644 --- a/src/mdio/schemas/v1/variable.py +++ b/src/mdio/schemas/v1/variable.py @@ -23,14 +23,23 @@ from mdio.schemas.v1.stats import StatisticsMetadata from mdio.schemas.v1.units import AllUnits +CoordinateMetadata = create_model( + "CoordinateMetadata", + **model_fields(AllUnits), + **model_fields(UserAttributes), + __base__=CamelCaseStrictModel, + __doc__="Reduced Metadata, perfect for simple Coordinates.", +) + class Coordinate(NamedArray): - """An MDIO coordinate array with metadata.""" + """A simple MDIO Coordinate array with metadata. - data_type: ScalarType = Field(..., description="Data type of coordinate.") - metadata: list[AllUnits | UserAttributes] | None = Field( - default=None, description="Coordinate metadata." - ) + For large or complex Coordinates, define a Variable instead. + """ + + data_type: ScalarType = Field(..., description="Data type of Coordinate.") + metadata: CoordinateMetadata | None = Field(default=None, description="Coordinate Metadata.") VariableMetadata = create_model( @@ -40,14 +49,15 @@ class Coordinate(NamedArray): **model_fields(StatisticsMetadata), **model_fields(UserAttributes), __base__=CamelCaseStrictModel, + __doc__="Complete Metadata for Variables and complex or large Coordinates.", ) class Variable(NamedArray): - """An MDIO variable that has coordinates and metadata.""" + """An MDIO Variable that has coordinates and metadata.""" coordinates: list[Coordinate] | list[str] | None = Field( default=None, - description="Coordinates of the MDIO variable dimensions.", + description="Coordinates of the MDIO Variable dimensions.", ) - metadata: VariableMetadata | None = Field(default=None, description="Variable metadata.") + metadata: VariableMetadata | None = Field(default=None, description="Variable Metadata.") From 1358f95bea4ad3f781cb353fc6f1d6d27ba99dab Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Fri, 27 Jun 2025 00:22:28 +0000 Subject: [PATCH 18/56] First take on add_dimension(), add_coordinate(), add_variable() --- DEVELOPER_NOTES.md | 213 ++++++----- src/mdio/schemas/v1/dataset_builder.py | 282 +++++++++----- tests/unit/v1/__init__.py | 2 +- .../v1/test_dataset_builder_add_coordinate.py | 144 ++++++++ .../v1/test_dataset_builder_add_dimension.py | 348 +++++++----------- .../v1/test_dataset_builder_add_variable.py | 123 +++++++ tests/unit/v1/test_dataset_builder_helpers.py | 265 +++++++++++++ .../unit/v1/test_dataset_builder_internals.py | 208 ----------- tests/unit/v1/test_dataset_builder_state.py | 88 ----- 9 files changed, 963 insertions(+), 710 deletions(-) create mode 100644 tests/unit/v1/test_dataset_builder_add_coordinate.py create mode 100644 tests/unit/v1/test_dataset_builder_add_variable.py create mode 100644 tests/unit/v1/test_dataset_builder_helpers.py delete mode 100644 tests/unit/v1/test_dataset_builder_internals.py delete mode 100644 tests/unit/v1/test_dataset_builder_state.py diff --git a/DEVELOPER_NOTES.md b/DEVELOPER_NOTES.md index 7dcda95de..427801ee0 100644 --- a/DEVELOPER_NOTES.md +++ b/DEVELOPER_NOTES.md @@ -1,107 +1,126 @@ # Developer Notes -What are the goals for MDIO v1: + +## MDIO v1 scope of work + +### TASK 1: Creation an empty MDIO v1 dataset with metadata defined using the v1 schema +#### DESCRIPTION +In the v0, the following code was used to create an empty dataset: + +```Python +grid = Grid([Dimension("inline",...), Dimension("crossline", ...), Dimension("depth", ...)]) +variable = MDIOVariableConfig("stack_amplitude", ...) +create_conf = MDIOCreateConfig(path="demo.mdio", grid=grid, variables=[variable]) +create_empty(config=create_conf) +``` + +In the v1 it is replaced with the following API, which uses v1 schema: + +```Python +builder = MDIODatasetBuilder(...) +builder.add_dimension("inline", ...) +builder.add_dimension("crossline",...) +builder.add_dimension("depth", ...) +builder.add_coordinate("cdp_x",...) +builder.add_coordinate("cdp_y",...) +builder.add_variable("stack_amplitude",...) +builder.to_mdio(store="demo.mdio") +``` + +#### DEFINITION OF DONE +* The resulting v1 MDIO control `demo.mdio` file structure must be identical between Python and C++ +* Code coverage 90% +* Code documentation will be updated: + * API doc strings are reviewed + * docs/tutorials/creation.ipynb - current version describes v0 API. Should be updated with v1 API + * docs/api_reference.md - will be updated with new API + +#### ASSUMPTIONS +We expect that the following v0 workflows to keep working with this change +* Populating MDIOs +* Updating File and Checking with MDIOReader +* Write to SEG-Y ## Overall API design and implementation -1. Do we want to have a strongly-typed (see pydantic) or dynamic-typed (see dictionary args) API? - For example +We will have only a strongly-typed (see pydantic) API. For example: + ```Python - # Strongly typed - builder.add_dimension( - "length", - size=100, - data_type=ScalarType.FLOAT32, - metadata=[ - AllUnits(units_v1=LengthUnitModel( - length=LengthUnitEnum.FOOT)), - UserAttributes( - attributes={"MGA": 51, "UnitSystem": "Imperial"}), - ChunkGridMetadata( - chunk_grid=RegularChunkGrid( - configuration=RegularChunkShape( - chunk_shape=[20]))), - StatisticsMetadata(stats_v1=SummaryStatistics( - count=100, - sum=1215.1, - sumSquares=125.12, - min=5.61, - max=10.84, - histogram=CenteredBinHistogram( - binCenters=[1, 2], - counts=[10, 15]))) - ] - ) - - # dynamically-typed - builder.add_dimension( - "depth", - size=100, - data_type=ScalarType.FLOAT32, - metadata={ - "unitsV1": {"length": "m"}, - "attributes": {"MGA": 51}, - "chunkGrid": {"name": "regular", "configuration": {"chunkShape": [20]}}, - "statsV1": { - "count": 100, - "sum": 1215.1, - "sumSquares": 125.12, - "min": 5.61, - "max": 10.84, - "histogram": {"binCenters": [1, 2], "counts": [10, 15]}, - }, - }, - ) +VariableMetadataList: TypeAlias = list[AllUnits | UserAttributes | ChunkGridMetadata | StatisticsMetadata] +def add_dimension( + self, + name: str, + size: int, + long_name: str = None, + data_type: ScalarType | StructuredType = ScalarType.INT32, + metadata_info: VariableMetadataList | None = None, +) -> "MDIODatasetBuilder": ``` -2. How extensive the handling of the edge cases and the invalid arguments should be? This affects the ammount of validation code that needs to be written - For example, - * Should we validate in the code that the units list contain a single item for the dimensions units - or should we expect the developer to always pass a single-item list? - * Should we test the statistics for count > 0 or dim(binCenter) == dim(count) in the case above? - -## V1 Schema questions -1. Why do we allow default / empty names? -2. Adding a dimension with the same name multiple times: is it allowed or should it raise an error? - * It is currently allowed: the second request is ignored - * Adding a dimension with the same name, but the different size currently throws an error -3. Why do we allow methods with dictionary parameters (non-strongly-typed)? -4. For the add_dimension(): - * Can AllUnits / UserAttributes / ChunkGridMetadata / StatisticsMetadata be repeated in the metadata list? - * For units, chunkGrid, statsV1 dict should we validate structure of the data passed in? - * Do we validate the unit string supplied in dictionary parameters? What what if someone supplies ftUS instead of ft? - * Are multiple dimension attributes allowed (I assume yes)? -5. It is not clear, how RectilinearChunkGrid can be mapped to a single dimension - ```RectilinearChunkGrid(configuration=RectilinearChunkShape(chunk_shape=[[2,3,4],[2,3,4]]))``` -6. StatisticsMetadata accepts list[SummaryStatistics]. what does this mean and does it need to be tested? -7. The pydentic attribute names are different from the v1 schema attributes names. - 'statsV1' <-> 'stats_v1', 'unitsV1' <-> 'units_v1', 'chunkGrid' <-> 'chunk_grid' - Tgus, we will pass `units_v1` if we use the typesafe API and `'unitsV1` if we use dictionary API -8. Can we add two variables with the same name? -9. Why histogram (e.g., SummaryStatistics) does not have a `histogram_type` attribute? -10. Why 'ftUS' is not supported by the schema? - Units: what foot does the MDIO uses: the U.S. survey foot or the International Foot? - The U.S. survey foot is defined as 1200/3937 meters, while the international foot is defined as exactly 0.3048 meters. + +Which will be used as following: + +```Python +builder.add_dimension( + "length", + size=100, + data_type=ScalarType.FLOAT32, + metadata_info=[ + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)), + UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}), + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape( + chunk_shape=[20]))), + StatisticsMetadata(stats_v1=SummaryStatistics( + count=100, + sum=1215.1, + sumSquares=125.12, + min=5.61, + max=10.84, + histogram=CenteredBinHistogram( + binCenters=[1, 2], + counts=[10, 15]))) + ] +) +``` +### Notes +* When a coordinate or a variable is created, their schema allows to store their dimensions either as + * list of dimensions name `list[str]`, where the names refer to the dimensions defined in the builder._dimensions + * list of named dimensions `list[NamedDimension]`, which duplicate the dimensions defined in the builder._dimensions + * Mixture of the two above `list[NamedDimension | str]` + + We will be using the first approach. + + **IMPORTANT: For binary compatibility, We need to ensure that the C++ code follows the same logic** + +* Metadata population from a dictionary in add_coordinate() and add_variable() will not be supported to ensure that the API is strongly-typed. If it is needed, such conversion should be done as a separate step: + ```Python + def make_variable_metadata_list_from_dict(metadata: dict[str, Any]) -> VariableMetadataList: + # Implementation goes here + def make_coordinate_metadata_list_from_dict(metadata: dict[str, Any]) -> CoordinateMetadataList: + # Implementation goes here + ``` + +## Schema V1 questions + +* add_dimension(): Can a dimension with the same name be added multiple times. Options: + * Allowed: the second request is ignored (current implementation) + * Adding a dimension with the same name, but the different size currently throws an error + * Not Allowed: should it raise an error? +* The pydantic attribute names are different from the v1 schema attributes names. What are the repercussions? + ``` + 'statsV1' <-> 'stats_v1' + 'unitsV1' <-> 'units_v1' + 'chunkGrid' <-> 'chunk_grid' + ``` +* Should histogram (e.g., SummaryStatistics) have a `histogram_type` attribute? +* Units + * Why 'ftUS' is not supported by the schema? U.S. survey foot vs the International Foot: + *"The U.S. survey foot is defined as 1200/3937 meters, while the international foot is defined as exactly 0.3048 meters. https://www.axiomint.com/survey-foot-versus-international-foot-whats-the-difference/ "The REAL issue is when ... applied to State Plane coordinates in the N2,000,000 and E6,000,000 range! - This ... moves a State Plane coordinate position 4 feet by 12 feet. - -## Unclear -* Did we have a notion of the fixed increment for inline & xline annotations? -* How is rotation of East/North axes relatively to inline/xline axes is handled -* How is right-handed and left-handed surveys are handled? -* add_variable - should dimensions argument be required?? - -(src/mdio/schemas/v1/dataset_builder.py) -## Design suggestions -1. Instead of trying to track the state, should we just return a wrapper/pimpl class with the permitted methods? -2. Should we rename add_dimension to add_dimension_variable / add_dimension_annotation to indicate that we not just - providing the dimension name, but also creating the dimension variable -4. add_variable - should we call it `append_variable`. add implies that either name or index must be provided. + This ... moves a State Plane coordinate position 4 feet by 12 feet."* + * Why there are no dimensionless unis (for seismic amplitudes, inlines, etc.) -## Under constructions -* TODO: ??? refactor _BuilderState to make inner class ??? -* TODO: Need an example of EdgeDefinedHistogram for add_dimension with histogram +## Design suggestions +* Should we rename add_dimension to add_dimension_variable (or similar) to indicate that we not just providing the dimension name, but also creating the dimension variable -## Bugs -1. I assume we do not want attribute.attribute in the contract (see docs\tutorials\builder.ipynb) - 'metadata': {'unitsV1': {'length': 'm'}, 'attributes': {'attributes': {'MGA': 51}}} -https://osdu.pages.opengroup.org/platform/domain-data-mgmt-services/seismic/open-vds/vds/specification/Metadata.html \ No newline at end of file diff --git a/src/mdio/schemas/v1/dataset_builder.py b/src/mdio/schemas/v1/dataset_builder.py index ea431e4c3..b97ae7ee2 100644 --- a/src/mdio/schemas/v1/dataset_builder.py +++ b/src/mdio/schemas/v1/dataset_builder.py @@ -1,28 +1,31 @@ """Builder pattern implementation for MDIO v1 schema models.""" -from collections.abc import Mapping from datetime import UTC from datetime import datetime from enum import Enum from enum import auto from typing import Any +from typing import TypeAlias from pydantic import BaseModel from zarr.core.chunk_key_encodings import V2ChunkKeyEncoding # noqa: F401 -from mdio.schemas.compressors import ZFP -from mdio.schemas.compressors import Blosc +from mdio.schemas.compressors import ZFP, Blosc from mdio.schemas.dimension import NamedDimension -from mdio.schemas.dtype import ScalarType, StructuredType -from mdio.schemas.metadata import ChunkGridMetadata, UserAttributes -from mdio.schemas.v1.dataset import Dataset -from mdio.schemas.v1.stats import StatisticsMetadata, SummaryStatistics -from mdio.schemas.v1.units import AllUnitModel, AllUnits -from mdio.schemas.v1.variable import Coordinate, Variable, VariableMetadata - -# TODO: Why do we allow default names? -# TODO: Instead of trying to track the state, should we just return a wrapper class with permitted methods? -# TODO: refactor to make inner class +from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredType +from mdio.schemas.metadata import ChunkGridMetadata +from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.stats import StatisticsMetadata +from mdio.schemas.v1.units import AllUnits +from mdio.schemas.v1.variable import Coordinate, CoordinateMetadata +from mdio.schemas.v1.variable import Variable +from mdio.schemas.v1.variable import VariableMetadata + + +CoordinateMetadataList: TypeAlias = list[AllUnits | UserAttributes] +VariableMetadataList: TypeAlias = list[AllUnits | UserAttributes | ChunkGridMetadata | StatisticsMetadata] + class _BuilderState(Enum): """States for the template builder.""" @@ -31,24 +34,30 @@ class _BuilderState(Enum): HAS_COORDINATES = auto() HAS_VARIABLES = auto() -def contains_dimension(dimensions: list[NamedDimension], name_or_NamedDimension: str | NamedDimension) -> bool: + +def contains_dimension( + dimensions: list[NamedDimension], name_or_dimension: str | NamedDimension +) -> bool: """Check if a dimension with the given name exists in the list.""" - if isinstance(name_or_NamedDimension, str): - name = name_or_NamedDimension + if isinstance(name_or_dimension, str): + name = name_or_dimension return get_dimension(dimensions, name) is not None - elif isinstance(name_or_NamedDimension, NamedDimension): - named_dimension = name_or_NamedDimension - return get_dimension(dimensions, named_dimension.name, named_dimension.size) is not None - else: - msg = f"Expected str or NamedDimension, got {type(name_or_NamedDimension).__name__}" - raise TypeError(msg) + if isinstance(name_or_dimension, NamedDimension): + dimension = name_or_dimension + return get_dimension(dimensions, dimension.name, dimension.size) is not None + msg = f"Expected str or NamedDimension, got {type(name_or_dimension).__name__}" + raise TypeError(msg) + -def get_dimension(dimensions: list[NamedDimension], name: str, size: int | None = None) -> NamedDimension | None: +def get_dimension( + dimensions: list[NamedDimension], name: str, size: int | None = None +) -> NamedDimension | None: """Get a dimension by name from the list.""" if dimensions is None: return False if not isinstance(name, str): - raise TypeError(f"Expected str, got {type(name).__name__}") + msg = f"Expected str, got {type(name).__name__}" + raise TypeError(msg) nd = next((dim for dim in dimensions if dim.name == name), None) if nd is None: @@ -58,11 +67,71 @@ def get_dimension(dimensions: list[NamedDimension], name: str, size: int | None raise ValueError(msg) return nd -def to_dictionary(val: BaseModel) -> dict[str, Any]: + +def get_dimension_names( dimensions: list[NamedDimension | str]) -> list[str]: + """Get a dimension by name from the list.""" + names = [] + if dimensions is None: + return names + for dim in dimensions: + if isinstance(dim, NamedDimension): + names.append(dim.name) + elif isinstance(dim, str): + names.append(dim) + return names + + +def _to_dictionary(val: BaseModel) -> dict[str, Any]: """Convert a pydantic BaseModel to a dictionary.""" if not isinstance(val, BaseModel): - raise TypeError(f"Expected BaseModel, got {type(val).__name__}") - return val.model_dump(mode="json", by_alias=True) + msg = f"Expected BaseModel, got {type(val).__name__}" + raise TypeError(msg) + return val.model_dump(mode="json", by_alias=True) + +def _make_coordinate_metadata(metadata: CoordinateMetadataList | None) -> CoordinateMetadata | None: + if metadata is None or not metadata: + return None + + metadata_dict = {} + for md in metadata: + # NOTE: the pydantic attribute names are different from the v1 schema attributes names + # 'unitsV1' <-> 'units_v1' + if isinstance(md, AllUnits): + val = md.units_v1 + metadata_dict["unitsV1"] = _to_dictionary(val) + elif isinstance(md, UserAttributes): + # NOTE: md.attributes is not pydantic type, but a dictionary + metadata_dict["attributes"] = _to_dictionary(md)["attributes"] + else: + msg = f"Unsupported metadata type: {type(md)}" + raise TypeError(msg) + return CoordinateMetadata(**metadata_dict) + + +def _make_variable_metadata(metadata: VariableMetadataList | None) -> VariableMetadata | None: + if metadata is None or not metadata: + return None + + metadata_dict = {} + for md in metadata: + # NOTE: the pydantic attribute names are different from the v1 schema attributes names + # 'statsV1' <-> 'stats_v1', 'unitsV1' <-> 'units_v1', 'chunkGrid' <-> 'chunk_grid' + if isinstance(md, AllUnits): + val = md.units_v1 + metadata_dict["unitsV1"] = _to_dictionary(val) + elif isinstance(md, UserAttributes): + # NOTE: md.attributes is not pydantic type, but a dictionary + metadata_dict["attributes"] = _to_dictionary(md)["attributes"] + elif isinstance(md, ChunkGridMetadata): + val = md.chunk_grid + metadata_dict["chunkGrid"] = _to_dictionary(val) + elif isinstance(md, StatisticsMetadata): + val = md.stats_v1 + metadata_dict["statsV1"] = _to_dictionary(val) + else: + msg = f"Unsupported metadata type: {type(md)}" + raise TypeError(msg) + return VariableMetadata(**metadata_dict) class MDIODatasetBuilder: """Builder for creating MDIO datasets with enforced build order. @@ -77,7 +146,8 @@ class MDIODatasetBuilder: def __init__(self, name: str, attributes: dict[str, Any] | None = None): self.name = name - self.api_version = "1.0.0" # TODO(BrianMichell, #0): Pull from package metadata + # TODO(BrianMichell, #0): Pull from package metadata + self.api_version = "1.0.0" self.created_on = datetime.now(UTC) self.attributes = attributes self._dimensions: list[NamedDimension] = [] @@ -86,8 +156,9 @@ def __init__(self, name: str, attributes: dict[str, Any] | None = None): self._state = _BuilderState.INITIAL self._unnamed_variable_counter = 0 - - def _add_named_dimensions(self, dimensions: list[NamedDimension | str] | None) -> list[NamedDimension]: + def _add_dimensions_if_needed( + self, dimensions: list[NamedDimension | str] | None + ) -> list[NamedDimension]: if dimensions is None: return [] @@ -95,72 +166,27 @@ def _add_named_dimensions(self, dimensions: list[NamedDimension | str] | None) - for dim in dimensions: if isinstance(dim, str): if not contains_dimension(self._dimensions, dim): - raise ValueError(f"Dimension named {dim!r} is not found") + msg = f"Pre-existing dimension named {dim!r} is not found" + raise ValueError(msg) else: if not isinstance(dim, NamedDimension): - raise TypeError(f"Expected NamedDimension or str, got {type(dim).__name__}") - if contains_dimension(self._dimensions, dim): + msg = f"Expected NamedDimension or str, got {type(dim).__name__}" + raise TypeError(msg) + if contains_dimension(self._dimensions, dim): continue - self._dimensions.append(dim) - added_dims.append(dim) + # Use value instead of a reference + d = NamedDimension(name=dim.name, size=dim.size) + self._dimensions.append(d) + added_dims.append(d) return added_dims - - def _make_VariableMetadata_from_list(metadata: list[AllUnits | UserAttributes]) -> Any: - metadata_dict = {} - for md in metadata: - # NOTE: the pydentic attribute names are different from the v1 schema attributes names - # 'statsV1' <-> 'stats_v1', 'unitsV1' <-> 'units_v1', 'chunkGrid' <-> 'chunk_grid' - if isinstance(md, AllUnits): - val = md.units_v1 - metadata_dict["unitsV1"] = to_dictionary(val) - elif isinstance(md, UserAttributes): - # NOTE: md.attributes is not pydantic type, but a dictionary - metadata_dict["attributes"] = to_dictionary(md)["attributes"] - elif isinstance(md, ChunkGridMetadata): - val = md.chunk_grid - metadata_dict["chunkGrid"] = to_dictionary(val) - elif isinstance(md, StatisticsMetadata): - val = md.stats_v1 - metadata_dict["statsV1"] = to_dictionary(val) - else: - raise TypeError(f"Unsupported metadata type: {type(md)}") - return VariableMetadata(**metadata_dict) - - - def _make_VariableMetadata_from_dict(metadata: dict[str, Any]) -> type[BaseModel]: - converted_dict = {} - for key, value in metadata.items(): - if key == "unitsV1" or key == "statsV1" or key == "chunkGrid" or key == "attributes": - # TODO: Should we validate the structure of the value passed in? - if not isinstance(value, dict): - raise TypeError(f"Invalid value for key '{key}': {value!r}. Expected a dictionary.") - else: - raise TypeError(f"Unsupported metadata key: '{key}'. Expected 'unitsV1', 'attributes', 'chunkGrid', or 'statsV1.") - converted_dict[key] = value - return VariableMetadata(**converted_dict) - - - def _make_VariableMetadata(metadata: list[AllUnits | UserAttributes] | dict[str, Any] | None = None) -> Any | None: - if metadata is None: - return None - - if isinstance(metadata, list): - return MDIODatasetBuilder._make_VariableMetadata_from_list(metadata) - - if isinstance(metadata, dict): - return MDIODatasetBuilder._make_VariableMetadata_from_dict(metadata) - - raise TypeError(f"Unsupported metadata type: {type(metadata)}") - - def add_dimension( # noqa: PLR0913 self, name: str, size: int, - long_name: str = None, - data_type: ScalarType | StructuredType = ScalarType.INT32, - metadata: list[AllUnits | UserAttributes] | None | dict[str, Any] = None, + var_long_name: str = None, + var_data_type: ScalarType | StructuredType = ScalarType.INT32, + var_metadata_info: VariableMetadataList | None = None, ) -> "MDIODatasetBuilder": """Add a dimension. @@ -171,25 +197,97 @@ def add_dimension( # noqa: PLR0913 size: Size of the dimension long_name: Optional long name for the dimension variable data_type: Data type for the dimension variable (defaults to INT32) - metadata: Optional metadata for the dimension variable + metadata_info: Optional metadata information for the dimension variable Returns: self: Returns self for method chaining """ + if not name: + raise ValueError("'name' must be a non-empty string") - added_dims = self._add_named_dimensions([NamedDimension(name=name, size=size)]) + added_dims = self._add_dimensions_if_needed( + [NamedDimension(name=name, size=size)]) if added_dims: # Create a variable for the dimension dim_var = Variable( name=name, - longName=long_name, + longName=var_long_name, dimensions=added_dims, - dataType=data_type, + dataType=var_data_type, compressor=None, coordinates=None, - metadata=MDIODatasetBuilder._make_VariableMetadata(metadata) + metadata=_make_variable_metadata(var_metadata_info), ) self._variables.append(dim_var) self._state = _BuilderState.HAS_DIMENSIONS return self + + def add_coordinate( # noqa: PLR0913 + self, + name: str, + *, + long_name: str = None, + dimensions: list[NamedDimension | str], + data_type: ScalarType | StructuredType = ScalarType.FLOAT32, + metadata_info: CoordinateMetadataList | None = None, + ) -> "MDIODatasetBuilder": + """Add a coordinate after adding at least one dimension.""" + if self._state == _BuilderState.INITIAL: + msg = "Must add at least one dimension before adding coordinates" + raise ValueError(msg) + if not name: + raise ValueError("'name' must be a non-empty string") + if dimensions is None or not dimensions: + raise ValueError("'dimensions' must be a non-empty list") + + self._add_dimensions_if_needed(dimensions) + dim_names = get_dimension_names(dimensions) + self._coordinates.append( + Coordinate( + name=name, + longName=long_name, + dimensions=dim_names, # We ass names: sts, not list[NamedDimension | str] + dataType=data_type, + metadata=_make_coordinate_metadata(metadata_info), + ) + ) + self._state = _BuilderState.HAS_COORDINATES + return self + + + def add_variable( # noqa: PLR0913 + self, + name: str, + *, + long_name: str = None, + dimensions: list[NamedDimension | str], + data_type: ScalarType | StructuredType = ScalarType.FLOAT32, + compressor: Blosc | ZFP | None = None, + coordinates: list[Coordinate | str] | None = None, + metadata_info: VariableMetadataList | None = None, + ) -> "MDIODatasetBuilder": + """Add a variable after adding at least one dimension.""" + if self._state == _BuilderState.INITIAL: + msg = "Must add at least one dimension before adding variables" + raise ValueError(msg) + if not name: + raise ValueError("'name' must be a non-empty string") + if dimensions is None or not dimensions: + raise ValueError("'dimensions' must be a non-empty list") + + self._add_dimensions_if_needed(dimensions) + dim_names = get_dimension_names(dimensions) + self._variables.append( + Variable( + name=name, + long_name=long_name, + dimensions=dim_names, + data_type=data_type, + compressor=compressor, + coordinates=coordinates, + metadata=_make_variable_metadata(metadata_info), + ) + ) + self._state = _BuilderState.HAS_VARIABLES + return self diff --git a/tests/unit/v1/__init__.py b/tests/unit/v1/__init__.py index 3db3a8e50..fa2ea633b 100644 --- a/tests/unit/v1/__init__.py +++ b/tests/unit/v1/__init__.py @@ -1 +1 @@ -"""Unit tests for parts of the MDIO package related to the v1 schema""" \ No newline at end of file +"""Unit tests for parts of the MDIO package related to the v1 schema.""" diff --git a/tests/unit/v1/test_dataset_builder_add_coordinate.py b/tests/unit/v1/test_dataset_builder_add_coordinate.py new file mode 100644 index 000000000..b38da14be --- /dev/null +++ b/tests/unit/v1/test_dataset_builder_add_coordinate.py @@ -0,0 +1,144 @@ +# ruff: noqa: PLR2004 +# PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable +# The above erroneous warning is generated for every numerical assert. +# Thus, disable it for this file +"""Tests the schema v1 dataset_builder.add_coordinate() public API.""" + +import pytest + +from mdio.schemas.chunk_grid import RegularChunkGrid +from mdio.schemas.chunk_grid import RegularChunkShape +from mdio.schemas.dimension import NamedDimension +from mdio.schemas.dtype import ScalarType +from mdio.schemas.metadata import ChunkGridMetadata +from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder, contains_dimension +from mdio.schemas.v1.dataset_builder import _BuilderState +from mdio.schemas.v1.stats import CenteredBinHistogram +from mdio.schemas.v1.stats import StatisticsMetadata +from mdio.schemas.v1.stats import SummaryStatistics +from mdio.schemas.v1.units import AllUnits +from mdio.schemas.v1.units import LengthUnitEnum +from mdio.schemas.v1.units import LengthUnitModel + + +def test_add_coordinate() -> None: + """Test adding coordinates. Check the state transition and validate required parameters.""" + builder = MDIODatasetBuilder("test_dataset") + assert builder._state == _BuilderState.INITIAL + + with pytest.raises(ValueError, match="Must add at least one dimension before adding coordinates"): + builder.add_coordinate("amplitude", dimensions=["speed"]) + + builder.add_dimension("inline", 100) + builder.add_dimension("crossline", 100) + + bad_name = None + with pytest.raises(ValueError, match="'name' must be a non-empty string"): + builder.add_coordinate(bad_name, dimensions=["speed"]) + with pytest.raises(ValueError, match="'name' must be a non-empty string"): + builder.add_coordinate("", dimensions=["speed"]) + with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): + builder.add_coordinate("amplitude", dimensions=None) + with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): + builder.add_coordinate("amplitude", dimensions=[]) + + builder.add_coordinate("cdp", dimensions=["inline", "crossline"]) + assert builder._state == _BuilderState.HAS_COORDINATES + assert len(builder._dimensions) == 2 + assert len(builder._variables) == 2 + assert len(builder._coordinates) == 1 + +def test_add_coordinate_with_defaults() -> None: + """Test adding coordinates with default arguments.""" + builder = MDIODatasetBuilder("test_dataset") + builder.add_dimension("inline", 100) + builder.add_dimension("crossline", 100) + # Add coordinate using defaults + builder.add_coordinate("cdp", dimensions=["inline", "crossline"]) + assert len(builder._dimensions) == 2 + assert len(builder._variables) == 2 + assert len(builder._coordinates) == 1 + # NOTE: add_variable() stores dimensions as names + crd0 = next((e for e in builder._coordinates if e.name == "cdp"), None) + assert crd0 is not None + assert set(crd0.dimensions) == set(["inline", "crossline"]) + assert crd0.long_name is None # Default value + assert crd0.data_type == ScalarType.FLOAT32 # Default value + assert crd0.metadata is None # Default value + +def test_coordinate_with_units() -> None: + """Test adding coordinates with units.""" + builder = MDIODatasetBuilder("test_dataset") + builder.add_dimension("inline", 100) + builder.add_dimension("crossline", 100) + # Add coordinate with units + builder.add_coordinate( + "cdp", + dimensions=["inline", "crossline"], + metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT))] + ) + assert len(builder._dimensions) == 2 + assert len(builder._variables) == 2 + assert len(builder._coordinates) == 1 + # NOTE: add_coordinate() stores dimensions as names + crd0 = next((e for e in builder._coordinates if e.name == "cdp"), None) + assert crd0 is not None + assert set(crd0.dimensions) == set(["inline", "crossline"]) + assert crd0.long_name is None # Default value + assert crd0.data_type == ScalarType.FLOAT32 # Default value + assert crd0.metadata.attributes is None + assert crd0.metadata.units_v1.length == "ft" + + +def test_coordinate_with_attributes() -> None: + """Test adding coordinates with attributes.""" + builder = MDIODatasetBuilder("test_dataset") + builder.add_dimension("inline", 100) + builder.add_dimension("crossline", 100) + # Add coordinate with attributes + builder.add_coordinate( + "cdp", + dimensions=["inline", "crossline"], + metadata_info=[UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"})], + ) + assert len(builder._dimensions) == 2 + assert len(builder._variables) == 2 + assert len(builder._coordinates) == 1 + # NOTE: add_coordinate() stores dimensions as names + crd0 = next((e for e in builder._coordinates if e.name == "cdp"), None) + assert crd0 is not None + assert set(crd0.dimensions) == set(["inline", "crossline"]) + assert crd0.long_name is None # Default value + assert crd0.data_type == ScalarType.FLOAT32 # Default value + assert crd0.metadata.attributes["MGA"] == 51 + assert crd0.metadata.attributes["UnitSystem"] == "Imperial" + assert crd0.metadata.units_v1 is None + + +def test_coordinate_with_full_metadata() -> None: + """Test adding coordinates with all metadata.""" + builder = MDIODatasetBuilder("test_dataset") + builder.add_dimension("inline", 100) + builder.add_dimension("crossline", 100) + # Add coordinate with all metadata + builder.add_coordinate( + "cdp", + dimensions=["inline", "crossline"], + metadata_info=[ + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)), + UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"})] + ) + assert len(builder._dimensions) == 2 + assert len(builder._variables) == 2 + assert len(builder._coordinates) == 1 + # NOTE: add_coordinate() stores dimensions as names + crd0 = next((e for e in builder._coordinates if e.name == "cdp"), None) + assert crd0 is not None + assert set(crd0.dimensions) == set(["inline", "crossline"]) + assert crd0.long_name is None # Default value + assert crd0.data_type == ScalarType.FLOAT32 # Default value + assert crd0.metadata.attributes["MGA"] == 51 + assert crd0.metadata.attributes["UnitSystem"] == "Imperial" + assert crd0.metadata.units_v1.length == "ft" + diff --git a/tests/unit/v1/test_dataset_builder_add_dimension.py b/tests/unit/v1/test_dataset_builder_add_dimension.py index bac9a8383..7adebb4b5 100644 --- a/tests/unit/v1/test_dataset_builder_add_dimension.py +++ b/tests/unit/v1/test_dataset_builder_add_dimension.py @@ -1,307 +1,207 @@ +# ruff: noqa: PLR2004 +# PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable +# The above erroneous warning is generated for every numerical assert. +# Thus, disable it for this file +"""Tests the schema v1 dataset_builder.add_dimension() public API.""" import pytest -from datetime import datetime - -from mdio.schemas.chunk_grid import RectilinearChunkGrid, RectilinearChunkShape, RegularChunkGrid, RegularChunkShape -from mdio.schemas.dtype import ScalarType, StructuredType - +from mdio.schemas.chunk_grid import RegularChunkGrid +from mdio.schemas.chunk_grid import RegularChunkShape from mdio.schemas.dimension import NamedDimension -from mdio.schemas.metadata import ChunkGridMetadata, UserAttributes -from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder, contains_dimension, get_dimension, _BuilderState -from mdio.schemas.v1.stats import CenteredBinHistogram, Histogram, StatisticsMetadata, SummaryStatistics -from mdio.schemas.v1.units import AllUnits, LengthUnitEnum, LengthUnitModel +from mdio.schemas.dtype import ScalarType +from mdio.schemas.metadata import ChunkGridMetadata +from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder +from mdio.schemas.v1.dataset_builder import _BuilderState +from mdio.schemas.v1.stats import CenteredBinHistogram +from mdio.schemas.v1.stats import StatisticsMetadata +from mdio.schemas.v1.stats import SummaryStatistics +from mdio.schemas.v1.units import AllUnits +from mdio.schemas.v1.units import LengthUnitEnum +from mdio.schemas.v1.units import LengthUnitModel + def test_add_dimension() -> None: - """Test adding a dimension to the dataset builder.""" - builder = MDIODatasetBuilder("Test Dataset Builder") + """Test adding dimension. Check the state transition and validate required parameters.""" + builder = MDIODatasetBuilder("test_dataset") + assert builder._state == _BuilderState.INITIAL - builder.add_dimension(name="inline", size=2, long_name="Inline dimension") - assert len(builder._dimensions) == 1 - assert builder._dimensions[0] == NamedDimension(name="inline", size=2) - assert len(builder._variables) == 1 + bad_name = None + with pytest.raises(ValueError, match="'name' must be a non-empty string"): + builder.add_dimension(bad_name, 200) + with pytest.raises(ValueError, match="'name' must be a non-empty string"): + builder.add_dimension("", 200) + + # First dimension should change state to HAS_DIMENSIONS and create a variable + builder.add_dimension("x", 100) assert builder._state == _BuilderState.HAS_DIMENSIONS + assert len(builder._dimensions) == 1 + assert builder._dimensions[0] == NamedDimension(name="x", size=100) + assert len(builder._variables) == 1 + # Adding a dimension with the same name as an existing dimension. + # Currently, it does not raise an error, but just ignores this call + builder.add_dimension("x", 100, var_long_name="X Dimension") + assert builder._state == _BuilderState.HAS_DIMENSIONS + assert len(builder._dimensions) == 1 + assert len(builder._variables) == 1 -def test_add_dimension() -> None: + # Adding a dimension with the same name and different size throws an error + err_msg = "Dimension 'x' found but size 100 does not match expected size 200" + with pytest.raises(ValueError, match=err_msg): + builder.add_dimension("x", 200, var_long_name="X Dimension") + +def test_add_dimension_with_defaults() -> None: """Test dimension builder state transitions and functionality.""" builder = MDIODatasetBuilder("test_dataset") # First dimension should change state to HAS_DIMENSIONS and create a variable - builder.add_dimension("x", 100, long_name="X Dimension") + builder.add_dimension("x", 100) assert builder._state == _BuilderState.HAS_DIMENSIONS - assert len(builder._dimensions) == 1 # noqa: PLR2004 - assert len(builder._variables) == 1 # noqa: PLR2004 - assert builder._dimensions[0].name == "x" - assert builder._dimensions[0].size == 100 # noqa: PLR2004 + assert len(builder._dimensions) == 1 + assert builder._dimensions[0] == NamedDimension(name="x", size=100) + assert len(builder._variables) == 1 var0 = builder._variables[0] assert var0.name == "x" - assert var0.long_name == "X Dimension" + assert var0.long_name is None assert var0.data_type == ScalarType.INT32 - assert var0.dimensions[0].name == "x" - - # Adding another dimension should maintain state and create another variable - builder.add_dimension("y", 200, data_type=ScalarType.UINT32) - assert builder._state == _BuilderState.HAS_DIMENSIONS - assert len(builder._dimensions) == 2 # noqa: PLR2004 - assert len(builder._variables) == 2 # noqa: PLR2004 - assert builder._dimensions[1].name == "y" - assert builder._dimensions[1].size == 200 # noqa: PLR2004 - var1 = builder._variables[1] - assert var1.name == "y" - assert var1.data_type == ScalarType.UINT32 - assert var1.dimensions[0].name == "y" - - # TODO: Adding a dimension with the same: is allowed allowed (currently ignored) or should have raise an error? - builder.add_dimension("x", 100, long_name="X Dimension") - assert builder._state == _BuilderState.HAS_DIMENSIONS - assert len(builder._dimensions) == 2 # noqa: PLR2004 - assert len(builder._variables) == 2 # noqa: PLR2004 - - # Adding a dimension with the same name and different size throws an error - with pytest.raises(ValueError, match="Dimension 'x' found but size 100 does not match expected size 200"): - builder.add_dimension("x", 200, long_name="X Dimension") - assert builder._state == _BuilderState.HAS_DIMENSIONS - - + assert var0.compressor is None + assert var0.coordinates is None + assert var0.metadata is None def test_add_dimension_with_units() -> None: """Test adding dimensions with units.""" builder = MDIODatasetBuilder("test_dataset") - # Add dimension with units as a dictionary - builder.add_dimension( - "depth", - size=100, - data_type=ScalarType.FLOAT32, - metadata={"unitsV1": {"length": "m"}}, - ) - assert len(builder._variables) == 1 - var0 = builder._variables[0] - assert var0.name == "depth" - assert var0.data_type == ScalarType.FLOAT32 - assert var0.metadata.units_v1.length == "m" - # Add dimension with strongly-typed unit list of single-item builder.add_dimension( "length", size=100, - data_type=ScalarType.FLOAT64, - metadata=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT))], + var_data_type=ScalarType.FLOAT64, + var_metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT))] ) - assert len(builder._variables) == 2 - var1 = builder._variables[1] - assert var1.name == "length" - assert var1.data_type == ScalarType.FLOAT64 - assert var1.metadata.units_v1.length == "ft" - + assert len(builder._variables) == 1 + var0 = builder._variables[0] + assert var0.name == "length" + assert var0.long_name is None + assert var0.data_type == ScalarType.FLOAT64 + assert var0.compressor is None + assert var0.coordinates is None + assert var0.metadata.units_v1.length == "ft" def test_add_dimension_with_attributes() -> None: """Test adding dimensions with attributes.""" builder = MDIODatasetBuilder("test_dataset") - # Add dimension with attributes as dictionary + # Add dimension with strongly-typed attribute list builder.add_dimension( - "depth", + "length", size=100, - data_type=ScalarType.FLOAT32, - metadata={"attributes": {"MGA": 51, "UnitSystem": "Imperial"}} + var_data_type=ScalarType.FLOAT32, + var_metadata_info=[UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"})], ) assert len(builder._variables) == 1 var0 = builder._variables[0] - assert var0.name == "depth" + assert var0.name == "length" assert var0.data_type == ScalarType.FLOAT32 - assert var0.metadata.attributes["MGA"] == 51 # noqa: PLR2004 + assert var0.metadata.attributes["MGA"] == 51 assert var0.metadata.attributes["UnitSystem"] == "Imperial" - # Add dimension with strongly-typed attribute list - builder.add_dimension( - "length", - size=100, - data_type=ScalarType.FLOAT32, - metadata=[UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"})] - ) - assert len(builder._variables) == 2 - var1 = builder._variables[1] - assert var1.name == "length" - assert var1.data_type == ScalarType.FLOAT32 - assert var1.metadata.attributes["MGA"] == 51 # noqa: PLR2004 - assert var1.metadata.attributes["UnitSystem"] == "Imperial" - def test_add_dimension_with_chunk_grid() -> None: """Test adding dimensions with chunk grid.""" builder = MDIODatasetBuilder("test_dataset") - # Add dimension with chunk grid as dictionary + # Add dimension with strongly-typed chunk grid + grid_definition = RegularChunkGrid(configuration=RegularChunkShape(chunk_shape=[20])) builder.add_dimension( - "depth", + "length", size=100, - data_type=ScalarType.FLOAT32, - metadata={"chunkGrid": {"name": "regular", "configuration": {"chunkShape": [20]}}}, + var_data_type=ScalarType.FLOAT32, + var_metadata_info=[ChunkGridMetadata(chunk_grid=grid_definition)], ) assert len(builder._variables) == 1 var0 = builder._variables[0] - assert var0.name == "depth" + assert var0.name == "length" assert var0.data_type == ScalarType.FLOAT32 assert var0.metadata.chunk_grid.name == "regular" assert var0.metadata.chunk_grid.configuration.chunk_shape == [20] - # Add dimension with strongly-typed chunk grid - # TODO: It is not clear, how RectilinearChunkGrid can be mapped to a single dimension - # grid_definition = RectilinearChunkGrid(configuration=RectilinearChunkShape(chunk_shape=[[2,3,4],[2,3,4]])) - grid_definition = RegularChunkGrid(configuration=RegularChunkShape(chunk_shape=[20])) - builder.add_dimension( - "length", - size=100, - data_type=ScalarType.FLOAT32, - metadata=[ChunkGridMetadata(chunk_grid=grid_definition)] - ) - assert len(builder._variables) == 2 - var1 = builder._variables[1] - assert var1.name == "length" - assert var1.data_type == ScalarType.FLOAT32 - assert var1.metadata.chunk_grid.name == "regular" - assert var1.metadata.chunk_grid.configuration.chunk_shape == [20] - def test_add_dimension_with_stats() -> None: """Test adding dimensions with stats.""" builder = MDIODatasetBuilder("test_dataset") - # TODO: Are multiple statistic object supported? - # TODO: StatisticsMetadata accepts list[SummaryStatistics], what does this mean and does it need to be tested? - - # TODO: What is the proper spelling 'statsV1' or 'stats_v1'? Needs to be documented. - # Add dimension with strongly-typed stats builder.add_dimension( "depth", size=100, - data_type=ScalarType.FLOAT32, - metadata=[StatisticsMetadata(stats_v1=SummaryStatistics( - count=100, - sum=1215.1, - sumSquares=125.12, - min=5.61, - max=10.84, - # TODO: Also test EdgeDefinedHistogram - histogram=CenteredBinHistogram(binCenters=[1, 2], counts=[10, 15]) - ))] + var_data_type=ScalarType.FLOAT32, + var_metadata_info=[ + StatisticsMetadata( + stats_v1=SummaryStatistics( + count=100, + sum=1215.1, + sumSquares=125.12, + min=5.61, + max=10.84, + # TODO(DmitriyRepin, #0): Also test EdgeDefinedHistogram + histogram=CenteredBinHistogram(binCenters=[1, 2], counts=[10, 15]), + ) + ) + ], ) assert len(builder._variables) == 1 var0 = builder._variables[0] assert var0.name == "depth" assert var0.data_type == ScalarType.FLOAT32 - assert var0.metadata.stats_v1.count == 100 # noqa: PLR2004 - assert var0.metadata.stats_v1.sum == 1215.1 # noqa: PLR2004 + assert var0.metadata.stats_v1.count == 100 + assert var0.metadata.stats_v1.sum == 1215.1 - # Add dimension with dictionary stats - builder.add_dimension( - "length", - size=100, - data_type=ScalarType.FLOAT32, - metadata={ - "statsV1": { - "count": 100, - "sum": 1215.1, - "sumSquares": 125.12, - "min": 5.61, - "max": 10.84, - "histogram": {"binCenters": [1, 2], "counts": [10, 15]}, - } - }, - ) - assert len(builder._variables) == 2 - var1 = builder._variables[1] - assert var1.name == "length" - assert var1.data_type == ScalarType.FLOAT32 - assert var1.metadata.stats_v1.count == 100 # noqa: PLR2004 - assert var1.metadata.stats_v1.sum == 1215.1 # noqa: PLR2004 def test_add_dimension_with_full_metadata() -> None: """Test adding dimensions with all metadata.""" builder = MDIODatasetBuilder("test_dataset") - # Add dimension with all metadata as dictionary - builder.add_dimension( - "depth", - size=100, - data_type=ScalarType.FLOAT32, - metadata={ - "unitsV1": {"length": "m"}, - "attributes": {"MGA": 51}, - "chunkGrid": {"name": "regular", "configuration": {"chunkShape": [20]}}, - "statsV1": { - "count": 100, - "sum": 1215.1, - "sumSquares": 125.12, - "min": 5.61, - "max": 10.84, - "histogram": {"binCenters": [1, 2], "counts": [10, 15]}, - }, - }, - ) - - assert len(builder._variables) == 1 - var0 = builder._variables[0] - assert var0.name == "depth" - assert var0.data_type == ScalarType.FLOAT32 - assert var0.metadata.units_v1.length == "m" - assert var0.metadata.attributes["MGA"] == 51 # noqa: PLR2004 - assert var0.metadata.chunk_grid.name == "regular" - assert var0.metadata.chunk_grid.configuration.chunk_shape == [20] # noqa: PLR2004 - assert var0.metadata.stats_v1.count == 100 # noqa: PLR2004 - assert var0.metadata.stats_v1.sum == 1215.1 # noqa: PLR2004 - assert var0.metadata.stats_v1.sum_squares == 125.12 # noqa: PLR2004 - assert var0.metadata.stats_v1.min == 5.61 # noqa: PLR2004 - assert var0.metadata.stats_v1.max == 10.84 # noqa: PLR2004 - assert var0.metadata.stats_v1.histogram.bin_centers == [1, 2] # noqa: PLR2004 - assert var0.metadata.stats_v1.histogram.counts == [10, 15] # noqa: PLR2004 # Add dimension with all strongly-typed metadata builder.add_dimension( "length", size=100, - data_type=ScalarType.FLOAT32, - metadata=[ - AllUnits(units_v1=LengthUnitModel( - length=LengthUnitEnum.FOOT)), - UserAttributes( - attributes={"MGA": 51, "UnitSystem": "Imperial"}), + var_data_type=ScalarType.FLOAT32, + var_metadata_info=[ + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)), + UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}), ChunkGridMetadata( - chunk_grid=RegularChunkGrid( - configuration=RegularChunkShape( - chunk_shape=[20]))), - StatisticsMetadata(stats_v1=SummaryStatistics( - count=100, - sum=1215.1, - sumSquares=125.12, - min=5.61, - max=10.84, - histogram=CenteredBinHistogram( - binCenters=[1, 2], - counts=[10, 15]))) - ] + chunk_grid=RegularChunkGrid(configuration=RegularChunkShape(chunk_shape=[20])) + ), + StatisticsMetadata( + stats_v1=SummaryStatistics( + count=100, + sum=1215.1, + sumSquares=125.12, + min=5.61, + max=10.84, + histogram=CenteredBinHistogram(binCenters=[1, 2], counts=[10, 15]), + ) + ), + ], ) - assert len(builder._variables) == 2 - var1 = builder._variables[1] - assert var1.name == "length" - assert var1.data_type == ScalarType.FLOAT32 - assert var1.metadata.units_v1.length == "ft" - assert var1.metadata.attributes["MGA"] == 51 # noqa: PLR2004 - assert var1.metadata.attributes["UnitSystem"] == "Imperial" # noqa: PLR2004 - assert var1.metadata.chunk_grid.name == "regular" - assert var1.metadata.chunk_grid.configuration.chunk_shape == [20] # noqa: PLR2004 - assert var1.metadata.stats_v1.count == 100 # noqa: PLR2004 - assert var1.metadata.stats_v1.sum == 1215.1 # noqa: PLR2004 - assert var1.metadata.stats_v1.sum_squares == 125.12 # noqa: PLR2004 - assert var1.metadata.stats_v1.min == 5.61 # noqa: PLR2004 - assert var1.metadata.stats_v1.max == 10.84 # noqa: PLR2004 - assert var1.metadata.stats_v1.histogram.bin_centers == [1, 2] # noqa: PLR2004 - assert var1.metadata.stats_v1.histogram.counts == [10, 15] # noqa: PLR2004 - - - # j = builder.build().json() - # print(j) \ No newline at end of file + assert len(builder._variables) == 1 + var0 = builder._variables[0] + assert var0.name == "length" + assert var0.data_type == ScalarType.FLOAT32 + assert var0.metadata.units_v1.length == "ft" + assert var0.metadata.attributes["MGA"] == 51 + assert var0.metadata.attributes["UnitSystem"] == "Imperial" + assert var0.metadata.chunk_grid.name == "regular" + assert var0.metadata.chunk_grid.configuration.chunk_shape == [20] + assert var0.metadata.stats_v1.count == 100 + assert var0.metadata.stats_v1.sum == 1215.1 + assert var0.metadata.stats_v1.sum_squares == 125.12 + assert var0.metadata.stats_v1.min == 5.61 + assert var0.metadata.stats_v1.max == 10.84 + assert var0.metadata.stats_v1.histogram.bin_centers == [1, 2] + assert var0.metadata.stats_v1.histogram.counts == [10, 15] diff --git a/tests/unit/v1/test_dataset_builder_add_variable.py b/tests/unit/v1/test_dataset_builder_add_variable.py new file mode 100644 index 000000000..bc168df21 --- /dev/null +++ b/tests/unit/v1/test_dataset_builder_add_variable.py @@ -0,0 +1,123 @@ +# ruff: noqa: PLR2004 +# PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable +# The above erroneous warning is generated for every numerical assert. +# Thus, disable it for this file +"""Tests the schema v1 Variable public API.""" + +import pytest +from mdio.schemas.dtype import ScalarType +from mdio.schemas.metadata import ChunkGridMetadata +from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.dataset_builder import _BuilderState, MDIODatasetBuilder +from mdio.schemas.v1.stats import StatisticsMetadata +from mdio.schemas.v1.units import AllUnits +from mdio.schemas.v1.variable import VariableMetadata + +def test_dataset_builder_add_variable() -> None: + """Test adding variable. Check the state transition and validate required parameters..""" + builder = MDIODatasetBuilder("test_dataset") + assert builder._state == _BuilderState.INITIAL + + with pytest.raises(ValueError, match="Must add at least one dimension before adding variables"): + builder.add_variable("amplitude", dimensions=["speed"]) + + builder.add_dimension("inline", 100) + builder.add_dimension("crossline", 100) + builder.add_dimension("depth", 100) + + bad_name = None + with pytest.raises(ValueError, match="'name' must be a non-empty string"): + builder.add_variable(bad_name, dimensions=["speed"]) + with pytest.raises(ValueError, match="'name' must be a non-empty string"): + builder.add_variable("", dimensions=["speed"]) + with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): + builder.add_variable("amplitude", dimensions=None) + with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): + builder.add_variable("amplitude", dimensions=[]) + + builder.add_variable("seismic_amplitude", dimensions=["inline", "crossline", "depth"]) + assert builder._state == _BuilderState.HAS_VARIABLES + assert len(builder._dimensions) == 3 + assert len(builder._variables) == 4 + assert len(builder._coordinates) == 0 + +def test_add_variable_with_defaults() -> None: + """Test adding variable with default arguments.""" + builder = MDIODatasetBuilder("test_dataset") + builder.add_dimension("inline", 100) + builder.add_dimension("crossline", 100) + builder.add_dimension("depth", 100) + # Add variable using defaults + builder.add_variable("seismic_amplitude", dimensions=["inline", "crossline", "depth"]) + assert len(builder._dimensions) == 3 + assert len(builder._variables) == 4 + assert len(builder._coordinates) == 0 + var0 = next((e for e in builder._variables if e.name == "seismic_amplitude"), None) + assert var0 is not None + # NOTE: add_variable() stores dimensions as names + assert set(var0.dimensions) == set(["inline", "crossline", "depth"]) + assert var0.long_name is None # Default value + assert var0.data_type == ScalarType.FLOAT32 # Default value + assert var0.compressor is None # Default value + assert var0.coordinates is None # Default value + assert var0.metadata is None # Default value + +# def test__make_variable_metadata() -> None: +# """Test creating VariableMetadata from a dictionary.""" + +# meta_dict = None +# metadata = make_variable_metadata_list(meta_dict) +# assert metadata is None + +# meta_dict = {} +# metadata = make_variable_metadata_list(meta_dict) +# assert metadata is None + +# meta_dict = { +# "unitsV1": {"length": "m"}, +# "attributes": {"MGA": 51}, +# "chunkGrid": {"name": "regular", "configuration": {"chunkShape": [20]}}, +# "statsV1": { +# "count": 100, +# "sum": 1215.1, +# "sumSquares": 125.12, +# "min": 5.61, +# "max": 10.84, +# "histogram": {"binCenters": [1, 2], "counts": [10, 15]}, +# }, +# } +# metadata = make_variable_metadata_list(meta_dict) +# assert isinstance(metadata, VariableMetadata) +# assert metadata.units_v1.length == "m" +# assert metadata.attributes["MGA"] == 51 +# assert metadata.chunk_grid.name == "regular" +# assert metadata.chunk_grid.configuration.chunk_shape == [20] +# assert metadata.stats_v1.count == 100 +# assert metadata.stats_v1.sum == 1215.1 +# assert metadata.stats_v1.sum_squares == 125.12 +# assert metadata.stats_v1.min == 5.61 +# assert metadata.stats_v1.max == 10.84 +# assert metadata.stats_v1.histogram.bin_centers == [1, 2] +# assert metadata.stats_v1.histogram.counts == [10, 15] + +# # NOTE: the v1 schema has 'units_v1' property, but pydantic requires 'unitsV1' for CamelCaseStrictModel +# meta_dict = {"units_v1": {"length": "m"}} +# err_msg = ( +# "Unsupported metadata key: 'units_v1'. " +# "Expected 'unitsV1', 'attributes', 'chunkGrid', or 'statsV1." +# ) +# with pytest.raises(TypeError, match=err_msg): +# make_variable_metadata_list(meta_dict) + +# meta_dict = {"attributes": 42} +# with pytest.raises( +# TypeError, match="Invalid value for key 'attributes': 42. Expected a dictionary." +# ): +# make_variable_metadata_list(meta_dict) + +# # *** We currently do not validate the structure of the value dictionaries *** +# # Pass unit object with invalid structure +# # with pytest.raises( +# # TypeError, match="Invalid value format for key 'unitsV1': {'length': 'm', 'time': 'sec'}. "): +# # meta_dict1 = {"unitsV1": {"length": "m", "time": "sec"}} +# # _make_VariableMetadata_from_dict(meta_dict1) diff --git a/tests/unit/v1/test_dataset_builder_helpers.py b/tests/unit/v1/test_dataset_builder_helpers.py new file mode 100644 index 000000000..b9343b997 --- /dev/null +++ b/tests/unit/v1/test_dataset_builder_helpers.py @@ -0,0 +1,265 @@ +# ruff: noqa: PLR2004 +# PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable +# The above erroneous warning is generated for every numerical assert. +# Thus, disable it for this file +"""Tests the schema v1 dataset_builder internal methods.""" + +from datetime import UTC +from datetime import datetime + +import pytest +from pydantic import Field + +from mdio.schemas.chunk_grid import RegularChunkGrid, RegularChunkShape +from mdio.schemas.core import StrictModel +from mdio.schemas.dimension import NamedDimension +from mdio.schemas.metadata import ChunkGridMetadata +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder, _make_coordinate_metadata +from mdio.schemas.v1.dataset_builder import get_dimension_names +from mdio.schemas.v1.dataset_builder import _make_variable_metadata +from mdio.schemas.v1.dataset_builder import _to_dictionary +from mdio.schemas.v1.dataset_builder import contains_dimension +from mdio.schemas.v1.dataset_builder import get_dimension +from mdio.schemas.v1.stats import CenteredBinHistogram, StatisticsMetadata, SummaryStatistics +from mdio.schemas.v1.units import LengthUnitEnum +from mdio.schemas.v1.units import LengthUnitModel +from mdio.schemas.v1.variable import AllUnits, CoordinateMetadata +from mdio.schemas.v1.variable import UserAttributes +from mdio.schemas.v1.variable import VariableMetadata + + +def test__get_dimension() -> None: + """Test getting a dimension by name from the list of dimensions.""" + dimensions = [NamedDimension(name="inline", size=2), NamedDimension(name="crossline", size=3)] + + assert get_dimension([], "inline") is None + + assert get_dimension(dimensions, "inline") == NamedDimension(name="inline", size=2) + assert get_dimension(dimensions, "crossline") == NamedDimension(name="crossline", size=3) + assert get_dimension(dimensions, "time") is None + + with pytest.raises(TypeError, match="Expected str, got NoneType"): + get_dimension(dimensions, None) + with pytest.raises(TypeError, match="Expected str, got int"): + get_dimension(dimensions, 42) + with pytest.raises( + ValueError, match="Dimension 'inline' found but size 2 does not match expected size 200" + ): + get_dimension(dimensions, "inline", size=200) + + +def test__contains_dimension() -> None: + """Test if a dimension with a given name exists in the list of dimensions.""" + dimensions = [NamedDimension(name="inline", size=2), NamedDimension(name="crossline", size=3)] + + assert contains_dimension([], "inline") is False + + assert contains_dimension(dimensions, "inline") is True + assert contains_dimension(dimensions, "crossline") is True + assert contains_dimension(dimensions, "time") is False + + with pytest.raises(TypeError, match="Expected str or NamedDimension, got NoneType"): + contains_dimension(dimensions, None) + with pytest.raises(TypeError, match="Expected str or NamedDimension, got int"): + contains_dimension(dimensions, 42) + with pytest.raises( + ValueError, match="Dimension 'inline' found but size 2 does not match expected size 200" + ): + contains_dimension(dimensions, NamedDimension(name="inline", size=200)) + + +def test_get_dimension_names() -> None: + """Test getting a list of dimension names from list[NamedDimension | str].""" + + empty_list = get_dimension_names(None) + assert empty_list is not None + assert isinstance(empty_list, list) + assert len(empty_list) == 0 + + empty_list = get_dimension_names([]) + assert empty_list is not None + assert isinstance(empty_list, list) + assert len(empty_list) == 0 + + dim_list = get_dimension_names([ + NamedDimension(name="inline", size=2), + "amplitude", + NamedDimension(name="crossline", size=3) + ]) + assert dim_list is not None + assert isinstance(dim_list, list) + assert set(dim_list) == set(["inline", "amplitude", "crossline"]) + + +def test_add_dimensions_if_needed() -> None: + """Test adding named dimensions to a dataset.""" + builder = MDIODatasetBuilder("Test Dataset Builder") + # + # Validate initial state + # + assert builder._dimensions is not None + assert len(builder._dimensions) == 0 + + # + # Validate that adding empty dimensions does not change the state + # + added_dims = builder._add_dimensions_if_needed(None) + assert len(builder._dimensions) == 0 + assert len(added_dims) == 0 + added_dims = builder._add_dimensions_if_needed([]) + assert len(builder._dimensions) == 0 + assert len(added_dims) == 0 + added_dims = builder._add_dimensions_if_needed({}) + assert len(builder._dimensions) == 0 + assert len(added_dims) == 0 + + # + # Add named dimensions + # + inline_dim = NamedDimension(name="inline", size=2) + added_dims = builder._add_dimensions_if_needed([inline_dim]) + assert len(builder._dimensions) == 1 + assert len(added_dims) == 1 + assert contains_dimension(added_dims, inline_dim) + + crossline_dim = NamedDimension(name="crossline", size=3) + time_dim = NamedDimension(name="time", size=4) + added_dims = builder._add_dimensions_if_needed([crossline_dim, time_dim]) + assert len(builder._dimensions) == 3 + assert contains_dimension(builder._dimensions, inline_dim) + assert contains_dimension(builder._dimensions, crossline_dim) + assert contains_dimension(builder._dimensions, time_dim) + assert contains_dimension(added_dims, crossline_dim) + assert contains_dimension(added_dims, time_dim) + + # + # Add invalid object type + # + with pytest.raises(TypeError, match="Expected NamedDimension or str, got int"): + builder._add_dimensions_if_needed([42]) + # Assert that the number of dimensions has not increased + assert len(builder._dimensions) == 3 + +def test__add_dimensions_if_needed_when_one_already_exists() -> None: + """Test adding existing named dimensions to a dataset.""" + builder = MDIODatasetBuilder("Test Dataset Builder") + + inline_dim = NamedDimension(name="inline", size=2) + crossline_dim = NamedDimension(name="crossline", size=3) + time_dim = NamedDimension(name="time", size=4) + # + # Add dimensions with the same names again does nothing + # (make sure we are passing different instances) + # + inline_dim2 = NamedDimension(name=inline_dim.name, size=inline_dim.size) + crossline_dim2 = NamedDimension(name=crossline_dim.name, size=crossline_dim.size) + time_dim2 = NamedDimension(name=time_dim.name, size=time_dim.size) + builder._add_dimensions_if_needed([inline_dim2, crossline_dim2, time_dim2]) + added_dims = builder._add_dimensions_if_needed([inline_dim2, crossline_dim2, time_dim2]) + # Validate that the dimensions and variables are not duplicated + assert len(builder._dimensions) == 3 + assert contains_dimension(builder._dimensions, inline_dim) + assert contains_dimension(builder._dimensions, crossline_dim) + assert contains_dimension(builder._dimensions, time_dim) + assert len(added_dims) == 0 + + # Add dimensions with the same name, but different size again + with pytest.raises( + ValueError, match="Dimension 'inline' found but size 2 does not match expected size 200" + ): + builder._add_dimensions_if_needed([NamedDimension(name="inline", size=200)]) + # Assert that the number of dimensions has not increased + assert len(builder._dimensions) == 3 + + # + # Add existing dimension using its name + # + added_dims = builder._add_dimensions_if_needed(["inline", "crossline"]) + assert len(builder._dimensions) == 3 + assert contains_dimension(builder._dimensions, inline_dim) + assert contains_dimension(builder._dimensions, crossline_dim) + assert contains_dimension(builder._dimensions, time_dim) + assert len(added_dims) == 0 + + # + # Add non-existing dimension using its name is not allowed + # + with pytest.raises(ValueError, match="Pre-existing dimension named 'offset' is not found"): + builder._add_dimensions_if_needed(["offset"]) + assert len(builder._dimensions) == 3 + assert contains_dimension(builder._dimensions, inline_dim) + assert contains_dimension(builder._dimensions, crossline_dim) + assert contains_dimension(builder._dimensions, time_dim) + +def test__to_dictionary() -> None: + """Test converting a BaseModel to a dictionary.""" + with pytest.raises(TypeError, match="Expected BaseModel, got datetime"): + # This should raise an error because datetime is not a BaseModel + _to_dictionary(datetime.now(UTC)) + + class SomeModel(StrictModel): + count: int = Field(default=None, description="Samples count") + samples: list[float] = Field(default_factory=list, description="Samples.") + created: datetime = Field( + default_factory=datetime.now, description="Creation time with TZ info." + ) + + m = SomeModel(count=3, + samples=[1.0, 2.0, 3.0], + created=datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC)) + result = _to_dictionary(m) + assert isinstance(result, dict) + assert result == {"count": 3, "created": "2023-10-01T12:00:00Z", "samples": [1.0, 2.0, 3.0]} + + +def test__make_coordinate_metadata() -> None: + """Test creating VariableMetadata from a strongly-typed list of AllUnits or UserAttributes.""" + units = AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)) + attrs = UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}) + meta_list = [units, attrs] + + # Assume that multiple attributes are allowed + metadata = _make_coordinate_metadata(meta_list) + assert isinstance(metadata, CoordinateMetadata) + assert metadata.units_v1.length == "ft" + assert metadata.attributes["MGA"] == 51 + assert metadata.attributes["UnitSystem"] == "Imperial" + + meta_list = ["ft"] + with pytest.raises(TypeError, match="Unsupported metadata type: "): + _make_variable_metadata(meta_list) + +def test__make_variable_metadata() -> None: + """Test creating VariableMetadata from a strongly-typed list of AllUnits or UserAttributes.""" + units = AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)) + attrs = UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}) + chgrd = ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape(chunk_shape=[20]))) + stats = StatisticsMetadata( + stats_v1=SummaryStatistics( + count=100, + sum=1215.1, + sumSquares=125.12, + min=5.61, + max=10.84, + histogram=CenteredBinHistogram(binCenters=[1, 2], counts=[10, 15]))) + metadata_info = [units, attrs, chgrd, stats] + metadata = _make_variable_metadata(metadata_info) + assert isinstance(metadata, VariableMetadata) + assert metadata.units_v1.length == "ft" + assert metadata.attributes["MGA"] == 51 + assert metadata.attributes["UnitSystem"] == "Imperial" + assert metadata.chunk_grid.name == "regular" + assert metadata.chunk_grid.configuration.chunk_shape == [20] + assert metadata.stats_v1.count == 100 + assert metadata.stats_v1.sum == 1215.1 + assert metadata.stats_v1.sum_squares == 125.12 + assert metadata.stats_v1.min == 5.61 + assert metadata.stats_v1.max == 10.84 + assert metadata.stats_v1.histogram.bin_centers == [1, 2] + assert metadata.stats_v1.histogram.counts == [10, 15] + + meta_list = ["ft"] + with pytest.raises(TypeError, match="Unsupported metadata type: "): + _make_variable_metadata(meta_list) diff --git a/tests/unit/v1/test_dataset_builder_internals.py b/tests/unit/v1/test_dataset_builder_internals.py deleted file mode 100644 index 100b55254..000000000 --- a/tests/unit/v1/test_dataset_builder_internals.py +++ /dev/null @@ -1,208 +0,0 @@ - -from datetime import datetime -from pydantic import BaseModel, Field -import pytest -from mdio.schemas.core import StrictModel -from mdio.schemas.dimension import NamedDimension -from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder, contains_dimension, get_dimension, to_dictionary -from mdio.schemas.v1.units import LengthUnitEnum, LengthUnitModel -from mdio.schemas.v1.variable import VariableMetadata, AllUnits, UserAttributes - -def test__get_dimension() -> None: - """Test getting a dimension by name from the list of dimensions.""" - dimensions = [NamedDimension(name="inline", size=2), NamedDimension(name="crossline", size=3)] - - assert get_dimension([], "inline") is None - - assert get_dimension(dimensions, "inline") == NamedDimension(name="inline", size=2) - assert get_dimension(dimensions, "crossline") == NamedDimension(name="crossline", size=3) - assert get_dimension(dimensions, "time") is None - - with pytest.raises(TypeError, match="Expected str, got NoneType"): - get_dimension(dimensions, None) - with pytest.raises(TypeError, match="Expected str, got int"): - get_dimension(dimensions, 42) - with pytest.raises(ValueError, match="Dimension 'inline' found but size 2 does not match expected size 200"): - get_dimension(dimensions, "inline", size=200) - - -def test__contains_dimension() -> None: - """Test if a dimension with a given name exists in the list of dimensions.""" - dimensions = [NamedDimension(name="inline", size=2), NamedDimension(name="crossline", size=3)] - - assert contains_dimension([], "inline") is False - - assert contains_dimension(dimensions, "inline") is True - assert contains_dimension(dimensions, "crossline") is True - assert contains_dimension(dimensions, "time") is False - - with pytest.raises(TypeError, match="Expected str or NamedDimension, got NoneType"): - contains_dimension(dimensions, None) - with pytest.raises(TypeError, match="Expected str or NamedDimension, got int"): - contains_dimension(dimensions, 42) - with pytest.raises(ValueError, match="Dimension 'inline' found but size 2 does not match expected size 200"): - contains_dimension(dimensions, NamedDimension(name="inline", size=200)) - - - -def test__add_named_dimensions() -> None: - """Test adding named dimensions to a dataset.""" - - builder = MDIODatasetBuilder("Test Dataset Builder") - # - # Validate initial state - # - assert builder._dimensions is not None - assert len(builder._dimensions) == 0 - - # - # Validate that adding empty dimensions does not change the state - # - added_dims = builder._add_named_dimensions(None) - assert len(builder._dimensions) == 0 - assert len(added_dims) == 0 - added_dims = builder._add_named_dimensions([]) - assert len(builder._dimensions) == 0 - assert len(added_dims) == 0 - added_dims = builder._add_named_dimensions({}) - assert len(builder._dimensions) == 0 - assert len(added_dims) == 0 - - # - # Add named dimensions - # - inline_dim = NamedDimension(name="inline", size=2) - added_dims = builder._add_named_dimensions([inline_dim]) - assert len(builder._dimensions) == 1 - assert len(added_dims) == 1 - assert contains_dimension(added_dims, inline_dim) - - crossline_dim = NamedDimension(name="crossline", size=3) - time_dim = NamedDimension(name="time", size=4) - added_dims = builder._add_named_dimensions([crossline_dim, time_dim]) - assert len(builder._dimensions) == 3 - assert contains_dimension(builder._dimensions, inline_dim) - assert contains_dimension(builder._dimensions, crossline_dim) - assert contains_dimension(builder._dimensions, time_dim) - assert contains_dimension(added_dims, crossline_dim) - assert contains_dimension(added_dims, time_dim) - - # - # Add invalid object type - # - with pytest.raises(TypeError, match="Expected NamedDimension or str, got int"): - builder._add_named_dimensions([42]) - assert len(builder._dimensions) == 3 - - # - # Add dimensions with the same names again does nothing - # (make sure we are passing different instances) - # - inline_dim2 = NamedDimension(name=inline_dim.name, size=inline_dim.size) - crossline_dim2 = NamedDimension(name=crossline_dim.name, size=crossline_dim.size) - time_dim2 = NamedDimension(name=time_dim.name, size=time_dim.size) - added_dims = builder._add_named_dimensions([inline_dim2, crossline_dim2, time_dim2]) - # Validate that the dimensions and variables are not duplicated - assert len(builder._dimensions) == 3 - assert contains_dimension(builder._dimensions, inline_dim) - assert contains_dimension(builder._dimensions, crossline_dim) - assert contains_dimension(builder._dimensions, time_dim) - assert len(added_dims) == 0 - - # Add dimensions with the same name, but different size again - with pytest.raises(ValueError, match="Dimension 'inline' found but size 2 does not match expected size 200"): - inline_dim2 = NamedDimension(name="inline", size=200) - builder._add_named_dimensions([inline_dim2]) - assert len(builder._dimensions) == 3 - # - # Add existing dimension using its name - # - added_dims = builder._add_named_dimensions(["inline", "crossline"]) - assert len(builder._dimensions) == 3 - assert contains_dimension(builder._dimensions, inline_dim) - assert contains_dimension(builder._dimensions, crossline_dim) - assert contains_dimension(builder._dimensions, time_dim) - assert len(added_dims) == 0 - - # - # Add non-existing dimension using its name is not allowed - # - with pytest.raises(ValueError, match="Dimension named 'offset' is not found"): - builder._add_named_dimensions(["offset"]) - assert len(builder._dimensions) == 3 - assert contains_dimension(builder._dimensions, inline_dim) - assert contains_dimension(builder._dimensions, crossline_dim) - assert contains_dimension(builder._dimensions, time_dim) - - -def test__to_dictionary() -> None: - """Test converting a BaseModel to a dictionary.""" - - with pytest.raises(TypeError, match="Expected BaseModel, got datetime"): - # This should raise an error because datetime is not a BaseModel - to_dictionary(datetime.now()) - - class SomeModel(StrictModel): - count: int = Field(default=None, description="Samples count") - samples: list[float] = Field(default_factory=list, description="Samples.") - created: datetime = Field(default_factory=datetime.now, description="Creation time with TZ info.") - - m = SomeModel( - count = 3, - samples = [1.0, 2.0, 3.0], - created = datetime(2023, 10, 1, 12, 0, 0, tzinfo=None) - ) - result = to_dictionary(m) - assert isinstance(result, dict) - assert result == {'count': 3, 'created': '2023-10-01T12:00:00', 'samples': [1.0, 2.0, 3.0]} - - -def test__make_VariableMetadata_from_list() -> None: - """Test creating VariableMetadata from a strongly-typed list of AllUnits or UserAttributes.""" - - units = AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)) - attrs = UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}) - meta_list=[units, attrs] - - # TODO: I assume we do not want attribute.attribute in the contract: - # 'metadata': {'unitsV1': {'length': 'm'}, 'attributes': {'attributes': {'MGA': 51}}} - # TODO: Are multiple attributes allowed (I assume they are)? - metadata = MDIODatasetBuilder._make_VariableMetadata_from_list(meta_list) - assert isinstance(metadata, VariableMetadata) - assert metadata.units_v1.length == "ft" - assert metadata.attributes["MGA"] == 51 - assert metadata.attributes["UnitSystem"] == "Imperial" - - with pytest.raises(TypeError, match="Unsupported metadata type: "): - meta_list = ["ft"] - MDIODatasetBuilder._make_VariableMetadata_from_list(meta_list) - -def test__make_VariableMetadata_from_dict() -> None: - """Test creating VariableMetadata from a dictionary.""" - - # TODO: What is the key for units: it unitsV1 or units_v1? - # TODO: Are multiple attributes allowed (I assume they are)? - # TODO: Do we validate the unit string supplied in dictionary parameters? What what if someone supplies ftUS instead of ft? - meta_dict={"unitsV1": {"length": "ft"}, "attributes": {"MGA": 51, "UnitSystem": "Imperial"}} - metadata = MDIODatasetBuilder._make_VariableMetadata_from_dict(meta_dict) - assert isinstance(metadata, VariableMetadata) - assert metadata.units_v1.length == "ft" - assert metadata.attributes["MGA"] == 51 - assert metadata.attributes["UnitSystem"] == "Imperial" - - with pytest.raises(TypeError, match="Unsupported metadata key: 'units_v1'. Expected 'unitsV1', 'attributes', 'chunkGrid', or 'statsV1."): - meta_dict = {"units_v1": "ft"} - MDIODatasetBuilder._make_VariableMetadata_from_dict(meta_dict) - - with pytest.raises(TypeError, match="Invalid value for key 'attributes': 42. Expected a dictionary."): - meta_dict = {"attributes": 42} - MDIODatasetBuilder._make_VariableMetadata_from_dict(meta_dict) - - # *** We currently do not validate the structure of the value dictionaries *** - # Pass unit object with invalid structure - # with pytest.raises(TypeError, match="Invalid value format for key 'unitsV1': {'length': 'm', 'time': 'sec'}. "): - # meta_dict1 = {"unitsV1": {"length": "m", "time": "sec"}} - # MDIODatasetBuilder._make_VariableMetadata_from_dict(meta_dict1) - - - diff --git a/tests/unit/v1/test_dataset_builder_state.py b/tests/unit/v1/test_dataset_builder_state.py deleted file mode 100644 index 31c570a85..000000000 --- a/tests/unit/v1/test_dataset_builder_state.py +++ /dev/null @@ -1,88 +0,0 @@ - -from datetime import datetime -import pytest - -from mdio.schemas.v1.dataset_builder import _BuilderState, MDIODatasetBuilder - -def test_builder_initialization() -> None: - """Test basic builder initialization.""" - builder = MDIODatasetBuilder("test_dataset") - assert builder.name == "test_dataset" - assert builder.api_version == "1.0.0" - assert isinstance(builder.created_on, datetime) - assert len(builder._dimensions) == 0 - assert len(builder._coordinates) == 0 - assert len(builder._variables) == 0 - assert builder._state == _BuilderState.INITIAL - -def test_builder_add_dimension_state() -> None: - """Test coordinate builder before and after add_dimension.""" - builder = MDIODatasetBuilder("test_dataset") - assert builder._state == _BuilderState.INITIAL - - # One should be able to add dimension any time after the builder has been created - - # Add dimensions first - builder = builder.add_dimension("x", 100) - assert builder._state == _BuilderState.HAS_DIMENSIONS - builder = builder.add_dimension("y", 200) - assert builder._state == _BuilderState.HAS_DIMENSIONS - -@pytest.mark.skip(reason="Under construction.") -def test_coordinate_builder_state() -> None: - """Test coordinate builder state transitions and functionality.""" - builder = MDIODatasetBuilder("test_dataset") - - # Should not be able to add coordinates before dimensions - with pytest.raises( - ValueError, match="Must add at least one dimension before adding coordinates" - ): - builder.add_coordinate("x_coord", dimensions=["x"]) - - # Add dimensions first - builder = builder.add_dimension("x", 100) - builder = builder.add_dimension("y", 200) - - # Adding coordinate should change state to HAS_COORDINATES - builder = builder.add_coordinate("x_coord", dimensions=["x"], long_name="X Coordinate") - assert builder._state == _BuilderState.HAS_COORDINATES - assert len(builder._coordinates) == 1 # noqa: PLR2004 - assert builder._coordinates[0].name == "x_coord" - assert builder._coordinates[0].long_name == "X Coordinate" - assert builder._coordinates[0].dimensions[0].name == "x" - - # Adding another coordinate should maintain state - builder = builder.add_coordinate("y_coord", dimensions=["y"]) - assert builder._state == _BuilderState.HAS_COORDINATES - assert len(builder._coordinates) == 2 # noqa: PLR2004 - assert builder._coordinates[1].name == "y_coord" - assert builder._coordinates[1].dimensions[0].name == "y" - -@pytest.mark.skip(reason="Under construction.") -def test_variable_builder_state() -> None: - """Test variable builder state transitions and functionality.""" - builder = MDIODatasetBuilder("test_dataset") - - # Should not be able to add variables before dimensions - with pytest.raises(ValueError, match="Must add at least one dimension before adding variables"): - builder.add_variable("data", dimensions=["x"]) - - # Add dimension first - builder = builder.add_dimension("x", 100) - - # Adding variable should change state to HAS_VARIABLES - builder = builder.add_variable("data", dimensions=["x"], long_name="Data Variable") - assert builder._state == _BuilderState.HAS_VARIABLES - # One for dimension, one for variable - assert len(builder._variables) == 2 # noqa: PLR2004 - assert builder._variables[1].name == "data" - assert builder._variables[1].long_name == "Data Variable" - assert builder._variables[1].dimensions[0].name == "x" - - # Adding another variable should maintain state - builder = builder.add_variable("data2", dimensions=["x"]) - assert builder._state == _BuilderState.HAS_VARIABLES - # One for dimension, two for variables - assert len(builder._variables) == 3 # noqa: PLR2004 - assert builder._variables[2].name == "data2" - assert builder._variables[2].dimensions[0].name == "x" \ No newline at end of file From e5261cb1af1a6cfadb6ddf9eac7c0c34bf544054 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Sat, 28 Jun 2025 00:11:13 +0000 Subject: [PATCH 19/56] Finished add_dimension, add_coordinate, add_variable --- DEVELOPER_NOTES.md | 16 +- src/mdio/schemas/v1/dataset_builder.py | 60 +++++--- .../v1/test_dataset_builder_add_coordinate.py | 31 ++-- .../v1/test_dataset_builder_add_dimension.py | 15 +- .../v1/test_dataset_builder_add_variable.py | 143 ++++++++++-------- tests/unit/v1/test_dataset_builder_helpers.py | 21 +-- 6 files changed, 167 insertions(+), 119 deletions(-) diff --git a/DEVELOPER_NOTES.md b/DEVELOPER_NOTES.md index 427801ee0..dec21dfe2 100644 --- a/DEVELOPER_NOTES.md +++ b/DEVELOPER_NOTES.md @@ -85,9 +85,11 @@ builder.add_dimension( * When a coordinate or a variable is created, their schema allows to store their dimensions either as * list of dimensions name `list[str]`, where the names refer to the dimensions defined in the builder._dimensions * list of named dimensions `list[NamedDimension]`, which duplicate the dimensions defined in the builder._dimensions - * Mixture of the two above `list[NamedDimension | str]` + * Mixture of the two above `list[NamedDimension | str]` - We will be using the first approach. + which approach should be used? + + `RESOLUTION: We will be using the first approach.` **IMPORTANT: For binary compatibility, We need to ensure that the C++ code follows the same logic** @@ -98,20 +100,25 @@ builder.add_dimension( def make_coordinate_metadata_list_from_dict(metadata: dict[str, Any]) -> CoordinateMetadataList: # Implementation goes here ``` + `RESOLUTION: The approach confirmed.` ## Schema V1 questions * add_dimension(): Can a dimension with the same name be added multiple times. Options: * Allowed: the second request is ignored (current implementation) - * Adding a dimension with the same name, but the different size currently throws an error * Not Allowed: should it raise an error? + + `RESOLUTION: The dimensions with the same name are not allowed` * The pydantic attribute names are different from the v1 schema attributes names. What are the repercussions? ``` 'statsV1' <-> 'stats_v1' 'unitsV1' <-> 'units_v1' 'chunkGrid' <-> 'chunk_grid' ``` + `Under investigation` * Should histogram (e.g., SummaryStatistics) have a `histogram_type` attribute? + + `Under investigation` * Units * Why 'ftUS' is not supported by the schema? U.S. survey foot vs the International Foot: *"The U.S. survey foot is defined as 1200/3937 meters, while the international foot is defined as exactly 0.3048 meters. @@ -120,7 +127,10 @@ builder.add_dimension( This ... moves a State Plane coordinate position 4 feet by 12 feet."* * Why there are no dimensionless unis (for seismic amplitudes, inlines, etc.) + `Under investigation` + ## Design suggestions * Should we rename add_dimension to add_dimension_variable (or similar) to indicate that we not just providing the dimension name, but also creating the dimension variable + `RESOLUTION: Shorter names are preferable for public API. The function behavior will be described in the docs` diff --git a/src/mdio/schemas/v1/dataset_builder.py b/src/mdio/schemas/v1/dataset_builder.py index b97ae7ee2..2cc65812b 100644 --- a/src/mdio/schemas/v1/dataset_builder.py +++ b/src/mdio/schemas/v1/dataset_builder.py @@ -10,7 +10,8 @@ from pydantic import BaseModel from zarr.core.chunk_key_encodings import V2ChunkKeyEncoding # noqa: F401 -from mdio.schemas.compressors import ZFP, Blosc +from mdio.schemas.compressors import ZFP +from mdio.schemas.compressors import Blosc from mdio.schemas.dimension import NamedDimension from mdio.schemas.dtype import ScalarType from mdio.schemas.dtype import StructuredType @@ -18,13 +19,18 @@ from mdio.schemas.metadata import UserAttributes from mdio.schemas.v1.stats import StatisticsMetadata from mdio.schemas.v1.units import AllUnits -from mdio.schemas.v1.variable import Coordinate, CoordinateMetadata +from mdio.schemas.v1.variable import Coordinate +from mdio.schemas.v1.variable import CoordinateMetadata from mdio.schemas.v1.variable import Variable from mdio.schemas.v1.variable import VariableMetadata +CoordinateMetadataList: TypeAlias = list[AllUnits | + UserAttributes] +VariableMetadataList: TypeAlias = list[AllUnits | + UserAttributes | + ChunkGridMetadata | + StatisticsMetadata] -CoordinateMetadataList: TypeAlias = list[AllUnits | UserAttributes] -VariableMetadataList: TypeAlias = list[AllUnits | UserAttributes | ChunkGridMetadata | StatisticsMetadata] class _BuilderState(Enum): """States for the template builder.""" @@ -68,7 +74,7 @@ def get_dimension( return nd -def get_dimension_names( dimensions: list[NamedDimension | str]) -> list[str]: +def get_dimension_names(dimensions: list[NamedDimension | str]) -> list[str]: """Get a dimension by name from the list.""" names = [] if dimensions is None: @@ -88,10 +94,11 @@ def _to_dictionary(val: BaseModel) -> dict[str, Any]: raise TypeError(msg) return val.model_dump(mode="json", by_alias=True) + def _make_coordinate_metadata(metadata: CoordinateMetadataList | None) -> CoordinateMetadata | None: if metadata is None or not metadata: return None - + metadata_dict = {} for md in metadata: # NOTE: the pydantic attribute names are different from the v1 schema attributes names @@ -111,7 +118,7 @@ def _make_coordinate_metadata(metadata: CoordinateMetadataList | None) -> Coordi def _make_variable_metadata(metadata: VariableMetadataList | None) -> VariableMetadata | None: if metadata is None or not metadata: return None - + metadata_dict = {} for md in metadata: # NOTE: the pydantic attribute names are different from the v1 schema attributes names @@ -133,6 +140,7 @@ def _make_variable_metadata(metadata: VariableMetadataList | None) -> VariableMe raise TypeError(msg) return VariableMetadata(**metadata_dict) + class MDIODatasetBuilder: """Builder for creating MDIO datasets with enforced build order. @@ -191,19 +199,25 @@ def add_dimension( # noqa: PLR0913 """Add a dimension. This must be called at least once before adding coordinates or variables. + This call will create a variable, if one does not yet exists Args: name: Name of the dimension size: Size of the dimension - long_name: Optional long name for the dimension variable - data_type: Data type for the dimension variable (defaults to INT32) - metadata_info: Optional metadata information for the dimension variable + var_long_name: Optional long name for the dimension variable + var_data_type: Data type for the dimension variable (defaults to INT32) + var_metadata_info: Optional metadata information for the dimension variable Returns: self: Returns self for method chaining """ if not name: - raise ValueError("'name' must be a non-empty string") + msg = "'name' must be a non-empty string" + raise ValueError(msg) + old_var = next((e for e in self._dimensions if e.name == name), None) + if old_var is not None: + msg = "Adding dimension with the same name twice is not allowed" + raise ValueError(msg) added_dims = self._add_dimensions_if_needed( [NamedDimension(name=name, size=size)]) @@ -237,9 +251,15 @@ def add_coordinate( # noqa: PLR0913 msg = "Must add at least one dimension before adding coordinates" raise ValueError(msg) if not name: - raise ValueError("'name' must be a non-empty string") + msg = "'name' must be a non-empty string" + raise ValueError(msg) if dimensions is None or not dimensions: - raise ValueError("'dimensions' must be a non-empty list") + msg = "'dimensions' must be a non-empty list" + raise ValueError(msg) + old_var = next((e for e in self._coordinates if e.name == name), None) + if old_var is not None: + msg = "Adding coordinate with the same name twice is not allowed" + raise ValueError(msg) self._add_dimensions_if_needed(dimensions) dim_names = get_dimension_names(dimensions) @@ -247,7 +267,8 @@ def add_coordinate( # noqa: PLR0913 Coordinate( name=name, longName=long_name, - dimensions=dim_names, # We ass names: sts, not list[NamedDimension | str] + # We ass names: sts, not list[NamedDimension | str] + dimensions=dim_names, dataType=data_type, metadata=_make_coordinate_metadata(metadata_info), ) @@ -255,7 +276,6 @@ def add_coordinate( # noqa: PLR0913 self._state = _BuilderState.HAS_COORDINATES return self - def add_variable( # noqa: PLR0913 self, name: str, @@ -272,9 +292,15 @@ def add_variable( # noqa: PLR0913 msg = "Must add at least one dimension before adding variables" raise ValueError(msg) if not name: - raise ValueError("'name' must be a non-empty string") + msg = "'name' must be a non-empty string" + raise ValueError(msg) if dimensions is None or not dimensions: - raise ValueError("'dimensions' must be a non-empty list") + msg = "'dimensions' must be a non-empty list" + raise ValueError(msg) + old_var = next((e for e in self._variables if e.name == name), None) + if old_var is not None: + msg = "Adding variable with the same name twice is not allowed" + raise ValueError(msg) self._add_dimensions_if_needed(dimensions) dim_names = get_dimension_names(dimensions) diff --git a/tests/unit/v1/test_dataset_builder_add_coordinate.py b/tests/unit/v1/test_dataset_builder_add_coordinate.py index b38da14be..659fedacf 100644 --- a/tests/unit/v1/test_dataset_builder_add_coordinate.py +++ b/tests/unit/v1/test_dataset_builder_add_coordinate.py @@ -6,17 +6,10 @@ import pytest -from mdio.schemas.chunk_grid import RegularChunkGrid -from mdio.schemas.chunk_grid import RegularChunkShape -from mdio.schemas.dimension import NamedDimension from mdio.schemas.dtype import ScalarType -from mdio.schemas.metadata import ChunkGridMetadata from mdio.schemas.metadata import UserAttributes -from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder, contains_dimension +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder from mdio.schemas.v1.dataset_builder import _BuilderState -from mdio.schemas.v1.stats import CenteredBinHistogram -from mdio.schemas.v1.stats import StatisticsMetadata -from mdio.schemas.v1.stats import SummaryStatistics from mdio.schemas.v1.units import AllUnits from mdio.schemas.v1.units import LengthUnitEnum from mdio.schemas.v1.units import LengthUnitModel @@ -27,8 +20,9 @@ def test_add_coordinate() -> None: builder = MDIODatasetBuilder("test_dataset") assert builder._state == _BuilderState.INITIAL - with pytest.raises(ValueError, match="Must add at least one dimension before adding coordinates"): - builder.add_coordinate("amplitude", dimensions=["speed"]) + msg = "Must add at least one dimension before adding coordinates" + with pytest.raises(ValueError, match=msg): + builder.add_coordinate("cdp", dimensions=["inline", "crossline"]) builder.add_dimension("inline", 100) builder.add_dimension("crossline", 100) @@ -49,6 +43,11 @@ def test_add_coordinate() -> None: assert len(builder._variables) == 2 assert len(builder._coordinates) == 1 + # Adding coordinate with the same name twice + msg="Adding coordinate with the same name twice is not allowed" + with pytest.raises(ValueError, match=msg): + builder.add_coordinate("cdp", dimensions=["inline", "crossline"]) + def test_add_coordinate_with_defaults() -> None: """Test adding coordinates with default arguments.""" builder = MDIODatasetBuilder("test_dataset") @@ -59,10 +58,10 @@ def test_add_coordinate_with_defaults() -> None: assert len(builder._dimensions) == 2 assert len(builder._variables) == 2 assert len(builder._coordinates) == 1 - # NOTE: add_variable() stores dimensions as names crd0 = next((e for e in builder._coordinates if e.name == "cdp"), None) assert crd0 is not None - assert set(crd0.dimensions) == set(["inline", "crossline"]) + # NOTE: add_variable() stores dimensions as names + assert set(crd0.dimensions) == {"inline", "crossline"} assert crd0.long_name is None # Default value assert crd0.data_type == ScalarType.FLOAT32 # Default value assert crd0.metadata is None # Default value @@ -81,10 +80,10 @@ def test_coordinate_with_units() -> None: assert len(builder._dimensions) == 2 assert len(builder._variables) == 2 assert len(builder._coordinates) == 1 - # NOTE: add_coordinate() stores dimensions as names crd0 = next((e for e in builder._coordinates if e.name == "cdp"), None) assert crd0 is not None - assert set(crd0.dimensions) == set(["inline", "crossline"]) + # NOTE: add_coordinate() stores dimensions as names + assert set(crd0.dimensions) == {"inline", "crossline"} assert crd0.long_name is None # Default value assert crd0.data_type == ScalarType.FLOAT32 # Default value assert crd0.metadata.attributes is None @@ -108,7 +107,7 @@ def test_coordinate_with_attributes() -> None: # NOTE: add_coordinate() stores dimensions as names crd0 = next((e for e in builder._coordinates if e.name == "cdp"), None) assert crd0 is not None - assert set(crd0.dimensions) == set(["inline", "crossline"]) + assert set(crd0.dimensions) == {"inline", "crossline"} assert crd0.long_name is None # Default value assert crd0.data_type == ScalarType.FLOAT32 # Default value assert crd0.metadata.attributes["MGA"] == 51 @@ -135,7 +134,7 @@ def test_coordinate_with_full_metadata() -> None: # NOTE: add_coordinate() stores dimensions as names crd0 = next((e for e in builder._coordinates if e.name == "cdp"), None) assert crd0 is not None - assert set(crd0.dimensions) == set(["inline", "crossline"]) + assert set(crd0.dimensions) == {"inline", "crossline"} assert crd0.long_name is None # Default value assert crd0.data_type == ScalarType.FLOAT32 # Default value assert crd0.metadata.attributes["MGA"] == 51 diff --git a/tests/unit/v1/test_dataset_builder_add_dimension.py b/tests/unit/v1/test_dataset_builder_add_dimension.py index 7adebb4b5..6ff1f2590 100644 --- a/tests/unit/v1/test_dataset_builder_add_dimension.py +++ b/tests/unit/v1/test_dataset_builder_add_dimension.py @@ -40,17 +40,10 @@ def test_add_dimension() -> None: assert builder._dimensions[0] == NamedDimension(name="x", size=100) assert len(builder._variables) == 1 - # Adding a dimension with the same name as an existing dimension. - # Currently, it does not raise an error, but just ignores this call - builder.add_dimension("x", 100, var_long_name="X Dimension") - assert builder._state == _BuilderState.HAS_DIMENSIONS - assert len(builder._dimensions) == 1 - assert len(builder._variables) == 1 - - # Adding a dimension with the same name and different size throws an error - err_msg = "Dimension 'x' found but size 100 does not match expected size 200" - with pytest.raises(ValueError, match=err_msg): - builder.add_dimension("x", 200, var_long_name="X Dimension") + # Adding dimension with the same name twice + msg="Adding dimension with the same name twice is not allowed" + with pytest.raises(ValueError, match=msg): + builder.add_dimension("x", 200) def test_add_dimension_with_defaults() -> None: """Test dimension builder state transitions and functionality.""" diff --git a/tests/unit/v1/test_dataset_builder_add_variable.py b/tests/unit/v1/test_dataset_builder_add_variable.py index bc168df21..7c0b46ba5 100644 --- a/tests/unit/v1/test_dataset_builder_add_variable.py +++ b/tests/unit/v1/test_dataset_builder_add_variable.py @@ -5,20 +5,31 @@ """Tests the schema v1 Variable public API.""" import pytest + +from mdio.schemas.chunk_grid import RegularChunkGrid +from mdio.schemas.chunk_grid import RegularChunkShape +from mdio.schemas.compressors import Blosc from mdio.schemas.dtype import ScalarType from mdio.schemas.metadata import ChunkGridMetadata from mdio.schemas.metadata import UserAttributes -from mdio.schemas.v1.dataset_builder import _BuilderState, MDIODatasetBuilder +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder +from mdio.schemas.v1.dataset_builder import _BuilderState +from mdio.schemas.v1.stats import CenteredBinHistogram from mdio.schemas.v1.stats import StatisticsMetadata +from mdio.schemas.v1.stats import SummaryStatistics from mdio.schemas.v1.units import AllUnits +from mdio.schemas.v1.units import LengthUnitEnum +from mdio.schemas.v1.units import LengthUnitModel from mdio.schemas.v1.variable import VariableMetadata -def test_dataset_builder_add_variable() -> None: + +def test_add_variable() -> None: """Test adding variable. Check the state transition and validate required parameters..""" builder = MDIODatasetBuilder("test_dataset") assert builder._state == _BuilderState.INITIAL - with pytest.raises(ValueError, match="Must add at least one dimension before adding variables"): + msg = "Must add at least one dimension before adding variables" + with pytest.raises(ValueError, match=msg): builder.add_variable("amplitude", dimensions=["speed"]) builder.add_dimension("inline", 100) @@ -35,12 +46,18 @@ def test_dataset_builder_add_variable() -> None: with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): builder.add_variable("amplitude", dimensions=[]) - builder.add_variable("seismic_amplitude", dimensions=["inline", "crossline", "depth"]) + builder.add_variable("amplitude", dimensions=["inline", "crossline", "depth"]) assert builder._state == _BuilderState.HAS_VARIABLES assert len(builder._dimensions) == 3 assert len(builder._variables) == 4 assert len(builder._coordinates) == 0 + # Adding variable with the same name twice + msg="Adding variable with the same name twice is not allowed" + with pytest.raises(ValueError, match=msg): + builder.add_variable("amplitude", dimensions=["inline", "crossline", "depth"]) + + def test_add_variable_with_defaults() -> None: """Test adding variable with default arguments.""" builder = MDIODatasetBuilder("test_dataset") @@ -55,69 +72,69 @@ def test_add_variable_with_defaults() -> None: var0 = next((e for e in builder._variables if e.name == "seismic_amplitude"), None) assert var0 is not None # NOTE: add_variable() stores dimensions as names - assert set(var0.dimensions) == set(["inline", "crossline", "depth"]) + assert set(var0.dimensions) == {"inline", "crossline", "depth"} assert var0.long_name is None # Default value assert var0.data_type == ScalarType.FLOAT32 # Default value assert var0.compressor is None # Default value assert var0.coordinates is None # Default value assert var0.metadata is None # Default value -# def test__make_variable_metadata() -> None: -# """Test creating VariableMetadata from a dictionary.""" - -# meta_dict = None -# metadata = make_variable_metadata_list(meta_dict) -# assert metadata is None - -# meta_dict = {} -# metadata = make_variable_metadata_list(meta_dict) -# assert metadata is None - -# meta_dict = { -# "unitsV1": {"length": "m"}, -# "attributes": {"MGA": 51}, -# "chunkGrid": {"name": "regular", "configuration": {"chunkShape": [20]}}, -# "statsV1": { -# "count": 100, -# "sum": 1215.1, -# "sumSquares": 125.12, -# "min": 5.61, -# "max": 10.84, -# "histogram": {"binCenters": [1, 2], "counts": [10, 15]}, -# }, -# } -# metadata = make_variable_metadata_list(meta_dict) -# assert isinstance(metadata, VariableMetadata) -# assert metadata.units_v1.length == "m" -# assert metadata.attributes["MGA"] == 51 -# assert metadata.chunk_grid.name == "regular" -# assert metadata.chunk_grid.configuration.chunk_shape == [20] -# assert metadata.stats_v1.count == 100 -# assert metadata.stats_v1.sum == 1215.1 -# assert metadata.stats_v1.sum_squares == 125.12 -# assert metadata.stats_v1.min == 5.61 -# assert metadata.stats_v1.max == 10.84 -# assert metadata.stats_v1.histogram.bin_centers == [1, 2] -# assert metadata.stats_v1.histogram.counts == [10, 15] - -# # NOTE: the v1 schema has 'units_v1' property, but pydantic requires 'unitsV1' for CamelCaseStrictModel -# meta_dict = {"units_v1": {"length": "m"}} -# err_msg = ( -# "Unsupported metadata key: 'units_v1'. " -# "Expected 'unitsV1', 'attributes', 'chunkGrid', or 'statsV1." -# ) -# with pytest.raises(TypeError, match=err_msg): -# make_variable_metadata_list(meta_dict) - -# meta_dict = {"attributes": 42} -# with pytest.raises( -# TypeError, match="Invalid value for key 'attributes': 42. Expected a dictionary." -# ): -# make_variable_metadata_list(meta_dict) +def test_add_variable_full_parameters() -> None: + """Test adding variable with full parameters.""" + builder = MDIODatasetBuilder("test_dataset") + builder.add_dimension("inline", 100) + builder.add_dimension("crossline", 100) + builder.add_dimension("depth", 100) + builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"]) + builder.add_coordinate("cdp-y", dimensions=["inline", "crossline"]) + builder.add_variable("seismic_amplitude", + long_name="Amplitude (dimensionless)", + dimensions=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT64, + compressor=Blosc(algorithm="zstd"), + coordinates=["inline", "crossline", "depth", "cdp-x", "cdp-y"], + metadata_info=[ + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)), + UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}), + ChunkGridMetadata( + chunk_grid=RegularChunkGrid(configuration=RegularChunkShape(chunk_shape=[20])) + ), + StatisticsMetadata( + stats_v1=SummaryStatistics( + count=100, + sum=1215.1, + sumSquares=125.12, + min=5.61, + max=10.84, + histogram=CenteredBinHistogram(binCenters=[1, 2], counts=[10, 15]), + ) + ), + ]) + assert len(builder._dimensions) == 3 + assert len(builder._coordinates) == 2 + assert len(builder._variables) == 4 + v = next((v for v in builder._variables if v.name == "seismic_amplitude"), None) + assert v is not None + assert v.long_name == "Amplitude (dimensionless)" + # NOTE: add_variable() stores dimensions as names + assert set(v.dimensions) == {"inline", "crossline", "depth"} + assert v.data_type == ScalarType.FLOAT64 + assert isinstance(v.compressor, Blosc) + assert v.compressor.algorithm == "zstd" + # NOTE: add_variable() stores coordinates as names + assert set(v.coordinates) == {"inline", "crossline", "depth", "cdp-x", "cdp-y"} + assert v.metadata.stats_v1.count == 100 + assert isinstance(v.metadata, VariableMetadata) + assert v.metadata.units_v1.length == "ft" + assert v.metadata.attributes["MGA"] == 51 + assert v.metadata.attributes["UnitSystem"] == "Imperial" + assert v.metadata.chunk_grid.name == "regular" + assert v.metadata.chunk_grid.configuration.chunk_shape == [20] + assert v.metadata.stats_v1.count == 100 + assert v.metadata.stats_v1.sum == 1215.1 + assert v.metadata.stats_v1.sum_squares == 125.12 + assert v.metadata.stats_v1.min == 5.61 + assert v.metadata.stats_v1.max == 10.84 + assert v.metadata.stats_v1.histogram.bin_centers == [1, 2] + assert v.metadata.stats_v1.histogram.counts == [10, 15] -# # *** We currently do not validate the structure of the value dictionaries *** -# # Pass unit object with invalid structure -# # with pytest.raises( -# # TypeError, match="Invalid value format for key 'unitsV1': {'length': 'm', 'time': 'sec'}. "): -# # meta_dict1 = {"unitsV1": {"length": "m", "time": "sec"}} -# # _make_VariableMetadata_from_dict(meta_dict1) diff --git a/tests/unit/v1/test_dataset_builder_helpers.py b/tests/unit/v1/test_dataset_builder_helpers.py index b9343b997..d3df78af3 100644 --- a/tests/unit/v1/test_dataset_builder_helpers.py +++ b/tests/unit/v1/test_dataset_builder_helpers.py @@ -10,30 +10,34 @@ import pytest from pydantic import Field -from mdio.schemas.chunk_grid import RegularChunkGrid, RegularChunkShape +from mdio.schemas.chunk_grid import RegularChunkGrid +from mdio.schemas.chunk_grid import RegularChunkShape from mdio.schemas.core import StrictModel from mdio.schemas.dimension import NamedDimension from mdio.schemas.metadata import ChunkGridMetadata -from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder, _make_coordinate_metadata -from mdio.schemas.v1.dataset_builder import get_dimension_names +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder +from mdio.schemas.v1.dataset_builder import _make_coordinate_metadata from mdio.schemas.v1.dataset_builder import _make_variable_metadata from mdio.schemas.v1.dataset_builder import _to_dictionary from mdio.schemas.v1.dataset_builder import contains_dimension from mdio.schemas.v1.dataset_builder import get_dimension -from mdio.schemas.v1.stats import CenteredBinHistogram, StatisticsMetadata, SummaryStatistics +from mdio.schemas.v1.dataset_builder import get_dimension_names +from mdio.schemas.v1.stats import CenteredBinHistogram +from mdio.schemas.v1.stats import StatisticsMetadata +from mdio.schemas.v1.stats import SummaryStatistics from mdio.schemas.v1.units import LengthUnitEnum from mdio.schemas.v1.units import LengthUnitModel -from mdio.schemas.v1.variable import AllUnits, CoordinateMetadata +from mdio.schemas.v1.variable import AllUnits +from mdio.schemas.v1.variable import CoordinateMetadata from mdio.schemas.v1.variable import UserAttributes from mdio.schemas.v1.variable import VariableMetadata -def test__get_dimension() -> None: +def test__get_dimension_by_name() -> None: """Test getting a dimension by name from the list of dimensions.""" dimensions = [NamedDimension(name="inline", size=2), NamedDimension(name="crossline", size=3)] assert get_dimension([], "inline") is None - assert get_dimension(dimensions, "inline") == NamedDimension(name="inline", size=2) assert get_dimension(dimensions, "crossline") == NamedDimension(name="crossline", size=3) assert get_dimension(dimensions, "time") is None @@ -70,7 +74,6 @@ def test__contains_dimension() -> None: def test_get_dimension_names() -> None: """Test getting a list of dimension names from list[NamedDimension | str].""" - empty_list = get_dimension_names(None) assert empty_list is not None assert isinstance(empty_list, list) @@ -88,7 +91,7 @@ def test_get_dimension_names() -> None: ]) assert dim_list is not None assert isinstance(dim_list, list) - assert set(dim_list) == set(["inline", "amplitude", "crossline"]) + assert set(dim_list) == {"inline", "amplitude", "crossline"} def test_add_dimensions_if_needed() -> None: From 95c01d8c02b9bf62f237097d86e358ed6a368406 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Mon, 30 Jun 2025 16:09:13 -0500 Subject: [PATCH 20/56] Work on build --- src/mdio/schemas/v1/dataset_builder.py | 170 +++++++++++++++--- tests/unit/v1/test_dataset_builder_helpers.py | 8 + 2 files changed, 155 insertions(+), 23 deletions(-) diff --git a/src/mdio/schemas/v1/dataset_builder.py b/src/mdio/schemas/v1/dataset_builder.py index 2cc65812b..7db49947c 100644 --- a/src/mdio/schemas/v1/dataset_builder.py +++ b/src/mdio/schemas/v1/dataset_builder.py @@ -7,6 +7,8 @@ from typing import Any from typing import TypeAlias +import xarray as xr + from pydantic import BaseModel from zarr.core.chunk_key_encodings import V2ChunkKeyEncoding # noqa: F401 @@ -23,6 +25,8 @@ from mdio.schemas.v1.variable import CoordinateMetadata from mdio.schemas.v1.variable import Variable from mdio.schemas.v1.variable import VariableMetadata +from mdio.schemas.v1.dataset import Dataset, DatasetInfo +from mdio.schemas.v1.dataset import DatasetMetadata CoordinateMetadataList: TypeAlias = list[AllUnits | UserAttributes] @@ -30,8 +34,8 @@ UserAttributes | ChunkGridMetadata | StatisticsMetadata] - - +DatasetMetadataList: TypeAlias = list[DatasetInfo | + UserAttributes ] class _BuilderState(Enum): """States for the template builder.""" @@ -87,12 +91,14 @@ def get_dimension_names(dimensions: list[NamedDimension | str]) -> list[str]: return names -def _to_dictionary(val: BaseModel) -> dict[str, Any]: - """Convert a pydantic BaseModel to a dictionary.""" - if not isinstance(val, BaseModel): - msg = f"Expected BaseModel, got {type(val).__name__}" - raise TypeError(msg) - return val.model_dump(mode="json", by_alias=True) +def _to_dictionary(val: BaseModel | dict[str, Any]) -> dict[str, Any]: + """Convert a dictionary or pydantic BaseModel to a dictionary.""" + if isinstance(val, BaseModel): + return val.model_dump(mode="json", by_alias=True) + if isinstance(val, dict): + return val + msg = f"Expected BaseModel, got {type(val).__name__}" + raise TypeError(msg) def _make_coordinate_metadata(metadata: CoordinateMetadataList | None) -> CoordinateMetadata | None: @@ -104,11 +110,10 @@ def _make_coordinate_metadata(metadata: CoordinateMetadataList | None) -> Coordi # NOTE: the pydantic attribute names are different from the v1 schema attributes names # 'unitsV1' <-> 'units_v1' if isinstance(md, AllUnits): - val = md.units_v1 - metadata_dict["unitsV1"] = _to_dictionary(val) + metadata_dict["unitsV1"] = _to_dictionary(md.units_v1) elif isinstance(md, UserAttributes): # NOTE: md.attributes is not pydantic type, but a dictionary - metadata_dict["attributes"] = _to_dictionary(md)["attributes"] + metadata_dict["attributes"] = _to_dictionary(md.attributes) else: msg = f"Unsupported metadata type: {type(md)}" raise TypeError(msg) @@ -124,22 +129,38 @@ def _make_variable_metadata(metadata: VariableMetadataList | None) -> VariableMe # NOTE: the pydantic attribute names are different from the v1 schema attributes names # 'statsV1' <-> 'stats_v1', 'unitsV1' <-> 'units_v1', 'chunkGrid' <-> 'chunk_grid' if isinstance(md, AllUnits): - val = md.units_v1 - metadata_dict["unitsV1"] = _to_dictionary(val) + metadata_dict["unitsV1"] = _to_dictionary(md.units_v1) elif isinstance(md, UserAttributes): # NOTE: md.attributes is not pydantic type, but a dictionary - metadata_dict["attributes"] = _to_dictionary(md)["attributes"] + metadata_dict["attributes"] = _to_dictionary(md.attributes) elif isinstance(md, ChunkGridMetadata): - val = md.chunk_grid - metadata_dict["chunkGrid"] = _to_dictionary(val) + metadata_dict["chunkGrid"] = _to_dictionary(md.chunk_grid) elif isinstance(md, StatisticsMetadata): - val = md.stats_v1 - metadata_dict["statsV1"] = _to_dictionary(val) + metadata_dict["statsV1"] = _to_dictionary(md.stats_v1) else: msg = f"Unsupported metadata type: {type(md)}" raise TypeError(msg) return VariableMetadata(**metadata_dict) +def _make_datasetinfo_metadata(metadata: DatasetInfo | None) -> DatasetMetadata | None: + if metadata is None or not metadata: + return None + + metadata_dict = {} + for md in metadata: + # NOTE: the pydantic attribute names are different from the v1 schema attributes names + # 'apiVersion' <-> 'api_version', 'created_on' <-> 'createdOn' + if isinstance(md, DatasetInfo): + metadata_dict["name"] = md.name + metadata_dict["apiVersion"] = _to_dictionary(md.api_version) + metadata_dict["createdOn"] = _to_dictionary(md.created_on) + elif isinstance(md, UserAttributes): + # NOTE: md.attributes is not pydantic type, but a dictionary + metadata_dict["attributes"] = _to_dictionary(md.attributes) + else: + msg = f"Unsupported metadata type: {type(md)}" + raise TypeError(msg) + return DatasetMetadata(**metadata_dict) class MDIODatasetBuilder: """Builder for creating MDIO datasets with enforced build order. @@ -152,12 +173,14 @@ class MDIODatasetBuilder: 4. Must call build() to create the dataset. """ - def __init__(self, name: str, attributes: dict[str, Any] | None = None): - self.name = name + def __init__(self, name: str, attributes: UserAttributes | None = None): + # TODO(BrianMichell, #0): Pull from package metadata - self.api_version = "1.0.0" - self.created_on = datetime.now(UTC) - self.attributes = attributes + self._info = DatasetInfo( + name=name, + api_version="1.0.0", + created_on= datetime.now(UTC)), + self._attributes = attributes self._dimensions: list[NamedDimension] = [] self._coordinates: list[Coordinate] = [] self._variables: list[Variable] = [] @@ -317,3 +340,104 @@ def add_variable( # noqa: PLR0913 ) self._state = _BuilderState.HAS_VARIABLES return self + + def build(self) -> Dataset: + """Build the final dataset.""" + if self._state == _BuilderState.INITIAL: + msg = "Must add at least one dimension before building" + raise ValueError(msg) + + return Dataset( + variables=self._variables, + metadata=DatasetMetadata(self._info, + self._attributes) + ) + + + # def to_mdio( + # self, + # store: str, + # mode: str = "w", + # compute: bool = False, + # **kwargs: Mapping[str, str | int | float | bool], + # ) -> Dataset: + # """Write the dataset to a Zarr store and return the constructed mdio.Dataset. + + # This function constructs an mdio.Dataset from the MDIO dataset and writes its metadata + # to a Zarr store. The actual data is not written, only the metadata structure is created. + # """ + # return write_mdio_metadata(self.build(), store, mode, compute, **kwargs) + +# def write_mdio_metadata( +# mdio_ds: Dataset, +# store: str, +# mode: str = "w", +# compute: bool = False, +# **kwargs: Mapping[str, str | int | float | bool], +# ) -> mdio.Dataset: +# """Write MDIO metadata to a Zarr store and return the constructed mdio.Dataset. + +# This function constructs an mdio.Dataset from the MDIO dataset and writes its metadata +# to a Zarr store. The actual data is not written, only the metadata structure is created. + +# Args: +# mdio_ds: The MDIO dataset to serialize +# store: Path to the Zarr or .mdio store +# mode: Write mode to pass to to_mdio(), e.g. 'w' or 'a' +# compute: Whether to compute (write) array chunks (True) or only metadata (False) +# **kwargs: Additional arguments to pass to to_mdio() + +# Returns: +# The constructed xarray Dataset with MDIO extensions +# """ +# ds = _construct_mdio_dataset(mdio_ds) + +# def _generate_encodings() -> dict: +# """Generate encodings for each variable in the MDIO dataset. + +# Returns: +# Dictionary mapping variable names to their encoding configurations. +# """ +# # TODO(Anybody, #10274): Re-enable chunk_key_encoding when supported by xarray +# # dimension_separator_encoding = V2ChunkKeyEncoding(separator="/").to_dict() + +# # Collect dimension sizes (same approach as _construct_mdio_dataset) +# dims: dict[str, int] = {} +# for var in mdio_ds.variables: +# for d in var.dimensions: +# if isinstance(d, NamedDimension): +# dims[d.name] = d.size + +# global_encodings = {} +# for var in mdio_ds.variables: +# fill_value = 0 +# if isinstance(var.data_type, StructuredType): +# continue +# chunks = None +# if var.metadata is not None and var.metadata.chunk_grid is not None: +# chunks = var.metadata.chunk_grid.configuration.chunk_shape +# else: +# # When no chunk_grid is provided, set chunks to shape to avoid chunking +# dim_names = [d.name if isinstance(d, NamedDimension) else d for d in var.dimensions] +# chunks = tuple(dims[name] for name in dim_names) +# global_encodings[var.name] = { +# "chunks": chunks, +# # TODO(Anybody, #10274): Re-enable chunk_key_encoding when supported by xarray +# # "chunk_key_encoding": dimension_separator_encoding, +# "_FillValue": fill_value, +# "dtype": var.data_type, +# "compressors": _convert_compressor(var.compressor), +# } +# return global_encodings + +# ds.to_mdio( +# store, +# mode=mode, +# zarr_format=2, +# consolidated=True, +# safe_chunks=False, +# compute=compute, +# encoding=_generate_encodings(), +# **kwargs, +# ) +# return ds \ No newline at end of file diff --git a/tests/unit/v1/test_dataset_builder_helpers.py b/tests/unit/v1/test_dataset_builder_helpers.py index d3df78af3..fdaef83d5 100644 --- a/tests/unit/v1/test_dataset_builder_helpers.py +++ b/tests/unit/v1/test_dataset_builder_helpers.py @@ -214,6 +214,14 @@ class SomeModel(StrictModel): assert isinstance(result, dict) assert result == {"count": 3, "created": "2023-10-01T12:00:00Z", "samples": [1.0, 2.0, 3.0]} + d = { + "count": 3, + "samples": [1.0, 2.0, 3.0], + "created": datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC)} + result = _to_dictionary(m) + assert isinstance(result, dict) + assert result == {"count": 3, "created": "2023-10-01T12:00:00Z", "samples": [1.0, 2.0, 3.0]} + def test__make_coordinate_metadata() -> None: """Test creating VariableMetadata from a strongly-typed list of AllUnits or UserAttributes.""" From 46f82f01b9f0491d763cded3da1dca289406286a Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Tue, 1 Jul 2025 16:23:56 +0000 Subject: [PATCH 21/56] Generalize _to_dictionary() --- .devcontainer/devcontainer.json | 3 +- src/mdio/schemas/v1/dataset_builder.py | 105 +++++------------ tests/unit/v1/test_dataset_builder_build.py | 53 +++++++++ tests/unit/v1/test_dataset_builder_helpers.py | 106 +++++++++--------- 4 files changed, 135 insertions(+), 132 deletions(-) create mode 100644 tests/unit/v1/test_dataset_builder_build.py diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index ea5dc99ef..dc80446c6 100755 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -29,7 +29,8 @@ "vscode-icons-team.vscode-icons", "wayou.vscode-todo-highlight", "streetsidesoftware.code-spell-checker", - "eamodio.gitlens" + "eamodio.gitlens", + "visualstudioexptteam.vscodeintellicode" ] } }, diff --git a/src/mdio/schemas/v1/dataset_builder.py b/src/mdio/schemas/v1/dataset_builder.py index 7db49947c..8b885b288 100644 --- a/src/mdio/schemas/v1/dataset_builder.py +++ b/src/mdio/schemas/v1/dataset_builder.py @@ -28,14 +28,17 @@ from mdio.schemas.v1.dataset import Dataset, DatasetInfo from mdio.schemas.v1.dataset import DatasetMetadata -CoordinateMetadataList: TypeAlias = list[AllUnits | - UserAttributes] +AnyMetadataList : TypeAlias = list[AllUnits | + UserAttributes | + ChunkGridMetadata | + StatisticsMetadata | + DatasetInfo] +CoordinateMetadataList: TypeAlias = list[AllUnits | UserAttributes] VariableMetadataList: TypeAlias = list[AllUnits | UserAttributes | ChunkGridMetadata | StatisticsMetadata] -DatasetMetadataList: TypeAlias = list[DatasetInfo | - UserAttributes ] +DatasetMetadataList: TypeAlias = list[DatasetInfo | UserAttributes] class _BuilderState(Enum): """States for the template builder.""" @@ -91,77 +94,24 @@ def get_dimension_names(dimensions: list[NamedDimension | str]) -> list[str]: return names -def _to_dictionary(val: BaseModel | dict[str, Any]) -> dict[str, Any]: - """Convert a dictionary or pydantic BaseModel to a dictionary.""" +def _to_dictionary(val: BaseModel | dict[str, Any] | AnyMetadataList)-> dict[str, Any]: + """Convert a dictionary, list or pydantic BaseModel to a dictionary.""" + if val is None: + return None if isinstance(val, BaseModel): return val.model_dump(mode="json", by_alias=True) if isinstance(val, dict): return val - msg = f"Expected BaseModel, got {type(val).__name__}" + if isinstance(val, list): + metadata_dict = {} + for md in val: + if md is None: + continue + metadata_dict.update(_to_dictionary(md)) + return metadata_dict + msg = f"Expected BaseModel, dict or list, got {type(val).__name__}" raise TypeError(msg) - -def _make_coordinate_metadata(metadata: CoordinateMetadataList | None) -> CoordinateMetadata | None: - if metadata is None or not metadata: - return None - - metadata_dict = {} - for md in metadata: - # NOTE: the pydantic attribute names are different from the v1 schema attributes names - # 'unitsV1' <-> 'units_v1' - if isinstance(md, AllUnits): - metadata_dict["unitsV1"] = _to_dictionary(md.units_v1) - elif isinstance(md, UserAttributes): - # NOTE: md.attributes is not pydantic type, but a dictionary - metadata_dict["attributes"] = _to_dictionary(md.attributes) - else: - msg = f"Unsupported metadata type: {type(md)}" - raise TypeError(msg) - return CoordinateMetadata(**metadata_dict) - - -def _make_variable_metadata(metadata: VariableMetadataList | None) -> VariableMetadata | None: - if metadata is None or not metadata: - return None - - metadata_dict = {} - for md in metadata: - # NOTE: the pydantic attribute names are different from the v1 schema attributes names - # 'statsV1' <-> 'stats_v1', 'unitsV1' <-> 'units_v1', 'chunkGrid' <-> 'chunk_grid' - if isinstance(md, AllUnits): - metadata_dict["unitsV1"] = _to_dictionary(md.units_v1) - elif isinstance(md, UserAttributes): - # NOTE: md.attributes is not pydantic type, but a dictionary - metadata_dict["attributes"] = _to_dictionary(md.attributes) - elif isinstance(md, ChunkGridMetadata): - metadata_dict["chunkGrid"] = _to_dictionary(md.chunk_grid) - elif isinstance(md, StatisticsMetadata): - metadata_dict["statsV1"] = _to_dictionary(md.stats_v1) - else: - msg = f"Unsupported metadata type: {type(md)}" - raise TypeError(msg) - return VariableMetadata(**metadata_dict) - -def _make_datasetinfo_metadata(metadata: DatasetInfo | None) -> DatasetMetadata | None: - if metadata is None or not metadata: - return None - - metadata_dict = {} - for md in metadata: - # NOTE: the pydantic attribute names are different from the v1 schema attributes names - # 'apiVersion' <-> 'api_version', 'created_on' <-> 'createdOn' - if isinstance(md, DatasetInfo): - metadata_dict["name"] = md.name - metadata_dict["apiVersion"] = _to_dictionary(md.api_version) - metadata_dict["createdOn"] = _to_dictionary(md.created_on) - elif isinstance(md, UserAttributes): - # NOTE: md.attributes is not pydantic type, but a dictionary - metadata_dict["attributes"] = _to_dictionary(md.attributes) - else: - msg = f"Unsupported metadata type: {type(md)}" - raise TypeError(msg) - return DatasetMetadata(**metadata_dict) - class MDIODatasetBuilder: """Builder for creating MDIO datasets with enforced build order. @@ -175,11 +125,13 @@ class MDIODatasetBuilder: def __init__(self, name: str, attributes: UserAttributes | None = None): - # TODO(BrianMichell, #0): Pull from package metadata - self._info = DatasetInfo( + info = DatasetInfo( name=name, api_version="1.0.0", - created_on= datetime.now(UTC)), + created_on=datetime.now(UTC) + ) + # TODO(BrianMichell, #0): Pull from package metadata + self._info = info self._attributes = attributes self._dimensions: list[NamedDimension] = [] self._coordinates: list[Coordinate] = [] @@ -253,7 +205,7 @@ def add_dimension( # noqa: PLR0913 dataType=var_data_type, compressor=None, coordinates=None, - metadata=_make_variable_metadata(var_metadata_info), + metadata=_to_dictionary(var_metadata_info), ) self._variables.append(dim_var) @@ -293,7 +245,7 @@ def add_coordinate( # noqa: PLR0913 # We ass names: sts, not list[NamedDimension | str] dimensions=dim_names, dataType=data_type, - metadata=_make_coordinate_metadata(metadata_info), + metadata=_to_dictionary(metadata_info), ) ) self._state = _BuilderState.HAS_COORDINATES @@ -335,7 +287,7 @@ def add_variable( # noqa: PLR0913 data_type=data_type, compressor=compressor, coordinates=coordinates, - metadata=_make_variable_metadata(metadata_info), + metadata=_to_dictionary(metadata_info), ) ) self._state = _BuilderState.HAS_VARIABLES @@ -349,8 +301,7 @@ def build(self) -> Dataset: return Dataset( variables=self._variables, - metadata=DatasetMetadata(self._info, - self._attributes) + metadata=_to_dictionary([self._info, self._attributes]) ) diff --git a/tests/unit/v1/test_dataset_builder_build.py b/tests/unit/v1/test_dataset_builder_build.py new file mode 100644 index 000000000..ab2d64af2 --- /dev/null +++ b/tests/unit/v1/test_dataset_builder_build.py @@ -0,0 +1,53 @@ +# ruff: noqa: PLR2004 +# PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable +# The above erroneous warning is generated for every numerical assert. +# Thus, disable it for this file +"""Tests the schema v1 dataset_builder.add_coordinate() public API.""" + +from datetime import UTC, datetime +import pytest + +from mdio.schemas.dtype import ScalarType +from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.dataset import DatasetInfo, DatasetMetadata +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder +from mdio.schemas.v1.dataset_builder import _BuilderState +from mdio.schemas.v1.units import AllUnits +from mdio.schemas.v1.units import LengthUnitEnum +from mdio.schemas.v1.units import LengthUnitModel +from mdio.schemas.v1.variable import VariableMetadata + +def test_build() -> None: + """Test adding coordinates. Check the state transition and validate required parameters.""" + builder = MDIODatasetBuilder("test_dataset") + assert builder._state == _BuilderState.INITIAL + + builder.add_dimension("x", 100) + builder.add_dimension("y", 100) + + builder.build() + +def test_play() -> None: + """Test adding coordinates. Check the state transition and validate required parameters.""" + # builder = MDIODatasetBuilder("test_dataset") + + u = AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)) + + u_dict = u.model_dump(mode="json", by_alias=True) + vm = VariableMetadata(**u_dict) + vm_dict = vm.dict() + vm_json = vm.model_dump(mode="json", by_alias=True) + +# vm = VariableMetadata(u) + +# dInfo = DatasetInfo( +# name="My Dataset", +# api_version="1.0.0", +# created_on= datetime.now(UTC)), + +# d = dict(dInfo.model_dump(mode="json", by_alias=True)) + +# meta = DatasetMetadata(d) +# print(dInfo.dict()) + +# i = 0 \ No newline at end of file diff --git a/tests/unit/v1/test_dataset_builder_helpers.py b/tests/unit/v1/test_dataset_builder_helpers.py index fdaef83d5..e5078a5ef 100644 --- a/tests/unit/v1/test_dataset_builder_helpers.py +++ b/tests/unit/v1/test_dataset_builder_helpers.py @@ -16,8 +16,6 @@ from mdio.schemas.dimension import NamedDimension from mdio.schemas.metadata import ChunkGridMetadata from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder -from mdio.schemas.v1.dataset_builder import _make_coordinate_metadata -from mdio.schemas.v1.dataset_builder import _make_variable_metadata from mdio.schemas.v1.dataset_builder import _to_dictionary from mdio.schemas.v1.dataset_builder import contains_dimension from mdio.schemas.v1.dataset_builder import get_dimension @@ -196,7 +194,7 @@ def test__add_dimensions_if_needed_when_one_already_exists() -> None: def test__to_dictionary() -> None: """Test converting a BaseModel to a dictionary.""" - with pytest.raises(TypeError, match="Expected BaseModel, got datetime"): + with pytest.raises(TypeError, match="Expected BaseModel, dict or list, got datetime"): # This should raise an error because datetime is not a BaseModel _to_dictionary(datetime.now(UTC)) @@ -223,54 +221,54 @@ class SomeModel(StrictModel): assert result == {"count": 3, "created": "2023-10-01T12:00:00Z", "samples": [1.0, 2.0, 3.0]} -def test__make_coordinate_metadata() -> None: - """Test creating VariableMetadata from a strongly-typed list of AllUnits or UserAttributes.""" - units = AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)) - attrs = UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}) - meta_list = [units, attrs] - - # Assume that multiple attributes are allowed - metadata = _make_coordinate_metadata(meta_list) - assert isinstance(metadata, CoordinateMetadata) - assert metadata.units_v1.length == "ft" - assert metadata.attributes["MGA"] == 51 - assert metadata.attributes["UnitSystem"] == "Imperial" - - meta_list = ["ft"] - with pytest.raises(TypeError, match="Unsupported metadata type: "): - _make_variable_metadata(meta_list) - -def test__make_variable_metadata() -> None: - """Test creating VariableMetadata from a strongly-typed list of AllUnits or UserAttributes.""" - units = AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)) - attrs = UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}) - chgrd = ChunkGridMetadata( - chunk_grid=RegularChunkGrid( - configuration=RegularChunkShape(chunk_shape=[20]))) - stats = StatisticsMetadata( - stats_v1=SummaryStatistics( - count=100, - sum=1215.1, - sumSquares=125.12, - min=5.61, - max=10.84, - histogram=CenteredBinHistogram(binCenters=[1, 2], counts=[10, 15]))) - metadata_info = [units, attrs, chgrd, stats] - metadata = _make_variable_metadata(metadata_info) - assert isinstance(metadata, VariableMetadata) - assert metadata.units_v1.length == "ft" - assert metadata.attributes["MGA"] == 51 - assert metadata.attributes["UnitSystem"] == "Imperial" - assert metadata.chunk_grid.name == "regular" - assert metadata.chunk_grid.configuration.chunk_shape == [20] - assert metadata.stats_v1.count == 100 - assert metadata.stats_v1.sum == 1215.1 - assert metadata.stats_v1.sum_squares == 125.12 - assert metadata.stats_v1.min == 5.61 - assert metadata.stats_v1.max == 10.84 - assert metadata.stats_v1.histogram.bin_centers == [1, 2] - assert metadata.stats_v1.histogram.counts == [10, 15] - - meta_list = ["ft"] - with pytest.raises(TypeError, match="Unsupported metadata type: "): - _make_variable_metadata(meta_list) +# def test__make_coordinate_metadata() -> None: +# """Test creating VariableMetadata from a strongly-typed list of AllUnits or UserAttributes.""" +# units = AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)) +# attrs = UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}) +# meta_list = [units, attrs] + +# # Assume that multiple attributes are allowed +# metadata = _make_coordinate_metadata(meta_list) +# assert isinstance(metadata, CoordinateMetadata) +# assert metadata.units_v1.length == "ft" +# assert metadata.attributes["MGA"] == 51 +# assert metadata.attributes["UnitSystem"] == "Imperial" + +# meta_list = ["ft"] +# with pytest.raises(TypeError, match="Expected BaseModel, dict or list, got str"): +# _make_variable_metadata(meta_list) + +# def test__make_variable_metadata() -> None: +# """Test creating VariableMetadata from a strongly-typed list of AllUnits or UserAttributes.""" +# units = AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)) +# attrs = UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}) +# chgrd = ChunkGridMetadata( +# chunk_grid=RegularChunkGrid( +# configuration=RegularChunkShape(chunk_shape=[20]))) +# stats = StatisticsMetadata( +# stats_v1=SummaryStatistics( +# count=100, +# sum=1215.1, +# sumSquares=125.12, +# min=5.61, +# max=10.84, +# histogram=CenteredBinHistogram(binCenters=[1, 2], counts=[10, 15]))) +# metadata_info = [units, attrs, chgrd, stats] +# metadata = _make_variable_metadata(metadata_info) +# assert isinstance(metadata, VariableMetadata) +# assert metadata.units_v1.length == "ft" +# assert metadata.attributes["MGA"] == 51 +# assert metadata.attributes["UnitSystem"] == "Imperial" +# assert metadata.chunk_grid.name == "regular" +# assert metadata.chunk_grid.configuration.chunk_shape == [20] +# assert metadata.stats_v1.count == 100 +# assert metadata.stats_v1.sum == 1215.1 +# assert metadata.stats_v1.sum_squares == 125.12 +# assert metadata.stats_v1.min == 5.61 +# assert metadata.stats_v1.max == 10.84 +# assert metadata.stats_v1.histogram.bin_centers == [1, 2] +# assert metadata.stats_v1.histogram.counts == [10, 15] + +# meta_list = ["ft"] +# with pytest.raises(TypeError, match="Expected BaseModel, dict or list, got str"): +# _make_variable_metadata(meta_list) From 0dc7cc86856dbdc234760cc36b898a2cb6e9a9e2 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Tue, 1 Jul 2025 23:37:52 +0000 Subject: [PATCH 22/56] build --- src/mdio/schemas/v1/dataset_builder.py | 78 ++++-- .../v1/test_dataset_builder_add_coordinate.py | 24 +- .../v1/test_dataset_builder_add_dimension.py | 5 + .../v1/test_dataset_builder_add_variable.py | 4 +- tests/unit/v1/test_dataset_builder_build.py | 258 ++++++++++++++++-- tests/unit/v1/test_dataset_builder_helpers.py | 2 +- 6 files changed, 309 insertions(+), 62 deletions(-) diff --git a/src/mdio/schemas/v1/dataset_builder.py b/src/mdio/schemas/v1/dataset_builder.py index 8b885b288..8b1698789 100644 --- a/src/mdio/schemas/v1/dataset_builder.py +++ b/src/mdio/schemas/v1/dataset_builder.py @@ -28,17 +28,19 @@ from mdio.schemas.v1.dataset import Dataset, DatasetInfo from mdio.schemas.v1.dataset import DatasetMetadata -AnyMetadataList : TypeAlias = list[AllUnits | - UserAttributes | - ChunkGridMetadata | - StatisticsMetadata | - DatasetInfo] +AnyMetadataList: TypeAlias = list[AllUnits | + UserAttributes | + ChunkGridMetadata | + StatisticsMetadata | + DatasetInfo] CoordinateMetadataList: TypeAlias = list[AllUnits | UserAttributes] VariableMetadataList: TypeAlias = list[AllUnits | UserAttributes | ChunkGridMetadata | StatisticsMetadata] DatasetMetadataList: TypeAlias = list[DatasetInfo | UserAttributes] + + class _BuilderState(Enum): """States for the template builder.""" @@ -94,7 +96,7 @@ def get_dimension_names(dimensions: list[NamedDimension | str]) -> list[str]: return names -def _to_dictionary(val: BaseModel | dict[str, Any] | AnyMetadataList)-> dict[str, Any]: +def _to_dictionary(val: BaseModel | dict[str, Any] | AnyMetadataList) -> dict[str, Any]: """Convert a dictionary, list or pydantic BaseModel to a dictionary.""" if val is None: return None @@ -112,6 +114,7 @@ def _to_dictionary(val: BaseModel | dict[str, Any] | AnyMetadataList)-> dict[str msg = f"Expected BaseModel, dict or list, got {type(val).__name__}" raise TypeError(msg) + class MDIODatasetBuilder: """Builder for creating MDIO datasets with enforced build order. @@ -194,18 +197,21 @@ def add_dimension( # noqa: PLR0913 msg = "Adding dimension with the same name twice is not allowed" raise ValueError(msg) - added_dims = self._add_dimensions_if_needed( - [NamedDimension(name=name, size=size)]) + added_dims = self._add_dimensions_if_needed([NamedDimension(name=name, size=size)]) if added_dims: + meta_dict = _to_dictionary(var_metadata_info) # Create a variable for the dimension dim_var = Variable( name=name, longName=var_long_name, + # IMPORTANT: we always use NamedDimension here, not the dimension name + # Since the Dataset does not have a dimension list, we need to preserve NamedDimension + # somewhere. Namely, in the variable created for the dimension dimensions=added_dims, dataType=var_data_type, compressor=None, coordinates=None, - metadata=_to_dictionary(var_metadata_info), + metadata=meta_dict, ) self._variables.append(dim_var) @@ -217,6 +223,7 @@ def add_coordinate( # noqa: PLR0913 name: str, *, long_name: str = None, + #TODO Only allow adding dimensions by name, not by NamedDimension object dimensions: list[NamedDimension | str], data_type: ScalarType | StructuredType = ScalarType.FLOAT32, metadata_info: CoordinateMetadataList | None = None, @@ -238,16 +245,33 @@ def add_coordinate( # noqa: PLR0913 self._add_dimensions_if_needed(dimensions) dim_names = get_dimension_names(dimensions) - self._coordinates.append( - Coordinate( - name=name, - longName=long_name, - # We ass names: sts, not list[NamedDimension | str] - dimensions=dim_names, - dataType=data_type, - metadata=_to_dictionary(metadata_info), - ) + meta_dict = _to_dictionary(metadata_info) + coord = Coordinate( + name=name, + longName=long_name, + # We ass names: sts, not list[NamedDimension | str] + dimensions=dim_names, + dataType=data_type, + metadata=meta_dict + ) + self._coordinates.append(coord) + + # Add coordinate as variables to the dataset + var_meta_dict = _to_dictionary(coord.metadata) + coord_var = Variable( + name=coord.name, + longName=coord.long_name, + dimensions=coord.dimensions, + dataType=coord.data_type, + compressor=None, + # IMPORTANT: we always use Coordinate here, not the coordinate name + # Since the Dataset does not have a coordinate list, we need to preserve Coordinate + # somewhere. Namely, in the variable created for the coordinate + coordinates=[coord], + metadata=var_meta_dict ) + self._variables.append(coord_var) + self._state = _BuilderState.HAS_COORDINATES return self @@ -256,9 +280,11 @@ def add_variable( # noqa: PLR0913 name: str, *, long_name: str = None, + #TODO Only allow adding dimensions by name, not by NamedDimension object dimensions: list[NamedDimension | str], data_type: ScalarType | StructuredType = ScalarType.FLOAT32, compressor: Blosc | ZFP | None = None, + #TODO Only allow adding coordinates by name, not by Coordinate object coordinates: list[Coordinate | str] | None = None, metadata_info: VariableMetadataList | None = None, ) -> "MDIODatasetBuilder": @@ -279,6 +305,7 @@ def add_variable( # noqa: PLR0913 self._add_dimensions_if_needed(dimensions) dim_names = get_dimension_names(dimensions) + meta_dict = _to_dictionary(metadata_info) self._variables.append( Variable( name=name, @@ -287,7 +314,7 @@ def add_variable( # noqa: PLR0913 data_type=data_type, compressor=compressor, coordinates=coordinates, - metadata=_to_dictionary(metadata_info), + metadata=meta_dict, ) ) self._state = _BuilderState.HAS_VARIABLES @@ -299,11 +326,10 @@ def build(self) -> Dataset: msg = "Must add at least one dimension before building" raise ValueError(msg) - return Dataset( - variables=self._variables, - metadata=_to_dictionary([self._info, self._attributes]) - ) + var_meta_dict = _to_dictionary([self._info, self._attributes]) + dataset = Dataset(variables=self._variables, metadata=var_meta_dict) + return dataset # def to_mdio( # self, @@ -351,14 +377,14 @@ def build(self) -> Dataset: # """ # # TODO(Anybody, #10274): Re-enable chunk_key_encoding when supported by xarray # # dimension_separator_encoding = V2ChunkKeyEncoding(separator="/").to_dict() - + # # Collect dimension sizes (same approach as _construct_mdio_dataset) # dims: dict[str, int] = {} # for var in mdio_ds.variables: # for d in var.dimensions: # if isinstance(d, NamedDimension): # dims[d.name] = d.size - + # global_encodings = {} # for var in mdio_ds.variables: # fill_value = 0 @@ -391,4 +417,4 @@ def build(self) -> Dataset: # encoding=_generate_encodings(), # **kwargs, # ) -# return ds \ No newline at end of file +# return ds diff --git a/tests/unit/v1/test_dataset_builder_add_coordinate.py b/tests/unit/v1/test_dataset_builder_add_coordinate.py index 659fedacf..e6fa4bcf1 100644 --- a/tests/unit/v1/test_dataset_builder_add_coordinate.py +++ b/tests/unit/v1/test_dataset_builder_add_coordinate.py @@ -40,8 +40,16 @@ def test_add_coordinate() -> None: builder.add_coordinate("cdp", dimensions=["inline", "crossline"]) assert builder._state == _BuilderState.HAS_COORDINATES assert len(builder._dimensions) == 2 - assert len(builder._variables) == 2 - assert len(builder._coordinates) == 1 + # 2 variables for dimensions, 1 variable for coordinates + assert len(builder._variables) == 3 + assert len(builder._coordinates) == 1 + + # Validate that we created a coordinate variable + var_cdp = next(e for e in builder._variables if e.name == "cdp") + assert var_cdp is not None + assert len(var_cdp.dimensions) == 2 + assert len(var_cdp.coordinates) == 1 + assert next(e for e in var_cdp.coordinates if e.name == "cdp") is not None # Adding coordinate with the same name twice msg="Adding coordinate with the same name twice is not allowed" @@ -56,7 +64,8 @@ def test_add_coordinate_with_defaults() -> None: # Add coordinate using defaults builder.add_coordinate("cdp", dimensions=["inline", "crossline"]) assert len(builder._dimensions) == 2 - assert len(builder._variables) == 2 + # 2 variables for dimensions, 1 variable for coordinates + assert len(builder._variables) == 3 assert len(builder._coordinates) == 1 crd0 = next((e for e in builder._coordinates if e.name == "cdp"), None) assert crd0 is not None @@ -78,7 +87,8 @@ def test_coordinate_with_units() -> None: metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT))] ) assert len(builder._dimensions) == 2 - assert len(builder._variables) == 2 + # 2 variables for dimensions, 1 variable for coordinates + assert len(builder._variables) == 3 assert len(builder._coordinates) == 1 crd0 = next((e for e in builder._coordinates if e.name == "cdp"), None) assert crd0 is not None @@ -102,7 +112,8 @@ def test_coordinate_with_attributes() -> None: metadata_info=[UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"})], ) assert len(builder._dimensions) == 2 - assert len(builder._variables) == 2 + # 2 variables for dimensions, 1 variable for coordinates + assert len(builder._variables) == 3 assert len(builder._coordinates) == 1 # NOTE: add_coordinate() stores dimensions as names crd0 = next((e for e in builder._coordinates if e.name == "cdp"), None) @@ -129,7 +140,8 @@ def test_coordinate_with_full_metadata() -> None: UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"})] ) assert len(builder._dimensions) == 2 - assert len(builder._variables) == 2 + # 2 variables for dimensions, 1 variable for coordinates + assert len(builder._variables) == 3 assert len(builder._coordinates) == 1 # NOTE: add_coordinate() stores dimensions as names crd0 = next((e for e in builder._coordinates if e.name == "cdp"), None) diff --git a/tests/unit/v1/test_dataset_builder_add_dimension.py b/tests/unit/v1/test_dataset_builder_add_dimension.py index 6ff1f2590..a6a12e85f 100644 --- a/tests/unit/v1/test_dataset_builder_add_dimension.py +++ b/tests/unit/v1/test_dataset_builder_add_dimension.py @@ -40,6 +40,11 @@ def test_add_dimension() -> None: assert builder._dimensions[0] == NamedDimension(name="x", size=100) assert len(builder._variables) == 1 + # Validate that we created a dimension variable properly + var_x = next(e for e in builder._variables if e.name == "x") + assert var_x is not None + assert len(var_x.dimensions) == 1 + # Adding dimension with the same name twice msg="Adding dimension with the same name twice is not allowed" with pytest.raises(ValueError, match=msg): diff --git a/tests/unit/v1/test_dataset_builder_add_variable.py b/tests/unit/v1/test_dataset_builder_add_variable.py index 7c0b46ba5..1181e10d7 100644 --- a/tests/unit/v1/test_dataset_builder_add_variable.py +++ b/tests/unit/v1/test_dataset_builder_add_variable.py @@ -112,7 +112,9 @@ def test_add_variable_full_parameters() -> None: ]) assert len(builder._dimensions) == 3 assert len(builder._coordinates) == 2 - assert len(builder._variables) == 4 + # We expect 6 variables: + # 3 variables for dimensions, 2 variables for coordinates, and 1 variable for seismic_amplitude + assert len(builder._variables) == 6 v = next((v for v in builder._variables if v.name == "seismic_amplitude"), None) assert v is not None assert v.long_name == "Amplitude (dimensionless)" diff --git a/tests/unit/v1/test_dataset_builder_build.py b/tests/unit/v1/test_dataset_builder_build.py index ab2d64af2..64dfead0c 100644 --- a/tests/unit/v1/test_dataset_builder_build.py +++ b/tests/unit/v1/test_dataset_builder_build.py @@ -5,18 +5,26 @@ """Tests the schema v1 dataset_builder.add_coordinate() public API.""" from datetime import UTC, datetime +import json +import os +from pathlib import Path import pytest -from mdio.schemas.dtype import ScalarType -from mdio.schemas.metadata import UserAttributes -from mdio.schemas.v1.dataset import DatasetInfo, DatasetMetadata +from mdio.schemas import builder +from mdio.schemas.chunk_grid import RegularChunkGrid, RegularChunkShape +from mdio.schemas.compressors import Blosc +from mdio.schemas.dtype import ScalarType, StructuredType +from mdio.schemas.metadata import ChunkGridMetadata, UserAttributes +from mdio.schemas.v1.dataset import Dataset, DatasetInfo, DatasetMetadata from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder from mdio.schemas.v1.dataset_builder import _BuilderState -from mdio.schemas.v1.units import AllUnits +from mdio.schemas.v1.stats import CenteredBinHistogram, StatisticsMetadata, SummaryStatistics +from mdio.schemas.v1.units import AllUnits, SpeedUnitEnum, SpeedUnitModel from mdio.schemas.v1.units import LengthUnitEnum from mdio.schemas.v1.units import LengthUnitModel from mdio.schemas.v1.variable import VariableMetadata + def test_build() -> None: """Test adding coordinates. Check the state transition and validate required parameters.""" builder = MDIODatasetBuilder("test_dataset") @@ -27,27 +35,221 @@ def test_build() -> None: builder.build() -def test_play() -> None: - """Test adding coordinates. Check the state transition and validate required parameters.""" - # builder = MDIODatasetBuilder("test_dataset") - - u = AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)) - - u_dict = u.model_dump(mode="json", by_alias=True) - vm = VariableMetadata(**u_dict) - vm_dict = vm.dict() - vm_json = vm.model_dump(mode="json", by_alias=True) - -# vm = VariableMetadata(u) - -# dInfo = DatasetInfo( -# name="My Dataset", -# api_version="1.0.0", -# created_on= datetime.now(UTC)), - -# d = dict(dInfo.model_dump(mode="json", by_alias=True)) - -# meta = DatasetMetadata(d) -# print(dInfo.dict()) - -# i = 0 \ No newline at end of file + +def test_build_dataset() -> None: + """Test building a complete dataset.""" + dataset = ( + MDIODatasetBuilder("test_dataset") + .add_dimension("x", 100) + .add_dimension("y", 200) + .add_coordinate("x_coord", dimensions=["x"]) + .add_coordinate("y_coord", dimensions=["y"]) + .add_variable("data", dimensions=["x", "y"], long_name="Test Data") + .build() + ) + assert isinstance(dataset, Dataset) + assert dataset.metadata.name == "test_dataset" + # 2 dimension variables + 1 data variable + 2 coordinate variables + assert len(dataset.variables) == 5 + assert next(v for v in dataset.variables if v.name == "x") is not None + assert next(v for v in dataset.variables if v.name == "y") is not None + var_data = next(v for v in dataset.variables if v.name == "data") + assert var_data is not None + assert var_data.long_name == "Test Data" + assert len(var_data.dimensions) == 2 + +# def test_build_dataset_bad_example() -> None: +# builder = MDIODatasetBuilder("Bad example") +# builder.add_dimension("inline", 256) +# builder.add_dimension("crossline", 512) +# builder.add_dimension("depth", 384) +# builder.add_variable(name="image", dimensions=["inline", "crossline", "depth"]) +# dataset = builder.build() + +# json_str = dataset.model_dump_json() +# file_path = os.path.join(os.path.dirname(__file__), "bad_example.json") +# with open(file_path, 'w') as f: +# f.write(json_str) + +def test_build_campos_3d(tmp_path: Path) -> None: + """Test building a toy dataset with multiple variables and attributes.""" + dataset = make_campos_3d_dataset() + + # Verify dataset structure + assert dataset.metadata.name == "campos_3d" + assert dataset.metadata.api_version == "1.0.0" + assert dataset.metadata.attributes["foo"] == "bar" + assert len(dataset.metadata.attributes["textHeader"]) == 3 + + # Verify variables (including dimension variables) + # 3 dimension variables + 4 data variables + 2 coordinate variables + assert len(dataset.variables) == 9 # noqa: PLR2004 + + # Verify dimension variables + inline_var = next(v for v in dataset.variables if v.name == "inline") + assert inline_var.data_type == ScalarType.UINT32 + assert len(inline_var.dimensions) == 1 + assert inline_var.dimensions[0].name == "inline" + + depth_var = next(v for v in dataset.variables if v.name == "depth") + assert depth_var.data_type == ScalarType.UINT32 + assert depth_var.metadata.units_v1.length == "m" + + # Verify image variable + image = next(v for v in dataset.variables if v.name == "image") + assert image.data_type == ScalarType.FLOAT32 + assert isinstance(image.compressor, Blosc) + assert image.compressor.algorithm == "zstd" + assert image.metadata.stats_v1.count == 100 + + # Verify velocity variable + velocity = next(v for v in dataset.variables if v.name == "velocity") + assert velocity.data_type == ScalarType.FLOAT16 + assert velocity.compressor is None + assert velocity.metadata.units_v1.speed == "m/s" + + # Verify image_inline variable + image_inline = next( + v for v in dataset.variables if v.name == "image_inline") + assert image_inline.long_name == "inline optimized version of 3d_stack" + assert isinstance(image_inline.compressor, Blosc) + assert image_inline.compressor.algorithm == "zstd" + + # Verify image_headers variable + headers = next(v for v in dataset.variables if v.name == "image_headers") + assert isinstance(headers.data_type, StructuredType) + assert len(headers.data_type.fields) == 4 + assert headers.data_type.fields[0].name == "cdp-x" + +# def test_build_campos_3d_contract(tmp_path: Path) -> None: +# '''Test building campos_3d dataset and converting to JSON schema format.''' +# dataset = make_campos_3d_dataset() +# # json_str = dataset.model_dump_json() +# # json_sorted_str = json.dumps(json.loads(json_str), sort_keys=True) +# m_dict = dataset.model_dump(mode="json", by_alias=True) +# json_sorted_str = json.dumps(m_dict, sort_keys=True) + +# sorted_contract = load_campos_3d_contract() + +# save(json_sorted_str, sorted_contract) + +# def save(model: str, contract: str) -> None: +# model_file_path = os.path.join(os.path.dirname(__file__), "campos_3d_model.json") +# contract_file_path = os.path.join(os.path.dirname(__file__), "campos_3d_contract.json") +# with open(model_file_path, 'w') as f: +# f.write(model) +# with open(contract_file_path, 'w') as f: +# f.write(contract) + +# def load_campos_3d_contract(): +# file_path = os.path.join(os.path.dirname(__file__), 'test_data/campos_3d_contract.json') +# with open(file_path, 'r') as f: +# contract = json.load(f) +# assert contract is not None +# return json.dumps(contract, sort_keys=True) + +def make_campos_3d_dataset() -> Dataset: + """Create in-memory campos_3d dataset.""" + + ds = MDIODatasetBuilder( + "campos_3d", + attributes=UserAttributes(attributes={ + "textHeader": [ + "C01 .......................... ", + "C02 .......................... ", + "C03 .......................... ", + ], + "foo": "bar" + })) + + # Add dimensions + ds.add_dimension("inline", 256, var_data_type=ScalarType.UINT32) + ds.add_dimension("crossline", 512, var_data_type=ScalarType.UINT32) + ds.add_dimension("depth", 384, var_data_type=ScalarType.UINT32, + var_metadata_info=[ + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))] + ) + # Add coordinates + ds.add_coordinate( + "cdp-x", + dimensions=["inline", "crossline"], + metadata_info=[ + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))] + ) + ds.add_coordinate( + "cdp-y", + dimensions=["inline", "crossline"], + metadata_info=[ + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))] + # metadata={"unitsV1": {"length": "m"}}, + ) + # Add image variable + ds.add_variable( + name="image", + dimensions=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT32, + compressor=Blosc(algorithm="zstd"), + coordinates=["inline", "crossline", "depth", "cdp-x", "cdp-y"], + metadata_info=[ + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape(chunk_shape=[128, 128, 128])) + ), + StatisticsMetadata( + stats_v1=SummaryStatistics( + count=100, + sum=1215.1, + sumSquares=125.12, + min=5.61, + max=10.84, + histogram=CenteredBinHistogram( + binCenters=[1, 2], counts=[10, 15]), + ) + ), + UserAttributes( + attributes={"fizz": "buzz", "UnitSystem": "Canonical"}), + ]) + # Add velocity variable + ds.add_variable( + name="velocity", + dimensions=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT16, + coordinates=["inline", "crossline", "depth", "cdp-x", "cdp-y"], + metadata_info=[ + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape(chunk_shape=[128, 128, 128])) + ), + AllUnits(units_v1=SpeedUnitModel( + speed=SpeedUnitEnum.METER_PER_SECOND)), + ], + ) + # Add inline-optimized image variable + ds.add_variable( + name="image_inline", + long_name="inline optimized version of 3d_stack", + dimensions=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT32, + compressor=Blosc(algorithm="zstd"), + coordinates=["inline", "crossline", "depth", "cdp-x", "cdp-y"], + metadata_info=[ + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape(chunk_shape=[4, 512, 512])) + )] + ) + # Add headers variable with structured dtype + ds.add_variable( + name="image_headers", + dimensions=["inline", "crossline"], + data_type=StructuredType( + fields=[ + {"name": "cdp-x", "format": ScalarType.INT32}, + {"name": "cdp-y", "format": ScalarType.INT32}, + {"name": "elevation", "format": ScalarType.FLOAT16}, + {"name": "some_scalar", "format": ScalarType.FLOAT16}, + ] + ), + coordinates=["inline", "crossline", "cdp-x", "cdp-y"], + ) + return ds.build() diff --git a/tests/unit/v1/test_dataset_builder_helpers.py b/tests/unit/v1/test_dataset_builder_helpers.py index e5078a5ef..e6bfda71f 100644 --- a/tests/unit/v1/test_dataset_builder_helpers.py +++ b/tests/unit/v1/test_dataset_builder_helpers.py @@ -141,7 +141,7 @@ def test_add_dimensions_if_needed() -> None: # Assert that the number of dimensions has not increased assert len(builder._dimensions) == 3 -def test__add_dimensions_if_needed_when_one_already_exists() -> None: +def test__add_dimensions_if_one_already_exists() -> None: """Test adding existing named dimensions to a dataset.""" builder = MDIODatasetBuilder("Test Dataset Builder") From fe4af2bdab5219e2949d1cc28bec62091a226e24 Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Wed, 2 Jul 2025 10:16:01 -0500 Subject: [PATCH 23/56] [v1] Update dependencies to latest (#567) * Update dependencies to latest versions * Update linter type-checking code to 'TC' in pyproject.toml https://astral.sh/blog/ruff-v0.8.0#new-error-codes-for-flake8-type-checking-rules * Refactor: Move Zarr codec imports to top-level * disable safety in CI (temporary) * Refactor: Replace Zarr codec imports with numcodecs equivalents * Refactor: Remove unused numcodecs imports and related methods * pin zarr due to zarr 3.0.9 bug --- .github/workflows/tests.yml | 2 +- pyproject.toml | 52 +- src/mdio/schemas/compressors.py | 22 - uv.lock | 1985 ++++++++++++++----------------- 4 files changed, 928 insertions(+), 1133 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 8d7c81fa3..71ad8630e 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,7 +13,7 @@ jobs: matrix: include: - { python: "3.13", os: "ubuntu-latest", session: "pre-commit" } - - { python: "3.13", os: "ubuntu-latest", session: "safety" } + # - { python: "3.13", os: "ubuntu-latest", session: "safety" } # - { python: "3.13", os: "ubuntu-latest", session: "mypy" } # - { python: "3.12", os: "ubuntu-latest", session: "mypy" } # - { python: "3.11", os: "ubuntu-latest", session: "mypy" } diff --git a/pyproject.toml b/pyproject.toml index 7e01894ec..a9e14605e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,30 +23,30 @@ classifiers = [ ] dependencies = [ - "click (>=8.1.7,<9.0.0)", + "click (>=8.2.1,<9.0.0)", "click-params (>=0.5.0,<0.6.0)", - "dask (>=2024.12.0)", - "fsspec (>=2024.10.0)", - "pint>=0.24.3,<0.25", - "psutil (>=6.1.0,<7.0.0)", - "pydantic (>=2.8.2,<3.0.0)", - "pydantic-settings (>=2.4.0,<3.0.0)", - "rich (>=13.9.4,<14.0.0)", - "segy (>=0.4.0,<0.5.0)", - "tqdm (>=4.67.0,<5.0.0)", - "xarray>=2025.3.1", - "zarr (>=3.0.8,<4.0.0)", + "dask (>=2025.5.1)", + "fsspec (>=2025.5.1)", + "pint>=0.24.4,<0.25", + "psutil (>=7.0.0,<8.0.0)", + "pydantic (>=2.11.7,<3.0.0)", + "pydantic-settings (>=2.10.1,<3.0.0)", + "rich (>=14.0.0,<15.0.0)", + "segy (>=0.4.1.post2,<0.5.0)", + "tqdm (>=4.67.1,<5.0.0)", + "xarray>=2025.6.1", + "zarr (>=3.0.8,<3.0.9)", ] [project.optional-dependencies] cloud = [ - "s3fs == 2024.12.0", - "gcsfs (>=2024.10.0)", - "adlfs (>=2024.7.0)", + "s3fs == 2025.5.1", + "gcsfs (>=2025.5.1)", + "adlfs (>=2024.12.0)", ] distributed = [ - "distributed (>=2024.12.0)", - "bokeh (>=3.4.2,<4.0.0)", + "distributed (>=2025.5.1)", + "bokeh (>=3.7.3,<4.0.0)", ] lossy = ["zfpy (>=1.0.1,<2.0.0)"] @@ -60,17 +60,17 @@ mdio = "mdio.__main__:main" [dependency-groups] dev = [ - "ruff (>=0.11.8)", - "coverage[toml] (>=7.6.7,<8)", - "mypy (>=1.13.0,<2)", - "pre-commit (>=4.0.1,<5)", + "ruff (>=0.12.1)", + "coverage[toml] (>=7.9.1,<8)", + "mypy (>=1.16.1,<2)", + "pre-commit (>=4.2.0,<5)", "pre-commit-hooks (>=5.0.0,<6)", - "pytest (>=8.3.3,<9)", + "pytest (>=8.4.1,<9)", "pytest-dependency (>=0.6.0,<0.7)", - "safety (>=3.2.3,<4)", - "typeguard (>=4.4.1,<5)", +# "safety (>=3.5.2,<4)", # too tight pydantic and psutil dependency + "typeguard (>=4.4.4,<5)", "xdoctest[colors] (>=1.2.0,<2)", - "Pygments (>=2.18.0,<3)", + "Pygments (>=2.19.2,<3)", ] docs = [ @@ -116,7 +116,7 @@ select = [ "RET", # return "SIM", # simplify "TID", # tidy-imports - "TCH", # type-checking + "TC", # type-checking "ARG", # unused-arguments "PTH", # use-pathlib "TD", # todos diff --git a/src/mdio/schemas/compressors.py b/src/mdio/schemas/compressors.py index e17948da2..2eb87f7ad 100644 --- a/src/mdio/schemas/compressors.py +++ b/src/mdio/schemas/compressors.py @@ -53,17 +53,6 @@ class Blosc(CamelCaseStrictModel): description="The size of the block to be used for compression.", ) - def make_instance(self): # noqa: ANN201 - """Translate parameters to compressor kwargs..""" - from zarr.codecs import Blosc as _Blosc - - return _Blosc( - cname=self.algorithm, - clevel=self.level, - shuffle=self.shuffle, - blocksize=self.blocksize, - ) - zfp_mode_map = { "fixed_rate": 2, @@ -139,17 +128,6 @@ def check_requirements(self) -> ZFP: return self - def make_instance(self): # noqa: ANN201 - """Translate parameters to compressor kwargs..""" - from zarr.codecs import ZFPY as _ZFPY - - return _ZFPY( - mode=self.mode.int_code, - tolerance=self.tolerance, - rate=self.rate, - precision=self.precision, - ) - class CompressorModel(CamelCaseStrictModel): """Model representing compressor configuration.""" diff --git a/uv.lock b/uv.lock index de95c4e6f..964a1c2d4 100644 --- a/uv.lock +++ b/uv.lock @@ -26,7 +26,7 @@ wheels = [ [[package]] name = "aiobotocore" -version = "2.22.0" +version = "2.23.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -37,9 +37,9 @@ dependencies = [ { name = "python-dateutil" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9c/4c/113c4f5611103bba8e5252805fbee7944f5d9541addba9a96b091c0c4308/aiobotocore-2.22.0.tar.gz", hash = "sha256:11091477266b75c2b5d28421c1f2bc9a87d175d0b8619cb830805e7a113a170b", size = 110322 } +sdist = { url = "https://files.pythonhosted.org/packages/9d/25/4b06ea1214ddf020a28df27dc7136ac9dfaf87929d51e6f6044dd350ed67/aiobotocore-2.23.0.tar.gz", hash = "sha256:0333931365a6c7053aee292fe6ef50c74690c4ae06bb019afdf706cb6f2f5e32", size = 115825 } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/8e/ffa5840cb7de19ada85bda1fae1ae22671a18992e9373f2e2df9db5389b5/aiobotocore-2.22.0-py3-none-any.whl", hash = "sha256:b4e6306f79df9d81daff1f9d63189a2dbee4b77ce3ab937304834e35eaaeeccf", size = 78930 }, + { url = "https://files.pythonhosted.org/packages/ea/43/ccf9b29669cdb09fd4bfc0a8effeb2973b22a0f3c3be4142d0b485975d11/aiobotocore-2.23.0-py3-none-any.whl", hash = "sha256:8202cebbf147804a083a02bc282fbfda873bfdd0065fd34b64784acb7757b66e", size = 84161 }, ] [[package]] @@ -53,7 +53,7 @@ wheels = [ [[package]] name = "aiohttp" -version = "3.12.2" +version = "3.12.13" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -64,59 +64,59 @@ dependencies = [ { name = "propcache" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/06/a2/a946c4f5c54233c97788c2278ea50beaadf45211f452f932b36ce322f660/aiohttp-3.12.2.tar.gz", hash = "sha256:0018956472ee535d2cad761a5bb88eb4ad80f94cd86472cee26a244799f7c79f", size = 7780423 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/08/39/9866f5996a7db870464e1f153b9f6a3412167ee79293f138bad09de783cd/aiohttp-3.12.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:536a37af26ed50bd4f3cf7d989955e5a987e9343f1a55f5393e7950a6ac93fce", size = 701750 }, - { url = "https://files.pythonhosted.org/packages/81/eb/187fba5f1c210bed03c4e4fe50b6cc64d18c6776e6d17887b527ee2fb806/aiohttp-3.12.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6f8fbb48953238e7ba8ab9dee6757a4f6b72cd6242eb7fe1cb004b24f91effee", size = 474015 }, - { url = "https://files.pythonhosted.org/packages/c5/e5/8f203120a8a932739face58614f8c93912ccd26c0b18da3f476b7372158b/aiohttp-3.12.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74190229bd54bc3df7090f634b0b7fe53c45fb41aae5fbfae462093ced35c950", size = 462282 }, - { url = "https://files.pythonhosted.org/packages/7d/0f/9c33853f4f1c6c75a0f1b3e7b6d955f5883bd14a189232115e2e0c8633f2/aiohttp-3.12.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7af4737ab145fb1ac6e2db24ee206ee9e9f3abb1f7c6b74bd75c9ce0d36fe286", size = 1732474 }, - { url = "https://files.pythonhosted.org/packages/e6/72/2dee9dd29a6ce5abbfa5ee7b75db00ce9c213aaea588476464285a3aee57/aiohttp-3.12.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2711392a2afe1dcf4a93b05a94ee25efa966971fa0bf3944f2ce101da182ce91", size = 1681143 }, - { url = "https://files.pythonhosted.org/packages/fc/2d/4eb92b7e42f7efb8ab22d0eca89e73b96653d6fbfb9847435ad29dee385d/aiohttp-3.12.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5169898d17a2ac30e31ea814832ad4cf6bb652459a031af40ed56c9d05894c80", size = 1779934 }, - { url = "https://files.pythonhosted.org/packages/41/df/c9dc8dd89e40e469386cfb0adbdf63be04e52a85562bae271c1a863de5b0/aiohttp-3.12.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a590566c5c139edfbeeb69de62c6868e6ef667322b0080489607acc39e92add", size = 1818982 }, - { url = "https://files.pythonhosted.org/packages/6f/b6/84fd20aca84651e373fd90187abe1daf7596ab5e79b6045b294496b73bea/aiohttp-3.12.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4be1c1adb604591a607abb9c4474eedc6add6739656ee91a9daddf35f7f9fa", size = 1721441 }, - { url = "https://files.pythonhosted.org/packages/86/9c/412603ca6e3be2656bc3b662828087f8b3a21f82fe20f94219ba7769a6dd/aiohttp-3.12.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0cf15667ecf20bfe545adb02882d895e10c8d5c821e46b1a62f22d5170c4803e", size = 1658517 }, - { url = "https://files.pythonhosted.org/packages/c1/70/d1735c170aebdc4eda456768bb8714529a90743fd1de1bff075e33292ee9/aiohttp-3.12.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:875df9e4ed4f24af643f4e35bf267be3cb25b9461d25da4a0d181877a2b401e4", size = 1706789 }, - { url = "https://files.pythonhosted.org/packages/61/80/c0f85511b8f315cab5a86615d155d9584cd5d6f1d48c94f92dc3dffd4a7f/aiohttp-3.12.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:722fe14a899ee049562417449a449dfc7c616fdb5409f8a0a2c459815473767f", size = 1701950 }, - { url = "https://files.pythonhosted.org/packages/5e/f5/95a835814bd34378ad18d05e3351e6bd1035263ec20480f69f3688fa04ec/aiohttp-3.12.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:59668d843c91bd22abc1f70674270ce38e1dad3020284cccecc60f492d6f88ae", size = 1682137 }, - { url = "https://files.pythonhosted.org/packages/89/35/ccf684cd9d343b1401be07f0c43793d8475fed2b2418e01f885bcdcd972b/aiohttp-3.12.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:64e48ed61d5c74b5a4a68fdb3fde664034e59788625ebf3fcae87fb5a2dbde7b", size = 1775737 }, - { url = "https://files.pythonhosted.org/packages/22/a8/0075064d24f4d4987ba8e73a67fc8c0c0075134abb087000316147d2bc77/aiohttp-3.12.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:7061bce1accdfce6e02c80ac10efcdfcae95718f97f77fc5fbe3273b16b8d4bf", size = 1796197 }, - { url = "https://files.pythonhosted.org/packages/4b/bc/de6c5969285b309a11582d0009cea97384f2cac9b2c88e3a35b642cd6d17/aiohttp-3.12.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ef392a613f53fc4c3e6ebba2c3b90729266139a3f534e7eba9bf04e2eac40287", size = 1709254 }, - { url = "https://files.pythonhosted.org/packages/c1/12/bf9ce81a2954b421cd6acb90a41777075baec3a3a21fb0dd10b483ed3652/aiohttp-3.12.2-cp311-cp311-win32.whl", hash = "sha256:e405ccdd3cada578e5bc4000b7d35b80a345c832089d23b04be30c0e7606fb80", size = 419267 }, - { url = "https://files.pythonhosted.org/packages/97/6c/db68994b49a2c50a4a8943ba3696f66906ab09d206243f91ea8ede7b7d87/aiohttp-3.12.2-cp311-cp311-win_amd64.whl", hash = "sha256:a84cf5db31efc14e811ef830288614bf40093befd445efe743dc015d01e6e92c", size = 443663 }, - { url = "https://files.pythonhosted.org/packages/84/25/17af725b3855ad54eb1cb8e45962b05856a7e4986b64fbc6158331d7b64e/aiohttp-3.12.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7679b2af5a1d43d8470672079baedc1a843e4f27a47b630fbe092833f9bc4e73", size = 692835 }, - { url = "https://files.pythonhosted.org/packages/cc/5d/770e9f17f0efeb1c40109535561ea7b0a3e9b654bd7853c27f3d62763086/aiohttp-3.12.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4d6941dd4d8f6dfd9292f391bc2e321c9583a9532b4e9b571b84f163bb3f8135", size = 467456 }, - { url = "https://files.pythonhosted.org/packages/d8/ef/48eda5cd949b8af818d892b5ddf07cb15f0cf133e14c4ac9734ff32ba0a6/aiohttp-3.12.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8345cea33295cc28945c8365ac44ba383ebb757a599b384d752347f40671e984", size = 460294 }, - { url = "https://files.pythonhosted.org/packages/94/1e/9724a45cb932b0c01c558493fac5f706a1a53740a77efc22c2f6764ce611/aiohttp-3.12.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8259a311666becf7049ae43c984208ac20eda5ea16aa5f26ea5d24b863f9afcd", size = 1707089 }, - { url = "https://files.pythonhosted.org/packages/8a/a1/3b267d691a79472e6a0d9909363c2dc6cad44e60deb99385ce41e7926b40/aiohttp-3.12.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a6f09589cb5928ee793210806d35d69fffc78d46eca9acaa2d38cc30b3f194e", size = 1689737 }, - { url = "https://files.pythonhosted.org/packages/d9/71/f04d5c86cfa5227ec2a54dd72b8de5b1930eb5c9ea75bd1c987b463cbb36/aiohttp-3.12.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0c32972b485828f2b9326a95851520e9a92cdd97efe0a04ae62c7315e8d1098", size = 1744835 }, - { url = "https://files.pythonhosted.org/packages/eb/88/deab2324c7468d6405cf9bae287276edef14a00fd00d084b3010e194e8d9/aiohttp-3.12.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:851d226ecaf30ec7f12d9e9793081ecd0e66fea7f6345bcb5283b39e9ea79c71", size = 1790987 }, - { url = "https://files.pythonhosted.org/packages/17/49/0b7c3fb319c4a9c75c41ec066e578bfd3ee847a550ef579d9fb6d65af3fa/aiohttp-3.12.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7127241e62621eabe437cce249a4858e79896abcdafed4c6f7a90d14d449066", size = 1710431 }, - { url = "https://files.pythonhosted.org/packages/eb/23/3c366db7343384cd81b0ec9609019dc34e14d25b7099d9390cfa561bb49f/aiohttp-3.12.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bca43af1c77f83e88641e74d1bd24b6089bb518fa0e6be97805a048bdac6bbc3", size = 1626229 }, - { url = "https://files.pythonhosted.org/packages/99/3e/a6b7b55a38a6372b7e00f751778fc653cdd14770f1c20c5ed309f1b87768/aiohttp-3.12.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d913623c7e3be188fe5c718bce186e0bbc5977e74c12e4832d540c3637b9f47", size = 1687290 }, - { url = "https://files.pythonhosted.org/packages/3c/69/0542c4c125e40c47e26bab47d8aff50f831c5626a4d4ab9da7018ee2d15c/aiohttp-3.12.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b4924ca6bc74cb630e47edaf111f1d05e13dfe3c1e580c35277dc998965913d3", size = 1708743 }, - { url = "https://files.pythonhosted.org/packages/1d/0e/73a16e4008f78fa3538a1e564d0ecf026c7fd422f522e87af48337942f48/aiohttp-3.12.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a38e144942d4f0740dcb5be2ceb932cc45fc29e404fe64ffd5eef5bc62eafe39", size = 1649396 }, - { url = "https://files.pythonhosted.org/packages/98/23/0a9b1547260d554f2c484c2f5e9d3800eca31a387146e5e0a0cfb6bfe17e/aiohttp-3.12.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6c31782dae093a507b94792d9f32978bf154d051d5237fdedbb9e74d9464d5dd", size = 1728959 }, - { url = "https://files.pythonhosted.org/packages/31/d0/39b2b1111b81952015e7390ea07b404f417577e6ed4df1a683dc3d1a0a2f/aiohttp-3.12.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7f10d664b638f85acdeb7622f7b16773aaf7d67214a7c3b6075735f171d2f021", size = 1756933 }, - { url = "https://files.pythonhosted.org/packages/28/77/faf662e3b87e3d5a1ca3092c5cbeaa4349abdff3388bdc3c3c057302b380/aiohttp-3.12.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7181b4ebd70ad9731f4f7af03e3ed0ff003e49cefbf0b6846b5decb32abc30b7", size = 1716543 }, - { url = "https://files.pythonhosted.org/packages/d3/1a/c79bae467e39439d5ef044f121b280aa0398cb23ecd77ee49f8a1759dde7/aiohttp-3.12.2-cp312-cp312-win32.whl", hash = "sha256:d602fc26cb307993965e5f5dacb2aaa7fea4f01c6658250658bef51e48dd454e", size = 414002 }, - { url = "https://files.pythonhosted.org/packages/e2/dd/0d5f6aef062433cf88ea08ab2c8c3c1466e812311c9e0657370835ed27c9/aiohttp-3.12.2-cp312-cp312-win_amd64.whl", hash = "sha256:35df44dde19fcd146ed13e8847c70f8e138e91138f7615df2bd68b478ac04f99", size = 440104 }, - { url = "https://files.pythonhosted.org/packages/f9/ed/a341ddf8402cc4a177eb63a63d2aee2f177a94b1f2d53ef192e43e82760f/aiohttp-3.12.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e6dd24e72e7425b4eee49eeaa1a08742774f5a0c84041e80625aeba45812f92e", size = 687252 }, - { url = "https://files.pythonhosted.org/packages/e8/93/00e623a2c984d95a52e7f9e92d178828beb4a5d31b9231b0fda77fc13e98/aiohttp-3.12.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5293245b743d3e41fd4de631aed6018e0016488686ee70d3dbd9ac61cc040429", size = 464914 }, - { url = "https://files.pythonhosted.org/packages/5e/ad/4fea70b2d1994edf3c34220a41f0ac1263ee4b704343248f7d15fa8e3b8e/aiohttp-3.12.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b2c7bc896696ada3df4ffd787b80d08af53eb16658fd19623f469f89c5f95846", size = 457217 }, - { url = "https://files.pythonhosted.org/packages/fb/f1/f20c87b0baf096f2d36897fe4a9a0e703f32dbf7b3fcaae0a5a196f779dc/aiohttp-3.12.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e4991a7dcdd577a749429248321196dba6ade4315c6262e9b2ba9a3bb80e9cb", size = 1696029 }, - { url = "https://files.pythonhosted.org/packages/d9/4a/1b0507cfd73c1736e5cd607c7f16790747112c86e0c17860b1b635ad7d52/aiohttp-3.12.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:88f8d247c4b6cc75eb5ef1724998b3076f5f2f6b7d357560caa5b5da08228cb4", size = 1677295 }, - { url = "https://files.pythonhosted.org/packages/7d/ca/ffb5d548d6aa195797bebd5e3688821c40c2a6503363e5849d7114678a59/aiohttp-3.12.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e1f3968162f274ed8e97aad591da178fb04725a386a4852b1c0285f3a51390af", size = 1729363 }, - { url = "https://files.pythonhosted.org/packages/98/3e/e6cb54d8329b7c60b6678631c228339730632ea7c18dd6279e64ad134d52/aiohttp-3.12.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4de7a3a7e482f5832838047c1612c0c3d1f4309e3e2d4ea80cb1b7f5ab0c6bbe", size = 1778736 }, - { url = "https://files.pythonhosted.org/packages/2d/be/76db303c98159b6c0494fe4f14a6c57a28c81db9010d2d5d764219339f0a/aiohttp-3.12.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86ca0aa49854b195e314171756d06f81c1286541425a929950f7316d617cc3b1", size = 1701064 }, - { url = "https://files.pythonhosted.org/packages/c3/c1/d6d4abdeffaa9dee12b27c80919a1bda50aea22d5a1dc03c001a005b16ea/aiohttp-3.12.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bff129c6674f3a14c68a0f49337ebd8637440201cbd8af05df52cb2d7db0902", size = 1614772 }, - { url = "https://files.pythonhosted.org/packages/8c/69/da43fe30ef3323add2ac03b11cef91c50b648d544953732aeff9a47cdb5e/aiohttp-3.12.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62179517ef8d0abc950ab7e6545e97142bef3f58007da12b9cff5260e8084fd1", size = 1667793 }, - { url = "https://files.pythonhosted.org/packages/8c/03/367badf467bd9708b2eaa5fc36689b9b2e43489b63d8508fddc508ceaace/aiohttp-3.12.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:48d743fbc8a88dffb2d2e96f17f9e2310aaa672bd2103b198d7613361affd1a3", size = 1699458 }, - { url = "https://files.pythonhosted.org/packages/d2/12/c7443b288263b4ab3d8c6329de0be8df2967445aa9731b738da7b34f04ca/aiohttp-3.12.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:385f01fe9be53a0466fb66504b00ab00ca7faa0a285186327509cbbe1386363f", size = 1642052 }, - { url = "https://files.pythonhosted.org/packages/4e/76/2be34ed27931ab1a4cdd40eba3ef2d71bf0eff9d6c0ac8793e92f20f3ac1/aiohttp-3.12.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:631f4da6b1d503f9df883ba86846fa0ff455eae60497fab5f1d21683b2a2784e", size = 1718187 }, - { url = "https://files.pythonhosted.org/packages/43/39/84d014db48122973171c3cfcf23a2c3ba765163ef8169d6b959d9440152b/aiohttp-3.12.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7e071f1371f38c15dad609bb57d698fe4614b1817e7808966c643336f5615655", size = 1751656 }, - { url = "https://files.pythonhosted.org/packages/27/b6/7b13d143352494e943ae3f89b5286dc4ed85f8d5487a09f3dd86efb16eb3/aiohttp-3.12.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:166d8ba47fca7667dd3169be8bd0fb9ffd0f19fd80f0d5291b1e36ab0f77d02c", size = 1700547 }, - { url = "https://files.pythonhosted.org/packages/42/19/1b42589a0f80f14b1bc81ccc5fb0f8c4398fbd03b5886d1307c7aadd8279/aiohttp-3.12.2-cp313-cp313-win32.whl", hash = "sha256:01ac3cc4a0c81f87ed72c614066bfdee15358c5c2cdf30048dd8823826cbc61e", size = 413024 }, - { url = "https://files.pythonhosted.org/packages/d0/d7/00abc34b16f1ea9dc8cedffe45c0f454157472480e5b44b6c15f175aa9c6/aiohttp-3.12.2-cp313-cp313-win_amd64.whl", hash = "sha256:cbf833ca90fda31ec505e80f58f8011c64030fb8e368bce0d60f1f9aae162389", size = 438964 }, +sdist = { url = "https://files.pythonhosted.org/packages/42/6e/ab88e7cb2a4058bed2f7870276454f85a7c56cd6da79349eb314fc7bbcaa/aiohttp-3.12.13.tar.gz", hash = "sha256:47e2da578528264a12e4e3dd8dd72a7289e5f812758fe086473fab037a10fcce", size = 7819160 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/65/5566b49553bf20ffed6041c665a5504fb047cefdef1b701407b8ce1a47c4/aiohttp-3.12.13-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7c229b1437aa2576b99384e4be668af1db84b31a45305d02f61f5497cfa6f60c", size = 709401 }, + { url = "https://files.pythonhosted.org/packages/14/b5/48e4cc61b54850bdfafa8fe0b641ab35ad53d8e5a65ab22b310e0902fa42/aiohttp-3.12.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04076d8c63471e51e3689c93940775dc3d12d855c0c80d18ac5a1c68f0904358", size = 481669 }, + { url = "https://files.pythonhosted.org/packages/04/4f/e3f95c8b2a20a0437d51d41d5ccc4a02970d8ad59352efb43ea2841bd08e/aiohttp-3.12.13-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:55683615813ce3601640cfaa1041174dc956d28ba0511c8cbd75273eb0587014", size = 469933 }, + { url = "https://files.pythonhosted.org/packages/41/c9/c5269f3b6453b1cfbd2cfbb6a777d718c5f086a3727f576c51a468b03ae2/aiohttp-3.12.13-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:921bc91e602d7506d37643e77819cb0b840d4ebb5f8d6408423af3d3bf79a7b7", size = 1740128 }, + { url = "https://files.pythonhosted.org/packages/6f/49/a3f76caa62773d33d0cfaa842bdf5789a78749dbfe697df38ab1badff369/aiohttp-3.12.13-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e72d17fe0974ddeae8ed86db297e23dba39c7ac36d84acdbb53df2e18505a013", size = 1688796 }, + { url = "https://files.pythonhosted.org/packages/ad/e4/556fccc4576dc22bf18554b64cc873b1a3e5429a5bdb7bbef7f5d0bc7664/aiohttp-3.12.13-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0653d15587909a52e024a261943cf1c5bdc69acb71f411b0dd5966d065a51a47", size = 1787589 }, + { url = "https://files.pythonhosted.org/packages/b9/3d/d81b13ed48e1a46734f848e26d55a7391708421a80336e341d2aef3b6db2/aiohttp-3.12.13-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a77b48997c66722c65e157c06c74332cdf9c7ad00494b85ec43f324e5c5a9b9a", size = 1826635 }, + { url = "https://files.pythonhosted.org/packages/75/a5/472e25f347da88459188cdaadd1f108f6292f8a25e62d226e63f860486d1/aiohttp-3.12.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6946bae55fd36cfb8e4092c921075cde029c71c7cb571d72f1079d1e4e013bc", size = 1729095 }, + { url = "https://files.pythonhosted.org/packages/b9/fe/322a78b9ac1725bfc59dfc301a5342e73d817592828e4445bd8f4ff83489/aiohttp-3.12.13-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f95db8c8b219bcf294a53742c7bda49b80ceb9d577c8e7aa075612b7f39ffb7", size = 1666170 }, + { url = "https://files.pythonhosted.org/packages/7a/77/ec80912270e231d5e3839dbd6c065472b9920a159ec8a1895cf868c2708e/aiohttp-3.12.13-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:03d5eb3cfb4949ab4c74822fb3326cd9655c2b9fe22e4257e2100d44215b2e2b", size = 1714444 }, + { url = "https://files.pythonhosted.org/packages/21/b2/fb5aedbcb2b58d4180e58500e7c23ff8593258c27c089abfbcc7db65bd40/aiohttp-3.12.13-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6383dd0ffa15515283c26cbf41ac8e6705aab54b4cbb77bdb8935a713a89bee9", size = 1709604 }, + { url = "https://files.pythonhosted.org/packages/e3/15/a94c05f7c4dc8904f80b6001ad6e07e035c58a8ebfcc15e6b5d58500c858/aiohttp-3.12.13-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6548a411bc8219b45ba2577716493aa63b12803d1e5dc70508c539d0db8dbf5a", size = 1689786 }, + { url = "https://files.pythonhosted.org/packages/1d/fd/0d2e618388f7a7a4441eed578b626bda9ec6b5361cd2954cfc5ab39aa170/aiohttp-3.12.13-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:81b0fcbfe59a4ca41dc8f635c2a4a71e63f75168cc91026c61be665945739e2d", size = 1783389 }, + { url = "https://files.pythonhosted.org/packages/a6/6b/6986d0c75996ef7e64ff7619b9b7449b1d1cbbe05c6755e65d92f1784fe9/aiohttp-3.12.13-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:6a83797a0174e7995e5edce9dcecc517c642eb43bc3cba296d4512edf346eee2", size = 1803853 }, + { url = "https://files.pythonhosted.org/packages/21/65/cd37b38f6655d95dd07d496b6d2f3924f579c43fd64b0e32b547b9c24df5/aiohttp-3.12.13-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a5734d8469a5633a4e9ffdf9983ff7cdb512524645c7a3d4bc8a3de45b935ac3", size = 1716909 }, + { url = "https://files.pythonhosted.org/packages/fd/20/2de7012427dc116714c38ca564467f6143aec3d5eca3768848d62aa43e62/aiohttp-3.12.13-cp311-cp311-win32.whl", hash = "sha256:fef8d50dfa482925bb6b4c208b40d8e9fa54cecba923dc65b825a72eed9a5dbd", size = 427036 }, + { url = "https://files.pythonhosted.org/packages/f8/b6/98518bcc615ef998a64bef371178b9afc98ee25895b4f476c428fade2220/aiohttp-3.12.13-cp311-cp311-win_amd64.whl", hash = "sha256:9a27da9c3b5ed9d04c36ad2df65b38a96a37e9cfba6f1381b842d05d98e6afe9", size = 451427 }, + { url = "https://files.pythonhosted.org/packages/b4/6a/ce40e329788013cd190b1d62bbabb2b6a9673ecb6d836298635b939562ef/aiohttp-3.12.13-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0aa580cf80558557285b49452151b9c69f2fa3ad94c5c9e76e684719a8791b73", size = 700491 }, + { url = "https://files.pythonhosted.org/packages/28/d9/7150d5cf9163e05081f1c5c64a0cdf3c32d2f56e2ac95db2a28fe90eca69/aiohttp-3.12.13-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b103a7e414b57e6939cc4dece8e282cfb22043efd0c7298044f6594cf83ab347", size = 475104 }, + { url = "https://files.pythonhosted.org/packages/f8/91/d42ba4aed039ce6e449b3e2db694328756c152a79804e64e3da5bc19dffc/aiohttp-3.12.13-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78f64e748e9e741d2eccff9597d09fb3cd962210e5b5716047cbb646dc8fe06f", size = 467948 }, + { url = "https://files.pythonhosted.org/packages/99/3b/06f0a632775946981d7c4e5a865cddb6e8dfdbaed2f56f9ade7bb4a1039b/aiohttp-3.12.13-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c955989bf4c696d2ededc6b0ccb85a73623ae6e112439398935362bacfaaf6", size = 1714742 }, + { url = "https://files.pythonhosted.org/packages/92/a6/2552eebad9ec5e3581a89256276009e6a974dc0793632796af144df8b740/aiohttp-3.12.13-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d640191016763fab76072c87d8854a19e8e65d7a6fcfcbf017926bdbbb30a7e5", size = 1697393 }, + { url = "https://files.pythonhosted.org/packages/d8/9f/bd08fdde114b3fec7a021381b537b21920cdd2aa29ad48c5dffd8ee314f1/aiohttp-3.12.13-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4dc507481266b410dede95dd9f26c8d6f5a14315372cc48a6e43eac652237d9b", size = 1752486 }, + { url = "https://files.pythonhosted.org/packages/f7/e1/affdea8723aec5bd0959171b5490dccd9a91fcc505c8c26c9f1dca73474d/aiohttp-3.12.13-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8a94daa873465d518db073bd95d75f14302e0208a08e8c942b2f3f1c07288a75", size = 1798643 }, + { url = "https://files.pythonhosted.org/packages/f3/9d/666d856cc3af3a62ae86393baa3074cc1d591a47d89dc3bf16f6eb2c8d32/aiohttp-3.12.13-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177f52420cde4ce0bb9425a375d95577fe082cb5721ecb61da3049b55189e4e6", size = 1718082 }, + { url = "https://files.pythonhosted.org/packages/f3/ce/3c185293843d17be063dada45efd2712bb6bf6370b37104b4eda908ffdbd/aiohttp-3.12.13-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f7df1f620ec40f1a7fbcb99ea17d7326ea6996715e78f71a1c9a021e31b96b8", size = 1633884 }, + { url = "https://files.pythonhosted.org/packages/3a/5b/f3413f4b238113be35dfd6794e65029250d4b93caa0974ca572217745bdb/aiohttp-3.12.13-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3062d4ad53b36e17796dce1c0d6da0ad27a015c321e663657ba1cc7659cfc710", size = 1694943 }, + { url = "https://files.pythonhosted.org/packages/82/c8/0e56e8bf12081faca85d14a6929ad5c1263c146149cd66caa7bc12255b6d/aiohttp-3.12.13-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:8605e22d2a86b8e51ffb5253d9045ea73683d92d47c0b1438e11a359bdb94462", size = 1716398 }, + { url = "https://files.pythonhosted.org/packages/ea/f3/33192b4761f7f9b2f7f4281365d925d663629cfaea093a64b658b94fc8e1/aiohttp-3.12.13-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:54fbbe6beafc2820de71ece2198458a711e224e116efefa01b7969f3e2b3ddae", size = 1657051 }, + { url = "https://files.pythonhosted.org/packages/5e/0b/26ddd91ca8f84c48452431cb4c5dd9523b13bc0c9766bda468e072ac9e29/aiohttp-3.12.13-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:050bd277dfc3768b606fd4eae79dd58ceda67d8b0b3c565656a89ae34525d15e", size = 1736611 }, + { url = "https://files.pythonhosted.org/packages/c3/8d/e04569aae853302648e2c138a680a6a2f02e374c5b6711732b29f1e129cc/aiohttp-3.12.13-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2637a60910b58f50f22379b6797466c3aa6ae28a6ab6404e09175ce4955b4e6a", size = 1764586 }, + { url = "https://files.pythonhosted.org/packages/ac/98/c193c1d1198571d988454e4ed75adc21c55af247a9fda08236602921c8c8/aiohttp-3.12.13-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e986067357550d1aaa21cfe9897fa19e680110551518a5a7cf44e6c5638cb8b5", size = 1724197 }, + { url = "https://files.pythonhosted.org/packages/e7/9e/07bb8aa11eec762c6b1ff61575eeeb2657df11ab3d3abfa528d95f3e9337/aiohttp-3.12.13-cp312-cp312-win32.whl", hash = "sha256:ac941a80aeea2aaae2875c9500861a3ba356f9ff17b9cb2dbfb5cbf91baaf5bf", size = 421771 }, + { url = "https://files.pythonhosted.org/packages/52/66/3ce877e56ec0813069cdc9607cd979575859c597b6fb9b4182c6d5f31886/aiohttp-3.12.13-cp312-cp312-win_amd64.whl", hash = "sha256:671f41e6146a749b6c81cb7fd07f5a8356d46febdaaaf07b0e774ff04830461e", size = 447869 }, + { url = "https://files.pythonhosted.org/packages/11/0f/db19abdf2d86aa1deec3c1e0e5ea46a587b97c07a16516b6438428b3a3f8/aiohttp-3.12.13-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d4a18e61f271127465bdb0e8ff36e8f02ac4a32a80d8927aa52371e93cd87938", size = 694910 }, + { url = "https://files.pythonhosted.org/packages/d5/81/0ab551e1b5d7f1339e2d6eb482456ccbe9025605b28eed2b1c0203aaaade/aiohttp-3.12.13-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:532542cb48691179455fab429cdb0d558b5e5290b033b87478f2aa6af5d20ace", size = 472566 }, + { url = "https://files.pythonhosted.org/packages/34/3f/6b7d336663337672d29b1f82d1f252ec1a040fe2d548f709d3f90fa2218a/aiohttp-3.12.13-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d7eea18b52f23c050ae9db5d01f3d264ab08f09e7356d6f68e3f3ac2de9dfabb", size = 464856 }, + { url = "https://files.pythonhosted.org/packages/26/7f/32ca0f170496aa2ab9b812630fac0c2372c531b797e1deb3deb4cea904bd/aiohttp-3.12.13-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad7c8e5c25f2a26842a7c239de3f7b6bfb92304593ef997c04ac49fb703ff4d7", size = 1703683 }, + { url = "https://files.pythonhosted.org/packages/ec/53/d5513624b33a811c0abea8461e30a732294112318276ce3dbf047dbd9d8b/aiohttp-3.12.13-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6af355b483e3fe9d7336d84539fef460120c2f6e50e06c658fe2907c69262d6b", size = 1684946 }, + { url = "https://files.pythonhosted.org/packages/37/72/4c237dd127827b0247dc138d3ebd49c2ded6114c6991bbe969058575f25f/aiohttp-3.12.13-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a95cf9f097498f35c88e3609f55bb47b28a5ef67f6888f4390b3d73e2bac6177", size = 1737017 }, + { url = "https://files.pythonhosted.org/packages/0d/67/8a7eb3afa01e9d0acc26e1ef847c1a9111f8b42b82955fcd9faeb84edeb4/aiohttp-3.12.13-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8ed8c38a1c584fe99a475a8f60eefc0b682ea413a84c6ce769bb19a7ff1c5ef", size = 1786390 }, + { url = "https://files.pythonhosted.org/packages/48/19/0377df97dd0176ad23cd8cad4fd4232cfeadcec6c1b7f036315305c98e3f/aiohttp-3.12.13-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0b9170d5d800126b5bc89d3053a2363406d6e327afb6afaeda2d19ee8bb103", size = 1708719 }, + { url = "https://files.pythonhosted.org/packages/61/97/ade1982a5c642b45f3622255173e40c3eed289c169f89d00eeac29a89906/aiohttp-3.12.13-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:372feeace612ef8eb41f05ae014a92121a512bd5067db8f25101dd88a8db11da", size = 1622424 }, + { url = "https://files.pythonhosted.org/packages/99/ab/00ad3eea004e1d07ccc406e44cfe2b8da5acb72f8c66aeeb11a096798868/aiohttp-3.12.13-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a946d3702f7965d81f7af7ea8fb03bb33fe53d311df48a46eeca17e9e0beed2d", size = 1675447 }, + { url = "https://files.pythonhosted.org/packages/3f/fe/74e5ce8b2ccaba445fe0087abc201bfd7259431d92ae608f684fcac5d143/aiohttp-3.12.13-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a0c4725fae86555bbb1d4082129e21de7264f4ab14baf735278c974785cd2041", size = 1707110 }, + { url = "https://files.pythonhosted.org/packages/ef/c4/39af17807f694f7a267bd8ab1fbacf16ad66740862192a6c8abac2bff813/aiohttp-3.12.13-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9b28ea2f708234f0a5c44eb6c7d9eb63a148ce3252ba0140d050b091b6e842d1", size = 1649706 }, + { url = "https://files.pythonhosted.org/packages/38/e8/f5a0a5f44f19f171d8477059aa5f28a158d7d57fe1a46c553e231f698435/aiohttp-3.12.13-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d4f5becd2a5791829f79608c6f3dc745388162376f310eb9c142c985f9441cc1", size = 1725839 }, + { url = "https://files.pythonhosted.org/packages/fd/ac/81acc594c7f529ef4419d3866913f628cd4fa9cab17f7bf410a5c3c04c53/aiohttp-3.12.13-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:60f2ce6b944e97649051d5f5cc0f439360690b73909230e107fd45a359d3e911", size = 1759311 }, + { url = "https://files.pythonhosted.org/packages/38/0d/aabe636bd25c6ab7b18825e5a97d40024da75152bec39aa6ac8b7a677630/aiohttp-3.12.13-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:69fc1909857401b67bf599c793f2183fbc4804717388b0b888f27f9929aa41f3", size = 1708202 }, + { url = "https://files.pythonhosted.org/packages/1f/ab/561ef2d8a223261683fb95a6283ad0d36cb66c87503f3a7dde7afe208bb2/aiohttp-3.12.13-cp313-cp313-win32.whl", hash = "sha256:7d7e68787a2046b0e44ba5587aa723ce05d711e3a3665b6b7545328ac8e3c0dd", size = 420794 }, + { url = "https://files.pythonhosted.org/packages/9d/47/b11d0089875a23bff0abd3edb5516bcd454db3fefab8604f5e4b07bd6210/aiohttp-3.12.13-cp313-cp313-win_amd64.whl", hash = "sha256:5a178390ca90419bfd41419a809688c368e63c86bd725e1186dd97f6b89c2706", size = 446735 }, ] [[package]] @@ -199,18 +199,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 }, ] -[[package]] -name = "authlib" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cryptography" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a2/9d/b1e08d36899c12c8b894a44a5583ee157789f26fc4b176f8e4b6217b56e1/authlib-1.6.0.tar.gz", hash = "sha256:4367d32031b7af175ad3a323d571dc7257b7099d55978087ceae4a0d88cd3210", size = 158371 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/29/587c189bbab1ccc8c86a03a5d0e13873df916380ef1be461ebe6acebf48d/authlib-1.6.0-py2.py3-none-any.whl", hash = "sha256:91685589498f79e8655e8a8947431ad6288831d643f11c55c2143ffcc738048d", size = 239981 }, -] - [[package]] name = "azure-core" version = "1.34.0" @@ -315,16 +303,16 @@ wheels = [ [[package]] name = "botocore" -version = "1.37.3" +version = "1.38.27" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jmespath" }, { name = "python-dateutil" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/74/fb/b243ab806d2e1e6b8a475b731cc59a1f1e4709eded4884b988a27bbc996b/botocore-1.37.3.tar.gz", hash = "sha256:fe8403eb55a88faf9b0f9da6615e5bee7be056d75e17af66c3c8f0a3b0648da4", size = 13574648 } +sdist = { url = "https://files.pythonhosted.org/packages/36/5e/67899214ad57f7f26af5bd776ac5eb583dc4ecf5c1e52e2cbfdc200e487a/botocore-1.38.27.tar.gz", hash = "sha256:9788f7efe974328a38cbade64cc0b1e67d27944b899f88cb786ae362973133b6", size = 13919963 } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/54/772118f15b5990173aa5264946cc8c9ff70c8f02d72ee6d63167a985188c/botocore-1.37.3-py3-none-any.whl", hash = "sha256:d01bd3bf4c80e61fa88d636ad9f5c9f60a551d71549b481386c6b4efe0bb2b2e", size = 13342066 }, + { url = "https://files.pythonhosted.org/packages/7e/83/a753562020b69fa90cebc39e8af2c753b24dcdc74bee8355ee3f6cefdf34/botocore-1.38.27-py3-none-any.whl", hash = "sha256:a785d5e9a5eda88ad6ab9ed8b87d1f2ac409d0226bba6ff801c55359e94d91a8", size = 13580545 }, ] [[package]] @@ -338,11 +326,11 @@ wheels = [ [[package]] name = "certifi" -version = "2025.4.26" +version = "2025.6.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/9e/c05b3920a3b7d20d3d3310465f50348e5b3694f4f88c6daf736eef3024c4/certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", size = 160705 } +sdist = { url = "https://files.pythonhosted.org/packages/73/f7/f14b46d4bcd21092d7d3ccef689615220d8a08fb25e564b65d20738e672e/certifi-2025.6.15.tar.gz", hash = "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b", size = 158753 } wheels = [ - { url = "https://files.pythonhosted.org/packages/4a/7e/3db2bd1b1f9e95f7cddca6d6e75e2f2bd9f51b1246e546d88addca0106bd/certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3", size = 159618 }, + { url = "https://files.pythonhosted.org/packages/84/ae/320161bd181fc06471eed047ecce67b693fd7515b16d495d8932db763426/certifi-2025.6.15-py3-none-any.whl", hash = "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057", size = 157650 }, ] [[package]] @@ -559,56 +547,56 @@ wheels = [ [[package]] name = "coverage" -version = "7.8.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/07/998afa4a0ecdf9b1981ae05415dad2d4e7716e1b1f00abbd91691ac09ac9/coverage-7.8.2.tar.gz", hash = "sha256:a886d531373a1f6ff9fad2a2ba4a045b68467b779ae729ee0b3b10ac20033b27", size = 812759 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/4d/1ff618ee9f134d0de5cc1661582c21a65e06823f41caf801aadf18811a8e/coverage-7.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b99058eef42e6a8dcd135afb068b3d53aff3921ce699e127602efff9956457a9", size = 211692 }, - { url = "https://files.pythonhosted.org/packages/96/fa/c3c1b476de96f2bc7a8ca01a9f1fcb51c01c6b60a9d2c3e66194b2bdb4af/coverage-7.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5feb7f2c3e6ea94d3b877def0270dff0947b8d8c04cfa34a17be0a4dc1836879", size = 212115 }, - { url = "https://files.pythonhosted.org/packages/f7/c2/5414c5a1b286c0f3881ae5adb49be1854ac5b7e99011501f81c8c1453065/coverage-7.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:670a13249b957bb9050fab12d86acef7bf8f6a879b9d1a883799276e0d4c674a", size = 244740 }, - { url = "https://files.pythonhosted.org/packages/cd/46/1ae01912dfb06a642ef3dd9cf38ed4996fda8fe884dab8952da616f81a2b/coverage-7.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0bdc8bf760459a4a4187b452213e04d039990211f98644c7292adf1e471162b5", size = 242429 }, - { url = "https://files.pythonhosted.org/packages/06/58/38c676aec594bfe2a87c7683942e5a30224791d8df99bcc8439fde140377/coverage-7.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07a989c867986c2a75f158f03fdb413128aad29aca9d4dbce5fc755672d96f11", size = 244218 }, - { url = "https://files.pythonhosted.org/packages/80/0c/95b1023e881ce45006d9abc250f76c6cdab7134a1c182d9713878dfefcb2/coverage-7.8.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2db10dedeb619a771ef0e2949ccba7b75e33905de959c2643a4607bef2f3fb3a", size = 243865 }, - { url = "https://files.pythonhosted.org/packages/57/37/0ae95989285a39e0839c959fe854a3ae46c06610439350d1ab860bf020ac/coverage-7.8.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e6ea7dba4e92926b7b5f0990634b78ea02f208d04af520c73a7c876d5a8d36cb", size = 242038 }, - { url = "https://files.pythonhosted.org/packages/4d/82/40e55f7c0eb5e97cc62cbd9d0746fd24e8caf57be5a408b87529416e0c70/coverage-7.8.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ef2f22795a7aca99fc3c84393a55a53dd18ab8c93fb431004e4d8f0774150f54", size = 242567 }, - { url = "https://files.pythonhosted.org/packages/f9/35/66a51adc273433a253989f0d9cc7aa6bcdb4855382cf0858200afe578861/coverage-7.8.2-cp311-cp311-win32.whl", hash = "sha256:641988828bc18a6368fe72355df5f1703e44411adbe49bba5644b941ce6f2e3a", size = 214194 }, - { url = "https://files.pythonhosted.org/packages/f6/8f/a543121f9f5f150eae092b08428cb4e6b6d2d134152c3357b77659d2a605/coverage-7.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8ab4a51cb39dc1933ba627e0875046d150e88478dbe22ce145a68393e9652975", size = 215109 }, - { url = "https://files.pythonhosted.org/packages/77/65/6cc84b68d4f35186463cd7ab1da1169e9abb59870c0f6a57ea6aba95f861/coverage-7.8.2-cp311-cp311-win_arm64.whl", hash = "sha256:8966a821e2083c74d88cca5b7dcccc0a3a888a596a04c0b9668a891de3a0cc53", size = 213521 }, - { url = "https://files.pythonhosted.org/packages/8d/2a/1da1ada2e3044fcd4a3254fb3576e160b8fe5b36d705c8a31f793423f763/coverage-7.8.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2f6fe3654468d061942591aef56686131335b7a8325684eda85dacdf311356c", size = 211876 }, - { url = "https://files.pythonhosted.org/packages/70/e9/3d715ffd5b6b17a8be80cd14a8917a002530a99943cc1939ad5bb2aa74b9/coverage-7.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76090fab50610798cc05241bf83b603477c40ee87acd358b66196ab0ca44ffa1", size = 212130 }, - { url = "https://files.pythonhosted.org/packages/a0/02/fdce62bb3c21649abfd91fbdcf041fb99be0d728ff00f3f9d54d97ed683e/coverage-7.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bd0a0a5054be160777a7920b731a0570284db5142abaaf81bcbb282b8d99279", size = 246176 }, - { url = "https://files.pythonhosted.org/packages/a7/52/decbbed61e03b6ffe85cd0fea360a5e04a5a98a7423f292aae62423b8557/coverage-7.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da23ce9a3d356d0affe9c7036030b5c8f14556bd970c9b224f9c8205505e3b99", size = 243068 }, - { url = "https://files.pythonhosted.org/packages/38/6c/d0e9c0cce18faef79a52778219a3c6ee8e336437da8eddd4ab3dbd8fadff/coverage-7.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9392773cffeb8d7e042a7b15b82a414011e9d2b5fdbbd3f7e6a6b17d5e21b20", size = 245328 }, - { url = "https://files.pythonhosted.org/packages/f0/70/f703b553a2f6b6c70568c7e398ed0789d47f953d67fbba36a327714a7bca/coverage-7.8.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:876cbfd0b09ce09d81585d266c07a32657beb3eaec896f39484b631555be0fe2", size = 245099 }, - { url = "https://files.pythonhosted.org/packages/ec/fb/4cbb370dedae78460c3aacbdad9d249e853f3bc4ce5ff0e02b1983d03044/coverage-7.8.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3da9b771c98977a13fbc3830f6caa85cae6c9c83911d24cb2d218e9394259c57", size = 243314 }, - { url = "https://files.pythonhosted.org/packages/39/9f/1afbb2cb9c8699b8bc38afdce00a3b4644904e6a38c7bf9005386c9305ec/coverage-7.8.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a990f6510b3292686713bfef26d0049cd63b9c7bb17e0864f133cbfd2e6167f", size = 244489 }, - { url = "https://files.pythonhosted.org/packages/79/fa/f3e7ec7d220bff14aba7a4786ae47043770cbdceeea1803083059c878837/coverage-7.8.2-cp312-cp312-win32.whl", hash = "sha256:bf8111cddd0f2b54d34e96613e7fbdd59a673f0cf5574b61134ae75b6f5a33b8", size = 214366 }, - { url = "https://files.pythonhosted.org/packages/54/aa/9cbeade19b7e8e853e7ffc261df885d66bf3a782c71cba06c17df271f9e6/coverage-7.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:86a323a275e9e44cdf228af9b71c5030861d4d2610886ab920d9945672a81223", size = 215165 }, - { url = "https://files.pythonhosted.org/packages/c4/73/e2528bf1237d2448f882bbebaec5c3500ef07301816c5c63464b9da4d88a/coverage-7.8.2-cp312-cp312-win_arm64.whl", hash = "sha256:820157de3a589e992689ffcda8639fbabb313b323d26388d02e154164c57b07f", size = 213548 }, - { url = "https://files.pythonhosted.org/packages/1a/93/eb6400a745ad3b265bac36e8077fdffcf0268bdbbb6c02b7220b624c9b31/coverage-7.8.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ea561010914ec1c26ab4188aef8b1567272ef6de096312716f90e5baa79ef8ca", size = 211898 }, - { url = "https://files.pythonhosted.org/packages/1b/7c/bdbf113f92683024406a1cd226a199e4200a2001fc85d6a6e7e299e60253/coverage-7.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cb86337a4fcdd0e598ff2caeb513ac604d2f3da6d53df2c8e368e07ee38e277d", size = 212171 }, - { url = "https://files.pythonhosted.org/packages/91/22/594513f9541a6b88eb0dba4d5da7d71596dadef6b17a12dc2c0e859818a9/coverage-7.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a4636ddb666971345541b59899e969f3b301143dd86b0ddbb570bd591f1e85", size = 245564 }, - { url = "https://files.pythonhosted.org/packages/1f/f4/2860fd6abeebd9f2efcfe0fd376226938f22afc80c1943f363cd3c28421f/coverage-7.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5040536cf9b13fb033f76bcb5e1e5cb3b57c4807fef37db9e0ed129c6a094257", size = 242719 }, - { url = "https://files.pythonhosted.org/packages/89/60/f5f50f61b6332451520e6cdc2401700c48310c64bc2dd34027a47d6ab4ca/coverage-7.8.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc67994df9bcd7e0150a47ef41278b9e0a0ea187caba72414b71dc590b99a108", size = 244634 }, - { url = "https://files.pythonhosted.org/packages/3b/70/7f4e919039ab7d944276c446b603eea84da29ebcf20984fb1fdf6e602028/coverage-7.8.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e6c86888fd076d9e0fe848af0a2142bf606044dc5ceee0aa9eddb56e26895a0", size = 244824 }, - { url = "https://files.pythonhosted.org/packages/26/45/36297a4c0cea4de2b2c442fe32f60c3991056c59cdc3cdd5346fbb995c97/coverage-7.8.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:684ca9f58119b8e26bef860db33524ae0365601492e86ba0b71d513f525e7050", size = 242872 }, - { url = "https://files.pythonhosted.org/packages/a4/71/e041f1b9420f7b786b1367fa2a375703889ef376e0d48de9f5723fb35f11/coverage-7.8.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8165584ddedb49204c4e18da083913bdf6a982bfb558632a79bdaadcdafd0d48", size = 244179 }, - { url = "https://files.pythonhosted.org/packages/bd/db/3c2bf49bdc9de76acf2491fc03130c4ffc51469ce2f6889d2640eb563d77/coverage-7.8.2-cp313-cp313-win32.whl", hash = "sha256:34759ee2c65362163699cc917bdb2a54114dd06d19bab860725f94ef45a3d9b7", size = 214393 }, - { url = "https://files.pythonhosted.org/packages/c6/dc/947e75d47ebbb4b02d8babb1fad4ad381410d5bc9da7cfca80b7565ef401/coverage-7.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:2f9bc608fbafaee40eb60a9a53dbfb90f53cc66d3d32c2849dc27cf5638a21e3", size = 215194 }, - { url = "https://files.pythonhosted.org/packages/90/31/a980f7df8a37eaf0dc60f932507fda9656b3a03f0abf188474a0ea188d6d/coverage-7.8.2-cp313-cp313-win_arm64.whl", hash = "sha256:9fe449ee461a3b0c7105690419d0b0aba1232f4ff6d120a9e241e58a556733f7", size = 213580 }, - { url = "https://files.pythonhosted.org/packages/8a/6a/25a37dd90f6c95f59355629417ebcb74e1c34e38bb1eddf6ca9b38b0fc53/coverage-7.8.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8369a7c8ef66bded2b6484053749ff220dbf83cba84f3398c84c51a6f748a008", size = 212734 }, - { url = "https://files.pythonhosted.org/packages/36/8b/3a728b3118988725f40950931abb09cd7f43b3c740f4640a59f1db60e372/coverage-7.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:159b81df53a5fcbc7d45dae3adad554fdbde9829a994e15227b3f9d816d00b36", size = 212959 }, - { url = "https://files.pythonhosted.org/packages/53/3c/212d94e6add3a3c3f412d664aee452045ca17a066def8b9421673e9482c4/coverage-7.8.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6fcbbd35a96192d042c691c9e0c49ef54bd7ed865846a3c9d624c30bb67ce46", size = 257024 }, - { url = "https://files.pythonhosted.org/packages/a4/40/afc03f0883b1e51bbe804707aae62e29c4e8c8bbc365c75e3e4ddeee9ead/coverage-7.8.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05364b9cc82f138cc86128dc4e2e1251c2981a2218bfcd556fe6b0fbaa3501be", size = 252867 }, - { url = "https://files.pythonhosted.org/packages/18/a2/3699190e927b9439c6ded4998941a3c1d6fa99e14cb28d8536729537e307/coverage-7.8.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46d532db4e5ff3979ce47d18e2fe8ecad283eeb7367726da0e5ef88e4fe64740", size = 255096 }, - { url = "https://files.pythonhosted.org/packages/b4/06/16e3598b9466456b718eb3e789457d1a5b8bfb22e23b6e8bbc307df5daf0/coverage-7.8.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4000a31c34932e7e4fa0381a3d6deb43dc0c8f458e3e7ea6502e6238e10be625", size = 256276 }, - { url = "https://files.pythonhosted.org/packages/a7/d5/4b5a120d5d0223050a53d2783c049c311eea1709fa9de12d1c358e18b707/coverage-7.8.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:43ff5033d657cd51f83015c3b7a443287250dc14e69910577c3e03bd2e06f27b", size = 254478 }, - { url = "https://files.pythonhosted.org/packages/ba/85/f9ecdb910ecdb282b121bfcaa32fa8ee8cbd7699f83330ee13ff9bbf1a85/coverage-7.8.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94316e13f0981cbbba132c1f9f365cac1d26716aaac130866ca812006f662199", size = 255255 }, - { url = "https://files.pythonhosted.org/packages/50/63/2d624ac7d7ccd4ebbd3c6a9eba9d7fc4491a1226071360d59dd84928ccb2/coverage-7.8.2-cp313-cp313t-win32.whl", hash = "sha256:3f5673888d3676d0a745c3d0e16da338c5eea300cb1f4ada9c872981265e76d8", size = 215109 }, - { url = "https://files.pythonhosted.org/packages/22/5e/7053b71462e970e869111c1853afd642212568a350eba796deefdfbd0770/coverage-7.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:2c08b05ee8d7861e45dc5a2cc4195c8c66dca5ac613144eb6ebeaff2d502e73d", size = 216268 }, - { url = "https://files.pythonhosted.org/packages/07/69/afa41aa34147655543dbe96994f8a246daf94b361ccf5edfd5df62ce066a/coverage-7.8.2-cp313-cp313t-win_arm64.whl", hash = "sha256:1e1448bb72b387755e1ff3ef1268a06617afd94188164960dba8d0245a46004b", size = 214071 }, - { url = "https://files.pythonhosted.org/packages/69/2f/572b29496d8234e4a7773200dd835a0d32d9e171f2d974f3fe04a9dbc271/coverage-7.8.2-pp39.pp310.pp311-none-any.whl", hash = "sha256:ec455eedf3ba0bbdf8f5a570012617eb305c63cb9f03428d39bf544cb2b94837", size = 203636 }, - { url = "https://files.pythonhosted.org/packages/a0/1a/0b9c32220ad694d66062f571cc5cedfa9997b64a591e8a500bb63de1bd40/coverage-7.8.2-py3-none-any.whl", hash = "sha256:726f32ee3713f7359696331a18daf0c3b3a70bb0ae71141b9d3c52be7c595e32", size = 203623 }, +version = "7.9.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/e0/98670a80884f64578f0c22cd70c5e81a6e07b08167721c7487b4d70a7ca0/coverage-7.9.1.tar.gz", hash = "sha256:6cf43c78c4282708a28e466316935ec7489a9c487518a77fa68f716c67909cec", size = 813650 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/34/fa69372a07d0903a78ac103422ad34db72281c9fc625eba94ac1185da66f/coverage-7.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:95c765060e65c692da2d2f51a9499c5e9f5cf5453aeaf1420e3fc847cc060582", size = 212146 }, + { url = "https://files.pythonhosted.org/packages/27/f0/da1894915d2767f093f081c42afeba18e760f12fdd7a2f4acbe00564d767/coverage-7.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ba383dc6afd5ec5b7a0d0c23d38895db0e15bcba7fb0fa8901f245267ac30d86", size = 212536 }, + { url = "https://files.pythonhosted.org/packages/10/d5/3fc33b06e41e390f88eef111226a24e4504d216ab8e5d1a7089aa5a3c87a/coverage-7.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37ae0383f13cbdcf1e5e7014489b0d71cc0106458878ccde52e8a12ced4298ed", size = 245092 }, + { url = "https://files.pythonhosted.org/packages/0a/39/7aa901c14977aba637b78e95800edf77f29f5a380d29768c5b66f258305b/coverage-7.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69aa417a030bf11ec46149636314c24c8d60fadb12fc0ee8f10fda0d918c879d", size = 242806 }, + { url = "https://files.pythonhosted.org/packages/43/fc/30e5cfeaf560b1fc1989227adedc11019ce4bb7cce59d65db34fe0c2d963/coverage-7.9.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a4be2a28656afe279b34d4f91c3e26eccf2f85500d4a4ff0b1f8b54bf807338", size = 244610 }, + { url = "https://files.pythonhosted.org/packages/bf/15/cca62b13f39650bc87b2b92bb03bce7f0e79dd0bf2c7529e9fc7393e4d60/coverage-7.9.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:382e7ddd5289f140259b610e5f5c58f713d025cb2f66d0eb17e68d0a94278875", size = 244257 }, + { url = "https://files.pythonhosted.org/packages/cd/1a/c0f2abe92c29e1464dbd0ff9d56cb6c88ae2b9e21becdb38bea31fcb2f6c/coverage-7.9.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e5532482344186c543c37bfad0ee6069e8ae4fc38d073b8bc836fc8f03c9e250", size = 242309 }, + { url = "https://files.pythonhosted.org/packages/57/8d/c6fd70848bd9bf88fa90df2af5636589a8126d2170f3aade21ed53f2b67a/coverage-7.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a39d18b3f50cc121d0ce3838d32d58bd1d15dab89c910358ebefc3665712256c", size = 242898 }, + { url = "https://files.pythonhosted.org/packages/c2/9e/6ca46c7bff4675f09a66fe2797cd1ad6a24f14c9c7c3b3ebe0470a6e30b8/coverage-7.9.1-cp311-cp311-win32.whl", hash = "sha256:dd24bd8d77c98557880def750782df77ab2b6885a18483dc8588792247174b32", size = 214561 }, + { url = "https://files.pythonhosted.org/packages/a1/30/166978c6302010742dabcdc425fa0f938fa5a800908e39aff37a7a876a13/coverage-7.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:6b55ad10a35a21b8015eabddc9ba31eb590f54adc9cd39bcf09ff5349fd52125", size = 215493 }, + { url = "https://files.pythonhosted.org/packages/60/07/a6d2342cd80a5be9f0eeab115bc5ebb3917b4a64c2953534273cf9bc7ae6/coverage-7.9.1-cp311-cp311-win_arm64.whl", hash = "sha256:6ad935f0016be24c0e97fc8c40c465f9c4b85cbbe6eac48934c0dc4d2568321e", size = 213869 }, + { url = "https://files.pythonhosted.org/packages/68/d9/7f66eb0a8f2fce222de7bdc2046ec41cb31fe33fb55a330037833fb88afc/coverage-7.9.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8de12b4b87c20de895f10567639c0797b621b22897b0af3ce4b4e204a743626", size = 212336 }, + { url = "https://files.pythonhosted.org/packages/20/20/e07cb920ef3addf20f052ee3d54906e57407b6aeee3227a9c91eea38a665/coverage-7.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5add197315a054e92cee1b5f686a2bcba60c4c3e66ee3de77ace6c867bdee7cb", size = 212571 }, + { url = "https://files.pythonhosted.org/packages/78/f8/96f155de7e9e248ca9c8ff1a40a521d944ba48bec65352da9be2463745bf/coverage-7.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:600a1d4106fe66f41e5d0136dfbc68fe7200a5cbe85610ddf094f8f22e1b0300", size = 246377 }, + { url = "https://files.pythonhosted.org/packages/3e/cf/1d783bd05b7bca5c10ded5f946068909372e94615a4416afadfe3f63492d/coverage-7.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a876e4c3e5a2a1715a6608906aa5a2e0475b9c0f68343c2ada98110512ab1d8", size = 243394 }, + { url = "https://files.pythonhosted.org/packages/02/dd/e7b20afd35b0a1abea09fb3998e1abc9f9bd953bee548f235aebd2b11401/coverage-7.9.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81f34346dd63010453922c8e628a52ea2d2ccd73cb2487f7700ac531b247c8a5", size = 245586 }, + { url = "https://files.pythonhosted.org/packages/4e/38/b30b0006fea9d617d1cb8e43b1bc9a96af11eff42b87eb8c716cf4d37469/coverage-7.9.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:888f8eee13f2377ce86d44f338968eedec3291876b0b8a7289247ba52cb984cd", size = 245396 }, + { url = "https://files.pythonhosted.org/packages/31/e4/4d8ec1dc826e16791f3daf1b50943e8e7e1eb70e8efa7abb03936ff48418/coverage-7.9.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9969ef1e69b8c8e1e70d591f91bbc37fc9a3621e447525d1602801a24ceda898", size = 243577 }, + { url = "https://files.pythonhosted.org/packages/25/f4/b0e96c5c38e6e40ef465c4bc7f138863e2909c00e54a331da335faf0d81a/coverage-7.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:60c458224331ee3f1a5b472773e4a085cc27a86a0b48205409d364272d67140d", size = 244809 }, + { url = "https://files.pythonhosted.org/packages/8a/65/27e0a1fa5e2e5079bdca4521be2f5dabf516f94e29a0defed35ac2382eb2/coverage-7.9.1-cp312-cp312-win32.whl", hash = "sha256:5f646a99a8c2b3ff4c6a6e081f78fad0dde275cd59f8f49dc4eab2e394332e74", size = 214724 }, + { url = "https://files.pythonhosted.org/packages/9b/a8/d5b128633fd1a5e0401a4160d02fa15986209a9e47717174f99dc2f7166d/coverage-7.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:30f445f85c353090b83e552dcbbdad3ec84c7967e108c3ae54556ca69955563e", size = 215535 }, + { url = "https://files.pythonhosted.org/packages/a3/37/84bba9d2afabc3611f3e4325ee2c6a47cd449b580d4a606b240ce5a6f9bf/coverage-7.9.1-cp312-cp312-win_arm64.whl", hash = "sha256:af41da5dca398d3474129c58cb2b106a5d93bbb196be0d307ac82311ca234342", size = 213904 }, + { url = "https://files.pythonhosted.org/packages/d0/a7/a027970c991ca90f24e968999f7d509332daf6b8c3533d68633930aaebac/coverage-7.9.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:31324f18d5969feef7344a932c32428a2d1a3e50b15a6404e97cba1cc9b2c631", size = 212358 }, + { url = "https://files.pythonhosted.org/packages/f2/48/6aaed3651ae83b231556750280682528fea8ac7f1232834573472d83e459/coverage-7.9.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0c804506d624e8a20fb3108764c52e0eef664e29d21692afa375e0dd98dc384f", size = 212620 }, + { url = "https://files.pythonhosted.org/packages/6c/2a/f4b613f3b44d8b9f144847c89151992b2b6b79cbc506dee89ad0c35f209d/coverage-7.9.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef64c27bc40189f36fcc50c3fb8f16ccda73b6a0b80d9bd6e6ce4cffcd810bbd", size = 245788 }, + { url = "https://files.pythonhosted.org/packages/04/d2/de4fdc03af5e4e035ef420ed26a703c6ad3d7a07aff2e959eb84e3b19ca8/coverage-7.9.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4fe2348cc6ec372e25adec0219ee2334a68d2f5222e0cba9c0d613394e12d86", size = 243001 }, + { url = "https://files.pythonhosted.org/packages/f5/e8/eed18aa5583b0423ab7f04e34659e51101135c41cd1dcb33ac1d7013a6d6/coverage-7.9.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34ed2186fe52fcc24d4561041979a0dec69adae7bce2ae8d1c49eace13e55c43", size = 244985 }, + { url = "https://files.pythonhosted.org/packages/17/f8/ae9e5cce8885728c934eaa58ebfa8281d488ef2afa81c3dbc8ee9e6d80db/coverage-7.9.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:25308bd3d00d5eedd5ae7d4357161f4df743e3c0240fa773ee1b0f75e6c7c0f1", size = 245152 }, + { url = "https://files.pythonhosted.org/packages/5a/c8/272c01ae792bb3af9b30fac14d71d63371db227980682836ec388e2c57c0/coverage-7.9.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73e9439310f65d55a5a1e0564b48e34f5369bee943d72c88378f2d576f5a5751", size = 243123 }, + { url = "https://files.pythonhosted.org/packages/8c/d0/2819a1e3086143c094ab446e3bdf07138527a7b88cb235c488e78150ba7a/coverage-7.9.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37ab6be0859141b53aa89412a82454b482c81cf750de4f29223d52268a86de67", size = 244506 }, + { url = "https://files.pythonhosted.org/packages/8b/4e/9f6117b89152df7b6112f65c7a4ed1f2f5ec8e60c4be8f351d91e7acc848/coverage-7.9.1-cp313-cp313-win32.whl", hash = "sha256:64bdd969456e2d02a8b08aa047a92d269c7ac1f47e0c977675d550c9a0863643", size = 214766 }, + { url = "https://files.pythonhosted.org/packages/27/0f/4b59f7c93b52c2c4ce7387c5a4e135e49891bb3b7408dcc98fe44033bbe0/coverage-7.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:be9e3f68ca9edb897c2184ad0eee815c635565dbe7a0e7e814dc1f7cbab92c0a", size = 215568 }, + { url = "https://files.pythonhosted.org/packages/09/1e/9679826336f8c67b9c39a359352882b24a8a7aee48d4c9cad08d38d7510f/coverage-7.9.1-cp313-cp313-win_arm64.whl", hash = "sha256:1c503289ffef1d5105d91bbb4d62cbe4b14bec4d13ca225f9c73cde9bb46207d", size = 213939 }, + { url = "https://files.pythonhosted.org/packages/bb/5b/5c6b4e7a407359a2e3b27bf9c8a7b658127975def62077d441b93a30dbe8/coverage-7.9.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0b3496922cb5f4215bf5caaef4cf12364a26b0be82e9ed6d050f3352cf2d7ef0", size = 213079 }, + { url = "https://files.pythonhosted.org/packages/a2/22/1e2e07279fd2fd97ae26c01cc2186e2258850e9ec125ae87184225662e89/coverage-7.9.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9565c3ab1c93310569ec0d86b017f128f027cab0b622b7af288696d7ed43a16d", size = 213299 }, + { url = "https://files.pythonhosted.org/packages/14/c0/4c5125a4b69d66b8c85986d3321520f628756cf524af810baab0790c7647/coverage-7.9.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2241ad5dbf79ae1d9c08fe52b36d03ca122fb9ac6bca0f34439e99f8327ac89f", size = 256535 }, + { url = "https://files.pythonhosted.org/packages/81/8b/e36a04889dda9960be4263e95e777e7b46f1bb4fc32202612c130a20c4da/coverage-7.9.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bb5838701ca68b10ebc0937dbd0eb81974bac54447c55cd58dea5bca8451029", size = 252756 }, + { url = "https://files.pythonhosted.org/packages/98/82/be04eff8083a09a4622ecd0e1f31a2c563dbea3ed848069e7b0445043a70/coverage-7.9.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b30a25f814591a8c0c5372c11ac8967f669b97444c47fd794926e175c4047ece", size = 254912 }, + { url = "https://files.pythonhosted.org/packages/0f/25/c26610a2c7f018508a5ab958e5b3202d900422cf7cdca7670b6b8ca4e8df/coverage-7.9.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2d04b16a6062516df97969f1ae7efd0de9c31eb6ebdceaa0d213b21c0ca1a683", size = 256144 }, + { url = "https://files.pythonhosted.org/packages/c5/8b/fb9425c4684066c79e863f1e6e7ecebb49e3a64d9f7f7860ef1688c56f4a/coverage-7.9.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7931b9e249edefb07cd6ae10c702788546341d5fe44db5b6108a25da4dca513f", size = 254257 }, + { url = "https://files.pythonhosted.org/packages/93/df/27b882f54157fc1131e0e215b0da3b8d608d9b8ef79a045280118a8f98fe/coverage-7.9.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:52e92b01041151bf607ee858e5a56c62d4b70f4dac85b8c8cb7fb8a351ab2c10", size = 255094 }, + { url = "https://files.pythonhosted.org/packages/41/5f/cad1c3dbed8b3ee9e16fa832afe365b4e3eeab1fb6edb65ebbf745eabc92/coverage-7.9.1-cp313-cp313t-win32.whl", hash = "sha256:684e2110ed84fd1ca5f40e89aa44adf1729dc85444004111aa01866507adf363", size = 215437 }, + { url = "https://files.pythonhosted.org/packages/99/4d/fad293bf081c0e43331ca745ff63673badc20afea2104b431cdd8c278b4c/coverage-7.9.1-cp313-cp313t-win_amd64.whl", hash = "sha256:437c576979e4db840539674e68c84b3cda82bc824dd138d56bead1435f1cb5d7", size = 216605 }, + { url = "https://files.pythonhosted.org/packages/1f/56/4ee027d5965fc7fc126d7ec1187529cc30cc7d740846e1ecb5e92d31b224/coverage-7.9.1-cp313-cp313t-win_arm64.whl", hash = "sha256:18a0912944d70aaf5f399e350445738a1a20b50fbea788f640751c2ed9208b6c", size = 214392 }, + { url = "https://files.pythonhosted.org/packages/3e/e5/c723545c3fd3204ebde3b4cc4b927dce709d3b6dc577754bb57f63ca4a4a/coverage-7.9.1-pp39.pp310.pp311-none-any.whl", hash = "sha256:db0f04118d1db74db6c9e1cb1898532c7dcc220f1d2718f058601f7c3f499514", size = 204009 }, + { url = "https://files.pythonhosted.org/packages/08/b8/7ddd1e8ba9701dea08ce22029917140e6f66a859427406579fd8d0ca7274/coverage-7.9.1-py3-none-any.whl", hash = "sha256:66b974b145aa189516b6bf2d8423e888b742517d37872f6ee4c5be0073bd9a3c", size = 204000 }, ] [package.optional-dependencies] @@ -670,43 +658,43 @@ wheels = [ [[package]] name = "cryptography" -version = "45.0.3" +version = "45.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/13/1f/9fa001e74a1993a9cadd2333bb889e50c66327b8594ac538ab8a04f915b7/cryptography-45.0.3.tar.gz", hash = "sha256:ec21313dd335c51d7877baf2972569f40a4291b76a0ce51391523ae358d05899", size = 744738 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/82/b2/2345dc595998caa6f68adf84e8f8b50d18e9fc4638d32b22ea8daedd4b7a/cryptography-45.0.3-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:7573d9eebaeceeb55285205dbbb8753ac1e962af3d9640791d12b36864065e71", size = 7056239 }, - { url = "https://files.pythonhosted.org/packages/71/3d/ac361649a0bfffc105e2298b720d8b862330a767dab27c06adc2ddbef96a/cryptography-45.0.3-cp311-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d377dde61c5d67eb4311eace661c3efda46c62113ff56bf05e2d679e02aebb5b", size = 4205541 }, - { url = "https://files.pythonhosted.org/packages/70/3e/c02a043750494d5c445f769e9c9f67e550d65060e0bfce52d91c1362693d/cryptography-45.0.3-cp311-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fae1e637f527750811588e4582988932c222f8251f7b7ea93739acb624e1487f", size = 4433275 }, - { url = "https://files.pythonhosted.org/packages/40/7a/9af0bfd48784e80eef3eb6fd6fde96fe706b4fc156751ce1b2b965dada70/cryptography-45.0.3-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ca932e11218bcc9ef812aa497cdf669484870ecbcf2d99b765d6c27a86000942", size = 4209173 }, - { url = "https://files.pythonhosted.org/packages/31/5f/d6f8753c8708912df52e67969e80ef70b8e8897306cd9eb8b98201f8c184/cryptography-45.0.3-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:af3f92b1dc25621f5fad065288a44ac790c5798e986a34d393ab27d2b27fcff9", size = 3898150 }, - { url = "https://files.pythonhosted.org/packages/8b/50/f256ab79c671fb066e47336706dc398c3b1e125f952e07d54ce82cf4011a/cryptography-45.0.3-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2f8f8f0b73b885ddd7f3d8c2b2234a7d3ba49002b0223f58cfde1bedd9563c56", size = 4466473 }, - { url = "https://files.pythonhosted.org/packages/62/e7/312428336bb2df0848d0768ab5a062e11a32d18139447a76dfc19ada8eed/cryptography-45.0.3-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:9cc80ce69032ffa528b5e16d217fa4d8d4bb7d6ba8659c1b4d74a1b0f4235fca", size = 4211890 }, - { url = "https://files.pythonhosted.org/packages/e7/53/8a130e22c1e432b3c14896ec5eb7ac01fb53c6737e1d705df7e0efb647c6/cryptography-45.0.3-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c824c9281cb628015bfc3c59335163d4ca0540d49de4582d6c2637312907e4b1", size = 4466300 }, - { url = "https://files.pythonhosted.org/packages/ba/75/6bb6579688ef805fd16a053005fce93944cdade465fc92ef32bbc5c40681/cryptography-45.0.3-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:5833bb4355cb377ebd880457663a972cd044e7f49585aee39245c0d592904578", size = 4332483 }, - { url = "https://files.pythonhosted.org/packages/2f/11/2538f4e1ce05c6c4f81f43c1ef2bd6de7ae5e24ee284460ff6c77e42ca77/cryptography-45.0.3-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9bb5bf55dcb69f7067d80354d0a348368da907345a2c448b0babc4215ccd3497", size = 4573714 }, - { url = "https://files.pythonhosted.org/packages/f5/bb/e86e9cf07f73a98d84a4084e8fd420b0e82330a901d9cac8149f994c3417/cryptography-45.0.3-cp311-abi3-win32.whl", hash = "sha256:3ad69eeb92a9de9421e1f6685e85a10fbcfb75c833b42cc9bc2ba9fb00da4710", size = 2934752 }, - { url = "https://files.pythonhosted.org/packages/c7/75/063bc9ddc3d1c73e959054f1fc091b79572e716ef74d6caaa56e945b4af9/cryptography-45.0.3-cp311-abi3-win_amd64.whl", hash = "sha256:97787952246a77d77934d41b62fb1b6f3581d83f71b44796a4158d93b8f5c490", size = 3412465 }, - { url = "https://files.pythonhosted.org/packages/71/9b/04ead6015229a9396890d7654ee35ef630860fb42dc9ff9ec27f72157952/cryptography-45.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:c92519d242703b675ccefd0f0562eb45e74d438e001f8ab52d628e885751fb06", size = 7031892 }, - { url = "https://files.pythonhosted.org/packages/46/c7/c7d05d0e133a09fc677b8a87953815c522697bdf025e5cac13ba419e7240/cryptography-45.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5edcb90da1843df85292ef3a313513766a78fbbb83f584a5a58fb001a5a9d57", size = 4196181 }, - { url = "https://files.pythonhosted.org/packages/08/7a/6ad3aa796b18a683657cef930a986fac0045417e2dc428fd336cfc45ba52/cryptography-45.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38deed72285c7ed699864f964a3f4cf11ab3fb38e8d39cfcd96710cd2b5bb716", size = 4423370 }, - { url = "https://files.pythonhosted.org/packages/4f/58/ec1461bfcb393525f597ac6a10a63938d18775b7803324072974b41a926b/cryptography-45.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5555365a50efe1f486eed6ac7062c33b97ccef409f5970a0b6f205a7cfab59c8", size = 4197839 }, - { url = "https://files.pythonhosted.org/packages/d4/3d/5185b117c32ad4f40846f579369a80e710d6146c2baa8ce09d01612750db/cryptography-45.0.3-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9e4253ed8f5948a3589b3caee7ad9a5bf218ffd16869c516535325fece163dcc", size = 3886324 }, - { url = "https://files.pythonhosted.org/packages/67/85/caba91a57d291a2ad46e74016d1f83ac294f08128b26e2a81e9b4f2d2555/cryptography-45.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cfd84777b4b6684955ce86156cfb5e08d75e80dc2585e10d69e47f014f0a5342", size = 4450447 }, - { url = "https://files.pythonhosted.org/packages/ae/d1/164e3c9d559133a38279215c712b8ba38e77735d3412f37711b9f8f6f7e0/cryptography-45.0.3-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:a2b56de3417fd5f48773ad8e91abaa700b678dc7fe1e0c757e1ae340779acf7b", size = 4200576 }, - { url = "https://files.pythonhosted.org/packages/71/7a/e002d5ce624ed46dfc32abe1deff32190f3ac47ede911789ee936f5a4255/cryptography-45.0.3-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:57a6500d459e8035e813bd8b51b671977fb149a8c95ed814989da682314d0782", size = 4450308 }, - { url = "https://files.pythonhosted.org/packages/87/ad/3fbff9c28cf09b0a71e98af57d74f3662dea4a174b12acc493de00ea3f28/cryptography-45.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f22af3c78abfbc7cbcdf2c55d23c3e022e1a462ee2481011d518c7fb9c9f3d65", size = 4325125 }, - { url = "https://files.pythonhosted.org/packages/f5/b4/51417d0cc01802304c1984d76e9592f15e4801abd44ef7ba657060520bf0/cryptography-45.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:232954730c362638544758a8160c4ee1b832dc011d2c41a306ad8f7cccc5bb0b", size = 4560038 }, - { url = "https://files.pythonhosted.org/packages/80/38/d572f6482d45789a7202fb87d052deb7a7b136bf17473ebff33536727a2c/cryptography-45.0.3-cp37-abi3-win32.whl", hash = "sha256:cb6ab89421bc90e0422aca911c69044c2912fc3debb19bb3c1bfe28ee3dff6ab", size = 2924070 }, - { url = "https://files.pythonhosted.org/packages/91/5a/61f39c0ff4443651cc64e626fa97ad3099249152039952be8f344d6b0c86/cryptography-45.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:d54ae41e6bd70ea23707843021c778f151ca258081586f0cfa31d936ae43d1b2", size = 3395005 }, - { url = "https://files.pythonhosted.org/packages/e7/d4/58a246342093a66af8935d6aa59f790cbb4731adae3937b538d054bdc2f9/cryptography-45.0.3-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:edd6d51869beb7f0d472e902ef231a9b7689508e83880ea16ca3311a00bf5ce7", size = 3589802 }, - { url = "https://files.pythonhosted.org/packages/96/61/751ebea58c87b5be533c429f01996050a72c7283b59eee250275746632ea/cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:555e5e2d3a53b4fabeca32835878b2818b3f23966a4efb0d566689777c5a12c8", size = 4146964 }, - { url = "https://files.pythonhosted.org/packages/8d/01/28c90601b199964de383da0b740b5156f5d71a1da25e7194fdf793d373ef/cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:25286aacb947286620a31f78f2ed1a32cded7be5d8b729ba3fb2c988457639e4", size = 4388103 }, - { url = "https://files.pythonhosted.org/packages/3d/ec/cd892180b9e42897446ef35c62442f5b8b039c3d63a05f618aa87ec9ebb5/cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:050ce5209d5072472971e6efbfc8ec5a8f9a841de5a4db0ebd9c2e392cb81972", size = 4150031 }, - { url = "https://files.pythonhosted.org/packages/db/d4/22628c2dedd99289960a682439c6d3aa248dff5215123ead94ac2d82f3f5/cryptography-45.0.3-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:dc10ec1e9f21f33420cc05214989544727e776286c1c16697178978327b95c9c", size = 4387389 }, - { url = "https://files.pythonhosted.org/packages/39/ec/ba3961abbf8ecb79a3586a4ff0ee08c9d7a9938b4312fb2ae9b63f48a8ba/cryptography-45.0.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:9eda14f049d7f09c2e8fb411dda17dd6b16a3c76a1de5e249188a32aeb92de19", size = 3337432 }, +sdist = { url = "https://files.pythonhosted.org/packages/fe/c8/a2a376a8711c1e11708b9c9972e0c3223f5fc682552c82d8db844393d6ce/cryptography-45.0.4.tar.gz", hash = "sha256:7405ade85c83c37682c8fe65554759800a4a8c54b2d96e0f8ad114d31b808d57", size = 744890 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/1c/92637793de053832523b410dbe016d3f5c11b41d0cf6eef8787aabb51d41/cryptography-45.0.4-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:425a9a6ac2823ee6e46a76a21a4e8342d8fa5c01e08b823c1f19a8b74f096069", size = 7055712 }, + { url = "https://files.pythonhosted.org/packages/ba/14/93b69f2af9ba832ad6618a03f8a034a5851dc9a3314336a3d71c252467e1/cryptography-45.0.4-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:680806cf63baa0039b920f4976f5f31b10e772de42f16310a6839d9f21a26b0d", size = 4205335 }, + { url = "https://files.pythonhosted.org/packages/67/30/fae1000228634bf0b647fca80403db5ca9e3933b91dd060570689f0bd0f7/cryptography-45.0.4-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4ca0f52170e821bc8da6fc0cc565b7bb8ff8d90d36b5e9fdd68e8a86bdf72036", size = 4431487 }, + { url = "https://files.pythonhosted.org/packages/6d/5a/7dffcf8cdf0cb3c2430de7404b327e3db64735747d641fc492539978caeb/cryptography-45.0.4-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f3fe7a5ae34d5a414957cc7f457e2b92076e72938423ac64d215722f6cf49a9e", size = 4208922 }, + { url = "https://files.pythonhosted.org/packages/c6/f3/528729726eb6c3060fa3637253430547fbaaea95ab0535ea41baa4a6fbd8/cryptography-45.0.4-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:25eb4d4d3e54595dc8adebc6bbd5623588991d86591a78c2548ffb64797341e2", size = 3900433 }, + { url = "https://files.pythonhosted.org/packages/d9/4a/67ba2e40f619e04d83c32f7e1d484c1538c0800a17c56a22ff07d092ccc1/cryptography-45.0.4-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ce1678a2ccbe696cf3af15a75bb72ee008d7ff183c9228592ede9db467e64f1b", size = 4464163 }, + { url = "https://files.pythonhosted.org/packages/7e/9a/b4d5aa83661483ac372464809c4b49b5022dbfe36b12fe9e323ca8512420/cryptography-45.0.4-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:49fe9155ab32721b9122975e168a6760d8ce4cffe423bcd7ca269ba41b5dfac1", size = 4208687 }, + { url = "https://files.pythonhosted.org/packages/db/b7/a84bdcd19d9c02ec5807f2ec2d1456fd8451592c5ee353816c09250e3561/cryptography-45.0.4-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2882338b2a6e0bd337052e8b9007ced85c637da19ef9ecaf437744495c8c2999", size = 4463623 }, + { url = "https://files.pythonhosted.org/packages/d8/84/69707d502d4d905021cac3fb59a316344e9f078b1da7fb43ecde5e10840a/cryptography-45.0.4-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:23b9c3ea30c3ed4db59e7b9619272e94891f8a3a5591d0b656a7582631ccf750", size = 4332447 }, + { url = "https://files.pythonhosted.org/packages/f3/ee/d4f2ab688e057e90ded24384e34838086a9b09963389a5ba6854b5876598/cryptography-45.0.4-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0a97c927497e3bc36b33987abb99bf17a9a175a19af38a892dc4bbb844d7ee2", size = 4572830 }, + { url = "https://files.pythonhosted.org/packages/70/d4/994773a261d7ff98034f72c0e8251fe2755eac45e2265db4c866c1c6829c/cryptography-45.0.4-cp311-abi3-win32.whl", hash = "sha256:e00a6c10a5c53979d6242f123c0a97cff9f3abed7f064fc412c36dc521b5f257", size = 2932769 }, + { url = "https://files.pythonhosted.org/packages/5a/42/c80bd0b67e9b769b364963b5252b17778a397cefdd36fa9aa4a5f34c599a/cryptography-45.0.4-cp311-abi3-win_amd64.whl", hash = "sha256:817ee05c6c9f7a69a16200f0c90ab26d23a87701e2a284bd15156783e46dbcc8", size = 3410441 }, + { url = "https://files.pythonhosted.org/packages/ce/0b/2488c89f3a30bc821c9d96eeacfcab6ff3accc08a9601ba03339c0fd05e5/cryptography-45.0.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:964bcc28d867e0f5491a564b7debb3ffdd8717928d315d12e0d7defa9e43b723", size = 7031836 }, + { url = "https://files.pythonhosted.org/packages/fe/51/8c584ed426093aac257462ae62d26ad61ef1cbf5b58d8b67e6e13c39960e/cryptography-45.0.4-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6a5bf57554e80f75a7db3d4b1dacaa2764611ae166ab42ea9a72bcdb5d577637", size = 4195746 }, + { url = "https://files.pythonhosted.org/packages/5c/7d/4b0ca4d7af95a704eef2f8f80a8199ed236aaf185d55385ae1d1610c03c2/cryptography-45.0.4-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:46cf7088bf91bdc9b26f9c55636492c1cce3e7aaf8041bbf0243f5e5325cfb2d", size = 4424456 }, + { url = "https://files.pythonhosted.org/packages/1d/45/5fabacbc6e76ff056f84d9f60eeac18819badf0cefc1b6612ee03d4ab678/cryptography-45.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7bedbe4cc930fa4b100fc845ea1ea5788fcd7ae9562e669989c11618ae8d76ee", size = 4198495 }, + { url = "https://files.pythonhosted.org/packages/55/b7/ffc9945b290eb0a5d4dab9b7636706e3b5b92f14ee5d9d4449409d010d54/cryptography-45.0.4-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:eaa3e28ea2235b33220b949c5a0d6cf79baa80eab2eb5607ca8ab7525331b9ff", size = 3885540 }, + { url = "https://files.pythonhosted.org/packages/7f/e3/57b010282346980475e77d414080acdcb3dab9a0be63071efc2041a2c6bd/cryptography-45.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:7ef2dde4fa9408475038fc9aadfc1fb2676b174e68356359632e980c661ec8f6", size = 4452052 }, + { url = "https://files.pythonhosted.org/packages/37/e6/ddc4ac2558bf2ef517a358df26f45bc774a99bf4653e7ee34b5e749c03e3/cryptography-45.0.4-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:6a3511ae33f09094185d111160fd192c67aa0a2a8d19b54d36e4c78f651dc5ad", size = 4198024 }, + { url = "https://files.pythonhosted.org/packages/3a/c0/85fa358ddb063ec588aed4a6ea1df57dc3e3bc1712d87c8fa162d02a65fc/cryptography-45.0.4-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:06509dc70dd71fa56eaa138336244e2fbaf2ac164fc9b5e66828fccfd2b680d6", size = 4451442 }, + { url = "https://files.pythonhosted.org/packages/33/67/362d6ec1492596e73da24e669a7fbbaeb1c428d6bf49a29f7a12acffd5dc/cryptography-45.0.4-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:5f31e6b0a5a253f6aa49be67279be4a7e5a4ef259a9f33c69f7d1b1191939872", size = 4325038 }, + { url = "https://files.pythonhosted.org/packages/53/75/82a14bf047a96a1b13ebb47fb9811c4f73096cfa2e2b17c86879687f9027/cryptography-45.0.4-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:944e9ccf67a9594137f942d5b52c8d238b1b4e46c7a0c2891b7ae6e01e7c80a4", size = 4560964 }, + { url = "https://files.pythonhosted.org/packages/cd/37/1a3cba4c5a468ebf9b95523a5ef5651244693dc712001e276682c278fc00/cryptography-45.0.4-cp37-abi3-win32.whl", hash = "sha256:c22fe01e53dc65edd1945a2e6f0015e887f84ced233acecb64b4daadb32f5c97", size = 2924557 }, + { url = "https://files.pythonhosted.org/packages/2a/4b/3256759723b7e66380397d958ca07c59cfc3fb5c794fb5516758afd05d41/cryptography-45.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:627ba1bc94f6adf0b0a2e35d87020285ead22d9f648c7e75bb64f367375f3b22", size = 3395508 }, + { url = "https://files.pythonhosted.org/packages/ea/ba/cf442ae99ef363855ed84b39e0fb3c106ac66b7a7703f3c9c9cfe05412cb/cryptography-45.0.4-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4828190fb6c4bcb6ebc6331f01fe66ae838bb3bd58e753b59d4b22eb444b996c", size = 3590512 }, + { url = "https://files.pythonhosted.org/packages/28/9a/a7d5bb87d149eb99a5abdc69a41e4e47b8001d767e5f403f78bfaafc7aa7/cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:03dbff8411206713185b8cebe31bc5c0eb544799a50c09035733716b386e61a4", size = 4146899 }, + { url = "https://files.pythonhosted.org/packages/17/11/9361c2c71c42cc5c465cf294c8030e72fb0c87752bacbd7a3675245e3db3/cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51dfbd4d26172d31150d84c19bbe06c68ea4b7f11bbc7b3a5e146b367c311349", size = 4388900 }, + { url = "https://files.pythonhosted.org/packages/c0/76/f95b83359012ee0e670da3e41c164a0c256aeedd81886f878911581d852f/cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:0339a692de47084969500ee455e42c58e449461e0ec845a34a6a9b9bf7df7fb8", size = 4146422 }, + { url = "https://files.pythonhosted.org/packages/09/ad/5429fcc4def93e577a5407988f89cf15305e64920203d4ac14601a9dc876/cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:0cf13c77d710131d33e63626bd55ae7c0efb701ebdc2b3a7952b9b23a0412862", size = 4388475 }, + { url = "https://files.pythonhosted.org/packages/99/49/0ab9774f64555a1b50102757811508f5ace451cf5dc0a2d074a4b9deca6a/cryptography-45.0.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bbc505d1dc469ac12a0a064214879eac6294038d6b24ae9f71faae1448a9608d", size = 3337594 }, ] [[package]] @@ -826,18 +814,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0c/d5/c5db1ea3394c6e1732fb3286b3bd878b59507a8f77d32a2cebda7d7b7cd4/donfig-0.8.1.post1-py3-none-any.whl", hash = "sha256:2a3175ce74a06109ff9307d90a230f81215cbac9a751f4d1c6194644b8204f9d", size = 21592 }, ] -[[package]] -name = "dparse" -version = "0.6.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "packaging" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/29/ee/96c65e17222b973f0d3d0aa9bad6a59104ca1b0eb5b659c25c2900fccd85/dparse-0.6.4.tar.gz", hash = "sha256:90b29c39e3edc36c6284c82c4132648eaf28a01863eb3c231c2512196132201a", size = 27912 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/56/26/035d1c308882514a1e6ddca27f9d3e570d67a0e293e7b4d910a70c8fe32b/dparse-0.6.4-py3-none-any.whl", hash = "sha256:fbab4d50d54d0e739fbb4dedfc3d92771003a5b9aa8545ca7a7045e3b174af57", size = 11925 }, -] - [[package]] name = "executing" version = "2.2.0" @@ -858,11 +834,11 @@ wheels = [ [[package]] name = "filelock" -version = "3.16.1" +version = "3.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9d/db/3ef5bb276dae18d6ec2124224403d1d67bccdbefc17af4cc8f553e341ab1/filelock-3.16.1.tar.gz", hash = "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435", size = 18037 } +sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163 }, + { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215 }, ] [[package]] @@ -891,88 +867,88 @@ wheels = [ [[package]] name = "frozenlist" -version = "1.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/f4/d744cba2da59b5c1d88823cf9e8a6c74e4659e2b27604ed973be2a0bf5ab/frozenlist-1.6.0.tar.gz", hash = "sha256:b99655c32c1c8e06d111e7f41c06c29a5318cb1835df23a45518e02a47c63b68", size = 42831 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/53/b5/bc883b5296ec902115c00be161da93bf661199c465ec4c483feec6ea4c32/frozenlist-1.6.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae8337990e7a45683548ffb2fee1af2f1ed08169284cd829cdd9a7fa7470530d", size = 160912 }, - { url = "https://files.pythonhosted.org/packages/6f/93/51b058b563d0704b39c56baa222828043aafcac17fd3734bec5dbeb619b1/frozenlist-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c952f69dd524558694818a461855f35d36cc7f5c0adddce37e962c85d06eac0", size = 124315 }, - { url = "https://files.pythonhosted.org/packages/c9/e0/46cd35219428d350558b874d595e132d1c17a9471a1bd0d01d518a261e7c/frozenlist-1.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8f5fef13136c4e2dee91bfb9a44e236fff78fc2cd9f838eddfc470c3d7d90afe", size = 122230 }, - { url = "https://files.pythonhosted.org/packages/d1/0f/7ad2ce928ad06d6dd26a61812b959ded573d3e9d0ee6109d96c2be7172e9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:716bbba09611b4663ecbb7cd022f640759af8259e12a6ca939c0a6acd49eedba", size = 314842 }, - { url = "https://files.pythonhosted.org/packages/34/76/98cbbd8a20a5c3359a2004ae5e5b216af84a150ccbad67c8f8f30fb2ea91/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7b8c4dc422c1a3ffc550b465090e53b0bf4839047f3e436a34172ac67c45d595", size = 304919 }, - { url = "https://files.pythonhosted.org/packages/9a/fa/258e771ce3a44348c05e6b01dffc2bc67603fba95761458c238cd09a2c77/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b11534872256e1666116f6587a1592ef395a98b54476addb5e8d352925cb5d4a", size = 324074 }, - { url = "https://files.pythonhosted.org/packages/d5/a4/047d861fd8c538210e12b208c0479912273f991356b6bdee7ea8356b07c9/frozenlist-1.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c6eceb88aaf7221f75be6ab498dc622a151f5f88d536661af3ffc486245a626", size = 321292 }, - { url = "https://files.pythonhosted.org/packages/c0/25/cfec8af758b4525676cabd36efcaf7102c1348a776c0d1ad046b8a7cdc65/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62c828a5b195570eb4b37369fcbbd58e96c905768d53a44d13044355647838ff", size = 301569 }, - { url = "https://files.pythonhosted.org/packages/87/2f/0c819372fa9f0c07b153124bf58683b8d0ca7bb73ea5ccde9b9ef1745beb/frozenlist-1.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1c6bd2c6399920c9622362ce95a7d74e7f9af9bfec05fff91b8ce4b9647845a", size = 313625 }, - { url = "https://files.pythonhosted.org/packages/50/5f/f0cf8b0fdedffdb76b3745aa13d5dbe404d63493cc211ce8250f2025307f/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49ba23817781e22fcbd45fd9ff2b9b8cdb7b16a42a4851ab8025cae7b22e96d0", size = 312523 }, - { url = "https://files.pythonhosted.org/packages/e1/6c/38c49108491272d3e84125bbabf2c2d0b304899b52f49f0539deb26ad18d/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:431ef6937ae0f853143e2ca67d6da76c083e8b1fe3df0e96f3802fd37626e606", size = 322657 }, - { url = "https://files.pythonhosted.org/packages/bd/4b/3bd3bad5be06a9d1b04b1c22be80b5fe65b502992d62fab4bdb25d9366ee/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9d124b38b3c299ca68433597ee26b7819209cb8a3a9ea761dfe9db3a04bba584", size = 303414 }, - { url = "https://files.pythonhosted.org/packages/5b/89/7e225a30bef6e85dbfe22622c24afe932e9444de3b40d58b1ea589a14ef8/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:118e97556306402e2b010da1ef21ea70cb6d6122e580da64c056b96f524fbd6a", size = 320321 }, - { url = "https://files.pythonhosted.org/packages/22/72/7e3acef4dd9e86366cb8f4d8f28e852c2b7e116927e9722b31a6f71ea4b0/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fb3b309f1d4086b5533cf7bbcf3f956f0ae6469664522f1bde4feed26fba60f1", size = 323975 }, - { url = "https://files.pythonhosted.org/packages/d8/85/e5da03d20507e13c66ce612c9792b76811b7a43e3320cce42d95b85ac755/frozenlist-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54dece0d21dce4fdb188a1ffc555926adf1d1c516e493c2914d7c370e454bc9e", size = 316553 }, - { url = "https://files.pythonhosted.org/packages/ac/8e/6c609cbd0580ae8a0661c408149f196aade7d325b1ae7adc930501b81acb/frozenlist-1.6.0-cp311-cp311-win32.whl", hash = "sha256:654e4ba1d0b2154ca2f096bed27461cf6160bc7f504a7f9a9ef447c293caf860", size = 115511 }, - { url = "https://files.pythonhosted.org/packages/f2/13/a84804cfde6de12d44ed48ecbf777ba62b12ff09e761f76cdd1ff9e14bb1/frozenlist-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e911391bffdb806001002c1f860787542f45916c3baf764264a52765d5a5603", size = 120863 }, - { url = "https://files.pythonhosted.org/packages/9c/8a/289b7d0de2fbac832ea80944d809759976f661557a38bb8e77db5d9f79b7/frozenlist-1.6.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c5b9e42ace7d95bf41e19b87cec8f262c41d3510d8ad7514ab3862ea2197bfb1", size = 160193 }, - { url = "https://files.pythonhosted.org/packages/19/80/2fd17d322aec7f430549f0669f599997174f93ee17929ea5b92781ec902c/frozenlist-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ca9973735ce9f770d24d5484dcb42f68f135351c2fc81a7a9369e48cf2998a29", size = 123831 }, - { url = "https://files.pythonhosted.org/packages/99/06/f5812da431273f78c6543e0b2f7de67dfd65eb0a433978b2c9c63d2205e4/frozenlist-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6ac40ec76041c67b928ca8aaffba15c2b2ee3f5ae8d0cb0617b5e63ec119ca25", size = 121862 }, - { url = "https://files.pythonhosted.org/packages/d0/31/9e61c6b5fc493cf24d54881731204d27105234d09878be1a5983182cc4a5/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:95b7a8a3180dfb280eb044fdec562f9b461614c0ef21669aea6f1d3dac6ee576", size = 316361 }, - { url = "https://files.pythonhosted.org/packages/9d/55/22ca9362d4f0222324981470fd50192be200154d51509ee6eb9baa148e96/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c444d824e22da6c9291886d80c7d00c444981a72686e2b59d38b285617cb52c8", size = 307115 }, - { url = "https://files.pythonhosted.org/packages/ae/39/4fff42920a57794881e7bb3898dc7f5f539261711ea411b43bba3cde8b79/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb52c8166499a8150bfd38478248572c924c003cbb45fe3bcd348e5ac7c000f9", size = 322505 }, - { url = "https://files.pythonhosted.org/packages/55/f2/88c41f374c1e4cf0092a5459e5f3d6a1e17ed274c98087a76487783df90c/frozenlist-1.6.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b35298b2db9c2468106278537ee529719228950a5fdda686582f68f247d1dc6e", size = 322666 }, - { url = "https://files.pythonhosted.org/packages/75/51/034eeb75afdf3fd03997856195b500722c0b1a50716664cde64e28299c4b/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d108e2d070034f9d57210f22fefd22ea0d04609fc97c5f7f5a686b3471028590", size = 302119 }, - { url = "https://files.pythonhosted.org/packages/2b/a6/564ecde55ee633270a793999ef4fd1d2c2b32b5a7eec903b1012cb7c5143/frozenlist-1.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e1be9111cb6756868ac242b3c2bd1f09d9aea09846e4f5c23715e7afb647103", size = 316226 }, - { url = "https://files.pythonhosted.org/packages/f1/c8/6c0682c32377f402b8a6174fb16378b683cf6379ab4d2827c580892ab3c7/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:94bb451c664415f02f07eef4ece976a2c65dcbab9c2f1705b7031a3a75349d8c", size = 312788 }, - { url = "https://files.pythonhosted.org/packages/b6/b8/10fbec38f82c5d163ca1750bfff4ede69713badf236a016781cf1f10a0f0/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d1a686d0b0949182b8faddea596f3fc11f44768d1f74d4cad70213b2e139d821", size = 325914 }, - { url = "https://files.pythonhosted.org/packages/62/ca/2bf4f3a1bd40cdedd301e6ecfdbb291080d5afc5f9ce350c0739f773d6b9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:ea8e59105d802c5a38bdbe7362822c522230b3faba2aa35c0fa1765239b7dd70", size = 305283 }, - { url = "https://files.pythonhosted.org/packages/09/64/20cc13ccf94abc2a1f482f74ad210703dc78a590d0b805af1c9aa67f76f9/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:abc4e880a9b920bc5020bf6a431a6bb40589d9bca3975c980495f63632e8382f", size = 319264 }, - { url = "https://files.pythonhosted.org/packages/20/ff/86c6a2bbe98cfc231519f5e6d712a0898488ceac804a917ce014f32e68f6/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9a79713adfe28830f27a3c62f6b5406c37376c892b05ae070906f07ae4487046", size = 326482 }, - { url = "https://files.pythonhosted.org/packages/2f/da/8e381f66367d79adca245d1d71527aac774e30e291d41ef161ce2d80c38e/frozenlist-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a0318c2068e217a8f5e3b85e35899f5a19e97141a45bb925bb357cfe1daf770", size = 318248 }, - { url = "https://files.pythonhosted.org/packages/39/24/1a1976563fb476ab6f0fa9fefaac7616a4361dbe0461324f9fd7bf425dbe/frozenlist-1.6.0-cp312-cp312-win32.whl", hash = "sha256:853ac025092a24bb3bf09ae87f9127de9fe6e0c345614ac92536577cf956dfcc", size = 115161 }, - { url = "https://files.pythonhosted.org/packages/80/2e/fb4ed62a65f8cd66044706b1013f0010930d8cbb0729a2219561ea075434/frozenlist-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:2bdfe2d7e6c9281c6e55523acd6c2bf77963cb422fdc7d142fb0cb6621b66878", size = 120548 }, - { url = "https://files.pythonhosted.org/packages/6f/e5/04c7090c514d96ca00887932417f04343ab94904a56ab7f57861bf63652d/frozenlist-1.6.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1d7fb014fe0fbfee3efd6a94fc635aeaa68e5e1720fe9e57357f2e2c6e1a647e", size = 158182 }, - { url = "https://files.pythonhosted.org/packages/e9/8f/60d0555c61eec855783a6356268314d204137f5e0c53b59ae2fc28938c99/frozenlist-1.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01bcaa305a0fdad12745502bfd16a1c75b14558dabae226852f9159364573117", size = 122838 }, - { url = "https://files.pythonhosted.org/packages/5a/a7/d0ec890e3665b4b3b7c05dc80e477ed8dc2e2e77719368e78e2cd9fec9c8/frozenlist-1.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8b314faa3051a6d45da196a2c495e922f987dc848e967d8cfeaee8a0328b1cd4", size = 120980 }, - { url = "https://files.pythonhosted.org/packages/cc/19/9b355a5e7a8eba903a008579964192c3e427444752f20b2144b10bb336df/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da62fecac21a3ee10463d153549d8db87549a5e77eefb8c91ac84bb42bb1e4e3", size = 305463 }, - { url = "https://files.pythonhosted.org/packages/9c/8d/5b4c758c2550131d66935ef2fa700ada2461c08866aef4229ae1554b93ca/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1eb89bf3454e2132e046f9599fbcf0a4483ed43b40f545551a39316d0201cd1", size = 297985 }, - { url = "https://files.pythonhosted.org/packages/48/2c/537ec09e032b5865715726b2d1d9813e6589b571d34d01550c7aeaad7e53/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18689b40cb3936acd971f663ccb8e2589c45db5e2c5f07e0ec6207664029a9c", size = 311188 }, - { url = "https://files.pythonhosted.org/packages/31/2f/1aa74b33f74d54817055de9a4961eff798f066cdc6f67591905d4fc82a84/frozenlist-1.6.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e67ddb0749ed066b1a03fba812e2dcae791dd50e5da03be50b6a14d0c1a9ee45", size = 311874 }, - { url = "https://files.pythonhosted.org/packages/bf/f0/cfec18838f13ebf4b37cfebc8649db5ea71a1b25dacd691444a10729776c/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc5e64626e6682638d6e44398c9baf1d6ce6bc236d40b4b57255c9d3f9761f1f", size = 291897 }, - { url = "https://files.pythonhosted.org/packages/ea/a5/deb39325cbbea6cd0a46db8ccd76150ae2fcbe60d63243d9df4a0b8c3205/frozenlist-1.6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:437cfd39564744ae32ad5929e55b18ebd88817f9180e4cc05e7d53b75f79ce85", size = 305799 }, - { url = "https://files.pythonhosted.org/packages/78/22/6ddec55c5243a59f605e4280f10cee8c95a449f81e40117163383829c241/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:62dd7df78e74d924952e2feb7357d826af8d2f307557a779d14ddf94d7311be8", size = 302804 }, - { url = "https://files.pythonhosted.org/packages/5d/b7/d9ca9bab87f28855063c4d202936800219e39db9e46f9fb004d521152623/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:a66781d7e4cddcbbcfd64de3d41a61d6bdde370fc2e38623f30b2bd539e84a9f", size = 316404 }, - { url = "https://files.pythonhosted.org/packages/a6/3a/1255305db7874d0b9eddb4fe4a27469e1fb63720f1fc6d325a5118492d18/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:482fe06e9a3fffbcd41950f9d890034b4a54395c60b5e61fae875d37a699813f", size = 295572 }, - { url = "https://files.pythonhosted.org/packages/2a/f2/8d38eeee39a0e3a91b75867cc102159ecccf441deb6ddf67be96d3410b84/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:e4f9373c500dfc02feea39f7a56e4f543e670212102cc2eeb51d3a99c7ffbde6", size = 307601 }, - { url = "https://files.pythonhosted.org/packages/38/04/80ec8e6b92f61ef085422d7b196822820404f940950dde5b2e367bede8bc/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e69bb81de06827147b7bfbaeb284d85219fa92d9f097e32cc73675f279d70188", size = 314232 }, - { url = "https://files.pythonhosted.org/packages/3a/58/93b41fb23e75f38f453ae92a2f987274c64637c450285577bd81c599b715/frozenlist-1.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7613d9977d2ab4a9141dde4a149f4357e4065949674c5649f920fec86ecb393e", size = 308187 }, - { url = "https://files.pythonhosted.org/packages/6a/a2/e64df5c5aa36ab3dee5a40d254f3e471bb0603c225f81664267281c46a2d/frozenlist-1.6.0-cp313-cp313-win32.whl", hash = "sha256:4def87ef6d90429f777c9d9de3961679abf938cb6b7b63d4a7eb8a268babfce4", size = 114772 }, - { url = "https://files.pythonhosted.org/packages/a0/77/fead27441e749b2d574bb73d693530d59d520d4b9e9679b8e3cb779d37f2/frozenlist-1.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:37a8a52c3dfff01515e9bbbee0e6063181362f9de3db2ccf9bc96189b557cbfd", size = 119847 }, - { url = "https://files.pythonhosted.org/packages/df/bd/cc6d934991c1e5d9cafda83dfdc52f987c7b28343686aef2e58a9cf89f20/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:46138f5a0773d064ff663d273b309b696293d7a7c00a0994c5c13a5078134b64", size = 174937 }, - { url = "https://files.pythonhosted.org/packages/f2/a2/daf945f335abdbfdd5993e9dc348ef4507436936ab3c26d7cfe72f4843bf/frozenlist-1.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f88bc0a2b9c2a835cb888b32246c27cdab5740059fb3688852bf91e915399b91", size = 136029 }, - { url = "https://files.pythonhosted.org/packages/51/65/4c3145f237a31247c3429e1c94c384d053f69b52110a0d04bfc8afc55fb2/frozenlist-1.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:777704c1d7655b802c7850255639672e90e81ad6fa42b99ce5ed3fbf45e338dd", size = 134831 }, - { url = "https://files.pythonhosted.org/packages/77/38/03d316507d8dea84dfb99bdd515ea245628af964b2bf57759e3c9205cc5e/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ef8d41764c7de0dcdaf64f733a27352248493a85a80661f3c678acd27e31f2", size = 392981 }, - { url = "https://files.pythonhosted.org/packages/37/02/46285ef9828f318ba400a51d5bb616ded38db8466836a9cfa39f3903260b/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:da5cb36623f2b846fb25009d9d9215322318ff1c63403075f812b3b2876c8506", size = 371999 }, - { url = "https://files.pythonhosted.org/packages/0d/64/1212fea37a112c3c5c05bfb5f0a81af4836ce349e69be75af93f99644da9/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbb56587a16cf0fb8acd19e90ff9924979ac1431baea8681712716a8337577b0", size = 392200 }, - { url = "https://files.pythonhosted.org/packages/81/ce/9a6ea1763e3366e44a5208f76bf37c76c5da570772375e4d0be85180e588/frozenlist-1.6.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6154c3ba59cda3f954c6333025369e42c3acd0c6e8b6ce31eb5c5b8116c07e0", size = 390134 }, - { url = "https://files.pythonhosted.org/packages/bc/36/939738b0b495b2c6d0c39ba51563e453232813042a8d908b8f9544296c29/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e8246877afa3f1ae5c979fe85f567d220f86a50dc6c493b9b7d8191181ae01e", size = 365208 }, - { url = "https://files.pythonhosted.org/packages/b4/8b/939e62e93c63409949c25220d1ba8e88e3960f8ef6a8d9ede8f94b459d27/frozenlist-1.6.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0f6cce16306d2e117cf9db71ab3a9e8878a28176aeaf0dbe35248d97b28d0c", size = 385548 }, - { url = "https://files.pythonhosted.org/packages/62/38/22d2873c90102e06a7c5a3a5b82ca47e393c6079413e8a75c72bff067fa8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1b8e8cd8032ba266f91136d7105706ad57770f3522eac4a111d77ac126a25a9b", size = 391123 }, - { url = "https://files.pythonhosted.org/packages/44/78/63aaaf533ee0701549500f6d819be092c6065cb5c577edb70c09df74d5d0/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e2ada1d8515d3ea5378c018a5f6d14b4994d4036591a52ceaf1a1549dec8e1ad", size = 394199 }, - { url = "https://files.pythonhosted.org/packages/54/45/71a6b48981d429e8fbcc08454dc99c4c2639865a646d549812883e9c9dd3/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:cdb2c7f071e4026c19a3e32b93a09e59b12000751fc9b0b7758da899e657d215", size = 373854 }, - { url = "https://files.pythonhosted.org/packages/3f/f3/dbf2a5e11736ea81a66e37288bf9f881143a7822b288a992579ba1b4204d/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:03572933a1969a6d6ab509d509e5af82ef80d4a5d4e1e9f2e1cdd22c77a3f4d2", size = 395412 }, - { url = "https://files.pythonhosted.org/packages/b3/f1/c63166806b331f05104d8ea385c4acd511598568b1f3e4e8297ca54f2676/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:77effc978947548b676c54bbd6a08992759ea6f410d4987d69feea9cd0919911", size = 394936 }, - { url = "https://files.pythonhosted.org/packages/ef/ea/4f3e69e179a430473eaa1a75ff986526571215fefc6b9281cdc1f09a4eb8/frozenlist-1.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a2bda8be77660ad4089caf2223fdbd6db1858462c4b85b67fbfa22102021e497", size = 391459 }, - { url = "https://files.pythonhosted.org/packages/d3/c3/0fc2c97dea550df9afd072a37c1e95421652e3206bbeaa02378b24c2b480/frozenlist-1.6.0-cp313-cp313t-win32.whl", hash = "sha256:a4d96dc5bcdbd834ec6b0f91027817214216b5b30316494d2b1aebffb87c534f", size = 128797 }, - { url = "https://files.pythonhosted.org/packages/ae/f5/79c9320c5656b1965634fe4be9c82b12a3305bdbc58ad9cb941131107b20/frozenlist-1.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:e18036cb4caa17ea151fd5f3d70be9d354c99eb8cf817a3ccde8a7873b074348", size = 134709 }, - { url = "https://files.pythonhosted.org/packages/71/3e/b04a0adda73bd52b390d730071c0d577073d3d26740ee1bad25c3ad0f37b/frozenlist-1.6.0-py3-none-any.whl", hash = "sha256:535eec9987adb04701266b92745d6cdcef2e77669299359c3009c3404dd5d191", size = 12404 }, +version = "1.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/b1/b64018016eeb087db503b038296fd782586432b9c077fc5c7839e9cb6ef6/frozenlist-1.7.0.tar.gz", hash = "sha256:2e310d81923c2437ea8670467121cc3e9b0f76d3043cc1d2331d56c7fb7a3a8f", size = 45078 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/7e/803dde33760128acd393a27eb002f2020ddb8d99d30a44bfbaab31c5f08a/frozenlist-1.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:aa51e147a66b2d74de1e6e2cf5921890de6b0f4820b257465101d7f37b49fb5a", size = 82251 }, + { url = "https://files.pythonhosted.org/packages/75/a9/9c2c5760b6ba45eae11334db454c189d43d34a4c0b489feb2175e5e64277/frozenlist-1.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9b35db7ce1cd71d36ba24f80f0c9e7cff73a28d7a74e91fe83e23d27c7828750", size = 48183 }, + { url = "https://files.pythonhosted.org/packages/47/be/4038e2d869f8a2da165f35a6befb9158c259819be22eeaf9c9a8f6a87771/frozenlist-1.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34a69a85e34ff37791e94542065c8416c1afbf820b68f720452f636d5fb990cd", size = 47107 }, + { url = "https://files.pythonhosted.org/packages/79/26/85314b8a83187c76a37183ceed886381a5f992975786f883472fcb6dc5f2/frozenlist-1.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a646531fa8d82c87fe4bb2e596f23173caec9185bfbca5d583b4ccfb95183e2", size = 237333 }, + { url = "https://files.pythonhosted.org/packages/1f/fd/e5b64f7d2c92a41639ffb2ad44a6a82f347787abc0c7df5f49057cf11770/frozenlist-1.7.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:79b2ffbba483f4ed36a0f236ccb85fbb16e670c9238313709638167670ba235f", size = 231724 }, + { url = "https://files.pythonhosted.org/packages/20/fb/03395c0a43a5976af4bf7534759d214405fbbb4c114683f434dfdd3128ef/frozenlist-1.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a26f205c9ca5829cbf82bb2a84b5c36f7184c4316617d7ef1b271a56720d6b30", size = 245842 }, + { url = "https://files.pythonhosted.org/packages/d0/15/c01c8e1dffdac5d9803507d824f27aed2ba76b6ed0026fab4d9866e82f1f/frozenlist-1.7.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bcacfad3185a623fa11ea0e0634aac7b691aa925d50a440f39b458e41c561d98", size = 239767 }, + { url = "https://files.pythonhosted.org/packages/14/99/3f4c6fe882c1f5514b6848aa0a69b20cb5e5d8e8f51a339d48c0e9305ed0/frozenlist-1.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72c1b0fe8fe451b34f12dce46445ddf14bd2a5bcad7e324987194dc8e3a74c86", size = 224130 }, + { url = "https://files.pythonhosted.org/packages/4d/83/220a374bd7b2aeba9d0725130665afe11de347d95c3620b9b82cc2fcab97/frozenlist-1.7.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61d1a5baeaac6c0798ff6edfaeaa00e0e412d49946c53fae8d4b8e8b3566c4ae", size = 235301 }, + { url = "https://files.pythonhosted.org/packages/03/3c/3e3390d75334a063181625343e8daab61b77e1b8214802cc4e8a1bb678fc/frozenlist-1.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7edf5c043c062462f09b6820de9854bf28cc6cc5b6714b383149745e287181a8", size = 234606 }, + { url = "https://files.pythonhosted.org/packages/23/1e/58232c19608b7a549d72d9903005e2d82488f12554a32de2d5fb59b9b1ba/frozenlist-1.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:d50ac7627b3a1bd2dcef6f9da89a772694ec04d9a61b66cf87f7d9446b4a0c31", size = 248372 }, + { url = "https://files.pythonhosted.org/packages/c0/a4/e4a567e01702a88a74ce8a324691e62a629bf47d4f8607f24bf1c7216e7f/frozenlist-1.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce48b2fece5aeb45265bb7a58259f45027db0abff478e3077e12b05b17fb9da7", size = 229860 }, + { url = "https://files.pythonhosted.org/packages/73/a6/63b3374f7d22268b41a9db73d68a8233afa30ed164c46107b33c4d18ecdd/frozenlist-1.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:fe2365ae915a1fafd982c146754e1de6ab3478def8a59c86e1f7242d794f97d5", size = 245893 }, + { url = "https://files.pythonhosted.org/packages/6d/eb/d18b3f6e64799a79673c4ba0b45e4cfbe49c240edfd03a68be20002eaeaa/frozenlist-1.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:45a6f2fdbd10e074e8814eb98b05292f27bad7d1883afbe009d96abdcf3bc898", size = 246323 }, + { url = "https://files.pythonhosted.org/packages/5a/f5/720f3812e3d06cd89a1d5db9ff6450088b8f5c449dae8ffb2971a44da506/frozenlist-1.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:21884e23cffabb157a9dd7e353779077bf5b8f9a58e9b262c6caad2ef5f80a56", size = 233149 }, + { url = "https://files.pythonhosted.org/packages/69/68/03efbf545e217d5db8446acfd4c447c15b7c8cf4dbd4a58403111df9322d/frozenlist-1.7.0-cp311-cp311-win32.whl", hash = "sha256:284d233a8953d7b24f9159b8a3496fc1ddc00f4db99c324bd5fb5f22d8698ea7", size = 39565 }, + { url = "https://files.pythonhosted.org/packages/58/17/fe61124c5c333ae87f09bb67186d65038834a47d974fc10a5fadb4cc5ae1/frozenlist-1.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:387cbfdcde2f2353f19c2f66bbb52406d06ed77519ac7ee21be0232147c2592d", size = 44019 }, + { url = "https://files.pythonhosted.org/packages/ef/a2/c8131383f1e66adad5f6ecfcce383d584ca94055a34d683bbb24ac5f2f1c/frozenlist-1.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3dbf9952c4bb0e90e98aec1bd992b3318685005702656bc6f67c1a32b76787f2", size = 81424 }, + { url = "https://files.pythonhosted.org/packages/4c/9d/02754159955088cb52567337d1113f945b9e444c4960771ea90eb73de8db/frozenlist-1.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1f5906d3359300b8a9bb194239491122e6cf1444c2efb88865426f170c262cdb", size = 47952 }, + { url = "https://files.pythonhosted.org/packages/01/7a/0046ef1bd6699b40acd2067ed6d6670b4db2f425c56980fa21c982c2a9db/frozenlist-1.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3dabd5a8f84573c8d10d8859a50ea2dec01eea372031929871368c09fa103478", size = 46688 }, + { url = "https://files.pythonhosted.org/packages/d6/a2/a910bafe29c86997363fb4c02069df4ff0b5bc39d33c5198b4e9dd42d8f8/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa57daa5917f1738064f302bf2626281a1cb01920c32f711fbc7bc36111058a8", size = 243084 }, + { url = "https://files.pythonhosted.org/packages/64/3e/5036af9d5031374c64c387469bfcc3af537fc0f5b1187d83a1cf6fab1639/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c193dda2b6d49f4c4398962810fa7d7c78f032bf45572b3e04dd5249dff27e08", size = 233524 }, + { url = "https://files.pythonhosted.org/packages/06/39/6a17b7c107a2887e781a48ecf20ad20f1c39d94b2a548c83615b5b879f28/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe2b675cf0aaa6d61bf8fbffd3c274b3c9b7b1623beb3809df8a81399a4a9c4", size = 248493 }, + { url = "https://files.pythonhosted.org/packages/be/00/711d1337c7327d88c44d91dd0f556a1c47fb99afc060ae0ef66b4d24793d/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8fc5d5cda37f62b262405cf9652cf0856839c4be8ee41be0afe8858f17f4c94b", size = 244116 }, + { url = "https://files.pythonhosted.org/packages/24/fe/74e6ec0639c115df13d5850e75722750adabdc7de24e37e05a40527ca539/frozenlist-1.7.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d5ce521d1dd7d620198829b87ea002956e4319002ef0bc8d3e6d045cb4646e", size = 224557 }, + { url = "https://files.pythonhosted.org/packages/8d/db/48421f62a6f77c553575201e89048e97198046b793f4a089c79a6e3268bd/frozenlist-1.7.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:488d0a7d6a0008ca0db273c542098a0fa9e7dfaa7e57f70acef43f32b3f69dca", size = 241820 }, + { url = "https://files.pythonhosted.org/packages/1d/fa/cb4a76bea23047c8462976ea7b7a2bf53997a0ca171302deae9d6dd12096/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:15a7eaba63983d22c54d255b854e8108e7e5f3e89f647fc854bd77a237e767df", size = 236542 }, + { url = "https://files.pythonhosted.org/packages/5d/32/476a4b5cfaa0ec94d3f808f193301debff2ea42288a099afe60757ef6282/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1eaa7e9c6d15df825bf255649e05bd8a74b04a4d2baa1ae46d9c2d00b2ca2cb5", size = 249350 }, + { url = "https://files.pythonhosted.org/packages/8d/ba/9a28042f84a6bf8ea5dbc81cfff8eaef18d78b2a1ad9d51c7bc5b029ad16/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4389e06714cfa9d47ab87f784a7c5be91d3934cd6e9a7b85beef808297cc025", size = 225093 }, + { url = "https://files.pythonhosted.org/packages/bc/29/3a32959e68f9cf000b04e79ba574527c17e8842e38c91d68214a37455786/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:73bd45e1488c40b63fe5a7df892baf9e2a4d4bb6409a2b3b78ac1c6236178e01", size = 245482 }, + { url = "https://files.pythonhosted.org/packages/80/e8/edf2f9e00da553f07f5fa165325cfc302dead715cab6ac8336a5f3d0adc2/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99886d98e1643269760e5fe0df31e5ae7050788dd288947f7f007209b8c33f08", size = 249590 }, + { url = "https://files.pythonhosted.org/packages/1c/80/9a0eb48b944050f94cc51ee1c413eb14a39543cc4f760ed12657a5a3c45a/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:290a172aae5a4c278c6da8a96222e6337744cd9c77313efe33d5670b9f65fc43", size = 237785 }, + { url = "https://files.pythonhosted.org/packages/f3/74/87601e0fb0369b7a2baf404ea921769c53b7ae00dee7dcfe5162c8c6dbf0/frozenlist-1.7.0-cp312-cp312-win32.whl", hash = "sha256:426c7bc70e07cfebc178bc4c2bf2d861d720c4fff172181eeb4a4c41d4ca2ad3", size = 39487 }, + { url = "https://files.pythonhosted.org/packages/0b/15/c026e9a9fc17585a9d461f65d8593d281fedf55fbf7eb53f16c6df2392f9/frozenlist-1.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:563b72efe5da92e02eb68c59cb37205457c977aa7a449ed1b37e6939e5c47c6a", size = 43874 }, + { url = "https://files.pythonhosted.org/packages/24/90/6b2cebdabdbd50367273c20ff6b57a3dfa89bd0762de02c3a1eb42cb6462/frozenlist-1.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee80eeda5e2a4e660651370ebffd1286542b67e268aa1ac8d6dbe973120ef7ee", size = 79791 }, + { url = "https://files.pythonhosted.org/packages/83/2e/5b70b6a3325363293fe5fc3ae74cdcbc3e996c2a11dde2fd9f1fb0776d19/frozenlist-1.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d1a81c85417b914139e3a9b995d4a1c84559afc839a93cf2cb7f15e6e5f6ed2d", size = 47165 }, + { url = "https://files.pythonhosted.org/packages/f4/25/a0895c99270ca6966110f4ad98e87e5662eab416a17e7fd53c364bf8b954/frozenlist-1.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cbb65198a9132ebc334f237d7b0df163e4de83fb4f2bdfe46c1e654bdb0c5d43", size = 45881 }, + { url = "https://files.pythonhosted.org/packages/19/7c/71bb0bbe0832793c601fff68cd0cf6143753d0c667f9aec93d3c323f4b55/frozenlist-1.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dab46c723eeb2c255a64f9dc05b8dd601fde66d6b19cdb82b2e09cc6ff8d8b5d", size = 232409 }, + { url = "https://files.pythonhosted.org/packages/c0/45/ed2798718910fe6eb3ba574082aaceff4528e6323f9a8570be0f7028d8e9/frozenlist-1.7.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6aeac207a759d0dedd2e40745575ae32ab30926ff4fa49b1635def65806fddee", size = 225132 }, + { url = "https://files.pythonhosted.org/packages/ba/e2/8417ae0f8eacb1d071d4950f32f229aa6bf68ab69aab797b72a07ea68d4f/frozenlist-1.7.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bd8c4e58ad14b4fa7802b8be49d47993182fdd4023393899632c88fd8cd994eb", size = 237638 }, + { url = "https://files.pythonhosted.org/packages/f8/b7/2ace5450ce85f2af05a871b8c8719b341294775a0a6c5585d5e6170f2ce7/frozenlist-1.7.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04fb24d104f425da3540ed83cbfc31388a586a7696142004c577fa61c6298c3f", size = 233539 }, + { url = "https://files.pythonhosted.org/packages/46/b9/6989292c5539553dba63f3c83dc4598186ab2888f67c0dc1d917e6887db6/frozenlist-1.7.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a5c505156368e4ea6b53b5ac23c92d7edc864537ff911d2fb24c140bb175e60", size = 215646 }, + { url = "https://files.pythonhosted.org/packages/72/31/bc8c5c99c7818293458fe745dab4fd5730ff49697ccc82b554eb69f16a24/frozenlist-1.7.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bd7eb96a675f18aa5c553eb7ddc24a43c8c18f22e1f9925528128c052cdbe00", size = 232233 }, + { url = "https://files.pythonhosted.org/packages/59/52/460db4d7ba0811b9ccb85af996019f5d70831f2f5f255f7cc61f86199795/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:05579bf020096fe05a764f1f84cd104a12f78eaab68842d036772dc6d4870b4b", size = 227996 }, + { url = "https://files.pythonhosted.org/packages/ba/c9/f4b39e904c03927b7ecf891804fd3b4df3db29b9e487c6418e37988d6e9d/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:376b6222d114e97eeec13d46c486facd41d4f43bab626b7c3f6a8b4e81a5192c", size = 242280 }, + { url = "https://files.pythonhosted.org/packages/b8/33/3f8d6ced42f162d743e3517781566b8481322be321b486d9d262adf70bfb/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0aa7e176ebe115379b5b1c95b4096fb1c17cce0847402e227e712c27bdb5a949", size = 217717 }, + { url = "https://files.pythonhosted.org/packages/3e/e8/ad683e75da6ccef50d0ab0c2b2324b32f84fc88ceee778ed79b8e2d2fe2e/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3fbba20e662b9c2130dc771e332a99eff5da078b2b2648153a40669a6d0e36ca", size = 236644 }, + { url = "https://files.pythonhosted.org/packages/b2/14/8d19ccdd3799310722195a72ac94ddc677541fb4bef4091d8e7775752360/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f3f4410a0a601d349dd406b5713fec59b4cee7e71678d5b17edda7f4655a940b", size = 238879 }, + { url = "https://files.pythonhosted.org/packages/ce/13/c12bf657494c2fd1079a48b2db49fa4196325909249a52d8f09bc9123fd7/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e2cdfaaec6a2f9327bf43c933c0319a7c429058e8537c508964a133dffee412e", size = 232502 }, + { url = "https://files.pythonhosted.org/packages/d7/8b/e7f9dfde869825489382bc0d512c15e96d3964180c9499efcec72e85db7e/frozenlist-1.7.0-cp313-cp313-win32.whl", hash = "sha256:5fc4df05a6591c7768459caba1b342d9ec23fa16195e744939ba5914596ae3e1", size = 39169 }, + { url = "https://files.pythonhosted.org/packages/35/89/a487a98d94205d85745080a37860ff5744b9820a2c9acbcdd9440bfddf98/frozenlist-1.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:52109052b9791a3e6b5d1b65f4b909703984b770694d3eb64fad124c835d7cba", size = 43219 }, + { url = "https://files.pythonhosted.org/packages/56/d5/5c4cf2319a49eddd9dd7145e66c4866bdc6f3dbc67ca3d59685149c11e0d/frozenlist-1.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a6f86e4193bb0e235ef6ce3dde5cbabed887e0b11f516ce8a0f4d3b33078ec2d", size = 84345 }, + { url = "https://files.pythonhosted.org/packages/a4/7d/ec2c1e1dc16b85bc9d526009961953df9cec8481b6886debb36ec9107799/frozenlist-1.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:82d664628865abeb32d90ae497fb93df398a69bb3434463d172b80fc25b0dd7d", size = 48880 }, + { url = "https://files.pythonhosted.org/packages/69/86/f9596807b03de126e11e7d42ac91e3d0b19a6599c714a1989a4e85eeefc4/frozenlist-1.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:912a7e8375a1c9a68325a902f3953191b7b292aa3c3fb0d71a216221deca460b", size = 48498 }, + { url = "https://files.pythonhosted.org/packages/5e/cb/df6de220f5036001005f2d726b789b2c0b65f2363b104bbc16f5be8084f8/frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9537c2777167488d539bc5de2ad262efc44388230e5118868e172dd4a552b146", size = 292296 }, + { url = "https://files.pythonhosted.org/packages/83/1f/de84c642f17c8f851a2905cee2dae401e5e0daca9b5ef121e120e19aa825/frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f34560fb1b4c3e30ba35fa9a13894ba39e5acfc5f60f57d8accde65f46cc5e74", size = 273103 }, + { url = "https://files.pythonhosted.org/packages/88/3c/c840bfa474ba3fa13c772b93070893c6e9d5c0350885760376cbe3b6c1b3/frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:acd03d224b0175f5a850edc104ac19040d35419eddad04e7cf2d5986d98427f1", size = 292869 }, + { url = "https://files.pythonhosted.org/packages/a6/1c/3efa6e7d5a39a1d5ef0abeb51c48fb657765794a46cf124e5aca2c7a592c/frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2038310bc582f3d6a09b3816ab01737d60bf7b1ec70f5356b09e84fb7408ab1", size = 291467 }, + { url = "https://files.pythonhosted.org/packages/4f/00/d5c5e09d4922c395e2f2f6b79b9a20dab4b67daaf78ab92e7729341f61f6/frozenlist-1.7.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8c05e4c8e5f36e5e088caa1bf78a687528f83c043706640a92cb76cd6999384", size = 266028 }, + { url = "https://files.pythonhosted.org/packages/4e/27/72765be905619dfde25a7f33813ac0341eb6b076abede17a2e3fbfade0cb/frozenlist-1.7.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:765bb588c86e47d0b68f23c1bee323d4b703218037765dcf3f25c838c6fecceb", size = 284294 }, + { url = "https://files.pythonhosted.org/packages/88/67/c94103a23001b17808eb7dd1200c156bb69fb68e63fcf0693dde4cd6228c/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:32dc2e08c67d86d0969714dd484fd60ff08ff81d1a1e40a77dd34a387e6ebc0c", size = 281898 }, + { url = "https://files.pythonhosted.org/packages/42/34/a3e2c00c00f9e2a9db5653bca3fec306349e71aff14ae45ecc6d0951dd24/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:c0303e597eb5a5321b4de9c68e9845ac8f290d2ab3f3e2c864437d3c5a30cd65", size = 290465 }, + { url = "https://files.pythonhosted.org/packages/bb/73/f89b7fbce8b0b0c095d82b008afd0590f71ccb3dee6eee41791cf8cd25fd/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:a47f2abb4e29b3a8d0b530f7c3598badc6b134562b1a5caee867f7c62fee51e3", size = 266385 }, + { url = "https://files.pythonhosted.org/packages/cd/45/e365fdb554159462ca12df54bc59bfa7a9a273ecc21e99e72e597564d1ae/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:3d688126c242a6fabbd92e02633414d40f50bb6002fa4cf995a1d18051525657", size = 288771 }, + { url = "https://files.pythonhosted.org/packages/00/11/47b6117002a0e904f004d70ec5194fe9144f117c33c851e3d51c765962d0/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:4e7e9652b3d367c7bd449a727dc79d5043f48b88d0cbfd4f9f1060cf2b414104", size = 288206 }, + { url = "https://files.pythonhosted.org/packages/40/37/5f9f3c3fd7f7746082ec67bcdc204db72dad081f4f83a503d33220a92973/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1a85e345b4c43db8b842cab1feb41be5cc0b10a1830e6295b69d7310f99becaf", size = 282620 }, + { url = "https://files.pythonhosted.org/packages/0b/31/8fbc5af2d183bff20f21aa743b4088eac4445d2bb1cdece449ae80e4e2d1/frozenlist-1.7.0-cp313-cp313t-win32.whl", hash = "sha256:3a14027124ddb70dfcee5148979998066897e79f89f64b13328595c4bdf77c81", size = 43059 }, + { url = "https://files.pythonhosted.org/packages/bb/ed/41956f52105b8dbc26e457c5705340c67c8cc2b79f394b79bffc09d0e938/frozenlist-1.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3bf8010d71d4507775f658e9823210b7427be36625b387221642725b515dcf3e", size = 47516 }, + { url = "https://files.pythonhosted.org/packages/ee/45/b82e3c16be2182bff01179db177fe144d58b5dc787a7d4492c6ed8b9317f/frozenlist-1.7.0-py3-none-any.whl", hash = "sha256:9a5af342e34f7e97caf8c995864c7a396418ae2859cc6fdf1b1073020d516a7e", size = 13106 }, ] [[package]] name = "fsspec" -version = "2024.12.0" +version = "2025.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/11/de70dee31455c546fbc88301971ec03c328f3d1138cfba14263f651e9551/fsspec-2024.12.0.tar.gz", hash = "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f", size = 291600 } +sdist = { url = "https://files.pythonhosted.org/packages/00/f7/27f15d41f0ed38e8fcc488584b57e902b331da7f7c6dcda53721b15838fc/fsspec-2025.5.1.tar.gz", hash = "sha256:2e55e47a540b91843b755e83ded97c6e897fa0942b11490113f09e9c443c2475", size = 303033 } wheels = [ - { url = "https://files.pythonhosted.org/packages/de/86/5486b0188d08aa643e127774a99bac51ffa6cf343e3deb0583956dca5b22/fsspec-2024.12.0-py3-none-any.whl", hash = "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2", size = 183862 }, + { url = "https://files.pythonhosted.org/packages/bb/61/78c7b3851add1481b048b5fdc29067397a1784e2910592bc81bb3f608635/fsspec-2025.5.1-py3-none-any.whl", hash = "sha256:24d3a2e663d5fc735ab256263c4075f374a174c3410c0b25e5bd1970bceaa462", size = 199052 }, ] [[package]] @@ -992,7 +968,7 @@ wheels = [ [[package]] name = "gcsfs" -version = "2024.12.0" +version = "2025.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -1003,14 +979,14 @@ dependencies = [ { name = "google-cloud-storage" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/20/a2/310a6f1cfdb39b2385af38620f299a8acb427b5c1fc36aa1037a81eea0d8/gcsfs-2024.12.0.tar.gz", hash = "sha256:e672413922108300ebc1fe78b8f99f3c7c1b94e7e088f5a6dc88de6d5a93d156", size = 80258 } +sdist = { url = "https://files.pythonhosted.org/packages/d8/4a/47ad326cc74ccfd97e125c0087a36d516ed74c61f53e458067737378d0f2/gcsfs-2025.5.1.tar.gz", hash = "sha256:ba945530cf4857cd9d599ccb3ae729c65c39088880b11c4df1fecac30df5f3e3", size = 82173 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/0e/fb76438001cf6910be9f47b3ee1e3e1490caf0d44e2ff34625a97e3fbf63/gcsfs-2024.12.0-py2.py3-none-any.whl", hash = "sha256:ec88e48f77e466723705458af85dda238e43aa69fac071efd98829d06e9f095a", size = 35488 }, + { url = "https://files.pythonhosted.org/packages/ff/eb/9182e875592c48d282c5eab602000f0618817b9011b2b2925165e4b4b7f3/gcsfs-2025.5.1-py2.py3-none-any.whl", hash = "sha256:48712471ff71ac83d3e2152ba4dc232874698466e344d5e700feba06b0a0de7b", size = 36581 }, ] [[package]] name = "google-api-core" -version = "2.24.2" +version = "2.25.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "google-auth" }, @@ -1019,23 +995,23 @@ dependencies = [ { name = "protobuf" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/09/5c/085bcb872556934bb119e5e09de54daa07873f6866b8f0303c49e72287f7/google_api_core-2.24.2.tar.gz", hash = "sha256:81718493daf06d96d6bc76a91c23874dbf2fac0adbbf542831b805ee6e974696", size = 163516 } +sdist = { url = "https://files.pythonhosted.org/packages/dc/21/e9d043e88222317afdbdb567165fdbc3b0aad90064c7e0c9eb0ad9955ad8/google_api_core-2.25.1.tar.gz", hash = "sha256:d2aaa0b13c78c61cb3f4282c464c046e45fbd75755683c9c525e6e8f7ed0a5e8", size = 165443 } wheels = [ - { url = "https://files.pythonhosted.org/packages/46/95/f472d85adab6e538da2025dfca9e976a0d125cc0af2301f190e77b76e51c/google_api_core-2.24.2-py3-none-any.whl", hash = "sha256:810a63ac95f3c441b7c0e43d344e372887f62ce9071ba972eacf32672e072de9", size = 160061 }, + { url = "https://files.pythonhosted.org/packages/14/4b/ead00905132820b623732b175d66354e9d3e69fcf2a5dcdab780664e7896/google_api_core-2.25.1-py3-none-any.whl", hash = "sha256:8a2a56c1fef82987a524371f99f3bd0143702fecc670c72e600c1cda6bf8dbb7", size = 160807 }, ] [[package]] name = "google-auth" -version = "2.40.2" +version = "2.40.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cachetools" }, { name = "pyasn1-modules" }, { name = "rsa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/84/f67f53c505a6b2c5da05c988e2a5483f5ba9eee4b1841d2e3ff22f547cd5/google_auth-2.40.2.tar.gz", hash = "sha256:a33cde547a2134273226fa4b853883559947ebe9207521f7afc707efbf690f58", size = 280990 } +sdist = { url = "https://files.pythonhosted.org/packages/9e/9b/e92ef23b84fa10a64ce4831390b7a4c2e53c0132568d99d4ae61d04c8855/google_auth-2.40.3.tar.gz", hash = "sha256:500c3a29adedeb36ea9cf24b8d10858e152f2412e3ca37829b3fa18e33d63b77", size = 281029 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/c7/e2d82e6702e2a9e2311c138f8e1100f21d08aed0231290872b229ae57a86/google_auth-2.40.2-py2.py3-none-any.whl", hash = "sha256:f7e568d42eedfded58734f6a60c58321896a621f7c116c411550a4b4a13da90b", size = 216102 }, + { url = "https://files.pythonhosted.org/packages/17/63/b19553b658a1692443c62bd07e5868adaa0ad746a0751ba62c59568cd45b/google_auth-2.40.3-py2.py3-none-any.whl", hash = "sha256:1370d4593e86213563547f97a92752fc658456fe4514c809544f330fed45a7ca", size = 216137 }, ] [[package]] @@ -1066,7 +1042,7 @@ wheels = [ [[package]] name = "google-cloud-storage" -version = "3.1.0" +version = "3.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "google-api-core" }, @@ -1076,9 +1052,9 @@ dependencies = [ { name = "google-resumable-media" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f3/08/52143124415a889bbab60a8ecede1e31ea0e8d992ca078317886f26dc3be/google_cloud_storage-3.1.0.tar.gz", hash = "sha256:944273179897c7c8a07ee15f2e6466a02da0c7c4b9ecceac2a26017cb2972049", size = 7666527 } +sdist = { url = "https://files.pythonhosted.org/packages/27/84/6afc2ffdf31f6247a6bab6ba070e073fb05e0fda56adf59ce52ac591a033/google_cloud_storage-3.1.1.tar.gz", hash = "sha256:f9c8f965cafd1d38509f8e2b070339e0e9e5bf050774653bf36213d4ea6104c0", size = 7668109 } wheels = [ - { url = "https://files.pythonhosted.org/packages/13/b8/c99c965659f45efa73080477c49ffddf7b9aecb00806be8422560bb5b824/google_cloud_storage-3.1.0-py2.py3-none-any.whl", hash = "sha256:eaf36966b68660a9633f03b067e4a10ce09f1377cae3ff9f2c699f69a81c66c6", size = 174861 }, + { url = "https://files.pythonhosted.org/packages/89/4f/b922e919f6e1ea5905f1427fadf1a3f56a85e79e2b0037fec182f6b437dd/google_cloud_storage-3.1.1-py3-none-any.whl", hash = "sha256:ba7e6ae2be5a7a08742f001e23ec6a0c17d78c620f63bf8e0e7c2cbdddb407de", size = 175464 }, ] [[package]] @@ -1134,44 +1110,37 @@ wheels = [ [[package]] name = "greenlet" -version = "3.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/34/c1/a82edae11d46c0d83481aacaa1e578fea21d94a1ef400afd734d47ad95ad/greenlet-3.2.2.tar.gz", hash = "sha256:ad053d34421a2debba45aa3cc39acf454acbcd025b3fc1a9f8a0dee237abd485", size = 185797 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/9f/a47e19261747b562ce88219e5ed8c859d42c6e01e73da6fbfa3f08a7be13/greenlet-3.2.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:dcb9cebbf3f62cb1e5afacae90761ccce0effb3adaa32339a0670fe7805d8068", size = 268635 }, - { url = "https://files.pythonhosted.org/packages/11/80/a0042b91b66975f82a914d515e81c1944a3023f2ce1ed7a9b22e10b46919/greenlet-3.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf3fc9145141250907730886b031681dfcc0de1c158f3cc51c092223c0f381ce", size = 628786 }, - { url = "https://files.pythonhosted.org/packages/38/a2/8336bf1e691013f72a6ebab55da04db81a11f68e82bb691f434909fa1327/greenlet-3.2.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:efcdfb9df109e8a3b475c016f60438fcd4be68cd13a365d42b35914cdab4bb2b", size = 640866 }, - { url = "https://files.pythonhosted.org/packages/f8/7e/f2a3a13e424670a5d08826dab7468fa5e403e0fbe0b5f951ff1bc4425b45/greenlet-3.2.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4bd139e4943547ce3a56ef4b8b1b9479f9e40bb47e72cc906f0f66b9d0d5cab3", size = 636752 }, - { url = "https://files.pythonhosted.org/packages/fd/5d/ce4a03a36d956dcc29b761283f084eb4a3863401c7cb505f113f73af8774/greenlet-3.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71566302219b17ca354eb274dfd29b8da3c268e41b646f330e324e3967546a74", size = 636028 }, - { url = "https://files.pythonhosted.org/packages/4b/29/b130946b57e3ceb039238413790dd3793c5e7b8e14a54968de1fe449a7cf/greenlet-3.2.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3091bc45e6b0c73f225374fefa1536cd91b1e987377b12ef5b19129b07d93ebe", size = 583869 }, - { url = "https://files.pythonhosted.org/packages/ac/30/9f538dfe7f87b90ecc75e589d20cbd71635531a617a336c386d775725a8b/greenlet-3.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:44671c29da26539a5f142257eaba5110f71887c24d40df3ac87f1117df589e0e", size = 1112886 }, - { url = "https://files.pythonhosted.org/packages/be/92/4b7deeb1a1e9c32c1b59fdca1cac3175731c23311ddca2ea28a8b6ada91c/greenlet-3.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c23ea227847c9dbe0b3910f5c0dd95658b607137614eb821e6cbaecd60d81cc6", size = 1138355 }, - { url = "https://files.pythonhosted.org/packages/c5/eb/7551c751a2ea6498907b2fcbe31d7a54b602ba5e8eb9550a9695ca25d25c/greenlet-3.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:0a16fb934fcabfdfacf21d79e6fed81809d8cd97bc1be9d9c89f0e4567143d7b", size = 295437 }, - { url = "https://files.pythonhosted.org/packages/2c/a1/88fdc6ce0df6ad361a30ed78d24c86ea32acb2b563f33e39e927b1da9ea0/greenlet-3.2.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:df4d1509efd4977e6a844ac96d8be0b9e5aa5d5c77aa27ca9f4d3f92d3fcf330", size = 270413 }, - { url = "https://files.pythonhosted.org/packages/a6/2e/6c1caffd65490c68cd9bcec8cb7feb8ac7b27d38ba1fea121fdc1f2331dc/greenlet-3.2.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da956d534a6d1b9841f95ad0f18ace637668f680b1339ca4dcfb2c1837880a0b", size = 637242 }, - { url = "https://files.pythonhosted.org/packages/98/28/088af2cedf8823b6b7ab029a5626302af4ca1037cf8b998bed3a8d3cb9e2/greenlet-3.2.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c7b15fb9b88d9ee07e076f5a683027bc3befd5bb5d25954bb633c385d8b737e", size = 651444 }, - { url = "https://files.pythonhosted.org/packages/4a/9f/0116ab876bb0bc7a81eadc21c3f02cd6100dcd25a1cf2a085a130a63a26a/greenlet-3.2.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:752f0e79785e11180ebd2e726c8a88109ded3e2301d40abced2543aa5d164275", size = 646067 }, - { url = "https://files.pythonhosted.org/packages/35/17/bb8f9c9580e28a94a9575da847c257953d5eb6e39ca888239183320c1c28/greenlet-3.2.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ae572c996ae4b5e122331e12bbb971ea49c08cc7c232d1bd43150800a2d6c65", size = 648153 }, - { url = "https://files.pythonhosted.org/packages/2c/ee/7f31b6f7021b8df6f7203b53b9cc741b939a2591dcc6d899d8042fcf66f2/greenlet-3.2.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02f5972ff02c9cf615357c17ab713737cccfd0eaf69b951084a9fd43f39833d3", size = 603865 }, - { url = "https://files.pythonhosted.org/packages/b5/2d/759fa59323b521c6f223276a4fc3d3719475dc9ae4c44c2fe7fc750f8de0/greenlet-3.2.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4fefc7aa68b34b9224490dfda2e70ccf2131368493add64b4ef2d372955c207e", size = 1119575 }, - { url = "https://files.pythonhosted.org/packages/30/05/356813470060bce0e81c3df63ab8cd1967c1ff6f5189760c1a4734d405ba/greenlet-3.2.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a31ead8411a027c2c4759113cf2bd473690517494f3d6e4bf67064589afcd3c5", size = 1147460 }, - { url = "https://files.pythonhosted.org/packages/07/f4/b2a26a309a04fb844c7406a4501331b9400e1dd7dd64d3450472fd47d2e1/greenlet-3.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:b24c7844c0a0afc3ccbeb0b807adeefb7eff2b5599229ecedddcfeb0ef333bec", size = 296239 }, - { url = "https://files.pythonhosted.org/packages/89/30/97b49779fff8601af20972a62cc4af0c497c1504dfbb3e93be218e093f21/greenlet-3.2.2-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:3ab7194ee290302ca15449f601036007873028712e92ca15fc76597a0aeb4c59", size = 269150 }, - { url = "https://files.pythonhosted.org/packages/21/30/877245def4220f684bc2e01df1c2e782c164e84b32e07373992f14a2d107/greenlet-3.2.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc5c43bb65ec3669452af0ab10729e8fdc17f87a1f2ad7ec65d4aaaefabf6bf", size = 637381 }, - { url = "https://files.pythonhosted.org/packages/8e/16/adf937908e1f913856b5371c1d8bdaef5f58f251d714085abeea73ecc471/greenlet-3.2.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:decb0658ec19e5c1f519faa9a160c0fc85a41a7e6654b3ce1b44b939f8bf1325", size = 651427 }, - { url = "https://files.pythonhosted.org/packages/ad/49/6d79f58fa695b618654adac64e56aff2eeb13344dc28259af8f505662bb1/greenlet-3.2.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6fadd183186db360b61cb34e81117a096bff91c072929cd1b529eb20dd46e6c5", size = 645795 }, - { url = "https://files.pythonhosted.org/packages/5a/e6/28ed5cb929c6b2f001e96b1d0698c622976cd8f1e41fe7ebc047fa7c6dd4/greenlet-3.2.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1919cbdc1c53ef739c94cf2985056bcc0838c1f217b57647cbf4578576c63825", size = 648398 }, - { url = "https://files.pythonhosted.org/packages/9d/70/b200194e25ae86bc57077f695b6cc47ee3118becf54130c5514456cf8dac/greenlet-3.2.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3885f85b61798f4192d544aac7b25a04ece5fe2704670b4ab73c2d2c14ab740d", size = 606795 }, - { url = "https://files.pythonhosted.org/packages/f8/c8/ba1def67513a941154ed8f9477ae6e5a03f645be6b507d3930f72ed508d3/greenlet-3.2.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:85f3e248507125bf4af607a26fd6cb8578776197bd4b66e35229cdf5acf1dfbf", size = 1117976 }, - { url = "https://files.pythonhosted.org/packages/c3/30/d0e88c1cfcc1b3331d63c2b54a0a3a4a950ef202fb8b92e772ca714a9221/greenlet-3.2.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1e76106b6fc55fa3d6fe1c527f95ee65e324a13b62e243f77b48317346559708", size = 1145509 }, - { url = "https://files.pythonhosted.org/packages/90/2e/59d6491834b6e289051b252cf4776d16da51c7c6ca6a87ff97e3a50aa0cd/greenlet-3.2.2-cp313-cp313-win_amd64.whl", hash = "sha256:fe46d4f8e94e637634d54477b0cfabcf93c53f29eedcbdeecaf2af32029b4421", size = 296023 }, - { url = "https://files.pythonhosted.org/packages/65/66/8a73aace5a5335a1cba56d0da71b7bd93e450f17d372c5b7c5fa547557e9/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba30e88607fb6990544d84caf3c706c4b48f629e18853fc6a646f82db9629418", size = 629911 }, - { url = "https://files.pythonhosted.org/packages/48/08/c8b8ebac4e0c95dcc68ec99198842e7db53eda4ab3fb0a4e785690883991/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:055916fafad3e3388d27dd68517478933a97edc2fc54ae79d3bec827de2c64c4", size = 635251 }, - { url = "https://files.pythonhosted.org/packages/37/26/7db30868f73e86b9125264d2959acabea132b444b88185ba5c462cb8e571/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2593283bf81ca37d27d110956b79e8723f9aa50c4bcdc29d3c0543d4743d2763", size = 632620 }, - { url = "https://files.pythonhosted.org/packages/10/ec/718a3bd56249e729016b0b69bee4adea0dfccf6ca43d147ef3b21edbca16/greenlet-3.2.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89c69e9a10670eb7a66b8cef6354c24671ba241f46152dd3eed447f79c29fb5b", size = 628851 }, - { url = "https://files.pythonhosted.org/packages/9b/9d/d1c79286a76bc62ccdc1387291464af16a4204ea717f24e77b0acd623b99/greenlet-3.2.2-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02a98600899ca1ca5d3a2590974c9e3ec259503b2d6ba6527605fcd74e08e207", size = 593718 }, - { url = "https://files.pythonhosted.org/packages/cd/41/96ba2bf948f67b245784cd294b84e3d17933597dffd3acdb367a210d1949/greenlet-3.2.2-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b50a8c5c162469c3209e5ec92ee4f95c8231b11db6a04db09bbe338176723bb8", size = 1105752 }, - { url = "https://files.pythonhosted.org/packages/68/3b/3b97f9d33c1f2eb081759da62bd6162159db260f602f048bc2f36b4c453e/greenlet-3.2.2-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:45f9f4853fb4cc46783085261c9ec4706628f3b57de3e68bae03e8f8b3c0de51", size = 1125170 }, +version = "3.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/92/bb85bd6e80148a4d2e0c59f7c0c2891029f8fd510183afc7d8d2feeed9b6/greenlet-3.2.3.tar.gz", hash = "sha256:8b0dd8ae4c0d6f5e54ee55ba935eeb3d735a9b58a8a1e5b5cbab64e01a39f365", size = 185752 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/2e/d4fcb2978f826358b673f779f78fa8a32ee37df11920dc2bb5589cbeecef/greenlet-3.2.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:784ae58bba89fa1fa5733d170d42486580cab9decda3484779f4759345b29822", size = 270219 }, + { url = "https://files.pythonhosted.org/packages/16/24/929f853e0202130e4fe163bc1d05a671ce8dcd604f790e14896adac43a52/greenlet-3.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0921ac4ea42a5315d3446120ad48f90c3a6b9bb93dd9b3cf4e4d84a66e42de83", size = 630383 }, + { url = "https://files.pythonhosted.org/packages/d1/b2/0320715eb61ae70c25ceca2f1d5ae620477d246692d9cc284c13242ec31c/greenlet-3.2.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d2971d93bb99e05f8c2c0c2f4aa9484a18d98c4c3bd3c62b65b7e6ae33dfcfaf", size = 642422 }, + { url = "https://files.pythonhosted.org/packages/bd/49/445fd1a210f4747fedf77615d941444349c6a3a4a1135bba9701337cd966/greenlet-3.2.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c667c0bf9d406b77a15c924ef3285e1e05250948001220368e039b6aa5b5034b", size = 638375 }, + { url = "https://files.pythonhosted.org/packages/7e/c8/ca19760cf6eae75fa8dc32b487e963d863b3ee04a7637da77b616703bc37/greenlet-3.2.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:592c12fb1165be74592f5de0d70f82bc5ba552ac44800d632214b76089945147", size = 637627 }, + { url = "https://files.pythonhosted.org/packages/65/89/77acf9e3da38e9bcfca881e43b02ed467c1dedc387021fc4d9bd9928afb8/greenlet-3.2.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29e184536ba333003540790ba29829ac14bb645514fbd7e32af331e8202a62a5", size = 585502 }, + { url = "https://files.pythonhosted.org/packages/97/c6/ae244d7c95b23b7130136e07a9cc5aadd60d59b5951180dc7dc7e8edaba7/greenlet-3.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:93c0bb79844a367782ec4f429d07589417052e621aa39a5ac1fb99c5aa308edc", size = 1114498 }, + { url = "https://files.pythonhosted.org/packages/89/5f/b16dec0cbfd3070658e0d744487919740c6d45eb90946f6787689a7efbce/greenlet-3.2.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:751261fc5ad7b6705f5f76726567375bb2104a059454e0226e1eef6c756748ba", size = 1139977 }, + { url = "https://files.pythonhosted.org/packages/66/77/d48fb441b5a71125bcac042fc5b1494c806ccb9a1432ecaa421e72157f77/greenlet-3.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:83a8761c75312361aa2b5b903b79da97f13f556164a7dd2d5448655425bd4c34", size = 297017 }, + { url = "https://files.pythonhosted.org/packages/f3/94/ad0d435f7c48debe960c53b8f60fb41c2026b1d0fa4a99a1cb17c3461e09/greenlet-3.2.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:25ad29caed5783d4bd7a85c9251c651696164622494c00802a139c00d639242d", size = 271992 }, + { url = "https://files.pythonhosted.org/packages/93/5d/7c27cf4d003d6e77749d299c7c8f5fd50b4f251647b5c2e97e1f20da0ab5/greenlet-3.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88cd97bf37fe24a6710ec6a3a7799f3f81d9cd33317dcf565ff9950c83f55e0b", size = 638820 }, + { url = "https://files.pythonhosted.org/packages/c6/7e/807e1e9be07a125bb4c169144937910bf59b9d2f6d931578e57f0bce0ae2/greenlet-3.2.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:baeedccca94880d2f5666b4fa16fc20ef50ba1ee353ee2d7092b383a243b0b0d", size = 653046 }, + { url = "https://files.pythonhosted.org/packages/9d/ab/158c1a4ea1068bdbc78dba5a3de57e4c7aeb4e7fa034320ea94c688bfb61/greenlet-3.2.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:be52af4b6292baecfa0f397f3edb3c6092ce071b499dd6fe292c9ac9f2c8f264", size = 647701 }, + { url = "https://files.pythonhosted.org/packages/cc/0d/93729068259b550d6a0288da4ff72b86ed05626eaf1eb7c0d3466a2571de/greenlet-3.2.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0cc73378150b8b78b0c9fe2ce56e166695e67478550769536a6742dca3651688", size = 649747 }, + { url = "https://files.pythonhosted.org/packages/f6/f6/c82ac1851c60851302d8581680573245c8fc300253fc1ff741ae74a6c24d/greenlet-3.2.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:706d016a03e78df129f68c4c9b4c4f963f7d73534e48a24f5f5a7101ed13dbbb", size = 605461 }, + { url = "https://files.pythonhosted.org/packages/98/82/d022cf25ca39cf1200650fc58c52af32c90f80479c25d1cbf57980ec3065/greenlet-3.2.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:419e60f80709510c343c57b4bb5a339d8767bf9aef9b8ce43f4f143240f88b7c", size = 1121190 }, + { url = "https://files.pythonhosted.org/packages/f5/e1/25297f70717abe8104c20ecf7af0a5b82d2f5a980eb1ac79f65654799f9f/greenlet-3.2.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:93d48533fade144203816783373f27a97e4193177ebaaf0fc396db19e5d61163", size = 1149055 }, + { url = "https://files.pythonhosted.org/packages/1f/8f/8f9e56c5e82eb2c26e8cde787962e66494312dc8cb261c460e1f3a9c88bc/greenlet-3.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:7454d37c740bb27bdeddfc3f358f26956a07d5220818ceb467a483197d84f849", size = 297817 }, + { url = "https://files.pythonhosted.org/packages/b1/cf/f5c0b23309070ae93de75c90d29300751a5aacefc0a3ed1b1d8edb28f08b/greenlet-3.2.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:500b8689aa9dd1ab26872a34084503aeddefcb438e2e7317b89b11eaea1901ad", size = 270732 }, + { url = "https://files.pythonhosted.org/packages/48/ae/91a957ba60482d3fecf9be49bc3948f341d706b52ddb9d83a70d42abd498/greenlet-3.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a07d3472c2a93117af3b0136f246b2833fdc0b542d4a9799ae5f41c28323faef", size = 639033 }, + { url = "https://files.pythonhosted.org/packages/6f/df/20ffa66dd5a7a7beffa6451bdb7400d66251374ab40b99981478c69a67a8/greenlet-3.2.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8704b3768d2f51150626962f4b9a9e4a17d2e37c8a8d9867bbd9fa4eb938d3b3", size = 652999 }, + { url = "https://files.pythonhosted.org/packages/51/b4/ebb2c8cb41e521f1d72bf0465f2f9a2fd803f674a88db228887e6847077e/greenlet-3.2.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5035d77a27b7c62db6cf41cf786cfe2242644a7a337a0e155c80960598baab95", size = 647368 }, + { url = "https://files.pythonhosted.org/packages/8e/6a/1e1b5aa10dced4ae876a322155705257748108b7fd2e4fae3f2a091fe81a/greenlet-3.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2d8aa5423cd4a396792f6d4580f88bdc6efcb9205891c9d40d20f6e670992efb", size = 650037 }, + { url = "https://files.pythonhosted.org/packages/26/f2/ad51331a157c7015c675702e2d5230c243695c788f8f75feba1af32b3617/greenlet-3.2.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c724620a101f8170065d7dded3f962a2aea7a7dae133a009cada42847e04a7b", size = 608402 }, + { url = "https://files.pythonhosted.org/packages/26/bc/862bd2083e6b3aff23300900a956f4ea9a4059de337f5c8734346b9b34fc/greenlet-3.2.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:873abe55f134c48e1f2a6f53f7d1419192a3d1a4e873bace00499a4e45ea6af0", size = 1119577 }, + { url = "https://files.pythonhosted.org/packages/86/94/1fc0cc068cfde885170e01de40a619b00eaa8f2916bf3541744730ffb4c3/greenlet-3.2.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:024571bbce5f2c1cfff08bf3fbaa43bbc7444f580ae13b0099e95d0e6e67ed36", size = 1147121 }, + { url = "https://files.pythonhosted.org/packages/27/1a/199f9587e8cb08a0658f9c30f3799244307614148ffe8b1e3aa22f324dea/greenlet-3.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5195fb1e75e592dd04ce79881c8a22becdfa3e6f500e7feb059b1e6fdd54d3e3", size = 297603 }, ] [[package]] @@ -1183,34 +1152,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515 }, ] -[[package]] -name = "httpcore" -version = "1.0.9" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784 }, -] - -[[package]] -name = "httpx" -version = "0.28.1" -source = { registry = "https://pypi.org/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 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, -] - [[package]] name = "identify" version = "2.6.12" @@ -1285,7 +1226,7 @@ wheels = [ [[package]] name = "ipython" -version = "9.2.0" +version = "9.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, @@ -1300,9 +1241,9 @@ dependencies = [ { name = "traitlets" }, { name = "typing-extensions", marker = "python_full_version < '3.12'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9d/02/63a84444a7409b3c0acd1de9ffe524660e0e5d82ee473e78b45e5bfb64a4/ipython-9.2.0.tar.gz", hash = "sha256:62a9373dbc12f28f9feaf4700d052195bf89806279fc8ca11f3f54017d04751b", size = 4424394 } +sdist = { url = "https://files.pythonhosted.org/packages/54/80/406f9e3bde1c1fd9bf5a0be9d090f8ae623e401b7670d8f6fdf2ab679891/ipython-9.4.0.tar.gz", hash = "sha256:c033c6d4e7914c3d9768aabe76bbe87ba1dc66a92a05db6bfa1125d81f2ee270", size = 4385338 } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/ce/5e897ee51b7d26ab4e47e5105e7368d40ce6cfae2367acdf3165396d50be/ipython-9.2.0-py3-none-any.whl", hash = "sha256:fef5e33c4a1ae0759e0bba5917c9db4eb8c53fee917b6a526bd973e1ca5159f6", size = 604277 }, + { url = "https://files.pythonhosted.org/packages/63/f8/0031ee2b906a15a33d6bfc12dd09c3dfa966b3cb5b284ecfb7549e6ac3c4/ipython-9.4.0-py3-none-any.whl", hash = "sha256:25850f025a446d9b359e8d296ba175a36aedd32e83ca9b5060430fe16801f066", size = 611021 }, ] [[package]] @@ -1359,15 +1300,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256 }, ] -[[package]] -name = "joblib" -version = "1.5.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/dc/fe/0f5a938c54105553436dbff7a61dc4fed4b1b2c98852f8833beaf4d5968f/joblib-1.5.1.tar.gz", hash = "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444", size = 330475 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7d/4f/1195bbac8e0c2acc5f740661631d8d750dc38d4a32b23ee5df3cde6f4e0d/joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a", size = 307746 }, -] - [[package]] name = "jsonschema" version = "4.24.0" @@ -1548,15 +1480,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, ] -[[package]] -name = "marshmallow" -version = "4.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1e/ff/26df5a9f5ac57ccf693a5854916ab47243039d2aa9e0fe5f5a0331e7b74b/marshmallow-4.0.0.tar.gz", hash = "sha256:3b6e80aac299a7935cfb97ed01d1854fb90b5079430969af92118ea1b12a8d55", size = 220507 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/26/6cc45d156f44dbe1d5696d9e54042e4dcaf7b946c0b86df6a97d29706f32/marshmallow-4.0.0-py3-none-any.whl", hash = "sha256:e7b0528337e9990fd64950f8a6b3a1baabed09ad17a0dfb844d701151f92d203", size = 48420 }, -] - [[package]] name = "matplotlib-inline" version = "0.1.7" @@ -1618,120 +1541,121 @@ wheels = [ [[package]] name = "msgpack" -version = "1.1.0" +version = "1.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cb/d0/7555686ae7ff5731205df1012ede15dd9d927f6227ea151e901c7406af4f/msgpack-1.1.0.tar.gz", hash = "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e", size = 167260 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/5e/a4c7154ba65d93be91f2f1e55f90e76c5f91ccadc7efc4341e6f04c8647f/msgpack-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7", size = 150803 }, - { url = "https://files.pythonhosted.org/packages/60/c2/687684164698f1d51c41778c838d854965dd284a4b9d3a44beba9265c931/msgpack-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa", size = 84343 }, - { url = "https://files.pythonhosted.org/packages/42/ae/d3adea9bb4a1342763556078b5765e666f8fdf242e00f3f6657380920972/msgpack-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701", size = 81408 }, - { url = "https://files.pythonhosted.org/packages/dc/17/6313325a6ff40ce9c3207293aee3ba50104aed6c2c1559d20d09e5c1ff54/msgpack-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6", size = 396096 }, - { url = "https://files.pythonhosted.org/packages/a8/a1/ad7b84b91ab5a324e707f4c9761633e357820b011a01e34ce658c1dda7cc/msgpack-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59", size = 403671 }, - { url = "https://files.pythonhosted.org/packages/bb/0b/fd5b7c0b308bbf1831df0ca04ec76fe2f5bf6319833646b0a4bd5e9dc76d/msgpack-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0", size = 387414 }, - { url = "https://files.pythonhosted.org/packages/f0/03/ff8233b7c6e9929a1f5da3c7860eccd847e2523ca2de0d8ef4878d354cfa/msgpack-1.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e", size = 383759 }, - { url = "https://files.pythonhosted.org/packages/1f/1b/eb82e1fed5a16dddd9bc75f0854b6e2fe86c0259c4353666d7fab37d39f4/msgpack-1.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6", size = 394405 }, - { url = "https://files.pythonhosted.org/packages/90/2e/962c6004e373d54ecf33d695fb1402f99b51832631e37c49273cc564ffc5/msgpack-1.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5", size = 396041 }, - { url = "https://files.pythonhosted.org/packages/f8/20/6e03342f629474414860c48aeffcc2f7f50ddaf351d95f20c3f1c67399a8/msgpack-1.1.0-cp311-cp311-win32.whl", hash = "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88", size = 68538 }, - { url = "https://files.pythonhosted.org/packages/aa/c4/5a582fc9a87991a3e6f6800e9bb2f3c82972912235eb9539954f3e9997c7/msgpack-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788", size = 74871 }, - { url = "https://files.pythonhosted.org/packages/e1/d6/716b7ca1dbde63290d2973d22bbef1b5032ca634c3ff4384a958ec3f093a/msgpack-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d", size = 152421 }, - { url = "https://files.pythonhosted.org/packages/70/da/5312b067f6773429cec2f8f08b021c06af416bba340c912c2ec778539ed6/msgpack-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2", size = 85277 }, - { url = "https://files.pythonhosted.org/packages/28/51/da7f3ae4462e8bb98af0d5bdf2707f1b8c65a0d4f496e46b6afb06cbc286/msgpack-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420", size = 82222 }, - { url = "https://files.pythonhosted.org/packages/33/af/dc95c4b2a49cff17ce47611ca9ba218198806cad7796c0b01d1e332c86bb/msgpack-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2", size = 392971 }, - { url = "https://files.pythonhosted.org/packages/f1/54/65af8de681fa8255402c80eda2a501ba467921d5a7a028c9c22a2c2eedb5/msgpack-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39", size = 401403 }, - { url = "https://files.pythonhosted.org/packages/97/8c/e333690777bd33919ab7024269dc3c41c76ef5137b211d776fbb404bfead/msgpack-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f", size = 385356 }, - { url = "https://files.pythonhosted.org/packages/57/52/406795ba478dc1c890559dd4e89280fa86506608a28ccf3a72fbf45df9f5/msgpack-1.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247", size = 383028 }, - { url = "https://files.pythonhosted.org/packages/e7/69/053b6549bf90a3acadcd8232eae03e2fefc87f066a5b9fbb37e2e608859f/msgpack-1.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c", size = 391100 }, - { url = "https://files.pythonhosted.org/packages/23/f0/d4101d4da054f04274995ddc4086c2715d9b93111eb9ed49686c0f7ccc8a/msgpack-1.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b", size = 394254 }, - { url = "https://files.pythonhosted.org/packages/1c/12/cf07458f35d0d775ff3a2dc5559fa2e1fcd06c46f1ef510e594ebefdca01/msgpack-1.1.0-cp312-cp312-win32.whl", hash = "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b", size = 69085 }, - { url = "https://files.pythonhosted.org/packages/73/80/2708a4641f7d553a63bc934a3eb7214806b5b39d200133ca7f7afb0a53e8/msgpack-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f", size = 75347 }, - { url = "https://files.pythonhosted.org/packages/c8/b0/380f5f639543a4ac413e969109978feb1f3c66e931068f91ab6ab0f8be00/msgpack-1.1.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf", size = 151142 }, - { url = "https://files.pythonhosted.org/packages/c8/ee/be57e9702400a6cb2606883d55b05784fada898dfc7fd12608ab1fdb054e/msgpack-1.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330", size = 84523 }, - { url = "https://files.pythonhosted.org/packages/7e/3a/2919f63acca3c119565449681ad08a2f84b2171ddfcff1dba6959db2cceb/msgpack-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734", size = 81556 }, - { url = "https://files.pythonhosted.org/packages/7c/43/a11113d9e5c1498c145a8925768ea2d5fce7cbab15c99cda655aa09947ed/msgpack-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e", size = 392105 }, - { url = "https://files.pythonhosted.org/packages/2d/7b/2c1d74ca6c94f70a1add74a8393a0138172207dc5de6fc6269483519d048/msgpack-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca", size = 399979 }, - { url = "https://files.pythonhosted.org/packages/82/8c/cf64ae518c7b8efc763ca1f1348a96f0e37150061e777a8ea5430b413a74/msgpack-1.1.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915", size = 383816 }, - { url = "https://files.pythonhosted.org/packages/69/86/a847ef7a0f5ef3fa94ae20f52a4cacf596a4e4a010197fbcc27744eb9a83/msgpack-1.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d", size = 380973 }, - { url = "https://files.pythonhosted.org/packages/aa/90/c74cf6e1126faa93185d3b830ee97246ecc4fe12cf9d2d31318ee4246994/msgpack-1.1.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434", size = 387435 }, - { url = "https://files.pythonhosted.org/packages/7a/40/631c238f1f338eb09f4acb0f34ab5862c4e9d7eda11c1b685471a4c5ea37/msgpack-1.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c", size = 399082 }, - { url = "https://files.pythonhosted.org/packages/e9/1b/fa8a952be252a1555ed39f97c06778e3aeb9123aa4cccc0fd2acd0b4e315/msgpack-1.1.0-cp313-cp313-win32.whl", hash = "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc", size = 69037 }, - { url = "https://files.pythonhosted.org/packages/b6/bc/8bd826dd03e022153bfa1766dcdec4976d6c818865ed54223d71f07862b3/msgpack-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f", size = 75140 }, +sdist = { url = "https://files.pythonhosted.org/packages/45/b1/ea4f68038a18c77c9467400d166d74c4ffa536f34761f7983a104357e614/msgpack-1.1.1.tar.gz", hash = "sha256:77b79ce34a2bdab2594f490c8e80dd62a02d650b91a75159a63ec413b8d104cd", size = 173555 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/83/97f24bf9848af23fe2ba04380388216defc49a8af6da0c28cc636d722502/msgpack-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:71ef05c1726884e44f8b1d1773604ab5d4d17729d8491403a705e649116c9558", size = 82728 }, + { url = "https://files.pythonhosted.org/packages/aa/7f/2eaa388267a78401f6e182662b08a588ef4f3de6f0eab1ec09736a7aaa2b/msgpack-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:36043272c6aede309d29d56851f8841ba907a1a3d04435e43e8a19928e243c1d", size = 79279 }, + { url = "https://files.pythonhosted.org/packages/f8/46/31eb60f4452c96161e4dfd26dbca562b4ec68c72e4ad07d9566d7ea35e8a/msgpack-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a32747b1b39c3ac27d0670122b57e6e57f28eefb725e0b625618d1b59bf9d1e0", size = 423859 }, + { url = "https://files.pythonhosted.org/packages/45/16/a20fa8c32825cc7ae8457fab45670c7a8996d7746ce80ce41cc51e3b2bd7/msgpack-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a8b10fdb84a43e50d38057b06901ec9da52baac6983d3f709d8507f3889d43f", size = 429975 }, + { url = "https://files.pythonhosted.org/packages/86/ea/6c958e07692367feeb1a1594d35e22b62f7f476f3c568b002a5ea09d443d/msgpack-1.1.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0c325c3f485dc54ec298d8b024e134acf07c10d494ffa24373bea729acf704", size = 413528 }, + { url = "https://files.pythonhosted.org/packages/75/05/ac84063c5dae79722bda9f68b878dc31fc3059adb8633c79f1e82c2cd946/msgpack-1.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:88daaf7d146e48ec71212ce21109b66e06a98e5e44dca47d853cbfe171d6c8d2", size = 413338 }, + { url = "https://files.pythonhosted.org/packages/69/e8/fe86b082c781d3e1c09ca0f4dacd457ede60a13119b6ce939efe2ea77b76/msgpack-1.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8b55ea20dc59b181d3f47103f113e6f28a5e1c89fd5b67b9140edb442ab67f2", size = 422658 }, + { url = "https://files.pythonhosted.org/packages/3b/2b/bafc9924df52d8f3bb7c00d24e57be477f4d0f967c0a31ef5e2225e035c7/msgpack-1.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a28e8072ae9779f20427af07f53bbb8b4aa81151054e882aee333b158da8752", size = 427124 }, + { url = "https://files.pythonhosted.org/packages/a2/3b/1f717e17e53e0ed0b68fa59e9188f3f610c79d7151f0e52ff3cd8eb6b2dc/msgpack-1.1.1-cp311-cp311-win32.whl", hash = "sha256:7da8831f9a0fdb526621ba09a281fadc58ea12701bc709e7b8cbc362feabc295", size = 65016 }, + { url = "https://files.pythonhosted.org/packages/48/45/9d1780768d3b249accecc5a38c725eb1e203d44a191f7b7ff1941f7df60c/msgpack-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:5fd1b58e1431008a57247d6e7cc4faa41c3607e8e7d4aaf81f7c29ea013cb458", size = 72267 }, + { url = "https://files.pythonhosted.org/packages/e3/26/389b9c593eda2b8551b2e7126ad3a06af6f9b44274eb3a4f054d48ff7e47/msgpack-1.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ae497b11f4c21558d95de9f64fff7053544f4d1a17731c866143ed6bb4591238", size = 82359 }, + { url = "https://files.pythonhosted.org/packages/ab/65/7d1de38c8a22cf8b1551469159d4b6cf49be2126adc2482de50976084d78/msgpack-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:33be9ab121df9b6b461ff91baac6f2731f83d9b27ed948c5b9d1978ae28bf157", size = 79172 }, + { url = "https://files.pythonhosted.org/packages/0f/bd/cacf208b64d9577a62c74b677e1ada005caa9b69a05a599889d6fc2ab20a/msgpack-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f64ae8fe7ffba251fecb8408540c34ee9df1c26674c50c4544d72dbf792e5ce", size = 425013 }, + { url = "https://files.pythonhosted.org/packages/4d/ec/fd869e2567cc9c01278a736cfd1697941ba0d4b81a43e0aa2e8d71dab208/msgpack-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a494554874691720ba5891c9b0b39474ba43ffb1aaf32a5dac874effb1619e1a", size = 426905 }, + { url = "https://files.pythonhosted.org/packages/55/2a/35860f33229075bce803a5593d046d8b489d7ba2fc85701e714fc1aaf898/msgpack-1.1.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb643284ab0ed26f6957d969fe0dd8bb17beb567beb8998140b5e38a90974f6c", size = 407336 }, + { url = "https://files.pythonhosted.org/packages/8c/16/69ed8f3ada150bf92745fb4921bd621fd2cdf5a42e25eb50bcc57a5328f0/msgpack-1.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d275a9e3c81b1093c060c3837e580c37f47c51eca031f7b5fb76f7b8470f5f9b", size = 409485 }, + { url = "https://files.pythonhosted.org/packages/c6/b6/0c398039e4c6d0b2e37c61d7e0e9d13439f91f780686deb8ee64ecf1ae71/msgpack-1.1.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4fd6b577e4541676e0cc9ddc1709d25014d3ad9a66caa19962c4f5de30fc09ef", size = 412182 }, + { url = "https://files.pythonhosted.org/packages/b8/d0/0cf4a6ecb9bc960d624c93effaeaae75cbf00b3bc4a54f35c8507273cda1/msgpack-1.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb29aaa613c0a1c40d1af111abf025f1732cab333f96f285d6a93b934738a68a", size = 419883 }, + { url = "https://files.pythonhosted.org/packages/62/83/9697c211720fa71a2dfb632cad6196a8af3abea56eece220fde4674dc44b/msgpack-1.1.1-cp312-cp312-win32.whl", hash = "sha256:870b9a626280c86cff9c576ec0d9cbcc54a1e5ebda9cd26dab12baf41fee218c", size = 65406 }, + { url = "https://files.pythonhosted.org/packages/c0/23/0abb886e80eab08f5e8c485d6f13924028602829f63b8f5fa25a06636628/msgpack-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:5692095123007180dca3e788bb4c399cc26626da51629a31d40207cb262e67f4", size = 72558 }, + { url = "https://files.pythonhosted.org/packages/a1/38/561f01cf3577430b59b340b51329803d3a5bf6a45864a55f4ef308ac11e3/msgpack-1.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3765afa6bd4832fc11c3749be4ba4b69a0e8d7b728f78e68120a157a4c5d41f0", size = 81677 }, + { url = "https://files.pythonhosted.org/packages/09/48/54a89579ea36b6ae0ee001cba8c61f776451fad3c9306cd80f5b5c55be87/msgpack-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8ddb2bcfd1a8b9e431c8d6f4f7db0773084e107730ecf3472f1dfe9ad583f3d9", size = 78603 }, + { url = "https://files.pythonhosted.org/packages/a0/60/daba2699b308e95ae792cdc2ef092a38eb5ee422f9d2fbd4101526d8a210/msgpack-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:196a736f0526a03653d829d7d4c5500a97eea3648aebfd4b6743875f28aa2af8", size = 420504 }, + { url = "https://files.pythonhosted.org/packages/20/22/2ebae7ae43cd8f2debc35c631172ddf14e2a87ffcc04cf43ff9df9fff0d3/msgpack-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d592d06e3cc2f537ceeeb23d38799c6ad83255289bb84c2e5792e5a8dea268a", size = 423749 }, + { url = "https://files.pythonhosted.org/packages/40/1b/54c08dd5452427e1179a40b4b607e37e2664bca1c790c60c442c8e972e47/msgpack-1.1.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4df2311b0ce24f06ba253fda361f938dfecd7b961576f9be3f3fbd60e87130ac", size = 404458 }, + { url = "https://files.pythonhosted.org/packages/2e/60/6bb17e9ffb080616a51f09928fdd5cac1353c9becc6c4a8abd4e57269a16/msgpack-1.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e4141c5a32b5e37905b5940aacbc59739f036930367d7acce7a64e4dec1f5e0b", size = 405976 }, + { url = "https://files.pythonhosted.org/packages/ee/97/88983e266572e8707c1f4b99c8fd04f9eb97b43f2db40e3172d87d8642db/msgpack-1.1.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b1ce7f41670c5a69e1389420436f41385b1aa2504c3b0c30620764b15dded2e7", size = 408607 }, + { url = "https://files.pythonhosted.org/packages/bc/66/36c78af2efaffcc15a5a61ae0df53a1d025f2680122e2a9eb8442fed3ae4/msgpack-1.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4147151acabb9caed4e474c3344181e91ff7a388b888f1e19ea04f7e73dc7ad5", size = 424172 }, + { url = "https://files.pythonhosted.org/packages/8c/87/a75eb622b555708fe0427fab96056d39d4c9892b0c784b3a721088c7ee37/msgpack-1.1.1-cp313-cp313-win32.whl", hash = "sha256:500e85823a27d6d9bba1d057c871b4210c1dd6fb01fbb764e37e4e8847376323", size = 65347 }, + { url = "https://files.pythonhosted.org/packages/ca/91/7dc28d5e2a11a5ad804cf2b7f7a5fcb1eb5a4966d66a5d2b41aee6376543/msgpack-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:6d489fba546295983abd142812bda76b57e33d0b9f5d5b71c09a583285506f69", size = 72341 }, ] [[package]] name = "multidict" -version = "6.4.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/91/2f/a3470242707058fe856fe59241eee5635d79087100b7042a867368863a27/multidict-6.4.4.tar.gz", hash = "sha256:69ee9e6ba214b5245031b76233dd95408a0fd57fdb019ddcc1ead4790932a8e8", size = 90183 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/19/1b/4c6e638195851524a63972c5773c7737bea7e47b1ba402186a37773acee2/multidict-6.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4f5f29794ac0e73d2a06ac03fd18870adc0135a9d384f4a306a951188ed02f95", size = 65515 }, - { url = "https://files.pythonhosted.org/packages/25/d5/10e6bca9a44b8af3c7f920743e5fc0c2bcf8c11bf7a295d4cfe00b08fb46/multidict-6.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c04157266344158ebd57b7120d9b0b35812285d26d0e78193e17ef57bfe2979a", size = 38609 }, - { url = "https://files.pythonhosted.org/packages/26/b4/91fead447ccff56247edc7f0535fbf140733ae25187a33621771ee598a18/multidict-6.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bb61ffd3ab8310d93427e460f565322c44ef12769f51f77277b4abad7b6f7223", size = 37871 }, - { url = "https://files.pythonhosted.org/packages/3b/37/cbc977cae59277e99d15bbda84cc53b5e0c4929ffd91d958347200a42ad0/multidict-6.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e0ba18a9afd495f17c351d08ebbc4284e9c9f7971d715f196b79636a4d0de44", size = 226661 }, - { url = "https://files.pythonhosted.org/packages/15/cd/7e0b57fbd4dc2fc105169c4ecce5be1a63970f23bb4ec8c721b67e11953d/multidict-6.4.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9faf1b1dcaadf9f900d23a0e6d6c8eadd6a95795a0e57fcca73acce0eb912065", size = 223422 }, - { url = "https://files.pythonhosted.org/packages/f1/01/1de268da121bac9f93242e30cd3286f6a819e5f0b8896511162d6ed4bf8d/multidict-6.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a4d1cb1327c6082c4fce4e2a438483390964c02213bc6b8d782cf782c9b1471f", size = 235447 }, - { url = "https://files.pythonhosted.org/packages/d2/8c/8b9a5e4aaaf4f2de14e86181a3a3d7b105077f668b6a06f043ec794f684c/multidict-6.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:941f1bec2f5dbd51feeb40aea654c2747f811ab01bdd3422a48a4e4576b7d76a", size = 231455 }, - { url = "https://files.pythonhosted.org/packages/35/db/e1817dcbaa10b319c412769cf999b1016890849245d38905b73e9c286862/multidict-6.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5f8a146184da7ea12910a4cec51ef85e44f6268467fb489c3caf0cd512f29c2", size = 223666 }, - { url = "https://files.pythonhosted.org/packages/4a/e1/66e8579290ade8a00e0126b3d9a93029033ffd84f0e697d457ed1814d0fc/multidict-6.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:232b7237e57ec3c09be97206bfb83a0aa1c5d7d377faa019c68a210fa35831f1", size = 217392 }, - { url = "https://files.pythonhosted.org/packages/7b/6f/f8639326069c24a48c7747c2a5485d37847e142a3f741ff3340c88060a9a/multidict-6.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:55ae0721c1513e5e3210bca4fc98456b980b0c2c016679d3d723119b6b202c42", size = 228969 }, - { url = "https://files.pythonhosted.org/packages/d2/c3/3d58182f76b960eeade51c89fcdce450f93379340457a328e132e2f8f9ed/multidict-6.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:51d662c072579f63137919d7bb8fc250655ce79f00c82ecf11cab678f335062e", size = 217433 }, - { url = "https://files.pythonhosted.org/packages/e1/4b/f31a562906f3bd375f3d0e83ce314e4a660c01b16c2923e8229b53fba5d7/multidict-6.4.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0e05c39962baa0bb19a6b210e9b1422c35c093b651d64246b6c2e1a7e242d9fd", size = 225418 }, - { url = "https://files.pythonhosted.org/packages/99/89/78bb95c89c496d64b5798434a3deee21996114d4d2c28dd65850bf3a691e/multidict-6.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5b1cc3ab8c31d9ebf0faa6e3540fb91257590da330ffe6d2393d4208e638925", size = 235042 }, - { url = "https://files.pythonhosted.org/packages/74/91/8780a6e5885a8770442a8f80db86a0887c4becca0e5a2282ba2cae702bc4/multidict-6.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:93ec84488a384cd7b8a29c2c7f467137d8a73f6fe38bb810ecf29d1ade011a7c", size = 230280 }, - { url = "https://files.pythonhosted.org/packages/68/c1/fcf69cabd542eb6f4b892469e033567ee6991d361d77abdc55e3a0f48349/multidict-6.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b308402608493638763abc95f9dc0030bbd6ac6aff784512e8ac3da73a88af08", size = 223322 }, - { url = "https://files.pythonhosted.org/packages/b8/85/5b80bf4b83d8141bd763e1d99142a9cdfd0db83f0739b4797172a4508014/multidict-6.4.4-cp311-cp311-win32.whl", hash = "sha256:343892a27d1a04d6ae455ecece12904d242d299ada01633d94c4f431d68a8c49", size = 35070 }, - { url = "https://files.pythonhosted.org/packages/09/66/0bed198ffd590ab86e001f7fa46b740d58cf8ff98c2f254e4a36bf8861ad/multidict-6.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:73484a94f55359780c0f458bbd3c39cb9cf9c182552177d2136e828269dee529", size = 38667 }, - { url = "https://files.pythonhosted.org/packages/d2/b5/5675377da23d60875fe7dae6be841787755878e315e2f517235f22f59e18/multidict-6.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:dc388f75a1c00000824bf28b7633e40854f4127ede80512b44c3cfeeea1839a2", size = 64293 }, - { url = "https://files.pythonhosted.org/packages/34/a7/be384a482754bb8c95d2bbe91717bf7ccce6dc38c18569997a11f95aa554/multidict-6.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:98af87593a666f739d9dba5d0ae86e01b0e1a9cfcd2e30d2d361fbbbd1a9162d", size = 38096 }, - { url = "https://files.pythonhosted.org/packages/66/6d/d59854bb4352306145bdfd1704d210731c1bb2c890bfee31fb7bbc1c4c7f/multidict-6.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aff4cafea2d120327d55eadd6b7f1136a8e5a0ecf6fb3b6863e8aca32cd8e50a", size = 37214 }, - { url = "https://files.pythonhosted.org/packages/99/e0/c29d9d462d7cfc5fc8f9bf24f9c6843b40e953c0b55e04eba2ad2cf54fba/multidict-6.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:169c4ba7858176b797fe551d6e99040c531c775d2d57b31bcf4de6d7a669847f", size = 224686 }, - { url = "https://files.pythonhosted.org/packages/dc/4a/da99398d7fd8210d9de068f9a1b5f96dfaf67d51e3f2521f17cba4ee1012/multidict-6.4.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b9eb4c59c54421a32b3273d4239865cb14ead53a606db066d7130ac80cc8ec93", size = 231061 }, - { url = "https://files.pythonhosted.org/packages/21/f5/ac11add39a0f447ac89353e6ca46666847051103649831c08a2800a14455/multidict-6.4.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7cf3bd54c56aa16fdb40028d545eaa8d051402b61533c21e84046e05513d5780", size = 232412 }, - { url = "https://files.pythonhosted.org/packages/d9/11/4b551e2110cded705a3c13a1d4b6a11f73891eb5a1c449f1b2b6259e58a6/multidict-6.4.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f682c42003c7264134bfe886376299db4cc0c6cd06a3295b41b347044bcb5482", size = 231563 }, - { url = "https://files.pythonhosted.org/packages/4c/02/751530c19e78fe73b24c3da66618eda0aa0d7f6e7aa512e46483de6be210/multidict-6.4.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920f9cf2abdf6e493c519492d892c362007f113c94da4c239ae88429835bad1", size = 223811 }, - { url = "https://files.pythonhosted.org/packages/c7/cb/2be8a214643056289e51ca356026c7b2ce7225373e7a1f8c8715efee8988/multidict-6.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:530d86827a2df6504526106b4c104ba19044594f8722d3e87714e847c74a0275", size = 216524 }, - { url = "https://files.pythonhosted.org/packages/19/f3/6d5011ec375c09081f5250af58de85f172bfcaafebff286d8089243c4bd4/multidict-6.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ecde56ea2439b96ed8a8d826b50c57364612ddac0438c39e473fafad7ae1c23b", size = 229012 }, - { url = "https://files.pythonhosted.org/packages/67/9c/ca510785df5cf0eaf5b2a8132d7d04c1ce058dcf2c16233e596ce37a7f8e/multidict-6.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:dc8c9736d8574b560634775ac0def6bdc1661fc63fa27ffdfc7264c565bcb4f2", size = 226765 }, - { url = "https://files.pythonhosted.org/packages/36/c8/ca86019994e92a0f11e642bda31265854e6ea7b235642f0477e8c2e25c1f/multidict-6.4.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7f3d3b3c34867579ea47cbd6c1f2ce23fbfd20a273b6f9e3177e256584f1eacc", size = 222888 }, - { url = "https://files.pythonhosted.org/packages/c6/67/bc25a8e8bd522935379066950ec4e2277f9b236162a73548a2576d4b9587/multidict-6.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:87a728af265e08f96b6318ebe3c0f68b9335131f461efab2fc64cc84a44aa6ed", size = 234041 }, - { url = "https://files.pythonhosted.org/packages/f1/a0/70c4c2d12857fccbe607b334b7ee28b6b5326c322ca8f73ee54e70d76484/multidict-6.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9f193eeda1857f8e8d3079a4abd258f42ef4a4bc87388452ed1e1c4d2b0c8740", size = 231046 }, - { url = "https://files.pythonhosted.org/packages/c1/0f/52954601d02d39742aab01d6b92f53c1dd38b2392248154c50797b4df7f1/multidict-6.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be06e73c06415199200e9a2324a11252a3d62030319919cde5e6950ffeccf72e", size = 227106 }, - { url = "https://files.pythonhosted.org/packages/af/24/679d83ec4379402d28721790dce818e5d6b9f94ce1323a556fb17fa9996c/multidict-6.4.4-cp312-cp312-win32.whl", hash = "sha256:622f26ea6a7e19b7c48dd9228071f571b2fbbd57a8cd71c061e848f281550e6b", size = 35351 }, - { url = "https://files.pythonhosted.org/packages/52/ef/40d98bc5f986f61565f9b345f102409534e29da86a6454eb6b7c00225a13/multidict-6.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:5e2bcda30d5009996ff439e02a9f2b5c3d64a20151d34898c000a6281faa3781", size = 38791 }, - { url = "https://files.pythonhosted.org/packages/df/2a/e166d2ffbf4b10131b2d5b0e458f7cee7d986661caceae0de8753042d4b2/multidict-6.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:82ffabefc8d84c2742ad19c37f02cde5ec2a1ee172d19944d380f920a340e4b9", size = 64123 }, - { url = "https://files.pythonhosted.org/packages/8c/96/e200e379ae5b6f95cbae472e0199ea98913f03d8c9a709f42612a432932c/multidict-6.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6a2f58a66fe2c22615ad26156354005391e26a2f3721c3621504cd87c1ea87bf", size = 38049 }, - { url = "https://files.pythonhosted.org/packages/75/fb/47afd17b83f6a8c7fa863c6d23ac5ba6a0e6145ed8a6bcc8da20b2b2c1d2/multidict-6.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5883d6ee0fd9d8a48e9174df47540b7545909841ac82354c7ae4cbe9952603bd", size = 37078 }, - { url = "https://files.pythonhosted.org/packages/fa/70/1af3143000eddfb19fd5ca5e78393985ed988ac493bb859800fe0914041f/multidict-6.4.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9abcf56a9511653fa1d052bfc55fbe53dbee8f34e68bd6a5a038731b0ca42d15", size = 224097 }, - { url = "https://files.pythonhosted.org/packages/b1/39/d570c62b53d4fba844e0378ffbcd02ac25ca423d3235047013ba2f6f60f8/multidict-6.4.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6ed5ae5605d4ad5a049fad2a28bb7193400700ce2f4ae484ab702d1e3749c3f9", size = 230768 }, - { url = "https://files.pythonhosted.org/packages/fd/f8/ed88f2c4d06f752b015933055eb291d9bc184936903752c66f68fb3c95a7/multidict-6.4.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbfcb60396f9bcfa63e017a180c3105b8c123a63e9d1428a36544e7d37ca9e20", size = 231331 }, - { url = "https://files.pythonhosted.org/packages/9c/6f/8e07cffa32f483ab887b0d56bbd8747ac2c1acd00dc0af6fcf265f4a121e/multidict-6.4.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0f1987787f5f1e2076b59692352ab29a955b09ccc433c1f6b8e8e18666f608b", size = 230169 }, - { url = "https://files.pythonhosted.org/packages/e6/2b/5dcf173be15e42f330110875a2668ddfc208afc4229097312212dc9c1236/multidict-6.4.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0121ccce8c812047d8d43d691a1ad7641f72c4f730474878a5aeae1b8ead8c", size = 222947 }, - { url = "https://files.pythonhosted.org/packages/39/75/4ddcbcebe5ebcd6faa770b629260d15840a5fc07ce8ad295a32e14993726/multidict-6.4.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83ec4967114295b8afd120a8eec579920c882831a3e4c3331d591a8e5bfbbc0f", size = 215761 }, - { url = "https://files.pythonhosted.org/packages/6a/c9/55e998ae45ff15c5608e384206aa71a11e1b7f48b64d166db400b14a3433/multidict-6.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:995f985e2e268deaf17867801b859a282e0448633f1310e3704b30616d269d69", size = 227605 }, - { url = "https://files.pythonhosted.org/packages/04/49/c2404eac74497503c77071bd2e6f88c7e94092b8a07601536b8dbe99be50/multidict-6.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:d832c608f94b9f92a0ec8b7e949be7792a642b6e535fcf32f3e28fab69eeb046", size = 226144 }, - { url = "https://files.pythonhosted.org/packages/62/c5/0cd0c3c6f18864c40846aa2252cd69d308699cb163e1c0d989ca301684da/multidict-6.4.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d21c1212171cf7da703c5b0b7a0e85be23b720818aef502ad187d627316d5645", size = 221100 }, - { url = "https://files.pythonhosted.org/packages/71/7b/f2f3887bea71739a046d601ef10e689528d4f911d84da873b6be9194ffea/multidict-6.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:cbebaa076aaecad3d4bb4c008ecc73b09274c952cf6a1b78ccfd689e51f5a5b0", size = 232731 }, - { url = "https://files.pythonhosted.org/packages/e5/b3/d9de808349df97fa75ec1372758701b5800ebad3c46ae377ad63058fbcc6/multidict-6.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:c93a6fb06cc8e5d3628b2b5fda215a5db01e8f08fc15fadd65662d9b857acbe4", size = 229637 }, - { url = "https://files.pythonhosted.org/packages/5e/57/13207c16b615eb4f1745b44806a96026ef8e1b694008a58226c2d8f5f0a5/multidict-6.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8cd8f81f1310182362fb0c7898145ea9c9b08a71081c5963b40ee3e3cac589b1", size = 225594 }, - { url = "https://files.pythonhosted.org/packages/3a/e4/d23bec2f70221604f5565000632c305fc8f25ba953e8ce2d8a18842b9841/multidict-6.4.4-cp313-cp313-win32.whl", hash = "sha256:3e9f1cd61a0ab857154205fb0b1f3d3ace88d27ebd1409ab7af5096e409614cd", size = 35359 }, - { url = "https://files.pythonhosted.org/packages/a7/7a/cfe1a47632be861b627f46f642c1d031704cc1c0f5c0efbde2ad44aa34bd/multidict-6.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:8ffb40b74400e4455785c2fa37eba434269149ec525fc8329858c862e4b35373", size = 38903 }, - { url = "https://files.pythonhosted.org/packages/68/7b/15c259b0ab49938a0a1c8f3188572802704a779ddb294edc1b2a72252e7c/multidict-6.4.4-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6a602151dbf177be2450ef38966f4be3467d41a86c6a845070d12e17c858a156", size = 68895 }, - { url = "https://files.pythonhosted.org/packages/f1/7d/168b5b822bccd88142e0a3ce985858fea612404edd228698f5af691020c9/multidict-6.4.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0d2b9712211b860d123815a80b859075d86a4d54787e247d7fbee9db6832cf1c", size = 40183 }, - { url = "https://files.pythonhosted.org/packages/e0/b7/d4b8d98eb850ef28a4922ba508c31d90715fd9b9da3801a30cea2967130b/multidict-6.4.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d2fa86af59f8fc1972e121ade052145f6da22758f6996a197d69bb52f8204e7e", size = 39592 }, - { url = "https://files.pythonhosted.org/packages/18/28/a554678898a19583548e742080cf55d169733baf57efc48c2f0273a08583/multidict-6.4.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50855d03e9e4d66eab6947ba688ffb714616f985838077bc4b490e769e48da51", size = 226071 }, - { url = "https://files.pythonhosted.org/packages/ee/dc/7ba6c789d05c310e294f85329efac1bf5b450338d2542498db1491a264df/multidict-6.4.4-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5bce06b83be23225be1905dcdb6b789064fae92499fbc458f59a8c0e68718601", size = 222597 }, - { url = "https://files.pythonhosted.org/packages/24/4f/34eadbbf401b03768dba439be0fb94b0d187facae9142821a3d5599ccb3b/multidict-6.4.4-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66ed0731f8e5dfd8369a883b6e564aca085fb9289aacabd9decd70568b9a30de", size = 228253 }, - { url = "https://files.pythonhosted.org/packages/c0/e6/493225a3cdb0d8d80d43a94503fc313536a07dae54a3f030d279e629a2bc/multidict-6.4.4-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:329ae97fc2f56f44d91bc47fe0972b1f52d21c4b7a2ac97040da02577e2daca2", size = 226146 }, - { url = "https://files.pythonhosted.org/packages/2f/70/e411a7254dc3bff6f7e6e004303b1b0591358e9f0b7c08639941e0de8bd6/multidict-6.4.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c27e5dcf520923d6474d98b96749e6805f7677e93aaaf62656005b8643f907ab", size = 220585 }, - { url = "https://files.pythonhosted.org/packages/08/8f/beb3ae7406a619100d2b1fb0022c3bb55a8225ab53c5663648ba50dfcd56/multidict-6.4.4-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:058cc59b9e9b143cc56715e59e22941a5d868c322242278d28123a5d09cdf6b0", size = 212080 }, - { url = "https://files.pythonhosted.org/packages/9c/ec/355124e9d3d01cf8edb072fd14947220f357e1c5bc79c88dff89297e9342/multidict-6.4.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:69133376bc9a03f8c47343d33f91f74a99c339e8b58cea90433d8e24bb298031", size = 226558 }, - { url = "https://files.pythonhosted.org/packages/fd/22/d2b95cbebbc2ada3be3812ea9287dcc9712d7f1a012fad041770afddb2ad/multidict-6.4.4-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d6b15c55721b1b115c5ba178c77104123745b1417527ad9641a4c5e2047450f0", size = 212168 }, - { url = "https://files.pythonhosted.org/packages/4d/c5/62bfc0b2f9ce88326dbe7179f9824a939c6c7775b23b95de777267b9725c/multidict-6.4.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:a887b77f51d3d41e6e1a63cf3bc7ddf24de5939d9ff69441387dfefa58ac2e26", size = 217970 }, - { url = "https://files.pythonhosted.org/packages/79/74/977cea1aadc43ff1c75d23bd5bc4768a8fac98c14e5878d6ee8d6bab743c/multidict-6.4.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:632a3bf8f1787f7ef7d3c2f68a7bde5be2f702906f8b5842ad6da9d974d0aab3", size = 226980 }, - { url = "https://files.pythonhosted.org/packages/48/fc/cc4a1a2049df2eb84006607dc428ff237af38e0fcecfdb8a29ca47b1566c/multidict-6.4.4-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:a145c550900deb7540973c5cdb183b0d24bed6b80bf7bddf33ed8f569082535e", size = 220641 }, - { url = "https://files.pythonhosted.org/packages/3b/6a/a7444d113ab918701988d4abdde373dbdfd2def7bd647207e2bf645c7eac/multidict-6.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cc5d83c6619ca5c9672cb78b39ed8542f1975a803dee2cda114ff73cbb076edd", size = 221728 }, - { url = "https://files.pythonhosted.org/packages/2b/b0/fdf4c73ad1c55e0f4dbbf2aa59dd37037334091f9a4961646d2b7ac91a86/multidict-6.4.4-cp313-cp313t-win32.whl", hash = "sha256:3312f63261b9df49be9d57aaa6abf53a6ad96d93b24f9cc16cf979956355ce6e", size = 41913 }, - { url = "https://files.pythonhosted.org/packages/8e/92/27989ecca97e542c0d01d05a98a5ae12198a243a9ee12563a0313291511f/multidict-6.4.4-cp313-cp313t-win_amd64.whl", hash = "sha256:ba852168d814b2c73333073e1c7116d9395bea69575a01b0b3c89d2d5a87c8fb", size = 46112 }, - { url = "https://files.pythonhosted.org/packages/84/5d/e17845bb0fa76334477d5de38654d27946d5b5d3695443987a094a71b440/multidict-6.4.4-py3-none-any.whl", hash = "sha256:bd4557071b561a8b3b6075c3ce93cf9bfb6182cb241805c3d66ced3b75eff4ac", size = 10481 }, +version = "6.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/2c/5dad12e82fbdf7470f29bff2171484bf07cb3b16ada60a6589af8f376440/multidict-6.6.3.tar.gz", hash = "sha256:798a9eb12dab0a6c2e29c1de6f3468af5cb2da6053a20dfa3344907eed0937cc", size = 101006 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/f0/1a39863ced51f639c81a5463fbfa9eb4df59c20d1a8769ab9ef4ca57ae04/multidict-6.6.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:18f4eba0cbac3546b8ae31e0bbc55b02c801ae3cbaf80c247fcdd89b456ff58c", size = 76445 }, + { url = "https://files.pythonhosted.org/packages/c9/0e/a7cfa451c7b0365cd844e90b41e21fab32edaa1e42fc0c9f68461ce44ed7/multidict-6.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef43b5dd842382329e4797c46f10748d8c2b6e0614f46b4afe4aee9ac33159df", size = 44610 }, + { url = "https://files.pythonhosted.org/packages/c6/bb/a14a4efc5ee748cc1904b0748be278c31b9295ce5f4d2ef66526f410b94d/multidict-6.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf9bd1fd5eec01494e0f2e8e446a74a85d5e49afb63d75a9934e4a5423dba21d", size = 44267 }, + { url = "https://files.pythonhosted.org/packages/c2/f8/410677d563c2d55e063ef74fe578f9d53fe6b0a51649597a5861f83ffa15/multidict-6.6.3-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:5bd8d6f793a787153956cd35e24f60485bf0651c238e207b9a54f7458b16d539", size = 230004 }, + { url = "https://files.pythonhosted.org/packages/fd/df/2b787f80059314a98e1ec6a4cc7576244986df3e56b3c755e6fc7c99e038/multidict-6.6.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bf99b4daf908c73856bd87ee0a2499c3c9a3d19bb04b9c6025e66af3fd07462", size = 247196 }, + { url = "https://files.pythonhosted.org/packages/05/f2/f9117089151b9a8ab39f9019620d10d9718eec2ac89e7ca9d30f3ec78e96/multidict-6.6.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b9e59946b49dafaf990fd9c17ceafa62976e8471a14952163d10a7a630413a9", size = 225337 }, + { url = "https://files.pythonhosted.org/packages/93/2d/7115300ec5b699faa152c56799b089a53ed69e399c3c2d528251f0aeda1a/multidict-6.6.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e2db616467070d0533832d204c54eea6836a5e628f2cb1e6dfd8cd6ba7277cb7", size = 257079 }, + { url = "https://files.pythonhosted.org/packages/15/ea/ff4bab367623e39c20d3b07637225c7688d79e4f3cc1f3b9f89867677f9a/multidict-6.6.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7394888236621f61dcdd25189b2768ae5cc280f041029a5bcf1122ac63df79f9", size = 255461 }, + { url = "https://files.pythonhosted.org/packages/74/07/2c9246cda322dfe08be85f1b8739646f2c4c5113a1422d7a407763422ec4/multidict-6.6.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f114d8478733ca7388e7c7e0ab34b72547476b97009d643644ac33d4d3fe1821", size = 246611 }, + { url = "https://files.pythonhosted.org/packages/a8/62/279c13d584207d5697a752a66ffc9bb19355a95f7659140cb1b3cf82180e/multidict-6.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cdf22e4db76d323bcdc733514bf732e9fb349707c98d341d40ebcc6e9318ef3d", size = 243102 }, + { url = "https://files.pythonhosted.org/packages/69/cc/e06636f48c6d51e724a8bc8d9e1db5f136fe1df066d7cafe37ef4000f86a/multidict-6.6.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e995a34c3d44ab511bfc11aa26869b9d66c2d8c799fa0e74b28a473a692532d6", size = 238693 }, + { url = "https://files.pythonhosted.org/packages/89/a4/66c9d8fb9acf3b226cdd468ed009537ac65b520aebdc1703dd6908b19d33/multidict-6.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:766a4a5996f54361d8d5a9050140aa5362fe48ce51c755a50c0bc3706460c430", size = 246582 }, + { url = "https://files.pythonhosted.org/packages/cf/01/c69e0317be556e46257826d5449feb4e6aa0d18573e567a48a2c14156f1f/multidict-6.6.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3893a0d7d28a7fe6ca7a1f760593bc13038d1d35daf52199d431b61d2660602b", size = 253355 }, + { url = "https://files.pythonhosted.org/packages/c0/da/9cc1da0299762d20e626fe0042e71b5694f9f72d7d3f9678397cbaa71b2b/multidict-6.6.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:934796c81ea996e61914ba58064920d6cad5d99140ac3167901eb932150e2e56", size = 247774 }, + { url = "https://files.pythonhosted.org/packages/e6/91/b22756afec99cc31105ddd4a52f95ab32b1a4a58f4d417979c570c4a922e/multidict-6.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9ed948328aec2072bc00f05d961ceadfd3e9bfc2966c1319aeaf7b7c21219183", size = 242275 }, + { url = "https://files.pythonhosted.org/packages/be/f1/adcc185b878036a20399d5be5228f3cbe7f823d78985d101d425af35c800/multidict-6.6.3-cp311-cp311-win32.whl", hash = "sha256:9f5b28c074c76afc3e4c610c488e3493976fe0e596dd3db6c8ddfbb0134dcac5", size = 41290 }, + { url = "https://files.pythonhosted.org/packages/e0/d4/27652c1c6526ea6b4f5ddd397e93f4232ff5de42bea71d339bc6a6cc497f/multidict-6.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc7f6fbc61b1c16050a389c630da0b32fc6d4a3d191394ab78972bf5edc568c2", size = 45942 }, + { url = "https://files.pythonhosted.org/packages/16/18/23f4932019804e56d3c2413e237f866444b774b0263bcb81df2fdecaf593/multidict-6.6.3-cp311-cp311-win_arm64.whl", hash = "sha256:d4e47d8faffaae822fb5cba20937c048d4f734f43572e7079298a6c39fb172cb", size = 42880 }, + { url = "https://files.pythonhosted.org/packages/0e/a0/6b57988ea102da0623ea814160ed78d45a2645e4bbb499c2896d12833a70/multidict-6.6.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:056bebbeda16b2e38642d75e9e5310c484b7c24e3841dc0fb943206a72ec89d6", size = 76514 }, + { url = "https://files.pythonhosted.org/packages/07/7a/d1e92665b0850c6c0508f101f9cf0410c1afa24973e1115fe9c6a185ebf7/multidict-6.6.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e5f481cccb3c5c5e5de5d00b5141dc589c1047e60d07e85bbd7dea3d4580d63f", size = 45394 }, + { url = "https://files.pythonhosted.org/packages/52/6f/dd104490e01be6ef8bf9573705d8572f8c2d2c561f06e3826b081d9e6591/multidict-6.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:10bea2ee839a759ee368b5a6e47787f399b41e70cf0c20d90dfaf4158dfb4e55", size = 43590 }, + { url = "https://files.pythonhosted.org/packages/44/fe/06e0e01b1b0611e6581b7fd5a85b43dacc08b6cea3034f902f383b0873e5/multidict-6.6.3-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:2334cfb0fa9549d6ce2c21af2bfbcd3ac4ec3646b1b1581c88e3e2b1779ec92b", size = 237292 }, + { url = "https://files.pythonhosted.org/packages/ce/71/4f0e558fb77696b89c233c1ee2d92f3e1d5459070a0e89153c9e9e804186/multidict-6.6.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8fee016722550a2276ca2cb5bb624480e0ed2bd49125b2b73b7010b9090e888", size = 258385 }, + { url = "https://files.pythonhosted.org/packages/e3/25/cca0e68228addad24903801ed1ab42e21307a1b4b6dd2cf63da5d3ae082a/multidict-6.6.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5511cb35f5c50a2db21047c875eb42f308c5583edf96bd8ebf7d770a9d68f6d", size = 242328 }, + { url = "https://files.pythonhosted.org/packages/6e/a3/46f2d420d86bbcb8fe660b26a10a219871a0fbf4d43cb846a4031533f3e0/multidict-6.6.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:712b348f7f449948e0a6c4564a21c7db965af900973a67db432d724619b3c680", size = 268057 }, + { url = "https://files.pythonhosted.org/packages/9e/73/1c743542fe00794a2ec7466abd3f312ccb8fad8dff9f36d42e18fb1ec33e/multidict-6.6.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e4e15d2138ee2694e038e33b7c3da70e6b0ad8868b9f8094a72e1414aeda9c1a", size = 269341 }, + { url = "https://files.pythonhosted.org/packages/a4/11/6ec9dcbe2264b92778eeb85407d1df18812248bf3506a5a1754bc035db0c/multidict-6.6.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8df25594989aebff8a130f7899fa03cbfcc5d2b5f4a461cf2518236fe6f15961", size = 256081 }, + { url = "https://files.pythonhosted.org/packages/9b/2b/631b1e2afeb5f1696846d747d36cda075bfdc0bc7245d6ba5c319278d6c4/multidict-6.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:159ca68bfd284a8860f8d8112cf0521113bffd9c17568579e4d13d1f1dc76b65", size = 253581 }, + { url = "https://files.pythonhosted.org/packages/bf/0e/7e3b93f79efeb6111d3bf9a1a69e555ba1d07ad1c11bceb56b7310d0d7ee/multidict-6.6.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e098c17856a8c9ade81b4810888c5ad1914099657226283cab3062c0540b0643", size = 250750 }, + { url = "https://files.pythonhosted.org/packages/ad/9e/086846c1d6601948e7de556ee464a2d4c85e33883e749f46b9547d7b0704/multidict-6.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:67c92ed673049dec52d7ed39f8cf9ebbadf5032c774058b4406d18c8f8fe7063", size = 251548 }, + { url = "https://files.pythonhosted.org/packages/8c/7b/86ec260118e522f1a31550e87b23542294880c97cfbf6fb18cc67b044c66/multidict-6.6.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:bd0578596e3a835ef451784053cfd327d607fc39ea1a14812139339a18a0dbc3", size = 262718 }, + { url = "https://files.pythonhosted.org/packages/8c/bd/22ce8f47abb0be04692c9fc4638508b8340987b18691aa7775d927b73f72/multidict-6.6.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:346055630a2df2115cd23ae271910b4cae40f4e336773550dca4889b12916e75", size = 259603 }, + { url = "https://files.pythonhosted.org/packages/07/9c/91b7ac1691be95cd1f4a26e36a74b97cda6aa9820632d31aab4410f46ebd/multidict-6.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:555ff55a359302b79de97e0468e9ee80637b0de1fce77721639f7cd9440b3a10", size = 251351 }, + { url = "https://files.pythonhosted.org/packages/6f/5c/4d7adc739884f7a9fbe00d1eac8c034023ef8bad71f2ebe12823ca2e3649/multidict-6.6.3-cp312-cp312-win32.whl", hash = "sha256:73ab034fb8d58ff85c2bcbadc470efc3fafeea8affcf8722855fb94557f14cc5", size = 41860 }, + { url = "https://files.pythonhosted.org/packages/6a/a3/0fbc7afdf7cb1aa12a086b02959307848eb6bcc8f66fcb66c0cb57e2a2c1/multidict-6.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:04cbcce84f63b9af41bad04a54d4cc4e60e90c35b9e6ccb130be2d75b71f8c17", size = 45982 }, + { url = "https://files.pythonhosted.org/packages/b8/95/8c825bd70ff9b02462dc18d1295dd08d3e9e4eb66856d292ffa62cfe1920/multidict-6.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:0f1130b896ecb52d2a1e615260f3ea2af55fa7dc3d7c3003ba0c3121a759b18b", size = 43210 }, + { url = "https://files.pythonhosted.org/packages/52/1d/0bebcbbb4f000751fbd09957257903d6e002943fc668d841a4cf2fb7f872/multidict-6.6.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:540d3c06d48507357a7d57721e5094b4f7093399a0106c211f33540fdc374d55", size = 75843 }, + { url = "https://files.pythonhosted.org/packages/07/8f/cbe241b0434cfe257f65c2b1bcf9e8d5fb52bc708c5061fb29b0fed22bdf/multidict-6.6.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9c19cea2a690f04247d43f366d03e4eb110a0dc4cd1bbeee4d445435428ed35b", size = 45053 }, + { url = "https://files.pythonhosted.org/packages/32/d2/0b3b23f9dbad5b270b22a3ac3ea73ed0a50ef2d9a390447061178ed6bdb8/multidict-6.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7af039820cfd00effec86bda5d8debef711a3e86a1d3772e85bea0f243a4bd65", size = 43273 }, + { url = "https://files.pythonhosted.org/packages/fd/fe/6eb68927e823999e3683bc49678eb20374ba9615097d085298fd5b386564/multidict-6.6.3-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:500b84f51654fdc3944e936f2922114349bf8fdcac77c3092b03449f0e5bc2b3", size = 237124 }, + { url = "https://files.pythonhosted.org/packages/e7/ab/320d8507e7726c460cb77117848b3834ea0d59e769f36fdae495f7669929/multidict-6.6.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3fc723ab8a5c5ed6c50418e9bfcd8e6dceba6c271cee6728a10a4ed8561520c", size = 256892 }, + { url = "https://files.pythonhosted.org/packages/76/60/38ee422db515ac69834e60142a1a69111ac96026e76e8e9aa347fd2e4591/multidict-6.6.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:94c47ea3ade005b5976789baaed66d4de4480d0a0bf31cef6edaa41c1e7b56a6", size = 240547 }, + { url = "https://files.pythonhosted.org/packages/27/fb/905224fde2dff042b030c27ad95a7ae744325cf54b890b443d30a789b80e/multidict-6.6.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dbc7cf464cc6d67e83e136c9f55726da3a30176f020a36ead246eceed87f1cd8", size = 266223 }, + { url = "https://files.pythonhosted.org/packages/76/35/dc38ab361051beae08d1a53965e3e1a418752fc5be4d3fb983c5582d8784/multidict-6.6.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:900eb9f9da25ada070f8ee4a23f884e0ee66fe4e1a38c3af644256a508ad81ca", size = 267262 }, + { url = "https://files.pythonhosted.org/packages/1f/a3/0a485b7f36e422421b17e2bbb5a81c1af10eac1d4476f2ff92927c730479/multidict-6.6.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c6df517cf177da5d47ab15407143a89cd1a23f8b335f3a28d57e8b0a3dbb884", size = 254345 }, + { url = "https://files.pythonhosted.org/packages/b4/59/bcdd52c1dab7c0e0d75ff19cac751fbd5f850d1fc39172ce809a74aa9ea4/multidict-6.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ef421045f13879e21c994b36e728d8e7d126c91a64b9185810ab51d474f27e7", size = 252248 }, + { url = "https://files.pythonhosted.org/packages/bb/a4/2d96aaa6eae8067ce108d4acee6f45ced5728beda55c0f02ae1072c730d1/multidict-6.6.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:6c1e61bb4f80895c081790b6b09fa49e13566df8fbff817da3f85b3a8192e36b", size = 250115 }, + { url = "https://files.pythonhosted.org/packages/25/d2/ed9f847fa5c7d0677d4f02ea2c163d5e48573de3f57bacf5670e43a5ffaa/multidict-6.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e5e8523bb12d7623cd8300dbd91b9e439a46a028cd078ca695eb66ba31adee3c", size = 249649 }, + { url = "https://files.pythonhosted.org/packages/1f/af/9155850372563fc550803d3f25373308aa70f59b52cff25854086ecb4a79/multidict-6.6.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ef58340cc896219e4e653dade08fea5c55c6df41bcc68122e3be3e9d873d9a7b", size = 261203 }, + { url = "https://files.pythonhosted.org/packages/36/2f/c6a728f699896252cf309769089568a33c6439626648843f78743660709d/multidict-6.6.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc9dc435ec8699e7b602b94fe0cd4703e69273a01cbc34409af29e7820f777f1", size = 258051 }, + { url = "https://files.pythonhosted.org/packages/d0/60/689880776d6b18fa2b70f6cc74ff87dd6c6b9b47bd9cf74c16fecfaa6ad9/multidict-6.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9e864486ef4ab07db5e9cb997bad2b681514158d6954dd1958dfb163b83d53e6", size = 249601 }, + { url = "https://files.pythonhosted.org/packages/75/5e/325b11f2222a549019cf2ef879c1f81f94a0d40ace3ef55cf529915ba6cc/multidict-6.6.3-cp313-cp313-win32.whl", hash = "sha256:5633a82fba8e841bc5c5c06b16e21529573cd654f67fd833650a215520a6210e", size = 41683 }, + { url = "https://files.pythonhosted.org/packages/b1/ad/cf46e73f5d6e3c775cabd2a05976547f3f18b39bee06260369a42501f053/multidict-6.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:e93089c1570a4ad54c3714a12c2cef549dc9d58e97bcded193d928649cab78e9", size = 45811 }, + { url = "https://files.pythonhosted.org/packages/c5/c9/2e3fe950db28fb7c62e1a5f46e1e38759b072e2089209bc033c2798bb5ec/multidict-6.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:c60b401f192e79caec61f166da9c924e9f8bc65548d4246842df91651e83d600", size = 43056 }, + { url = "https://files.pythonhosted.org/packages/3a/58/aaf8114cf34966e084a8cc9517771288adb53465188843d5a19862cb6dc3/multidict-6.6.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:02fd8f32d403a6ff13864b0851f1f523d4c988051eea0471d4f1fd8010f11134", size = 82811 }, + { url = "https://files.pythonhosted.org/packages/71/af/5402e7b58a1f5b987a07ad98f2501fdba2a4f4b4c30cf114e3ce8db64c87/multidict-6.6.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f3aa090106b1543f3f87b2041eef3c156c8da2aed90c63a2fbed62d875c49c37", size = 48304 }, + { url = "https://files.pythonhosted.org/packages/39/65/ab3c8cafe21adb45b24a50266fd747147dec7847425bc2a0f6934b3ae9ce/multidict-6.6.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e924fb978615a5e33ff644cc42e6aa241effcf4f3322c09d4f8cebde95aff5f8", size = 46775 }, + { url = "https://files.pythonhosted.org/packages/49/ba/9fcc1b332f67cc0c0c8079e263bfab6660f87fe4e28a35921771ff3eea0d/multidict-6.6.3-cp313-cp313t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:b9fe5a0e57c6dbd0e2ce81ca66272282c32cd11d31658ee9553849d91289e1c1", size = 229773 }, + { url = "https://files.pythonhosted.org/packages/a4/14/0145a251f555f7c754ce2dcbcd012939bbd1f34f066fa5d28a50e722a054/multidict-6.6.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b24576f208793ebae00280c59927c3b7c2a3b1655e443a25f753c4611bc1c373", size = 250083 }, + { url = "https://files.pythonhosted.org/packages/9e/d4/d5c0bd2bbb173b586c249a151a26d2fb3ec7d53c96e42091c9fef4e1f10c/multidict-6.6.3-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:135631cb6c58eac37d7ac0df380294fecdc026b28837fa07c02e459c7fb9c54e", size = 228980 }, + { url = "https://files.pythonhosted.org/packages/21/32/c9a2d8444a50ec48c4733ccc67254100c10e1c8ae8e40c7a2d2183b59b97/multidict-6.6.3-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:274d416b0df887aef98f19f21578653982cfb8a05b4e187d4a17103322eeaf8f", size = 257776 }, + { url = "https://files.pythonhosted.org/packages/68/d0/14fa1699f4ef629eae08ad6201c6b476098f5efb051b296f4c26be7a9fdf/multidict-6.6.3-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e252017a817fad7ce05cafbe5711ed40faeb580e63b16755a3a24e66fa1d87c0", size = 256882 }, + { url = "https://files.pythonhosted.org/packages/da/88/84a27570fbe303c65607d517a5f147cd2fc046c2d1da02b84b17b9bdc2aa/multidict-6.6.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e4cc8d848cd4fe1cdee28c13ea79ab0ed37fc2e89dd77bac86a2e7959a8c3bc", size = 247816 }, + { url = "https://files.pythonhosted.org/packages/1c/60/dca352a0c999ce96a5d8b8ee0b2b9f729dcad2e0b0c195f8286269a2074c/multidict-6.6.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9e236a7094b9c4c1b7585f6b9cca34b9d833cf079f7e4c49e6a4a6ec9bfdc68f", size = 245341 }, + { url = "https://files.pythonhosted.org/packages/50/ef/433fa3ed06028f03946f3993223dada70fb700f763f70c00079533c34578/multidict-6.6.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e0cb0ab69915c55627c933f0b555a943d98ba71b4d1c57bc0d0a66e2567c7471", size = 235854 }, + { url = "https://files.pythonhosted.org/packages/1b/1f/487612ab56fbe35715320905215a57fede20de7db40a261759690dc80471/multidict-6.6.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:81ef2f64593aba09c5212a3d0f8c906a0d38d710a011f2f42759704d4557d3f2", size = 243432 }, + { url = "https://files.pythonhosted.org/packages/da/6f/ce8b79de16cd885c6f9052c96a3671373d00c59b3ee635ea93e6e81b8ccf/multidict-6.6.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:b9cbc60010de3562545fa198bfc6d3825df430ea96d2cc509c39bd71e2e7d648", size = 252731 }, + { url = "https://files.pythonhosted.org/packages/bb/fe/a2514a6aba78e5abefa1624ca85ae18f542d95ac5cde2e3815a9fbf369aa/multidict-6.6.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:70d974eaaa37211390cd02ef93b7e938de564bbffa866f0b08d07e5e65da783d", size = 247086 }, + { url = "https://files.pythonhosted.org/packages/8c/22/b788718d63bb3cce752d107a57c85fcd1a212c6c778628567c9713f9345a/multidict-6.6.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3713303e4a6663c6d01d648a68f2848701001f3390a030edaaf3fc949c90bf7c", size = 243338 }, + { url = "https://files.pythonhosted.org/packages/22/d6/fdb3d0670819f2228f3f7d9af613d5e652c15d170c83e5f1c94fbc55a25b/multidict-6.6.3-cp313-cp313t-win32.whl", hash = "sha256:639ecc9fe7cd73f2495f62c213e964843826f44505a3e5d82805aa85cac6f89e", size = 47812 }, + { url = "https://files.pythonhosted.org/packages/b6/d6/a9d2c808f2c489ad199723197419207ecbfbc1776f6e155e1ecea9c883aa/multidict-6.6.3-cp313-cp313t-win_amd64.whl", hash = "sha256:9f97e181f344a0ef3881b573d31de8542cc0dbc559ec68c8f8b5ce2c2e91646d", size = 53011 }, + { url = "https://files.pythonhosted.org/packages/f2/40/b68001cba8188dd267590a111f9661b6256debc327137667e832bf5d66e8/multidict-6.6.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ce8b7693da41a3c4fde5871c738a81490cea5496c671d74374c8ab889e1834fb", size = 45254 }, + { url = "https://files.pythonhosted.org/packages/d8/30/9aec301e9772b098c1f5c0ca0279237c9766d94b97802e9888010c64b0ed/multidict-6.6.3-py3-none-any.whl", hash = "sha256:8db10f29c7541fc5da4defd8cd697e1ca429db743fa716325f236079b96f775a", size = 12313 }, ] [[package]] @@ -1778,7 +1702,6 @@ dev = [ { name = "pytest" }, { name = "pytest-dependency" }, { name = "ruff" }, - { name = "safety" }, { name = "typeguard" }, { name = "xdoctest", extra = ["colors"] }, ] @@ -1795,40 +1718,39 @@ docs = [ [package.metadata] requires-dist = [ - { name = "adlfs", marker = "extra == 'cloud'", specifier = ">=2024.7.0" }, - { name = "bokeh", marker = "extra == 'distributed'", specifier = ">=3.4.2,<4.0.0" }, - { name = "click", specifier = ">=8.1.7,<9.0.0" }, + { name = "adlfs", marker = "extra == 'cloud'", specifier = ">=2024.12.0" }, + { name = "bokeh", marker = "extra == 'distributed'", specifier = ">=3.7.3,<4.0.0" }, + { name = "click", specifier = ">=8.2.1,<9.0.0" }, { name = "click-params", specifier = ">=0.5.0,<0.6.0" }, - { name = "dask", specifier = ">=2024.12.0" }, - { name = "distributed", marker = "extra == 'distributed'", specifier = ">=2024.12.0" }, - { name = "fsspec", specifier = ">=2024.10.0" }, - { name = "gcsfs", marker = "extra == 'cloud'", specifier = ">=2024.10.0" }, - { name = "pint", specifier = ">=0.24.3,<0.25" }, - { name = "psutil", specifier = ">=6.1.0,<7.0.0" }, - { name = "pydantic", specifier = ">=2.8.2,<3.0.0" }, - { name = "pydantic-settings", specifier = ">=2.4.0,<3.0.0" }, - { name = "rich", specifier = ">=13.9.4,<14.0.0" }, - { name = "s3fs", marker = "extra == 'cloud'", specifier = "==2024.12.0" }, - { name = "segy", specifier = ">=0.4.0,<0.5.0" }, - { name = "tqdm", specifier = ">=4.67.0,<5.0.0" }, - { name = "xarray", specifier = ">=2025.3.1" }, - { name = "zarr", specifier = ">=3.0.8,<4.0.0" }, + { name = "dask", specifier = ">=2025.5.1" }, + { name = "distributed", marker = "extra == 'distributed'", specifier = ">=2025.5.1" }, + { name = "fsspec", specifier = ">=2025.5.1" }, + { name = "gcsfs", marker = "extra == 'cloud'", specifier = ">=2025.5.1" }, + { name = "pint", specifier = ">=0.24.4,<0.25" }, + { name = "psutil", specifier = ">=7.0.0,<8.0.0" }, + { name = "pydantic", specifier = ">=2.11.7,<3.0.0" }, + { name = "pydantic-settings", specifier = ">=2.10.1,<3.0.0" }, + { name = "rich", specifier = ">=14.0.0,<15.0.0" }, + { name = "s3fs", marker = "extra == 'cloud'", specifier = "==2025.5.1" }, + { name = "segy", specifier = ">=0.4.1.post2,<0.5.0" }, + { name = "tqdm", specifier = ">=4.67.1,<5.0.0" }, + { name = "xarray", specifier = ">=2025.6.1" }, + { name = "zarr", specifier = ">=3.0.8,<3.0.9" }, { name = "zfpy", marker = "extra == 'lossy'", specifier = ">=1.0.1,<2.0.0" }, ] provides-extras = ["cloud", "distributed", "lossy"] [package.metadata.requires-dev] dev = [ - { name = "coverage", extras = ["toml"], specifier = ">=7.6.7,<8" }, - { name = "mypy", specifier = ">=1.13.0,<2" }, - { name = "pre-commit", specifier = ">=4.0.1,<5" }, + { name = "coverage", extras = ["toml"], specifier = ">=7.9.1,<8" }, + { name = "mypy", specifier = ">=1.16.1,<2" }, + { name = "pre-commit", specifier = ">=4.2.0,<5" }, { name = "pre-commit-hooks", specifier = ">=5.0.0,<6" }, - { name = "pygments", specifier = ">=2.18.0,<3" }, - { name = "pytest", specifier = ">=8.3.3,<9" }, + { name = "pygments", specifier = ">=2.19.2,<3" }, + { name = "pytest", specifier = ">=8.4.1,<9" }, { name = "pytest-dependency", specifier = ">=0.6.0,<0.7" }, - { name = "ruff", specifier = ">=0.11.8" }, - { name = "safety", specifier = ">=3.2.3,<4" }, - { name = "typeguard", specifier = ">=4.4.1,<5" }, + { name = "ruff", specifier = ">=0.12.1" }, + { name = "typeguard", specifier = ">=4.4.4,<5" }, { name = "xdoctest", extras = ["colors"], specifier = ">=1.2.0,<2" }, ] docs = [ @@ -1844,33 +1766,34 @@ docs = [ [[package]] name = "mypy" -version = "1.15.0" +version = "1.16.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mypy-extensions" }, + { name = "pathspec" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/43/d5e49a86afa64bd3839ea0d5b9c7103487007d728e1293f52525d6d5486a/mypy-1.15.0.tar.gz", hash = "sha256:404534629d51d3efea5c800ee7c42b72a6554d6c400e6a79eafe15d11341fd43", size = 3239717 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/03/bc/f6339726c627bd7ca1ce0fa56c9ae2d0144604a319e0e339bdadafbbb599/mypy-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2922d42e16d6de288022e5ca321cd0618b238cfc5570e0263e5ba0a77dbef56f", size = 10662338 }, - { url = "https://files.pythonhosted.org/packages/e2/90/8dcf506ca1a09b0d17555cc00cd69aee402c203911410136cd716559efe7/mypy-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2ee2d57e01a7c35de00f4634ba1bbf015185b219e4dc5909e281016df43f5ee5", size = 9787540 }, - { url = "https://files.pythonhosted.org/packages/05/05/a10f9479681e5da09ef2f9426f650d7b550d4bafbef683b69aad1ba87457/mypy-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:973500e0774b85d9689715feeffcc980193086551110fd678ebe1f4342fb7c5e", size = 11538051 }, - { url = "https://files.pythonhosted.org/packages/e9/9a/1f7d18b30edd57441a6411fcbc0c6869448d1a4bacbaee60656ac0fc29c8/mypy-1.15.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a95fb17c13e29d2d5195869262f8125dfdb5c134dc8d9a9d0aecf7525b10c2c", size = 12286751 }, - { url = "https://files.pythonhosted.org/packages/72/af/19ff499b6f1dafcaf56f9881f7a965ac2f474f69f6f618b5175b044299f5/mypy-1.15.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1905f494bfd7d85a23a88c5d97840888a7bd516545fc5aaedff0267e0bb54e2f", size = 12421783 }, - { url = "https://files.pythonhosted.org/packages/96/39/11b57431a1f686c1aed54bf794870efe0f6aeca11aca281a0bd87a5ad42c/mypy-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c9817fa23833ff189db061e6d2eff49b2f3b6ed9856b4a0a73046e41932d744f", size = 9265618 }, - { url = "https://files.pythonhosted.org/packages/98/3a/03c74331c5eb8bd025734e04c9840532226775c47a2c39b56a0c8d4f128d/mypy-1.15.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:aea39e0583d05124836ea645f412e88a5c7d0fd77a6d694b60d9b6b2d9f184fd", size = 10793981 }, - { url = "https://files.pythonhosted.org/packages/f0/1a/41759b18f2cfd568848a37c89030aeb03534411eef981df621d8fad08a1d/mypy-1.15.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2f2147ab812b75e5b5499b01ade1f4a81489a147c01585cda36019102538615f", size = 9749175 }, - { url = "https://files.pythonhosted.org/packages/12/7e/873481abf1ef112c582db832740f4c11b2bfa510e829d6da29b0ab8c3f9c/mypy-1.15.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ce436f4c6d218a070048ed6a44c0bbb10cd2cc5e272b29e7845f6a2f57ee4464", size = 11455675 }, - { url = "https://files.pythonhosted.org/packages/b3/d0/92ae4cde706923a2d3f2d6c39629134063ff64b9dedca9c1388363da072d/mypy-1.15.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8023ff13985661b50a5928fc7a5ca15f3d1affb41e5f0a9952cb68ef090b31ee", size = 12410020 }, - { url = "https://files.pythonhosted.org/packages/46/8b/df49974b337cce35f828ba6fda228152d6db45fed4c86ba56ffe442434fd/mypy-1.15.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1124a18bc11a6a62887e3e137f37f53fbae476dc36c185d549d4f837a2a6a14e", size = 12498582 }, - { url = "https://files.pythonhosted.org/packages/13/50/da5203fcf6c53044a0b699939f31075c45ae8a4cadf538a9069b165c1050/mypy-1.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:171a9ca9a40cd1843abeca0e405bc1940cd9b305eaeea2dda769ba096932bb22", size = 9366614 }, - { url = "https://files.pythonhosted.org/packages/6a/9b/fd2e05d6ffff24d912f150b87db9e364fa8282045c875654ce7e32fffa66/mypy-1.15.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93faf3fdb04768d44bf28693293f3904bbb555d076b781ad2530214ee53e3445", size = 10788592 }, - { url = "https://files.pythonhosted.org/packages/74/37/b246d711c28a03ead1fd906bbc7106659aed7c089d55fe40dd58db812628/mypy-1.15.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:811aeccadfb730024c5d3e326b2fbe9249bb7413553f15499a4050f7c30e801d", size = 9753611 }, - { url = "https://files.pythonhosted.org/packages/a6/ac/395808a92e10cfdac8003c3de9a2ab6dc7cde6c0d2a4df3df1b815ffd067/mypy-1.15.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:98b7b9b9aedb65fe628c62a6dc57f6d5088ef2dfca37903a7d9ee374d03acca5", size = 11438443 }, - { url = "https://files.pythonhosted.org/packages/d2/8b/801aa06445d2de3895f59e476f38f3f8d610ef5d6908245f07d002676cbf/mypy-1.15.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c43a7682e24b4f576d93072216bf56eeff70d9140241f9edec0c104d0c515036", size = 12402541 }, - { url = "https://files.pythonhosted.org/packages/c7/67/5a4268782eb77344cc613a4cf23540928e41f018a9a1ec4c6882baf20ab8/mypy-1.15.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:baefc32840a9f00babd83251560e0ae1573e2f9d1b067719479bfb0e987c6357", size = 12494348 }, - { url = "https://files.pythonhosted.org/packages/83/3e/57bb447f7bbbfaabf1712d96f9df142624a386d98fb026a761532526057e/mypy-1.15.0-cp313-cp313-win_amd64.whl", hash = "sha256:b9378e2c00146c44793c98b8d5a61039a048e31f429fb0eb546d93f4b000bedf", size = 9373648 }, - { url = "https://files.pythonhosted.org/packages/09/4e/a7d65c7322c510de2c409ff3828b03354a7c43f5a8ed458a7a131b41c7b9/mypy-1.15.0-py3-none-any.whl", hash = "sha256:5469affef548bd1895d86d3bf10ce2b44e33d86923c29e4d675b3e323437ea3e", size = 2221777 }, +sdist = { url = "https://files.pythonhosted.org/packages/81/69/92c7fa98112e4d9eb075a239caa4ef4649ad7d441545ccffbd5e34607cbb/mypy-1.16.1.tar.gz", hash = "sha256:6bd00a0a2094841c5e47e7374bb42b83d64c527a502e3334e1173a0c24437bab", size = 3324747 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/61/ec1245aa1c325cb7a6c0f8570a2eee3bfc40fa90d19b1267f8e50b5c8645/mypy-1.16.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:472e4e4c100062488ec643f6162dd0d5208e33e2f34544e1fc931372e806c0cc", size = 10890557 }, + { url = "https://files.pythonhosted.org/packages/6b/bb/6eccc0ba0aa0c7a87df24e73f0ad34170514abd8162eb0c75fd7128171fb/mypy-1.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea16e2a7d2714277e349e24d19a782a663a34ed60864006e8585db08f8ad1782", size = 10012921 }, + { url = "https://files.pythonhosted.org/packages/5f/80/b337a12e2006715f99f529e732c5f6a8c143bb58c92bb142d5ab380963a5/mypy-1.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08e850ea22adc4d8a4014651575567b0318ede51e8e9fe7a68f25391af699507", size = 11802887 }, + { url = "https://files.pythonhosted.org/packages/d9/59/f7af072d09793d581a745a25737c7c0a945760036b16aeb620f658a017af/mypy-1.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22d76a63a42619bfb90122889b903519149879ddbf2ba4251834727944c8baca", size = 12531658 }, + { url = "https://files.pythonhosted.org/packages/82/c4/607672f2d6c0254b94a646cfc45ad589dd71b04aa1f3d642b840f7cce06c/mypy-1.16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c7ce0662b6b9dc8f4ed86eb7a5d505ee3298c04b40ec13b30e572c0e5ae17c4", size = 12732486 }, + { url = "https://files.pythonhosted.org/packages/b6/5e/136555ec1d80df877a707cebf9081bd3a9f397dedc1ab9750518d87489ec/mypy-1.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:211287e98e05352a2e1d4e8759c5490925a7c784ddc84207f4714822f8cf99b6", size = 9479482 }, + { url = "https://files.pythonhosted.org/packages/b4/d6/39482e5fcc724c15bf6280ff5806548c7185e0c090712a3736ed4d07e8b7/mypy-1.16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:af4792433f09575d9eeca5c63d7d90ca4aeceda9d8355e136f80f8967639183d", size = 11066493 }, + { url = "https://files.pythonhosted.org/packages/e6/e5/26c347890efc6b757f4d5bb83f4a0cf5958b8cf49c938ac99b8b72b420a6/mypy-1.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66df38405fd8466ce3517eda1f6640611a0b8e70895e2a9462d1d4323c5eb4b9", size = 10081687 }, + { url = "https://files.pythonhosted.org/packages/44/c7/b5cb264c97b86914487d6a24bd8688c0172e37ec0f43e93b9691cae9468b/mypy-1.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44e7acddb3c48bd2713994d098729494117803616e116032af192871aed80b79", size = 11839723 }, + { url = "https://files.pythonhosted.org/packages/15/f8/491997a9b8a554204f834ed4816bda813aefda31cf873bb099deee3c9a99/mypy-1.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ab5eca37b50188163fa7c1b73c685ac66c4e9bdee4a85c9adac0e91d8895e15", size = 12722980 }, + { url = "https://files.pythonhosted.org/packages/df/f0/2bd41e174b5fd93bc9de9a28e4fb673113633b8a7f3a607fa4a73595e468/mypy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb6229b2c9086247e21a83c309754b9058b438704ad2f6807f0d8227f6ebdd", size = 12903328 }, + { url = "https://files.pythonhosted.org/packages/61/81/5572108a7bec2c46b8aff7e9b524f371fe6ab5efb534d38d6b37b5490da8/mypy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:1f0435cf920e287ff68af3d10a118a73f212deb2ce087619eb4e648116d1fe9b", size = 9562321 }, + { url = "https://files.pythonhosted.org/packages/28/e3/96964af4a75a949e67df4b95318fe2b7427ac8189bbc3ef28f92a1c5bc56/mypy-1.16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ddc91eb318c8751c69ddb200a5937f1232ee8efb4e64e9f4bc475a33719de438", size = 11063480 }, + { url = "https://files.pythonhosted.org/packages/f5/4d/cd1a42b8e5be278fab7010fb289d9307a63e07153f0ae1510a3d7b703193/mypy-1.16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:87ff2c13d58bdc4bbe7dc0dedfe622c0f04e2cb2a492269f3b418df2de05c536", size = 10090538 }, + { url = "https://files.pythonhosted.org/packages/c9/4f/c3c6b4b66374b5f68bab07c8cabd63a049ff69796b844bc759a0ca99bb2a/mypy-1.16.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a7cfb0fe29fe5a9841b7c8ee6dffb52382c45acdf68f032145b75620acfbd6f", size = 11836839 }, + { url = "https://files.pythonhosted.org/packages/b4/7e/81ca3b074021ad9775e5cb97ebe0089c0f13684b066a750b7dc208438403/mypy-1.16.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:051e1677689c9d9578b9c7f4d206d763f9bbd95723cd1416fad50db49d52f359", size = 12715634 }, + { url = "https://files.pythonhosted.org/packages/e9/95/bdd40c8be346fa4c70edb4081d727a54d0a05382d84966869738cfa8a497/mypy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d5d2309511cc56c021b4b4e462907c2b12f669b2dbeb68300110ec27723971be", size = 12895584 }, + { url = "https://files.pythonhosted.org/packages/5a/fd/d486a0827a1c597b3b48b1bdef47228a6e9ee8102ab8c28f944cb83b65dc/mypy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:4f58ac32771341e38a853c5d0ec0dfe27e18e27da9cdb8bbc882d2249c71a3ee", size = 9573886 }, + { url = "https://files.pythonhosted.org/packages/cf/d3/53e684e78e07c1a2bf7105715e5edd09ce951fc3f47cf9ed095ec1b7a037/mypy-1.16.1-py3-none-any.whl", hash = "sha256:5fc2ac4027d0ef28d6ba69a0343737a23c4d1b83672bf38d1fe237bdc0643b37", size = 2265923 }, ] [[package]] @@ -1922,11 +1845,11 @@ wheels = [ [[package]] name = "narwhals" -version = "1.41.0" +version = "1.45.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/32/fc/7b9a3689911662be59889b1b0b40e17d5dba6f98080994d86ca1f3154d41/narwhals-1.41.0.tar.gz", hash = "sha256:0ab2e5a1757a19b071e37ca74b53b0b5426789321d68939738337dfddea629b5", size = 488446 } +sdist = { url = "https://files.pythonhosted.org/packages/4c/9f/284886c5cea849b4ed1c55babcb48cb1084886139e8ac31e9849112ce6d0/narwhals-1.45.0.tar.gz", hash = "sha256:f9ecefb9d09cda6fefa8ead10dc37a79129b6c78b0ac7117d21b4d4486bdd0d1", size = 508812 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c9/e0/ade8619846645461c012498f02b93a659e50f07d9d9a6ffefdf5ea2c02a0/narwhals-1.41.0-py3-none-any.whl", hash = "sha256:d958336b40952e4c4b7aeef259a7074851da0800cf902186a58f2faeff97be02", size = 357968 }, + { url = "https://files.pythonhosted.org/packages/fe/a4/337a229d184b23ee63e6b730ac1588d77067af77c550dbf69cf1d74c3298/narwhals-1.45.0-py3-none-any.whl", hash = "sha256:0585612aa7ec89f9d061e78410b6fb8772794389d1a29d5799572d6b81999497", size = 371633 }, ] [[package]] @@ -1968,21 +1891,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, ] -[[package]] -name = "nltk" -version = "3.9.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "joblib" }, - { name = "regex" }, - { name = "tqdm" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/3c/87/db8be88ad32c2d042420b6fd9ffd4a149f9a0d7f0e86b3f543be2eeeedd2/nltk-3.9.1.tar.gz", hash = "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868", size = 2904691 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/66/7d9e26593edda06e8cb531874633f7c2372279c3b0f46235539fe546df8b/nltk-3.9.1-py3-none-any.whl", hash = "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1", size = 1505442 }, -] - [[package]] name = "nodeenv" version = "1.9.1" @@ -2101,11 +2009,11 @@ wheels = [ [[package]] name = "oauthlib" -version = "3.2.2" +version = "3.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6d/fa/fbf4001037904031639e6bfbfc02badfc7e12f137a8afa254df6c4c8a670/oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918", size = 177352 } +sdist = { url = "https://files.pythonhosted.org/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/80/cab10959dc1faead58dc8384a781dfbf93cb4d33d50988f7a69f1b7c9bbe/oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", size = 151688 }, + { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065 }, ] [[package]] @@ -2119,7 +2027,7 @@ wheels = [ [[package]] name = "pandas" -version = "2.2.3" +version = "2.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, @@ -2127,35 +2035,35 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9c/d6/9f8431bacc2e19dca897724cd097b1bb224a6ad5433784a44b587c7c13af/pandas-2.2.3.tar.gz", hash = "sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667", size = 4399213 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/44/d9502bf0ed197ba9bf1103c9867d5904ddcaf869e52329787fc54ed70cc8/pandas-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039", size = 12602222 }, - { url = "https://files.pythonhosted.org/packages/52/11/9eac327a38834f162b8250aab32a6781339c69afe7574368fffe46387edf/pandas-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd", size = 11321274 }, - { url = "https://files.pythonhosted.org/packages/45/fb/c4beeb084718598ba19aa9f5abbc8aed8b42f90930da861fcb1acdb54c3a/pandas-2.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698", size = 15579836 }, - { url = "https://files.pythonhosted.org/packages/cd/5f/4dba1d39bb9c38d574a9a22548c540177f78ea47b32f99c0ff2ec499fac5/pandas-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc", size = 13058505 }, - { url = "https://files.pythonhosted.org/packages/b9/57/708135b90391995361636634df1f1130d03ba456e95bcf576fada459115a/pandas-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3", size = 16744420 }, - { url = "https://files.pythonhosted.org/packages/86/4a/03ed6b7ee323cf30404265c284cee9c65c56a212e0a08d9ee06984ba2240/pandas-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32", size = 14440457 }, - { url = "https://files.pythonhosted.org/packages/ed/8c/87ddf1fcb55d11f9f847e3c69bb1c6f8e46e2f40ab1a2d2abadb2401b007/pandas-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5", size = 11617166 }, - { url = "https://files.pythonhosted.org/packages/17/a3/fb2734118db0af37ea7433f57f722c0a56687e14b14690edff0cdb4b7e58/pandas-2.2.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9", size = 12529893 }, - { url = "https://files.pythonhosted.org/packages/e1/0c/ad295fd74bfac85358fd579e271cded3ac969de81f62dd0142c426b9da91/pandas-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4", size = 11363475 }, - { url = "https://files.pythonhosted.org/packages/c6/2a/4bba3f03f7d07207481fed47f5b35f556c7441acddc368ec43d6643c5777/pandas-2.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3", size = 15188645 }, - { url = "https://files.pythonhosted.org/packages/38/f8/d8fddee9ed0d0c0f4a2132c1dfcf0e3e53265055da8df952a53e7eaf178c/pandas-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319", size = 12739445 }, - { url = "https://files.pythonhosted.org/packages/20/e8/45a05d9c39d2cea61ab175dbe6a2de1d05b679e8de2011da4ee190d7e748/pandas-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8", size = 16359235 }, - { url = "https://files.pythonhosted.org/packages/1d/99/617d07a6a5e429ff90c90da64d428516605a1ec7d7bea494235e1c3882de/pandas-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a", size = 14056756 }, - { url = "https://files.pythonhosted.org/packages/29/d4/1244ab8edf173a10fd601f7e13b9566c1b525c4f365d6bee918e68381889/pandas-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13", size = 11504248 }, - { url = "https://files.pythonhosted.org/packages/64/22/3b8f4e0ed70644e85cfdcd57454686b9057c6c38d2f74fe4b8bc2527214a/pandas-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015", size = 12477643 }, - { url = "https://files.pythonhosted.org/packages/e4/93/b3f5d1838500e22c8d793625da672f3eec046b1a99257666c94446969282/pandas-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28", size = 11281573 }, - { url = "https://files.pythonhosted.org/packages/f5/94/6c79b07f0e5aab1dcfa35a75f4817f5c4f677931d4234afcd75f0e6a66ca/pandas-2.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0", size = 15196085 }, - { url = "https://files.pythonhosted.org/packages/e8/31/aa8da88ca0eadbabd0a639788a6da13bb2ff6edbbb9f29aa786450a30a91/pandas-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24", size = 12711809 }, - { url = "https://files.pythonhosted.org/packages/ee/7c/c6dbdb0cb2a4344cacfb8de1c5808ca885b2e4dcfde8008266608f9372af/pandas-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659", size = 16356316 }, - { url = "https://files.pythonhosted.org/packages/57/b7/8b757e7d92023b832869fa8881a992696a0bfe2e26f72c9ae9f255988d42/pandas-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb", size = 14022055 }, - { url = "https://files.pythonhosted.org/packages/3b/bc/4b18e2b8c002572c5a441a64826252ce5da2aa738855747247a971988043/pandas-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d", size = 11481175 }, - { url = "https://files.pythonhosted.org/packages/76/a3/a5d88146815e972d40d19247b2c162e88213ef51c7c25993942c39dbf41d/pandas-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468", size = 12615650 }, - { url = "https://files.pythonhosted.org/packages/9c/8c/f0fd18f6140ddafc0c24122c8a964e48294acc579d47def376fef12bcb4a/pandas-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18", size = 11290177 }, - { url = "https://files.pythonhosted.org/packages/ed/f9/e995754eab9c0f14c6777401f7eece0943840b7a9fc932221c19d1abee9f/pandas-2.2.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2", size = 14651526 }, - { url = "https://files.pythonhosted.org/packages/25/b0/98d6ae2e1abac4f35230aa756005e8654649d305df9a28b16b9ae4353bff/pandas-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4", size = 11871013 }, - { url = "https://files.pythonhosted.org/packages/cc/57/0f72a10f9db6a4628744c8e8f0df4e6e21de01212c7c981d31e50ffc8328/pandas-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d", size = 15711620 }, - { url = "https://files.pythonhosted.org/packages/ab/5f/b38085618b950b79d2d9164a711c52b10aefc0ae6833b96f626b7021b2ed/pandas-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a", size = 13098436 }, +sdist = { url = "https://files.pythonhosted.org/packages/72/51/48f713c4c728d7c55ef7444ba5ea027c26998d96d1a40953b346438602fc/pandas-2.3.0.tar.gz", hash = "sha256:34600ab34ebf1131a7613a260a61dbe8b62c188ec0ea4c296da7c9a06b004133", size = 4484490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/1e/ba313812a699fe37bf62e6194265a4621be11833f5fce46d9eae22acb5d7/pandas-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8adff9f138fc614347ff33812046787f7d43b3cef7c0f0171b3340cae333f6ca", size = 11551836 }, + { url = "https://files.pythonhosted.org/packages/1b/cc/0af9c07f8d714ea563b12383a7e5bde9479cf32413ee2f346a9c5a801f22/pandas-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e5f08eb9a445d07720776df6e641975665c9ea12c9d8a331e0f6890f2dcd76ef", size = 10807977 }, + { url = "https://files.pythonhosted.org/packages/ee/3e/8c0fb7e2cf4a55198466ced1ca6a9054ae3b7e7630df7757031df10001fd/pandas-2.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa35c266c8cd1a67d75971a1912b185b492d257092bdd2709bbdebe574ed228d", size = 11788230 }, + { url = "https://files.pythonhosted.org/packages/14/22/b493ec614582307faf3f94989be0f7f0a71932ed6f56c9a80c0bb4a3b51e/pandas-2.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14a0cc77b0f089d2d2ffe3007db58f170dae9b9f54e569b299db871a3ab5bf46", size = 12370423 }, + { url = "https://files.pythonhosted.org/packages/9f/74/b012addb34cda5ce855218a37b258c4e056a0b9b334d116e518d72638737/pandas-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c06f6f144ad0a1bf84699aeea7eff6068ca5c63ceb404798198af7eb86082e33", size = 12990594 }, + { url = "https://files.pythonhosted.org/packages/95/81/b310e60d033ab64b08e66c635b94076488f0b6ce6a674379dd5b224fc51c/pandas-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ed16339bc354a73e0a609df36d256672c7d296f3f767ac07257801aa064ff73c", size = 13745952 }, + { url = "https://files.pythonhosted.org/packages/25/ac/f6ee5250a8881b55bd3aecde9b8cfddea2f2b43e3588bca68a4e9aaf46c8/pandas-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:fa07e138b3f6c04addfeaf56cc7fdb96c3b68a3fe5e5401251f231fce40a0d7a", size = 11094534 }, + { url = "https://files.pythonhosted.org/packages/94/46/24192607058dd607dbfacdd060a2370f6afb19c2ccb617406469b9aeb8e7/pandas-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2eb4728a18dcd2908c7fccf74a982e241b467d178724545a48d0caf534b38ebf", size = 11573865 }, + { url = "https://files.pythonhosted.org/packages/9f/cc/ae8ea3b800757a70c9fdccc68b67dc0280a6e814efcf74e4211fd5dea1ca/pandas-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9d8c3187be7479ea5c3d30c32a5d73d62a621166675063b2edd21bc47614027", size = 10702154 }, + { url = "https://files.pythonhosted.org/packages/d8/ba/a7883d7aab3d24c6540a2768f679e7414582cc389876d469b40ec749d78b/pandas-2.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ff730713d4c4f2f1c860e36c005c7cefc1c7c80c21c0688fd605aa43c9fcf09", size = 11262180 }, + { url = "https://files.pythonhosted.org/packages/01/a5/931fc3ad333d9d87b10107d948d757d67ebcfc33b1988d5faccc39c6845c/pandas-2.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba24af48643b12ffe49b27065d3babd52702d95ab70f50e1b34f71ca703e2c0d", size = 11991493 }, + { url = "https://files.pythonhosted.org/packages/d7/bf/0213986830a92d44d55153c1d69b509431a972eb73f204242988c4e66e86/pandas-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:404d681c698e3c8a40a61d0cd9412cc7364ab9a9cc6e144ae2992e11a2e77a20", size = 12470733 }, + { url = "https://files.pythonhosted.org/packages/a4/0e/21eb48a3a34a7d4bac982afc2c4eb5ab09f2d988bdf29d92ba9ae8e90a79/pandas-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6021910b086b3ca756755e86ddc64e0ddafd5e58e076c72cb1585162e5ad259b", size = 13212406 }, + { url = "https://files.pythonhosted.org/packages/1f/d9/74017c4eec7a28892d8d6e31ae9de3baef71f5a5286e74e6b7aad7f8c837/pandas-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:094e271a15b579650ebf4c5155c05dcd2a14fd4fdd72cf4854b2f7ad31ea30be", size = 10976199 }, + { url = "https://files.pythonhosted.org/packages/d3/57/5cb75a56a4842bbd0511c3d1c79186d8315b82dac802118322b2de1194fe/pandas-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c7e2fc25f89a49a11599ec1e76821322439d90820108309bf42130d2f36c983", size = 11518913 }, + { url = "https://files.pythonhosted.org/packages/05/01/0c8785610e465e4948a01a059562176e4c8088aa257e2e074db868f86d4e/pandas-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c6da97aeb6a6d233fb6b17986234cc723b396b50a3c6804776351994f2a658fd", size = 10655249 }, + { url = "https://files.pythonhosted.org/packages/e8/6a/47fd7517cd8abe72a58706aab2b99e9438360d36dcdb052cf917b7bf3bdc/pandas-2.3.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb32dc743b52467d488e7a7c8039b821da2826a9ba4f85b89ea95274f863280f", size = 11328359 }, + { url = "https://files.pythonhosted.org/packages/2a/b3/463bfe819ed60fb7e7ddffb4ae2ee04b887b3444feee6c19437b8f834837/pandas-2.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:213cd63c43263dbb522c1f8a7c9d072e25900f6975596f883f4bebd77295d4f3", size = 12024789 }, + { url = "https://files.pythonhosted.org/packages/04/0c/e0704ccdb0ac40aeb3434d1c641c43d05f75c92e67525df39575ace35468/pandas-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1d2b33e68d0ce64e26a4acc2e72d747292084f4e8db4c847c6f5f6cbe56ed6d8", size = 12480734 }, + { url = "https://files.pythonhosted.org/packages/e9/df/815d6583967001153bb27f5cf075653d69d51ad887ebbf4cfe1173a1ac58/pandas-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:430a63bae10b5086995db1b02694996336e5a8ac9a96b4200572b413dfdfccb9", size = 13223381 }, + { url = "https://files.pythonhosted.org/packages/79/88/ca5973ed07b7f484c493e941dbff990861ca55291ff7ac67c815ce347395/pandas-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:4930255e28ff5545e2ca404637bcc56f031893142773b3468dc021c6c32a1390", size = 10970135 }, + { url = "https://files.pythonhosted.org/packages/24/fb/0994c14d1f7909ce83f0b1fb27958135513c4f3f2528bde216180aa73bfc/pandas-2.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f925f1ef673b4bd0271b1809b72b3270384f2b7d9d14a189b12b7fc02574d575", size = 12141356 }, + { url = "https://files.pythonhosted.org/packages/9d/a2/9b903e5962134497ac4f8a96f862ee3081cb2506f69f8e4778ce3d9c9d82/pandas-2.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78ad363ddb873a631e92a3c063ade1ecfb34cae71e9a2be6ad100f875ac1042", size = 11474674 }, + { url = "https://files.pythonhosted.org/packages/81/3a/3806d041bce032f8de44380f866059437fb79e36d6b22c82c187e65f765b/pandas-2.3.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:951805d146922aed8357e4cc5671b8b0b9be1027f0619cea132a9f3f65f2f09c", size = 11439876 }, + { url = "https://files.pythonhosted.org/packages/15/aa/3fc3181d12b95da71f5c2537c3e3b3af6ab3a8c392ab41ebb766e0929bc6/pandas-2.3.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a881bc1309f3fce34696d07b00f13335c41f5f5a8770a33b09ebe23261cfc67", size = 11966182 }, + { url = "https://files.pythonhosted.org/packages/37/e7/e12f2d9b0a2c4a2cc86e2aabff7ccfd24f03e597d770abfa2acd313ee46b/pandas-2.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e1991bbb96f4050b09b5f811253c4f3cf05ee89a589379aa36cd623f21a31d6f", size = 12547686 }, + { url = "https://files.pythonhosted.org/packages/39/c2/646d2e93e0af70f4e5359d870a63584dacbc324b54d73e6b3267920ff117/pandas-2.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:bb3be958022198531eb7ec2008cfc78c5b1eed51af8600c6c5d9160d89d8d249", size = 13231847 }, ] [[package]] @@ -2180,6 +2088,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl", hash = "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", size = 18905 }, ] +[[package]] +name = "pathspec" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, +] + [[package]] name = "pexpect" version = "4.9.0" @@ -2194,61 +2111,54 @@ wheels = [ [[package]] name = "pillow" -version = "11.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/cb/bb5c01fcd2a69335b86c22142b2bccfc3464087efb7fd382eee5ffc7fdf7/pillow-11.2.1.tar.gz", hash = "sha256:a64dd61998416367b7ef979b73d3a85853ba9bec4c2925f74e588879a58716b6", size = 47026707 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/68/08/3fbf4b98924c73037a8e8b4c2c774784805e0fb4ebca6c5bb60795c40125/pillow-11.2.1-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35ca289f712ccfc699508c4658a1d14652e8033e9b69839edf83cbdd0ba39e70", size = 3198450 }, - { url = "https://files.pythonhosted.org/packages/84/92/6505b1af3d2849d5e714fc75ba9e69b7255c05ee42383a35a4d58f576b16/pillow-11.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0409af9f829f87a2dfb7e259f78f317a5351f2045158be321fd135973fff7bf", size = 3030550 }, - { url = "https://files.pythonhosted.org/packages/3c/8c/ac2f99d2a70ff966bc7eb13dacacfaab57c0549b2ffb351b6537c7840b12/pillow-11.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4e5c5edee874dce4f653dbe59db7c73a600119fbea8d31f53423586ee2aafd7", size = 4415018 }, - { url = "https://files.pythonhosted.org/packages/1f/e3/0a58b5d838687f40891fff9cbaf8669f90c96b64dc8f91f87894413856c6/pillow-11.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93a07e76d13bff9444f1a029e0af2964e654bfc2e2c2d46bfd080df5ad5f3d8", size = 4498006 }, - { url = "https://files.pythonhosted.org/packages/21/f5/6ba14718135f08fbfa33308efe027dd02b781d3f1d5c471444a395933aac/pillow-11.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:e6def7eed9e7fa90fde255afaf08060dc4b343bbe524a8f69bdd2a2f0018f600", size = 4517773 }, - { url = "https://files.pythonhosted.org/packages/20/f2/805ad600fc59ebe4f1ba6129cd3a75fb0da126975c8579b8f57abeb61e80/pillow-11.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8f4f3724c068be008c08257207210c138d5f3731af6c155a81c2b09a9eb3a788", size = 4607069 }, - { url = "https://files.pythonhosted.org/packages/71/6b/4ef8a288b4bb2e0180cba13ca0a519fa27aa982875882392b65131401099/pillow-11.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a0a6709b47019dff32e678bc12c63008311b82b9327613f534e496dacaefb71e", size = 4583460 }, - { url = "https://files.pythonhosted.org/packages/62/ae/f29c705a09cbc9e2a456590816e5c234382ae5d32584f451c3eb41a62062/pillow-11.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6b0c664ccb879109ee3ca702a9272d877f4fcd21e5eb63c26422fd6e415365e", size = 4661304 }, - { url = "https://files.pythonhosted.org/packages/6e/1a/c8217b6f2f73794a5e219fbad087701f412337ae6dbb956db37d69a9bc43/pillow-11.2.1-cp311-cp311-win32.whl", hash = "sha256:cc5d875d56e49f112b6def6813c4e3d3036d269c008bf8aef72cd08d20ca6df6", size = 2331809 }, - { url = "https://files.pythonhosted.org/packages/e2/72/25a8f40170dc262e86e90f37cb72cb3de5e307f75bf4b02535a61afcd519/pillow-11.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:0f5c7eda47bf8e3c8a283762cab94e496ba977a420868cb819159980b6709193", size = 2676338 }, - { url = "https://files.pythonhosted.org/packages/06/9e/76825e39efee61efea258b479391ca77d64dbd9e5804e4ad0fa453b4ba55/pillow-11.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:4d375eb838755f2528ac8cbc926c3e31cc49ca4ad0cf79cff48b20e30634a4a7", size = 2414918 }, - { url = "https://files.pythonhosted.org/packages/c7/40/052610b15a1b8961f52537cc8326ca6a881408bc2bdad0d852edeb6ed33b/pillow-11.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:78afba22027b4accef10dbd5eed84425930ba41b3ea0a86fa8d20baaf19d807f", size = 3190185 }, - { url = "https://files.pythonhosted.org/packages/e5/7e/b86dbd35a5f938632093dc40d1682874c33dcfe832558fc80ca56bfcb774/pillow-11.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78092232a4ab376a35d68c4e6d5e00dfd73454bd12b230420025fbe178ee3b0b", size = 3030306 }, - { url = "https://files.pythonhosted.org/packages/a4/5c/467a161f9ed53e5eab51a42923c33051bf8d1a2af4626ac04f5166e58e0c/pillow-11.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a5f306095c6780c52e6bbb6109624b95c5b18e40aab1c3041da3e9e0cd3e2d", size = 4416121 }, - { url = "https://files.pythonhosted.org/packages/62/73/972b7742e38ae0e2ac76ab137ca6005dcf877480da0d9d61d93b613065b4/pillow-11.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c7b29dbd4281923a2bfe562acb734cee96bbb129e96e6972d315ed9f232bef4", size = 4501707 }, - { url = "https://files.pythonhosted.org/packages/e4/3a/427e4cb0b9e177efbc1a84798ed20498c4f233abde003c06d2650a6d60cb/pillow-11.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e645b020f3209a0181a418bffe7b4a93171eef6c4ef6cc20980b30bebf17b7d", size = 4522921 }, - { url = "https://files.pythonhosted.org/packages/fe/7c/d8b1330458e4d2f3f45d9508796d7caf0c0d3764c00c823d10f6f1a3b76d/pillow-11.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b2dbea1012ccb784a65349f57bbc93730b96e85b42e9bf7b01ef40443db720b4", size = 4612523 }, - { url = "https://files.pythonhosted.org/packages/b3/2f/65738384e0b1acf451de5a573d8153fe84103772d139e1e0bdf1596be2ea/pillow-11.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:da3104c57bbd72948d75f6a9389e6727d2ab6333c3617f0a89d72d4940aa0443", size = 4587836 }, - { url = "https://files.pythonhosted.org/packages/6a/c5/e795c9f2ddf3debb2dedd0df889f2fe4b053308bb59a3cc02a0cd144d641/pillow-11.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:598174aef4589af795f66f9caab87ba4ff860ce08cd5bb447c6fc553ffee603c", size = 4669390 }, - { url = "https://files.pythonhosted.org/packages/96/ae/ca0099a3995976a9fce2f423166f7bff9b12244afdc7520f6ed38911539a/pillow-11.2.1-cp312-cp312-win32.whl", hash = "sha256:1d535df14716e7f8776b9e7fee118576d65572b4aad3ed639be9e4fa88a1cad3", size = 2332309 }, - { url = "https://files.pythonhosted.org/packages/7c/18/24bff2ad716257fc03da964c5e8f05d9790a779a8895d6566e493ccf0189/pillow-11.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:14e33b28bf17c7a38eede290f77db7c664e4eb01f7869e37fa98a5aa95978941", size = 2676768 }, - { url = "https://files.pythonhosted.org/packages/da/bb/e8d656c9543276517ee40184aaa39dcb41e683bca121022f9323ae11b39d/pillow-11.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:21e1470ac9e5739ff880c211fc3af01e3ae505859392bf65458c224d0bf283eb", size = 2415087 }, - { url = "https://files.pythonhosted.org/packages/36/9c/447528ee3776e7ab8897fe33697a7ff3f0475bb490c5ac1456a03dc57956/pillow-11.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fdec757fea0b793056419bca3e9932eb2b0ceec90ef4813ea4c1e072c389eb28", size = 3190098 }, - { url = "https://files.pythonhosted.org/packages/b5/09/29d5cd052f7566a63e5b506fac9c60526e9ecc553825551333e1e18a4858/pillow-11.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b0e130705d568e2f43a17bcbe74d90958e8a16263868a12c3e0d9c8162690830", size = 3030166 }, - { url = "https://files.pythonhosted.org/packages/71/5d/446ee132ad35e7600652133f9c2840b4799bbd8e4adba881284860da0a36/pillow-11.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bdb5e09068332578214cadd9c05e3d64d99e0e87591be22a324bdbc18925be0", size = 4408674 }, - { url = "https://files.pythonhosted.org/packages/69/5f/cbe509c0ddf91cc3a03bbacf40e5c2339c4912d16458fcb797bb47bcb269/pillow-11.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d189ba1bebfbc0c0e529159631ec72bb9e9bc041f01ec6d3233d6d82eb823bc1", size = 4496005 }, - { url = "https://files.pythonhosted.org/packages/f9/b3/dd4338d8fb8a5f312021f2977fb8198a1184893f9b00b02b75d565c33b51/pillow-11.2.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:191955c55d8a712fab8934a42bfefbf99dd0b5875078240943f913bb66d46d9f", size = 4518707 }, - { url = "https://files.pythonhosted.org/packages/13/eb/2552ecebc0b887f539111c2cd241f538b8ff5891b8903dfe672e997529be/pillow-11.2.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:ad275964d52e2243430472fc5d2c2334b4fc3ff9c16cb0a19254e25efa03a155", size = 4610008 }, - { url = "https://files.pythonhosted.org/packages/72/d1/924ce51bea494cb6e7959522d69d7b1c7e74f6821d84c63c3dc430cbbf3b/pillow-11.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:750f96efe0597382660d8b53e90dd1dd44568a8edb51cb7f9d5d918b80d4de14", size = 4585420 }, - { url = "https://files.pythonhosted.org/packages/43/ab/8f81312d255d713b99ca37479a4cb4b0f48195e530cdc1611990eb8fd04b/pillow-11.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fe15238d3798788d00716637b3d4e7bb6bde18b26e5d08335a96e88564a36b6b", size = 4667655 }, - { url = "https://files.pythonhosted.org/packages/94/86/8f2e9d2dc3d308dfd137a07fe1cc478df0a23d42a6c4093b087e738e4827/pillow-11.2.1-cp313-cp313-win32.whl", hash = "sha256:3fe735ced9a607fee4f481423a9c36701a39719252a9bb251679635f99d0f7d2", size = 2332329 }, - { url = "https://files.pythonhosted.org/packages/6d/ec/1179083b8d6067a613e4d595359b5fdea65d0a3b7ad623fee906e1b3c4d2/pillow-11.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:74ee3d7ecb3f3c05459ba95eed5efa28d6092d751ce9bf20e3e253a4e497e691", size = 2676388 }, - { url = "https://files.pythonhosted.org/packages/23/f1/2fc1e1e294de897df39fa8622d829b8828ddad938b0eaea256d65b84dd72/pillow-11.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:5119225c622403afb4b44bad4c1ca6c1f98eed79db8d3bc6e4e160fc6339d66c", size = 2414950 }, - { url = "https://files.pythonhosted.org/packages/c4/3e/c328c48b3f0ead7bab765a84b4977acb29f101d10e4ef57a5e3400447c03/pillow-11.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8ce2e8411c7aaef53e6bb29fe98f28cd4fbd9a1d9be2eeea434331aac0536b22", size = 3192759 }, - { url = "https://files.pythonhosted.org/packages/18/0e/1c68532d833fc8b9f404d3a642991441d9058eccd5606eab31617f29b6d4/pillow-11.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9ee66787e095127116d91dea2143db65c7bb1e232f617aa5957c0d9d2a3f23a7", size = 3033284 }, - { url = "https://files.pythonhosted.org/packages/b7/cb/6faf3fb1e7705fd2db74e070f3bf6f88693601b0ed8e81049a8266de4754/pillow-11.2.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9622e3b6c1d8b551b6e6f21873bdcc55762b4b2126633014cea1803368a9aa16", size = 4445826 }, - { url = "https://files.pythonhosted.org/packages/07/94/8be03d50b70ca47fb434a358919d6a8d6580f282bbb7af7e4aa40103461d/pillow-11.2.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63b5dff3a68f371ea06025a1a6966c9a1e1ee452fc8020c2cd0ea41b83e9037b", size = 4527329 }, - { url = "https://files.pythonhosted.org/packages/fd/a4/bfe78777076dc405e3bd2080bc32da5ab3945b5a25dc5d8acaa9de64a162/pillow-11.2.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:31df6e2d3d8fc99f993fd253e97fae451a8db2e7207acf97859732273e108406", size = 4549049 }, - { url = "https://files.pythonhosted.org/packages/65/4d/eaf9068dc687c24979e977ce5677e253624bd8b616b286f543f0c1b91662/pillow-11.2.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:062b7a42d672c45a70fa1f8b43d1d38ff76b63421cbbe7f88146b39e8a558d91", size = 4635408 }, - { url = "https://files.pythonhosted.org/packages/1d/26/0fd443365d9c63bc79feb219f97d935cd4b93af28353cba78d8e77b61719/pillow-11.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4eb92eca2711ef8be42fd3f67533765d9fd043b8c80db204f16c8ea62ee1a751", size = 4614863 }, - { url = "https://files.pythonhosted.org/packages/49/65/dca4d2506be482c2c6641cacdba5c602bc76d8ceb618fd37de855653a419/pillow-11.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f91ebf30830a48c825590aede79376cb40f110b387c17ee9bd59932c961044f9", size = 4692938 }, - { url = "https://files.pythonhosted.org/packages/b3/92/1ca0c3f09233bd7decf8f7105a1c4e3162fb9142128c74adad0fb361b7eb/pillow-11.2.1-cp313-cp313t-win32.whl", hash = "sha256:e0b55f27f584ed623221cfe995c912c61606be8513bfa0e07d2c674b4516d9dd", size = 2335774 }, - { url = "https://files.pythonhosted.org/packages/a5/ac/77525347cb43b83ae905ffe257bbe2cc6fd23acb9796639a1f56aa59d191/pillow-11.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:36d6b82164c39ce5482f649b437382c0fb2395eabc1e2b1702a6deb8ad647d6e", size = 2681895 }, - { url = "https://files.pythonhosted.org/packages/67/32/32dc030cfa91ca0fc52baebbba2e009bb001122a1daa8b6a79ad830b38d3/pillow-11.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:225c832a13326e34f212d2072982bb1adb210e0cc0b153e688743018c94a2681", size = 2417234 }, - { url = "https://files.pythonhosted.org/packages/a4/ad/2613c04633c7257d9481ab21d6b5364b59fc5d75faafd7cb8693523945a3/pillow-11.2.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:80f1df8dbe9572b4b7abdfa17eb5d78dd620b1d55d9e25f834efdbee872d3aed", size = 3181734 }, - { url = "https://files.pythonhosted.org/packages/a4/fd/dcdda4471ed667de57bb5405bb42d751e6cfdd4011a12c248b455c778e03/pillow-11.2.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ea926cfbc3957090becbcbbb65ad177161a2ff2ad578b5a6ec9bb1e1cd78753c", size = 2999841 }, - { url = "https://files.pythonhosted.org/packages/ac/89/8a2536e95e77432833f0db6fd72a8d310c8e4272a04461fb833eb021bf94/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:738db0e0941ca0376804d4de6a782c005245264edaa253ffce24e5a15cbdc7bd", size = 3437470 }, - { url = "https://files.pythonhosted.org/packages/9d/8f/abd47b73c60712f88e9eda32baced7bfc3e9bd6a7619bb64b93acff28c3e/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db98ab6565c69082ec9b0d4e40dd9f6181dab0dd236d26f7a50b8b9bfbd5076", size = 3460013 }, - { url = "https://files.pythonhosted.org/packages/f6/20/5c0a0aa83b213b7a07ec01e71a3d6ea2cf4ad1d2c686cc0168173b6089e7/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:036e53f4170e270ddb8797d4c590e6dd14d28e15c7da375c18978045f7e6c37b", size = 3527165 }, - { url = "https://files.pythonhosted.org/packages/58/0e/2abab98a72202d91146abc839e10c14f7cf36166f12838ea0c4db3ca6ecb/pillow-11.2.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:14f73f7c291279bd65fda51ee87affd7c1e097709f7fdd0188957a16c264601f", size = 3571586 }, - { url = "https://files.pythonhosted.org/packages/21/2c/5e05f58658cf49b6667762cca03d6e7d85cededde2caf2ab37b81f80e574/pillow-11.2.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:208653868d5c9ecc2b327f9b9ef34e0e42a4cdd172c2988fd81d62d2bc9bc044", size = 2674751 }, +version = "11.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/26/77f8ed17ca4ffd60e1dcd220a6ec6d71210ba398cfa33a13a1cd614c5613/pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", size = 5316531 }, + { url = "https://files.pythonhosted.org/packages/cb/39/ee475903197ce709322a17a866892efb560f57900d9af2e55f86db51b0a5/pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", size = 4686560 }, + { url = "https://files.pythonhosted.org/packages/6e/db/839d6ba7fd38b51af641aa904e2960e7a5644d60ec754c046b7d2aee00e5/pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", size = 5973053 }, + { url = "https://files.pythonhosted.org/packages/f2/2f/d7675ecae6c43e9f12aa8d58b6012683b20b6edfbdac7abcb4e6af7a3784/pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", size = 6640273 }, + { url = "https://files.pythonhosted.org/packages/45/ad/931694675ede172e15b2ff03c8144a0ddaea1d87adb72bb07655eaffb654/pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", size = 6082043 }, + { url = "https://files.pythonhosted.org/packages/3a/04/ba8f2b11fc80d2dd462d7abec16351b45ec99cbbaea4387648a44190351a/pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94", size = 6715516 }, + { url = "https://files.pythonhosted.org/packages/48/59/8cd06d7f3944cc7d892e8533c56b0acb68399f640786313275faec1e3b6f/pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0", size = 6274768 }, + { url = "https://files.pythonhosted.org/packages/f1/cc/29c0f5d64ab8eae20f3232da8f8571660aa0ab4b8f1331da5c2f5f9a938e/pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac", size = 6986055 }, + { url = "https://files.pythonhosted.org/packages/c6/df/90bd886fabd544c25addd63e5ca6932c86f2b701d5da6c7839387a076b4a/pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd", size = 2423079 }, + { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800 }, + { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296 }, + { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787 }, + { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236 }, + { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950 }, + { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358 }, + { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079 }, + { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324 }, + { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067 }, + { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328 }, + { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652 }, + { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443 }, + { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474 }, + { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038 }, + { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503 }, + { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574 }, + { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060 }, + { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407 }, + { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841 }, + { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450 }, + { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055 }, + { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110 }, + { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547 }, + { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001 }, + { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814 }, + { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124 }, + { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186 }, + { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546 }, + { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102 }, + { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803 }, + { url = "https://files.pythonhosted.org/packages/9e/e3/6fa84033758276fb31da12e5fb66ad747ae83b93c67af17f8c6ff4cc8f34/pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", size = 5270566 }, + { url = "https://files.pythonhosted.org/packages/5b/ee/e8d2e1ab4892970b561e1ba96cbd59c0d28cf66737fc44abb2aec3795a4e/pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", size = 4654618 }, + { url = "https://files.pythonhosted.org/packages/31/5e/03966aedfbfcbb4d5f8aa042452d3361f325b963ebbadddac05b122e47dd/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", size = 4957170 }, + { url = "https://files.pythonhosted.org/packages/cc/2d/e082982aacc927fc2cab48e1e731bdb1643a1406acace8bed0900a61464e/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", size = 5581505 }, + { url = "https://files.pythonhosted.org/packages/34/e7/ae39f538fd6844e982063c3a5e4598b8ced43b9633baa3a85ef33af8c05c/pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", size = 6984598 }, ] [[package]] @@ -2326,75 +2236,75 @@ wheels = [ [[package]] name = "propcache" -version = "0.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/07/c8/fdc6686a986feae3541ea23dcaa661bd93972d3940460646c6bb96e21c40/propcache-0.3.1.tar.gz", hash = "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", size = 43651 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/0f/5a5319ee83bd651f75311fcb0c492c21322a7fc8f788e4eef23f44243427/propcache-0.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5", size = 80243 }, - { url = "https://files.pythonhosted.org/packages/ce/84/3db5537e0879942783e2256616ff15d870a11d7ac26541336fe1b673c818/propcache-0.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371", size = 46503 }, - { url = "https://files.pythonhosted.org/packages/e2/c8/b649ed972433c3f0d827d7f0cf9ea47162f4ef8f4fe98c5f3641a0bc63ff/propcache-0.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da", size = 45934 }, - { url = "https://files.pythonhosted.org/packages/59/f9/4c0a5cf6974c2c43b1a6810c40d889769cc8f84cea676cbe1e62766a45f8/propcache-0.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744", size = 233633 }, - { url = "https://files.pythonhosted.org/packages/e7/64/66f2f4d1b4f0007c6e9078bd95b609b633d3957fe6dd23eac33ebde4b584/propcache-0.3.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0", size = 241124 }, - { url = "https://files.pythonhosted.org/packages/aa/bf/7b8c9fd097d511638fa9b6af3d986adbdf567598a567b46338c925144c1b/propcache-0.3.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5", size = 240283 }, - { url = "https://files.pythonhosted.org/packages/fa/c9/e85aeeeaae83358e2a1ef32d6ff50a483a5d5248bc38510d030a6f4e2816/propcache-0.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256", size = 232498 }, - { url = "https://files.pythonhosted.org/packages/8e/66/acb88e1f30ef5536d785c283af2e62931cb934a56a3ecf39105887aa8905/propcache-0.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073", size = 221486 }, - { url = "https://files.pythonhosted.org/packages/f5/f9/233ddb05ffdcaee4448508ee1d70aa7deff21bb41469ccdfcc339f871427/propcache-0.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d", size = 222675 }, - { url = "https://files.pythonhosted.org/packages/98/b8/eb977e28138f9e22a5a789daf608d36e05ed93093ef12a12441030da800a/propcache-0.3.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f", size = 215727 }, - { url = "https://files.pythonhosted.org/packages/89/2d/5f52d9c579f67b8ee1edd9ec073c91b23cc5b7ff7951a1e449e04ed8fdf3/propcache-0.3.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0", size = 217878 }, - { url = "https://files.pythonhosted.org/packages/7a/fd/5283e5ed8a82b00c7a989b99bb6ea173db1ad750bf0bf8dff08d3f4a4e28/propcache-0.3.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a", size = 230558 }, - { url = "https://files.pythonhosted.org/packages/90/38/ab17d75938ef7ac87332c588857422ae126b1c76253f0f5b1242032923ca/propcache-0.3.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a", size = 233754 }, - { url = "https://files.pythonhosted.org/packages/06/5d/3b921b9c60659ae464137508d3b4c2b3f52f592ceb1964aa2533b32fcf0b/propcache-0.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9", size = 226088 }, - { url = "https://files.pythonhosted.org/packages/54/6e/30a11f4417d9266b5a464ac5a8c5164ddc9dd153dfa77bf57918165eb4ae/propcache-0.3.1-cp311-cp311-win32.whl", hash = "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005", size = 40859 }, - { url = "https://files.pythonhosted.org/packages/1d/3a/8a68dd867da9ca2ee9dfd361093e9cb08cb0f37e5ddb2276f1b5177d7731/propcache-0.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7", size = 45153 }, - { url = "https://files.pythonhosted.org/packages/41/aa/ca78d9be314d1e15ff517b992bebbed3bdfef5b8919e85bf4940e57b6137/propcache-0.3.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", size = 80430 }, - { url = "https://files.pythonhosted.org/packages/1a/d8/f0c17c44d1cda0ad1979af2e593ea290defdde9eaeb89b08abbe02a5e8e1/propcache-0.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", size = 46637 }, - { url = "https://files.pythonhosted.org/packages/ae/bd/c1e37265910752e6e5e8a4c1605d0129e5b7933c3dc3cf1b9b48ed83b364/propcache-0.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", size = 46123 }, - { url = "https://files.pythonhosted.org/packages/d4/b0/911eda0865f90c0c7e9f0415d40a5bf681204da5fd7ca089361a64c16b28/propcache-0.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", size = 243031 }, - { url = "https://files.pythonhosted.org/packages/0a/06/0da53397c76a74271621807265b6eb61fb011451b1ddebf43213df763669/propcache-0.3.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", size = 249100 }, - { url = "https://files.pythonhosted.org/packages/f1/eb/13090e05bf6b963fc1653cdc922133ced467cb4b8dab53158db5a37aa21e/propcache-0.3.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", size = 250170 }, - { url = "https://files.pythonhosted.org/packages/3b/4c/f72c9e1022b3b043ec7dc475a0f405d4c3e10b9b1d378a7330fecf0652da/propcache-0.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", size = 245000 }, - { url = "https://files.pythonhosted.org/packages/e8/fd/970ca0e22acc829f1adf5de3724085e778c1ad8a75bec010049502cb3a86/propcache-0.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", size = 230262 }, - { url = "https://files.pythonhosted.org/packages/c4/42/817289120c6b9194a44f6c3e6b2c3277c5b70bbad39e7df648f177cc3634/propcache-0.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", size = 236772 }, - { url = "https://files.pythonhosted.org/packages/7c/9c/3b3942b302badd589ad6b672da3ca7b660a6c2f505cafd058133ddc73918/propcache-0.3.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", size = 231133 }, - { url = "https://files.pythonhosted.org/packages/98/a1/75f6355f9ad039108ff000dfc2e19962c8dea0430da9a1428e7975cf24b2/propcache-0.3.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", size = 230741 }, - { url = "https://files.pythonhosted.org/packages/67/0c/3e82563af77d1f8731132166da69fdfd95e71210e31f18edce08a1eb11ea/propcache-0.3.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", size = 244047 }, - { url = "https://files.pythonhosted.org/packages/f7/50/9fb7cca01532a08c4d5186d7bb2da6c4c587825c0ae134b89b47c7d62628/propcache-0.3.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5", size = 246467 }, - { url = "https://files.pythonhosted.org/packages/a9/02/ccbcf3e1c604c16cc525309161d57412c23cf2351523aedbb280eb7c9094/propcache-0.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", size = 241022 }, - { url = "https://files.pythonhosted.org/packages/db/19/e777227545e09ca1e77a6e21274ae9ec45de0f589f0ce3eca2a41f366220/propcache-0.3.1-cp312-cp312-win32.whl", hash = "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", size = 40647 }, - { url = "https://files.pythonhosted.org/packages/24/bb/3b1b01da5dd04c77a204c84e538ff11f624e31431cfde7201d9110b092b1/propcache-0.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", size = 44784 }, - { url = "https://files.pythonhosted.org/packages/58/60/f645cc8b570f99be3cf46714170c2de4b4c9d6b827b912811eff1eb8a412/propcache-0.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", size = 77865 }, - { url = "https://files.pythonhosted.org/packages/6f/d4/c1adbf3901537582e65cf90fd9c26fde1298fde5a2c593f987112c0d0798/propcache-0.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", size = 45452 }, - { url = "https://files.pythonhosted.org/packages/d1/b5/fe752b2e63f49f727c6c1c224175d21b7d1727ce1d4873ef1c24c9216830/propcache-0.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", size = 44800 }, - { url = "https://files.pythonhosted.org/packages/62/37/fc357e345bc1971e21f76597028b059c3d795c5ca7690d7a8d9a03c9708a/propcache-0.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", size = 225804 }, - { url = "https://files.pythonhosted.org/packages/0d/f1/16e12c33e3dbe7f8b737809bad05719cff1dccb8df4dafbcff5575002c0e/propcache-0.3.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", size = 230650 }, - { url = "https://files.pythonhosted.org/packages/3e/a2/018b9f2ed876bf5091e60153f727e8f9073d97573f790ff7cdf6bc1d1fb8/propcache-0.3.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", size = 234235 }, - { url = "https://files.pythonhosted.org/packages/45/5f/3faee66fc930dfb5da509e34c6ac7128870631c0e3582987fad161fcb4b1/propcache-0.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", size = 228249 }, - { url = "https://files.pythonhosted.org/packages/62/1e/a0d5ebda5da7ff34d2f5259a3e171a94be83c41eb1e7cd21a2105a84a02e/propcache-0.3.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", size = 214964 }, - { url = "https://files.pythonhosted.org/packages/db/a0/d72da3f61ceab126e9be1f3bc7844b4e98c6e61c985097474668e7e52152/propcache-0.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", size = 222501 }, - { url = "https://files.pythonhosted.org/packages/18/6d/a008e07ad7b905011253adbbd97e5b5375c33f0b961355ca0a30377504ac/propcache-0.3.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", size = 217917 }, - { url = "https://files.pythonhosted.org/packages/98/37/02c9343ffe59e590e0e56dc5c97d0da2b8b19fa747ebacf158310f97a79a/propcache-0.3.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", size = 217089 }, - { url = "https://files.pythonhosted.org/packages/53/1b/d3406629a2c8a5666d4674c50f757a77be119b113eedd47b0375afdf1b42/propcache-0.3.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", size = 228102 }, - { url = "https://files.pythonhosted.org/packages/cd/a7/3664756cf50ce739e5f3abd48febc0be1a713b1f389a502ca819791a6b69/propcache-0.3.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", size = 230122 }, - { url = "https://files.pythonhosted.org/packages/35/36/0bbabaacdcc26dac4f8139625e930f4311864251276033a52fd52ff2a274/propcache-0.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", size = 226818 }, - { url = "https://files.pythonhosted.org/packages/cc/27/4e0ef21084b53bd35d4dae1634b6d0bad35e9c58ed4f032511acca9d4d26/propcache-0.3.1-cp313-cp313-win32.whl", hash = "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", size = 40112 }, - { url = "https://files.pythonhosted.org/packages/a6/2c/a54614d61895ba6dd7ac8f107e2b2a0347259ab29cbf2ecc7b94fa38c4dc/propcache-0.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", size = 44034 }, - { url = "https://files.pythonhosted.org/packages/5a/a8/0a4fd2f664fc6acc66438370905124ce62e84e2e860f2557015ee4a61c7e/propcache-0.3.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", size = 82613 }, - { url = "https://files.pythonhosted.org/packages/4d/e5/5ef30eb2cd81576256d7b6caaa0ce33cd1d2c2c92c8903cccb1af1a4ff2f/propcache-0.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", size = 47763 }, - { url = "https://files.pythonhosted.org/packages/87/9a/87091ceb048efeba4d28e903c0b15bcc84b7c0bf27dc0261e62335d9b7b8/propcache-0.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", size = 47175 }, - { url = "https://files.pythonhosted.org/packages/3e/2f/854e653c96ad1161f96194c6678a41bbb38c7947d17768e8811a77635a08/propcache-0.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", size = 292265 }, - { url = "https://files.pythonhosted.org/packages/40/8d/090955e13ed06bc3496ba4a9fb26c62e209ac41973cb0d6222de20c6868f/propcache-0.3.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", size = 294412 }, - { url = "https://files.pythonhosted.org/packages/39/e6/d51601342e53cc7582449e6a3c14a0479fab2f0750c1f4d22302e34219c6/propcache-0.3.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", size = 294290 }, - { url = "https://files.pythonhosted.org/packages/3b/4d/be5f1a90abc1881884aa5878989a1acdafd379a91d9c7e5e12cef37ec0d7/propcache-0.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", size = 282926 }, - { url = "https://files.pythonhosted.org/packages/57/2b/8f61b998c7ea93a2b7eca79e53f3e903db1787fca9373af9e2cf8dc22f9d/propcache-0.3.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", size = 267808 }, - { url = "https://files.pythonhosted.org/packages/11/1c/311326c3dfce59c58a6098388ba984b0e5fb0381ef2279ec458ef99bd547/propcache-0.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", size = 290916 }, - { url = "https://files.pythonhosted.org/packages/4b/74/91939924b0385e54dc48eb2e4edd1e4903ffd053cf1916ebc5347ac227f7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", size = 262661 }, - { url = "https://files.pythonhosted.org/packages/c2/d7/e6079af45136ad325c5337f5dd9ef97ab5dc349e0ff362fe5c5db95e2454/propcache-0.3.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", size = 264384 }, - { url = "https://files.pythonhosted.org/packages/b7/d5/ba91702207ac61ae6f1c2da81c5d0d6bf6ce89e08a2b4d44e411c0bbe867/propcache-0.3.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", size = 291420 }, - { url = "https://files.pythonhosted.org/packages/58/70/2117780ed7edcd7ba6b8134cb7802aada90b894a9810ec56b7bb6018bee7/propcache-0.3.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", size = 290880 }, - { url = "https://files.pythonhosted.org/packages/4a/1f/ecd9ce27710021ae623631c0146719280a929d895a095f6d85efb6a0be2e/propcache-0.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", size = 287407 }, - { url = "https://files.pythonhosted.org/packages/3e/66/2e90547d6b60180fb29e23dc87bd8c116517d4255240ec6d3f7dc23d1926/propcache-0.3.1-cp313-cp313t-win32.whl", hash = "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", size = 42573 }, - { url = "https://files.pythonhosted.org/packages/cb/8f/50ad8599399d1861b4d2b6b45271f0ef6af1b09b0a2386a46dbaf19c9535/propcache-0.3.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", size = 46757 }, - { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376 }, +version = "0.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/16/43264e4a779dd8588c21a70f0709665ee8f611211bdd2c87d952cfa7c776/propcache-0.3.2.tar.gz", hash = "sha256:20d7d62e4e7ef05f221e0db2856b979540686342e7dd9973b815599c7057e168", size = 44139 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/8d/e8b436717ab9c2cfc23b116d2c297305aa4cd8339172a456d61ebf5669b8/propcache-0.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0b8d2f607bd8f80ddc04088bc2a037fdd17884a6fcadc47a96e334d72f3717be", size = 74207 }, + { url = "https://files.pythonhosted.org/packages/d6/29/1e34000e9766d112171764b9fa3226fa0153ab565d0c242c70e9945318a7/propcache-0.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06766d8f34733416e2e34f46fea488ad5d60726bb9481d3cddf89a6fa2d9603f", size = 43648 }, + { url = "https://files.pythonhosted.org/packages/46/92/1ad5af0df781e76988897da39b5f086c2bf0f028b7f9bd1f409bb05b6874/propcache-0.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2dc1f4a1df4fecf4e6f68013575ff4af84ef6f478fe5344317a65d38a8e6dc9", size = 43496 }, + { url = "https://files.pythonhosted.org/packages/b3/ce/e96392460f9fb68461fabab3e095cb00c8ddf901205be4eae5ce246e5b7e/propcache-0.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be29c4f4810c5789cf10ddf6af80b041c724e629fa51e308a7a0fb19ed1ef7bf", size = 217288 }, + { url = "https://files.pythonhosted.org/packages/c5/2a/866726ea345299f7ceefc861a5e782b045545ae6940851930a6adaf1fca6/propcache-0.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59d61f6970ecbd8ff2e9360304d5c8876a6abd4530cb752c06586849ac8a9dc9", size = 227456 }, + { url = "https://files.pythonhosted.org/packages/de/03/07d992ccb6d930398689187e1b3c718339a1c06b8b145a8d9650e4726166/propcache-0.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62180e0b8dbb6b004baec00a7983e4cc52f5ada9cd11f48c3528d8cfa7b96a66", size = 225429 }, + { url = "https://files.pythonhosted.org/packages/5d/e6/116ba39448753b1330f48ab8ba927dcd6cf0baea8a0ccbc512dfb49ba670/propcache-0.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c144ca294a204c470f18cf4c9d78887810d04a3e2fbb30eea903575a779159df", size = 213472 }, + { url = "https://files.pythonhosted.org/packages/a6/85/f01f5d97e54e428885a5497ccf7f54404cbb4f906688a1690cd51bf597dc/propcache-0.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5c2a784234c28854878d68978265617aa6dc0780e53d44b4d67f3651a17a9a2", size = 204480 }, + { url = "https://files.pythonhosted.org/packages/e3/79/7bf5ab9033b8b8194cc3f7cf1aaa0e9c3256320726f64a3e1f113a812dce/propcache-0.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5745bc7acdafa978ca1642891b82c19238eadc78ba2aaa293c6863b304e552d7", size = 214530 }, + { url = "https://files.pythonhosted.org/packages/31/0b/bd3e0c00509b609317df4a18e6b05a450ef2d9a963e1d8bc9c9415d86f30/propcache-0.3.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:c0075bf773d66fa8c9d41f66cc132ecc75e5bb9dd7cce3cfd14adc5ca184cb95", size = 205230 }, + { url = "https://files.pythonhosted.org/packages/7a/23/fae0ff9b54b0de4e819bbe559508da132d5683c32d84d0dc2ccce3563ed4/propcache-0.3.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5f57aa0847730daceff0497f417c9de353c575d8da3579162cc74ac294c5369e", size = 206754 }, + { url = "https://files.pythonhosted.org/packages/b7/7f/ad6a3c22630aaa5f618b4dc3c3598974a72abb4c18e45a50b3cdd091eb2f/propcache-0.3.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:eef914c014bf72d18efb55619447e0aecd5fb7c2e3fa7441e2e5d6099bddff7e", size = 218430 }, + { url = "https://files.pythonhosted.org/packages/5b/2c/ba4f1c0e8a4b4c75910742f0d333759d441f65a1c7f34683b4a74c0ee015/propcache-0.3.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2a4092e8549031e82facf3decdbc0883755d5bbcc62d3aea9d9e185549936dcf", size = 223884 }, + { url = "https://files.pythonhosted.org/packages/88/e4/ebe30fc399e98572019eee82ad0caf512401661985cbd3da5e3140ffa1b0/propcache-0.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:85871b050f174bc0bfb437efbdb68aaf860611953ed12418e4361bc9c392749e", size = 211480 }, + { url = "https://files.pythonhosted.org/packages/96/0a/7d5260b914e01d1d0906f7f38af101f8d8ed0dc47426219eeaf05e8ea7c2/propcache-0.3.2-cp311-cp311-win32.whl", hash = "sha256:36c8d9b673ec57900c3554264e630d45980fd302458e4ac801802a7fd2ef7897", size = 37757 }, + { url = "https://files.pythonhosted.org/packages/e1/2d/89fe4489a884bc0da0c3278c552bd4ffe06a1ace559db5ef02ef24ab446b/propcache-0.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53af8cb6a781b02d2ea079b5b853ba9430fcbe18a8e3ce647d5982a3ff69f39", size = 41500 }, + { url = "https://files.pythonhosted.org/packages/a8/42/9ca01b0a6f48e81615dca4765a8f1dd2c057e0540f6116a27dc5ee01dfb6/propcache-0.3.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8de106b6c84506b31c27168582cd3cb3000a6412c16df14a8628e5871ff83c10", size = 73674 }, + { url = "https://files.pythonhosted.org/packages/af/6e/21293133beb550f9c901bbece755d582bfaf2176bee4774000bd4dd41884/propcache-0.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:28710b0d3975117239c76600ea351934ac7b5ff56e60953474342608dbbb6154", size = 43570 }, + { url = "https://files.pythonhosted.org/packages/0c/c8/0393a0a3a2b8760eb3bde3c147f62b20044f0ddac81e9d6ed7318ec0d852/propcache-0.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce26862344bdf836650ed2487c3d724b00fbfec4233a1013f597b78c1cb73615", size = 43094 }, + { url = "https://files.pythonhosted.org/packages/37/2c/489afe311a690399d04a3e03b069225670c1d489eb7b044a566511c1c498/propcache-0.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bca54bd347a253af2cf4544bbec232ab982f4868de0dd684246b67a51bc6b1db", size = 226958 }, + { url = "https://files.pythonhosted.org/packages/9d/ca/63b520d2f3d418c968bf596839ae26cf7f87bead026b6192d4da6a08c467/propcache-0.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55780d5e9a2ddc59711d727226bb1ba83a22dd32f64ee15594b9392b1f544eb1", size = 234894 }, + { url = "https://files.pythonhosted.org/packages/11/60/1d0ed6fff455a028d678df30cc28dcee7af77fa2b0e6962ce1df95c9a2a9/propcache-0.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:035e631be25d6975ed87ab23153db6a73426a48db688070d925aa27e996fe93c", size = 233672 }, + { url = "https://files.pythonhosted.org/packages/37/7c/54fd5301ef38505ab235d98827207176a5c9b2aa61939b10a460ca53e123/propcache-0.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee6f22b6eaa39297c751d0e80c0d3a454f112f5c6481214fcf4c092074cecd67", size = 224395 }, + { url = "https://files.pythonhosted.org/packages/ee/1a/89a40e0846f5de05fdc6779883bf46ba980e6df4d2ff8fb02643de126592/propcache-0.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ca3aee1aa955438c4dba34fc20a9f390e4c79967257d830f137bd5a8a32ed3b", size = 212510 }, + { url = "https://files.pythonhosted.org/packages/5e/33/ca98368586c9566a6b8d5ef66e30484f8da84c0aac3f2d9aec6d31a11bd5/propcache-0.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4f30862869fa2b68380d677cc1c5fcf1e0f2b9ea0cf665812895c75d0ca3b8", size = 222949 }, + { url = "https://files.pythonhosted.org/packages/ba/11/ace870d0aafe443b33b2f0b7efdb872b7c3abd505bfb4890716ad7865e9d/propcache-0.3.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b77ec3c257d7816d9f3700013639db7491a434644c906a2578a11daf13176251", size = 217258 }, + { url = "https://files.pythonhosted.org/packages/5b/d2/86fd6f7adffcfc74b42c10a6b7db721d1d9ca1055c45d39a1a8f2a740a21/propcache-0.3.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cab90ac9d3f14b2d5050928483d3d3b8fb6b4018893fc75710e6aa361ecb2474", size = 213036 }, + { url = "https://files.pythonhosted.org/packages/07/94/2d7d1e328f45ff34a0a284cf5a2847013701e24c2a53117e7c280a4316b3/propcache-0.3.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0b504d29f3c47cf6b9e936c1852246c83d450e8e063d50562115a6be6d3a2535", size = 227684 }, + { url = "https://files.pythonhosted.org/packages/b7/05/37ae63a0087677e90b1d14710e532ff104d44bc1efa3b3970fff99b891dc/propcache-0.3.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:ce2ac2675a6aa41ddb2a0c9cbff53780a617ac3d43e620f8fd77ba1c84dcfc06", size = 234562 }, + { url = "https://files.pythonhosted.org/packages/a4/7c/3f539fcae630408d0bd8bf3208b9a647ccad10976eda62402a80adf8fc34/propcache-0.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:62b4239611205294cc433845b914131b2a1f03500ff3c1ed093ed216b82621e1", size = 222142 }, + { url = "https://files.pythonhosted.org/packages/7c/d2/34b9eac8c35f79f8a962546b3e97e9d4b990c420ee66ac8255d5d9611648/propcache-0.3.2-cp312-cp312-win32.whl", hash = "sha256:df4a81b9b53449ebc90cc4deefb052c1dd934ba85012aa912c7ea7b7e38b60c1", size = 37711 }, + { url = "https://files.pythonhosted.org/packages/19/61/d582be5d226cf79071681d1b46b848d6cb03d7b70af7063e33a2787eaa03/propcache-0.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7046e79b989d7fe457bb755844019e10f693752d169076138abf17f31380800c", size = 41479 }, + { url = "https://files.pythonhosted.org/packages/dc/d1/8c747fafa558c603c4ca19d8e20b288aa0c7cda74e9402f50f31eb65267e/propcache-0.3.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ca592ed634a73ca002967458187109265e980422116c0a107cf93d81f95af945", size = 71286 }, + { url = "https://files.pythonhosted.org/packages/61/99/d606cb7986b60d89c36de8a85d58764323b3a5ff07770a99d8e993b3fa73/propcache-0.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9ecb0aad4020e275652ba3975740f241bd12a61f1a784df044cf7477a02bc252", size = 42425 }, + { url = "https://files.pythonhosted.org/packages/8c/96/ef98f91bbb42b79e9bb82bdd348b255eb9d65f14dbbe3b1594644c4073f7/propcache-0.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7f08f1cc28bd2eade7a8a3d2954ccc673bb02062e3e7da09bc75d843386b342f", size = 41846 }, + { url = "https://files.pythonhosted.org/packages/5b/ad/3f0f9a705fb630d175146cd7b1d2bf5555c9beaed54e94132b21aac098a6/propcache-0.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a342c834734edb4be5ecb1e9fb48cb64b1e2320fccbd8c54bf8da8f2a84c33", size = 208871 }, + { url = "https://files.pythonhosted.org/packages/3a/38/2085cda93d2c8b6ec3e92af2c89489a36a5886b712a34ab25de9fbca7992/propcache-0.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a544caaae1ac73f1fecfae70ded3e93728831affebd017d53449e3ac052ac1e", size = 215720 }, + { url = "https://files.pythonhosted.org/packages/61/c1/d72ea2dc83ac7f2c8e182786ab0fc2c7bd123a1ff9b7975bee671866fe5f/propcache-0.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:310d11aa44635298397db47a3ebce7db99a4cc4b9bbdfcf6c98a60c8d5261cf1", size = 215203 }, + { url = "https://files.pythonhosted.org/packages/af/81/b324c44ae60c56ef12007105f1460d5c304b0626ab0cc6b07c8f2a9aa0b8/propcache-0.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c1396592321ac83157ac03a2023aa6cc4a3cc3cfdecb71090054c09e5a7cce3", size = 206365 }, + { url = "https://files.pythonhosted.org/packages/09/73/88549128bb89e66d2aff242488f62869014ae092db63ccea53c1cc75a81d/propcache-0.3.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cabf5b5902272565e78197edb682017d21cf3b550ba0460ee473753f28d23c1", size = 196016 }, + { url = "https://files.pythonhosted.org/packages/b9/3f/3bdd14e737d145114a5eb83cb172903afba7242f67c5877f9909a20d948d/propcache-0.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0a2f2235ac46a7aa25bdeb03a9e7060f6ecbd213b1f9101c43b3090ffb971ef6", size = 205596 }, + { url = "https://files.pythonhosted.org/packages/0f/ca/2f4aa819c357d3107c3763d7ef42c03980f9ed5c48c82e01e25945d437c1/propcache-0.3.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:92b69e12e34869a6970fd2f3da91669899994b47c98f5d430b781c26f1d9f387", size = 200977 }, + { url = "https://files.pythonhosted.org/packages/cd/4a/e65276c7477533c59085251ae88505caf6831c0e85ff8b2e31ebcbb949b1/propcache-0.3.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:54e02207c79968ebbdffc169591009f4474dde3b4679e16634d34c9363ff56b4", size = 197220 }, + { url = "https://files.pythonhosted.org/packages/7c/54/fc7152e517cf5578278b242396ce4d4b36795423988ef39bb8cd5bf274c8/propcache-0.3.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4adfb44cb588001f68c5466579d3f1157ca07f7504fc91ec87862e2b8e556b88", size = 210642 }, + { url = "https://files.pythonhosted.org/packages/b9/80/abeb4a896d2767bf5f1ea7b92eb7be6a5330645bd7fb844049c0e4045d9d/propcache-0.3.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fd3e6019dc1261cd0291ee8919dd91fbab7b169bb76aeef6c716833a3f65d206", size = 212789 }, + { url = "https://files.pythonhosted.org/packages/b3/db/ea12a49aa7b2b6d68a5da8293dcf50068d48d088100ac016ad92a6a780e6/propcache-0.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4c181cad81158d71c41a2bce88edce078458e2dd5ffee7eddd6b05da85079f43", size = 205880 }, + { url = "https://files.pythonhosted.org/packages/d1/e5/9076a0bbbfb65d1198007059c65639dfd56266cf8e477a9707e4b1999ff4/propcache-0.3.2-cp313-cp313-win32.whl", hash = "sha256:8a08154613f2249519e549de2330cf8e2071c2887309a7b07fb56098f5170a02", size = 37220 }, + { url = "https://files.pythonhosted.org/packages/d3/f5/b369e026b09a26cd77aa88d8fffd69141d2ae00a2abaaf5380d2603f4b7f/propcache-0.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e41671f1594fc4ab0a6dec1351864713cb3a279910ae8b58f884a88a0a632c05", size = 40678 }, + { url = "https://files.pythonhosted.org/packages/a4/3a/6ece377b55544941a08d03581c7bc400a3c8cd3c2865900a68d5de79e21f/propcache-0.3.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:9a3cf035bbaf035f109987d9d55dc90e4b0e36e04bbbb95af3055ef17194057b", size = 76560 }, + { url = "https://files.pythonhosted.org/packages/0c/da/64a2bb16418740fa634b0e9c3d29edff1db07f56d3546ca2d86ddf0305e1/propcache-0.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:156c03d07dc1323d8dacaa221fbe028c5c70d16709cdd63502778e6c3ccca1b0", size = 44676 }, + { url = "https://files.pythonhosted.org/packages/36/7b/f025e06ea51cb72c52fb87e9b395cced02786610b60a3ed51da8af017170/propcache-0.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74413c0ba02ba86f55cf60d18daab219f7e531620c15f1e23d95563f505efe7e", size = 44701 }, + { url = "https://files.pythonhosted.org/packages/a4/00/faa1b1b7c3b74fc277f8642f32a4c72ba1d7b2de36d7cdfb676db7f4303e/propcache-0.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f066b437bb3fa39c58ff97ab2ca351db465157d68ed0440abecb21715eb24b28", size = 276934 }, + { url = "https://files.pythonhosted.org/packages/74/ab/935beb6f1756e0476a4d5938ff44bf0d13a055fed880caf93859b4f1baf4/propcache-0.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1304b085c83067914721e7e9d9917d41ad87696bf70f0bc7dee450e9c71ad0a", size = 278316 }, + { url = "https://files.pythonhosted.org/packages/f8/9d/994a5c1ce4389610838d1caec74bdf0e98b306c70314d46dbe4fcf21a3e2/propcache-0.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab50cef01b372763a13333b4e54021bdcb291fc9a8e2ccb9c2df98be51bcde6c", size = 282619 }, + { url = "https://files.pythonhosted.org/packages/2b/00/a10afce3d1ed0287cef2e09506d3be9822513f2c1e96457ee369adb9a6cd/propcache-0.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fad3b2a085ec259ad2c2842666b2a0a49dea8463579c606426128925af1ed725", size = 265896 }, + { url = "https://files.pythonhosted.org/packages/2e/a8/2aa6716ffa566ca57c749edb909ad27884680887d68517e4be41b02299f3/propcache-0.3.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:261fa020c1c14deafd54c76b014956e2f86991af198c51139faf41c4d5e83892", size = 252111 }, + { url = "https://files.pythonhosted.org/packages/36/4f/345ca9183b85ac29c8694b0941f7484bf419c7f0fea2d1e386b4f7893eed/propcache-0.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:46d7f8aa79c927e5f987ee3a80205c987717d3659f035c85cf0c3680526bdb44", size = 268334 }, + { url = "https://files.pythonhosted.org/packages/3e/ca/fcd54f78b59e3f97b3b9715501e3147f5340167733d27db423aa321e7148/propcache-0.3.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:6d8f3f0eebf73e3c0ff0e7853f68be638b4043c65a70517bb575eff54edd8dbe", size = 255026 }, + { url = "https://files.pythonhosted.org/packages/8b/95/8e6a6bbbd78ac89c30c225210a5c687790e532ba4088afb8c0445b77ef37/propcache-0.3.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:03c89c1b14a5452cf15403e291c0ccd7751d5b9736ecb2c5bab977ad6c5bcd81", size = 250724 }, + { url = "https://files.pythonhosted.org/packages/ee/b0/0dd03616142baba28e8b2d14ce5df6631b4673850a3d4f9c0f9dd714a404/propcache-0.3.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:0cc17efde71e12bbaad086d679ce575268d70bc123a5a71ea7ad76f70ba30bba", size = 268868 }, + { url = "https://files.pythonhosted.org/packages/c5/98/2c12407a7e4fbacd94ddd32f3b1e3d5231e77c30ef7162b12a60e2dd5ce3/propcache-0.3.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:acdf05d00696bc0447e278bb53cb04ca72354e562cf88ea6f9107df8e7fd9770", size = 271322 }, + { url = "https://files.pythonhosted.org/packages/35/91/9cb56efbb428b006bb85db28591e40b7736847b8331d43fe335acf95f6c8/propcache-0.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4445542398bd0b5d32df908031cb1b30d43ac848e20470a878b770ec2dcc6330", size = 265778 }, + { url = "https://files.pythonhosted.org/packages/9a/4c/b0fe775a2bdd01e176b14b574be679d84fc83958335790f7c9a686c1f468/propcache-0.3.2-cp313-cp313t-win32.whl", hash = "sha256:f86e5d7cd03afb3a1db8e9f9f6eff15794e79e791350ac48a8c924e6f439f394", size = 41175 }, + { url = "https://files.pythonhosted.org/packages/a4/ff/47f08595e3d9b5e149c150f88d9714574f1a7cbd89fe2817158a952674bf/propcache-0.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9704bedf6e7cbe3c65eca4379a9b53ee6a83749f047808cbb5044d40d7d72198", size = 44857 }, + { url = "https://files.pythonhosted.org/packages/cc/35/cc0aaecf278bb4575b8555f2b137de5ab821595ddae9da9d3cd1da4072c7/propcache-0.3.2-py3-none-any.whl", hash = "sha256:98f1ec44fb675f5052cccc8e609c46ed23a35a1cfd18545ad4e29002d858a43f", size = 12663 }, ] [[package]] @@ -2411,31 +2321,31 @@ wheels = [ [[package]] name = "protobuf" -version = "6.31.0" +version = "6.31.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/13/48/718c1e104a2e89970a8ff3b06d87e152834b576c570a6908f8c17ba88d65/protobuf-6.31.0.tar.gz", hash = "sha256:314fab1a6a316469dc2dd46f993cbbe95c861ea6807da910becfe7475bc26ffe", size = 441644 } +sdist = { url = "https://files.pythonhosted.org/packages/52/f3/b9655a711b32c19720253f6f06326faf90580834e2e83f840472d752bc8b/protobuf-6.31.1.tar.gz", hash = "sha256:d8cac4c982f0b957a4dc73a80e2ea24fab08e679c0de9deb835f4a12d69aca9a", size = 441797 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/77/8671682038b08237c927215fa3296bc1c54e4086fe542c87017c1b626663/protobuf-6.31.0-cp310-abi3-win32.whl", hash = "sha256:10bd62802dfa0588649740a59354090eaf54b8322f772fbdcca19bc78d27f0d6", size = 423437 }, - { url = "https://files.pythonhosted.org/packages/e4/07/cc9b0cbf7593f6ef8cf87fa9b0e55cd74c5cb526dd89ad84aa7d6547ef8d/protobuf-6.31.0-cp310-abi3-win_amd64.whl", hash = "sha256:3e987c99fd634be8347246a02123250f394ba20573c953de133dc8b2c107dd71", size = 435118 }, - { url = "https://files.pythonhosted.org/packages/21/46/33f884aa8bc59114dc97e0d954ca4618c556483670236008c88fbb7e834f/protobuf-6.31.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2c812f0f96ceb6b514448cefeb1df54ec06dde456783f5099c0e2f8a0f2caa89", size = 425439 }, - { url = "https://files.pythonhosted.org/packages/9b/f2/9a676b50229ce37b12777d7b21de90ae7bc0f9505d07e72e2e8d47b8d165/protobuf-6.31.0-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:67ce50195e4e584275623b8e6bc6d3d3dfd93924bf6116b86b3b8975ab9e4571", size = 321950 }, - { url = "https://files.pythonhosted.org/packages/a1/a7/243fa2d3c1b7675d54744b32dacf30356f4c27c0d3ad940ca8745a1c6b2c/protobuf-6.31.0-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:5353e38844168a327acd2b2aa440044411cd8d1b6774d5701008bd1dba067c79", size = 320904 }, - { url = "https://files.pythonhosted.org/packages/ee/01/1ed1d482960a5718fd99c82f6d79120181947cfd4667ec3944d448ed44a3/protobuf-6.31.0-py3-none-any.whl", hash = "sha256:6ac2e82556e822c17a8d23aa1190bbc1d06efb9c261981da95c71c9da09e9e23", size = 168558 }, + { url = "https://files.pythonhosted.org/packages/f3/6f/6ab8e4bf962fd5570d3deaa2d5c38f0a363f57b4501047b5ebeb83ab1125/protobuf-6.31.1-cp310-abi3-win32.whl", hash = "sha256:7fa17d5a29c2e04b7d90e5e32388b8bfd0e7107cd8e616feef7ed3fa6bdab5c9", size = 423603 }, + { url = "https://files.pythonhosted.org/packages/44/3a/b15c4347dd4bf3a1b0ee882f384623e2063bb5cf9fa9d57990a4f7df2fb6/protobuf-6.31.1-cp310-abi3-win_amd64.whl", hash = "sha256:426f59d2964864a1a366254fa703b8632dcec0790d8862d30034d8245e1cd447", size = 435283 }, + { url = "https://files.pythonhosted.org/packages/6a/c9/b9689a2a250264a84e66c46d8862ba788ee7a641cdca39bccf64f59284b7/protobuf-6.31.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:6f1227473dc43d44ed644425268eb7c2e488ae245d51c6866d19fe158e207402", size = 425604 }, + { url = "https://files.pythonhosted.org/packages/76/a1/7a5a94032c83375e4fe7e7f56e3976ea6ac90c5e85fac8576409e25c39c3/protobuf-6.31.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:a40fc12b84c154884d7d4c4ebd675d5b3b5283e155f324049ae396b95ddebc39", size = 322115 }, + { url = "https://files.pythonhosted.org/packages/fa/b1/b59d405d64d31999244643d88c45c8241c58f17cc887e73bcb90602327f8/protobuf-6.31.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:4ee898bf66f7a8b0bd21bce523814e6fbd8c6add948045ce958b73af7e8878c6", size = 321070 }, + { url = "https://files.pythonhosted.org/packages/f7/af/ab3c51ab7507a7325e98ffe691d9495ee3d3aa5f589afad65ec920d39821/protobuf-6.31.1-py3-none-any.whl", hash = "sha256:720a6c7e6b77288b85063569baae8536671b39f15cc22037ec7045658d80489e", size = 168724 }, ] [[package]] name = "psutil" -version = "6.1.1" +version = "7.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1f/5a/07871137bb752428aa4b659f910b399ba6f291156bdea939be3e96cae7cb/psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5", size = 508502 } +sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/99/ca79d302be46f7bdd8321089762dd4476ee725fce16fc2b2e1dbba8cac17/psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8", size = 247511 }, - { url = "https://files.pythonhosted.org/packages/0b/6b/73dbde0dd38f3782905d4587049b9be64d76671042fdcaf60e2430c6796d/psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377", size = 248985 }, - { url = "https://files.pythonhosted.org/packages/17/38/c319d31a1d3f88c5b79c68b3116c129e5133f1822157dd6da34043e32ed6/psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003", size = 284488 }, - { url = "https://files.pythonhosted.org/packages/9c/39/0f88a830a1c8a3aba27fededc642da37613c57cbff143412e3536f89784f/psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160", size = 287477 }, - { url = "https://files.pythonhosted.org/packages/47/da/99f4345d4ddf2845cb5b5bd0d93d554e84542d116934fde07a0c50bd4e9f/psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3", size = 289017 }, - { url = "https://files.pythonhosted.org/packages/38/53/bd755c2896f4461fd4f36fa6a6dcb66a88a9e4b9fd4e5b66a77cf9d4a584/psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53", size = 250602 }, - { url = "https://files.pythonhosted.org/packages/7b/d7/7831438e6c3ebbfa6e01a927127a6cb42ad3ab844247f3c5b96bea25d73d/psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649", size = 254444 }, + { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 }, + { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 }, + { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 }, + { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 }, + { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 }, + { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 }, + { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 }, ] [[package]] @@ -2488,86 +2398,105 @@ wheels = [ [[package]] name = "pydantic" -version = "2.9.2" +version = "2.11.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, { name = "pydantic-core" }, { name = "typing-extensions" }, + { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a9/b7/d9e3f12af310e1120c21603644a1cd86f59060e040ec5c3a80b8f05fae30/pydantic-2.9.2.tar.gz", hash = "sha256:d155cef71265d1e9807ed1c32b4c8deec042a44a50a4188b25ac67ecd81a9c0f", size = 769917 } +sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350 } wheels = [ - { url = "https://files.pythonhosted.org/packages/df/e4/ba44652d562cbf0bf320e0f3810206149c8a4e99cdbf66da82e97ab53a15/pydantic-2.9.2-py3-none-any.whl", hash = "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12", size = 434928 }, + { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782 }, ] [[package]] name = "pydantic-core" -version = "2.23.4" +version = "2.33.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e2/aa/6b6a9b9f8537b872f552ddd46dd3da230367754b6f707b8e1e963f515ea3/pydantic_core-2.23.4.tar.gz", hash = "sha256:2584f7cf844ac4d970fba483a717dbe10c1c1c96a969bf65d61ffe94df1b2863", size = 402156 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/30/890a583cd3f2be27ecf32b479d5d615710bb926d92da03e3f7838ff3e58b/pydantic_core-2.23.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:77733e3892bb0a7fa797826361ce8a9184d25c8dffaec60b7ffe928153680ba8", size = 1865160 }, - { url = "https://files.pythonhosted.org/packages/1d/9a/b634442e1253bc6889c87afe8bb59447f106ee042140bd57680b3b113ec7/pydantic_core-2.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b84d168f6c48fabd1f2027a3d1bdfe62f92cade1fb273a5d68e621da0e44e6d", size = 1776777 }, - { url = "https://files.pythonhosted.org/packages/75/9a/7816295124a6b08c24c96f9ce73085032d8bcbaf7e5a781cd41aa910c891/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df49e7a0861a8c36d089c1ed57d308623d60416dab2647a4a17fe050ba85de0e", size = 1799244 }, - { url = "https://files.pythonhosted.org/packages/a9/8f/89c1405176903e567c5f99ec53387449e62f1121894aa9fc2c4fdc51a59b/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ff02b6d461a6de369f07ec15e465a88895f3223eb75073ffea56b84d9331f607", size = 1805307 }, - { url = "https://files.pythonhosted.org/packages/d5/a5/1a194447d0da1ef492e3470680c66048fef56fc1f1a25cafbea4bc1d1c48/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:996a38a83508c54c78a5f41456b0103c30508fed9abcad0a59b876d7398f25fd", size = 2000663 }, - { url = "https://files.pythonhosted.org/packages/13/a5/1df8541651de4455e7d587cf556201b4f7997191e110bca3b589218745a5/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d97683ddee4723ae8c95d1eddac7c192e8c552da0c73a925a89fa8649bf13eea", size = 2655941 }, - { url = "https://files.pythonhosted.org/packages/44/31/a3899b5ce02c4316865e390107f145089876dff7e1dfc770a231d836aed8/pydantic_core-2.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:216f9b2d7713eb98cb83c80b9c794de1f6b7e3145eef40400c62e86cee5f4e1e", size = 2052105 }, - { url = "https://files.pythonhosted.org/packages/1b/aa/98e190f8745d5ec831f6d5449344c48c0627ac5fed4e5340a44b74878f8e/pydantic_core-2.23.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6f783e0ec4803c787bcea93e13e9932edab72068f68ecffdf86a99fd5918878b", size = 1919967 }, - { url = "https://files.pythonhosted.org/packages/ae/35/b6e00b6abb2acfee3e8f85558c02a0822e9a8b2f2d812ea8b9079b118ba0/pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d0776dea117cf5272382634bd2a5c1b6eb16767c223c6a5317cd3e2a757c61a0", size = 1964291 }, - { url = "https://files.pythonhosted.org/packages/13/46/7bee6d32b69191cd649bbbd2361af79c472d72cb29bb2024f0b6e350ba06/pydantic_core-2.23.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5f7a395a8cf1621939692dba2a6b6a830efa6b3cee787d82c7de1ad2930de64", size = 2109666 }, - { url = "https://files.pythonhosted.org/packages/39/ef/7b34f1b122a81b68ed0a7d0e564da9ccdc9a2924c8d6c6b5b11fa3a56970/pydantic_core-2.23.4-cp311-none-win32.whl", hash = "sha256:74b9127ffea03643e998e0c5ad9bd3811d3dac8c676e47db17b0ee7c3c3bf35f", size = 1732940 }, - { url = "https://files.pythonhosted.org/packages/2f/76/37b7e76c645843ff46c1d73e046207311ef298d3f7b2f7d8f6ac60113071/pydantic_core-2.23.4-cp311-none-win_amd64.whl", hash = "sha256:98d134c954828488b153d88ba1f34e14259284f256180ce659e8d83e9c05eaa3", size = 1916804 }, - { url = "https://files.pythonhosted.org/packages/74/7b/8e315f80666194b354966ec84b7d567da77ad927ed6323db4006cf915f3f/pydantic_core-2.23.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f3e0da4ebaef65158d4dfd7d3678aad692f7666877df0002b8a522cdf088f231", size = 1856459 }, - { url = "https://files.pythonhosted.org/packages/14/de/866bdce10ed808323d437612aca1ec9971b981e1c52e5e42ad9b8e17a6f6/pydantic_core-2.23.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f69a8e0b033b747bb3e36a44e7732f0c99f7edd5cea723d45bc0d6e95377ffee", size = 1770007 }, - { url = "https://files.pythonhosted.org/packages/dc/69/8edd5c3cd48bb833a3f7ef9b81d7666ccddd3c9a635225214e044b6e8281/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723314c1d51722ab28bfcd5240d858512ffd3116449c557a1336cbe3919beb87", size = 1790245 }, - { url = "https://files.pythonhosted.org/packages/80/33/9c24334e3af796ce80d2274940aae38dd4e5676298b4398eff103a79e02d/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bb2802e667b7051a1bebbfe93684841cc9351004e2badbd6411bf357ab8d5ac8", size = 1801260 }, - { url = "https://files.pythonhosted.org/packages/a5/6f/e9567fd90104b79b101ca9d120219644d3314962caa7948dd8b965e9f83e/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d18ca8148bebe1b0a382a27a8ee60350091a6ddaf475fa05ef50dc35b5df6327", size = 1996872 }, - { url = "https://files.pythonhosted.org/packages/2d/ad/b5f0fe9e6cfee915dd144edbd10b6e9c9c9c9d7a56b69256d124b8ac682e/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33e3d65a85a2a4a0dc3b092b938a4062b1a05f3a9abde65ea93b233bca0e03f2", size = 2661617 }, - { url = "https://files.pythonhosted.org/packages/06/c8/7d4b708f8d05a5cbfda3243aad468052c6e99de7d0937c9146c24d9f12e9/pydantic_core-2.23.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:128585782e5bfa515c590ccee4b727fb76925dd04a98864182b22e89a4e6ed36", size = 2071831 }, - { url = "https://files.pythonhosted.org/packages/89/4d/3079d00c47f22c9a9a8220db088b309ad6e600a73d7a69473e3a8e5e3ea3/pydantic_core-2.23.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:68665f4c17edcceecc112dfed5dbe6f92261fb9d6054b47d01bf6371a6196126", size = 1917453 }, - { url = "https://files.pythonhosted.org/packages/e9/88/9df5b7ce880a4703fcc2d76c8c2d8eb9f861f79d0c56f4b8f5f2607ccec8/pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:20152074317d9bed6b7a95ade3b7d6054845d70584216160860425f4fbd5ee9e", size = 1968793 }, - { url = "https://files.pythonhosted.org/packages/e3/b9/41f7efe80f6ce2ed3ee3c2dcfe10ab7adc1172f778cc9659509a79518c43/pydantic_core-2.23.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9261d3ce84fa1d38ed649c3638feefeae23d32ba9182963e465d58d62203bd24", size = 2116872 }, - { url = "https://files.pythonhosted.org/packages/63/08/b59b7a92e03dd25554b0436554bf23e7c29abae7cce4b1c459cd92746811/pydantic_core-2.23.4-cp312-none-win32.whl", hash = "sha256:4ba762ed58e8d68657fc1281e9bb72e1c3e79cc5d464be146e260c541ec12d84", size = 1738535 }, - { url = "https://files.pythonhosted.org/packages/88/8d/479293e4d39ab409747926eec4329de5b7129beaedc3786eca070605d07f/pydantic_core-2.23.4-cp312-none-win_amd64.whl", hash = "sha256:97df63000f4fea395b2824da80e169731088656d1818a11b95f3b173747b6cd9", size = 1917992 }, - { url = "https://files.pythonhosted.org/packages/ad/ef/16ee2df472bf0e419b6bc68c05bf0145c49247a1095e85cee1463c6a44a1/pydantic_core-2.23.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7530e201d10d7d14abce4fb54cfe5b94a0aefc87da539d0346a484ead376c3cc", size = 1856143 }, - { url = "https://files.pythonhosted.org/packages/da/fa/bc3dbb83605669a34a93308e297ab22be82dfb9dcf88c6cf4b4f264e0a42/pydantic_core-2.23.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:df933278128ea1cd77772673c73954e53a1c95a4fdf41eef97c2b779271bd0bd", size = 1770063 }, - { url = "https://files.pythonhosted.org/packages/4e/48/e813f3bbd257a712303ebdf55c8dc46f9589ec74b384c9f652597df3288d/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cb3da3fd1b6a5d0279a01877713dbda118a2a4fc6f0d821a57da2e464793f05", size = 1790013 }, - { url = "https://files.pythonhosted.org/packages/b4/e0/56eda3a37929a1d297fcab1966db8c339023bcca0b64c5a84896db3fcc5c/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42c6dcb030aefb668a2b7009c85b27f90e51e6a3b4d5c9bc4c57631292015b0d", size = 1801077 }, - { url = "https://files.pythonhosted.org/packages/04/be/5e49376769bfbf82486da6c5c1683b891809365c20d7c7e52792ce4c71f3/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:696dd8d674d6ce621ab9d45b205df149399e4bb9aa34102c970b721554828510", size = 1996782 }, - { url = "https://files.pythonhosted.org/packages/bc/24/e3ee6c04f1d58cc15f37bcc62f32c7478ff55142b7b3e6d42ea374ea427c/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2971bb5ffe72cc0f555c13e19b23c85b654dd2a8f7ab493c262071377bfce9f6", size = 2661375 }, - { url = "https://files.pythonhosted.org/packages/c1/f8/11a9006de4e89d016b8de74ebb1db727dc100608bb1e6bbe9d56a3cbbcce/pydantic_core-2.23.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8394d940e5d400d04cad4f75c0598665cbb81aecefaca82ca85bd28264af7f9b", size = 2071635 }, - { url = "https://files.pythonhosted.org/packages/7c/45/bdce5779b59f468bdf262a5bc9eecbae87f271c51aef628d8c073b4b4b4c/pydantic_core-2.23.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0dff76e0602ca7d4cdaacc1ac4c005e0ce0dcfe095d5b5259163a80d3a10d327", size = 1916994 }, - { url = "https://files.pythonhosted.org/packages/d8/fa/c648308fe711ee1f88192cad6026ab4f925396d1293e8356de7e55be89b5/pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7d32706badfe136888bdea71c0def994644e09fff0bfe47441deaed8e96fdbc6", size = 1968877 }, - { url = "https://files.pythonhosted.org/packages/16/16/b805c74b35607d24d37103007f899abc4880923b04929547ae68d478b7f4/pydantic_core-2.23.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed541d70698978a20eb63d8c5d72f2cc6d7079d9d90f6b50bad07826f1320f5f", size = 2116814 }, - { url = "https://files.pythonhosted.org/packages/d1/58/5305e723d9fcdf1c5a655e6a4cc2a07128bf644ff4b1d98daf7a9dbf57da/pydantic_core-2.23.4-cp313-none-win32.whl", hash = "sha256:3d5639516376dce1940ea36edf408c554475369f5da2abd45d44621cb616f769", size = 1738360 }, - { url = "https://files.pythonhosted.org/packages/a5/ae/e14b0ff8b3f48e02394d8acd911376b7b66e164535687ef7dc24ea03072f/pydantic_core-2.23.4-cp313-none-win_amd64.whl", hash = "sha256:5a1504ad17ba4210df3a045132a7baeeba5a200e930f57512ee02909fc5c4cb5", size = 1919411 }, +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/8d/71db63483d518cbbf290261a1fc2839d17ff89fce7089e08cad07ccfce67/pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", size = 2028584 }, + { url = "https://files.pythonhosted.org/packages/24/2f/3cfa7244ae292dd850989f328722d2aef313f74ffc471184dc509e1e4e5a/pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", size = 1855071 }, + { url = "https://files.pythonhosted.org/packages/b3/d3/4ae42d33f5e3f50dd467761304be2fa0a9417fbf09735bc2cce003480f2a/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", size = 1897823 }, + { url = "https://files.pythonhosted.org/packages/f4/f3/aa5976e8352b7695ff808599794b1fba2a9ae2ee954a3426855935799488/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", size = 1983792 }, + { url = "https://files.pythonhosted.org/packages/d5/7a/cda9b5a23c552037717f2b2a5257e9b2bfe45e687386df9591eff7b46d28/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", size = 2136338 }, + { url = "https://files.pythonhosted.org/packages/2b/9f/b8f9ec8dd1417eb9da784e91e1667d58a2a4a7b7b34cf4af765ef663a7e5/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", size = 2730998 }, + { url = "https://files.pythonhosted.org/packages/47/bc/cd720e078576bdb8255d5032c5d63ee5c0bf4b7173dd955185a1d658c456/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", size = 2003200 }, + { url = "https://files.pythonhosted.org/packages/ca/22/3602b895ee2cd29d11a2b349372446ae9727c32e78a94b3d588a40fdf187/pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", size = 2113890 }, + { url = "https://files.pythonhosted.org/packages/ff/e6/e3c5908c03cf00d629eb38393a98fccc38ee0ce8ecce32f69fc7d7b558a7/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d", size = 2073359 }, + { url = "https://files.pythonhosted.org/packages/12/e7/6a36a07c59ebefc8777d1ffdaf5ae71b06b21952582e4b07eba88a421c79/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", size = 2245883 }, + { url = "https://files.pythonhosted.org/packages/16/3f/59b3187aaa6cc0c1e6616e8045b284de2b6a87b027cce2ffcea073adf1d2/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", size = 2241074 }, + { url = "https://files.pythonhosted.org/packages/e0/ed/55532bb88f674d5d8f67ab121a2a13c385df382de2a1677f30ad385f7438/pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", size = 1910538 }, + { url = "https://files.pythonhosted.org/packages/fe/1b/25b7cccd4519c0b23c2dd636ad39d381abf113085ce4f7bec2b0dc755eb1/pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", size = 1952909 }, + { url = "https://files.pythonhosted.org/packages/49/a9/d809358e49126438055884c4366a1f6227f0f84f635a9014e2deb9b9de54/pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", size = 1897786 }, + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000 }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996 }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957 }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199 }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296 }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109 }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028 }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044 }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881 }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034 }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187 }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628 }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866 }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894 }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688 }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808 }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580 }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859 }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810 }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498 }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611 }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924 }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196 }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389 }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223 }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473 }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269 }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921 }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162 }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560 }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777 }, + { url = "https://files.pythonhosted.org/packages/7b/27/d4ae6487d73948d6f20dddcd94be4ea43e74349b56eba82e9bdee2d7494c/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", size = 2025200 }, + { url = "https://files.pythonhosted.org/packages/f1/b8/b3cb95375f05d33801024079b9392a5ab45267a63400bf1866e7ce0f0de4/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", size = 1859123 }, + { url = "https://files.pythonhosted.org/packages/05/bc/0d0b5adeda59a261cd30a1235a445bf55c7e46ae44aea28f7bd6ed46e091/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", size = 1892852 }, + { url = "https://files.pythonhosted.org/packages/3e/11/d37bdebbda2e449cb3f519f6ce950927b56d62f0b84fd9cb9e372a26a3d5/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", size = 2067484 }, + { url = "https://files.pythonhosted.org/packages/8c/55/1f95f0a05ce72ecb02a8a8a1c3be0579bbc29b1d5ab68f1378b7bebc5057/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", size = 2108896 }, + { url = "https://files.pythonhosted.org/packages/53/89/2b2de6c81fa131f423246a9109d7b2a375e83968ad0800d6e57d0574629b/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", size = 2069475 }, + { url = "https://files.pythonhosted.org/packages/b8/e9/1f7efbe20d0b2b10f6718944b5d8ece9152390904f29a78e68d4e7961159/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", size = 2239013 }, + { url = "https://files.pythonhosted.org/packages/3c/b2/5309c905a93811524a49b4e031e9851a6b00ff0fb668794472ea7746b448/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", size = 2238715 }, + { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757 }, ] [[package]] name = "pydantic-settings" -version = "2.9.1" +version = "2.10.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/67/1d/42628a2c33e93f8e9acbde0d5d735fa0850f3e6a2f8cb1eb6c40b9a732ac/pydantic_settings-2.9.1.tar.gz", hash = "sha256:c509bf79d27563add44e8446233359004ed85066cd096d8b510f715e6ef5d268", size = 163234 } +sdist = { url = "https://files.pythonhosted.org/packages/68/85/1ea668bbab3c50071ca613c6ab30047fb36ab0da1b92fa8f17bbc38fd36c/pydantic_settings-2.10.1.tar.gz", hash = "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee", size = 172583 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/5f/d6d641b490fd3ec2c4c13b4244d68deea3a1b970a97be64f34fb5504ff72/pydantic_settings-2.9.1-py3-none-any.whl", hash = "sha256:59b4f431b1defb26fe620c71a7d3968a710d719f5f4cdbbdb7926edeb770f6ef", size = 44356 }, + { url = "https://files.pythonhosted.org/packages/58/f0/427018098906416f580e3cf1366d3b1abfb408a0652e9f31600c24a1903c/pydantic_settings-2.10.1-py3-none-any.whl", hash = "sha256:a60952460b99cf661dc25c29c0ef171721f98bfcb52ef8d9ea4c943d7c8cc796", size = 45235 }, ] [[package]] name = "pygments" -version = "2.19.1" +version = "2.19.2" 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 } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631 } 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://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217 }, ] [[package]] @@ -2586,17 +2515,18 @@ crypto = [ [[package]] name = "pytest" -version = "8.3.5" +version = "8.4.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, + { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ae/3c/c9d525a414d506893f0cd8a8d0de7706446213181570cdbd766691164e40/pytest-8.3.5.tar.gz", hash = "sha256:f4efe70cc14e511565ac476b57c279e12a855b11f48f212af1080ef2263d3845", size = 1450891 } +sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714 } 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://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474 }, ] [[package]] @@ -2623,11 +2553,11 @@ wheels = [ [[package]] name = "python-dotenv" -version = "1.1.0" +version = "1.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/88/2c/7bb1416c5620485aa793f2de31d3df393d3686aa8a8506d11e10e13c5baf/python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5", size = 39920 } +sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/18/98a99ad95133c6a6e2005fe89faedf294a748bd5dc803008059409ac9b1e/python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d", size = 20256 }, + { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556 }, ] [[package]] @@ -2692,59 +2622,47 @@ wheels = [ [[package]] name = "pyzmq" -version = "26.4.0" +version = "27.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "implementation_name == 'pypy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/11/b9213d25230ac18a71b39b3723494e57adebe36e066397b961657b3b41c1/pyzmq-26.4.0.tar.gz", hash = "sha256:4bd13f85f80962f91a651a7356fe0472791a5f7a92f227822b5acf44795c626d", size = 278293 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/32/6d/234e3b0aa82fd0290b1896e9992f56bdddf1f97266110be54d0177a9d2d9/pyzmq-26.4.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:bfcf82644c9b45ddd7cd2a041f3ff8dce4a0904429b74d73a439e8cab1bd9e54", size = 1339723 }, - { url = "https://files.pythonhosted.org/packages/4f/11/6d561efe29ad83f7149a7cd48e498e539ed09019c6cd7ecc73f4cc725028/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9bcae3979b2654d5289d3490742378b2f3ce804b0b5fd42036074e2bf35b030", size = 672645 }, - { url = "https://files.pythonhosted.org/packages/19/fd/81bfe3e23f418644660bad1a90f0d22f0b3eebe33dd65a79385530bceb3d/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ccdff8ac4246b6fb60dcf3982dfaeeff5dd04f36051fe0632748fc0aa0679c01", size = 910133 }, - { url = "https://files.pythonhosted.org/packages/97/68/321b9c775595ea3df832a9516252b653fe32818db66fdc8fa31c9b9fce37/pyzmq-26.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4550af385b442dc2d55ab7717837812799d3674cb12f9a3aa897611839c18e9e", size = 867428 }, - { url = "https://files.pythonhosted.org/packages/4e/6e/159cbf2055ef36aa2aa297e01b24523176e5b48ead283c23a94179fb2ba2/pyzmq-26.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:2f9f7ffe9db1187a253fca95191854b3fda24696f086e8789d1d449308a34b88", size = 862409 }, - { url = "https://files.pythonhosted.org/packages/05/1c/45fb8db7be5a7d0cadea1070a9cbded5199a2d578de2208197e592f219bd/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3709c9ff7ba61589b7372923fd82b99a81932b592a5c7f1a24147c91da9a68d6", size = 1205007 }, - { url = "https://files.pythonhosted.org/packages/f8/fa/658c7f583af6498b463f2fa600f34e298e1b330886f82f1feba0dc2dd6c3/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f8f3c30fb2d26ae5ce36b59768ba60fb72507ea9efc72f8f69fa088450cff1df", size = 1514599 }, - { url = "https://files.pythonhosted.org/packages/4d/d7/44d641522353ce0a2bbd150379cb5ec32f7120944e6bfba4846586945658/pyzmq-26.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:382a4a48c8080e273427fc692037e3f7d2851959ffe40864f2db32646eeb3cef", size = 1414546 }, - { url = "https://files.pythonhosted.org/packages/72/76/c8ed7263218b3d1e9bce07b9058502024188bd52cc0b0a267a9513b431fc/pyzmq-26.4.0-cp311-cp311-win32.whl", hash = "sha256:d56aad0517d4c09e3b4f15adebba8f6372c5102c27742a5bdbfc74a7dceb8fca", size = 579247 }, - { url = "https://files.pythonhosted.org/packages/c3/d0/2d9abfa2571a0b1a67c0ada79a8aa1ba1cce57992d80f771abcdf99bb32c/pyzmq-26.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:963977ac8baed7058c1e126014f3fe58b3773f45c78cce7af5c26c09b6823896", size = 644727 }, - { url = "https://files.pythonhosted.org/packages/0d/d1/c8ad82393be6ccedfc3c9f3adb07f8f3976e3c4802640fe3f71441941e70/pyzmq-26.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0c8e8cadc81e44cc5088fcd53b9b3b4ce9344815f6c4a03aec653509296fae3", size = 559942 }, - { url = "https://files.pythonhosted.org/packages/10/44/a778555ebfdf6c7fc00816aad12d185d10a74d975800341b1bc36bad1187/pyzmq-26.4.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:5227cb8da4b6f68acfd48d20c588197fd67745c278827d5238c707daf579227b", size = 1341586 }, - { url = "https://files.pythonhosted.org/packages/9c/4f/f3a58dc69ac757e5103be3bd41fb78721a5e17da7cc617ddb56d973a365c/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1c07a7fa7f7ba86554a2b1bef198c9fed570c08ee062fd2fd6a4dcacd45f905", size = 665880 }, - { url = "https://files.pythonhosted.org/packages/fe/45/50230bcfb3ae5cb98bee683b6edeba1919f2565d7cc1851d3c38e2260795/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae775fa83f52f52de73183f7ef5395186f7105d5ed65b1ae65ba27cb1260de2b", size = 902216 }, - { url = "https://files.pythonhosted.org/packages/41/59/56bbdc5689be5e13727491ad2ba5efd7cd564365750514f9bc8f212eef82/pyzmq-26.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66c760d0226ebd52f1e6b644a9e839b5db1e107a23f2fcd46ec0569a4fdd4e63", size = 859814 }, - { url = "https://files.pythonhosted.org/packages/81/b1/57db58cfc8af592ce94f40649bd1804369c05b2190e4cbc0a2dad572baeb/pyzmq-26.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ef8c6ecc1d520debc147173eaa3765d53f06cd8dbe7bd377064cdbc53ab456f5", size = 855889 }, - { url = "https://files.pythonhosted.org/packages/e8/92/47542e629cbac8f221c230a6d0f38dd3d9cff9f6f589ed45fdf572ffd726/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3150ef4084e163dec29ae667b10d96aad309b668fac6810c9e8c27cf543d6e0b", size = 1197153 }, - { url = "https://files.pythonhosted.org/packages/07/e5/b10a979d1d565d54410afc87499b16c96b4a181af46e7645ab4831b1088c/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4448c9e55bf8329fa1dcedd32f661bf611214fa70c8e02fee4347bc589d39a84", size = 1507352 }, - { url = "https://files.pythonhosted.org/packages/ab/58/5a23db84507ab9c01c04b1232a7a763be66e992aa2e66498521bbbc72a71/pyzmq-26.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e07dde3647afb084d985310d067a3efa6efad0621ee10826f2cb2f9a31b89d2f", size = 1406834 }, - { url = "https://files.pythonhosted.org/packages/22/74/aaa837b331580c13b79ac39396601fb361454ee184ca85e8861914769b99/pyzmq-26.4.0-cp312-cp312-win32.whl", hash = "sha256:ba034a32ecf9af72adfa5ee383ad0fd4f4e38cdb62b13624278ef768fe5b5b44", size = 577992 }, - { url = "https://files.pythonhosted.org/packages/30/0f/55f8c02c182856743b82dde46b2dc3e314edda7f1098c12a8227eeda0833/pyzmq-26.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:056a97aab4064f526ecb32f4343917a4022a5d9efb6b9df990ff72e1879e40be", size = 640466 }, - { url = "https://files.pythonhosted.org/packages/e4/29/073779afc3ef6f830b8de95026ef20b2d1ec22d0324d767748d806e57379/pyzmq-26.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:2f23c750e485ce1eb639dbd576d27d168595908aa2d60b149e2d9e34c9df40e0", size = 556342 }, - { url = "https://files.pythonhosted.org/packages/d7/20/fb2c92542488db70f833b92893769a569458311a76474bda89dc4264bd18/pyzmq-26.4.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:c43fac689880f5174d6fc864857d1247fe5cfa22b09ed058a344ca92bf5301e3", size = 1339484 }, - { url = "https://files.pythonhosted.org/packages/58/29/2f06b9cabda3a6ea2c10f43e67ded3e47fc25c54822e2506dfb8325155d4/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:902aca7eba477657c5fb81c808318460328758e8367ecdd1964b6330c73cae43", size = 666106 }, - { url = "https://files.pythonhosted.org/packages/77/e4/dcf62bd29e5e190bd21bfccaa4f3386e01bf40d948c239239c2f1e726729/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e48a830bfd152fe17fbdeaf99ac5271aa4122521bf0d275b6b24e52ef35eb6", size = 902056 }, - { url = "https://files.pythonhosted.org/packages/1a/cf/b36b3d7aea236087d20189bec1a87eeb2b66009731d7055e5c65f845cdba/pyzmq-26.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31be2b6de98c824c06f5574331f805707c667dc8f60cb18580b7de078479891e", size = 860148 }, - { url = "https://files.pythonhosted.org/packages/18/a6/f048826bc87528c208e90604c3bf573801e54bd91e390cbd2dfa860e82dc/pyzmq-26.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6332452034be001bbf3206ac59c0d2a7713de5f25bb38b06519fc6967b7cf771", size = 855983 }, - { url = "https://files.pythonhosted.org/packages/0a/27/454d34ab6a1d9772a36add22f17f6b85baf7c16e14325fa29e7202ca8ee8/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:da8c0f5dd352136853e6a09b1b986ee5278dfddfebd30515e16eae425c872b30", size = 1197274 }, - { url = "https://files.pythonhosted.org/packages/f4/3d/7abfeab6b83ad38aa34cbd57c6fc29752c391e3954fd12848bd8d2ec0df6/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:f4ccc1a0a2c9806dda2a2dd118a3b7b681e448f3bb354056cad44a65169f6d86", size = 1507120 }, - { url = "https://files.pythonhosted.org/packages/13/ff/bc8d21dbb9bc8705126e875438a1969c4f77e03fc8565d6901c7933a3d01/pyzmq-26.4.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1c0b5fceadbab461578daf8d1dcc918ebe7ddd2952f748cf30c7cf2de5d51101", size = 1406738 }, - { url = "https://files.pythonhosted.org/packages/f5/5d/d4cd85b24de71d84d81229e3bbb13392b2698432cf8fdcea5afda253d587/pyzmq-26.4.0-cp313-cp313-win32.whl", hash = "sha256:28e2b0ff5ba4b3dd11062d905682bad33385cfa3cc03e81abd7f0822263e6637", size = 577826 }, - { url = "https://files.pythonhosted.org/packages/c6/6c/f289c1789d7bb6e5a3b3bef7b2a55089b8561d17132be7d960d3ff33b14e/pyzmq-26.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:23ecc9d241004c10e8b4f49d12ac064cd7000e1643343944a10df98e57bc544b", size = 640406 }, - { url = "https://files.pythonhosted.org/packages/b3/99/676b8851cb955eb5236a0c1e9ec679ea5ede092bf8bf2c8a68d7e965cac3/pyzmq-26.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:1edb0385c7f025045d6e0f759d4d3afe43c17a3d898914ec6582e6f464203c08", size = 556216 }, - { url = "https://files.pythonhosted.org/packages/65/c2/1fac340de9d7df71efc59d9c50fc7a635a77b103392d1842898dd023afcb/pyzmq-26.4.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:93a29e882b2ba1db86ba5dd5e88e18e0ac6b627026c5cfbec9983422011b82d4", size = 1333769 }, - { url = "https://files.pythonhosted.org/packages/5c/c7/6c03637e8d742c3b00bec4f5e4cd9d1c01b2f3694c6f140742e93ca637ed/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb45684f276f57110bb89e4300c00f1233ca631f08f5f42528a5c408a79efc4a", size = 658826 }, - { url = "https://files.pythonhosted.org/packages/a5/97/a8dca65913c0f78e0545af2bb5078aebfc142ca7d91cdaffa1fbc73e5dbd/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72073e75260cb301aad4258ad6150fa7f57c719b3f498cb91e31df16784d89b", size = 891650 }, - { url = "https://files.pythonhosted.org/packages/7d/7e/f63af1031eb060bf02d033732b910fe48548dcfdbe9c785e9f74a6cc6ae4/pyzmq-26.4.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be37e24b13026cfedd233bcbbccd8c0bcd2fdd186216094d095f60076201538d", size = 849776 }, - { url = "https://files.pythonhosted.org/packages/f6/fa/1a009ce582802a895c0d5fe9413f029c940a0a8ee828657a3bb0acffd88b/pyzmq-26.4.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:237b283044934d26f1eeff4075f751b05d2f3ed42a257fc44386d00df6a270cf", size = 842516 }, - { url = "https://files.pythonhosted.org/packages/6e/bc/f88b0bad0f7a7f500547d71e99f10336f2314e525d4ebf576a1ea4a1d903/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:b30f862f6768b17040929a68432c8a8be77780317f45a353cb17e423127d250c", size = 1189183 }, - { url = "https://files.pythonhosted.org/packages/d9/8c/db446a3dd9cf894406dec2e61eeffaa3c07c3abb783deaebb9812c4af6a5/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:c80fcd3504232f13617c6ab501124d373e4895424e65de8b72042333316f64a8", size = 1495501 }, - { url = "https://files.pythonhosted.org/packages/05/4c/bf3cad0d64c3214ac881299c4562b815f05d503bccc513e3fd4fdc6f67e4/pyzmq-26.4.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:26a2a7451606b87f67cdeca2c2789d86f605da08b4bd616b1a9981605ca3a364", size = 1395540 }, - { url = "https://files.pythonhosted.org/packages/04/52/a70fcd5592715702248306d8e1729c10742c2eac44529984413b05c68658/pyzmq-26.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4478b14cb54a805088299c25a79f27eaf530564a7a4f72bf432a040042b554eb", size = 834405 }, - { url = "https://files.pythonhosted.org/packages/25/f9/1a03f1accff16b3af1a6fa22cbf7ced074776abbf688b2e9cb4629700c62/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a28ac29c60e4ba84b5f58605ace8ad495414a724fe7aceb7cf06cd0598d04e1", size = 569578 }, - { url = "https://files.pythonhosted.org/packages/76/0c/3a633acd762aa6655fcb71fa841907eae0ab1e8582ff494b137266de341d/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43b03c1ceea27c6520124f4fb2ba9c647409b9abdf9a62388117148a90419494", size = 798248 }, - { url = "https://files.pythonhosted.org/packages/cd/cc/6c99c84aa60ac1cc56747bed6be8ce6305b9b861d7475772e7a25ce019d3/pyzmq-26.4.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7731abd23a782851426d4e37deb2057bf9410848a4459b5ede4fe89342e687a9", size = 756757 }, - { url = "https://files.pythonhosted.org/packages/13/9c/d8073bd898eb896e94c679abe82e47506e2b750eb261cf6010ced869797c/pyzmq-26.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a222ad02fbe80166b0526c038776e8042cd4e5f0dec1489a006a1df47e9040e0", size = 555371 }, +sdist = { url = "https://files.pythonhosted.org/packages/f1/06/50a4e9648b3e8b992bef8eb632e457307553a89d294103213cfd47b3da69/pyzmq-27.0.0.tar.gz", hash = "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf", size = 280478 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/df/84c630654106d9bd9339cdb564aa941ed41b023a0264251d6743766bb50e/pyzmq-27.0.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:21457825249b2a53834fa969c69713f8b5a79583689387a5e7aed880963ac564", size = 1332718 }, + { url = "https://files.pythonhosted.org/packages/c1/8e/f6a5461a07654d9840d256476434ae0ff08340bba562a455f231969772cb/pyzmq-27.0.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1958947983fef513e6e98eff9cb487b60bf14f588dc0e6bf35fa13751d2c8251", size = 908248 }, + { url = "https://files.pythonhosted.org/packages/7c/93/82863e8d695a9a3ae424b63662733ae204a295a2627d52af2f62c2cd8af9/pyzmq-27.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0dc628b5493f9a8cd9844b8bee9732ef587ab00002157c9329e4fc0ef4d3afa", size = 668647 }, + { url = "https://files.pythonhosted.org/packages/f3/85/15278769b348121eacdbfcbd8c4d40f1102f32fa6af5be1ffc032ed684be/pyzmq-27.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7bbe9e1ed2c8d3da736a15694d87c12493e54cc9dc9790796f0321794bbc91f", size = 856600 }, + { url = "https://files.pythonhosted.org/packages/d4/af/1c469b3d479bd095edb28e27f12eee10b8f00b356acbefa6aeb14dd295d1/pyzmq-27.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dc1091f59143b471d19eb64f54bae4f54bcf2a466ffb66fe45d94d8d734eb495", size = 1657748 }, + { url = "https://files.pythonhosted.org/packages/8c/f4/17f965d0ee6380b1d6326da842a50e4b8b9699745161207945f3745e8cb5/pyzmq-27.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7011ade88c8e535cf140f8d1a59428676fbbce7c6e54fefce58bf117aefb6667", size = 2034311 }, + { url = "https://files.pythonhosted.org/packages/e0/6e/7c391d81fa3149fd759de45d298003de6cfab343fb03e92c099821c448db/pyzmq-27.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c386339d7e3f064213aede5d03d054b237937fbca6dd2197ac8cf3b25a6b14e", size = 1893630 }, + { url = "https://files.pythonhosted.org/packages/0e/e0/eaffe7a86f60e556399e224229e7769b717f72fec0706b70ab2c03aa04cb/pyzmq-27.0.0-cp311-cp311-win32.whl", hash = "sha256:0546a720c1f407b2172cb04b6b094a78773491497e3644863cf5c96c42df8cff", size = 567706 }, + { url = "https://files.pythonhosted.org/packages/c9/05/89354a8cffdcce6e547d48adaaf7be17007fc75572123ff4ca90a4ca04fc/pyzmq-27.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:15f39d50bd6c9091c67315ceb878a4f531957b121d2a05ebd077eb35ddc5efed", size = 630322 }, + { url = "https://files.pythonhosted.org/packages/fa/07/4ab976d5e1e63976719389cc4f3bfd248a7f5f2bb2ebe727542363c61b5f/pyzmq-27.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c5817641eebb391a2268c27fecd4162448e03538387093cdbd8bf3510c316b38", size = 558435 }, + { url = "https://files.pythonhosted.org/packages/93/a7/9ad68f55b8834ede477842214feba6a4c786d936c022a67625497aacf61d/pyzmq-27.0.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:cbabc59dcfaac66655c040dfcb8118f133fb5dde185e5fc152628354c1598e52", size = 1305438 }, + { url = "https://files.pythonhosted.org/packages/ba/ee/26aa0f98665a22bc90ebe12dced1de5f3eaca05363b717f6fb229b3421b3/pyzmq-27.0.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cb0ac5179cba4b2f94f1aa208fbb77b62c4c9bf24dd446278b8b602cf85fcda3", size = 895095 }, + { url = "https://files.pythonhosted.org/packages/cf/85/c57e7ab216ecd8aa4cc7e3b83b06cc4e9cf45c87b0afc095f10cd5ce87c1/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53a48f0228eab6cbf69fde3aa3c03cbe04e50e623ef92ae395fce47ef8a76152", size = 651826 }, + { url = "https://files.pythonhosted.org/packages/69/9a/9ea7e230feda9400fb0ae0d61d7d6ddda635e718d941c44eeab22a179d34/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:111db5f395e09f7e775f759d598f43cb815fc58e0147623c4816486e1a39dc22", size = 839750 }, + { url = "https://files.pythonhosted.org/packages/08/66/4cebfbe71f3dfbd417011daca267539f62ed0fbc68105357b68bbb1a25b7/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c8878011653dcdc27cc2c57e04ff96f0471e797f5c19ac3d7813a245bcb24371", size = 1641357 }, + { url = "https://files.pythonhosted.org/packages/ac/f6/b0f62578c08d2471c791287149cb8c2aaea414ae98c6e995c7dbe008adfb/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:c0ed2c1f335ba55b5fdc964622254917d6b782311c50e138863eda409fbb3b6d", size = 2020281 }, + { url = "https://files.pythonhosted.org/packages/37/b9/4f670b15c7498495da9159edc374ec09c88a86d9cd5a47d892f69df23450/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e918d70862d4cfd4b1c187310015646a14e1f5917922ab45b29f28f345eeb6be", size = 1877110 }, + { url = "https://files.pythonhosted.org/packages/66/31/9dee25c226295b740609f0d46db2fe972b23b6f5cf786360980524a3ba92/pyzmq-27.0.0-cp312-abi3-win32.whl", hash = "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4", size = 559297 }, + { url = "https://files.pythonhosted.org/packages/9b/12/52da5509800f7ff2d287b2f2b4e636e7ea0f001181cba6964ff6c1537778/pyzmq-27.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371", size = 619203 }, + { url = "https://files.pythonhosted.org/packages/93/6d/7f2e53b19d1edb1eb4f09ec7c3a1f945ca0aac272099eab757d15699202b/pyzmq-27.0.0-cp312-abi3-win_arm64.whl", hash = "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e", size = 551927 }, + { url = "https://files.pythonhosted.org/packages/19/62/876b27c4ff777db4ceba1c69ea90d3c825bb4f8d5e7cd987ce5802e33c55/pyzmq-27.0.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c36ad534c0c29b4afa088dc53543c525b23c0797e01b69fef59b1a9c0e38b688", size = 1340826 }, + { url = "https://files.pythonhosted.org/packages/43/69/58ef8f4f59d3bcd505260c73bee87b008850f45edca40ddaba54273c35f4/pyzmq-27.0.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:67855c14173aec36395d7777aaba3cc527b393821f30143fd20b98e1ff31fd38", size = 897283 }, + { url = "https://files.pythonhosted.org/packages/43/15/93a0d0396700a60475ad3c5d42c5f1c308d3570bc94626b86c71ef9953e0/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8617c7d43cd8ccdb62aebe984bfed77ca8f036e6c3e46dd3dddda64b10f0ab7a", size = 660567 }, + { url = "https://files.pythonhosted.org/packages/0e/b3/fe055513e498ca32f64509abae19b9c9eb4d7c829e02bd8997dd51b029eb/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:67bfbcbd0a04c575e8103a6061d03e393d9f80ffdb9beb3189261e9e9bc5d5e9", size = 847681 }, + { url = "https://files.pythonhosted.org/packages/b6/4f/ff15300b00b5b602191f3df06bbc8dd4164e805fdd65bb77ffbb9c5facdc/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5cd11d46d7b7e5958121b3eaf4cd8638eff3a720ec527692132f05a57f14341d", size = 1650148 }, + { url = "https://files.pythonhosted.org/packages/c4/6f/84bdfff2a224a6f26a24249a342e5906993c50b0761e311e81b39aef52a7/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:b801c2e40c5aa6072c2f4876de8dccd100af6d9918d4d0d7aa54a1d982fd4f44", size = 2023768 }, + { url = "https://files.pythonhosted.org/packages/64/39/dc2db178c26a42228c5ac94a9cc595030458aa64c8d796a7727947afbf55/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:20d5cb29e8c5f76a127c75b6e7a77e846bc4b655c373baa098c26a61b7ecd0ef", size = 1885199 }, + { url = "https://files.pythonhosted.org/packages/c7/21/dae7b06a1f8cdee5d8e7a63d99c5d129c401acc40410bef2cbf42025e26f/pyzmq-27.0.0-cp313-cp313t-win32.whl", hash = "sha256:a20528da85c7ac7a19b7384e8c3f8fa707841fd85afc4ed56eda59d93e3d98ad", size = 575439 }, + { url = "https://files.pythonhosted.org/packages/eb/bc/1709dc55f0970cf4cb8259e435e6773f9946f41a045c2cb90e870b7072da/pyzmq-27.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d8229f2efece6a660ee211d74d91dbc2a76b95544d46c74c615e491900dc107f", size = 639933 }, + { url = "https://files.pythonhosted.org/packages/98/a6/92394373b8dbc1edc9d53c951e8d3989d518185174ee54492ec27711779d/pyzmq-27.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd1dc59763effd1576f8368047c9c31468fce0af89d76b5067641137506792ae", size = 835948 }, + { url = "https://files.pythonhosted.org/packages/56/f3/4dc38d75d9995bfc18773df3e41f2a2ca9b740b06f1a15dbf404077e7588/pyzmq-27.0.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:60e8cc82d968174650c1860d7b716366caab9973787a1c060cf8043130f7d0f7", size = 799874 }, + { url = "https://files.pythonhosted.org/packages/ab/ba/64af397e0f421453dc68e31d5e0784d554bf39013a2de0872056e96e58af/pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14fe7aaac86e4e93ea779a821967360c781d7ac5115b3f1a171ced77065a0174", size = 567400 }, + { url = "https://files.pythonhosted.org/packages/63/87/ec956cbe98809270b59a22891d5758edae147a258e658bf3024a8254c855/pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6ad0562d4e6abb785be3e4dd68599c41be821b521da38c402bc9ab2a8e7ebc7e", size = 747031 }, + { url = "https://files.pythonhosted.org/packages/be/8a/4a3764a68abc02e2fbb0668d225b6fda5cd39586dd099cee8b2ed6ab0452/pyzmq-27.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:9df43a2459cd3a3563404c1456b2c4c69564daa7dbaf15724c09821a3329ce46", size = 544726 }, ] [[package]] @@ -2820,62 +2738,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775 }, ] -[[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/58/58/7e4d9493a66c88a7da6d205768119f51af0f684fe7be7bac8328e217a52c/regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638", size = 482669 }, - { url = "https://files.pythonhosted.org/packages/34/4c/8f8e631fcdc2ff978609eaeef1d6994bf2f028b59d9ac67640ed051f1218/regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7", size = 287684 }, - { url = "https://files.pythonhosted.org/packages/c5/1b/f0e4d13e6adf866ce9b069e191f303a30ab1277e037037a365c3aad5cc9c/regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20", size = 284589 }, - { url = "https://files.pythonhosted.org/packages/25/4d/ab21047f446693887f25510887e6820b93f791992994f6498b0318904d4a/regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114", size = 792121 }, - { url = "https://files.pythonhosted.org/packages/45/ee/c867e15cd894985cb32b731d89576c41a4642a57850c162490ea34b78c3b/regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3", size = 831275 }, - { url = "https://files.pythonhosted.org/packages/b3/12/b0f480726cf1c60f6536fa5e1c95275a77624f3ac8fdccf79e6727499e28/regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f", size = 818257 }, - { url = "https://files.pythonhosted.org/packages/bf/ce/0d0e61429f603bac433910d99ef1a02ce45a8967ffbe3cbee48599e62d88/regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0", size = 792727 }, - { url = "https://files.pythonhosted.org/packages/e4/c1/243c83c53d4a419c1556f43777ccb552bccdf79d08fda3980e4e77dd9137/regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55", size = 780667 }, - { url = "https://files.pythonhosted.org/packages/c5/f4/75eb0dd4ce4b37f04928987f1d22547ddaf6c4bae697623c1b05da67a8aa/regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89", size = 776963 }, - { url = "https://files.pythonhosted.org/packages/16/5d/95c568574e630e141a69ff8a254c2f188b4398e813c40d49228c9bbd9875/regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d", size = 784700 }, - { url = "https://files.pythonhosted.org/packages/8e/b5/f8495c7917f15cc6fee1e7f395e324ec3e00ab3c665a7dc9d27562fd5290/regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34", size = 848592 }, - { url = "https://files.pythonhosted.org/packages/1c/80/6dd7118e8cb212c3c60b191b932dc57db93fb2e36fb9e0e92f72a5909af9/regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d", size = 852929 }, - { url = "https://files.pythonhosted.org/packages/11/9b/5a05d2040297d2d254baf95eeeb6df83554e5e1df03bc1a6687fc4ba1f66/regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45", size = 781213 }, - { url = "https://files.pythonhosted.org/packages/26/b7/b14e2440156ab39e0177506c08c18accaf2b8932e39fb092074de733d868/regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9", size = 261734 }, - { url = "https://files.pythonhosted.org/packages/80/32/763a6cc01d21fb3819227a1cc3f60fd251c13c37c27a73b8ff4315433a8e/regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60", size = 274052 }, - { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781 }, - { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455 }, - { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759 }, - { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976 }, - { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077 }, - { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160 }, - { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896 }, - { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997 }, - { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725 }, - { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481 }, - { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896 }, - { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138 }, - { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692 }, - { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135 }, - { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567 }, - { 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" +version = "2.32.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, @@ -2883,9 +2748,9 @@ dependencies = [ { 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://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258 } 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://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847 }, ] [[package]] @@ -2903,15 +2768,15 @@ wheels = [ [[package]] name = "rich" -version = "13.9.4" +version = "14.0.0" source = { registry = "https://pypi.org/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://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 } 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://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 }, ] [[package]] @@ -3011,14 +2876,14 @@ wheels = [ [[package]] name = "ruamel-yaml" -version = "0.18.11" +version = "0.18.14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ruamel-yaml-clib", marker = "platform_python_implementation == 'CPython'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9d/8f/dfbab2d5ec83da0605ab935fb43ffa8ab5828455e2c910b7314fdd18e0b8/ruamel.yaml-0.18.11.tar.gz", hash = "sha256:b586a3416676566ed45bf679a0909719f7ea7b58c03a9b6e03f905a1e2cd5076", size = 144299 } +sdist = { url = "https://files.pythonhosted.org/packages/39/87/6da0df742a4684263261c253f00edd5829e6aca970fff69e75028cccc547/ruamel.yaml-0.18.14.tar.gz", hash = "sha256:7227b76aaec364df15936730efbf7d72b30c0b79b1d578bbb8e3dcb2d81f52b7", size = 145511 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/62/615a16ebbca43fd4434843e9d346d795a134d0a1ff46101c858d93c9778d/ruamel.yaml-0.18.11-py3-none-any.whl", hash = "sha256:eca06c9fce6ee3220845c4c54e58376586e041a6127e4d1958e12a3142084897", size = 118313 }, + { url = "https://files.pythonhosted.org/packages/af/6d/6fe4805235e193aad4aaf979160dd1f3c487c57d48b810c816e6e842171b/ruamel.yaml-0.18.14-py3-none-any.whl", hash = "sha256:710ff198bb53da66718c7db27eec4fbcc9aa6ca7204e4c1df2f282b6fe5eb6b2", size = 118570 }, ] [[package]] @@ -3058,87 +2923,41 @@ wheels = [ [[package]] name = "ruff" -version = "0.11.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/53/ae4857030d59286924a8bdb30d213d6ff22d8f0957e738d0289990091dd8/ruff-0.11.11.tar.gz", hash = "sha256:7774173cc7c1980e6bf67569ebb7085989a78a103922fb83ef3dfe230cd0687d", size = 4186707 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/14/f2326676197bab099e2a24473158c21656fbf6a207c65f596ae15acb32b9/ruff-0.11.11-py3-none-linux_armv6l.whl", hash = "sha256:9924e5ae54125ed8958a4f7de320dab7380f6e9fa3195e3dc3b137c6842a0092", size = 10229049 }, - { url = "https://files.pythonhosted.org/packages/9a/f3/bff7c92dd66c959e711688b2e0768e486bbca46b2f35ac319bb6cce04447/ruff-0.11.11-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:c8a93276393d91e952f790148eb226658dd275cddfde96c6ca304873f11d2ae4", size = 11053601 }, - { url = "https://files.pythonhosted.org/packages/e2/38/8e1a3efd0ef9d8259346f986b77de0f62c7a5ff4a76563b6b39b68f793b9/ruff-0.11.11-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d6e333dbe2e6ae84cdedefa943dfd6434753ad321764fd937eef9d6b62022bcd", size = 10367421 }, - { url = "https://files.pythonhosted.org/packages/b4/50/557ad9dd4fb9d0bf524ec83a090a3932d284d1a8b48b5906b13b72800e5f/ruff-0.11.11-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7885d9a5e4c77b24e8c88aba8c80be9255fa22ab326019dac2356cff42089fc6", size = 10581980 }, - { url = "https://files.pythonhosted.org/packages/c4/b2/e2ed82d6e2739ece94f1bdbbd1d81b712d3cdaf69f0a1d1f1a116b33f9ad/ruff-0.11.11-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1b5ab797fcc09121ed82e9b12b6f27e34859e4227080a42d090881be888755d4", size = 10089241 }, - { url = "https://files.pythonhosted.org/packages/3d/9f/b4539f037a5302c450d7c695c82f80e98e48d0d667ecc250e6bdeb49b5c3/ruff-0.11.11-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e231ff3132c1119ece836487a02785f099a43992b95c2f62847d29bace3c75ac", size = 11699398 }, - { url = "https://files.pythonhosted.org/packages/61/fb/32e029d2c0b17df65e6eaa5ce7aea5fbeaed22dddd9fcfbbf5fe37c6e44e/ruff-0.11.11-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:a97c9babe1d4081037a90289986925726b802d180cca784ac8da2bbbc335f709", size = 12427955 }, - { url = "https://files.pythonhosted.org/packages/6e/e3/160488dbb11f18c8121cfd588e38095ba779ae208292765972f7732bfd95/ruff-0.11.11-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d8c4ddcbe8a19f59f57fd814b8b117d4fcea9bee7c0492e6cf5fdc22cfa563c8", size = 12069803 }, - { url = "https://files.pythonhosted.org/packages/ff/16/3b006a875f84b3d0bff24bef26b8b3591454903f6f754b3f0a318589dcc3/ruff-0.11.11-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6224076c344a7694c6fbbb70d4f2a7b730f6d47d2a9dc1e7f9d9bb583faf390b", size = 11242630 }, - { url = "https://files.pythonhosted.org/packages/65/0d/0338bb8ac0b97175c2d533e9c8cdc127166de7eb16d028a43c5ab9e75abd/ruff-0.11.11-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:882821fcdf7ae8db7a951df1903d9cb032bbe838852e5fc3c2b6c3ab54e39875", size = 11507310 }, - { url = "https://files.pythonhosted.org/packages/6f/bf/d7130eb26174ce9b02348b9f86d5874eafbf9f68e5152e15e8e0a392e4a3/ruff-0.11.11-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:dcec2d50756463d9df075a26a85a6affbc1b0148873da3997286caf1ce03cae1", size = 10441144 }, - { url = "https://files.pythonhosted.org/packages/b3/f3/4be2453b258c092ff7b1761987cf0749e70ca1340cd1bfb4def08a70e8d8/ruff-0.11.11-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:99c28505ecbaeb6594701a74e395b187ee083ee26478c1a795d35084d53ebd81", size = 10081987 }, - { url = "https://files.pythonhosted.org/packages/6c/6e/dfa4d2030c5b5c13db158219f2ec67bf333e8a7748dccf34cfa2a6ab9ebc/ruff-0.11.11-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9263f9e5aa4ff1dec765e99810f1cc53f0c868c5329b69f13845f699fe74f639", size = 11073922 }, - { url = "https://files.pythonhosted.org/packages/ff/f4/f7b0b0c3d32b593a20ed8010fa2c1a01f2ce91e79dda6119fcc51d26c67b/ruff-0.11.11-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:64ac6f885e3ecb2fdbb71de2701d4e34526651f1e8503af8fb30d4915a3fe345", size = 11568537 }, - { url = "https://files.pythonhosted.org/packages/d2/46/0e892064d0adc18bcc81deed9aaa9942a27fd2cd9b1b7791111ce468c25f/ruff-0.11.11-py3-none-win32.whl", hash = "sha256:1adcb9a18802268aaa891ffb67b1c94cd70578f126637118e8099b8e4adcf112", size = 10536492 }, - { url = "https://files.pythonhosted.org/packages/1b/d9/232e79459850b9f327e9f1dc9c047a2a38a6f9689e1ec30024841fc4416c/ruff-0.11.11-py3-none-win_amd64.whl", hash = "sha256:748b4bb245f11e91a04a4ff0f96e386711df0a30412b9fe0c74d5bdc0e4a531f", size = 11612562 }, - { url = "https://files.pythonhosted.org/packages/ce/eb/09c132cff3cc30b2e7244191dcce69437352d6d6709c0adf374f3e6f476e/ruff-0.11.11-py3-none-win_arm64.whl", hash = "sha256:6c51f136c0364ab1b774767aa8b86331bd8e9d414e2d107db7a2189f35ea1f7b", size = 10735951 }, +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/97/38/796a101608a90494440856ccfb52b1edae90de0b817e76bfade66b12d320/ruff-0.12.1.tar.gz", hash = "sha256:806bbc17f1104fd57451a98a58df35388ee3ab422e029e8f5cf30aa4af2c138c", size = 4413426 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/bf/3dba52c1d12ab5e78d75bd78ad52fb85a6a1f29cc447c2423037b82bed0d/ruff-0.12.1-py3-none-linux_armv6l.whl", hash = "sha256:6013a46d865111e2edb71ad692fbb8262e6c172587a57c0669332a449384a36b", size = 10305649 }, + { url = "https://files.pythonhosted.org/packages/8c/65/dab1ba90269bc8c81ce1d499a6517e28fe6f87b2119ec449257d0983cceb/ruff-0.12.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b3f75a19e03a4b0757d1412edb7f27cffb0c700365e9d6b60bc1b68d35bc89e0", size = 11120201 }, + { url = "https://files.pythonhosted.org/packages/3f/3e/2d819ffda01defe857fa2dd4cba4d19109713df4034cc36f06bbf582d62a/ruff-0.12.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9a256522893cb7e92bb1e1153283927f842dea2e48619c803243dccc8437b8be", size = 10466769 }, + { url = "https://files.pythonhosted.org/packages/63/37/bde4cf84dbd7821c8de56ec4ccc2816bce8125684f7b9e22fe4ad92364de/ruff-0.12.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:069052605fe74c765a5b4272eb89880e0ff7a31e6c0dbf8767203c1fbd31c7ff", size = 10660902 }, + { url = "https://files.pythonhosted.org/packages/0e/3a/390782a9ed1358c95e78ccc745eed1a9d657a537e5c4c4812fce06c8d1a0/ruff-0.12.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a684f125a4fec2d5a6501a466be3841113ba6847827be4573fddf8308b83477d", size = 10167002 }, + { url = "https://files.pythonhosted.org/packages/6d/05/f2d4c965009634830e97ffe733201ec59e4addc5b1c0efa035645baa9e5f/ruff-0.12.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdecdef753bf1e95797593007569d8e1697a54fca843d78f6862f7dc279e23bd", size = 11751522 }, + { url = "https://files.pythonhosted.org/packages/35/4e/4bfc519b5fcd462233f82fc20ef8b1e5ecce476c283b355af92c0935d5d9/ruff-0.12.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:70d52a058c0e7b88b602f575d23596e89bd7d8196437a4148381a3f73fcd5010", size = 12520264 }, + { url = "https://files.pythonhosted.org/packages/85/b2/7756a6925da236b3a31f234b4167397c3e5f91edb861028a631546bad719/ruff-0.12.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84d0a69d1e8d716dfeab22d8d5e7c786b73f2106429a933cee51d7b09f861d4e", size = 12133882 }, + { url = "https://files.pythonhosted.org/packages/dd/00/40da9c66d4a4d51291e619be6757fa65c91b92456ff4f01101593f3a1170/ruff-0.12.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6cc32e863adcf9e71690248607ccdf25252eeeab5193768e6873b901fd441fed", size = 11608941 }, + { url = "https://files.pythonhosted.org/packages/91/e7/f898391cc026a77fbe68dfea5940f8213622474cb848eb30215538a2dadf/ruff-0.12.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fd49a4619f90d5afc65cf42e07b6ae98bb454fd5029d03b306bd9e2273d44cc", size = 11602887 }, + { url = "https://files.pythonhosted.org/packages/f6/02/0891872fc6aab8678084f4cf8826f85c5d2d24aa9114092139a38123f94b/ruff-0.12.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ed5af6aaaea20710e77698e2055b9ff9b3494891e1b24d26c07055459bb717e9", size = 10521742 }, + { url = "https://files.pythonhosted.org/packages/2a/98/d6534322c74a7d47b0f33b036b2498ccac99d8d8c40edadb552c038cecf1/ruff-0.12.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:801d626de15e6bf988fbe7ce59b303a914ff9c616d5866f8c79eb5012720ae13", size = 10149909 }, + { url = "https://files.pythonhosted.org/packages/34/5c/9b7ba8c19a31e2b6bd5e31aa1e65b533208a30512f118805371dbbbdf6a9/ruff-0.12.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2be9d32a147f98a1972c1e4df9a6956d612ca5f5578536814372113d09a27a6c", size = 11136005 }, + { url = "https://files.pythonhosted.org/packages/dc/34/9bbefa4d0ff2c000e4e533f591499f6b834346025e11da97f4ded21cb23e/ruff-0.12.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:49b7ce354eed2a322fbaea80168c902de9504e6e174fd501e9447cad0232f9e6", size = 11648579 }, + { url = "https://files.pythonhosted.org/packages/6f/1c/20cdb593783f8f411839ce749ec9ae9e4298c2b2079b40295c3e6e2089e1/ruff-0.12.1-py3-none-win32.whl", hash = "sha256:d973fa626d4c8267848755bd0414211a456e99e125dcab147f24daa9e991a245", size = 10519495 }, + { url = "https://files.pythonhosted.org/packages/cf/56/7158bd8d3cf16394928f47c637d39a7d532268cd45220bdb6cd622985760/ruff-0.12.1-py3-none-win_amd64.whl", hash = "sha256:9e1123b1c033f77bd2590e4c1fe7e8ea72ef990a85d2484351d408224d603013", size = 11547485 }, + { url = "https://files.pythonhosted.org/packages/91/d0/6902c0d017259439d6fd2fd9393cea1cfe30169940118b007d5e0ea7e954/ruff-0.12.1-py3-none-win_arm64.whl", hash = "sha256:78ad09a022c64c13cc6077707f036bab0fac8cd7088772dcd1e5be21c5002efc", size = 10691209 }, ] [[package]] name = "s3fs" -version = "2024.12.0" +version = "2025.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiobotocore" }, { name = "aiohttp" }, { name = "fsspec" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/88/e2fc4fc2a618126ac3cea9b16a4abc5a37dff2522067c9730b5d72d67ac3/s3fs-2024.12.0.tar.gz", hash = "sha256:1b0f3a8f5946cca5ba29871d6792ab1e4528ed762327d8aefafc81b73b99fd56", size = 76578 } +sdist = { url = "https://files.pythonhosted.org/packages/7f/6f/d0ee452580d7d0643a1a776b95dfef2144023f3fc077038e07d651995d34/s3fs-2025.5.1.tar.gz", hash = "sha256:84beffa231b8ed94f8d667e93387b38351e1c4447aedea5c2c19dd88b7fcb658", size = 77276 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/af/eaec1466887348d7f6cc9d3a668b30b62a4629fb187d0268146118ba3d5e/s3fs-2024.12.0-py3-none-any.whl", hash = "sha256:d8665549f9d1de083151582437a2f10d5f3b3227c1f8e67a2b0b730db813e005", size = 30196 }, -] - -[[package]] -name = "safety" -version = "3.5.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "authlib" }, - { name = "click" }, - { name = "dparse" }, - { name = "filelock" }, - { name = "httpx" }, - { name = "jinja2" }, - { name = "marshmallow" }, - { name = "nltk" }, - { name = "packaging" }, - { name = "psutil" }, - { name = "pydantic" }, - { name = "requests" }, - { name = "ruamel-yaml" }, - { name = "safety-schemas" }, - { name = "setuptools" }, - { name = "tenacity" }, - { name = "tomlkit" }, - { name = "typer" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c2/31/e4875edebb8fd5885ff8e52d0522c44a4d9bc2abe26f11225b8e64b31868/safety-3.5.0.tar.gz", hash = "sha256:7223af388bde5323867eca5495f9817746289be9fd5b1896f168dc7082ea8ff1", size = 272371 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/02/e7ef5f2d3a206771e885c25376d4515da8d4adfdd59ed526e847ddeee245/safety-3.5.0-py3-none-any.whl", hash = "sha256:b002e863e6e6bf111a1aafdf60e3a0378f8bc66221a3628c2230c7f2617c522e", size = 270668 }, -] - -[[package]] -name = "safety-schemas" -version = "0.0.14" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "dparse" }, - { name = "packaging" }, - { name = "pydantic" }, - { name = "ruamel-yaml" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/04/40/e5107b3e456ca4b78d1c0d5bd07be3377e673cc54949b18e5f3aed345067/safety_schemas-0.0.14.tar.gz", hash = "sha256:49953f7a59e919572be25595a8946f9cbbcd2066fe3e160c9467d9d1d6d7af6a", size = 53216 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/7f/f3d1ac7eb0a6546eda3e82c0487233cea0774e511239769945dbd1dd01de/safety_schemas-0.0.14-py3-none-any.whl", hash = "sha256:0bf6fc4aa5e474651b714cc9e427c862792946bf052b61d5c7bec4eac4c0f254", size = 39268 }, + { url = "https://files.pythonhosted.org/packages/d5/c0/f5cc95ec88694429fcb841a37456be0a27463bc39d43edbd36e3164120ed/s3fs-2025.5.1-py3-none-any.whl", hash = "sha256:7475e7c40a3a112f17144907ffae50782ab6c03487fe0b45a9c3942bb7a5c606", size = 30476 }, ] [[package]] @@ -3425,14 +3244,15 @@ wheels = [ [[package]] name = "starlette" -version = "0.46.2" +version = "0.47.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/20/08dfcd9c983f6a6f4a1000d934b9e6d626cff8d2eeb77a89a68eef20a2b7/starlette-0.46.2.tar.gz", hash = "sha256:7f7361f34eed179294600af672f565727419830b54b7b084efe44bb82d2fccd5", size = 2580846 } +sdist = { url = "https://files.pythonhosted.org/packages/0a/69/662169fdb92fb96ec3eaee218cf540a629d629c86d7993d9651226a6789b/starlette-0.47.1.tar.gz", hash = "sha256:aef012dd2b6be325ffa16698f9dc533614fb1cebd593a906b90dc1025529a79b", size = 2583072 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/0c/9d30a4ebeb6db2b25a841afbb80f6ef9a854fc3b41be131d249a977b4959/starlette-0.46.2-py3-none-any.whl", hash = "sha256:595633ce89f8ffa71a015caed34a5b2dc1c0cdb3f0f1fbd1e69339cf2abeec35", size = 72037 }, + { url = "https://files.pythonhosted.org/packages/82/95/38ef0cd7fa11eaba6a99b3c4f5ac948d8bc6ff199aabd327a29cc000840c/starlette-0.47.1-py3-none-any.whl", hash = "sha256:5e11c9f5c7c3f24959edbf2dffdc01bba860228acf657129467d8a7468591527", size = 72747 }, ] [[package]] @@ -3453,15 +3273,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/27/44/aa5c8b10b2cce7a053018e0d132bd58e27527a0243c4985383d5b6fd93e9/tblib-3.1.0-py3-none-any.whl", hash = "sha256:670bb4582578134b3d81a84afa1b016128b429f3d48e6cbbaecc9d15675e984e", size = 12552 }, ] -[[package]] -name = "tenacity" -version = "9.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248 }, -] - [[package]] name = "tomli" version = "2.2.1" @@ -3501,15 +3312,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 }, ] -[[package]] -name = "tomlkit" -version = "0.13.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b1/09/a439bec5888f00a54b8b9f05fa94d7f901d6735ef4e55dcec9bc37b5d8fa/tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79", size = 192885 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/b6/a447b5e4ec71e13871be01ba81f5dfc9d0af7e473da256ff46bc0e24026f/tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde", size = 37955 }, -] - [[package]] name = "toolz" version = "1.0.0" @@ -3561,14 +3363,14 @@ wheels = [ [[package]] name = "typeguard" -version = "4.4.2" +version = "4.4.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/70/60/8cd6a3d78d00ceeb2193c02b7ed08f063d5341ccdfb24df88e61f383048e/typeguard-4.4.2.tar.gz", hash = "sha256:a6f1065813e32ef365bc3b3f503af8a96f9dd4e0033a02c28c4a4983de8c6c49", size = 75746 } +sdist = { url = "https://files.pythonhosted.org/packages/c7/68/71c1a15b5f65f40e91b65da23b8224dad41349894535a97f63a52e462196/typeguard-4.4.4.tar.gz", hash = "sha256:3a7fd2dffb705d4d0efaed4306a704c89b9dee850b688f060a8b1615a79e5f74", size = 75203 } wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/4b/9a77dc721aa0b7f74440a42e4ef6f9a4fae7324e17f64f88b96f4c25cc05/typeguard-4.4.2-py3-none-any.whl", hash = "sha256:77a78f11f09777aeae7fa08585f33b5f4ef0e7335af40005b0c422ed398ff48c", size = 35801 }, + { url = "https://files.pythonhosted.org/packages/1b/a9/e3aee762739c1d7528da1c3e06d518503f8b6c439c35549b53735ba52ead/typeguard-4.4.4-py3-none-any.whl", hash = "sha256:b5f562281b6bfa1f5492470464730ef001646128b180769880468bd84b68b09e", size = 34874 }, ] [[package]] @@ -3588,11 +3390,11 @@ wheels = [ [[package]] name = "typing-extensions" -version = "4.13.2" +version = "4.14.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/37/23083fcd6e35492953e8d2aaaa68b860eb422b34627b13f2ce3eb6106061/typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef", size = 106967 } +sdist = { url = "https://files.pythonhosted.org/packages/d1/bc/51647cd02527e87d05cb083ccc402f93e441606ff1f01739a62c8ad09ba5/typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4", size = 107423 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/54/b1ae86c0973cc6f0210b53d508ca3641fb6d0c56823f288d108bc7ab3cc8/typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", size = 45806 }, + { url = "https://files.pythonhosted.org/packages/69/e0/552843e0d356fbb5256d21449fa957fa4eff3bbc135a74a691ee70c7c5da/typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af", size = 43839 }, ] [[package]] @@ -3627,24 +3429,24 @@ wheels = [ [[package]] name = "urllib3" -version = "2.4.0" +version = "2.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/78/16493d9c386d8e60e442a35feac5e00f0913c0f4b7c217c11e8ec2ff53e0/urllib3-2.4.0.tar.gz", hash = "sha256:414bc6535b787febd7567804cc015fee39daab8ad86268f1310a9250697de466", size = 390672 } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/11/cc635220681e93a0183390e26485430ca2c7b5f9d33b15c74c2861cb8091/urllib3-2.4.0-py3-none-any.whl", hash = "sha256:4e16665048960a0900c702d4a66415956a584919c03361cac9f1df5c5dd7e813", size = 128680 }, + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795 }, ] [[package]] name = "uvicorn" -version = "0.34.2" +version = "0.35.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a6/ae/9bbb19b9e1c450cf9ecaef06463e40234d98d95bf572fab11b4f19ae5ded/uvicorn-0.34.2.tar.gz", hash = "sha256:0e929828f6186353a80b58ea719861d2629d766293b6d19baf086ba31d4f3328", size = 76815 } +sdist = { url = "https://files.pythonhosted.org/packages/5e/42/e0e305207bb88c6b8d3061399c6a961ffe5fbb7e2aa63c9234df7259e9cd/uvicorn-0.35.0.tar.gz", hash = "sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01", size = 78473 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/4b/4cef6ce21a2aaca9d852a6e84ef4f135d99fcd74fa75105e2fc0c8308acd/uvicorn-0.34.2-py3-none-any.whl", hash = "sha256:deb49af569084536d269fe0a6d67e3754f104cf03aba7c11c40f01aadf33c403", size = 62483 }, + { url = "https://files.pythonhosted.org/packages/d2/e2/dc81b1bd1dcfe91735810265e9d26bc8ec5da45b4c0f6237e286819194c3/uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a", size = 66406 }, ] [[package]] @@ -3672,51 +3474,66 @@ wheels = [ [[package]] name = "watchfiles" -version = "1.0.5" +version = "1.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/03/e2/8ed598c42057de7aa5d97c472254af4906ff0a59a66699d426fc9ef795d7/watchfiles-1.0.5.tar.gz", hash = "sha256:b7529b5dcc114679d43827d8c35a07c493ad6f083633d573d81c660abc5979e9", size = 94537 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/39/f4/41b591f59021786ef517e1cdc3b510383551846703e03f204827854a96f8/watchfiles-1.0.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:237f9be419e977a0f8f6b2e7b0475ababe78ff1ab06822df95d914a945eac827", size = 405336 }, - { url = "https://files.pythonhosted.org/packages/ae/06/93789c135be4d6d0e4f63e96eea56dc54050b243eacc28439a26482b5235/watchfiles-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0da39ff917af8b27a4bdc5a97ac577552a38aac0d260a859c1517ea3dc1a7c4", size = 395977 }, - { url = "https://files.pythonhosted.org/packages/d2/db/1cd89bd83728ca37054512d4d35ab69b5f12b8aa2ac9be3b0276b3bf06cc/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cfcb3952350e95603f232a7a15f6c5f86c5375e46f0bd4ae70d43e3e063c13d", size = 455232 }, - { url = "https://files.pythonhosted.org/packages/40/90/d8a4d44ffe960517e487c9c04f77b06b8abf05eb680bed71c82b5f2cad62/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:68b2dddba7a4e6151384e252a5632efcaa9bc5d1c4b567f3cb621306b2ca9f63", size = 459151 }, - { url = "https://files.pythonhosted.org/packages/6c/da/267a1546f26465dead1719caaba3ce660657f83c9d9c052ba98fb8856e13/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95cf944fcfc394c5f9de794ce581914900f82ff1f855326f25ebcf24d5397418", size = 489054 }, - { url = "https://files.pythonhosted.org/packages/b1/31/33850dfd5c6efb6f27d2465cc4c6b27c5a6f5ed53c6fa63b7263cf5f60f6/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ecf6cd9f83d7c023b1aba15d13f705ca7b7d38675c121f3cc4a6e25bd0857ee9", size = 523955 }, - { url = "https://files.pythonhosted.org/packages/09/84/b7d7b67856efb183a421f1416b44ca975cb2ea6c4544827955dfb01f7dc2/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:852de68acd6212cd6d33edf21e6f9e56e5d98c6add46f48244bd479d97c967c6", size = 502234 }, - { url = "https://files.pythonhosted.org/packages/71/87/6dc5ec6882a2254cfdd8b0718b684504e737273903b65d7338efaba08b52/watchfiles-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5730f3aa35e646103b53389d5bc77edfbf578ab6dab2e005142b5b80a35ef25", size = 454750 }, - { url = "https://files.pythonhosted.org/packages/3d/6c/3786c50213451a0ad15170d091570d4a6554976cf0df19878002fc96075a/watchfiles-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:18b3bd29954bc4abeeb4e9d9cf0b30227f0f206c86657674f544cb032296acd5", size = 631591 }, - { url = "https://files.pythonhosted.org/packages/1b/b3/1427425ade4e359a0deacce01a47a26024b2ccdb53098f9d64d497f6684c/watchfiles-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ba5552a1b07c8edbf197055bc9d518b8f0d98a1c6a73a293bc0726dce068ed01", size = 625370 }, - { url = "https://files.pythonhosted.org/packages/15/ba/f60e053b0b5b8145d682672024aa91370a29c5c921a88977eb565de34086/watchfiles-1.0.5-cp311-cp311-win32.whl", hash = "sha256:2f1fefb2e90e89959447bc0420fddd1e76f625784340d64a2f7d5983ef9ad246", size = 277791 }, - { url = "https://files.pythonhosted.org/packages/50/ed/7603c4e164225c12c0d4e8700b64bb00e01a6c4eeea372292a3856be33a4/watchfiles-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:b6e76ceb1dd18c8e29c73f47d41866972e891fc4cc7ba014f487def72c1cf096", size = 291622 }, - { url = "https://files.pythonhosted.org/packages/a2/c2/99bb7c96b4450e36877fde33690ded286ff555b5a5c1d925855d556968a1/watchfiles-1.0.5-cp311-cp311-win_arm64.whl", hash = "sha256:266710eb6fddc1f5e51843c70e3bebfb0f5e77cf4f27129278c70554104d19ed", size = 283699 }, - { url = "https://files.pythonhosted.org/packages/2a/8c/4f0b9bdb75a1bfbd9c78fad7d8854369283f74fe7cf03eb16be77054536d/watchfiles-1.0.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5eb568c2aa6018e26da9e6c86f3ec3fd958cee7f0311b35c2630fa4217d17f2", size = 401511 }, - { url = "https://files.pythonhosted.org/packages/dc/4e/7e15825def77f8bd359b6d3f379f0c9dac4eb09dd4ddd58fd7d14127179c/watchfiles-1.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0a04059f4923ce4e856b4b4e5e783a70f49d9663d22a4c3b3298165996d1377f", size = 392715 }, - { url = "https://files.pythonhosted.org/packages/58/65/b72fb817518728e08de5840d5d38571466c1b4a3f724d190cec909ee6f3f/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e380c89983ce6e6fe2dd1e1921b9952fb4e6da882931abd1824c092ed495dec", size = 454138 }, - { url = "https://files.pythonhosted.org/packages/3e/a4/86833fd2ea2e50ae28989f5950b5c3f91022d67092bfec08f8300d8b347b/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fe43139b2c0fdc4a14d4f8d5b5d967f7a2777fd3d38ecf5b1ec669b0d7e43c21", size = 458592 }, - { url = "https://files.pythonhosted.org/packages/38/7e/42cb8df8be9a37e50dd3a818816501cf7a20d635d76d6bd65aae3dbbff68/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee0822ce1b8a14fe5a066f93edd20aada932acfe348bede8aa2149f1a4489512", size = 487532 }, - { url = "https://files.pythonhosted.org/packages/fc/fd/13d26721c85d7f3df6169d8b495fcac8ab0dc8f0945ebea8845de4681dab/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a0dbcb1c2d8f2ab6e0a81c6699b236932bd264d4cef1ac475858d16c403de74d", size = 522865 }, - { url = "https://files.pythonhosted.org/packages/a1/0d/7f9ae243c04e96c5455d111e21b09087d0eeaf9a1369e13a01c7d3d82478/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a2014a2b18ad3ca53b1f6c23f8cd94a18ce930c1837bd891262c182640eb40a6", size = 499887 }, - { url = "https://files.pythonhosted.org/packages/8e/0f/a257766998e26aca4b3acf2ae97dff04b57071e991a510857d3799247c67/watchfiles-1.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f6ae86d5cb647bf58f9f655fcf577f713915a5d69057a0371bc257e2553234", size = 454498 }, - { url = "https://files.pythonhosted.org/packages/81/79/8bf142575a03e0af9c3d5f8bcae911ee6683ae93a625d349d4ecf4c8f7df/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1a7bac2bde1d661fb31f4d4e8e539e178774b76db3c2c17c4bb3e960a5de07a2", size = 630663 }, - { url = "https://files.pythonhosted.org/packages/f1/80/abe2e79f610e45c63a70d271caea90c49bbf93eb00fa947fa9b803a1d51f/watchfiles-1.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ab626da2fc1ac277bbf752446470b367f84b50295264d2d313e28dc4405d663", size = 625410 }, - { url = "https://files.pythonhosted.org/packages/91/6f/bc7fbecb84a41a9069c2c6eb6319f7f7df113adf113e358c57fc1aff7ff5/watchfiles-1.0.5-cp312-cp312-win32.whl", hash = "sha256:9f4571a783914feda92018ef3901dab8caf5b029325b5fe4558c074582815249", size = 277965 }, - { url = "https://files.pythonhosted.org/packages/99/a5/bf1c297ea6649ec59e935ab311f63d8af5faa8f0b86993e3282b984263e3/watchfiles-1.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:360a398c3a19672cf93527f7e8d8b60d8275119c5d900f2e184d32483117a705", size = 291693 }, - { url = "https://files.pythonhosted.org/packages/7f/7b/fd01087cc21db5c47e5beae507b87965db341cce8a86f9eb12bf5219d4e0/watchfiles-1.0.5-cp312-cp312-win_arm64.whl", hash = "sha256:1a2902ede862969077b97523987c38db28abbe09fb19866e711485d9fbf0d417", size = 283287 }, - { url = "https://files.pythonhosted.org/packages/c7/62/435766874b704f39b2fecd8395a29042db2b5ec4005bd34523415e9bd2e0/watchfiles-1.0.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:0b289572c33a0deae62daa57e44a25b99b783e5f7aed81b314232b3d3c81a11d", size = 401531 }, - { url = "https://files.pythonhosted.org/packages/6e/a6/e52a02c05411b9cb02823e6797ef9bbba0bfaf1bb627da1634d44d8af833/watchfiles-1.0.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a056c2f692d65bf1e99c41045e3bdcaea3cb9e6b5a53dcaf60a5f3bd95fc9763", size = 392417 }, - { url = "https://files.pythonhosted.org/packages/3f/53/c4af6819770455932144e0109d4854437769672d7ad897e76e8e1673435d/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9dca99744991fc9850d18015c4f0438865414e50069670f5f7eee08340d8b40", size = 453423 }, - { url = "https://files.pythonhosted.org/packages/cb/d1/8e88df58bbbf819b8bc5cfbacd3c79e01b40261cad0fc84d1e1ebd778a07/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:894342d61d355446d02cd3988a7326af344143eb33a2fd5d38482a92072d9563", size = 458185 }, - { url = "https://files.pythonhosted.org/packages/ff/70/fffaa11962dd5429e47e478a18736d4e42bec42404f5ee3b92ef1b87ad60/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab44e1580924d1ffd7b3938e02716d5ad190441965138b4aa1d1f31ea0877f04", size = 486696 }, - { url = "https://files.pythonhosted.org/packages/39/db/723c0328e8b3692d53eb273797d9a08be6ffb1d16f1c0ba2bdbdc2a3852c/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6f9367b132078b2ceb8d066ff6c93a970a18c3029cea37bfd7b2d3dd2e5db8f", size = 522327 }, - { url = "https://files.pythonhosted.org/packages/cd/05/9fccc43c50c39a76b68343484b9da7b12d42d0859c37c61aec018c967a32/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2e55a9b162e06e3f862fb61e399fe9f05d908d019d87bf5b496a04ef18a970a", size = 499741 }, - { url = "https://files.pythonhosted.org/packages/23/14/499e90c37fa518976782b10a18b18db9f55ea73ca14641615056f8194bb3/watchfiles-1.0.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0125f91f70e0732a9f8ee01e49515c35d38ba48db507a50c5bdcad9503af5827", size = 453995 }, - { url = "https://files.pythonhosted.org/packages/61/d9/f75d6840059320df5adecd2c687fbc18960a7f97b55c300d20f207d48aef/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:13bb21f8ba3248386337c9fa51c528868e6c34a707f729ab041c846d52a0c69a", size = 629693 }, - { url = "https://files.pythonhosted.org/packages/fc/17/180ca383f5061b61406477218c55d66ec118e6c0c51f02d8142895fcf0a9/watchfiles-1.0.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:839ebd0df4a18c5b3c1b890145b5a3f5f64063c2a0d02b13c76d78fe5de34936", size = 624677 }, - { url = "https://files.pythonhosted.org/packages/bf/15/714d6ef307f803f236d69ee9d421763707899d6298d9f3183e55e366d9af/watchfiles-1.0.5-cp313-cp313-win32.whl", hash = "sha256:4a8ec1e4e16e2d5bafc9ba82f7aaecfeec990ca7cd27e84fb6f191804ed2fcfc", size = 277804 }, - { url = "https://files.pythonhosted.org/packages/a8/b4/c57b99518fadf431f3ef47a610839e46e5f8abf9814f969859d1c65c02c7/watchfiles-1.0.5-cp313-cp313-win_amd64.whl", hash = "sha256:f436601594f15bf406518af922a89dcaab416568edb6f65c4e5bbbad1ea45c11", size = 291087 }, +sdist = { url = "https://files.pythonhosted.org/packages/2a/9a/d451fcc97d029f5812e898fd30a53fd8c15c7bbd058fd75cfc6beb9bd761/watchfiles-1.1.0.tar.gz", hash = "sha256:693ed7ec72cbfcee399e92c895362b6e66d63dac6b91e2c11ae03d10d503e575", size = 94406 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/78/7401154b78ab484ccaaeef970dc2af0cb88b5ba8a1b415383da444cdd8d3/watchfiles-1.1.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c9649dfc57cc1f9835551deb17689e8d44666315f2e82d337b9f07bd76ae3aa2", size = 405751 }, + { url = "https://files.pythonhosted.org/packages/76/63/e6c3dbc1f78d001589b75e56a288c47723de28c580ad715eb116639152b5/watchfiles-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:406520216186b99374cdb58bc48e34bb74535adec160c8459894884c983a149c", size = 397313 }, + { url = "https://files.pythonhosted.org/packages/6c/a2/8afa359ff52e99af1632f90cbf359da46184207e893a5f179301b0c8d6df/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb45350fd1dc75cd68d3d72c47f5b513cb0578da716df5fba02fff31c69d5f2d", size = 450792 }, + { url = "https://files.pythonhosted.org/packages/1d/bf/7446b401667f5c64972a57a0233be1104157fc3abf72c4ef2666c1bd09b2/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:11ee4444250fcbeb47459a877e5e80ed994ce8e8d20283857fc128be1715dac7", size = 458196 }, + { url = "https://files.pythonhosted.org/packages/58/2f/501ddbdfa3fa874ea5597c77eeea3d413579c29af26c1091b08d0c792280/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bda8136e6a80bdea23e5e74e09df0362744d24ffb8cd59c4a95a6ce3d142f79c", size = 484788 }, + { url = "https://files.pythonhosted.org/packages/61/1e/9c18eb2eb5c953c96bc0e5f626f0e53cfef4bd19bd50d71d1a049c63a575/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b915daeb2d8c1f5cee4b970f2e2c988ce6514aace3c9296e58dd64dc9aa5d575", size = 597879 }, + { url = "https://files.pythonhosted.org/packages/8b/6c/1467402e5185d89388b4486745af1e0325007af0017c3384cc786fff0542/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed8fc66786de8d0376f9f913c09e963c66e90ced9aa11997f93bdb30f7c872a8", size = 477447 }, + { url = "https://files.pythonhosted.org/packages/2b/a1/ec0a606bde4853d6c4a578f9391eeb3684a9aea736a8eb217e3e00aa89a1/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe4371595edf78c41ef8ac8df20df3943e13defd0efcb732b2e393b5a8a7a71f", size = 453145 }, + { url = "https://files.pythonhosted.org/packages/90/b9/ef6f0c247a6a35d689fc970dc7f6734f9257451aefb30def5d100d6246a5/watchfiles-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b7c5f6fe273291f4d414d55b2c80d33c457b8a42677ad14b4b47ff025d0893e4", size = 626539 }, + { url = "https://files.pythonhosted.org/packages/34/44/6ffda5537085106ff5aaa762b0d130ac6c75a08015dd1621376f708c94de/watchfiles-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7738027989881e70e3723c75921f1efa45225084228788fc59ea8c6d732eb30d", size = 624472 }, + { url = "https://files.pythonhosted.org/packages/c3/e3/71170985c48028fa3f0a50946916a14055e741db11c2e7bc2f3b61f4d0e3/watchfiles-1.1.0-cp311-cp311-win32.whl", hash = "sha256:622d6b2c06be19f6e89b1d951485a232e3b59618def88dbeda575ed8f0d8dbf2", size = 279348 }, + { url = "https://files.pythonhosted.org/packages/89/1b/3e39c68b68a7a171070f81fc2561d23ce8d6859659406842a0e4bebf3bba/watchfiles-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:48aa25e5992b61debc908a61ab4d3f216b64f44fdaa71eb082d8b2de846b7d12", size = 292607 }, + { url = "https://files.pythonhosted.org/packages/61/9f/2973b7539f2bdb6ea86d2c87f70f615a71a1fc2dba2911795cea25968aea/watchfiles-1.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:00645eb79a3faa70d9cb15c8d4187bb72970b2470e938670240c7998dad9f13a", size = 285056 }, + { url = "https://files.pythonhosted.org/packages/f6/b8/858957045a38a4079203a33aaa7d23ea9269ca7761c8a074af3524fbb240/watchfiles-1.1.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9dc001c3e10de4725c749d4c2f2bdc6ae24de5a88a339c4bce32300a31ede179", size = 402339 }, + { url = "https://files.pythonhosted.org/packages/80/28/98b222cca751ba68e88521fabd79a4fab64005fc5976ea49b53fa205d1fa/watchfiles-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d9ba68ec283153dead62cbe81872d28e053745f12335d037de9cbd14bd1877f5", size = 394409 }, + { url = "https://files.pythonhosted.org/packages/86/50/dee79968566c03190677c26f7f47960aff738d32087087bdf63a5473e7df/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130fc497b8ee68dce163e4254d9b0356411d1490e868bd8790028bc46c5cc297", size = 450939 }, + { url = "https://files.pythonhosted.org/packages/40/45/a7b56fb129700f3cfe2594a01aa38d033b92a33dddce86c8dfdfc1247b72/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:50a51a90610d0845a5931a780d8e51d7bd7f309ebc25132ba975aca016b576a0", size = 457270 }, + { url = "https://files.pythonhosted.org/packages/b5/c8/fa5ef9476b1d02dc6b5e258f515fcaaecf559037edf8b6feffcbc097c4b8/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc44678a72ac0910bac46fa6a0de6af9ba1355669b3dfaf1ce5f05ca7a74364e", size = 483370 }, + { url = "https://files.pythonhosted.org/packages/98/68/42cfcdd6533ec94f0a7aab83f759ec11280f70b11bfba0b0f885e298f9bd/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a543492513a93b001975ae283a51f4b67973662a375a403ae82f420d2c7205ee", size = 598654 }, + { url = "https://files.pythonhosted.org/packages/d3/74/b2a1544224118cc28df7e59008a929e711f9c68ce7d554e171b2dc531352/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ac164e20d17cc285f2b94dc31c384bc3aa3dd5e7490473b3db043dd70fbccfd", size = 478667 }, + { url = "https://files.pythonhosted.org/packages/8c/77/e3362fe308358dc9f8588102481e599c83e1b91c2ae843780a7ded939a35/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7590d5a455321e53857892ab8879dce62d1f4b04748769f5adf2e707afb9d4f", size = 452213 }, + { url = "https://files.pythonhosted.org/packages/6e/17/c8f1a36540c9a1558d4faf08e909399e8133599fa359bf52ec8fcee5be6f/watchfiles-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:37d3d3f7defb13f62ece99e9be912afe9dd8a0077b7c45ee5a57c74811d581a4", size = 626718 }, + { url = "https://files.pythonhosted.org/packages/26/45/fb599be38b4bd38032643783d7496a26a6f9ae05dea1a42e58229a20ac13/watchfiles-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7080c4bb3efd70a07b1cc2df99a7aa51d98685be56be6038c3169199d0a1c69f", size = 623098 }, + { url = "https://files.pythonhosted.org/packages/a1/e7/fdf40e038475498e160cd167333c946e45d8563ae4dd65caf757e9ffe6b4/watchfiles-1.1.0-cp312-cp312-win32.whl", hash = "sha256:cbcf8630ef4afb05dc30107bfa17f16c0896bb30ee48fc24bf64c1f970f3b1fd", size = 279209 }, + { url = "https://files.pythonhosted.org/packages/3f/d3/3ae9d5124ec75143bdf088d436cba39812122edc47709cd2caafeac3266f/watchfiles-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:cbd949bdd87567b0ad183d7676feb98136cde5bb9025403794a4c0db28ed3a47", size = 292786 }, + { url = "https://files.pythonhosted.org/packages/26/2f/7dd4fc8b5f2b34b545e19629b4a018bfb1de23b3a496766a2c1165ca890d/watchfiles-1.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:0a7d40b77f07be87c6faa93d0951a0fcd8cbca1ddff60a1b65d741bac6f3a9f6", size = 284343 }, + { url = "https://files.pythonhosted.org/packages/d3/42/fae874df96595556a9089ade83be34a2e04f0f11eb53a8dbf8a8a5e562b4/watchfiles-1.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5007f860c7f1f8df471e4e04aaa8c43673429047d63205d1630880f7637bca30", size = 402004 }, + { url = "https://files.pythonhosted.org/packages/fa/55/a77e533e59c3003d9803c09c44c3651224067cbe7fb5d574ddbaa31e11ca/watchfiles-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:20ecc8abbd957046f1fe9562757903f5eaf57c3bce70929fda6c7711bb58074a", size = 393671 }, + { url = "https://files.pythonhosted.org/packages/05/68/b0afb3f79c8e832e6571022611adbdc36e35a44e14f129ba09709aa4bb7a/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2f0498b7d2a3c072766dba3274fe22a183dbea1f99d188f1c6c72209a1063dc", size = 449772 }, + { url = "https://files.pythonhosted.org/packages/ff/05/46dd1f6879bc40e1e74c6c39a1b9ab9e790bf1f5a2fe6c08b463d9a807f4/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:239736577e848678e13b201bba14e89718f5c2133dfd6b1f7846fa1b58a8532b", size = 456789 }, + { url = "https://files.pythonhosted.org/packages/8b/ca/0eeb2c06227ca7f12e50a47a3679df0cd1ba487ea19cf844a905920f8e95/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eff4b8d89f444f7e49136dc695599a591ff769300734446c0a86cba2eb2f9895", size = 482551 }, + { url = "https://files.pythonhosted.org/packages/31/47/2cecbd8694095647406645f822781008cc524320466ea393f55fe70eed3b/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12b0a02a91762c08f7264e2e79542f76870c3040bbc847fb67410ab81474932a", size = 597420 }, + { url = "https://files.pythonhosted.org/packages/d9/7e/82abc4240e0806846548559d70f0b1a6dfdca75c1b4f9fa62b504ae9b083/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29e7bc2eee15cbb339c68445959108803dc14ee0c7b4eea556400131a8de462b", size = 477950 }, + { url = "https://files.pythonhosted.org/packages/25/0d/4d564798a49bf5482a4fa9416dea6b6c0733a3b5700cb8a5a503c4b15853/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9481174d3ed982e269c090f780122fb59cee6c3796f74efe74e70f7780ed94c", size = 451706 }, + { url = "https://files.pythonhosted.org/packages/81/b5/5516cf46b033192d544102ea07c65b6f770f10ed1d0a6d388f5d3874f6e4/watchfiles-1.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:80f811146831c8c86ab17b640801c25dc0a88c630e855e2bef3568f30434d52b", size = 625814 }, + { url = "https://files.pythonhosted.org/packages/0c/dd/7c1331f902f30669ac3e754680b6edb9a0dd06dea5438e61128111fadd2c/watchfiles-1.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:60022527e71d1d1fda67a33150ee42869042bce3d0fcc9cc49be009a9cded3fb", size = 622820 }, + { url = "https://files.pythonhosted.org/packages/1b/14/36d7a8e27cd128d7b1009e7715a7c02f6c131be9d4ce1e5c3b73d0e342d8/watchfiles-1.1.0-cp313-cp313-win32.whl", hash = "sha256:32d6d4e583593cb8576e129879ea0991660b935177c0f93c6681359b3654bfa9", size = 279194 }, + { url = "https://files.pythonhosted.org/packages/25/41/2dd88054b849aa546dbeef5696019c58f8e0774f4d1c42123273304cdb2e/watchfiles-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:f21af781a4a6fbad54f03c598ab620e3a77032c5878f3d780448421a6e1818c7", size = 292349 }, + { url = "https://files.pythonhosted.org/packages/c8/cf/421d659de88285eb13941cf11a81f875c176f76a6d99342599be88e08d03/watchfiles-1.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:5366164391873ed76bfdf618818c82084c9db7fac82b64a20c44d335eec9ced5", size = 283836 }, + { url = "https://files.pythonhosted.org/packages/45/10/6faf6858d527e3599cc50ec9fcae73590fbddc1420bd4fdccfebffeedbc6/watchfiles-1.1.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:17ab167cca6339c2b830b744eaf10803d2a5b6683be4d79d8475d88b4a8a4be1", size = 400343 }, + { url = "https://files.pythonhosted.org/packages/03/20/5cb7d3966f5e8c718006d0e97dfe379a82f16fecd3caa7810f634412047a/watchfiles-1.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:328dbc9bff7205c215a7807da7c18dce37da7da718e798356212d22696404339", size = 392916 }, + { url = "https://files.pythonhosted.org/packages/8c/07/d8f1176328fa9e9581b6f120b017e286d2a2d22ae3f554efd9515c8e1b49/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7208ab6e009c627b7557ce55c465c98967e8caa8b11833531fdf95799372633", size = 449582 }, + { url = "https://files.pythonhosted.org/packages/66/e8/80a14a453cf6038e81d072a86c05276692a1826471fef91df7537dba8b46/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a8f6f72974a19efead54195bc9bed4d850fc047bb7aa971268fd9a8387c89011", size = 456752 }, + { url = "https://files.pythonhosted.org/packages/5a/25/0853b3fe0e3c2f5af9ea60eb2e781eade939760239a72c2d38fc4cc335f6/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d181ef50923c29cf0450c3cd47e2f0557b62218c50b2ab8ce2ecaa02bd97e670", size = 481436 }, + { url = "https://files.pythonhosted.org/packages/fe/9e/4af0056c258b861fbb29dcb36258de1e2b857be4a9509e6298abcf31e5c9/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adb4167043d3a78280d5d05ce0ba22055c266cf8655ce942f2fb881262ff3cdf", size = 596016 }, + { url = "https://files.pythonhosted.org/packages/c5/fa/95d604b58aa375e781daf350897aaaa089cff59d84147e9ccff2447c8294/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5701dc474b041e2934a26d31d39f90fac8a3dee2322b39f7729867f932b1d4", size = 476727 }, + { url = "https://files.pythonhosted.org/packages/65/95/fe479b2664f19be4cf5ceeb21be05afd491d95f142e72d26a42f41b7c4f8/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b067915e3c3936966a8607f6fe5487df0c9c4afb85226613b520890049deea20", size = 451864 }, + { url = "https://files.pythonhosted.org/packages/d3/8a/3c4af14b93a15ce55901cd7a92e1a4701910f1768c78fb30f61d2b79785b/watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:9c733cda03b6d636b4219625a4acb5c6ffb10803338e437fb614fef9516825ef", size = 625626 }, + { url = "https://files.pythonhosted.org/packages/da/f5/cf6aa047d4d9e128f4b7cde615236a915673775ef171ff85971d698f3c2c/watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:cc08ef8b90d78bfac66f0def80240b0197008e4852c9f285907377b2947ffdcb", size = 622744 }, + { url = "https://files.pythonhosted.org/packages/8c/6b/686dcf5d3525ad17b384fd94708e95193529b460a1b7bf40851f1328ec6e/watchfiles-1.1.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0ece16b563b17ab26eaa2d52230c9a7ae46cf01759621f4fbbca280e438267b3", size = 406910 }, + { url = "https://files.pythonhosted.org/packages/f3/d3/71c2dcf81dc1edcf8af9f4d8d63b1316fb0a2dd90cbfd427e8d9dd584a90/watchfiles-1.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:51b81e55d40c4b4aa8658427a3ee7ea847c591ae9e8b81ef94a90b668999353c", size = 398816 }, + { url = "https://files.pythonhosted.org/packages/b8/fa/12269467b2fc006f8fce4cd6c3acfa77491dd0777d2a747415f28ccc8c60/watchfiles-1.1.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2bcdc54ea267fe72bfc7d83c041e4eb58d7d8dc6f578dfddb52f037ce62f432", size = 451584 }, + { url = "https://files.pythonhosted.org/packages/bd/d3/254cea30f918f489db09d6a8435a7de7047f8cb68584477a515f160541d6/watchfiles-1.1.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:923fec6e5461c42bd7e3fd5ec37492c6f3468be0499bc0707b4bbbc16ac21792", size = 454009 }, ] [[package]] @@ -3825,16 +3642,16 @@ wheels = [ [[package]] name = "xarray" -version = "2025.4.0" +version = "2025.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, { name = "packaging" }, { name = "pandas" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9b/29/37761364e137db13898cf5a790574dd7883f7355d5dfb42b66ee7a9a6318/xarray-2025.4.0.tar.gz", hash = "sha256:2a89cd6a1dfd589aa90ac45f4e483246f31fc641836db45dd2790bb78bd333dc", size = 2974151 } +sdist = { url = "https://files.pythonhosted.org/packages/19/ec/e50d833518f10b0c24feb184b209bb6856f25b919ba8c1f89678b930b1cd/xarray-2025.6.1.tar.gz", hash = "sha256:a84f3f07544634a130d7dc615ae44175419f4c77957a7255161ed99c69c7c8b0", size = 3003185 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a4/1e/96fd96419fec1a37da998a1ca3d558f2cae2f6f3cd5015170371b05a2b6b/xarray-2025.4.0-py3-none-any.whl", hash = "sha256:b27defd082c5cb85d32c695708de6bb05c2838fb7caaf3f952982e602a35b9b8", size = 1290171 }, + { url = "https://files.pythonhosted.org/packages/82/8a/6b50c1dd2260d407c1a499d47cf829f59f07007e0dcebafdabb24d1d26a5/xarray-2025.6.1-py3-none-any.whl", hash = "sha256:8b988b47f67a383bdc3b04c5db475cd165e580134c1f1943d52aee4a9c97651b", size = 1314739 }, ] [[package]] @@ -3863,84 +3680,84 @@ wheels = [ [[package]] name = "yarl" -version = "1.20.0" +version = "1.20.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/62/51/c0edba5219027f6eab262e139f73e2417b0f4efffa23bf562f6e18f76ca5/yarl-1.20.0.tar.gz", hash = "sha256:686d51e51ee5dfe62dec86e4866ee0e9ed66df700d55c828a615640adc885307", size = 185258 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/60/82/a59d8e21b20ffc836775fa7daedac51d16bb8f3010c4fcb495c4496aa922/yarl-1.20.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fdb5204d17cb32b2de2d1e21c7461cabfacf17f3645e4b9039f210c5d3378bf3", size = 145178 }, - { url = "https://files.pythonhosted.org/packages/ba/81/315a3f6f95947cfbf37c92d6fbce42a1a6207b6c38e8c2b452499ec7d449/yarl-1.20.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eaddd7804d8e77d67c28d154ae5fab203163bd0998769569861258e525039d2a", size = 96859 }, - { url = "https://files.pythonhosted.org/packages/ad/17/9b64e575583158551b72272a1023cdbd65af54fe13421d856b2850a6ddb7/yarl-1.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:634b7ba6b4a85cf67e9df7c13a7fb2e44fa37b5d34501038d174a63eaac25ee2", size = 94647 }, - { url = "https://files.pythonhosted.org/packages/2c/29/8f291e7922a58a21349683f6120a85701aeefaa02e9f7c8a2dc24fe3f431/yarl-1.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d409e321e4addf7d97ee84162538c7258e53792eb7c6defd0c33647d754172e", size = 355788 }, - { url = "https://files.pythonhosted.org/packages/26/6d/b4892c80b805c42c228c6d11e03cafabf81662d371b0853e7f0f513837d5/yarl-1.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ea52f7328a36960ba3231c6677380fa67811b414798a6e071c7085c57b6d20a9", size = 344613 }, - { url = "https://files.pythonhosted.org/packages/d7/0e/517aa28d3f848589bae9593717b063a544b86ba0a807d943c70f48fcf3bb/yarl-1.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8703517b924463994c344dcdf99a2d5ce9eca2b6882bb640aa555fb5efc706a", size = 370953 }, - { url = "https://files.pythonhosted.org/packages/5f/9b/5bd09d2f1ad6e6f7c2beae9e50db78edd2cca4d194d227b958955573e240/yarl-1.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:077989b09ffd2f48fb2d8f6a86c5fef02f63ffe6b1dd4824c76de7bb01e4f2e2", size = 369204 }, - { url = "https://files.pythonhosted.org/packages/9c/85/d793a703cf4bd0d4cd04e4b13cc3d44149470f790230430331a0c1f52df5/yarl-1.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0acfaf1da020253f3533526e8b7dd212838fdc4109959a2c53cafc6db611bff2", size = 358108 }, - { url = "https://files.pythonhosted.org/packages/6f/54/b6c71e13549c1f6048fbc14ce8d930ac5fb8bafe4f1a252e621a24f3f1f9/yarl-1.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4230ac0b97ec5eeb91d96b324d66060a43fd0d2a9b603e3327ed65f084e41f8", size = 346610 }, - { url = "https://files.pythonhosted.org/packages/a0/1a/d6087d58bdd0d8a2a37bbcdffac9d9721af6ebe50d85304d9f9b57dfd862/yarl-1.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a6a1e6ae21cdd84011c24c78d7a126425148b24d437b5702328e4ba640a8902", size = 365378 }, - { url = "https://files.pythonhosted.org/packages/02/84/e25ddff4cbc001dbc4af76f8d41a3e23818212dd1f0a52044cbc60568872/yarl-1.20.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:86de313371ec04dd2531f30bc41a5a1a96f25a02823558ee0f2af0beaa7ca791", size = 356919 }, - { url = "https://files.pythonhosted.org/packages/04/76/898ae362353bf8f64636495d222c8014c8e5267df39b1a9fe1e1572fb7d0/yarl-1.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dd59c9dd58ae16eaa0f48c3d0cbe6be8ab4dc7247c3ff7db678edecbaf59327f", size = 364248 }, - { url = "https://files.pythonhosted.org/packages/1b/b0/9d9198d83a622f1c40fdbf7bd13b224a6979f2e1fc2cf50bfb1d8773c495/yarl-1.20.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a0bc5e05f457b7c1994cc29e83b58f540b76234ba6b9648a4971ddc7f6aa52da", size = 378418 }, - { url = "https://files.pythonhosted.org/packages/c7/ce/1f50c1cc594cf5d3f5bf4a9b616fca68680deaec8ad349d928445ac52eb8/yarl-1.20.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c9471ca18e6aeb0e03276b5e9b27b14a54c052d370a9c0c04a68cefbd1455eb4", size = 383850 }, - { url = "https://files.pythonhosted.org/packages/89/1e/a59253a87b35bfec1a25bb5801fb69943330b67cfd266278eb07e0609012/yarl-1.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:40ed574b4df723583a26c04b298b283ff171bcc387bc34c2683235e2487a65a5", size = 381218 }, - { url = "https://files.pythonhosted.org/packages/85/b0/26f87df2b3044b0ef1a7cf66d321102bdca091db64c5ae853fcb2171c031/yarl-1.20.0-cp311-cp311-win32.whl", hash = "sha256:db243357c6c2bf3cd7e17080034ade668d54ce304d820c2a58514a4e51d0cfd6", size = 86606 }, - { url = "https://files.pythonhosted.org/packages/33/46/ca335c2e1f90446a77640a45eeb1cd8f6934f2c6e4df7db0f0f36ef9f025/yarl-1.20.0-cp311-cp311-win_amd64.whl", hash = "sha256:8c12cd754d9dbd14204c328915e23b0c361b88f3cffd124129955e60a4fbfcfb", size = 93374 }, - { url = "https://files.pythonhosted.org/packages/c3/e8/3efdcb83073df978bb5b1a9cc0360ce596680e6c3fac01f2a994ccbb8939/yarl-1.20.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e06b9f6cdd772f9b665e5ba8161968e11e403774114420737f7884b5bd7bdf6f", size = 147089 }, - { url = "https://files.pythonhosted.org/packages/60/c3/9e776e98ea350f76f94dd80b408eaa54e5092643dbf65fd9babcffb60509/yarl-1.20.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b9ae2fbe54d859b3ade40290f60fe40e7f969d83d482e84d2c31b9bff03e359e", size = 97706 }, - { url = "https://files.pythonhosted.org/packages/0c/5b/45cdfb64a3b855ce074ae607b9fc40bc82e7613b94e7612b030255c93a09/yarl-1.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d12b8945250d80c67688602c891237994d203d42427cb14e36d1a732eda480e", size = 95719 }, - { url = "https://files.pythonhosted.org/packages/2d/4e/929633b249611eeed04e2f861a14ed001acca3ef9ec2a984a757b1515889/yarl-1.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:087e9731884621b162a3e06dc0d2d626e1542a617f65ba7cc7aeab279d55ad33", size = 343972 }, - { url = "https://files.pythonhosted.org/packages/49/fd/047535d326c913f1a90407a3baf7ff535b10098611eaef2c527e32e81ca1/yarl-1.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:69df35468b66c1a6e6556248e6443ef0ec5f11a7a4428cf1f6281f1879220f58", size = 339639 }, - { url = "https://files.pythonhosted.org/packages/48/2f/11566f1176a78f4bafb0937c0072410b1b0d3640b297944a6a7a556e1d0b/yarl-1.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b2992fe29002fd0d4cbaea9428b09af9b8686a9024c840b8a2b8f4ea4abc16f", size = 353745 }, - { url = "https://files.pythonhosted.org/packages/26/17/07dfcf034d6ae8837b33988be66045dd52f878dfb1c4e8f80a7343f677be/yarl-1.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c903e0b42aab48abfbac668b5a9d7b6938e721a6341751331bcd7553de2dcae", size = 354178 }, - { url = "https://files.pythonhosted.org/packages/15/45/212604d3142d84b4065d5f8cab6582ed3d78e4cc250568ef2a36fe1cf0a5/yarl-1.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf099e2432131093cc611623e0b0bcc399b8cddd9a91eded8bfb50402ec35018", size = 349219 }, - { url = "https://files.pythonhosted.org/packages/e6/e0/a10b30f294111c5f1c682461e9459935c17d467a760c21e1f7db400ff499/yarl-1.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a7f62f5dc70a6c763bec9ebf922be52aa22863d9496a9a30124d65b489ea672", size = 337266 }, - { url = "https://files.pythonhosted.org/packages/33/a6/6efa1d85a675d25a46a167f9f3e80104cde317dfdf7f53f112ae6b16a60a/yarl-1.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:54ac15a8b60382b2bcefd9a289ee26dc0920cf59b05368c9b2b72450751c6eb8", size = 360873 }, - { url = "https://files.pythonhosted.org/packages/77/67/c8ab718cb98dfa2ae9ba0f97bf3cbb7d45d37f13fe1fbad25ac92940954e/yarl-1.20.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:25b3bc0763a7aca16a0f1b5e8ef0f23829df11fb539a1b70476dcab28bd83da7", size = 360524 }, - { url = "https://files.pythonhosted.org/packages/bd/e8/c3f18660cea1bc73d9f8a2b3ef423def8dadbbae6c4afabdb920b73e0ead/yarl-1.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b2586e36dc070fc8fad6270f93242124df68b379c3a251af534030a4a33ef594", size = 365370 }, - { url = "https://files.pythonhosted.org/packages/c9/99/33f3b97b065e62ff2d52817155a89cfa030a1a9b43fee7843ef560ad9603/yarl-1.20.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:866349da9d8c5290cfefb7fcc47721e94de3f315433613e01b435473be63daa6", size = 373297 }, - { url = "https://files.pythonhosted.org/packages/3d/89/7519e79e264a5f08653d2446b26d4724b01198a93a74d2e259291d538ab1/yarl-1.20.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:33bb660b390a0554d41f8ebec5cd4475502d84104b27e9b42f5321c5192bfcd1", size = 378771 }, - { url = "https://files.pythonhosted.org/packages/3a/58/6c460bbb884abd2917c3eef6f663a4a873f8dc6f498561fc0ad92231c113/yarl-1.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:737e9f171e5a07031cbee5e9180f6ce21a6c599b9d4b2c24d35df20a52fabf4b", size = 375000 }, - { url = "https://files.pythonhosted.org/packages/3b/2a/dd7ed1aa23fea996834278d7ff178f215b24324ee527df53d45e34d21d28/yarl-1.20.0-cp312-cp312-win32.whl", hash = "sha256:839de4c574169b6598d47ad61534e6981979ca2c820ccb77bf70f4311dd2cc64", size = 86355 }, - { url = "https://files.pythonhosted.org/packages/ca/c6/333fe0338305c0ac1c16d5aa7cc4841208d3252bbe62172e0051006b5445/yarl-1.20.0-cp312-cp312-win_amd64.whl", hash = "sha256:3d7dbbe44b443b0c4aa0971cb07dcb2c2060e4a9bf8d1301140a33a93c98e18c", size = 92904 }, - { url = "https://files.pythonhosted.org/packages/0f/6f/514c9bff2900c22a4f10e06297714dbaf98707143b37ff0bcba65a956221/yarl-1.20.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2137810a20b933b1b1b7e5cf06a64c3ed3b4747b0e5d79c9447c00db0e2f752f", size = 145030 }, - { url = "https://files.pythonhosted.org/packages/4e/9d/f88da3fa319b8c9c813389bfb3463e8d777c62654c7168e580a13fadff05/yarl-1.20.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:447c5eadd750db8389804030d15f43d30435ed47af1313303ed82a62388176d3", size = 96894 }, - { url = "https://files.pythonhosted.org/packages/cd/57/92e83538580a6968b2451d6c89c5579938a7309d4785748e8ad42ddafdce/yarl-1.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42fbe577272c203528d402eec8bf4b2d14fd49ecfec92272334270b850e9cd7d", size = 94457 }, - { url = "https://files.pythonhosted.org/packages/e9/ee/7ee43bd4cf82dddd5da97fcaddb6fa541ab81f3ed564c42f146c83ae17ce/yarl-1.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18e321617de4ab170226cd15006a565d0fa0d908f11f724a2c9142d6b2812ab0", size = 343070 }, - { url = "https://files.pythonhosted.org/packages/4a/12/b5eccd1109e2097bcc494ba7dc5de156e41cf8309fab437ebb7c2b296ce3/yarl-1.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4345f58719825bba29895011e8e3b545e6e00257abb984f9f27fe923afca2501", size = 337739 }, - { url = "https://files.pythonhosted.org/packages/7d/6b/0eade8e49af9fc2585552f63c76fa59ef469c724cc05b29519b19aa3a6d5/yarl-1.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d9b980d7234614bc4674468ab173ed77d678349c860c3af83b1fffb6a837ddc", size = 351338 }, - { url = "https://files.pythonhosted.org/packages/45/cb/aaaa75d30087b5183c7b8a07b4fb16ae0682dd149a1719b3a28f54061754/yarl-1.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af4baa8a445977831cbaa91a9a84cc09debb10bc8391f128da2f7bd070fc351d", size = 353636 }, - { url = "https://files.pythonhosted.org/packages/98/9d/d9cb39ec68a91ba6e66fa86d97003f58570327d6713833edf7ad6ce9dde5/yarl-1.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123393db7420e71d6ce40d24885a9e65eb1edefc7a5228db2d62bcab3386a5c0", size = 348061 }, - { url = "https://files.pythonhosted.org/packages/72/6b/103940aae893d0cc770b4c36ce80e2ed86fcb863d48ea80a752b8bda9303/yarl-1.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab47acc9332f3de1b39e9b702d9c916af7f02656b2a86a474d9db4e53ef8fd7a", size = 334150 }, - { url = "https://files.pythonhosted.org/packages/ef/b2/986bd82aa222c3e6b211a69c9081ba46484cffa9fab2a5235e8d18ca7a27/yarl-1.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4a34c52ed158f89876cba9c600b2c964dfc1ca52ba7b3ab6deb722d1d8be6df2", size = 362207 }, - { url = "https://files.pythonhosted.org/packages/14/7c/63f5922437b873795d9422cbe7eb2509d4b540c37ae5548a4bb68fd2c546/yarl-1.20.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:04d8cfb12714158abf2618f792c77bc5c3d8c5f37353e79509608be4f18705c9", size = 361277 }, - { url = "https://files.pythonhosted.org/packages/81/83/450938cccf732466953406570bdb42c62b5ffb0ac7ac75a1f267773ab5c8/yarl-1.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7dc63ad0d541c38b6ae2255aaa794434293964677d5c1ec5d0116b0e308031f5", size = 364990 }, - { url = "https://files.pythonhosted.org/packages/b4/de/af47d3a47e4a833693b9ec8e87debb20f09d9fdc9139b207b09a3e6cbd5a/yarl-1.20.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d02b591a64e4e6ca18c5e3d925f11b559c763b950184a64cf47d74d7e41877", size = 374684 }, - { url = "https://files.pythonhosted.org/packages/62/0b/078bcc2d539f1faffdc7d32cb29a2d7caa65f1a6f7e40795d8485db21851/yarl-1.20.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:95fc9876f917cac7f757df80a5dda9de59d423568460fe75d128c813b9af558e", size = 382599 }, - { url = "https://files.pythonhosted.org/packages/74/a9/4fdb1a7899f1fb47fd1371e7ba9e94bff73439ce87099d5dd26d285fffe0/yarl-1.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bb769ae5760cd1c6a712135ee7915f9d43f11d9ef769cb3f75a23e398a92d384", size = 378573 }, - { url = "https://files.pythonhosted.org/packages/fd/be/29f5156b7a319e4d2e5b51ce622b4dfb3aa8d8204cd2a8a339340fbfad40/yarl-1.20.0-cp313-cp313-win32.whl", hash = "sha256:70e0c580a0292c7414a1cead1e076c9786f685c1fc4757573d2967689b370e62", size = 86051 }, - { url = "https://files.pythonhosted.org/packages/52/56/05fa52c32c301da77ec0b5f63d2d9605946fe29defacb2a7ebd473c23b81/yarl-1.20.0-cp313-cp313-win_amd64.whl", hash = "sha256:4c43030e4b0af775a85be1fa0433119b1565673266a70bf87ef68a9d5ba3174c", size = 92742 }, - { url = "https://files.pythonhosted.org/packages/d4/2f/422546794196519152fc2e2f475f0e1d4d094a11995c81a465faf5673ffd/yarl-1.20.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b6c4c3d0d6a0ae9b281e492b1465c72de433b782e6b5001c8e7249e085b69051", size = 163575 }, - { url = "https://files.pythonhosted.org/packages/90/fc/67c64ddab6c0b4a169d03c637fb2d2a212b536e1989dec8e7e2c92211b7f/yarl-1.20.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8681700f4e4df891eafa4f69a439a6e7d480d64e52bf460918f58e443bd3da7d", size = 106121 }, - { url = "https://files.pythonhosted.org/packages/6d/00/29366b9eba7b6f6baed7d749f12add209b987c4cfbfa418404dbadc0f97c/yarl-1.20.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:84aeb556cb06c00652dbf87c17838eb6d92cfd317799a8092cee0e570ee11229", size = 103815 }, - { url = "https://files.pythonhosted.org/packages/28/f4/a2a4c967c8323c03689383dff73396281ced3b35d0ed140580825c826af7/yarl-1.20.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f166eafa78810ddb383e930d62e623d288fb04ec566d1b4790099ae0f31485f1", size = 408231 }, - { url = "https://files.pythonhosted.org/packages/0f/a1/66f7ffc0915877d726b70cc7a896ac30b6ac5d1d2760613603b022173635/yarl-1.20.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5d3d6d14754aefc7a458261027a562f024d4f6b8a798adb472277f675857b1eb", size = 390221 }, - { url = "https://files.pythonhosted.org/packages/41/15/cc248f0504610283271615e85bf38bc014224122498c2016d13a3a1b8426/yarl-1.20.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a8f64df8ed5d04c51260dbae3cc82e5649834eebea9eadfd829837b8093eb00", size = 411400 }, - { url = "https://files.pythonhosted.org/packages/5c/af/f0823d7e092bfb97d24fce6c7269d67fcd1aefade97d0a8189c4452e4d5e/yarl-1.20.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d9949eaf05b4d30e93e4034a7790634bbb41b8be2d07edd26754f2e38e491de", size = 411714 }, - { url = "https://files.pythonhosted.org/packages/83/70/be418329eae64b9f1b20ecdaac75d53aef098797d4c2299d82ae6f8e4663/yarl-1.20.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c366b254082d21cc4f08f522ac201d0d83a8b8447ab562732931d31d80eb2a5", size = 404279 }, - { url = "https://files.pythonhosted.org/packages/19/f5/52e02f0075f65b4914eb890eea1ba97e6fd91dd821cc33a623aa707b2f67/yarl-1.20.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91bc450c80a2e9685b10e34e41aef3d44ddf99b3a498717938926d05ca493f6a", size = 384044 }, - { url = "https://files.pythonhosted.org/packages/6a/36/b0fa25226b03d3f769c68d46170b3e92b00ab3853d73127273ba22474697/yarl-1.20.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9c2aa4387de4bc3a5fe158080757748d16567119bef215bec643716b4fbf53f9", size = 416236 }, - { url = "https://files.pythonhosted.org/packages/cb/3a/54c828dd35f6831dfdd5a79e6c6b4302ae2c5feca24232a83cb75132b205/yarl-1.20.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:d2cbca6760a541189cf87ee54ff891e1d9ea6406079c66341008f7ef6ab61145", size = 402034 }, - { url = "https://files.pythonhosted.org/packages/10/97/c7bf5fba488f7e049f9ad69c1b8fdfe3daa2e8916b3d321aa049e361a55a/yarl-1.20.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:798a5074e656f06b9fad1a162be5a32da45237ce19d07884d0b67a0aa9d5fdda", size = 407943 }, - { url = "https://files.pythonhosted.org/packages/fd/a4/022d2555c1e8fcff08ad7f0f43e4df3aba34f135bff04dd35d5526ce54ab/yarl-1.20.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f106e75c454288472dbe615accef8248c686958c2e7dd3b8d8ee2669770d020f", size = 423058 }, - { url = "https://files.pythonhosted.org/packages/4c/f6/0873a05563e5df29ccf35345a6ae0ac9e66588b41fdb7043a65848f03139/yarl-1.20.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:3b60a86551669c23dc5445010534d2c5d8a4e012163218fc9114e857c0586fdd", size = 423792 }, - { url = "https://files.pythonhosted.org/packages/9e/35/43fbbd082708fa42e923f314c24f8277a28483d219e049552e5007a9aaca/yarl-1.20.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e429857e341d5e8e15806118e0294f8073ba9c4580637e59ab7b238afca836f", size = 422242 }, - { url = "https://files.pythonhosted.org/packages/ed/f7/f0f2500cf0c469beb2050b522c7815c575811627e6d3eb9ec7550ddd0bfe/yarl-1.20.0-cp313-cp313t-win32.whl", hash = "sha256:65a4053580fe88a63e8e4056b427224cd01edfb5f951498bfefca4052f0ce0ac", size = 93816 }, - { url = "https://files.pythonhosted.org/packages/3f/93/f73b61353b2a699d489e782c3f5998b59f974ec3156a2050a52dfd7e8946/yarl-1.20.0-cp313-cp313t-win_amd64.whl", hash = "sha256:53b2da3a6ca0a541c1ae799c349788d480e5144cac47dba0266c7cb6c76151fe", size = 101093 }, - { url = "https://files.pythonhosted.org/packages/ea/1f/70c57b3d7278e94ed22d85e09685d3f0a38ebdd8c5c73b65ba4c0d0fe002/yarl-1.20.0-py3-none-any.whl", hash = "sha256:5d0fe6af927a47a230f31e6004621fd0959eaa915fc62acfafa67ff7229a3124", size = 46124 }, +sdist = { url = "https://files.pythonhosted.org/packages/3c/fb/efaa23fa4e45537b827620f04cf8f3cd658b76642205162e072703a5b963/yarl-1.20.1.tar.gz", hash = "sha256:d017a4997ee50c91fd5466cef416231bb82177b93b029906cefc542ce14c35ac", size = 186428 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/18/893b50efc2350e47a874c5c2d67e55a0ea5df91186b2a6f5ac52eff887cd/yarl-1.20.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47ee6188fea634bdfaeb2cc420f5b3b17332e6225ce88149a17c413c77ff269e", size = 133833 }, + { url = "https://files.pythonhosted.org/packages/89/ed/b8773448030e6fc47fa797f099ab9eab151a43a25717f9ac043844ad5ea3/yarl-1.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d0f6500f69e8402d513e5eedb77a4e1818691e8f45e6b687147963514d84b44b", size = 91070 }, + { url = "https://files.pythonhosted.org/packages/e3/e3/409bd17b1e42619bf69f60e4f031ce1ccb29bd7380117a55529e76933464/yarl-1.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a8900a42fcdaad568de58887c7b2f602962356908eedb7628eaf6021a6e435b", size = 89818 }, + { url = "https://files.pythonhosted.org/packages/f8/77/64d8431a4d77c856eb2d82aa3de2ad6741365245a29b3a9543cd598ed8c5/yarl-1.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bad6d131fda8ef508b36be3ece16d0902e80b88ea7200f030a0f6c11d9e508d4", size = 347003 }, + { url = "https://files.pythonhosted.org/packages/8d/d2/0c7e4def093dcef0bd9fa22d4d24b023788b0a33b8d0088b51aa51e21e99/yarl-1.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:df018d92fe22aaebb679a7f89fe0c0f368ec497e3dda6cb81a567610f04501f1", size = 336537 }, + { url = "https://files.pythonhosted.org/packages/f0/f3/fc514f4b2cf02cb59d10cbfe228691d25929ce8f72a38db07d3febc3f706/yarl-1.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f969afbb0a9b63c18d0feecf0db09d164b7a44a053e78a7d05f5df163e43833", size = 362358 }, + { url = "https://files.pythonhosted.org/packages/ea/6d/a313ac8d8391381ff9006ac05f1d4331cee3b1efaa833a53d12253733255/yarl-1.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:812303eb4aa98e302886ccda58d6b099e3576b1b9276161469c25803a8db277d", size = 357362 }, + { url = "https://files.pythonhosted.org/packages/00/70/8f78a95d6935a70263d46caa3dd18e1f223cf2f2ff2037baa01a22bc5b22/yarl-1.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98c4a7d166635147924aa0bf9bfe8d8abad6fffa6102de9c99ea04a1376f91e8", size = 348979 }, + { url = "https://files.pythonhosted.org/packages/cb/05/42773027968968f4f15143553970ee36ead27038d627f457cc44bbbeecf3/yarl-1.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12e768f966538e81e6e7550f9086a6236b16e26cd964cf4df35349970f3551cf", size = 337274 }, + { url = "https://files.pythonhosted.org/packages/05/be/665634aa196954156741ea591d2f946f1b78ceee8bb8f28488bf28c0dd62/yarl-1.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe41919b9d899661c5c28a8b4b0acf704510b88f27f0934ac7a7bebdd8938d5e", size = 363294 }, + { url = "https://files.pythonhosted.org/packages/eb/90/73448401d36fa4e210ece5579895731f190d5119c4b66b43b52182e88cd5/yarl-1.20.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:8601bc010d1d7780592f3fc1bdc6c72e2b6466ea34569778422943e1a1f3c389", size = 358169 }, + { url = "https://files.pythonhosted.org/packages/c3/b0/fce922d46dc1eb43c811f1889f7daa6001b27a4005587e94878570300881/yarl-1.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:daadbdc1f2a9033a2399c42646fbd46da7992e868a5fe9513860122d7fe7a73f", size = 362776 }, + { url = "https://files.pythonhosted.org/packages/f1/0d/b172628fce039dae8977fd22caeff3eeebffd52e86060413f5673767c427/yarl-1.20.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:03aa1e041727cb438ca762628109ef1333498b122e4c76dd858d186a37cec845", size = 381341 }, + { url = "https://files.pythonhosted.org/packages/6b/9b/5b886d7671f4580209e855974fe1cecec409aa4a89ea58b8f0560dc529b1/yarl-1.20.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:642980ef5e0fa1de5fa96d905c7e00cb2c47cb468bfcac5a18c58e27dbf8d8d1", size = 379988 }, + { url = "https://files.pythonhosted.org/packages/73/be/75ef5fd0fcd8f083a5d13f78fd3f009528132a1f2a1d7c925c39fa20aa79/yarl-1.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:86971e2795584fe8c002356d3b97ef6c61862720eeff03db2a7c86b678d85b3e", size = 371113 }, + { url = "https://files.pythonhosted.org/packages/50/4f/62faab3b479dfdcb741fe9e3f0323e2a7d5cd1ab2edc73221d57ad4834b2/yarl-1.20.1-cp311-cp311-win32.whl", hash = "sha256:597f40615b8d25812f14562699e287f0dcc035d25eb74da72cae043bb884d773", size = 81485 }, + { url = "https://files.pythonhosted.org/packages/f0/09/d9c7942f8f05c32ec72cd5c8e041c8b29b5807328b68b4801ff2511d4d5e/yarl-1.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:26ef53a9e726e61e9cd1cda6b478f17e350fb5800b4bd1cd9fe81c4d91cfeb2e", size = 86686 }, + { url = "https://files.pythonhosted.org/packages/5f/9a/cb7fad7d73c69f296eda6815e4a2c7ed53fc70c2f136479a91c8e5fbdb6d/yarl-1.20.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdcc4cd244e58593a4379fe60fdee5ac0331f8eb70320a24d591a3be197b94a9", size = 133667 }, + { url = "https://files.pythonhosted.org/packages/67/38/688577a1cb1e656e3971fb66a3492501c5a5df56d99722e57c98249e5b8a/yarl-1.20.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b29a2c385a5f5b9c7d9347e5812b6f7ab267193c62d282a540b4fc528c8a9d2a", size = 91025 }, + { url = "https://files.pythonhosted.org/packages/50/ec/72991ae51febeb11a42813fc259f0d4c8e0507f2b74b5514618d8b640365/yarl-1.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1112ae8154186dfe2de4732197f59c05a83dc814849a5ced892b708033f40dc2", size = 89709 }, + { url = "https://files.pythonhosted.org/packages/99/da/4d798025490e89426e9f976702e5f9482005c548c579bdae792a4c37769e/yarl-1.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90bbd29c4fe234233f7fa2b9b121fb63c321830e5d05b45153a2ca68f7d310ee", size = 352287 }, + { url = "https://files.pythonhosted.org/packages/1a/26/54a15c6a567aac1c61b18aa0f4b8aa2e285a52d547d1be8bf48abe2b3991/yarl-1.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:680e19c7ce3710ac4cd964e90dad99bf9b5029372ba0c7cbfcd55e54d90ea819", size = 345429 }, + { url = "https://files.pythonhosted.org/packages/d6/95/9dcf2386cb875b234353b93ec43e40219e14900e046bf6ac118f94b1e353/yarl-1.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a979218c1fdb4246a05efc2cc23859d47c89af463a90b99b7c56094daf25a16", size = 365429 }, + { url = "https://files.pythonhosted.org/packages/91/b2/33a8750f6a4bc224242a635f5f2cff6d6ad5ba651f6edcccf721992c21a0/yarl-1.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255b468adf57b4a7b65d8aad5b5138dce6a0752c139965711bdcb81bc370e1b6", size = 363862 }, + { url = "https://files.pythonhosted.org/packages/98/28/3ab7acc5b51f4434b181b0cee8f1f4b77a65919700a355fb3617f9488874/yarl-1.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a97d67108e79cfe22e2b430d80d7571ae57d19f17cda8bb967057ca8a7bf5bfd", size = 355616 }, + { url = "https://files.pythonhosted.org/packages/36/a3/f666894aa947a371724ec7cd2e5daa78ee8a777b21509b4252dd7bd15e29/yarl-1.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8570d998db4ddbfb9a590b185a0a33dbf8aafb831d07a5257b4ec9948df9cb0a", size = 339954 }, + { url = "https://files.pythonhosted.org/packages/f1/81/5f466427e09773c04219d3450d7a1256138a010b6c9f0af2d48565e9ad13/yarl-1.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97c75596019baae7c71ccf1d8cc4738bc08134060d0adfcbe5642f778d1dca38", size = 365575 }, + { url = "https://files.pythonhosted.org/packages/2e/e3/e4b0ad8403e97e6c9972dd587388940a032f030ebec196ab81a3b8e94d31/yarl-1.20.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1c48912653e63aef91ff988c5432832692ac5a1d8f0fb8a33091520b5bbe19ef", size = 365061 }, + { url = "https://files.pythonhosted.org/packages/ac/99/b8a142e79eb86c926f9f06452eb13ecb1bb5713bd01dc0038faf5452e544/yarl-1.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4c3ae28f3ae1563c50f3d37f064ddb1511ecc1d5584e88c6b7c63cf7702a6d5f", size = 364142 }, + { url = "https://files.pythonhosted.org/packages/34/f2/08ed34a4a506d82a1a3e5bab99ccd930a040f9b6449e9fd050320e45845c/yarl-1.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c5e9642f27036283550f5f57dc6156c51084b458570b9d0d96100c8bebb186a8", size = 381894 }, + { url = "https://files.pythonhosted.org/packages/92/f8/9a3fbf0968eac704f681726eff595dce9b49c8a25cd92bf83df209668285/yarl-1.20.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2c26b0c49220d5799f7b22c6838409ee9bc58ee5c95361a4d7831f03cc225b5a", size = 383378 }, + { url = "https://files.pythonhosted.org/packages/af/85/9363f77bdfa1e4d690957cd39d192c4cacd1c58965df0470a4905253b54f/yarl-1.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:564ab3d517e3d01c408c67f2e5247aad4019dcf1969982aba3974b4093279004", size = 374069 }, + { url = "https://files.pythonhosted.org/packages/35/99/9918c8739ba271dcd935400cff8b32e3cd319eaf02fcd023d5dcd487a7c8/yarl-1.20.1-cp312-cp312-win32.whl", hash = "sha256:daea0d313868da1cf2fac6b2d3a25c6e3a9e879483244be38c8e6a41f1d876a5", size = 81249 }, + { url = "https://files.pythonhosted.org/packages/eb/83/5d9092950565481b413b31a23e75dd3418ff0a277d6e0abf3729d4d1ce25/yarl-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:48ea7d7f9be0487339828a4de0360d7ce0efc06524a48e1810f945c45b813698", size = 86710 }, + { url = "https://files.pythonhosted.org/packages/8a/e1/2411b6d7f769a07687acee88a062af5833cf1966b7266f3d8dfb3d3dc7d3/yarl-1.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0b5ff0fbb7c9f1b1b5ab53330acbfc5247893069e7716840c8e7d5bb7355038a", size = 131811 }, + { url = "https://files.pythonhosted.org/packages/b2/27/584394e1cb76fb771371770eccad35de400e7b434ce3142c2dd27392c968/yarl-1.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:14f326acd845c2b2e2eb38fb1346c94f7f3b01a4f5c788f8144f9b630bfff9a3", size = 90078 }, + { url = "https://files.pythonhosted.org/packages/bf/9a/3246ae92d4049099f52d9b0fe3486e3b500e29b7ea872d0f152966fc209d/yarl-1.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f60e4ad5db23f0b96e49c018596707c3ae89f5d0bd97f0ad3684bcbad899f1e7", size = 88748 }, + { url = "https://files.pythonhosted.org/packages/a3/25/35afe384e31115a1a801fbcf84012d7a066d89035befae7c5d4284df1e03/yarl-1.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49bdd1b8e00ce57e68ba51916e4bb04461746e794e7c4d4bbc42ba2f18297691", size = 349595 }, + { url = "https://files.pythonhosted.org/packages/28/2d/8aca6cb2cabc8f12efcb82749b9cefecbccfc7b0384e56cd71058ccee433/yarl-1.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:66252d780b45189975abfed839616e8fd2dbacbdc262105ad7742c6ae58f3e31", size = 342616 }, + { url = "https://files.pythonhosted.org/packages/0b/e9/1312633d16b31acf0098d30440ca855e3492d66623dafb8e25b03d00c3da/yarl-1.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59174e7332f5d153d8f7452a102b103e2e74035ad085f404df2e40e663a22b28", size = 361324 }, + { url = "https://files.pythonhosted.org/packages/bc/a0/688cc99463f12f7669eec7c8acc71ef56a1521b99eab7cd3abb75af887b0/yarl-1.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3968ec7d92a0c0f9ac34d5ecfd03869ec0cab0697c91a45db3fbbd95fe1b653", size = 359676 }, + { url = "https://files.pythonhosted.org/packages/af/44/46407d7f7a56e9a85a4c207724c9f2c545c060380718eea9088f222ba697/yarl-1.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1a4fbb50e14396ba3d375f68bfe02215d8e7bc3ec49da8341fe3157f59d2ff5", size = 352614 }, + { url = "https://files.pythonhosted.org/packages/b1/91/31163295e82b8d5485d31d9cf7754d973d41915cadce070491778d9c9825/yarl-1.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11a62c839c3a8eac2410e951301309426f368388ff2f33799052787035793b02", size = 336766 }, + { url = "https://files.pythonhosted.org/packages/b4/8e/c41a5bc482121f51c083c4c2bcd16b9e01e1cf8729e380273a952513a21f/yarl-1.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:041eaa14f73ff5a8986b4388ac6bb43a77f2ea09bf1913df7a35d4646db69e53", size = 364615 }, + { url = "https://files.pythonhosted.org/packages/e3/5b/61a3b054238d33d70ea06ebba7e58597891b71c699e247df35cc984ab393/yarl-1.20.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:377fae2fef158e8fd9d60b4c8751387b8d1fb121d3d0b8e9b0be07d1b41e83dc", size = 360982 }, + { url = "https://files.pythonhosted.org/packages/df/a3/6a72fb83f8d478cb201d14927bc8040af901811a88e0ff2da7842dd0ed19/yarl-1.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1c92f4390e407513f619d49319023664643d3339bd5e5a56a3bebe01bc67ec04", size = 369792 }, + { url = "https://files.pythonhosted.org/packages/7c/af/4cc3c36dfc7c077f8dedb561eb21f69e1e9f2456b91b593882b0b18c19dc/yarl-1.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d25ddcf954df1754ab0f86bb696af765c5bfaba39b74095f27eececa049ef9a4", size = 382049 }, + { url = "https://files.pythonhosted.org/packages/19/3a/e54e2c4752160115183a66dc9ee75a153f81f3ab2ba4bf79c3c53b33de34/yarl-1.20.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:909313577e9619dcff8c31a0ea2aa0a2a828341d92673015456b3ae492e7317b", size = 384774 }, + { url = "https://files.pythonhosted.org/packages/9c/20/200ae86dabfca89060ec6447649f219b4cbd94531e425e50d57e5f5ac330/yarl-1.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:793fd0580cb9664548c6b83c63b43c477212c0260891ddf86809e1c06c8b08f1", size = 374252 }, + { url = "https://files.pythonhosted.org/packages/83/75/11ee332f2f516b3d094e89448da73d557687f7d137d5a0f48c40ff211487/yarl-1.20.1-cp313-cp313-win32.whl", hash = "sha256:468f6e40285de5a5b3c44981ca3a319a4b208ccc07d526b20b12aeedcfa654b7", size = 81198 }, + { url = "https://files.pythonhosted.org/packages/ba/ba/39b1ecbf51620b40ab402b0fc817f0ff750f6d92712b44689c2c215be89d/yarl-1.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:495b4ef2fea40596bfc0affe3837411d6aa3371abcf31aac0ccc4bdd64d4ef5c", size = 86346 }, + { url = "https://files.pythonhosted.org/packages/43/c7/669c52519dca4c95153c8ad96dd123c79f354a376346b198f438e56ffeb4/yarl-1.20.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f60233b98423aab21d249a30eb27c389c14929f47be8430efa7dbd91493a729d", size = 138826 }, + { url = "https://files.pythonhosted.org/packages/6a/42/fc0053719b44f6ad04a75d7f05e0e9674d45ef62f2d9ad2c1163e5c05827/yarl-1.20.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6f3eff4cc3f03d650d8755c6eefc844edde99d641d0dcf4da3ab27141a5f8ddf", size = 93217 }, + { url = "https://files.pythonhosted.org/packages/4f/7f/fa59c4c27e2a076bba0d959386e26eba77eb52ea4a0aac48e3515c186b4c/yarl-1.20.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:69ff8439d8ba832d6bed88af2c2b3445977eba9a4588b787b32945871c2444e3", size = 92700 }, + { url = "https://files.pythonhosted.org/packages/2f/d4/062b2f48e7c93481e88eff97a6312dca15ea200e959f23e96d8ab898c5b8/yarl-1.20.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cf34efa60eb81dd2645a2e13e00bb98b76c35ab5061a3989c7a70f78c85006d", size = 347644 }, + { url = "https://files.pythonhosted.org/packages/89/47/78b7f40d13c8f62b499cc702fdf69e090455518ae544c00a3bf4afc9fc77/yarl-1.20.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8e0fe9364ad0fddab2688ce72cb7a8e61ea42eff3c7caeeb83874a5d479c896c", size = 323452 }, + { url = "https://files.pythonhosted.org/packages/eb/2b/490d3b2dc66f52987d4ee0d3090a147ea67732ce6b4d61e362c1846d0d32/yarl-1.20.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f64fbf81878ba914562c672024089e3401974a39767747691c65080a67b18c1", size = 346378 }, + { url = "https://files.pythonhosted.org/packages/66/ad/775da9c8a94ce925d1537f939a4f17d782efef1f973039d821cbe4bcc211/yarl-1.20.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6342d643bf9a1de97e512e45e4b9560a043347e779a173250824f8b254bd5ce", size = 353261 }, + { url = "https://files.pythonhosted.org/packages/4b/23/0ed0922b47a4f5c6eb9065d5ff1e459747226ddce5c6a4c111e728c9f701/yarl-1.20.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56dac5f452ed25eef0f6e3c6a066c6ab68971d96a9fb441791cad0efba6140d3", size = 335987 }, + { url = "https://files.pythonhosted.org/packages/3e/49/bc728a7fe7d0e9336e2b78f0958a2d6b288ba89f25a1762407a222bf53c3/yarl-1.20.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7d7f497126d65e2cad8dc5f97d34c27b19199b6414a40cb36b52f41b79014be", size = 329361 }, + { url = "https://files.pythonhosted.org/packages/93/8f/b811b9d1f617c83c907e7082a76e2b92b655400e61730cd61a1f67178393/yarl-1.20.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:67e708dfb8e78d8a19169818eeb5c7a80717562de9051bf2413aca8e3696bf16", size = 346460 }, + { url = "https://files.pythonhosted.org/packages/70/fd/af94f04f275f95da2c3b8b5e1d49e3e79f1ed8b6ceb0f1664cbd902773ff/yarl-1.20.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:595c07bc79af2494365cc96ddeb772f76272364ef7c80fb892ef9d0649586513", size = 334486 }, + { url = "https://files.pythonhosted.org/packages/84/65/04c62e82704e7dd0a9b3f61dbaa8447f8507655fd16c51da0637b39b2910/yarl-1.20.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7bdd2f80f4a7df852ab9ab49484a4dee8030023aa536df41f2d922fd57bf023f", size = 342219 }, + { url = "https://files.pythonhosted.org/packages/91/95/459ca62eb958381b342d94ab9a4b6aec1ddec1f7057c487e926f03c06d30/yarl-1.20.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c03bfebc4ae8d862f853a9757199677ab74ec25424d0ebd68a0027e9c639a390", size = 350693 }, + { url = "https://files.pythonhosted.org/packages/a6/00/d393e82dd955ad20617abc546a8f1aee40534d599ff555ea053d0ec9bf03/yarl-1.20.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:344d1103e9c1523f32a5ed704d576172d2cabed3122ea90b1d4e11fe17c66458", size = 355803 }, + { url = "https://files.pythonhosted.org/packages/9e/ed/c5fb04869b99b717985e244fd93029c7a8e8febdfcffa06093e32d7d44e7/yarl-1.20.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:88cab98aa4e13e1ade8c141daeedd300a4603b7132819c484841bb7af3edce9e", size = 341709 }, + { url = "https://files.pythonhosted.org/packages/24/fd/725b8e73ac2a50e78a4534ac43c6addf5c1c2d65380dd48a9169cc6739a9/yarl-1.20.1-cp313-cp313t-win32.whl", hash = "sha256:b121ff6a7cbd4abc28985b6028235491941b9fe8fe226e6fdc539c977ea1739d", size = 86591 }, + { url = "https://files.pythonhosted.org/packages/94/c3/b2e9f38bc3e11191981d57ea08cab2166e74ea770024a646617c9cddd9f6/yarl-1.20.1-cp313-cp313t-win_amd64.whl", hash = "sha256:541d050a355bbbc27e55d906bc91cb6fe42f96c01413dd0f4ed5a5240513874f", size = 93003 }, + { url = "https://files.pythonhosted.org/packages/b4/2d/2345fce04cfd4bee161bf1e7d9cdc702e3e16109021035dbb24db654a622/yarl-1.20.1-py3-none-any.whl", hash = "sha256:83b8eb083fe4683c6115795d9fc1cfaf2cbbefb19b3a1cb68f6527460f483a77", size = 46542 }, ] [[package]] @@ -3992,9 +3809,9 @@ wheels = [ [[package]] name = "zipp" -version = "3.22.0" +version = "3.23.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/12/b6/7b3d16792fdf94f146bed92be90b4eb4563569eca91513c8609aebf0c167/zipp-3.22.0.tar.gz", hash = "sha256:dd2f28c3ce4bc67507bfd3781d21b7bb2be31103b51a4553ad7d90b84e57ace5", size = 25257 } +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/da/f64669af4cae46f17b90798a827519ce3737d31dbafad65d391e49643dc4/zipp-3.22.0-py3-none-any.whl", hash = "sha256:fe208f65f2aca48b81f9e6fd8cf7b8b32c26375266b009b413d45306b6148343", size = 9796 }, + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276 }, ] From 79863ac554a4250f86b0712aee810d1eb5e427fb Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Wed, 2 Jul 2025 21:49:22 +0000 Subject: [PATCH 24/56] Dataset Build - pass one --- src/mdio/schemas/v1/dataset_builder.py | 288 ++++++----------- .../v1/test_dataset_builder_add_coordinate.py | 27 +- .../v1/test_dataset_builder_add_dimension.py | 60 ++-- .../v1/test_dataset_builder_add_variable.py | 29 +- tests/unit/v1/test_dataset_builder_build.py | 143 ++++----- tests/unit/v1/test_dataset_builder_helpers.py | 290 ++++-------------- 6 files changed, 297 insertions(+), 540 deletions(-) diff --git a/src/mdio/schemas/v1/dataset_builder.py b/src/mdio/schemas/v1/dataset_builder.py index 8b1698789..701fdbba3 100644 --- a/src/mdio/schemas/v1/dataset_builder.py +++ b/src/mdio/schemas/v1/dataset_builder.py @@ -7,8 +7,6 @@ from typing import Any from typing import TypeAlias -import xarray as xr - from pydantic import BaseModel from zarr.core.chunk_key_encodings import V2ChunkKeyEncoding # noqa: F401 @@ -19,14 +17,12 @@ from mdio.schemas.dtype import StructuredType from mdio.schemas.metadata import ChunkGridMetadata from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.dataset import Dataset +from mdio.schemas.v1.dataset import DatasetInfo from mdio.schemas.v1.stats import StatisticsMetadata from mdio.schemas.v1.units import AllUnits from mdio.schemas.v1.variable import Coordinate -from mdio.schemas.v1.variable import CoordinateMetadata from mdio.schemas.v1.variable import Variable -from mdio.schemas.v1.variable import VariableMetadata -from mdio.schemas.v1.dataset import Dataset, DatasetInfo -from mdio.schemas.v1.dataset import DatasetMetadata AnyMetadataList: TypeAlias = list[AllUnits | UserAttributes | @@ -50,24 +46,10 @@ class _BuilderState(Enum): HAS_VARIABLES = auto() -def contains_dimension( - dimensions: list[NamedDimension], name_or_dimension: str | NamedDimension -) -> bool: - """Check if a dimension with the given name exists in the list.""" - if isinstance(name_or_dimension, str): - name = name_or_dimension - return get_dimension(dimensions, name) is not None - if isinstance(name_or_dimension, NamedDimension): - dimension = name_or_dimension - return get_dimension(dimensions, dimension.name, dimension.size) is not None - msg = f"Expected str or NamedDimension, got {type(name_or_dimension).__name__}" - raise TypeError(msg) - - -def get_dimension( +def _get_dimension( dimensions: list[NamedDimension], name: str, size: int | None = None ) -> NamedDimension | None: - """Get a dimension by name from the list.""" + """Get a dimension by name and size from the list[NamedDimension] .""" if dimensions is None: return False if not isinstance(name, str): @@ -83,19 +65,6 @@ def get_dimension( return nd -def get_dimension_names(dimensions: list[NamedDimension | str]) -> list[str]: - """Get a dimension by name from the list.""" - names = [] - if dimensions is None: - return names - for dim in dimensions: - if isinstance(dim, NamedDimension): - names.append(dim.name) - elif isinstance(dim, str): - names.append(dim) - return names - - def _to_dictionary(val: BaseModel | dict[str, Any] | AnyMetadataList) -> dict[str, Any]: """Convert a dictionary, list or pydantic BaseModel to a dictionary.""" if val is None: @@ -142,42 +111,18 @@ def __init__(self, name: str, attributes: UserAttributes | None = None): self._state = _BuilderState.INITIAL self._unnamed_variable_counter = 0 - def _add_dimensions_if_needed( - self, dimensions: list[NamedDimension | str] | None - ) -> list[NamedDimension]: - if dimensions is None: - return [] - - added_dims = [] - for dim in dimensions: - if isinstance(dim, str): - if not contains_dimension(self._dimensions, dim): - msg = f"Pre-existing dimension named {dim!r} is not found" - raise ValueError(msg) - else: - if not isinstance(dim, NamedDimension): - msg = f"Expected NamedDimension or str, got {type(dim).__name__}" - raise TypeError(msg) - if contains_dimension(self._dimensions, dim): - continue - # Use value instead of a reference - d = NamedDimension(name=dim.name, size=dim.size) - self._dimensions.append(d) - added_dims.append(d) - return added_dims - + def add_dimension( # noqa: PLR0913 self, name: str, size: int, - var_long_name: str = None, var_data_type: ScalarType | StructuredType = ScalarType.INT32, var_metadata_info: VariableMetadataList | None = None, ) -> "MDIODatasetBuilder": """Add a dimension. - This must be called at least once before adding coordinates or variables. - This call will create a variable, if one does not yet exists + This function be called at least once before adding coordinates or variables. + This call will create a dimension variable, if one does not yet exists Args: name: Name of the dimension @@ -192,28 +137,31 @@ def add_dimension( # noqa: PLR0913 if not name: msg = "'name' must be a non-empty string" raise ValueError(msg) + + # Validate that the dimension is not already defined old_var = next((e for e in self._dimensions if e.name == name), None) if old_var is not None: msg = "Adding dimension with the same name twice is not allowed" raise ValueError(msg) - added_dims = self._add_dimensions_if_needed([NamedDimension(name=name, size=size)]) - if added_dims: - meta_dict = _to_dictionary(var_metadata_info) - # Create a variable for the dimension - dim_var = Variable( - name=name, - longName=var_long_name, - # IMPORTANT: we always use NamedDimension here, not the dimension name - # Since the Dataset does not have a dimension list, we need to preserve NamedDimension - # somewhere. Namely, in the variable created for the dimension - dimensions=added_dims, - dataType=var_data_type, - compressor=None, - coordinates=None, - metadata=meta_dict, - ) - self._variables.append(dim_var) + dim = NamedDimension(name=name, size=size) + self._dimensions.append(dim) + + meta_dict = _to_dictionary(var_metadata_info) + # Create a variable for the dimension + dim_var = Variable( + name=name, + longName=f"'{name}' dimension variable", + # IMPORTANT: we use NamedDimension here, not the dimension name. + # Since the Dataset does not have a dimension list, we need to preserve + # NamedDimension somewhere. Namely, in the variable created for the dimension + dimensions=[dim], + dataType=var_data_type, + compressor=None, + coordinates=None, + metadata=meta_dict, + ) + self._variables.append(dim_var) self._state = _BuilderState.HAS_DIMENSIONS return self @@ -223,12 +171,25 @@ def add_coordinate( # noqa: PLR0913 name: str, *, long_name: str = None, - #TODO Only allow adding dimensions by name, not by NamedDimension object - dimensions: list[NamedDimension | str], + dimensions: list[str], data_type: ScalarType | StructuredType = ScalarType.FLOAT32, metadata_info: CoordinateMetadataList | None = None, ) -> "MDIODatasetBuilder": - """Add a coordinate after adding at least one dimension.""" + """Add a coordinate after adding at least one dimension. + + This function must be called after all required dimensions are added via add_dimension(). + This call will create a coordinate variable. + + Args: + name: Name of the coordinate + long_name: Optional long name for the coordinate + dimensions: List of dimension names that the coordinate is associated with + data_type: Data type for the coordinate (defaults to FLOAT32) + metadata_info: Optional metadata information for the coordinate + + Returns: + self: Returns self for method chaining + """ if self._state == _BuilderState.INITIAL: msg = "Must add at least one dimension before adding coordinates" raise ValueError(msg) @@ -239,32 +200,38 @@ def add_coordinate( # noqa: PLR0913 msg = "'dimensions' must be a non-empty list" raise ValueError(msg) old_var = next((e for e in self._coordinates if e.name == name), None) + + # Validate that the coordinate is not already defined if old_var is not None: msg = "Adding coordinate with the same name twice is not allowed" raise ValueError(msg) + + # Validate that all referenced dimensions are already defined + for dim in dimensions: + if next((d for d in self._dimensions if d.name == dim), None) is None: + msg = f"Pre-existing dimension named {dim!r} is not found" + raise ValueError(msg) - self._add_dimensions_if_needed(dimensions) - dim_names = get_dimension_names(dimensions) meta_dict = _to_dictionary(metadata_info) coord = Coordinate( name=name, longName=long_name, # We ass names: sts, not list[NamedDimension | str] - dimensions=dim_names, + dimensions=dimensions, dataType=data_type, metadata=meta_dict ) self._coordinates.append(coord) - # Add coordinate as variables to the dataset + # Add a coordinate variable to the dataset var_meta_dict = _to_dictionary(coord.metadata) coord_var = Variable( name=coord.name, - longName=coord.long_name, + longName=f"'{coord.name}' coordinate variable", dimensions=coord.dimensions, dataType=coord.data_type, compressor=None, - # IMPORTANT: we always use Coordinate here, not the coordinate name + # IMPORTANT: we always use the Coordinate here, not the coordinate name # Since the Dataset does not have a coordinate list, we need to preserve Coordinate # somewhere. Namely, in the variable created for the coordinate coordinates=[coord], @@ -280,15 +247,30 @@ def add_variable( # noqa: PLR0913 name: str, *, long_name: str = None, - #TODO Only allow adding dimensions by name, not by NamedDimension object - dimensions: list[NamedDimension | str], + dimensions: list[str], data_type: ScalarType | StructuredType = ScalarType.FLOAT32, compressor: Blosc | ZFP | None = None, - #TODO Only allow adding coordinates by name, not by Coordinate object - coordinates: list[Coordinate | str] | None = None, + coordinates: list[str] | None = None, metadata_info: VariableMetadataList | None = None, ) -> "MDIODatasetBuilder": - """Add a variable after adding at least one dimension.""" + """Add a variable after adding at least one dimension and, optionally, coordinate. + + This function must be called after all required dimensions are added via add_dimension(). + This function must be called after all required coordinates are added via add_coordinate(). + + Args: + name: Name of the variable + long_name: Optional long name for the variable + dimensions: List of dimension names that the variable is associated with + data_type: Data type for the variable (defaults to FLOAT32) + compressor: Compressor used for the variable (defaults to None) + coordinates: List of coordinate names that the variable is associated with + (defaults to None, meaning no coordinates) + metadata_info: Optional metadata information for the variable + + Returns: + self: Returns self for method chaining. + """ if self._state == _BuilderState.INITIAL: msg = "Must add at least one dimension before adding variables" raise ValueError(msg) @@ -298,19 +280,32 @@ def add_variable( # noqa: PLR0913 if dimensions is None or not dimensions: msg = "'dimensions' must be a non-empty list" raise ValueError(msg) + + # Validate that the variable is not already defined old_var = next((e for e in self._variables if e.name == name), None) if old_var is not None: msg = "Adding variable with the same name twice is not allowed" raise ValueError(msg) - self._add_dimensions_if_needed(dimensions) - dim_names = get_dimension_names(dimensions) + # Validate that all referenced dimensions are already defined + for dim in dimensions: + if next((e for e in self._dimensions if e.name == dim), None) is None: + msg = f"Pre-existing dimension named {dim!r} is not found" + raise ValueError(msg) + + # Validate that all referenced coordinates are already defined + if coordinates is not None: + for coord in coordinates: + if next((c for c in self._coordinates if c.name == coord), None) is None: + msg = f"Pre-existing coordinate named {coord!r} is not found" + raise ValueError(msg) + meta_dict = _to_dictionary(metadata_info) self._variables.append( Variable( name=name, long_name=long_name, - dimensions=dim_names, + dimensions=dimensions, data_type=data_type, compressor=compressor, coordinates=coordinates, @@ -321,100 +316,17 @@ def add_variable( # noqa: PLR0913 return self def build(self) -> Dataset: - """Build the final dataset.""" + """Build the final dataset. + + This function must be called after at least one dimension is added via add_dimension(). + It will create a Dataset object with all added dimensions, coordinates, and variables. + + Returns: + Dataset: The built dataset with all added dimensions, coordinates, and variables. + """ if self._state == _BuilderState.INITIAL: msg = "Must add at least one dimension before building" raise ValueError(msg) var_meta_dict = _to_dictionary([self._info, self._attributes]) - dataset = Dataset(variables=self._variables, metadata=var_meta_dict) - - return dataset - - # def to_mdio( - # self, - # store: str, - # mode: str = "w", - # compute: bool = False, - # **kwargs: Mapping[str, str | int | float | bool], - # ) -> Dataset: - # """Write the dataset to a Zarr store and return the constructed mdio.Dataset. - - # This function constructs an mdio.Dataset from the MDIO dataset and writes its metadata - # to a Zarr store. The actual data is not written, only the metadata structure is created. - # """ - # return write_mdio_metadata(self.build(), store, mode, compute, **kwargs) - -# def write_mdio_metadata( -# mdio_ds: Dataset, -# store: str, -# mode: str = "w", -# compute: bool = False, -# **kwargs: Mapping[str, str | int | float | bool], -# ) -> mdio.Dataset: -# """Write MDIO metadata to a Zarr store and return the constructed mdio.Dataset. - -# This function constructs an mdio.Dataset from the MDIO dataset and writes its metadata -# to a Zarr store. The actual data is not written, only the metadata structure is created. - -# Args: -# mdio_ds: The MDIO dataset to serialize -# store: Path to the Zarr or .mdio store -# mode: Write mode to pass to to_mdio(), e.g. 'w' or 'a' -# compute: Whether to compute (write) array chunks (True) or only metadata (False) -# **kwargs: Additional arguments to pass to to_mdio() - -# Returns: -# The constructed xarray Dataset with MDIO extensions -# """ -# ds = _construct_mdio_dataset(mdio_ds) - -# def _generate_encodings() -> dict: -# """Generate encodings for each variable in the MDIO dataset. - -# Returns: -# Dictionary mapping variable names to their encoding configurations. -# """ -# # TODO(Anybody, #10274): Re-enable chunk_key_encoding when supported by xarray -# # dimension_separator_encoding = V2ChunkKeyEncoding(separator="/").to_dict() - -# # Collect dimension sizes (same approach as _construct_mdio_dataset) -# dims: dict[str, int] = {} -# for var in mdio_ds.variables: -# for d in var.dimensions: -# if isinstance(d, NamedDimension): -# dims[d.name] = d.size - -# global_encodings = {} -# for var in mdio_ds.variables: -# fill_value = 0 -# if isinstance(var.data_type, StructuredType): -# continue -# chunks = None -# if var.metadata is not None and var.metadata.chunk_grid is not None: -# chunks = var.metadata.chunk_grid.configuration.chunk_shape -# else: -# # When no chunk_grid is provided, set chunks to shape to avoid chunking -# dim_names = [d.name if isinstance(d, NamedDimension) else d for d in var.dimensions] -# chunks = tuple(dims[name] for name in dim_names) -# global_encodings[var.name] = { -# "chunks": chunks, -# # TODO(Anybody, #10274): Re-enable chunk_key_encoding when supported by xarray -# # "chunk_key_encoding": dimension_separator_encoding, -# "_FillValue": fill_value, -# "dtype": var.data_type, -# "compressors": _convert_compressor(var.compressor), -# } -# return global_encodings - -# ds.to_mdio( -# store, -# mode=mode, -# zarr_format=2, -# consolidated=True, -# safe_chunks=False, -# compute=compute, -# encoding=_generate_encodings(), -# **kwargs, -# ) -# return ds + return Dataset(variables=self._variables, metadata=var_meta_dict) diff --git a/tests/unit/v1/test_dataset_builder_add_coordinate.py b/tests/unit/v1/test_dataset_builder_add_coordinate.py index e6fa4bcf1..0adb9240b 100644 --- a/tests/unit/v1/test_dataset_builder_add_coordinate.py +++ b/tests/unit/v1/test_dataset_builder_add_coordinate.py @@ -27,17 +27,24 @@ def test_add_coordinate() -> None: builder.add_dimension("inline", 100) builder.add_dimension("crossline", 100) + # Validate required parameters bad_name = None with pytest.raises(ValueError, match="'name' must be a non-empty string"): builder.add_coordinate(bad_name, dimensions=["speed"]) with pytest.raises(ValueError, match="'name' must be a non-empty string"): builder.add_coordinate("", dimensions=["speed"]) with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): - builder.add_coordinate("amplitude", dimensions=None) + builder.add_coordinate("cdp-x", dimensions=None) with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): - builder.add_coordinate("amplitude", dimensions=[]) + builder.add_coordinate("cdp-x", dimensions=[]) - builder.add_coordinate("cdp", dimensions=["inline", "crossline"]) + # Add a variable using non-existent dimensions + msg="Pre-existing dimension named 'xline' is not found" + with pytest.raises(ValueError, match=msg): + builder.add_coordinate("bad_cdp-x", dimensions=["inline", "xline"]) + + # Validate state transition + builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"]) assert builder._state == _BuilderState.HAS_COORDINATES assert len(builder._dimensions) == 2 # 2 variables for dimensions, 1 variable for coordinates @@ -45,16 +52,18 @@ def test_add_coordinate() -> None: assert len(builder._coordinates) == 1 # Validate that we created a coordinate variable - var_cdp = next(e for e in builder._variables if e.name == "cdp") + var_cdp = next(e for e in builder._variables if e.name == "cdp-x") assert var_cdp is not None - assert len(var_cdp.dimensions) == 2 + # Validate that dimensions are stored as names + assert set(var_cdp.dimensions) == {"inline", "crossline"} + # Validate that coordinates are stored as Coordinate assert len(var_cdp.coordinates) == 1 - assert next(e for e in var_cdp.coordinates if e.name == "cdp") is not None + assert next((e for e in var_cdp.coordinates if e.name == "cdp-x"), None) is not None # Adding coordinate with the same name twice msg="Adding coordinate with the same name twice is not allowed" with pytest.raises(ValueError, match=msg): - builder.add_coordinate("cdp", dimensions=["inline", "crossline"]) + builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"]) def test_add_coordinate_with_defaults() -> None: """Test adding coordinates with default arguments.""" @@ -97,7 +106,7 @@ def test_coordinate_with_units() -> None: assert crd0.long_name is None # Default value assert crd0.data_type == ScalarType.FLOAT32 # Default value assert crd0.metadata.attributes is None - assert crd0.metadata.units_v1.length == "ft" + assert crd0.metadata.units_v1.length == LengthUnitEnum.FOOT def test_coordinate_with_attributes() -> None: @@ -151,5 +160,5 @@ def test_coordinate_with_full_metadata() -> None: assert crd0.data_type == ScalarType.FLOAT32 # Default value assert crd0.metadata.attributes["MGA"] == 51 assert crd0.metadata.attributes["UnitSystem"] == "Imperial" - assert crd0.metadata.units_v1.length == "ft" + assert crd0.metadata.units_v1.length == LengthUnitEnum.FOOT diff --git a/tests/unit/v1/test_dataset_builder_add_dimension.py b/tests/unit/v1/test_dataset_builder_add_dimension.py index a6a12e85f..1465a8925 100644 --- a/tests/unit/v1/test_dataset_builder_add_dimension.py +++ b/tests/unit/v1/test_dataset_builder_add_dimension.py @@ -8,12 +8,12 @@ from mdio.schemas.chunk_grid import RegularChunkGrid from mdio.schemas.chunk_grid import RegularChunkShape -from mdio.schemas.dimension import NamedDimension from mdio.schemas.dtype import ScalarType from mdio.schemas.metadata import ChunkGridMetadata from mdio.schemas.metadata import UserAttributes from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder from mdio.schemas.v1.dataset_builder import _BuilderState +from mdio.schemas.v1.dataset_builder import _get_dimension from mdio.schemas.v1.stats import CenteredBinHistogram from mdio.schemas.v1.stats import StatisticsMetadata from mdio.schemas.v1.stats import SummaryStatistics @@ -27,6 +27,7 @@ def test_add_dimension() -> None: builder = MDIODatasetBuilder("test_dataset") assert builder._state == _BuilderState.INITIAL + # Validate required parameters bad_name = None with pytest.raises(ValueError, match="'name' must be a non-empty string"): builder.add_dimension(bad_name, 200) @@ -36,14 +37,29 @@ def test_add_dimension() -> None: # First dimension should change state to HAS_DIMENSIONS and create a variable builder.add_dimension("x", 100) assert builder._state == _BuilderState.HAS_DIMENSIONS - assert len(builder._dimensions) == 1 - assert builder._dimensions[0] == NamedDimension(name="x", size=100) - assert len(builder._variables) == 1 + assert len(builder._dimensions) == 1 + assert _get_dimension(builder._dimensions, "x", 100) is not None - # Validate that we created a dimension variable properly + # Validate that we have created a dimension variable and + # that variable has the embedded NamedDimension + assert len(builder._variables) == 1 var_x = next(e for e in builder._variables if e.name == "x") assert var_x is not None assert len(var_x.dimensions) == 1 + # Validate that the dimension variable has the NamedDimension + assert _get_dimension(var_x.dimensions, "x", 100) is not None + assert var_x.long_name == "'x' dimension variable" + assert var_x.data_type == ScalarType.INT32 + assert var_x.compressor is None + assert var_x.coordinates is None + assert var_x.metadata is None + + # Validate that we can't add a dimension with the same name twice + with pytest.raises( + ValueError, + match="Adding dimension with the same name twice is not allowed", + ): + builder.add_dimension("x", 200) # Adding dimension with the same name twice msg="Adding dimension with the same name twice is not allowed" @@ -58,15 +74,16 @@ def test_add_dimension_with_defaults() -> None: builder.add_dimension("x", 100) assert builder._state == _BuilderState.HAS_DIMENSIONS assert len(builder._dimensions) == 1 - assert builder._dimensions[0] == NamedDimension(name="x", size=100) - assert len(builder._variables) == 1 - var0 = builder._variables[0] - assert var0.name == "x" - assert var0.long_name is None - assert var0.data_type == ScalarType.INT32 - assert var0.compressor is None - assert var0.coordinates is None - assert var0.metadata is None + # Validate that the dimension builder has the NamedDimension + assert _get_dimension(builder._dimensions, "x", 100) is not None + var_x = next((e for e in builder._variables if e.name == "x"), None) + assert var_x is not None + assert var_x.name == "x" + assert var_x.long_name == "'x' dimension variable" + assert var_x.data_type == ScalarType.INT32 + assert var_x.compressor is None + assert var_x.coordinates is None + assert var_x.metadata is None def test_add_dimension_with_units() -> None: """Test adding dimensions with units.""" @@ -82,17 +99,16 @@ def test_add_dimension_with_units() -> None: assert len(builder._variables) == 1 var0 = builder._variables[0] assert var0.name == "length" - assert var0.long_name is None + assert var0.long_name == "'length' dimension variable" assert var0.data_type == ScalarType.FLOAT64 assert var0.compressor is None assert var0.coordinates is None - assert var0.metadata.units_v1.length == "ft" + assert var0.metadata.units_v1.length == LengthUnitEnum.FOOT def test_add_dimension_with_attributes() -> None: """Test adding dimensions with attributes.""" builder = MDIODatasetBuilder("test_dataset") - # Add dimension with strongly-typed attribute list builder.add_dimension( "length", size=100, @@ -111,7 +127,6 @@ def test_add_dimension_with_chunk_grid() -> None: """Test adding dimensions with chunk grid.""" builder = MDIODatasetBuilder("test_dataset") - # Add dimension with strongly-typed chunk grid grid_definition = RegularChunkGrid(configuration=RegularChunkShape(chunk_shape=[20])) builder.add_dimension( "length", @@ -131,7 +146,6 @@ def test_add_dimension_with_stats() -> None: """Test adding dimensions with stats.""" builder = MDIODatasetBuilder("test_dataset") - # Add dimension with strongly-typed stats builder.add_dimension( "depth", size=100, @@ -162,8 +176,6 @@ def test_add_dimension_with_full_metadata() -> None: """Test adding dimensions with all metadata.""" builder = MDIODatasetBuilder("test_dataset") - - # Add dimension with all strongly-typed metadata builder.add_dimension( "length", size=100, @@ -191,9 +203,9 @@ def test_add_dimension_with_full_metadata() -> None: var0 = builder._variables[0] assert var0.name == "length" assert var0.data_type == ScalarType.FLOAT32 - assert var0.metadata.units_v1.length == "ft" - assert var0.metadata.attributes["MGA"] == 51 - assert var0.metadata.attributes["UnitSystem"] == "Imperial" + assert var0.metadata.units_v1.length == LengthUnitEnum.FOOT + assert var0.metadata.attributes["MGA"] == 51 + assert var0.metadata.attributes["UnitSystem"] == "Imperial" assert var0.metadata.chunk_grid.name == "regular" assert var0.metadata.chunk_grid.configuration.chunk_shape == [20] assert var0.metadata.stats_v1.count == 100 diff --git a/tests/unit/v1/test_dataset_builder_add_variable.py b/tests/unit/v1/test_dataset_builder_add_variable.py index 1181e10d7..ca6d8f955 100644 --- a/tests/unit/v1/test_dataset_builder_add_variable.py +++ b/tests/unit/v1/test_dataset_builder_add_variable.py @@ -36,15 +36,21 @@ def test_add_variable() -> None: builder.add_dimension("crossline", 100) builder.add_dimension("depth", 100) + # Validate required parameters bad_name = None with pytest.raises(ValueError, match="'name' must be a non-empty string"): builder.add_variable(bad_name, dimensions=["speed"]) with pytest.raises(ValueError, match="'name' must be a non-empty string"): builder.add_variable("", dimensions=["speed"]) with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): - builder.add_variable("amplitude", dimensions=None) + builder.add_variable("bad_amplitude", dimensions=None) with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): - builder.add_variable("amplitude", dimensions=[]) + builder.add_variable("bad_amplitude", dimensions=[]) + + # Add a variable using non-existent dimensions + msg="Pre-existing dimension named 'xline' is not found" + with pytest.raises(ValueError, match=msg): + builder.add_variable("bad_amplitude", dimensions=["inline", "xline", "depth"]) builder.add_variable("amplitude", dimensions=["inline", "crossline", "depth"]) assert builder._state == _BuilderState.HAS_VARIABLES @@ -52,10 +58,21 @@ def test_add_variable() -> None: assert len(builder._variables) == 4 assert len(builder._coordinates) == 0 + # Add a variable using non-existent coordinates + msg="Pre-existing coordinate named 'cdp-x' is not found" + with pytest.raises(ValueError, match=msg): + builder.add_variable("bad_amplitude", + dimensions=["inline", "crossline", "depth"], + coordinates=["cdp-x", "cdp-y"]) + + builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"]) + builder.add_coordinate("cdp-y", dimensions=["inline", "crossline"]) + # Adding variable with the same name twice msg="Adding variable with the same name twice is not allowed" with pytest.raises(ValueError, match=msg): - builder.add_variable("amplitude", dimensions=["inline", "crossline", "depth"]) + builder.add_variable("amplitude", + dimensions=["inline", "crossline", "depth"]) def test_add_variable_with_defaults() -> None: @@ -92,7 +109,7 @@ def test_add_variable_full_parameters() -> None: dimensions=["inline", "crossline", "depth"], data_type=ScalarType.FLOAT64, compressor=Blosc(algorithm="zstd"), - coordinates=["inline", "crossline", "depth", "cdp-x", "cdp-y"], + coordinates=["cdp-x", "cdp-y"], metadata_info=[ AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)), UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}), @@ -124,10 +141,10 @@ def test_add_variable_full_parameters() -> None: assert isinstance(v.compressor, Blosc) assert v.compressor.algorithm == "zstd" # NOTE: add_variable() stores coordinates as names - assert set(v.coordinates) == {"inline", "crossline", "depth", "cdp-x", "cdp-y"} + assert set(v.coordinates) == {"cdp-x", "cdp-y"} assert v.metadata.stats_v1.count == 100 assert isinstance(v.metadata, VariableMetadata) - assert v.metadata.units_v1.length == "ft" + assert v.metadata.units_v1.length == LengthUnitEnum.FOOT assert v.metadata.attributes["MGA"] == 51 assert v.metadata.attributes["UnitSystem"] == "Imperial" assert v.metadata.chunk_grid.name == "regular" diff --git a/tests/unit/v1/test_dataset_builder_build.py b/tests/unit/v1/test_dataset_builder_build.py index 64dfead0c..488a9e6d2 100644 --- a/tests/unit/v1/test_dataset_builder_build.py +++ b/tests/unit/v1/test_dataset_builder_build.py @@ -4,39 +4,28 @@ # Thus, disable it for this file """Tests the schema v1 dataset_builder.add_coordinate() public API.""" -from datetime import UTC, datetime -import json -import os -from pathlib import Path -import pytest - -from mdio.schemas import builder -from mdio.schemas.chunk_grid import RegularChunkGrid, RegularChunkShape + +from mdio.schemas.chunk_grid import RegularChunkGrid +from mdio.schemas.chunk_grid import RegularChunkShape from mdio.schemas.compressors import Blosc -from mdio.schemas.dtype import ScalarType, StructuredType -from mdio.schemas.metadata import ChunkGridMetadata, UserAttributes -from mdio.schemas.v1.dataset import Dataset, DatasetInfo, DatasetMetadata +from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredType +from mdio.schemas.metadata import ChunkGridMetadata +from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.dataset import Dataset from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder -from mdio.schemas.v1.dataset_builder import _BuilderState -from mdio.schemas.v1.stats import CenteredBinHistogram, StatisticsMetadata, SummaryStatistics -from mdio.schemas.v1.units import AllUnits, SpeedUnitEnum, SpeedUnitModel +from mdio.schemas.v1.dataset_builder import _get_dimension +from mdio.schemas.v1.stats import CenteredBinHistogram +from mdio.schemas.v1.stats import StatisticsMetadata +from mdio.schemas.v1.stats import SummaryStatistics +from mdio.schemas.v1.units import AllUnits from mdio.schemas.v1.units import LengthUnitEnum from mdio.schemas.v1.units import LengthUnitModel -from mdio.schemas.v1.variable import VariableMetadata +from mdio.schemas.v1.units import SpeedUnitEnum +from mdio.schemas.v1.units import SpeedUnitModel def test_build() -> None: - """Test adding coordinates. Check the state transition and validate required parameters.""" - builder = MDIODatasetBuilder("test_dataset") - assert builder._state == _BuilderState.INITIAL - - builder.add_dimension("x", 100) - builder.add_dimension("y", 100) - - builder.build() - - -def test_build_dataset() -> None: """Test building a complete dataset.""" dataset = ( MDIODatasetBuilder("test_dataset") @@ -58,21 +47,9 @@ def test_build_dataset() -> None: assert var_data.long_name == "Test Data" assert len(var_data.dimensions) == 2 -# def test_build_dataset_bad_example() -> None: -# builder = MDIODatasetBuilder("Bad example") -# builder.add_dimension("inline", 256) -# builder.add_dimension("crossline", 512) -# builder.add_dimension("depth", 384) -# builder.add_variable(name="image", dimensions=["inline", "crossline", "depth"]) -# dataset = builder.build() - -# json_str = dataset.model_dump_json() -# file_path = os.path.join(os.path.dirname(__file__), "bad_example.json") -# with open(file_path, 'w') as f: -# f.write(json_str) - -def test_build_campos_3d(tmp_path: Path) -> None: - """Test building a toy dataset with multiple variables and attributes.""" + +def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50) + """Test building a Campos 3D dataset with multiple variables and attributes.""" dataset = make_campos_3d_dataset() # Verify dataset structure @@ -83,37 +60,74 @@ def test_build_campos_3d(tmp_path: Path) -> None: # Verify variables (including dimension variables) # 3 dimension variables + 4 data variables + 2 coordinate variables - assert len(dataset.variables) == 9 # noqa: PLR2004 + assert len(dataset.variables) == 9 # Verify dimension variables inline_var = next(v for v in dataset.variables if v.name == "inline") assert inline_var.data_type == ScalarType.UINT32 - assert len(inline_var.dimensions) == 1 - assert inline_var.dimensions[0].name == "inline" + # Dimension variables store dimensions as NamedDimension + assert _get_dimension(inline_var.dimensions, "inline", 256) + + crossline_var = next(v for v in dataset.variables if v.name == "crossline") + assert crossline_var.data_type == ScalarType.UINT32 + # Dimension variables store dimensions as NamedDimension + assert _get_dimension(crossline_var.dimensions, "crossline", 512) depth_var = next(v for v in dataset.variables if v.name == "depth") assert depth_var.data_type == ScalarType.UINT32 - assert depth_var.metadata.units_v1.length == "m" + # Dimension variables store dimensions as NamedDimension + assert _get_dimension(depth_var.dimensions, "depth", 384) + assert depth_var.metadata.units_v1.length == LengthUnitEnum.METER + + # Verify coordinate variables + cdp_x = next(v for v in dataset.variables if v.name == "cdp-x") + assert cdp_x.data_type == ScalarType.FLOAT32 + # Coordinates variables store dimensions as names + assert set(cdp_x.dimensions) == {"inline", "crossline"} + assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER + + cdp_y = next(v for v in dataset.variables if v.name == "cdp-y") + assert cdp_y.data_type == ScalarType.FLOAT32 + # Coordinates variables store dimensions as names + assert set(cdp_y.dimensions) == {"inline", "crossline"} + assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER # Verify image variable image = next(v for v in dataset.variables if v.name == "image") + assert set(image.dimensions) == {"inline", "crossline", "depth"} assert image.data_type == ScalarType.FLOAT32 assert isinstance(image.compressor, Blosc) assert image.compressor.algorithm == "zstd" + # Other variables store dimensions as names + assert set(image.coordinates) == {"cdp-x", "cdp-y"} + assert isinstance(image.metadata.chunk_grid, RegularChunkGrid) + assert image.metadata.chunk_grid.configuration.chunk_shape == [128, 128, 128] + assert isinstance(image.metadata.stats_v1, SummaryStatistics) assert image.metadata.stats_v1.count == 100 # Verify velocity variable velocity = next(v for v in dataset.variables if v.name == "velocity") + assert set(velocity.dimensions) == {"inline", "crossline", "depth"} assert velocity.data_type == ScalarType.FLOAT16 assert velocity.compressor is None - assert velocity.metadata.units_v1.speed == "m/s" + # Other variables store dimensions as names + assert set(velocity.coordinates) == {"cdp-x", "cdp-y"} + assert isinstance(velocity.metadata.chunk_grid, RegularChunkGrid) + assert velocity.metadata.chunk_grid.configuration.chunk_shape == [128, 128, 128] + assert isinstance(velocity.metadata.units_v1, SpeedUnitModel) + assert velocity.metadata.units_v1.speed == SpeedUnitEnum.METER_PER_SECOND # Verify image_inline variable image_inline = next( v for v in dataset.variables if v.name == "image_inline") assert image_inline.long_name == "inline optimized version of 3d_stack" + assert set(image_inline.dimensions) == {"inline", "crossline", "depth"} + assert image_inline.data_type == ScalarType.FLOAT32 assert isinstance(image_inline.compressor, Blosc) assert image_inline.compressor.algorithm == "zstd" + assert set(image_inline.coordinates) == {"cdp-x", "cdp-y"} + assert isinstance(image_inline.metadata.chunk_grid, RegularChunkGrid) + assert image_inline.metadata.chunk_grid.configuration.chunk_shape == [4, 512, 512] # Verify image_headers variable headers = next(v for v in dataset.variables if v.name == "image_headers") @@ -121,36 +135,8 @@ def test_build_campos_3d(tmp_path: Path) -> None: assert len(headers.data_type.fields) == 4 assert headers.data_type.fields[0].name == "cdp-x" -# def test_build_campos_3d_contract(tmp_path: Path) -> None: -# '''Test building campos_3d dataset and converting to JSON schema format.''' -# dataset = make_campos_3d_dataset() -# # json_str = dataset.model_dump_json() -# # json_sorted_str = json.dumps(json.loads(json_str), sort_keys=True) -# m_dict = dataset.model_dump(mode="json", by_alias=True) -# json_sorted_str = json.dumps(m_dict, sort_keys=True) - -# sorted_contract = load_campos_3d_contract() - -# save(json_sorted_str, sorted_contract) - -# def save(model: str, contract: str) -> None: -# model_file_path = os.path.join(os.path.dirname(__file__), "campos_3d_model.json") -# contract_file_path = os.path.join(os.path.dirname(__file__), "campos_3d_contract.json") -# with open(model_file_path, 'w') as f: -# f.write(model) -# with open(contract_file_path, 'w') as f: -# f.write(contract) - -# def load_campos_3d_contract(): -# file_path = os.path.join(os.path.dirname(__file__), 'test_data/campos_3d_contract.json') -# with open(file_path, 'r') as f: -# contract = json.load(f) -# assert contract is not None -# return json.dumps(contract, sort_keys=True) - def make_campos_3d_dataset() -> Dataset: """Create in-memory campos_3d dataset.""" - ds = MDIODatasetBuilder( "campos_3d", attributes=UserAttributes(attributes={ @@ -181,7 +167,6 @@ def make_campos_3d_dataset() -> Dataset: dimensions=["inline", "crossline"], metadata_info=[ AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))] - # metadata={"unitsV1": {"length": "m"}}, ) # Add image variable ds.add_variable( @@ -189,7 +174,7 @@ def make_campos_3d_dataset() -> Dataset: dimensions=["inline", "crossline", "depth"], data_type=ScalarType.FLOAT32, compressor=Blosc(algorithm="zstd"), - coordinates=["inline", "crossline", "depth", "cdp-x", "cdp-y"], + coordinates=["cdp-x", "cdp-y"], metadata_info=[ ChunkGridMetadata( chunk_grid=RegularChunkGrid( @@ -214,7 +199,7 @@ def make_campos_3d_dataset() -> Dataset: name="velocity", dimensions=["inline", "crossline", "depth"], data_type=ScalarType.FLOAT16, - coordinates=["inline", "crossline", "depth", "cdp-x", "cdp-y"], + coordinates=["cdp-x", "cdp-y"], metadata_info=[ ChunkGridMetadata( chunk_grid=RegularChunkGrid( @@ -231,7 +216,7 @@ def make_campos_3d_dataset() -> Dataset: dimensions=["inline", "crossline", "depth"], data_type=ScalarType.FLOAT32, compressor=Blosc(algorithm="zstd"), - coordinates=["inline", "crossline", "depth", "cdp-x", "cdp-y"], + coordinates=["cdp-x", "cdp-y"], metadata_info=[ ChunkGridMetadata( chunk_grid=RegularChunkGrid( @@ -250,6 +235,6 @@ def make_campos_3d_dataset() -> Dataset: {"name": "some_scalar", "format": ScalarType.FLOAT16}, ] ), - coordinates=["inline", "crossline", "cdp-x", "cdp-y"], + coordinates=["cdp-x", "cdp-y"], ) return ds.build() diff --git a/tests/unit/v1/test_dataset_builder_helpers.py b/tests/unit/v1/test_dataset_builder_helpers.py index e6bfda71f..6fbba42a5 100644 --- a/tests/unit/v1/test_dataset_builder_helpers.py +++ b/tests/unit/v1/test_dataset_builder_helpers.py @@ -1,6 +1,6 @@ -# ruff: noqa: PLR2004 +# ruff: noqa: PLR2004 # PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable -# The above erroneous warning is generated for every numerical assert. +# The above erroneous warning is generated for every numerical assert. # Thus, disable it for this file """Tests the schema v1 dataset_builder internal methods.""" @@ -10,265 +10,87 @@ import pytest from pydantic import Field -from mdio.schemas.chunk_grid import RegularChunkGrid -from mdio.schemas.chunk_grid import RegularChunkShape from mdio.schemas.core import StrictModel from mdio.schemas.dimension import NamedDimension -from mdio.schemas.metadata import ChunkGridMetadata -from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder +from mdio.schemas.v1.dataset_builder import _get_dimension from mdio.schemas.v1.dataset_builder import _to_dictionary -from mdio.schemas.v1.dataset_builder import contains_dimension -from mdio.schemas.v1.dataset_builder import get_dimension -from mdio.schemas.v1.dataset_builder import get_dimension_names -from mdio.schemas.v1.stats import CenteredBinHistogram -from mdio.schemas.v1.stats import StatisticsMetadata -from mdio.schemas.v1.stats import SummaryStatistics -from mdio.schemas.v1.units import LengthUnitEnum -from mdio.schemas.v1.units import LengthUnitModel -from mdio.schemas.v1.variable import AllUnits -from mdio.schemas.v1.variable import CoordinateMetadata -from mdio.schemas.v1.variable import UserAttributes -from mdio.schemas.v1.variable import VariableMetadata -def test__get_dimension_by_name() -> None: +def test__get_dimension() -> None: """Test getting a dimension by name from the list of dimensions.""" - dimensions = [NamedDimension(name="inline", size=2), NamedDimension(name="crossline", size=3)] + dimensions = [NamedDimension(name="inline", size=2), NamedDimension( + name="crossline", size=3)] - assert get_dimension([], "inline") is None - assert get_dimension(dimensions, "inline") == NamedDimension(name="inline", size=2) - assert get_dimension(dimensions, "crossline") == NamedDimension(name="crossline", size=3) - assert get_dimension(dimensions, "time") is None + assert _get_dimension([], "inline") is None + assert _get_dimension(dimensions, "inline") == NamedDimension( + name="inline", size=2) + assert _get_dimension(dimensions, "crossline") == NamedDimension( + name="crossline", size=3) + assert _get_dimension(dimensions, "time") is None with pytest.raises(TypeError, match="Expected str, got NoneType"): - get_dimension(dimensions, None) + _get_dimension(dimensions, None) with pytest.raises(TypeError, match="Expected str, got int"): - get_dimension(dimensions, 42) + _get_dimension(dimensions, 42) with pytest.raises( ValueError, match="Dimension 'inline' found but size 2 does not match expected size 200" ): - get_dimension(dimensions, "inline", size=200) + _get_dimension(dimensions, "inline", size=200) -def test__contains_dimension() -> None: - """Test if a dimension with a given name exists in the list of dimensions.""" - dimensions = [NamedDimension(name="inline", size=2), NamedDimension(name="crossline", size=3)] - - assert contains_dimension([], "inline") is False - - assert contains_dimension(dimensions, "inline") is True - assert contains_dimension(dimensions, "crossline") is True - assert contains_dimension(dimensions, "time") is False - - with pytest.raises(TypeError, match="Expected str or NamedDimension, got NoneType"): - contains_dimension(dimensions, None) - with pytest.raises(TypeError, match="Expected str or NamedDimension, got int"): - contains_dimension(dimensions, 42) - with pytest.raises( - ValueError, match="Dimension 'inline' found but size 2 does not match expected size 200" - ): - contains_dimension(dimensions, NamedDimension(name="inline", size=200)) - - -def test_get_dimension_names() -> None: - """Test getting a list of dimension names from list[NamedDimension | str].""" - empty_list = get_dimension_names(None) - assert empty_list is not None - assert isinstance(empty_list, list) - assert len(empty_list) == 0 - - empty_list = get_dimension_names([]) - assert empty_list is not None - assert isinstance(empty_list, list) - assert len(empty_list) == 0 - - dim_list = get_dimension_names([ - NamedDimension(name="inline", size=2), - "amplitude", - NamedDimension(name="crossline", size=3) - ]) - assert dim_list is not None - assert isinstance(dim_list, list) - assert set(dim_list) == {"inline", "amplitude", "crossline"} - - -def test_add_dimensions_if_needed() -> None: - """Test adding named dimensions to a dataset.""" - builder = MDIODatasetBuilder("Test Dataset Builder") - # - # Validate initial state - # - assert builder._dimensions is not None - assert len(builder._dimensions) == 0 - - # - # Validate that adding empty dimensions does not change the state - # - added_dims = builder._add_dimensions_if_needed(None) - assert len(builder._dimensions) == 0 - assert len(added_dims) == 0 - added_dims = builder._add_dimensions_if_needed([]) - assert len(builder._dimensions) == 0 - assert len(added_dims) == 0 - added_dims = builder._add_dimensions_if_needed({}) - assert len(builder._dimensions) == 0 - assert len(added_dims) == 0 - - # - # Add named dimensions - # - inline_dim = NamedDimension(name="inline", size=2) - added_dims = builder._add_dimensions_if_needed([inline_dim]) - assert len(builder._dimensions) == 1 - assert len(added_dims) == 1 - assert contains_dimension(added_dims, inline_dim) - - crossline_dim = NamedDimension(name="crossline", size=3) - time_dim = NamedDimension(name="time", size=4) - added_dims = builder._add_dimensions_if_needed([crossline_dim, time_dim]) - assert len(builder._dimensions) == 3 - assert contains_dimension(builder._dimensions, inline_dim) - assert contains_dimension(builder._dimensions, crossline_dim) - assert contains_dimension(builder._dimensions, time_dim) - assert contains_dimension(added_dims, crossline_dim) - assert contains_dimension(added_dims, time_dim) - - # - # Add invalid object type - # - with pytest.raises(TypeError, match="Expected NamedDimension or str, got int"): - builder._add_dimensions_if_needed([42]) - # Assert that the number of dimensions has not increased - assert len(builder._dimensions) == 3 - -def test__add_dimensions_if_one_already_exists() -> None: - """Test adding existing named dimensions to a dataset.""" - builder = MDIODatasetBuilder("Test Dataset Builder") - - inline_dim = NamedDimension(name="inline", size=2) - crossline_dim = NamedDimension(name="crossline", size=3) - time_dim = NamedDimension(name="time", size=4) - # - # Add dimensions with the same names again does nothing - # (make sure we are passing different instances) - # - inline_dim2 = NamedDimension(name=inline_dim.name, size=inline_dim.size) - crossline_dim2 = NamedDimension(name=crossline_dim.name, size=crossline_dim.size) - time_dim2 = NamedDimension(name=time_dim.name, size=time_dim.size) - builder._add_dimensions_if_needed([inline_dim2, crossline_dim2, time_dim2]) - added_dims = builder._add_dimensions_if_needed([inline_dim2, crossline_dim2, time_dim2]) - # Validate that the dimensions and variables are not duplicated - assert len(builder._dimensions) == 3 - assert contains_dimension(builder._dimensions, inline_dim) - assert contains_dimension(builder._dimensions, crossline_dim) - assert contains_dimension(builder._dimensions, time_dim) - assert len(added_dims) == 0 - - # Add dimensions with the same name, but different size again - with pytest.raises( - ValueError, match="Dimension 'inline' found but size 2 does not match expected size 200" - ): - builder._add_dimensions_if_needed([NamedDimension(name="inline", size=200)]) - # Assert that the number of dimensions has not increased - assert len(builder._dimensions) == 3 - - # - # Add existing dimension using its name - # - added_dims = builder._add_dimensions_if_needed(["inline", "crossline"]) - assert len(builder._dimensions) == 3 - assert contains_dimension(builder._dimensions, inline_dim) - assert contains_dimension(builder._dimensions, crossline_dim) - assert contains_dimension(builder._dimensions, time_dim) - assert len(added_dims) == 0 - - # - # Add non-existing dimension using its name is not allowed - # - with pytest.raises(ValueError, match="Pre-existing dimension named 'offset' is not found"): - builder._add_dimensions_if_needed(["offset"]) - assert len(builder._dimensions) == 3 - assert contains_dimension(builder._dimensions, inline_dim) - assert contains_dimension(builder._dimensions, crossline_dim) - assert contains_dimension(builder._dimensions, time_dim) - def test__to_dictionary() -> None: - """Test converting a BaseModel to a dictionary.""" + """Test converting a dictionary, list or pydantic BaseModel to a dictionary.""" + # Validate inputs with pytest.raises(TypeError, match="Expected BaseModel, dict or list, got datetime"): - # This should raise an error because datetime is not a BaseModel _to_dictionary(datetime.now(UTC)) + # Convert None to None + result = _to_dictionary(None) + assert result is None + + # Validate conversion of a Pydantic BaseModel class SomeModel(StrictModel): count: int = Field(default=None, description="Samples count") - samples: list[float] = Field(default_factory=list, description="Samples.") + samples: list[float] = Field( + default_factory=list, description="Samples.") created: datetime = Field( default_factory=datetime.now, description="Creation time with TZ info." ) - - m = SomeModel(count=3, - samples=[1.0, 2.0, 3.0], - created=datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC)) - result = _to_dictionary(m) + md = SomeModel(count=3, + samples=[1.0, 2.0, 3.0], + created=datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC)) + result = _to_dictionary(md) assert isinstance(result, dict) - assert result == {"count": 3, "created": "2023-10-01T12:00:00Z", "samples": [1.0, 2.0, 3.0]} + assert result == { + "count": 3, "created": "2023-10-01T12:00:00Z", "samples": [1.0, 2.0, 3.0]} - d = { + # Validate conversion of a dictionary + dct = { "count": 3, "samples": [1.0, 2.0, 3.0], "created": datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC)} - result = _to_dictionary(m) + result = _to_dictionary(dct) assert isinstance(result, dict) - assert result == {"count": 3, "created": "2023-10-01T12:00:00Z", "samples": [1.0, 2.0, 3.0]} - - -# def test__make_coordinate_metadata() -> None: -# """Test creating VariableMetadata from a strongly-typed list of AllUnits or UserAttributes.""" -# units = AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)) -# attrs = UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}) -# meta_list = [units, attrs] - -# # Assume that multiple attributes are allowed -# metadata = _make_coordinate_metadata(meta_list) -# assert isinstance(metadata, CoordinateMetadata) -# assert metadata.units_v1.length == "ft" -# assert metadata.attributes["MGA"] == 51 -# assert metadata.attributes["UnitSystem"] == "Imperial" - -# meta_list = ["ft"] -# with pytest.raises(TypeError, match="Expected BaseModel, dict or list, got str"): -# _make_variable_metadata(meta_list) - -# def test__make_variable_metadata() -> None: -# """Test creating VariableMetadata from a strongly-typed list of AllUnits or UserAttributes.""" -# units = AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)) -# attrs = UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}) -# chgrd = ChunkGridMetadata( -# chunk_grid=RegularChunkGrid( -# configuration=RegularChunkShape(chunk_shape=[20]))) -# stats = StatisticsMetadata( -# stats_v1=SummaryStatistics( -# count=100, -# sum=1215.1, -# sumSquares=125.12, -# min=5.61, -# max=10.84, -# histogram=CenteredBinHistogram(binCenters=[1, 2], counts=[10, 15]))) -# metadata_info = [units, attrs, chgrd, stats] -# metadata = _make_variable_metadata(metadata_info) -# assert isinstance(metadata, VariableMetadata) -# assert metadata.units_v1.length == "ft" -# assert metadata.attributes["MGA"] == 51 -# assert metadata.attributes["UnitSystem"] == "Imperial" -# assert metadata.chunk_grid.name == "regular" -# assert metadata.chunk_grid.configuration.chunk_shape == [20] -# assert metadata.stats_v1.count == 100 -# assert metadata.stats_v1.sum == 1215.1 -# assert metadata.stats_v1.sum_squares == 125.12 -# assert metadata.stats_v1.min == 5.61 -# assert metadata.stats_v1.max == 10.84 -# assert metadata.stats_v1.histogram.bin_centers == [1, 2] -# assert metadata.stats_v1.histogram.counts == [10, 15] - -# meta_list = ["ft"] -# with pytest.raises(TypeError, match="Expected BaseModel, dict or list, got str"): -# _make_variable_metadata(meta_list) + assert result == {"count": 3, + "samples": [1.0, 2.0, 3.0], + "created": datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC), } + + # Validate conversion of a dictionary + lst = [None, + SomeModel(count=3, + samples=[1.0, 2.0, 3.0], + created=datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC)), + { + "count2": 3, + "samples2": [1.0, 2.0, 3.0], + "created2": datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC) + }] + result = _to_dictionary(lst) + assert isinstance(result, dict) + assert result == {"count": 3, + "samples": [1.0, 2.0, 3.0], + "created": "2023-10-01T12:00:00Z", + "count2": 3, + "samples2": [1.0, 2.0, 3.0], + "created2": datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC) + } From 4062a770be50a16db4a5c2adc4185eea2454b854 Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Mon, 7 Jul 2025 09:12:28 -0500 Subject: [PATCH 25/56] unpin zarr because breaking bug fixed (#569) --- pyproject.toml | 2 +- uv.lock | 391 +++++++++++++++++++++++++------------------------ 2 files changed, 202 insertions(+), 191 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a9e14605e..e2f72190f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,7 +35,7 @@ dependencies = [ "segy (>=0.4.1.post2,<0.5.0)", "tqdm (>=4.67.1,<5.0.0)", "xarray>=2025.6.1", - "zarr (>=3.0.8,<3.0.9)", + "zarr (>=3.0.10,<4.0.0)", ] [project.optional-dependencies] diff --git a/uv.lock b/uv.lock index 964a1c2d4..6f04c3630 100644 --- a/uv.lock +++ b/uv.lock @@ -130,14 +130,15 @@ wheels = [ [[package]] name = "aiosignal" -version = "1.3.2" +version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "frozenlist" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/b5/6d55e80f6d8a08ce22b982eafa278d823b541c925f11ee774b0b9c43473d/aiosignal-1.3.2.tar.gz", hash = "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54", size = 19424 } +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/6a/bc7e17a3e87a2985d3e8f4da4cd0f481060eb78fb08596c42be62c90a4d9/aiosignal-1.3.2-py2.py3-none-any.whl", hash = "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", size = 7597 }, + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490 }, ] [[package]] @@ -201,16 +202,16 @@ wheels = [ [[package]] name = "azure-core" -version = "1.34.0" +version = "1.35.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "requests" }, { name = "six" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/29/ff7a519a315e41c85bab92a7478c6acd1cf0b14353139a08caee4c691f77/azure_core-1.34.0.tar.gz", hash = "sha256:bdb544989f246a0ad1c85d72eeb45f2f835afdcbc5b45e43f0dbde7461c81ece", size = 297999 } +sdist = { url = "https://files.pythonhosted.org/packages/ce/89/f53968635b1b2e53e4aad2dd641488929fef4ca9dfb0b97927fa7697ddf3/azure_core-1.35.0.tar.gz", hash = "sha256:c0be528489485e9ede59b6971eb63c1eaacf83ef53001bfe3904e475e972be5c", size = 339689 } wheels = [ - { url = "https://files.pythonhosted.org/packages/84/9e/5c87b49f65bb16571599bc789857d0ded2f53014d3392bc88a5d1f3ad779/azure_core-1.34.0-py3-none-any.whl", hash = "sha256:0615d3b756beccdb6624d1c0ae97284f38b78fb59a2a9839bf927c66fbbdddd6", size = 207409 }, + { url = "https://files.pythonhosted.org/packages/d4/78/bf94897361fdd650850f0f2e405b2293e2f12808239046232bdedf554301/azure_core-1.35.0-py3-none-any.whl", hash = "sha256:8db78c72868a58f3de8991eb4d22c4d368fae226dac1002998d6c50437e7dad1", size = 210708 }, ] [[package]] @@ -547,56 +548,56 @@ wheels = [ [[package]] name = "coverage" -version = "7.9.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/e0/98670a80884f64578f0c22cd70c5e81a6e07b08167721c7487b4d70a7ca0/coverage-7.9.1.tar.gz", hash = "sha256:6cf43c78c4282708a28e466316935ec7489a9c487518a77fa68f716c67909cec", size = 813650 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/60/34/fa69372a07d0903a78ac103422ad34db72281c9fc625eba94ac1185da66f/coverage-7.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:95c765060e65c692da2d2f51a9499c5e9f5cf5453aeaf1420e3fc847cc060582", size = 212146 }, - { url = "https://files.pythonhosted.org/packages/27/f0/da1894915d2767f093f081c42afeba18e760f12fdd7a2f4acbe00564d767/coverage-7.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ba383dc6afd5ec5b7a0d0c23d38895db0e15bcba7fb0fa8901f245267ac30d86", size = 212536 }, - { url = "https://files.pythonhosted.org/packages/10/d5/3fc33b06e41e390f88eef111226a24e4504d216ab8e5d1a7089aa5a3c87a/coverage-7.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37ae0383f13cbdcf1e5e7014489b0d71cc0106458878ccde52e8a12ced4298ed", size = 245092 }, - { url = "https://files.pythonhosted.org/packages/0a/39/7aa901c14977aba637b78e95800edf77f29f5a380d29768c5b66f258305b/coverage-7.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69aa417a030bf11ec46149636314c24c8d60fadb12fc0ee8f10fda0d918c879d", size = 242806 }, - { url = "https://files.pythonhosted.org/packages/43/fc/30e5cfeaf560b1fc1989227adedc11019ce4bb7cce59d65db34fe0c2d963/coverage-7.9.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a4be2a28656afe279b34d4f91c3e26eccf2f85500d4a4ff0b1f8b54bf807338", size = 244610 }, - { url = "https://files.pythonhosted.org/packages/bf/15/cca62b13f39650bc87b2b92bb03bce7f0e79dd0bf2c7529e9fc7393e4d60/coverage-7.9.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:382e7ddd5289f140259b610e5f5c58f713d025cb2f66d0eb17e68d0a94278875", size = 244257 }, - { url = "https://files.pythonhosted.org/packages/cd/1a/c0f2abe92c29e1464dbd0ff9d56cb6c88ae2b9e21becdb38bea31fcb2f6c/coverage-7.9.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e5532482344186c543c37bfad0ee6069e8ae4fc38d073b8bc836fc8f03c9e250", size = 242309 }, - { url = "https://files.pythonhosted.org/packages/57/8d/c6fd70848bd9bf88fa90df2af5636589a8126d2170f3aade21ed53f2b67a/coverage-7.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a39d18b3f50cc121d0ce3838d32d58bd1d15dab89c910358ebefc3665712256c", size = 242898 }, - { url = "https://files.pythonhosted.org/packages/c2/9e/6ca46c7bff4675f09a66fe2797cd1ad6a24f14c9c7c3b3ebe0470a6e30b8/coverage-7.9.1-cp311-cp311-win32.whl", hash = "sha256:dd24bd8d77c98557880def750782df77ab2b6885a18483dc8588792247174b32", size = 214561 }, - { url = "https://files.pythonhosted.org/packages/a1/30/166978c6302010742dabcdc425fa0f938fa5a800908e39aff37a7a876a13/coverage-7.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:6b55ad10a35a21b8015eabddc9ba31eb590f54adc9cd39bcf09ff5349fd52125", size = 215493 }, - { url = "https://files.pythonhosted.org/packages/60/07/a6d2342cd80a5be9f0eeab115bc5ebb3917b4a64c2953534273cf9bc7ae6/coverage-7.9.1-cp311-cp311-win_arm64.whl", hash = "sha256:6ad935f0016be24c0e97fc8c40c465f9c4b85cbbe6eac48934c0dc4d2568321e", size = 213869 }, - { url = "https://files.pythonhosted.org/packages/68/d9/7f66eb0a8f2fce222de7bdc2046ec41cb31fe33fb55a330037833fb88afc/coverage-7.9.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8de12b4b87c20de895f10567639c0797b621b22897b0af3ce4b4e204a743626", size = 212336 }, - { url = "https://files.pythonhosted.org/packages/20/20/e07cb920ef3addf20f052ee3d54906e57407b6aeee3227a9c91eea38a665/coverage-7.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5add197315a054e92cee1b5f686a2bcba60c4c3e66ee3de77ace6c867bdee7cb", size = 212571 }, - { url = "https://files.pythonhosted.org/packages/78/f8/96f155de7e9e248ca9c8ff1a40a521d944ba48bec65352da9be2463745bf/coverage-7.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:600a1d4106fe66f41e5d0136dfbc68fe7200a5cbe85610ddf094f8f22e1b0300", size = 246377 }, - { url = "https://files.pythonhosted.org/packages/3e/cf/1d783bd05b7bca5c10ded5f946068909372e94615a4416afadfe3f63492d/coverage-7.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a876e4c3e5a2a1715a6608906aa5a2e0475b9c0f68343c2ada98110512ab1d8", size = 243394 }, - { url = "https://files.pythonhosted.org/packages/02/dd/e7b20afd35b0a1abea09fb3998e1abc9f9bd953bee548f235aebd2b11401/coverage-7.9.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81f34346dd63010453922c8e628a52ea2d2ccd73cb2487f7700ac531b247c8a5", size = 245586 }, - { url = "https://files.pythonhosted.org/packages/4e/38/b30b0006fea9d617d1cb8e43b1bc9a96af11eff42b87eb8c716cf4d37469/coverage-7.9.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:888f8eee13f2377ce86d44f338968eedec3291876b0b8a7289247ba52cb984cd", size = 245396 }, - { url = "https://files.pythonhosted.org/packages/31/e4/4d8ec1dc826e16791f3daf1b50943e8e7e1eb70e8efa7abb03936ff48418/coverage-7.9.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9969ef1e69b8c8e1e70d591f91bbc37fc9a3621e447525d1602801a24ceda898", size = 243577 }, - { url = "https://files.pythonhosted.org/packages/25/f4/b0e96c5c38e6e40ef465c4bc7f138863e2909c00e54a331da335faf0d81a/coverage-7.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:60c458224331ee3f1a5b472773e4a085cc27a86a0b48205409d364272d67140d", size = 244809 }, - { url = "https://files.pythonhosted.org/packages/8a/65/27e0a1fa5e2e5079bdca4521be2f5dabf516f94e29a0defed35ac2382eb2/coverage-7.9.1-cp312-cp312-win32.whl", hash = "sha256:5f646a99a8c2b3ff4c6a6e081f78fad0dde275cd59f8f49dc4eab2e394332e74", size = 214724 }, - { url = "https://files.pythonhosted.org/packages/9b/a8/d5b128633fd1a5e0401a4160d02fa15986209a9e47717174f99dc2f7166d/coverage-7.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:30f445f85c353090b83e552dcbbdad3ec84c7967e108c3ae54556ca69955563e", size = 215535 }, - { url = "https://files.pythonhosted.org/packages/a3/37/84bba9d2afabc3611f3e4325ee2c6a47cd449b580d4a606b240ce5a6f9bf/coverage-7.9.1-cp312-cp312-win_arm64.whl", hash = "sha256:af41da5dca398d3474129c58cb2b106a5d93bbb196be0d307ac82311ca234342", size = 213904 }, - { url = "https://files.pythonhosted.org/packages/d0/a7/a027970c991ca90f24e968999f7d509332daf6b8c3533d68633930aaebac/coverage-7.9.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:31324f18d5969feef7344a932c32428a2d1a3e50b15a6404e97cba1cc9b2c631", size = 212358 }, - { url = "https://files.pythonhosted.org/packages/f2/48/6aaed3651ae83b231556750280682528fea8ac7f1232834573472d83e459/coverage-7.9.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0c804506d624e8a20fb3108764c52e0eef664e29d21692afa375e0dd98dc384f", size = 212620 }, - { url = "https://files.pythonhosted.org/packages/6c/2a/f4b613f3b44d8b9f144847c89151992b2b6b79cbc506dee89ad0c35f209d/coverage-7.9.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef64c27bc40189f36fcc50c3fb8f16ccda73b6a0b80d9bd6e6ce4cffcd810bbd", size = 245788 }, - { url = "https://files.pythonhosted.org/packages/04/d2/de4fdc03af5e4e035ef420ed26a703c6ad3d7a07aff2e959eb84e3b19ca8/coverage-7.9.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4fe2348cc6ec372e25adec0219ee2334a68d2f5222e0cba9c0d613394e12d86", size = 243001 }, - { url = "https://files.pythonhosted.org/packages/f5/e8/eed18aa5583b0423ab7f04e34659e51101135c41cd1dcb33ac1d7013a6d6/coverage-7.9.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34ed2186fe52fcc24d4561041979a0dec69adae7bce2ae8d1c49eace13e55c43", size = 244985 }, - { url = "https://files.pythonhosted.org/packages/17/f8/ae9e5cce8885728c934eaa58ebfa8281d488ef2afa81c3dbc8ee9e6d80db/coverage-7.9.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:25308bd3d00d5eedd5ae7d4357161f4df743e3c0240fa773ee1b0f75e6c7c0f1", size = 245152 }, - { url = "https://files.pythonhosted.org/packages/5a/c8/272c01ae792bb3af9b30fac14d71d63371db227980682836ec388e2c57c0/coverage-7.9.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73e9439310f65d55a5a1e0564b48e34f5369bee943d72c88378f2d576f5a5751", size = 243123 }, - { url = "https://files.pythonhosted.org/packages/8c/d0/2819a1e3086143c094ab446e3bdf07138527a7b88cb235c488e78150ba7a/coverage-7.9.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37ab6be0859141b53aa89412a82454b482c81cf750de4f29223d52268a86de67", size = 244506 }, - { url = "https://files.pythonhosted.org/packages/8b/4e/9f6117b89152df7b6112f65c7a4ed1f2f5ec8e60c4be8f351d91e7acc848/coverage-7.9.1-cp313-cp313-win32.whl", hash = "sha256:64bdd969456e2d02a8b08aa047a92d269c7ac1f47e0c977675d550c9a0863643", size = 214766 }, - { url = "https://files.pythonhosted.org/packages/27/0f/4b59f7c93b52c2c4ce7387c5a4e135e49891bb3b7408dcc98fe44033bbe0/coverage-7.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:be9e3f68ca9edb897c2184ad0eee815c635565dbe7a0e7e814dc1f7cbab92c0a", size = 215568 }, - { url = "https://files.pythonhosted.org/packages/09/1e/9679826336f8c67b9c39a359352882b24a8a7aee48d4c9cad08d38d7510f/coverage-7.9.1-cp313-cp313-win_arm64.whl", hash = "sha256:1c503289ffef1d5105d91bbb4d62cbe4b14bec4d13ca225f9c73cde9bb46207d", size = 213939 }, - { url = "https://files.pythonhosted.org/packages/bb/5b/5c6b4e7a407359a2e3b27bf9c8a7b658127975def62077d441b93a30dbe8/coverage-7.9.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0b3496922cb5f4215bf5caaef4cf12364a26b0be82e9ed6d050f3352cf2d7ef0", size = 213079 }, - { url = "https://files.pythonhosted.org/packages/a2/22/1e2e07279fd2fd97ae26c01cc2186e2258850e9ec125ae87184225662e89/coverage-7.9.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9565c3ab1c93310569ec0d86b017f128f027cab0b622b7af288696d7ed43a16d", size = 213299 }, - { url = "https://files.pythonhosted.org/packages/14/c0/4c5125a4b69d66b8c85986d3321520f628756cf524af810baab0790c7647/coverage-7.9.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2241ad5dbf79ae1d9c08fe52b36d03ca122fb9ac6bca0f34439e99f8327ac89f", size = 256535 }, - { url = "https://files.pythonhosted.org/packages/81/8b/e36a04889dda9960be4263e95e777e7b46f1bb4fc32202612c130a20c4da/coverage-7.9.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bb5838701ca68b10ebc0937dbd0eb81974bac54447c55cd58dea5bca8451029", size = 252756 }, - { url = "https://files.pythonhosted.org/packages/98/82/be04eff8083a09a4622ecd0e1f31a2c563dbea3ed848069e7b0445043a70/coverage-7.9.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b30a25f814591a8c0c5372c11ac8967f669b97444c47fd794926e175c4047ece", size = 254912 }, - { url = "https://files.pythonhosted.org/packages/0f/25/c26610a2c7f018508a5ab958e5b3202d900422cf7cdca7670b6b8ca4e8df/coverage-7.9.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2d04b16a6062516df97969f1ae7efd0de9c31eb6ebdceaa0d213b21c0ca1a683", size = 256144 }, - { url = "https://files.pythonhosted.org/packages/c5/8b/fb9425c4684066c79e863f1e6e7ecebb49e3a64d9f7f7860ef1688c56f4a/coverage-7.9.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7931b9e249edefb07cd6ae10c702788546341d5fe44db5b6108a25da4dca513f", size = 254257 }, - { url = "https://files.pythonhosted.org/packages/93/df/27b882f54157fc1131e0e215b0da3b8d608d9b8ef79a045280118a8f98fe/coverage-7.9.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:52e92b01041151bf607ee858e5a56c62d4b70f4dac85b8c8cb7fb8a351ab2c10", size = 255094 }, - { url = "https://files.pythonhosted.org/packages/41/5f/cad1c3dbed8b3ee9e16fa832afe365b4e3eeab1fb6edb65ebbf745eabc92/coverage-7.9.1-cp313-cp313t-win32.whl", hash = "sha256:684e2110ed84fd1ca5f40e89aa44adf1729dc85444004111aa01866507adf363", size = 215437 }, - { url = "https://files.pythonhosted.org/packages/99/4d/fad293bf081c0e43331ca745ff63673badc20afea2104b431cdd8c278b4c/coverage-7.9.1-cp313-cp313t-win_amd64.whl", hash = "sha256:437c576979e4db840539674e68c84b3cda82bc824dd138d56bead1435f1cb5d7", size = 216605 }, - { url = "https://files.pythonhosted.org/packages/1f/56/4ee027d5965fc7fc126d7ec1187529cc30cc7d740846e1ecb5e92d31b224/coverage-7.9.1-cp313-cp313t-win_arm64.whl", hash = "sha256:18a0912944d70aaf5f399e350445738a1a20b50fbea788f640751c2ed9208b6c", size = 214392 }, - { url = "https://files.pythonhosted.org/packages/3e/e5/c723545c3fd3204ebde3b4cc4b927dce709d3b6dc577754bb57f63ca4a4a/coverage-7.9.1-pp39.pp310.pp311-none-any.whl", hash = "sha256:db0f04118d1db74db6c9e1cb1898532c7dcc220f1d2718f058601f7c3f499514", size = 204009 }, - { url = "https://files.pythonhosted.org/packages/08/b8/7ddd1e8ba9701dea08ce22029917140e6f66a859427406579fd8d0ca7274/coverage-7.9.1-py3-none-any.whl", hash = "sha256:66b974b145aa189516b6bf2d8423e888b742517d37872f6ee4c5be0073bd9a3c", size = 204000 }, +version = "7.9.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/b7/c0465ca253df10a9e8dae0692a4ae6e9726d245390aaef92360e1d6d3832/coverage-7.9.2.tar.gz", hash = "sha256:997024fa51e3290264ffd7492ec97d0690293ccd2b45a6cd7d82d945a4a80c8b", size = 813556 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/40/916786453bcfafa4c788abee4ccd6f592b5b5eca0cd61a32a4e5a7ef6e02/coverage-7.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a7a56a2964a9687b6aba5b5ced6971af308ef6f79a91043c05dd4ee3ebc3e9ba", size = 212152 }, + { url = "https://files.pythonhosted.org/packages/9f/66/cc13bae303284b546a030762957322bbbff1ee6b6cb8dc70a40f8a78512f/coverage-7.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123d589f32c11d9be7fe2e66d823a236fe759b0096f5db3fb1b75b2fa414a4fa", size = 212540 }, + { url = "https://files.pythonhosted.org/packages/0f/3c/d56a764b2e5a3d43257c36af4a62c379df44636817bb5f89265de4bf8bd7/coverage-7.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:333b2e0ca576a7dbd66e85ab402e35c03b0b22f525eed82681c4b866e2e2653a", size = 245097 }, + { url = "https://files.pythonhosted.org/packages/b1/46/bd064ea8b3c94eb4ca5d90e34d15b806cba091ffb2b8e89a0d7066c45791/coverage-7.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:326802760da234baf9f2f85a39e4a4b5861b94f6c8d95251f699e4f73b1835dc", size = 242812 }, + { url = "https://files.pythonhosted.org/packages/43/02/d91992c2b29bc7afb729463bc918ebe5f361be7f1daae93375a5759d1e28/coverage-7.9.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19e7be4cfec248df38ce40968c95d3952fbffd57b400d4b9bb580f28179556d2", size = 244617 }, + { url = "https://files.pythonhosted.org/packages/b7/4f/8fadff6bf56595a16d2d6e33415841b0163ac660873ed9a4e9046194f779/coverage-7.9.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0b4a4cb73b9f2b891c1788711408ef9707666501ba23684387277ededab1097c", size = 244263 }, + { url = "https://files.pythonhosted.org/packages/9b/d2/e0be7446a2bba11739edb9f9ba4eff30b30d8257370e237418eb44a14d11/coverage-7.9.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2c8937fa16c8c9fbbd9f118588756e7bcdc7e16a470766a9aef912dd3f117dbd", size = 242314 }, + { url = "https://files.pythonhosted.org/packages/9d/7d/dcbac9345000121b8b57a3094c2dfcf1ccc52d8a14a40c1d4bc89f936f80/coverage-7.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:42da2280c4d30c57a9b578bafd1d4494fa6c056d4c419d9689e66d775539be74", size = 242904 }, + { url = "https://files.pythonhosted.org/packages/41/58/11e8db0a0c0510cf31bbbdc8caf5d74a358b696302a45948d7c768dfd1cf/coverage-7.9.2-cp311-cp311-win32.whl", hash = "sha256:14fa8d3da147f5fdf9d298cacc18791818f3f1a9f542c8958b80c228320e90c6", size = 214553 }, + { url = "https://files.pythonhosted.org/packages/3a/7d/751794ec8907a15e257136e48dc1021b1f671220ecccfd6c4eaf30802714/coverage-7.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:549cab4892fc82004f9739963163fd3aac7a7b0df430669b75b86d293d2df2a7", size = 215441 }, + { url = "https://files.pythonhosted.org/packages/62/5b/34abcedf7b946c1c9e15b44f326cb5b0da852885312b30e916f674913428/coverage-7.9.2-cp311-cp311-win_arm64.whl", hash = "sha256:c2667a2b913e307f06aa4e5677f01a9746cd08e4b35e14ebcde6420a9ebb4c62", size = 213873 }, + { url = "https://files.pythonhosted.org/packages/53/d7/7deefc6fd4f0f1d4c58051f4004e366afc9e7ab60217ac393f247a1de70a/coverage-7.9.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ae9eb07f1cfacd9cfe8eaee6f4ff4b8a289a668c39c165cd0c8548484920ffc0", size = 212344 }, + { url = "https://files.pythonhosted.org/packages/95/0c/ee03c95d32be4d519e6a02e601267769ce2e9a91fc8faa1b540e3626c680/coverage-7.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9ce85551f9a1119f02adc46d3014b5ee3f765deac166acf20dbb851ceb79b6f3", size = 212580 }, + { url = "https://files.pythonhosted.org/packages/8b/9f/826fa4b544b27620086211b87a52ca67592622e1f3af9e0a62c87aea153a/coverage-7.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8f6389ac977c5fb322e0e38885fbbf901743f79d47f50db706e7644dcdcb6e1", size = 246383 }, + { url = "https://files.pythonhosted.org/packages/7f/b3/4477aafe2a546427b58b9c540665feff874f4db651f4d3cb21b308b3a6d2/coverage-7.9.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff0d9eae8cdfcd58fe7893b88993723583a6ce4dfbfd9f29e001922544f95615", size = 243400 }, + { url = "https://files.pythonhosted.org/packages/f8/c2/efffa43778490c226d9d434827702f2dfbc8041d79101a795f11cbb2cf1e/coverage-7.9.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fae939811e14e53ed8a9818dad51d434a41ee09df9305663735f2e2d2d7d959b", size = 245591 }, + { url = "https://files.pythonhosted.org/packages/c6/e7/a59888e882c9a5f0192d8627a30ae57910d5d449c80229b55e7643c078c4/coverage-7.9.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:31991156251ec202c798501e0a42bbdf2169dcb0f137b1f5c0f4267f3fc68ef9", size = 245402 }, + { url = "https://files.pythonhosted.org/packages/92/a5/72fcd653ae3d214927edc100ce67440ed8a0a1e3576b8d5e6d066ed239db/coverage-7.9.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d0d67963f9cbfc7c7f96d4ac74ed60ecbebd2ea6eeb51887af0f8dce205e545f", size = 243583 }, + { url = "https://files.pythonhosted.org/packages/5c/f5/84e70e4df28f4a131d580d7d510aa1ffd95037293da66fd20d446090a13b/coverage-7.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:49b752a2858b10580969ec6af6f090a9a440a64a301ac1528d7ca5f7ed497f4d", size = 244815 }, + { url = "https://files.pythonhosted.org/packages/39/e7/d73d7cbdbd09fdcf4642655ae843ad403d9cbda55d725721965f3580a314/coverage-7.9.2-cp312-cp312-win32.whl", hash = "sha256:88d7598b8ee130f32f8a43198ee02edd16d7f77692fa056cb779616bbea1b355", size = 214719 }, + { url = "https://files.pythonhosted.org/packages/9f/d6/7486dcc3474e2e6ad26a2af2db7e7c162ccd889c4c68fa14ea8ec189c9e9/coverage-7.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:9dfb070f830739ee49d7c83e4941cc767e503e4394fdecb3b54bfdac1d7662c0", size = 215509 }, + { url = "https://files.pythonhosted.org/packages/b7/34/0439f1ae2593b0346164d907cdf96a529b40b7721a45fdcf8b03c95fcd90/coverage-7.9.2-cp312-cp312-win_arm64.whl", hash = "sha256:4e2c058aef613e79df00e86b6d42a641c877211384ce5bd07585ed7ba71ab31b", size = 213910 }, + { url = "https://files.pythonhosted.org/packages/94/9d/7a8edf7acbcaa5e5c489a646226bed9591ee1c5e6a84733c0140e9ce1ae1/coverage-7.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:985abe7f242e0d7bba228ab01070fde1d6c8fa12f142e43debe9ed1dde686038", size = 212367 }, + { url = "https://files.pythonhosted.org/packages/e8/9e/5cd6f130150712301f7e40fb5865c1bc27b97689ec57297e568d972eec3c/coverage-7.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82c3939264a76d44fde7f213924021ed31f55ef28111a19649fec90c0f109e6d", size = 212632 }, + { url = "https://files.pythonhosted.org/packages/a8/de/6287a2c2036f9fd991c61cefa8c64e57390e30c894ad3aa52fac4c1e14a8/coverage-7.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae5d563e970dbe04382f736ec214ef48103d1b875967c89d83c6e3f21706d5b3", size = 245793 }, + { url = "https://files.pythonhosted.org/packages/06/cc/9b5a9961d8160e3cb0b558c71f8051fe08aa2dd4b502ee937225da564ed1/coverage-7.9.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdd612e59baed2a93c8843c9a7cb902260f181370f1d772f4842987535071d14", size = 243006 }, + { url = "https://files.pythonhosted.org/packages/49/d9/4616b787d9f597d6443f5588619c1c9f659e1f5fc9eebf63699eb6d34b78/coverage-7.9.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:256ea87cb2a1ed992bcdfc349d8042dcea1b80436f4ddf6e246d6bee4b5d73b6", size = 244990 }, + { url = "https://files.pythonhosted.org/packages/48/83/801cdc10f137b2d02b005a761661649ffa60eb173dcdaeb77f571e4dc192/coverage-7.9.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f44ae036b63c8ea432f610534a2668b0c3aee810e7037ab9d8ff6883de480f5b", size = 245157 }, + { url = "https://files.pythonhosted.org/packages/c8/a4/41911ed7e9d3ceb0ffb019e7635468df7499f5cc3edca5f7dfc078e9c5ec/coverage-7.9.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:82d76ad87c932935417a19b10cfe7abb15fd3f923cfe47dbdaa74ef4e503752d", size = 243128 }, + { url = "https://files.pythonhosted.org/packages/10/41/344543b71d31ac9cb00a664d5d0c9ef134a0fe87cb7d8430003b20fa0b7d/coverage-7.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:619317bb86de4193debc712b9e59d5cffd91dc1d178627ab2a77b9870deb2868", size = 244511 }, + { url = "https://files.pythonhosted.org/packages/d5/81/3b68c77e4812105e2a060f6946ba9e6f898ddcdc0d2bfc8b4b152a9ae522/coverage-7.9.2-cp313-cp313-win32.whl", hash = "sha256:0a07757de9feb1dfafd16ab651e0f628fd7ce551604d1bf23e47e1ddca93f08a", size = 214765 }, + { url = "https://files.pythonhosted.org/packages/06/a2/7fac400f6a346bb1a4004eb2a76fbff0e242cd48926a2ce37a22a6a1d917/coverage-7.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:115db3d1f4d3f35f5bb021e270edd85011934ff97c8797216b62f461dd69374b", size = 215536 }, + { url = "https://files.pythonhosted.org/packages/08/47/2c6c215452b4f90d87017e61ea0fd9e0486bb734cb515e3de56e2c32075f/coverage-7.9.2-cp313-cp313-win_arm64.whl", hash = "sha256:48f82f889c80af8b2a7bb6e158d95a3fbec6a3453a1004d04e4f3b5945a02694", size = 213943 }, + { url = "https://files.pythonhosted.org/packages/a3/46/e211e942b22d6af5e0f323faa8a9bc7c447a1cf1923b64c47523f36ed488/coverage-7.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:55a28954545f9d2f96870b40f6c3386a59ba8ed50caf2d949676dac3ecab99f5", size = 213088 }, + { url = "https://files.pythonhosted.org/packages/d2/2f/762551f97e124442eccd907bf8b0de54348635b8866a73567eb4e6417acf/coverage-7.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cdef6504637731a63c133bb2e6f0f0214e2748495ec15fe42d1e219d1b133f0b", size = 213298 }, + { url = "https://files.pythonhosted.org/packages/7a/b7/76d2d132b7baf7360ed69be0bcab968f151fa31abe6d067f0384439d9edb/coverage-7.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd5ebe66c7a97273d5d2ddd4ad0ed2e706b39630ed4b53e713d360626c3dbb3", size = 256541 }, + { url = "https://files.pythonhosted.org/packages/a0/17/392b219837d7ad47d8e5974ce5f8dc3deb9f99a53b3bd4d123602f960c81/coverage-7.9.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9303aed20872d7a3c9cb39c5d2b9bdbe44e3a9a1aecb52920f7e7495410dfab8", size = 252761 }, + { url = "https://files.pythonhosted.org/packages/d5/77/4256d3577fe1b0daa8d3836a1ebe68eaa07dd2cbaf20cf5ab1115d6949d4/coverage-7.9.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc18ea9e417a04d1920a9a76fe9ebd2f43ca505b81994598482f938d5c315f46", size = 254917 }, + { url = "https://files.pythonhosted.org/packages/53/99/fc1a008eef1805e1ddb123cf17af864743354479ea5129a8f838c433cc2c/coverage-7.9.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6406cff19880aaaadc932152242523e892faff224da29e241ce2fca329866584", size = 256147 }, + { url = "https://files.pythonhosted.org/packages/92/c0/f63bf667e18b7f88c2bdb3160870e277c4874ced87e21426128d70aa741f/coverage-7.9.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d0d4f6ecdf37fcc19c88fec3e2277d5dee740fb51ffdd69b9579b8c31e4232e", size = 254261 }, + { url = "https://files.pythonhosted.org/packages/8c/32/37dd1c42ce3016ff8ec9e4b607650d2e34845c0585d3518b2a93b4830c1a/coverage-7.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c33624f50cf8de418ab2b4d6ca9eda96dc45b2c4231336bac91454520e8d1fac", size = 255099 }, + { url = "https://files.pythonhosted.org/packages/da/2e/af6b86f7c95441ce82f035b3affe1cd147f727bbd92f563be35e2d585683/coverage-7.9.2-cp313-cp313t-win32.whl", hash = "sha256:1df6b76e737c6a92210eebcb2390af59a141f9e9430210595251fbaf02d46926", size = 215440 }, + { url = "https://files.pythonhosted.org/packages/4d/bb/8a785d91b308867f6b2e36e41c569b367c00b70c17f54b13ac29bcd2d8c8/coverage-7.9.2-cp313-cp313t-win_amd64.whl", hash = "sha256:f5fd54310b92741ebe00d9c0d1d7b2b27463952c022da6d47c175d246a98d1bd", size = 216537 }, + { url = "https://files.pythonhosted.org/packages/1d/a0/a6bffb5e0f41a47279fd45a8f3155bf193f77990ae1c30f9c224b61cacb0/coverage-7.9.2-cp313-cp313t-win_arm64.whl", hash = "sha256:c48c2375287108c887ee87d13b4070a381c6537d30e8487b24ec721bf2a781cb", size = 214398 }, + { url = "https://files.pythonhosted.org/packages/d7/85/f8bbefac27d286386961c25515431482a425967e23d3698b75a250872924/coverage-7.9.2-pp39.pp310.pp311-none-any.whl", hash = "sha256:8a1166db2fb62473285bcb092f586e081e92656c7dfa8e9f62b4d39d7e6b5050", size = 204013 }, + { url = "https://files.pythonhosted.org/packages/3c/38/bbe2e63902847cf79036ecc75550d0698af31c91c7575352eb25190d0fb3/coverage-7.9.2-py3-none-any.whl", hash = "sha256:e425cd5b00f6fc0ed7cdbd766c70be8baab4b7839e4d4fe5fac48581dd968ea4", size = 204005 }, ] [package.optional-dependencies] @@ -658,43 +659,43 @@ wheels = [ [[package]] name = "cryptography" -version = "45.0.4" +version = "45.0.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fe/c8/a2a376a8711c1e11708b9c9972e0c3223f5fc682552c82d8db844393d6ce/cryptography-45.0.4.tar.gz", hash = "sha256:7405ade85c83c37682c8fe65554759800a4a8c54b2d96e0f8ad114d31b808d57", size = 744890 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/1c/92637793de053832523b410dbe016d3f5c11b41d0cf6eef8787aabb51d41/cryptography-45.0.4-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:425a9a6ac2823ee6e46a76a21a4e8342d8fa5c01e08b823c1f19a8b74f096069", size = 7055712 }, - { url = "https://files.pythonhosted.org/packages/ba/14/93b69f2af9ba832ad6618a03f8a034a5851dc9a3314336a3d71c252467e1/cryptography-45.0.4-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:680806cf63baa0039b920f4976f5f31b10e772de42f16310a6839d9f21a26b0d", size = 4205335 }, - { url = "https://files.pythonhosted.org/packages/67/30/fae1000228634bf0b647fca80403db5ca9e3933b91dd060570689f0bd0f7/cryptography-45.0.4-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4ca0f52170e821bc8da6fc0cc565b7bb8ff8d90d36b5e9fdd68e8a86bdf72036", size = 4431487 }, - { url = "https://files.pythonhosted.org/packages/6d/5a/7dffcf8cdf0cb3c2430de7404b327e3db64735747d641fc492539978caeb/cryptography-45.0.4-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f3fe7a5ae34d5a414957cc7f457e2b92076e72938423ac64d215722f6cf49a9e", size = 4208922 }, - { url = "https://files.pythonhosted.org/packages/c6/f3/528729726eb6c3060fa3637253430547fbaaea95ab0535ea41baa4a6fbd8/cryptography-45.0.4-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:25eb4d4d3e54595dc8adebc6bbd5623588991d86591a78c2548ffb64797341e2", size = 3900433 }, - { url = "https://files.pythonhosted.org/packages/d9/4a/67ba2e40f619e04d83c32f7e1d484c1538c0800a17c56a22ff07d092ccc1/cryptography-45.0.4-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ce1678a2ccbe696cf3af15a75bb72ee008d7ff183c9228592ede9db467e64f1b", size = 4464163 }, - { url = "https://files.pythonhosted.org/packages/7e/9a/b4d5aa83661483ac372464809c4b49b5022dbfe36b12fe9e323ca8512420/cryptography-45.0.4-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:49fe9155ab32721b9122975e168a6760d8ce4cffe423bcd7ca269ba41b5dfac1", size = 4208687 }, - { url = "https://files.pythonhosted.org/packages/db/b7/a84bdcd19d9c02ec5807f2ec2d1456fd8451592c5ee353816c09250e3561/cryptography-45.0.4-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2882338b2a6e0bd337052e8b9007ced85c637da19ef9ecaf437744495c8c2999", size = 4463623 }, - { url = "https://files.pythonhosted.org/packages/d8/84/69707d502d4d905021cac3fb59a316344e9f078b1da7fb43ecde5e10840a/cryptography-45.0.4-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:23b9c3ea30c3ed4db59e7b9619272e94891f8a3a5591d0b656a7582631ccf750", size = 4332447 }, - { url = "https://files.pythonhosted.org/packages/f3/ee/d4f2ab688e057e90ded24384e34838086a9b09963389a5ba6854b5876598/cryptography-45.0.4-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0a97c927497e3bc36b33987abb99bf17a9a175a19af38a892dc4bbb844d7ee2", size = 4572830 }, - { url = "https://files.pythonhosted.org/packages/70/d4/994773a261d7ff98034f72c0e8251fe2755eac45e2265db4c866c1c6829c/cryptography-45.0.4-cp311-abi3-win32.whl", hash = "sha256:e00a6c10a5c53979d6242f123c0a97cff9f3abed7f064fc412c36dc521b5f257", size = 2932769 }, - { url = "https://files.pythonhosted.org/packages/5a/42/c80bd0b67e9b769b364963b5252b17778a397cefdd36fa9aa4a5f34c599a/cryptography-45.0.4-cp311-abi3-win_amd64.whl", hash = "sha256:817ee05c6c9f7a69a16200f0c90ab26d23a87701e2a284bd15156783e46dbcc8", size = 3410441 }, - { url = "https://files.pythonhosted.org/packages/ce/0b/2488c89f3a30bc821c9d96eeacfcab6ff3accc08a9601ba03339c0fd05e5/cryptography-45.0.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:964bcc28d867e0f5491a564b7debb3ffdd8717928d315d12e0d7defa9e43b723", size = 7031836 }, - { url = "https://files.pythonhosted.org/packages/fe/51/8c584ed426093aac257462ae62d26ad61ef1cbf5b58d8b67e6e13c39960e/cryptography-45.0.4-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6a5bf57554e80f75a7db3d4b1dacaa2764611ae166ab42ea9a72bcdb5d577637", size = 4195746 }, - { url = "https://files.pythonhosted.org/packages/5c/7d/4b0ca4d7af95a704eef2f8f80a8199ed236aaf185d55385ae1d1610c03c2/cryptography-45.0.4-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:46cf7088bf91bdc9b26f9c55636492c1cce3e7aaf8041bbf0243f5e5325cfb2d", size = 4424456 }, - { url = "https://files.pythonhosted.org/packages/1d/45/5fabacbc6e76ff056f84d9f60eeac18819badf0cefc1b6612ee03d4ab678/cryptography-45.0.4-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7bedbe4cc930fa4b100fc845ea1ea5788fcd7ae9562e669989c11618ae8d76ee", size = 4198495 }, - { url = "https://files.pythonhosted.org/packages/55/b7/ffc9945b290eb0a5d4dab9b7636706e3b5b92f14ee5d9d4449409d010d54/cryptography-45.0.4-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:eaa3e28ea2235b33220b949c5a0d6cf79baa80eab2eb5607ca8ab7525331b9ff", size = 3885540 }, - { url = "https://files.pythonhosted.org/packages/7f/e3/57b010282346980475e77d414080acdcb3dab9a0be63071efc2041a2c6bd/cryptography-45.0.4-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:7ef2dde4fa9408475038fc9aadfc1fb2676b174e68356359632e980c661ec8f6", size = 4452052 }, - { url = "https://files.pythonhosted.org/packages/37/e6/ddc4ac2558bf2ef517a358df26f45bc774a99bf4653e7ee34b5e749c03e3/cryptography-45.0.4-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:6a3511ae33f09094185d111160fd192c67aa0a2a8d19b54d36e4c78f651dc5ad", size = 4198024 }, - { url = "https://files.pythonhosted.org/packages/3a/c0/85fa358ddb063ec588aed4a6ea1df57dc3e3bc1712d87c8fa162d02a65fc/cryptography-45.0.4-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:06509dc70dd71fa56eaa138336244e2fbaf2ac164fc9b5e66828fccfd2b680d6", size = 4451442 }, - { url = "https://files.pythonhosted.org/packages/33/67/362d6ec1492596e73da24e669a7fbbaeb1c428d6bf49a29f7a12acffd5dc/cryptography-45.0.4-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:5f31e6b0a5a253f6aa49be67279be4a7e5a4ef259a9f33c69f7d1b1191939872", size = 4325038 }, - { url = "https://files.pythonhosted.org/packages/53/75/82a14bf047a96a1b13ebb47fb9811c4f73096cfa2e2b17c86879687f9027/cryptography-45.0.4-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:944e9ccf67a9594137f942d5b52c8d238b1b4e46c7a0c2891b7ae6e01e7c80a4", size = 4560964 }, - { url = "https://files.pythonhosted.org/packages/cd/37/1a3cba4c5a468ebf9b95523a5ef5651244693dc712001e276682c278fc00/cryptography-45.0.4-cp37-abi3-win32.whl", hash = "sha256:c22fe01e53dc65edd1945a2e6f0015e887f84ced233acecb64b4daadb32f5c97", size = 2924557 }, - { url = "https://files.pythonhosted.org/packages/2a/4b/3256759723b7e66380397d958ca07c59cfc3fb5c794fb5516758afd05d41/cryptography-45.0.4-cp37-abi3-win_amd64.whl", hash = "sha256:627ba1bc94f6adf0b0a2e35d87020285ead22d9f648c7e75bb64f367375f3b22", size = 3395508 }, - { url = "https://files.pythonhosted.org/packages/ea/ba/cf442ae99ef363855ed84b39e0fb3c106ac66b7a7703f3c9c9cfe05412cb/cryptography-45.0.4-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4828190fb6c4bcb6ebc6331f01fe66ae838bb3bd58e753b59d4b22eb444b996c", size = 3590512 }, - { url = "https://files.pythonhosted.org/packages/28/9a/a7d5bb87d149eb99a5abdc69a41e4e47b8001d767e5f403f78bfaafc7aa7/cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:03dbff8411206713185b8cebe31bc5c0eb544799a50c09035733716b386e61a4", size = 4146899 }, - { url = "https://files.pythonhosted.org/packages/17/11/9361c2c71c42cc5c465cf294c8030e72fb0c87752bacbd7a3675245e3db3/cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51dfbd4d26172d31150d84c19bbe06c68ea4b7f11bbc7b3a5e146b367c311349", size = 4388900 }, - { url = "https://files.pythonhosted.org/packages/c0/76/f95b83359012ee0e670da3e41c164a0c256aeedd81886f878911581d852f/cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:0339a692de47084969500ee455e42c58e449461e0ec845a34a6a9b9bf7df7fb8", size = 4146422 }, - { url = "https://files.pythonhosted.org/packages/09/ad/5429fcc4def93e577a5407988f89cf15305e64920203d4ac14601a9dc876/cryptography-45.0.4-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:0cf13c77d710131d33e63626bd55ae7c0efb701ebdc2b3a7952b9b23a0412862", size = 4388475 }, - { url = "https://files.pythonhosted.org/packages/99/49/0ab9774f64555a1b50102757811508f5ace451cf5dc0a2d074a4b9deca6a/cryptography-45.0.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bbc505d1dc469ac12a0a064214879eac6294038d6b24ae9f71faae1448a9608d", size = 3337594 }, +sdist = { url = "https://files.pythonhosted.org/packages/95/1e/49527ac611af559665f71cbb8f92b332b5ec9c6fbc4e88b0f8e92f5e85df/cryptography-45.0.5.tar.gz", hash = "sha256:72e76caa004ab63accdf26023fccd1d087f6d90ec6048ff33ad0445abf7f605a", size = 744903 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f0/fb/09e28bc0c46d2c547085e60897fea96310574c70fb21cd58a730a45f3403/cryptography-45.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:101ee65078f6dd3e5a028d4f19c07ffa4dd22cce6a20eaa160f8b5219911e7d8", size = 7043092 }, + { url = "https://files.pythonhosted.org/packages/b1/05/2194432935e29b91fb649f6149c1a4f9e6d3d9fc880919f4ad1bcc22641e/cryptography-45.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3a264aae5f7fbb089dbc01e0242d3b67dffe3e6292e1f5182122bdf58e65215d", size = 4205926 }, + { url = "https://files.pythonhosted.org/packages/07/8b/9ef5da82350175e32de245646b1884fc01124f53eb31164c77f95a08d682/cryptography-45.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e74d30ec9c7cb2f404af331d5b4099a9b322a8a6b25c4632755c8757345baac5", size = 4429235 }, + { url = "https://files.pythonhosted.org/packages/7c/e1/c809f398adde1994ee53438912192d92a1d0fc0f2d7582659d9ef4c28b0c/cryptography-45.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3af26738f2db354aafe492fb3869e955b12b2ef2e16908c8b9cb928128d42c57", size = 4209785 }, + { url = "https://files.pythonhosted.org/packages/d0/8b/07eb6bd5acff58406c5e806eff34a124936f41a4fb52909ffa4d00815f8c/cryptography-45.0.5-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e6c00130ed423201c5bc5544c23359141660b07999ad82e34e7bb8f882bb78e0", size = 3893050 }, + { url = "https://files.pythonhosted.org/packages/ec/ef/3333295ed58d900a13c92806b67e62f27876845a9a908c939f040887cca9/cryptography-45.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:dd420e577921c8c2d31289536c386aaa30140b473835e97f83bc71ea9d2baf2d", size = 4457379 }, + { url = "https://files.pythonhosted.org/packages/d9/9d/44080674dee514dbb82b21d6fa5d1055368f208304e2ab1828d85c9de8f4/cryptography-45.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d05a38884db2ba215218745f0781775806bde4f32e07b135348355fe8e4991d9", size = 4209355 }, + { url = "https://files.pythonhosted.org/packages/c9/d8/0749f7d39f53f8258e5c18a93131919ac465ee1f9dccaf1b3f420235e0b5/cryptography-45.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:ad0caded895a00261a5b4aa9af828baede54638754b51955a0ac75576b831b27", size = 4456087 }, + { url = "https://files.pythonhosted.org/packages/09/d7/92acac187387bf08902b0bf0699816f08553927bdd6ba3654da0010289b4/cryptography-45.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9024beb59aca9d31d36fcdc1604dd9bbeed0a55bface9f1908df19178e2f116e", size = 4332873 }, + { url = "https://files.pythonhosted.org/packages/03/c2/840e0710da5106a7c3d4153c7215b2736151bba60bf4491bdb421df5056d/cryptography-45.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:91098f02ca81579c85f66df8a588c78f331ca19089763d733e34ad359f474174", size = 4564651 }, + { url = "https://files.pythonhosted.org/packages/2e/92/cc723dd6d71e9747a887b94eb3827825c6c24b9e6ce2bb33b847d31d5eaa/cryptography-45.0.5-cp311-abi3-win32.whl", hash = "sha256:926c3ea71a6043921050eaa639137e13dbe7b4ab25800932a8498364fc1abec9", size = 2929050 }, + { url = "https://files.pythonhosted.org/packages/1f/10/197da38a5911a48dd5389c043de4aec4b3c94cb836299b01253940788d78/cryptography-45.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:b85980d1e345fe769cfc57c57db2b59cff5464ee0c045d52c0df087e926fbe63", size = 3403224 }, + { url = "https://files.pythonhosted.org/packages/fe/2b/160ce8c2765e7a481ce57d55eba1546148583e7b6f85514472b1d151711d/cryptography-45.0.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f3562c2f23c612f2e4a6964a61d942f891d29ee320edb62ff48ffb99f3de9ae8", size = 7017143 }, + { url = "https://files.pythonhosted.org/packages/c2/e7/2187be2f871c0221a81f55ee3105d3cf3e273c0a0853651d7011eada0d7e/cryptography-45.0.5-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3fcfbefc4a7f332dece7272a88e410f611e79458fab97b5efe14e54fe476f4fd", size = 4197780 }, + { url = "https://files.pythonhosted.org/packages/b9/cf/84210c447c06104e6be9122661159ad4ce7a8190011669afceeaea150524/cryptography-45.0.5-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:460f8c39ba66af7db0545a8c6f2eabcbc5a5528fc1cf6c3fa9a1e44cec33385e", size = 4420091 }, + { url = "https://files.pythonhosted.org/packages/3e/6a/cb8b5c8bb82fafffa23aeff8d3a39822593cee6e2f16c5ca5c2ecca344f7/cryptography-45.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9b4cf6318915dccfe218e69bbec417fdd7c7185aa7aab139a2c0beb7468c89f0", size = 4198711 }, + { url = "https://files.pythonhosted.org/packages/04/f7/36d2d69df69c94cbb2473871926daf0f01ad8e00fe3986ac3c1e8c4ca4b3/cryptography-45.0.5-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2089cc8f70a6e454601525e5bf2779e665d7865af002a5dec8d14e561002e135", size = 3883299 }, + { url = "https://files.pythonhosted.org/packages/82/c7/f0ea40f016de72f81288e9fe8d1f6748036cb5ba6118774317a3ffc6022d/cryptography-45.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0027d566d65a38497bc37e0dd7c2f8ceda73597d2ac9ba93810204f56f52ebc7", size = 4450558 }, + { url = "https://files.pythonhosted.org/packages/06/ae/94b504dc1a3cdf642d710407c62e86296f7da9e66f27ab12a1ee6fdf005b/cryptography-45.0.5-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:be97d3a19c16a9be00edf79dca949c8fa7eff621763666a145f9f9535a5d7f42", size = 4198020 }, + { url = "https://files.pythonhosted.org/packages/05/2b/aaf0adb845d5dabb43480f18f7ca72e94f92c280aa983ddbd0bcd6ecd037/cryptography-45.0.5-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:7760c1c2e1a7084153a0f68fab76e754083b126a47d0117c9ed15e69e2103492", size = 4449759 }, + { url = "https://files.pythonhosted.org/packages/91/e4/f17e02066de63e0100a3a01b56f8f1016973a1d67551beaf585157a86b3f/cryptography-45.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6ff8728d8d890b3dda5765276d1bc6fb099252915a2cd3aff960c4c195745dd0", size = 4319991 }, + { url = "https://files.pythonhosted.org/packages/f2/2e/e2dbd629481b499b14516eed933f3276eb3239f7cee2dcfa4ee6b44d4711/cryptography-45.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7259038202a47fdecee7e62e0fd0b0738b6daa335354396c6ddebdbe1206af2a", size = 4554189 }, + { url = "https://files.pythonhosted.org/packages/f8/ea/a78a0c38f4c8736287b71c2ea3799d173d5ce778c7d6e3c163a95a05ad2a/cryptography-45.0.5-cp37-abi3-win32.whl", hash = "sha256:1e1da5accc0c750056c556a93c3e9cb828970206c68867712ca5805e46dc806f", size = 2911769 }, + { url = "https://files.pythonhosted.org/packages/79/b3/28ac139109d9005ad3f6b6f8976ffede6706a6478e21c889ce36c840918e/cryptography-45.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:90cb0a7bb35959f37e23303b7eed0a32280510030daba3f7fdfbb65defde6a97", size = 3390016 }, + { url = "https://files.pythonhosted.org/packages/c0/71/9bdbcfd58d6ff5084687fe722c58ac718ebedbc98b9f8f93781354e6d286/cryptography-45.0.5-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8c4a6ff8a30e9e3d38ac0539e9a9e02540ab3f827a3394f8852432f6b0ea152e", size = 3587878 }, + { url = "https://files.pythonhosted.org/packages/f0/63/83516cfb87f4a8756eaa4203f93b283fda23d210fc14e1e594bd5f20edb6/cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bd4c45986472694e5121084c6ebbd112aa919a25e783b87eb95953c9573906d6", size = 4152447 }, + { url = "https://files.pythonhosted.org/packages/22/11/d2823d2a5a0bd5802b3565437add16f5c8ce1f0778bf3822f89ad2740a38/cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:982518cd64c54fcada9d7e5cf28eabd3ee76bd03ab18e08a48cad7e8b6f31b18", size = 4386778 }, + { url = "https://files.pythonhosted.org/packages/5f/38/6bf177ca6bce4fe14704ab3e93627c5b0ca05242261a2e43ef3168472540/cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:12e55281d993a793b0e883066f590c1ae1e802e3acb67f8b442e721e475e6463", size = 4151627 }, + { url = "https://files.pythonhosted.org/packages/38/6a/69fc67e5266bff68a91bcb81dff8fb0aba4d79a78521a08812048913e16f/cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:5aa1e32983d4443e310f726ee4b071ab7569f58eedfdd65e9675484a4eb67bd1", size = 4385593 }, + { url = "https://files.pythonhosted.org/packages/f6/34/31a1604c9a9ade0fdab61eb48570e09a796f4d9836121266447b0eaf7feb/cryptography-45.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:e357286c1b76403dd384d938f93c46b2b058ed4dfcdce64a770f0537ed3feb6f", size = 3331106 }, ] [[package]] @@ -1735,7 +1736,7 @@ requires-dist = [ { name = "segy", specifier = ">=0.4.1.post2,<0.5.0" }, { name = "tqdm", specifier = ">=4.67.1,<5.0.0" }, { name = "xarray", specifier = ">=2025.6.1" }, - { name = "zarr", specifier = ">=3.0.8,<3.0.9" }, + { name = "zarr", specifier = ">=3.0.10,<4.0.0" }, { name = "zfpy", marker = "extra == 'lossy'", specifier = ">=1.0.1,<2.0.0" }, ] provides-extras = ["cloud", "distributed", "lossy"] @@ -2117,6 +2118,8 @@ sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3 wheels = [ { url = "https://files.pythonhosted.org/packages/db/26/77f8ed17ca4ffd60e1dcd220a6ec6d71210ba398cfa33a13a1cd614c5613/pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", size = 5316531 }, { url = "https://files.pythonhosted.org/packages/cb/39/ee475903197ce709322a17a866892efb560f57900d9af2e55f86db51b0a5/pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", size = 4686560 }, + { url = "https://files.pythonhosted.org/packages/d5/90/442068a160fd179938ba55ec8c97050a612426fae5ec0a764e345839f76d/pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d", size = 5870978 }, + { url = "https://files.pythonhosted.org/packages/13/92/dcdd147ab02daf405387f0218dcf792dc6dd5b14d2573d40b4caeef01059/pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494", size = 7641168 }, { url = "https://files.pythonhosted.org/packages/6e/db/839d6ba7fd38b51af641aa904e2960e7a5644d60ec754c046b7d2aee00e5/pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", size = 5973053 }, { url = "https://files.pythonhosted.org/packages/f2/2f/d7675ecae6c43e9f12aa8d58b6012683b20b6edfbdac7abcb4e6af7a3784/pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", size = 6640273 }, { url = "https://files.pythonhosted.org/packages/45/ad/931694675ede172e15b2ff03c8144a0ddaea1d87adb72bb07655eaffb654/pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", size = 6082043 }, @@ -2126,6 +2129,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c6/df/90bd886fabd544c25addd63e5ca6932c86f2b701d5da6c7839387a076b4a/pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd", size = 2423079 }, { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800 }, { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296 }, + { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726 }, + { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652 }, { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787 }, { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236 }, { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950 }, @@ -2138,6 +2143,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443 }, { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474 }, { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038 }, + { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407 }, + { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094 }, { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503 }, { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574 }, { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060 }, @@ -2147,6 +2154,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055 }, { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110 }, { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547 }, + { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554 }, + { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132 }, { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001 }, { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814 }, { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124 }, @@ -2156,6 +2165,8 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803 }, { url = "https://files.pythonhosted.org/packages/9e/e3/6fa84033758276fb31da12e5fb66ad747ae83b93c67af17f8c6ff4cc8f34/pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", size = 5270566 }, { url = "https://files.pythonhosted.org/packages/5b/ee/e8d2e1ab4892970b561e1ba96cbd59c0d28cf66737fc44abb2aec3795a4e/pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", size = 4654618 }, + { url = "https://files.pythonhosted.org/packages/f2/6d/17f80f4e1f0761f02160fc433abd4109fa1548dcfdca46cfdadaf9efa565/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3", size = 4874248 }, + { url = "https://files.pythonhosted.org/packages/de/5f/c22340acd61cef960130585bbe2120e2fd8434c214802f07e8c03596b17e/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c", size = 6583963 }, { url = "https://files.pythonhosted.org/packages/31/5e/03966aedfbfcbb4d5f8aa042452d3361f325b963ebbadddac05b122e47dd/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", size = 4957170 }, { url = "https://files.pythonhosted.org/packages/cc/2d/e082982aacc927fc2cab48e1e731bdb1643a1406acace8bed0900a61464e/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", size = 5581505 }, { url = "https://files.pythonhosted.org/packages/34/e7/ae39f538fd6844e982063c3a5e4598b8ced43b9633baa3a85ef33af8c05c/pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", size = 6984598 }, @@ -2790,76 +2801,76 @@ wheels = [ [[package]] name = "rpds-py" -version = "0.25.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8c/a6/60184b7fc00dd3ca80ac635dd5b8577d444c57e8e8742cecabfacb829921/rpds_py-0.25.1.tar.gz", hash = "sha256:8960b6dac09b62dac26e75d7e2c4a22efb835d827a7278c34f72b2b84fa160e3", size = 27304 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/e1/df13fe3ddbbea43567e07437f097863b20c99318ae1f58a0fe389f763738/rpds_py-0.25.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5f048bbf18b1f9120685c6d6bb70cc1a52c8cc11bdd04e643d28d3be0baf666d", size = 373341 }, - { url = "https://files.pythonhosted.org/packages/7a/58/deef4d30fcbcbfef3b6d82d17c64490d5c94585a2310544ce8e2d3024f83/rpds_py-0.25.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4fbb0dbba559959fcb5d0735a0f87cdbca9e95dac87982e9b95c0f8f7ad10255", size = 359111 }, - { url = "https://files.pythonhosted.org/packages/bb/7e/39f1f4431b03e96ebaf159e29a0f82a77259d8f38b2dd474721eb3a8ac9b/rpds_py-0.25.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4ca54b9cf9d80b4016a67a0193ebe0bcf29f6b0a96f09db942087e294d3d4c2", size = 386112 }, - { url = "https://files.pythonhosted.org/packages/db/e7/847068a48d63aec2ae695a1646089620b3b03f8ccf9f02c122ebaf778f3c/rpds_py-0.25.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ee3e26eb83d39b886d2cb6e06ea701bba82ef30a0de044d34626ede51ec98b0", size = 400362 }, - { url = "https://files.pythonhosted.org/packages/3b/3d/9441d5db4343d0cee759a7ab4d67420a476cebb032081763de934719727b/rpds_py-0.25.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89706d0683c73a26f76a5315d893c051324d771196ae8b13e6ffa1ffaf5e574f", size = 522214 }, - { url = "https://files.pythonhosted.org/packages/a2/ec/2cc5b30d95f9f1a432c79c7a2f65d85e52812a8f6cbf8768724571710786/rpds_py-0.25.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2013ee878c76269c7b557a9a9c042335d732e89d482606990b70a839635feb7", size = 411491 }, - { url = "https://files.pythonhosted.org/packages/dc/6c/44695c1f035077a017dd472b6a3253553780837af2fac9b6ac25f6a5cb4d/rpds_py-0.25.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45e484db65e5380804afbec784522de84fa95e6bb92ef1bd3325d33d13efaebd", size = 386978 }, - { url = "https://files.pythonhosted.org/packages/b1/74/b4357090bb1096db5392157b4e7ed8bb2417dc7799200fcbaee633a032c9/rpds_py-0.25.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:48d64155d02127c249695abb87d39f0faf410733428d499867606be138161d65", size = 420662 }, - { url = "https://files.pythonhosted.org/packages/26/dd/8cadbebf47b96e59dfe8b35868e5c38a42272699324e95ed522da09d3a40/rpds_py-0.25.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:048893e902132fd6548a2e661fb38bf4896a89eea95ac5816cf443524a85556f", size = 563385 }, - { url = "https://files.pythonhosted.org/packages/c3/ea/92960bb7f0e7a57a5ab233662f12152085c7dc0d5468534c65991a3d48c9/rpds_py-0.25.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0317177b1e8691ab5879f4f33f4b6dc55ad3b344399e23df2e499de7b10a548d", size = 592047 }, - { url = "https://files.pythonhosted.org/packages/61/ad/71aabc93df0d05dabcb4b0c749277881f8e74548582d96aa1bf24379493a/rpds_py-0.25.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bffcf57826d77a4151962bf1701374e0fc87f536e56ec46f1abdd6a903354042", size = 557863 }, - { url = "https://files.pythonhosted.org/packages/93/0f/89df0067c41f122b90b76f3660028a466eb287cbe38efec3ea70e637ca78/rpds_py-0.25.1-cp311-cp311-win32.whl", hash = "sha256:cda776f1967cb304816173b30994faaf2fd5bcb37e73118a47964a02c348e1bc", size = 219627 }, - { url = "https://files.pythonhosted.org/packages/7c/8d/93b1a4c1baa903d0229374d9e7aa3466d751f1d65e268c52e6039c6e338e/rpds_py-0.25.1-cp311-cp311-win_amd64.whl", hash = "sha256:dc3c1ff0abc91444cd20ec643d0f805df9a3661fcacf9c95000329f3ddf268a4", size = 231603 }, - { url = "https://files.pythonhosted.org/packages/cb/11/392605e5247bead2f23e6888e77229fbd714ac241ebbebb39a1e822c8815/rpds_py-0.25.1-cp311-cp311-win_arm64.whl", hash = "sha256:5a3ddb74b0985c4387719fc536faced33cadf2172769540c62e2a94b7b9be1c4", size = 223967 }, - { url = "https://files.pythonhosted.org/packages/7f/81/28ab0408391b1dc57393653b6a0cf2014cc282cc2909e4615e63e58262be/rpds_py-0.25.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b5ffe453cde61f73fea9430223c81d29e2fbf412a6073951102146c84e19e34c", size = 364647 }, - { url = "https://files.pythonhosted.org/packages/2c/9a/7797f04cad0d5e56310e1238434f71fc6939d0bc517192a18bb99a72a95f/rpds_py-0.25.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:115874ae5e2fdcfc16b2aedc95b5eef4aebe91b28e7e21951eda8a5dc0d3461b", size = 350454 }, - { url = "https://files.pythonhosted.org/packages/69/3c/93d2ef941b04898011e5d6eaa56a1acf46a3b4c9f4b3ad1bbcbafa0bee1f/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a714bf6e5e81b0e570d01f56e0c89c6375101b8463999ead3a93a5d2a4af91fa", size = 389665 }, - { url = "https://files.pythonhosted.org/packages/c1/57/ad0e31e928751dde8903a11102559628d24173428a0f85e25e187defb2c1/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:35634369325906bcd01577da4c19e3b9541a15e99f31e91a02d010816b49bfda", size = 403873 }, - { url = "https://files.pythonhosted.org/packages/16/ad/c0c652fa9bba778b4f54980a02962748479dc09632e1fd34e5282cf2556c/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4cb2b3ddc16710548801c6fcc0cfcdeeff9dafbc983f77265877793f2660309", size = 525866 }, - { url = "https://files.pythonhosted.org/packages/2a/39/3e1839bc527e6fcf48d5fec4770070f872cdee6c6fbc9b259932f4e88a38/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9ceca1cf097ed77e1a51f1dbc8d174d10cb5931c188a4505ff9f3e119dfe519b", size = 416886 }, - { url = "https://files.pythonhosted.org/packages/7a/95/dd6b91cd4560da41df9d7030a038298a67d24f8ca38e150562644c829c48/rpds_py-0.25.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c2cd1a4b0c2b8c5e31ffff50d09f39906fe351389ba143c195566056c13a7ea", size = 390666 }, - { url = "https://files.pythonhosted.org/packages/64/48/1be88a820e7494ce0a15c2d390ccb7c52212370badabf128e6a7bb4cb802/rpds_py-0.25.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1de336a4b164c9188cb23f3703adb74a7623ab32d20090d0e9bf499a2203ad65", size = 425109 }, - { url = "https://files.pythonhosted.org/packages/cf/07/3e2a17927ef6d7720b9949ec1b37d1e963b829ad0387f7af18d923d5cfa5/rpds_py-0.25.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9fca84a15333e925dd59ce01da0ffe2ffe0d6e5d29a9eeba2148916d1824948c", size = 567244 }, - { url = "https://files.pythonhosted.org/packages/d2/e5/76cf010998deccc4f95305d827847e2eae9c568099c06b405cf96384762b/rpds_py-0.25.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:88ec04afe0c59fa64e2f6ea0dd9657e04fc83e38de90f6de201954b4d4eb59bd", size = 596023 }, - { url = "https://files.pythonhosted.org/packages/52/9a/df55efd84403736ba37a5a6377b70aad0fd1cb469a9109ee8a1e21299a1c/rpds_py-0.25.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a8bd2f19e312ce3e1d2c635618e8a8d8132892bb746a7cf74780a489f0f6cdcb", size = 561634 }, - { url = "https://files.pythonhosted.org/packages/ab/aa/dc3620dd8db84454aaf9374bd318f1aa02578bba5e567f5bf6b79492aca4/rpds_py-0.25.1-cp312-cp312-win32.whl", hash = "sha256:e5e2f7280d8d0d3ef06f3ec1b4fd598d386cc6f0721e54f09109a8132182fbfe", size = 222713 }, - { url = "https://files.pythonhosted.org/packages/a3/7f/7cef485269a50ed5b4e9bae145f512d2a111ca638ae70cc101f661b4defd/rpds_py-0.25.1-cp312-cp312-win_amd64.whl", hash = "sha256:db58483f71c5db67d643857404da360dce3573031586034b7d59f245144cc192", size = 235280 }, - { url = "https://files.pythonhosted.org/packages/99/f2/c2d64f6564f32af913bf5f3f7ae41c7c263c5ae4c4e8f1a17af8af66cd46/rpds_py-0.25.1-cp312-cp312-win_arm64.whl", hash = "sha256:6d50841c425d16faf3206ddbba44c21aa3310a0cebc3c1cdfc3e3f4f9f6f5728", size = 225399 }, - { url = "https://files.pythonhosted.org/packages/2b/da/323848a2b62abe6a0fec16ebe199dc6889c5d0a332458da8985b2980dffe/rpds_py-0.25.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:659d87430a8c8c704d52d094f5ba6fa72ef13b4d385b7e542a08fc240cb4a559", size = 364498 }, - { url = "https://files.pythonhosted.org/packages/1f/b4/4d3820f731c80fd0cd823b3e95b9963fec681ae45ba35b5281a42382c67d/rpds_py-0.25.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68f6f060f0bbdfb0245267da014d3a6da9be127fe3e8cc4a68c6f833f8a23bb1", size = 350083 }, - { url = "https://files.pythonhosted.org/packages/d5/b1/3a8ee1c9d480e8493619a437dec685d005f706b69253286f50f498cbdbcf/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:083a9513a33e0b92cf6e7a6366036c6bb43ea595332c1ab5c8ae329e4bcc0a9c", size = 389023 }, - { url = "https://files.pythonhosted.org/packages/3b/31/17293edcfc934dc62c3bf74a0cb449ecd549531f956b72287203e6880b87/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:816568614ecb22b18a010c7a12559c19f6fe993526af88e95a76d5a60b8b75fb", size = 403283 }, - { url = "https://files.pythonhosted.org/packages/d1/ca/e0f0bc1a75a8925024f343258c8ecbd8828f8997ea2ac71e02f67b6f5299/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c6564c0947a7f52e4792983f8e6cf9bac140438ebf81f527a21d944f2fd0a40", size = 524634 }, - { url = "https://files.pythonhosted.org/packages/3e/03/5d0be919037178fff33a6672ffc0afa04ea1cfcb61afd4119d1b5280ff0f/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c4a128527fe415d73cf1f70a9a688d06130d5810be69f3b553bf7b45e8acf79", size = 416233 }, - { url = "https://files.pythonhosted.org/packages/05/7c/8abb70f9017a231c6c961a8941403ed6557664c0913e1bf413cbdc039e75/rpds_py-0.25.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a49e1d7a4978ed554f095430b89ecc23f42014a50ac385eb0c4d163ce213c325", size = 390375 }, - { url = "https://files.pythonhosted.org/packages/7a/ac/a87f339f0e066b9535074a9f403b9313fd3892d4a164d5d5f5875ac9f29f/rpds_py-0.25.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d74ec9bc0e2feb81d3f16946b005748119c0f52a153f6db6a29e8cd68636f295", size = 424537 }, - { url = "https://files.pythonhosted.org/packages/1f/8f/8d5c1567eaf8c8afe98a838dd24de5013ce6e8f53a01bd47fe8bb06b5533/rpds_py-0.25.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3af5b4cc10fa41e5bc64e5c198a1b2d2864337f8fcbb9a67e747e34002ce812b", size = 566425 }, - { url = "https://files.pythonhosted.org/packages/95/33/03016a6be5663b389c8ab0bbbcca68d9e96af14faeff0a04affcb587e776/rpds_py-0.25.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:79dc317a5f1c51fd9c6a0c4f48209c6b8526d0524a6904fc1076476e79b00f98", size = 595197 }, - { url = "https://files.pythonhosted.org/packages/33/8d/da9f4d3e208c82fda311bff0cf0a19579afceb77cf456e46c559a1c075ba/rpds_py-0.25.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1521031351865e0181bc585147624d66b3b00a84109b57fcb7a779c3ec3772cd", size = 561244 }, - { url = "https://files.pythonhosted.org/packages/e2/b3/39d5dcf7c5f742ecd6dbc88f6f84ae54184b92f5f387a4053be2107b17f1/rpds_py-0.25.1-cp313-cp313-win32.whl", hash = "sha256:5d473be2b13600b93a5675d78f59e63b51b1ba2d0476893415dfbb5477e65b31", size = 222254 }, - { url = "https://files.pythonhosted.org/packages/5f/19/2d6772c8eeb8302c5f834e6d0dfd83935a884e7c5ce16340c7eaf89ce925/rpds_py-0.25.1-cp313-cp313-win_amd64.whl", hash = "sha256:a7b74e92a3b212390bdce1d93da9f6488c3878c1d434c5e751cbc202c5e09500", size = 234741 }, - { url = "https://files.pythonhosted.org/packages/5b/5a/145ada26cfaf86018d0eb304fe55eafdd4f0b6b84530246bb4a7c4fb5c4b/rpds_py-0.25.1-cp313-cp313-win_arm64.whl", hash = "sha256:dd326a81afe332ede08eb39ab75b301d5676802cdffd3a8f287a5f0b694dc3f5", size = 224830 }, - { url = "https://files.pythonhosted.org/packages/4b/ca/d435844829c384fd2c22754ff65889c5c556a675d2ed9eb0e148435c6690/rpds_py-0.25.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:a58d1ed49a94d4183483a3ce0af22f20318d4a1434acee255d683ad90bf78129", size = 359668 }, - { url = "https://files.pythonhosted.org/packages/1f/01/b056f21db3a09f89410d493d2f6614d87bb162499f98b649d1dbd2a81988/rpds_py-0.25.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f251bf23deb8332823aef1da169d5d89fa84c89f67bdfb566c49dea1fccfd50d", size = 345649 }, - { url = "https://files.pythonhosted.org/packages/e0/0f/e0d00dc991e3d40e03ca36383b44995126c36b3eafa0ccbbd19664709c88/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dbd586bfa270c1103ece2109314dd423df1fa3d9719928b5d09e4840cec0d72", size = 384776 }, - { url = "https://files.pythonhosted.org/packages/9f/a2/59374837f105f2ca79bde3c3cd1065b2f8c01678900924949f6392eab66d/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6d273f136e912aa101a9274c3145dcbddbe4bac560e77e6d5b3c9f6e0ed06d34", size = 395131 }, - { url = "https://files.pythonhosted.org/packages/9c/dc/48e8d84887627a0fe0bac53f0b4631e90976fd5d35fff8be66b8e4f3916b/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:666fa7b1bd0a3810a7f18f6d3a25ccd8866291fbbc3c9b912b917a6715874bb9", size = 520942 }, - { url = "https://files.pythonhosted.org/packages/7c/f5/ee056966aeae401913d37befeeab57a4a43a4f00099e0a20297f17b8f00c/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:921954d7fbf3fccc7de8f717799304b14b6d9a45bbeec5a8d7408ccbf531faf5", size = 411330 }, - { url = "https://files.pythonhosted.org/packages/ab/74/b2cffb46a097cefe5d17f94ede7a174184b9d158a0aeb195f39f2c0361e8/rpds_py-0.25.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3d86373ff19ca0441ebeb696ef64cb58b8b5cbacffcda5a0ec2f3911732a194", size = 387339 }, - { url = "https://files.pythonhosted.org/packages/7f/9a/0ff0b375dcb5161c2b7054e7d0b7575f1680127505945f5cabaac890bc07/rpds_py-0.25.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c8980cde3bb8575e7c956a530f2c217c1d6aac453474bf3ea0f9c89868b531b6", size = 418077 }, - { url = "https://files.pythonhosted.org/packages/0d/a1/fda629bf20d6b698ae84c7c840cfb0e9e4200f664fc96e1f456f00e4ad6e/rpds_py-0.25.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8eb8c84ecea987a2523e057c0d950bcb3f789696c0499290b8d7b3107a719d78", size = 562441 }, - { url = "https://files.pythonhosted.org/packages/20/15/ce4b5257f654132f326f4acd87268e1006cc071e2c59794c5bdf4bebbb51/rpds_py-0.25.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:e43a005671a9ed5a650f3bc39e4dbccd6d4326b24fb5ea8be5f3a43a6f576c72", size = 590750 }, - { url = "https://files.pythonhosted.org/packages/fb/ab/e04bf58a8d375aeedb5268edcc835c6a660ebf79d4384d8e0889439448b0/rpds_py-0.25.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:58f77c60956501a4a627749a6dcb78dac522f249dd96b5c9f1c6af29bfacfb66", size = 558891 }, - { url = "https://files.pythonhosted.org/packages/90/82/cb8c6028a6ef6cd2b7991e2e4ced01c854b6236ecf51e81b64b569c43d73/rpds_py-0.25.1-cp313-cp313t-win32.whl", hash = "sha256:2cb9e5b5e26fc02c8a4345048cd9998c2aca7c2712bd1b36da0c72ee969a3523", size = 218718 }, - { url = "https://files.pythonhosted.org/packages/b6/97/5a4b59697111c89477d20ba8a44df9ca16b41e737fa569d5ae8bff99e650/rpds_py-0.25.1-cp313-cp313t-win_amd64.whl", hash = "sha256:401ca1c4a20cc0510d3435d89c069fe0a9ae2ee6495135ac46bdd49ec0495763", size = 232218 }, - { url = "https://files.pythonhosted.org/packages/49/74/48f3df0715a585cbf5d34919c9c757a4c92c1a9eba059f2d334e72471f70/rpds_py-0.25.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ee86d81551ec68a5c25373c5643d343150cc54672b5e9a0cafc93c1870a53954", size = 374208 }, - { url = "https://files.pythonhosted.org/packages/55/b0/9b01bb11ce01ec03d05e627249cc2c06039d6aa24ea5a22a39c312167c10/rpds_py-0.25.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89c24300cd4a8e4a51e55c31a8ff3918e6651b241ee8876a42cc2b2a078533ba", size = 359262 }, - { url = "https://files.pythonhosted.org/packages/a9/eb/5395621618f723ebd5116c53282052943a726dba111b49cd2071f785b665/rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:771c16060ff4e79584dc48902a91ba79fd93eade3aa3a12d6d2a4aadaf7d542b", size = 387366 }, - { url = "https://files.pythonhosted.org/packages/68/73/3d51442bdb246db619d75039a50ea1cf8b5b4ee250c3e5cd5c3af5981cd4/rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:785ffacd0ee61c3e60bdfde93baa6d7c10d86f15655bd706c89da08068dc5038", size = 400759 }, - { url = "https://files.pythonhosted.org/packages/b7/4c/3a32d5955d7e6cb117314597bc0f2224efc798428318b13073efe306512a/rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a40046a529cc15cef88ac5ab589f83f739e2d332cb4d7399072242400ed68c9", size = 523128 }, - { url = "https://files.pythonhosted.org/packages/be/95/1ffccd3b0bb901ae60b1dd4b1be2ab98bb4eb834cd9b15199888f5702f7b/rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:85fc223d9c76cabe5d0bff82214459189720dc135db45f9f66aa7cffbf9ff6c1", size = 411597 }, - { url = "https://files.pythonhosted.org/packages/ef/6d/6e6cd310180689db8b0d2de7f7d1eabf3fb013f239e156ae0d5a1a85c27f/rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0be9965f93c222fb9b4cc254235b3b2b215796c03ef5ee64f995b1b69af0762", size = 388053 }, - { url = "https://files.pythonhosted.org/packages/4a/87/ec4186b1fe6365ced6fa470960e68fc7804bafbe7c0cf5a36237aa240efa/rpds_py-0.25.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8378fa4a940f3fb509c081e06cb7f7f2adae8cf46ef258b0e0ed7519facd573e", size = 421821 }, - { url = "https://files.pythonhosted.org/packages/7a/60/84f821f6bf4e0e710acc5039d91f8f594fae0d93fc368704920d8971680d/rpds_py-0.25.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:33358883a4490287e67a2c391dfaea4d9359860281db3292b6886bf0be3d8692", size = 564534 }, - { url = "https://files.pythonhosted.org/packages/41/3a/bc654eb15d3b38f9330fe0f545016ba154d89cdabc6177b0295910cd0ebe/rpds_py-0.25.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1d1fadd539298e70cac2f2cb36f5b8a65f742b9b9f1014dd4ea1f7785e2470bf", size = 592674 }, - { url = "https://files.pythonhosted.org/packages/2e/ba/31239736f29e4dfc7a58a45955c5db852864c306131fd6320aea214d5437/rpds_py-0.25.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9a46c2fb2545e21181445515960006e85d22025bd2fe6db23e76daec6eb689fe", size = 558781 }, +version = "0.26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/aa/4456d84bbb54adc6a916fb10c9b374f78ac840337644e4a5eda229c81275/rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0", size = 27385 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/09/4c/4ee8f7e512030ff79fda1df3243c88d70fc874634e2dbe5df13ba4210078/rpds_py-0.26.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9e8cb77286025bdb21be2941d64ac6ca016130bfdcd228739e8ab137eb4406ed", size = 372610 }, + { url = "https://files.pythonhosted.org/packages/fa/9d/3dc16be00f14fc1f03c71b1d67c8df98263ab2710a2fbd65a6193214a527/rpds_py-0.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e09330b21d98adc8ccb2dbb9fc6cb434e8908d4c119aeaa772cb1caab5440a0", size = 358032 }, + { url = "https://files.pythonhosted.org/packages/e7/5a/7f1bf8f045da2866324a08ae80af63e64e7bfaf83bd31f865a7b91a58601/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9c1b92b774b2e68d11193dc39620d62fd8ab33f0a3c77ecdabe19c179cdbc1", size = 381525 }, + { url = "https://files.pythonhosted.org/packages/45/8a/04479398c755a066ace10e3d158866beb600867cacae194c50ffa783abd0/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:824e6d3503ab990d7090768e4dfd9e840837bae057f212ff9f4f05ec6d1975e7", size = 397089 }, + { url = "https://files.pythonhosted.org/packages/72/88/9203f47268db488a1b6d469d69c12201ede776bb728b9d9f29dbfd7df406/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ad7fd2258228bf288f2331f0a6148ad0186b2e3643055ed0db30990e59817a6", size = 514255 }, + { url = "https://files.pythonhosted.org/packages/f5/b4/01ce5d1e853ddf81fbbd4311ab1eff0b3cf162d559288d10fd127e2588b5/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dc23bbb3e06ec1ea72d515fb572c1fea59695aefbffb106501138762e1e915e", size = 402283 }, + { url = "https://files.pythonhosted.org/packages/34/a2/004c99936997bfc644d590a9defd9e9c93f8286568f9c16cdaf3e14429a7/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d80bf832ac7b1920ee29a426cdca335f96a2b5caa839811803e999b41ba9030d", size = 383881 }, + { url = "https://files.pythonhosted.org/packages/05/1b/ef5fba4a8f81ce04c427bfd96223f92f05e6cd72291ce9d7523db3b03a6c/rpds_py-0.26.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0919f38f5542c0a87e7b4afcafab6fd2c15386632d249e9a087498571250abe3", size = 415822 }, + { url = "https://files.pythonhosted.org/packages/16/80/5c54195aec456b292f7bd8aa61741c8232964063fd8a75fdde9c1e982328/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d422b945683e409000c888e384546dbab9009bb92f7c0b456e217988cf316107", size = 558347 }, + { url = "https://files.pythonhosted.org/packages/f2/1c/1845c1b1fd6d827187c43afe1841d91678d7241cbdb5420a4c6de180a538/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a7711fa562ba2da1aa757e11024ad6d93bad6ad7ede5afb9af144623e5f76a", size = 587956 }, + { url = "https://files.pythonhosted.org/packages/2e/ff/9e979329dd131aa73a438c077252ddabd7df6d1a7ad7b9aacf6261f10faa/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238e8c8610cb7c29460e37184f6799547f7e09e6a9bdbdab4e8edb90986a2318", size = 554363 }, + { url = "https://files.pythonhosted.org/packages/00/8b/d78cfe034b71ffbe72873a136e71acc7a831a03e37771cfe59f33f6de8a2/rpds_py-0.26.0-cp311-cp311-win32.whl", hash = "sha256:893b022bfbdf26d7bedb083efeea624e8550ca6eb98bf7fea30211ce95b9201a", size = 220123 }, + { url = "https://files.pythonhosted.org/packages/94/c1/3c8c94c7dd3905dbfde768381ce98778500a80db9924731d87ddcdb117e9/rpds_py-0.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:87a5531de9f71aceb8af041d72fc4cab4943648d91875ed56d2e629bef6d4c03", size = 231732 }, + { url = "https://files.pythonhosted.org/packages/67/93/e936fbed1b734eabf36ccb5d93c6a2e9246fbb13c1da011624b7286fae3e/rpds_py-0.26.0-cp311-cp311-win_arm64.whl", hash = "sha256:de2713f48c1ad57f89ac25b3cb7daed2156d8e822cf0eca9b96a6f990718cc41", size = 221917 }, + { url = "https://files.pythonhosted.org/packages/ea/86/90eb87c6f87085868bd077c7a9938006eb1ce19ed4d06944a90d3560fce2/rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d", size = 363933 }, + { url = "https://files.pythonhosted.org/packages/63/78/4469f24d34636242c924626082b9586f064ada0b5dbb1e9d096ee7a8e0c6/rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136", size = 350447 }, + { url = "https://files.pythonhosted.org/packages/ad/91/c448ed45efdfdade82348d5e7995e15612754826ea640afc20915119734f/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582", size = 384711 }, + { url = "https://files.pythonhosted.org/packages/ec/43/e5c86fef4be7f49828bdd4ecc8931f0287b1152c0bb0163049b3218740e7/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e", size = 400865 }, + { url = "https://files.pythonhosted.org/packages/55/34/e00f726a4d44f22d5c5fe2e5ddd3ac3d7fd3f74a175607781fbdd06fe375/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15", size = 517763 }, + { url = "https://files.pythonhosted.org/packages/52/1c/52dc20c31b147af724b16104500fba13e60123ea0334beba7b40e33354b4/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8", size = 406651 }, + { url = "https://files.pythonhosted.org/packages/2e/77/87d7bfabfc4e821caa35481a2ff6ae0b73e6a391bb6b343db2c91c2b9844/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a", size = 386079 }, + { url = "https://files.pythonhosted.org/packages/e3/d4/7f2200c2d3ee145b65b3cddc4310d51f7da6a26634f3ac87125fd789152a/rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323", size = 421379 }, + { url = "https://files.pythonhosted.org/packages/ae/13/9fdd428b9c820869924ab62236b8688b122baa22d23efdd1c566938a39ba/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158", size = 562033 }, + { url = "https://files.pythonhosted.org/packages/f3/e1/b69686c3bcbe775abac3a4c1c30a164a2076d28df7926041f6c0eb5e8d28/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3", size = 591639 }, + { url = "https://files.pythonhosted.org/packages/5c/c9/1e3d8c8863c84a90197ac577bbc3d796a92502124c27092413426f670990/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2", size = 557105 }, + { url = "https://files.pythonhosted.org/packages/9f/c5/90c569649057622959f6dcc40f7b516539608a414dfd54b8d77e3b201ac0/rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44", size = 223272 }, + { url = "https://files.pythonhosted.org/packages/7d/16/19f5d9f2a556cfed454eebe4d354c38d51c20f3db69e7b4ce6cff904905d/rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c", size = 234995 }, + { url = "https://files.pythonhosted.org/packages/83/f0/7935e40b529c0e752dfaa7880224771b51175fce08b41ab4a92eb2fbdc7f/rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8", size = 223198 }, + { url = "https://files.pythonhosted.org/packages/6a/67/bb62d0109493b12b1c6ab00de7a5566aa84c0e44217c2d94bee1bd370da9/rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d", size = 363917 }, + { url = "https://files.pythonhosted.org/packages/4b/f3/34e6ae1925a5706c0f002a8d2d7f172373b855768149796af87bd65dcdb9/rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1", size = 350073 }, + { url = "https://files.pythonhosted.org/packages/75/83/1953a9d4f4e4de7fd0533733e041c28135f3c21485faaef56a8aadbd96b5/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e", size = 384214 }, + { url = "https://files.pythonhosted.org/packages/48/0e/983ed1b792b3322ea1d065e67f4b230f3b96025f5ce3878cc40af09b7533/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1", size = 400113 }, + { url = "https://files.pythonhosted.org/packages/69/7f/36c0925fff6f660a80be259c5b4f5e53a16851f946eb080351d057698528/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9", size = 515189 }, + { url = "https://files.pythonhosted.org/packages/13/45/cbf07fc03ba7a9b54662c9badb58294ecfb24f828b9732970bd1a431ed5c/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7", size = 406998 }, + { url = "https://files.pythonhosted.org/packages/6c/b0/8fa5e36e58657997873fd6a1cf621285ca822ca75b4b3434ead047daa307/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04", size = 385903 }, + { url = "https://files.pythonhosted.org/packages/4b/f7/b25437772f9f57d7a9fbd73ed86d0dcd76b4c7c6998348c070d90f23e315/rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1", size = 419785 }, + { url = "https://files.pythonhosted.org/packages/a7/6b/63ffa55743dfcb4baf2e9e77a0b11f7f97ed96a54558fcb5717a4b2cd732/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9", size = 561329 }, + { url = "https://files.pythonhosted.org/packages/2f/07/1f4f5e2886c480a2346b1e6759c00278b8a69e697ae952d82ae2e6ee5db0/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9", size = 590875 }, + { url = "https://files.pythonhosted.org/packages/cc/bc/e6639f1b91c3a55f8c41b47d73e6307051b6e246254a827ede730624c0f8/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba", size = 556636 }, + { url = "https://files.pythonhosted.org/packages/05/4c/b3917c45566f9f9a209d38d9b54a1833f2bb1032a3e04c66f75726f28876/rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b", size = 222663 }, + { url = "https://files.pythonhosted.org/packages/e0/0b/0851bdd6025775aaa2365bb8de0697ee2558184c800bfef8d7aef5ccde58/rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5", size = 234428 }, + { url = "https://files.pythonhosted.org/packages/ed/e8/a47c64ed53149c75fb581e14a237b7b7cd18217e969c30d474d335105622/rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256", size = 222571 }, + { url = "https://files.pythonhosted.org/packages/89/bf/3d970ba2e2bcd17d2912cb42874107390f72873e38e79267224110de5e61/rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618", size = 360475 }, + { url = "https://files.pythonhosted.org/packages/82/9f/283e7e2979fc4ec2d8ecee506d5a3675fce5ed9b4b7cb387ea5d37c2f18d/rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35", size = 346692 }, + { url = "https://files.pythonhosted.org/packages/e3/03/7e50423c04d78daf391da3cc4330bdb97042fc192a58b186f2d5deb7befd/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f", size = 379415 }, + { url = "https://files.pythonhosted.org/packages/57/00/d11ee60d4d3b16808432417951c63df803afb0e0fc672b5e8d07e9edaaae/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83", size = 391783 }, + { url = "https://files.pythonhosted.org/packages/08/b3/1069c394d9c0d6d23c5b522e1f6546b65793a22950f6e0210adcc6f97c3e/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1", size = 512844 }, + { url = "https://files.pythonhosted.org/packages/08/3b/c4fbf0926800ed70b2c245ceca99c49f066456755f5d6eb8863c2c51e6d0/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8", size = 402105 }, + { url = "https://files.pythonhosted.org/packages/1c/b0/db69b52ca07413e568dae9dc674627a22297abb144c4d6022c6d78f1e5cc/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f", size = 383440 }, + { url = "https://files.pythonhosted.org/packages/4c/e1/c65255ad5b63903e56b3bb3ff9dcc3f4f5c3badde5d08c741ee03903e951/rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed", size = 412759 }, + { url = "https://files.pythonhosted.org/packages/e4/22/bb731077872377a93c6e93b8a9487d0406c70208985831034ccdeed39c8e/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632", size = 556032 }, + { url = "https://files.pythonhosted.org/packages/e0/8b/393322ce7bac5c4530fb96fc79cc9ea2f83e968ff5f6e873f905c493e1c4/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c", size = 585416 }, + { url = "https://files.pythonhosted.org/packages/49/ae/769dc372211835bf759319a7aae70525c6eb523e3371842c65b7ef41c9c6/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0", size = 554049 }, + { url = "https://files.pythonhosted.org/packages/6b/f9/4c43f9cc203d6ba44ce3146246cdc38619d92c7bd7bad4946a3491bd5b70/rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9", size = 218428 }, + { url = "https://files.pythonhosted.org/packages/7e/8b/9286b7e822036a4a977f2f1e851c7345c20528dbd56b687bb67ed68a8ede/rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9", size = 231524 }, + { url = "https://files.pythonhosted.org/packages/51/f2/b5c85b758a00c513bb0389f8fc8e61eb5423050c91c958cdd21843faa3e6/rpds_py-0.26.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f61a9326f80ca59214d1cceb0a09bb2ece5b2563d4e0cd37bfd5515c28510674", size = 373505 }, + { url = "https://files.pythonhosted.org/packages/23/e0/25db45e391251118e915e541995bb5f5ac5691a3b98fb233020ba53afc9b/rpds_py-0.26.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:183f857a53bcf4b1b42ef0f57ca553ab56bdd170e49d8091e96c51c3d69ca696", size = 359468 }, + { url = "https://files.pythonhosted.org/packages/0b/73/dd5ee6075bb6491be3a646b301dfd814f9486d924137a5098e61f0487e16/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:941c1cfdf4799d623cf3aa1d326a6b4fdb7a5799ee2687f3516738216d2262fb", size = 382680 }, + { url = "https://files.pythonhosted.org/packages/2f/10/84b522ff58763a5c443f5bcedc1820240e454ce4e620e88520f04589e2ea/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72a8d9564a717ee291f554eeb4bfeafe2309d5ec0aa6c475170bdab0f9ee8e88", size = 397035 }, + { url = "https://files.pythonhosted.org/packages/06/ea/8667604229a10a520fcbf78b30ccc278977dcc0627beb7ea2c96b3becef0/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:511d15193cbe013619dd05414c35a7dedf2088fcee93c6bbb7c77859765bd4e8", size = 514922 }, + { url = "https://files.pythonhosted.org/packages/24/e6/9ed5b625c0661c4882fc8cdf302bf8e96c73c40de99c31e0b95ed37d508c/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aea1f9741b603a8d8fedb0ed5502c2bc0accbc51f43e2ad1337fe7259c2b77a5", size = 402822 }, + { url = "https://files.pythonhosted.org/packages/8a/58/212c7b6fd51946047fb45d3733da27e2fa8f7384a13457c874186af691b1/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4019a9d473c708cf2f16415688ef0b4639e07abaa569d72f74745bbeffafa2c7", size = 384336 }, + { url = "https://files.pythonhosted.org/packages/aa/f5/a40ba78748ae8ebf4934d4b88e77b98497378bc2c24ba55ebe87a4e87057/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:093d63b4b0f52d98ebae33b8c50900d3d67e0666094b1be7a12fffd7f65de74b", size = 416871 }, + { url = "https://files.pythonhosted.org/packages/d5/a6/33b1fc0c9f7dcfcfc4a4353daa6308b3ece22496ceece348b3e7a7559a09/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2abe21d8ba64cded53a2a677e149ceb76dcf44284202d737178afe7ba540c1eb", size = 559439 }, + { url = "https://files.pythonhosted.org/packages/71/2d/ceb3f9c12f8cfa56d34995097f6cd99da1325642c60d1b6680dd9df03ed8/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:4feb7511c29f8442cbbc28149a92093d32e815a28aa2c50d333826ad2a20fdf0", size = 588380 }, + { url = "https://files.pythonhosted.org/packages/c8/ed/9de62c2150ca8e2e5858acf3f4f4d0d180a38feef9fdab4078bea63d8dba/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e99685fc95d386da368013e7fb4269dd39c30d99f812a8372d62f244f662709c", size = 555334 }, ] [[package]] @@ -2923,27 +2934,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.12.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/97/38/796a101608a90494440856ccfb52b1edae90de0b817e76bfade66b12d320/ruff-0.12.1.tar.gz", hash = "sha256:806bbc17f1104fd57451a98a58df35388ee3ab422e029e8f5cf30aa4af2c138c", size = 4413426 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/06/bf/3dba52c1d12ab5e78d75bd78ad52fb85a6a1f29cc447c2423037b82bed0d/ruff-0.12.1-py3-none-linux_armv6l.whl", hash = "sha256:6013a46d865111e2edb71ad692fbb8262e6c172587a57c0669332a449384a36b", size = 10305649 }, - { url = "https://files.pythonhosted.org/packages/8c/65/dab1ba90269bc8c81ce1d499a6517e28fe6f87b2119ec449257d0983cceb/ruff-0.12.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b3f75a19e03a4b0757d1412edb7f27cffb0c700365e9d6b60bc1b68d35bc89e0", size = 11120201 }, - { url = "https://files.pythonhosted.org/packages/3f/3e/2d819ffda01defe857fa2dd4cba4d19109713df4034cc36f06bbf582d62a/ruff-0.12.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9a256522893cb7e92bb1e1153283927f842dea2e48619c803243dccc8437b8be", size = 10466769 }, - { url = "https://files.pythonhosted.org/packages/63/37/bde4cf84dbd7821c8de56ec4ccc2816bce8125684f7b9e22fe4ad92364de/ruff-0.12.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:069052605fe74c765a5b4272eb89880e0ff7a31e6c0dbf8767203c1fbd31c7ff", size = 10660902 }, - { url = "https://files.pythonhosted.org/packages/0e/3a/390782a9ed1358c95e78ccc745eed1a9d657a537e5c4c4812fce06c8d1a0/ruff-0.12.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a684f125a4fec2d5a6501a466be3841113ba6847827be4573fddf8308b83477d", size = 10167002 }, - { url = "https://files.pythonhosted.org/packages/6d/05/f2d4c965009634830e97ffe733201ec59e4addc5b1c0efa035645baa9e5f/ruff-0.12.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdecdef753bf1e95797593007569d8e1697a54fca843d78f6862f7dc279e23bd", size = 11751522 }, - { url = "https://files.pythonhosted.org/packages/35/4e/4bfc519b5fcd462233f82fc20ef8b1e5ecce476c283b355af92c0935d5d9/ruff-0.12.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:70d52a058c0e7b88b602f575d23596e89bd7d8196437a4148381a3f73fcd5010", size = 12520264 }, - { url = "https://files.pythonhosted.org/packages/85/b2/7756a6925da236b3a31f234b4167397c3e5f91edb861028a631546bad719/ruff-0.12.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84d0a69d1e8d716dfeab22d8d5e7c786b73f2106429a933cee51d7b09f861d4e", size = 12133882 }, - { url = "https://files.pythonhosted.org/packages/dd/00/40da9c66d4a4d51291e619be6757fa65c91b92456ff4f01101593f3a1170/ruff-0.12.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6cc32e863adcf9e71690248607ccdf25252eeeab5193768e6873b901fd441fed", size = 11608941 }, - { url = "https://files.pythonhosted.org/packages/91/e7/f898391cc026a77fbe68dfea5940f8213622474cb848eb30215538a2dadf/ruff-0.12.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fd49a4619f90d5afc65cf42e07b6ae98bb454fd5029d03b306bd9e2273d44cc", size = 11602887 }, - { url = "https://files.pythonhosted.org/packages/f6/02/0891872fc6aab8678084f4cf8826f85c5d2d24aa9114092139a38123f94b/ruff-0.12.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ed5af6aaaea20710e77698e2055b9ff9b3494891e1b24d26c07055459bb717e9", size = 10521742 }, - { url = "https://files.pythonhosted.org/packages/2a/98/d6534322c74a7d47b0f33b036b2498ccac99d8d8c40edadb552c038cecf1/ruff-0.12.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:801d626de15e6bf988fbe7ce59b303a914ff9c616d5866f8c79eb5012720ae13", size = 10149909 }, - { url = "https://files.pythonhosted.org/packages/34/5c/9b7ba8c19a31e2b6bd5e31aa1e65b533208a30512f118805371dbbbdf6a9/ruff-0.12.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2be9d32a147f98a1972c1e4df9a6956d612ca5f5578536814372113d09a27a6c", size = 11136005 }, - { url = "https://files.pythonhosted.org/packages/dc/34/9bbefa4d0ff2c000e4e533f591499f6b834346025e11da97f4ded21cb23e/ruff-0.12.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:49b7ce354eed2a322fbaea80168c902de9504e6e174fd501e9447cad0232f9e6", size = 11648579 }, - { url = "https://files.pythonhosted.org/packages/6f/1c/20cdb593783f8f411839ce749ec9ae9e4298c2b2079b40295c3e6e2089e1/ruff-0.12.1-py3-none-win32.whl", hash = "sha256:d973fa626d4c8267848755bd0414211a456e99e125dcab147f24daa9e991a245", size = 10519495 }, - { url = "https://files.pythonhosted.org/packages/cf/56/7158bd8d3cf16394928f47c637d39a7d532268cd45220bdb6cd622985760/ruff-0.12.1-py3-none-win_amd64.whl", hash = "sha256:9e1123b1c033f77bd2590e4c1fe7e8ea72ef990a85d2484351d408224d603013", size = 11547485 }, - { url = "https://files.pythonhosted.org/packages/91/d0/6902c0d017259439d6fd2fd9393cea1cfe30169940118b007d5e0ea7e954/ruff-0.12.1-py3-none-win_arm64.whl", hash = "sha256:78ad09a022c64c13cc6077707f036bab0fac8cd7088772dcd1e5be21c5002efc", size = 10691209 }, +version = "0.12.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/3d/d9a195676f25d00dbfcf3cf95fdd4c685c497fcfa7e862a44ac5e4e96480/ruff-0.12.2.tar.gz", hash = "sha256:d7b4f55cd6f325cb7621244f19c873c565a08aff5a4ba9c69aa7355f3f7afd3e", size = 4432239 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/74/b6/2098d0126d2d3318fd5bec3ad40d06c25d377d95749f7a0c5af17129b3b1/ruff-0.12.2-py3-none-linux_armv6l.whl", hash = "sha256:093ea2b221df1d2b8e7ad92fc6ffdca40a2cb10d8564477a987b44fd4008a7be", size = 10369761 }, + { url = "https://files.pythonhosted.org/packages/b1/4b/5da0142033dbe155dc598cfb99262d8ee2449d76920ea92c4eeb9547c208/ruff-0.12.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:09e4cf27cc10f96b1708100fa851e0daf21767e9709e1649175355280e0d950e", size = 11155659 }, + { url = "https://files.pythonhosted.org/packages/3e/21/967b82550a503d7c5c5c127d11c935344b35e8c521f52915fc858fb3e473/ruff-0.12.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:8ae64755b22f4ff85e9c52d1f82644abd0b6b6b6deedceb74bd71f35c24044cc", size = 10537769 }, + { url = "https://files.pythonhosted.org/packages/33/91/00cff7102e2ec71a4890fb7ba1803f2cdb122d82787c7d7cf8041fe8cbc1/ruff-0.12.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eb3a6b2db4d6e2c77e682f0b988d4d61aff06860158fdb413118ca133d57922", size = 10717602 }, + { url = "https://files.pythonhosted.org/packages/9b/eb/928814daec4e1ba9115858adcda44a637fb9010618721937491e4e2283b8/ruff-0.12.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:73448de992d05517170fc37169cbca857dfeaeaa8c2b9be494d7bcb0d36c8f4b", size = 10198772 }, + { url = "https://files.pythonhosted.org/packages/50/fa/f15089bc20c40f4f72334f9145dde55ab2b680e51afb3b55422effbf2fb6/ruff-0.12.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b8b94317cbc2ae4a2771af641739f933934b03555e51515e6e021c64441532d", size = 11845173 }, + { url = "https://files.pythonhosted.org/packages/43/9f/1f6f98f39f2b9302acc161a4a2187b1e3a97634fe918a8e731e591841cf4/ruff-0.12.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:45fc42c3bf1d30d2008023a0a9a0cfb06bf9835b147f11fe0679f21ae86d34b1", size = 12553002 }, + { url = "https://files.pythonhosted.org/packages/d8/70/08991ac46e38ddd231c8f4fd05ef189b1b94be8883e8c0c146a025c20a19/ruff-0.12.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce48f675c394c37e958bf229fb5c1e843e20945a6d962cf3ea20b7a107dcd9f4", size = 12171330 }, + { url = "https://files.pythonhosted.org/packages/88/a9/5a55266fec474acfd0a1c73285f19dd22461d95a538f29bba02edd07a5d9/ruff-0.12.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793d8859445ea47591272021a81391350205a4af65a9392401f418a95dfb75c9", size = 11774717 }, + { url = "https://files.pythonhosted.org/packages/87/e5/0c270e458fc73c46c0d0f7cf970bb14786e5fdb88c87b5e423a4bd65232b/ruff-0.12.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6932323db80484dda89153da3d8e58164d01d6da86857c79f1961934354992da", size = 11646659 }, + { url = "https://files.pythonhosted.org/packages/b7/b6/45ab96070c9752af37f0be364d849ed70e9ccede07675b0ec4e3ef76b63b/ruff-0.12.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6aa7e623a3a11538108f61e859ebf016c4f14a7e6e4eba1980190cacb57714ce", size = 10604012 }, + { url = "https://files.pythonhosted.org/packages/86/91/26a6e6a424eb147cc7627eebae095cfa0b4b337a7c1c413c447c9ebb72fd/ruff-0.12.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2a4a20aeed74671b2def096bdf2eac610c7d8ffcbf4fb0e627c06947a1d7078d", size = 10176799 }, + { url = "https://files.pythonhosted.org/packages/f5/0c/9f344583465a61c8918a7cda604226e77b2c548daf8ef7c2bfccf2b37200/ruff-0.12.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:71a4c550195612f486c9d1f2b045a600aeba851b298c667807ae933478fcef04", size = 11241507 }, + { url = "https://files.pythonhosted.org/packages/1c/b7/99c34ded8fb5f86c0280278fa89a0066c3760edc326e935ce0b1550d315d/ruff-0.12.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4987b8f4ceadf597c927beee65a5eaf994c6e2b631df963f86d8ad1bdea99342", size = 11717609 }, + { url = "https://files.pythonhosted.org/packages/51/de/8589fa724590faa057e5a6d171e7f2f6cffe3287406ef40e49c682c07d89/ruff-0.12.2-py3-none-win32.whl", hash = "sha256:369ffb69b70cd55b6c3fc453b9492d98aed98062db9fec828cdfd069555f5f1a", size = 10523823 }, + { url = "https://files.pythonhosted.org/packages/94/47/8abf129102ae4c90cba0c2199a1a9b0fa896f6f806238d6f8c14448cc748/ruff-0.12.2-py3-none-win_amd64.whl", hash = "sha256:dca8a3b6d6dc9810ed8f328d406516bf4d660c00caeaef36eb831cf4871b0639", size = 11629831 }, + { url = "https://files.pythonhosted.org/packages/e2/1f/72d2946e3cc7456bb837e88000eb3437e55f80db339c840c04015a11115d/ruff-0.12.2-py3-none-win_arm64.whl", hash = "sha256:48d6c6bfb4761df68bc05ae630e24f506755e702d4fb08f08460be778c7ccb12", size = 10735334 }, ] [[package]] @@ -3390,11 +3401,11 @@ wheels = [ [[package]] name = "typing-extensions" -version = "4.14.0" +version = "4.14.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d1/bc/51647cd02527e87d05cb083ccc402f93e441606ff1f01739a62c8ad09ba5/typing_extensions-4.14.0.tar.gz", hash = "sha256:8676b788e32f02ab42d9e7c61324048ae4c6d844a399eebace3d4979d75ceef4", size = 107423 } +sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673 } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/e0/552843e0d356fbb5256d21449fa957fa4eff3bbc135a74a691ee70c7c5da/typing_extensions-4.14.0-py3-none-any.whl", hash = "sha256:a1514509136dd0b477638fc68d6a91497af5076466ad0fa6c338e44e359944af", size = 43839 }, + { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906 }, ] [[package]] @@ -3642,16 +3653,16 @@ wheels = [ [[package]] name = "xarray" -version = "2025.6.1" +version = "2025.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, { name = "packaging" }, { name = "pandas" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/19/ec/e50d833518f10b0c24feb184b209bb6856f25b919ba8c1f89678b930b1cd/xarray-2025.6.1.tar.gz", hash = "sha256:a84f3f07544634a130d7dc615ae44175419f4c77957a7255161ed99c69c7c8b0", size = 3003185 } +sdist = { url = "https://files.pythonhosted.org/packages/75/b5/d2f1fb2f583ae803b86280dcb7a4f81eef9d4c54f1ecde2307d1b6b1a147/xarray-2025.7.0.tar.gz", hash = "sha256:fd83ac8d638e7caef9d7f0c82bcdf380cede29d2ff84575133b2b95164af78ee", size = 3005754 } wheels = [ - { url = "https://files.pythonhosted.org/packages/82/8a/6b50c1dd2260d407c1a499d47cf829f59f07007e0dcebafdabb24d1d26a5/xarray-2025.6.1-py3-none-any.whl", hash = "sha256:8b988b47f67a383bdc3b04c5db475cd165e580134c1f1943d52aee4a9c97651b", size = 1314739 }, + { url = "https://files.pythonhosted.org/packages/6e/40/c9127ffdcceb865044267eb8cccfd8973ee5f8174677d2a67f50df626674/xarray-2025.7.0-py3-none-any.whl", hash = "sha256:7b5d7267bd554ae119c7a0062f62b50517b4dd1968efc11f2553826b7d99297f", size = 1316539 }, ] [[package]] @@ -3762,7 +3773,7 @@ wheels = [ [[package]] name = "zarr" -version = "3.0.8" +version = "3.0.10" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "donfig" }, @@ -3771,9 +3782,9 @@ dependencies = [ { name = "packaging" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/52/60/9652fd0536fbaca8d08cbc1a5572c52e0ce01773297df75da8bb47e45907/zarr-3.0.8.tar.gz", hash = "sha256:88505d095af899a88ae8ac4db02f4650ef0801d2ff6f65b6d1f0a45dcf760a6d", size = 256825 } +sdist = { url = "https://files.pythonhosted.org/packages/07/10/a1b6eabeb5a8681916568a7c6a7a1849c952131be127ccbd57e05d47d43e/zarr-3.0.10.tar.gz", hash = "sha256:1fd1318ade646f692d8f604be0e0ad125675a061196e612e3f7a2cfa9e957d1c", size = 263594 } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/3b/e20bdf84088c11f2c396d034506cbffadd53e024111c1aa4585c2aba1523/zarr-3.0.8-py3-none-any.whl", hash = "sha256:7f81e7aec086437d98882aa432209107114bd7f3a9f4958b2af9c6b5928a70a7", size = 205364 }, + { url = "https://files.pythonhosted.org/packages/45/57/3329346940f78de49047ddcb03fdbca9e16450c3a942688bf24201a322e5/zarr-3.0.10-py3-none-any.whl", hash = "sha256:110724c045fbe4ff5509a8a2a6b6098cb244a6af43da85eaeecef9821473163f", size = 209508 }, ] [[package]] From 4b2b1638189bf96299c22c5d1fcbd16322d17aec Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Mon, 7 Jul 2025 19:18:45 +0000 Subject: [PATCH 26/56] Revert .container changes --- .devcontainer/Dockerfile.cli | 47 ------------------------- .devcontainer/Dockerfile.dev | 61 --------------------------------- .devcontainer/Dockerfile.nox | 49 -------------------------- .devcontainer/devcontainer.json | 20 +++++------ 4 files changed, 9 insertions(+), 168 deletions(-) delete mode 100644 .devcontainer/Dockerfile.cli delete mode 100644 .devcontainer/Dockerfile.dev delete mode 100644 .devcontainer/Dockerfile.nox diff --git a/.devcontainer/Dockerfile.cli b/.devcontainer/Dockerfile.cli deleted file mode 100644 index 92720e34e..000000000 --- a/.devcontainer/Dockerfile.cli +++ /dev/null @@ -1,47 +0,0 @@ -# HOW TO BUILD AND RUN THIS DOCKERFILE -# * Clone mdio-python and build a Docker image: -# git clone https://github.com/TGSAI/mdio-python.git -# cd mdio-python -# docker build -t mdio-cli -f .devcontainer/Dockerfile.cli . -# * Run /bin/bash in the Docker container: -# -# -# USAGE: -# docker run -it --rm --name mdio-cli mdio-cli --version -# docker run -it --rm --name mdio-cli mdio-cli --help -# -# LOCAL_DATA_DIR=$(pwd); \ -# docker run -it --rm -v $LOCAL_DATA_DIR:/DATA --name mdio-cli mdio-cli \ -# segy import \ -# /DATA/segy_file.segy \ -# /DATA/mdio_file.mdio \ -# -loc 181,185 \ -# -names inline,crossline -# -# LOCAL_DATA_DIR=$(pwd); \ -# docker run -it --rm -v $LOCAL_DATA_DIR:/DATA --name mdio-cli mdio-cli \ -# segy export \ -# /DATA/mdio_file.mdio \ -# /DATA/segy_file_copy.segy -# -FROM python:3.13-bookworm -# Create the user (https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user) -ENV USERNAME=python -ENV USER_UID=1000 -ENV USER_GID=$USER_UID -RUN groupadd --gid $USER_GID $USERNAME && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME - -# Set the default non-root user -USER $USERNAME - -# Add path to the user-installed packages -ENV PYTHONUSERBASE=/home/$USERNAME/.local -ENV PATH="$PYTHONUSERBASE/bin:$PATH" - -COPY --chown=$USERNAME:$USERNAME ./ /home/$USERNAME/mdio-python - -WORKDIR /home/$USERNAME/mdio-python -RUN pip install . - -ENTRYPOINT ["mdio"] -CMD ["--version"] diff --git a/.devcontainer/Dockerfile.dev b/.devcontainer/Dockerfile.dev deleted file mode 100644 index 05f135799..000000000 --- a/.devcontainer/Dockerfile.dev +++ /dev/null @@ -1,61 +0,0 @@ -# USAGE: -# This file will be used by the VS Code DevContainer extension -# to create a development environment for the mdio-python project. -# HOW TO RUN TESTS -# 1. Open the project in VS Code. -# 2. Open the Command Palette (Ctrl+Shift+P) and select "Dev Containers: Reopen in Container". -# 3. Once the container is running, open a terminal in VS Code. -# 4. Run the tests using the command: `nox -s test`. -# HOW TO MANUALLY BUILD AND RUN THE CONTAINER -# docker build -t mdio-dev -f .devcontainer/Dockerfile.dev . -# docker run -it --rm --entrypoint /bin/bash --name mdio-dev mdio-dev -# NOTES: -# 1. The container will be run as the non-root user 'vscode' with UID 1000. -# 2. The virtual environment will be setup at /home/vscode/venv -# 3. The project source code will be mounted at /workspaces/mdio-python -ARG PYTHON_VERSION="3.13" -ARG LINUX_DISTRO="bookworm" -ARG UV_VERSION="0.6.11" -ARG NOX_VERSION="2025.2.9" -FROM mcr.microsoft.com/devcontainers/python:1-${PYTHON_VERSION}-${LINUX_DISTRO} - -# Install git for nox pre-commit -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - git \ - && rm -rf /var/lib/apt/lists/* - -ENV USERNAME="vscode" -USER $USERNAME - -# # Add path to the user-installed packages -# ENV PYTHONUSERBASE=/home/$USERNAME/.local -# ENV PATH="$PYTHONUSERBASE/bin:$PATH" - -COPY --chown=$USERNAME:$USERNAME ./ /workspaces/mdio-python - -WORKDIR /workspaces/mdio-python - -ARG UV_VERSION -ARG NOX_VERSION -RUN python3 -m pip install uv==${UV_VERSION} nox==${NOX_VERSION} msgpack ipykernel - -# Initialize virtual environement in the container -ENV VIRTUAL_ENV="/home/$USERNAME/venv" -RUN python3 -m venv $VIRTUAL_ENV -ENV PATH="$VIRTUAL_ENV/bin:$PATH" - -# installing pytest is required for VS Code Python Testing -RUN pip install pytest pytest-cov pytest-mock pytest-asyncio - -# Install the project in editable mode -# This allows for live reloading of the code during development -RUN pip install -e . - -# RUN uv pip install snakeviz - - - - - - diff --git a/.devcontainer/Dockerfile.nox b/.devcontainer/Dockerfile.nox deleted file mode 100644 index 103673fd2..000000000 --- a/.devcontainer/Dockerfile.nox +++ /dev/null @@ -1,49 +0,0 @@ -# HOW TO BUILD AND RUN THIS DOCKERFILE -# 1. Make sure you have Docker installed and running. -# 2. Clone mdio-python and build the Docker image: -# git clone https://github.com/TGSAI/mdio-python.git -# cd mdio-python -# docker build -t mdio-nox -f .devcontainer/Dockerfile.nox . -# 3. Run /bin/bash in the Docker container : -# LOCAL_DATA_DIR=$(pwd); \ -# docker run -it --rm -v $LOCAL_DATA_DIR:/DATA --entrypoint /bin/bash --name mdio-nox mdio-nox -# -# USAGE: -# docker run -it --rm mdio-nox --list -# docker run -it --rm mdio-nox -s tests-3.13 -# docker run -it --rm mdio-nox --no-stop-on-first-error -# -# NOTE: nox will fail if run in the directory mounted from the host machine -ARG PYTHON_VERSION="3.13" -ARG LINUX_DISTRO="bookworm" -ARG UV_VERSION="0.6.11" -ARG NOX_VERSION="2025.2.9" -FROM python:${PYTHON_VERSION}-${LINUX_DISTRO} -ARG PYTHON_VERSION -ARG LINUX_DISTRO -RUN echo "Using python:${PYTHON_VERSION}-${LINUX_DISTRO}" -# Create the user (https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user) -ENV USERNAME=python -ENV USER_UID=1000 -ENV USER_GID=$USER_UID -RUN groupadd --gid $USER_GID $USERNAME && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME -# Set the default non-root user -USER $USERNAME - -# Add path to the user-installed packages -ENV PYTHONUSERBASE=/home/$USERNAME/.local -ENV PATH="$PYTHONUSERBASE/bin:$PATH" - -COPY --chown=$USERNAME:$USERNAME ./ /home/$USERNAME/mdio-python - -WORKDIR /home/$USERNAME/mdio-python -RUN pip install . - -# Install UV dependency manager and Nox test automator -ARG UV_VERSION -ARG NOX_VERSION -RUN echo "Using uv: $UV_VERSION and nox: $NOX_VERSION" -RUN python3 -m pip install uv==${UV_VERSION} nox==${NOX_VERSION} msgpack ipykernel - -ENTRYPOINT ["nox"] -CMD ["--list"] \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index dc80446c6..b618a5260 100755 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,12 +2,12 @@ // README at: https://github.com/devcontainers/templates/tree/main/src/python { "build": { - "dockerfile": "Dockerfile.dev", + "dockerfile": "Dockerfile", "context": ".." }, // Use 'postCreateCommand' to run commands after the container is created. "postCreateCommand": { - // "post_create_script": "bash ./.devcontainer/post-install.sh" + "post_create_script": "bash ./.devcontainer/post-install.sh" }, // Forward 8787 to enable us to view dask dashboard "forwardPorts": [8787], @@ -16,9 +16,8 @@ // Configure properties specific to VS Code. "vscode": { "settings": { - "python.testing.pytestArgs": ["tests"], - "python.testing.unittestEnabled": false, - "python.testing.pytestEnabled": true + "python.terminal.activateEnvInCurrentTerminal": true, + "python.defaultInterpreterPath": "/opt/venv/bin/python" }, "extensions": [ "ms-python.python", @@ -28,18 +27,17 @@ "ms-toolsai.jupyter-renderers", "vscode-icons-team.vscode-icons", "wayou.vscode-todo-highlight", - "streetsidesoftware.code-spell-checker", - "eamodio.gitlens", - "visualstudioexptteam.vscodeintellicode" + "streetsidesoftware.code-spell-checker" ] } }, // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. // "remoteUser": "root", "updateRemoteUserUID": true, - "workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/mdio-python,type=bind", - "workspaceFolder": "/workspaces/mdio-python", "mounts": [ - // "source=${localWorkspaceFolder}/../DATA/,target=/DATA/,type=bind,consistency=cached" + // Re-use local Git configuration + "source=${localEnv:HOME}/.gitconfig,target=/home/vscode/.gitconfig_tmp,type=bind,consistency=cached", + "source=${localEnv:HOME}/.gitconfig,target=/root/.gitconfig_tmp,type=bind,consistency=cached", + "source=${localEnv:SCRATCH_DIR}/${localEnv:USER},target=/scratch/,type=bind,consistency=cached" ] } From c532c3b9e914b11f09c550f968c0c7ae350e6147 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Mon, 7 Jul 2025 19:24:03 +0000 Subject: [PATCH 27/56] PR review: remove DEVELOPER_NOTES.md --- DEVELOPER_NOTES.md | 136 --------------------------------------------- 1 file changed, 136 deletions(-) delete mode 100644 DEVELOPER_NOTES.md diff --git a/DEVELOPER_NOTES.md b/DEVELOPER_NOTES.md deleted file mode 100644 index dec21dfe2..000000000 --- a/DEVELOPER_NOTES.md +++ /dev/null @@ -1,136 +0,0 @@ -# Developer Notes - -## MDIO v1 scope of work - -### TASK 1: Creation an empty MDIO v1 dataset with metadata defined using the v1 schema -#### DESCRIPTION -In the v0, the following code was used to create an empty dataset: - -```Python -grid = Grid([Dimension("inline",...), Dimension("crossline", ...), Dimension("depth", ...)]) -variable = MDIOVariableConfig("stack_amplitude", ...) -create_conf = MDIOCreateConfig(path="demo.mdio", grid=grid, variables=[variable]) -create_empty(config=create_conf) -``` - -In the v1 it is replaced with the following API, which uses v1 schema: - -```Python -builder = MDIODatasetBuilder(...) -builder.add_dimension("inline", ...) -builder.add_dimension("crossline",...) -builder.add_dimension("depth", ...) -builder.add_coordinate("cdp_x",...) -builder.add_coordinate("cdp_y",...) -builder.add_variable("stack_amplitude",...) -builder.to_mdio(store="demo.mdio") -``` - -#### DEFINITION OF DONE -* The resulting v1 MDIO control `demo.mdio` file structure must be identical between Python and C++ -* Code coverage 90% -* Code documentation will be updated: - * API doc strings are reviewed - * docs/tutorials/creation.ipynb - current version describes v0 API. Should be updated with v1 API - * docs/api_reference.md - will be updated with new API - -#### ASSUMPTIONS -We expect that the following v0 workflows to keep working with this change -* Populating MDIOs -* Updating File and Checking with MDIOReader -* Write to SEG-Y - -## Overall API design and implementation -We will have only a strongly-typed (see pydantic) API. For example: - -```Python -VariableMetadataList: TypeAlias = list[AllUnits | UserAttributes | ChunkGridMetadata | StatisticsMetadata] -def add_dimension( - self, - name: str, - size: int, - long_name: str = None, - data_type: ScalarType | StructuredType = ScalarType.INT32, - metadata_info: VariableMetadataList | None = None, -) -> "MDIODatasetBuilder": -``` - -Which will be used as following: - -```Python -builder.add_dimension( - "length", - size=100, - data_type=ScalarType.FLOAT32, - metadata_info=[ - AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)), - UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}), - ChunkGridMetadata( - chunk_grid=RegularChunkGrid( - configuration=RegularChunkShape( - chunk_shape=[20]))), - StatisticsMetadata(stats_v1=SummaryStatistics( - count=100, - sum=1215.1, - sumSquares=125.12, - min=5.61, - max=10.84, - histogram=CenteredBinHistogram( - binCenters=[1, 2], - counts=[10, 15]))) - ] -) -``` -### Notes -* When a coordinate or a variable is created, their schema allows to store their dimensions either as - * list of dimensions name `list[str]`, where the names refer to the dimensions defined in the builder._dimensions - * list of named dimensions `list[NamedDimension]`, which duplicate the dimensions defined in the builder._dimensions - * Mixture of the two above `list[NamedDimension | str]` - - which approach should be used? - - `RESOLUTION: We will be using the first approach.` - - **IMPORTANT: For binary compatibility, We need to ensure that the C++ code follows the same logic** - -* Metadata population from a dictionary in add_coordinate() and add_variable() will not be supported to ensure that the API is strongly-typed. If it is needed, such conversion should be done as a separate step: - ```Python - def make_variable_metadata_list_from_dict(metadata: dict[str, Any]) -> VariableMetadataList: - # Implementation goes here - def make_coordinate_metadata_list_from_dict(metadata: dict[str, Any]) -> CoordinateMetadataList: - # Implementation goes here - ``` - `RESOLUTION: The approach confirmed.` - -## Schema V1 questions - -* add_dimension(): Can a dimension with the same name be added multiple times. Options: - * Allowed: the second request is ignored (current implementation) - * Not Allowed: should it raise an error? - - `RESOLUTION: The dimensions with the same name are not allowed` -* The pydantic attribute names are different from the v1 schema attributes names. What are the repercussions? - ``` - 'statsV1' <-> 'stats_v1' - 'unitsV1' <-> 'units_v1' - 'chunkGrid' <-> 'chunk_grid' - ``` - `Under investigation` -* Should histogram (e.g., SummaryStatistics) have a `histogram_type` attribute? - - `Under investigation` -* Units - * Why 'ftUS' is not supported by the schema? U.S. survey foot vs the International Foot: - *"The U.S. survey foot is defined as 1200/3937 meters, while the international foot is defined as exactly 0.3048 meters. - https://www.axiomint.com/survey-foot-versus-international-foot-whats-the-difference/ - "The REAL issue is when ... applied to State Plane coordinates in the N2,000,000 and E6,000,000 range! - This ... moves a State Plane coordinate position 4 feet by 12 feet."* - * Why there are no dimensionless unis (for seismic amplitudes, inlines, etc.) - - `Under investigation` - -## Design suggestions -* Should we rename add_dimension to add_dimension_variable (or similar) to indicate that we not just providing the dimension name, but also creating the dimension variable - - `RESOLUTION: Shorter names are preferable for public API. The function behavior will be described in the docs` - From 08798cd7323bb48653503f6de557619dd7cdb1c5 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Mon, 7 Jul 2025 19:36:04 +0000 Subject: [PATCH 28/56] PR Review: add_coordinate() should accept only data_type: ScalarType --- src/mdio/schemas/v1/dataset_builder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mdio/schemas/v1/dataset_builder.py b/src/mdio/schemas/v1/dataset_builder.py index 701fdbba3..89711e0c3 100644 --- a/src/mdio/schemas/v1/dataset_builder.py +++ b/src/mdio/schemas/v1/dataset_builder.py @@ -172,7 +172,7 @@ def add_coordinate( # noqa: PLR0913 *, long_name: str = None, dimensions: list[str], - data_type: ScalarType | StructuredType = ScalarType.FLOAT32, + data_type: ScalarType = ScalarType.FLOAT32, metadata_info: CoordinateMetadataList | None = None, ) -> "MDIODatasetBuilder": """Add a coordinate after adding at least one dimension. From e8febe4f9749f15da8ae3f063d78898cfde3412b Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Mon, 7 Jul 2025 19:50:49 +0000 Subject: [PATCH 29/56] PR review: add_variable() data_type remove default --- src/mdio/schemas/v1/dataset_builder.py | 2 +- .../v1/test_dataset_builder_add_variable.py | 26 ++++++++++++------- tests/unit/v1/test_dataset_builder_build.py | 4 ++- 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/mdio/schemas/v1/dataset_builder.py b/src/mdio/schemas/v1/dataset_builder.py index 89711e0c3..dbedd3d6d 100644 --- a/src/mdio/schemas/v1/dataset_builder.py +++ b/src/mdio/schemas/v1/dataset_builder.py @@ -248,7 +248,7 @@ def add_variable( # noqa: PLR0913 *, long_name: str = None, dimensions: list[str], - data_type: ScalarType | StructuredType = ScalarType.FLOAT32, + data_type: ScalarType | StructuredType, compressor: Blosc | ZFP | None = None, coordinates: list[str] | None = None, metadata_info: VariableMetadataList | None = None, diff --git a/tests/unit/v1/test_dataset_builder_add_variable.py b/tests/unit/v1/test_dataset_builder_add_variable.py index ca6d8f955..5484ea92b 100644 --- a/tests/unit/v1/test_dataset_builder_add_variable.py +++ b/tests/unit/v1/test_dataset_builder_add_variable.py @@ -30,7 +30,7 @@ def test_add_variable() -> None: msg = "Must add at least one dimension before adding variables" with pytest.raises(ValueError, match=msg): - builder.add_variable("amplitude", dimensions=["speed"]) + builder.add_variable("amplitude", dimensions=["speed"], data_type = ScalarType.FLOAT32) builder.add_dimension("inline", 100) builder.add_dimension("crossline", 100) @@ -39,20 +39,24 @@ def test_add_variable() -> None: # Validate required parameters bad_name = None with pytest.raises(ValueError, match="'name' must be a non-empty string"): - builder.add_variable(bad_name, dimensions=["speed"]) + builder.add_variable(bad_name, dimensions=["speed"], data_type = ScalarType.FLOAT32) with pytest.raises(ValueError, match="'name' must be a non-empty string"): - builder.add_variable("", dimensions=["speed"]) + builder.add_variable("", dimensions=["speed"], data_type = ScalarType.FLOAT32) with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): - builder.add_variable("bad_amplitude", dimensions=None) + builder.add_variable("bad_amplitude", dimensions=None, data_type = ScalarType.FLOAT32) with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): - builder.add_variable("bad_amplitude", dimensions=[]) + builder.add_variable("bad_amplitude", dimensions=[], data_type = ScalarType.FLOAT32) # Add a variable using non-existent dimensions msg="Pre-existing dimension named 'xline' is not found" with pytest.raises(ValueError, match=msg): - builder.add_variable("bad_amplitude", dimensions=["inline", "xline", "depth"]) + builder.add_variable("bad_amplitude", + dimensions=["inline", "xline", "depth"], + data_type = ScalarType.FLOAT32) - builder.add_variable("amplitude", dimensions=["inline", "crossline", "depth"]) + builder.add_variable("amplitude", + dimensions=["inline", "crossline", "depth"], + data_type = ScalarType.FLOAT32) assert builder._state == _BuilderState.HAS_VARIABLES assert len(builder._dimensions) == 3 assert len(builder._variables) == 4 @@ -63,6 +67,7 @@ def test_add_variable() -> None: with pytest.raises(ValueError, match=msg): builder.add_variable("bad_amplitude", dimensions=["inline", "crossline", "depth"], + data_type = ScalarType.FLOAT32, coordinates=["cdp-x", "cdp-y"]) builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"]) @@ -72,7 +77,8 @@ def test_add_variable() -> None: msg="Adding variable with the same name twice is not allowed" with pytest.raises(ValueError, match=msg): builder.add_variable("amplitude", - dimensions=["inline", "crossline", "depth"]) + dimensions=["inline", "crossline", "depth"], + data_type = ScalarType.FLOAT32) def test_add_variable_with_defaults() -> None: @@ -82,7 +88,9 @@ def test_add_variable_with_defaults() -> None: builder.add_dimension("crossline", 100) builder.add_dimension("depth", 100) # Add variable using defaults - builder.add_variable("seismic_amplitude", dimensions=["inline", "crossline", "depth"]) + builder.add_variable("seismic_amplitude", + dimensions=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT32) assert len(builder._dimensions) == 3 assert len(builder._variables) == 4 assert len(builder._coordinates) == 0 diff --git a/tests/unit/v1/test_dataset_builder_build.py b/tests/unit/v1/test_dataset_builder_build.py index 488a9e6d2..2af86cdfc 100644 --- a/tests/unit/v1/test_dataset_builder_build.py +++ b/tests/unit/v1/test_dataset_builder_build.py @@ -33,7 +33,9 @@ def test_build() -> None: .add_dimension("y", 200) .add_coordinate("x_coord", dimensions=["x"]) .add_coordinate("y_coord", dimensions=["y"]) - .add_variable("data", dimensions=["x", "y"], long_name="Test Data") + .add_variable("data", dimensions=["x", "y"], + long_name="Test Data", + data_type=ScalarType.FLOAT32) .build() ) assert isinstance(dataset, Dataset) From 0a4be3f34dbb10ad5aac6716673fd479d816549c Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Tue, 8 Jul 2025 18:24:51 +0000 Subject: [PATCH 30/56] RE review: do not add dimension variable --- src/mdio/schemas/v1/dataset_builder.py | 152 ++++---- .../v1/test_dataset_builder_add_coordinate.py | 143 ++++--- .../v1/test_dataset_builder_add_dimension.py | 167 +-------- .../v1/test_dataset_builder_add_variable.py | 349 +++++++++++++----- tests/unit/v1/test_dataset_builder_build.py | 105 ++++-- tests/unit/v1/test_dataset_builder_helpers.py | 18 +- 6 files changed, 495 insertions(+), 439 deletions(-) diff --git a/src/mdio/schemas/v1/dataset_builder.py b/src/mdio/schemas/v1/dataset_builder.py index dbedd3d6d..f0621de30 100644 --- a/src/mdio/schemas/v1/dataset_builder.py +++ b/src/mdio/schemas/v1/dataset_builder.py @@ -46,10 +46,10 @@ class _BuilderState(Enum): HAS_VARIABLES = auto() -def _get_dimension( +def _get_named_dimension( dimensions: list[NamedDimension], name: str, size: int | None = None ) -> NamedDimension | None: - """Get a dimension by name and size from the list[NamedDimension] .""" + """Get a dimension by name and optional size from the list[NamedDimension].""" if dimensions is None: return False if not isinstance(name, str): @@ -111,25 +111,18 @@ def __init__(self, name: str, attributes: UserAttributes | None = None): self._state = _BuilderState.INITIAL self._unnamed_variable_counter = 0 - def add_dimension( # noqa: PLR0913 self, name: str, - size: int, - var_data_type: ScalarType | StructuredType = ScalarType.INT32, - var_metadata_info: VariableMetadataList | None = None, + size: int ) -> "MDIODatasetBuilder": """Add a dimension. This function be called at least once before adding coordinates or variables. - This call will create a dimension variable, if one does not yet exists Args: name: Name of the dimension size: Size of the dimension - var_long_name: Optional long name for the dimension variable - var_data_type: Data type for the dimension variable (defaults to INT32) - var_metadata_info: Optional metadata information for the dimension variable Returns: self: Returns self for method chaining @@ -137,7 +130,7 @@ def add_dimension( # noqa: PLR0913 if not name: msg = "'name' must be a non-empty string" raise ValueError(msg) - + # Validate that the dimension is not already defined old_var = next((e for e in self._dimensions if e.name == name), None) if old_var is not None: @@ -146,26 +139,34 @@ def add_dimension( # noqa: PLR0913 dim = NamedDimension(name=name, size=size) self._dimensions.append(dim) - - meta_dict = _to_dictionary(var_metadata_info) - # Create a variable for the dimension - dim_var = Variable( - name=name, - longName=f"'{name}' dimension variable", - # IMPORTANT: we use NamedDimension here, not the dimension name. - # Since the Dataset does not have a dimension list, we need to preserve - # NamedDimension somewhere. Namely, in the variable created for the dimension - dimensions=[dim], - dataType=var_data_type, - compressor=None, - coordinates=None, - metadata=meta_dict, - ) - self._variables.append(dim_var) - self._state = _BuilderState.HAS_DIMENSIONS return self + def _get_coordinate( + self, + coordinates: list[Coordinate] | list[str], + name: str, size: int | None = None + ) -> Coordinate | None: + """Get a coordinate by name from the list[Coordinate] | list[str].""" + if coordinates is None: + return None + + for c in coordinates: + if isinstance(c, str) and c == name: + # The coordinate is stored by name (str). + # Find it in the builder global list and return it. + cc = next((v for v in self._coordinates if v.name == name), None) + if cc is None: + msg = f"Pre-existing coordinate named {name!r} is not found" + raise ValueError(msg) + return cc + if isinstance(c, Coordinate) and c.name == name: + # The coordinate is stored as an embedded Coordinate object. + # Return it. + return c + + return None + def add_coordinate( # noqa: PLR0913 self, name: str, @@ -173,6 +174,7 @@ def add_coordinate( # noqa: PLR0913 long_name: str = None, dimensions: list[str], data_type: ScalarType = ScalarType.FLOAT32, + compressor: Blosc | ZFP | None = None, metadata_info: CoordinateMetadataList | None = None, ) -> "MDIODatasetBuilder": """Add a coordinate after adding at least one dimension. @@ -200,48 +202,66 @@ def add_coordinate( # noqa: PLR0913 msg = "'dimensions' must be a non-empty list" raise ValueError(msg) old_var = next((e for e in self._coordinates if e.name == name), None) - # Validate that the coordinate is not already defined if old_var is not None: msg = "Adding coordinate with the same name twice is not allowed" raise ValueError(msg) - + # Validate that all referenced dimensions are already defined - for dim in dimensions: - if next((d for d in self._dimensions if d.name == dim), None) is None: - msg = f"Pre-existing dimension named {dim!r} is not found" + named_dimensions = [] + for dim_name in dimensions: + nd = _get_named_dimension(self._dimensions, dim_name) + if nd is None: + msg = f"Pre-existing dimension named {dim_name!r} is not found" raise ValueError(msg) + named_dimensions.append(nd) meta_dict = _to_dictionary(metadata_info) coord = Coordinate( name=name, longName=long_name, - # We ass names: sts, not list[NamedDimension | str] - dimensions=dimensions, + dimensions=named_dimensions, + compressor=compressor, dataType=data_type, metadata=meta_dict ) self._coordinates.append(coord) # Add a coordinate variable to the dataset - var_meta_dict = _to_dictionary(coord.metadata) - coord_var = Variable( + self.add_variable( name=coord.name, - longName=f"'{coord.name}' coordinate variable", - dimensions=coord.dimensions, - dataType=coord.data_type, - compressor=None, - # IMPORTANT: we always use the Coordinate here, not the coordinate name - # Since the Dataset does not have a coordinate list, we need to preserve Coordinate - # somewhere. Namely, in the variable created for the coordinate - coordinates=[coord], - metadata=var_meta_dict + long_name=f"'{coord.name}' coordinate variable", + dimensions=dimensions, # dimension names (list[str]) + data_type=coord.data_type, + compressor=compressor, + coordinates=[name], # Use the coordinate name as a reference + metadata_info=coord.metadata ) - self._variables.append(coord_var) self._state = _BuilderState.HAS_COORDINATES return self + def add_dimension_coordinate( + self, + dimension_name: str, + *, + data_type: ScalarType, + compressor: Blosc | ZFP | None = None, + metadata_info: VariableMetadataList | None = None, + ) -> "MDIODatasetBuilder": + """Add a dimension coordinate variable for a pre-existing dimension. + This is a convenience method to create a coordinate variable + that represents sampling along a dimension. + """ + self.add_coordinate(dimension_name, + long_name=dimension_name, + dimensions=[dimension_name], + data_type=data_type, + compressor=compressor, + metadata_info=_to_dictionary(metadata_info)) + + return self + def add_variable( # noqa: PLR0913 self, name: str, @@ -255,9 +275,13 @@ def add_variable( # noqa: PLR0913 ) -> "MDIODatasetBuilder": """Add a variable after adding at least one dimension and, optionally, coordinate. - This function must be called after all required dimensions are added via add_dimension(). + This function must be called after all required dimensions are added via add_dimension() This function must be called after all required coordinates are added via add_coordinate(). + If this function is called with a single dimension name that matches the variable name, + it will create a dimension variable. Dimension variables are special variables that + represent sampling along a dimension. + Args: name: Name of the variable long_name: Optional long name for the variable @@ -280,7 +304,7 @@ def add_variable( # noqa: PLR0913 if dimensions is None or not dimensions: msg = "'dimensions' must be a non-empty list" raise ValueError(msg) - + # Validate that the variable is not already defined old_var = next((e for e in self._variables if e.name == name), None) if old_var is not None: @@ -288,10 +312,13 @@ def add_variable( # noqa: PLR0913 raise ValueError(msg) # Validate that all referenced dimensions are already defined - for dim in dimensions: - if next((e for e in self._dimensions if e.name == dim), None) is None: - msg = f"Pre-existing dimension named {dim!r} is not found" + named_dimensions = [] + for dim_name in dimensions: + nd = _get_named_dimension(self._dimensions, dim_name) + if nd is None: + msg = f"Pre-existing dimension named {dim_name!r} is not found" raise ValueError(msg) + named_dimensions.append(nd) # Validate that all referenced coordinates are already defined if coordinates is not None: @@ -301,17 +328,16 @@ def add_variable( # noqa: PLR0913 raise ValueError(msg) meta_dict = _to_dictionary(metadata_info) - self._variables.append( - Variable( - name=name, - long_name=long_name, - dimensions=dimensions, - data_type=data_type, - compressor=compressor, - coordinates=coordinates, - metadata=meta_dict, - ) - ) + var = Variable( + name=name, + long_name=long_name, + dimensions=named_dimensions, + data_type=data_type, + compressor=compressor, + coordinates=coordinates, + metadata=meta_dict) + self._variables.append(var) + self._state = _BuilderState.HAS_VARIABLES return self diff --git a/tests/unit/v1/test_dataset_builder_add_coordinate.py b/tests/unit/v1/test_dataset_builder_add_coordinate.py index 0adb9240b..cae46834f 100644 --- a/tests/unit/v1/test_dataset_builder_add_coordinate.py +++ b/tests/unit/v1/test_dataset_builder_add_coordinate.py @@ -6,13 +6,15 @@ import pytest +from mdio.schemas.compressors import Blosc from mdio.schemas.dtype import ScalarType from mdio.schemas.metadata import UserAttributes -from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder, _get_named_dimension from mdio.schemas.v1.dataset_builder import _BuilderState from mdio.schemas.v1.units import AllUnits from mdio.schemas.v1.units import LengthUnitEnum from mdio.schemas.v1.units import LengthUnitModel +from mdio.schemas.v1.variable import VariableMetadata def test_add_coordinate() -> None: @@ -25,7 +27,7 @@ def test_add_coordinate() -> None: builder.add_coordinate("cdp", dimensions=["inline", "crossline"]) builder.add_dimension("inline", 100) - builder.add_dimension("crossline", 100) + builder.add_dimension("crossline", 200) # Validate required parameters bad_name = None @@ -47,18 +49,21 @@ def test_add_coordinate() -> None: builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"]) assert builder._state == _BuilderState.HAS_COORDINATES assert len(builder._dimensions) == 2 - # 2 variables for dimensions, 1 variable for coordinates - assert len(builder._variables) == 3 + # 1 variable for coordinates + assert len(builder._variables) == 1 assert len(builder._coordinates) == 1 # Validate that we created a coordinate variable var_cdp = next(e for e in builder._variables if e.name == "cdp-x") assert var_cdp is not None - # Validate that dimensions are stored as names - assert set(var_cdp.dimensions) == {"inline", "crossline"} + assert len(var_cdp.dimensions) == 2 + assert _get_named_dimension(var_cdp.dimensions, "inline", 100) is not None + assert _get_named_dimension(var_cdp.dimensions, "crossline", 200) is not None # Validate that coordinates are stored as Coordinate assert len(var_cdp.coordinates) == 1 - assert next((e for e in var_cdp.coordinates if e.name == "cdp-x"), None) is not None + # No dimensions are stored in coordinates + # Validate that non-dimension coordinates + assert builder._get_coordinate(var_cdp.coordinates, "cdp-x") is not None # Adding coordinate with the same name twice msg="Adding coordinate with the same name twice is not allowed" @@ -69,96 +74,76 @@ def test_add_coordinate_with_defaults() -> None: """Test adding coordinates with default arguments.""" builder = MDIODatasetBuilder("test_dataset") builder.add_dimension("inline", 100) - builder.add_dimension("crossline", 100) + builder.add_dimension("crossline", 200) # Add coordinate using defaults builder.add_coordinate("cdp", dimensions=["inline", "crossline"]) assert len(builder._dimensions) == 2 - # 2 variables for dimensions, 1 variable for coordinates - assert len(builder._variables) == 3 + # 1 variable for coordinates + assert len(builder._variables) == 1 assert len(builder._coordinates) == 1 - crd0 = next((e for e in builder._coordinates if e.name == "cdp"), None) - assert crd0 is not None - # NOTE: add_variable() stores dimensions as names - assert set(crd0.dimensions) == {"inline", "crossline"} - assert crd0.long_name is None # Default value - assert crd0.data_type == ScalarType.FLOAT32 # Default value - assert crd0.metadata is None # Default value - -def test_coordinate_with_units() -> None: - """Test adding coordinates with units.""" - builder = MDIODatasetBuilder("test_dataset") - builder.add_dimension("inline", 100) - builder.add_dimension("crossline", 100) - # Add coordinate with units - builder.add_coordinate( - "cdp", - dimensions=["inline", "crossline"], - metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT))] - ) - assert len(builder._dimensions) == 2 - # 2 variables for dimensions, 1 variable for coordinates - assert len(builder._variables) == 3 - assert len(builder._coordinates) == 1 - crd0 = next((e for e in builder._coordinates if e.name == "cdp"), None) - assert crd0 is not None - # NOTE: add_coordinate() stores dimensions as names - assert set(crd0.dimensions) == {"inline", "crossline"} - assert crd0.long_name is None # Default value - assert crd0.data_type == ScalarType.FLOAT32 # Default value - assert crd0.metadata.attributes is None - assert crd0.metadata.units_v1.length == LengthUnitEnum.FOOT - -def test_coordinate_with_attributes() -> None: - """Test adding coordinates with attributes.""" - builder = MDIODatasetBuilder("test_dataset") - builder.add_dimension("inline", 100) - builder.add_dimension("crossline", 100) - # Add coordinate with attributes - builder.add_coordinate( - "cdp", - dimensions=["inline", "crossline"], - metadata_info=[UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"})], - ) - assert len(builder._dimensions) == 2 - # 2 variables for dimensions, 1 variable for coordinates - assert len(builder._variables) == 3 - assert len(builder._coordinates) == 1 - # NOTE: add_coordinate() stores dimensions as names - crd0 = next((e for e in builder._coordinates if e.name == "cdp"), None) - assert crd0 is not None - assert set(crd0.dimensions) == {"inline", "crossline"} - assert crd0.long_name is None # Default value - assert crd0.data_type == ScalarType.FLOAT32 # Default value - assert crd0.metadata.attributes["MGA"] == 51 - assert crd0.metadata.attributes["UnitSystem"] == "Imperial" - assert crd0.metadata.units_v1 is None + # Validate: the structure of the coordinate + coord_cdp = next((e for e in builder._coordinates if e.name == "cdp"), None) + assert coord_cdp is not None + assert len(coord_cdp.dimensions) == 2 + assert _get_named_dimension(coord_cdp.dimensions, "inline", 100) is not None + assert _get_named_dimension(coord_cdp.dimensions, "crossline", 200) is not None + assert coord_cdp.long_name is None # Default value + assert coord_cdp.data_type == ScalarType.FLOAT32 # Default value + assert coord_cdp.compressor is None # Default value + assert coord_cdp.metadata is None # Default value -def test_coordinate_with_full_metadata() -> None: +def test_coordinate_with_full_parameters() -> None: """Test adding coordinates with all metadata.""" builder = MDIODatasetBuilder("test_dataset") builder.add_dimension("inline", 100) - builder.add_dimension("crossline", 100) + builder.add_dimension("crossline", 200) # Add coordinate with all metadata builder.add_coordinate( "cdp", + long_name = "Common Depth Point", dimensions=["inline", "crossline"], + data_type = ScalarType.FLOAT16, + compressor = Blosc(algorithm="zstd"), metadata_info=[ AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)), UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"})] ) + # Validate: the state of the builder + assert builder._state == _BuilderState.HAS_COORDINATES assert len(builder._dimensions) == 2 - # 2 variables for dimensions, 1 variable for coordinates - assert len(builder._variables) == 3 + # 1 variable for coordinates + assert len(builder._variables) == 1 assert len(builder._coordinates) == 1 - # NOTE: add_coordinate() stores dimensions as names - crd0 = next((e for e in builder._coordinates if e.name == "cdp"), None) - assert crd0 is not None - assert set(crd0.dimensions) == {"inline", "crossline"} - assert crd0.long_name is None # Default value - assert crd0.data_type == ScalarType.FLOAT32 # Default value - assert crd0.metadata.attributes["MGA"] == 51 - assert crd0.metadata.attributes["UnitSystem"] == "Imperial" - assert crd0.metadata.units_v1.length == LengthUnitEnum.FOOT + # Validate: the structure of the coordinate + coord_cdp = next((e for e in builder._coordinates if e.name == "cdp"), None) + assert coord_cdp is not None + assert len(coord_cdp.dimensions) == 2 + assert _get_named_dimension(coord_cdp.dimensions, "inline", 100) is not None + assert _get_named_dimension(coord_cdp.dimensions, "crossline", 200) is not None + assert coord_cdp.long_name == "Common Depth Point" + assert coord_cdp.data_type == ScalarType.FLOAT16 + assert isinstance(coord_cdp.compressor, Blosc) + assert coord_cdp.compressor.algorithm == "zstd" + assert coord_cdp.metadata.attributes["MGA"] == 51 + assert coord_cdp.metadata.attributes["UnitSystem"] == "Imperial" + assert coord_cdp.metadata.units_v1.length == LengthUnitEnum.FOOT + + # Validate: the structure of the created variable + v = next((v for v in builder._variables if v.name == "cdp"), None) + assert v is not None + assert v.long_name == "'cdp' coordinate variable" + assert len(v.dimensions) == 2 + assert _get_named_dimension(v.dimensions, "inline", 100) is not None + assert _get_named_dimension(v.dimensions, "crossline", 200) is not None + assert v.data_type == ScalarType.FLOAT16 + assert isinstance(v.compressor, Blosc) + assert v.compressor.algorithm == "zstd" + assert len(v.coordinates) == 1 + assert builder._get_coordinate(v.coordinates, "cdp") is not None + assert isinstance(v.metadata, VariableMetadata) + assert v.metadata.units_v1.length == LengthUnitEnum.FOOT + assert v.metadata.attributes["MGA"] == 51 + assert v.metadata.attributes["UnitSystem"] == "Imperial" diff --git a/tests/unit/v1/test_dataset_builder_add_dimension.py b/tests/unit/v1/test_dataset_builder_add_dimension.py index 1465a8925..b701380fb 100644 --- a/tests/unit/v1/test_dataset_builder_add_dimension.py +++ b/tests/unit/v1/test_dataset_builder_add_dimension.py @@ -13,7 +13,7 @@ from mdio.schemas.metadata import UserAttributes from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder from mdio.schemas.v1.dataset_builder import _BuilderState -from mdio.schemas.v1.dataset_builder import _get_dimension +from mdio.schemas.v1.dataset_builder import _get_named_dimension from mdio.schemas.v1.stats import CenteredBinHistogram from mdio.schemas.v1.stats import StatisticsMetadata from mdio.schemas.v1.stats import SummaryStatistics @@ -38,21 +38,7 @@ def test_add_dimension() -> None: builder.add_dimension("x", 100) assert builder._state == _BuilderState.HAS_DIMENSIONS assert len(builder._dimensions) == 1 - assert _get_dimension(builder._dimensions, "x", 100) is not None - - # Validate that we have created a dimension variable and - # that variable has the embedded NamedDimension - assert len(builder._variables) == 1 - var_x = next(e for e in builder._variables if e.name == "x") - assert var_x is not None - assert len(var_x.dimensions) == 1 - # Validate that the dimension variable has the NamedDimension - assert _get_dimension(var_x.dimensions, "x", 100) is not None - assert var_x.long_name == "'x' dimension variable" - assert var_x.data_type == ScalarType.INT32 - assert var_x.compressor is None - assert var_x.coordinates is None - assert var_x.metadata is None + assert _get_named_dimension(builder._dimensions, "x", 100) is not None # Validate that we can't add a dimension with the same name twice with pytest.raises( @@ -66,152 +52,3 @@ def test_add_dimension() -> None: with pytest.raises(ValueError, match=msg): builder.add_dimension("x", 200) -def test_add_dimension_with_defaults() -> None: - """Test dimension builder state transitions and functionality.""" - builder = MDIODatasetBuilder("test_dataset") - - # First dimension should change state to HAS_DIMENSIONS and create a variable - builder.add_dimension("x", 100) - assert builder._state == _BuilderState.HAS_DIMENSIONS - assert len(builder._dimensions) == 1 - # Validate that the dimension builder has the NamedDimension - assert _get_dimension(builder._dimensions, "x", 100) is not None - var_x = next((e for e in builder._variables if e.name == "x"), None) - assert var_x is not None - assert var_x.name == "x" - assert var_x.long_name == "'x' dimension variable" - assert var_x.data_type == ScalarType.INT32 - assert var_x.compressor is None - assert var_x.coordinates is None - assert var_x.metadata is None - -def test_add_dimension_with_units() -> None: - """Test adding dimensions with units.""" - builder = MDIODatasetBuilder("test_dataset") - - # Add dimension with strongly-typed unit list of single-item - builder.add_dimension( - "length", - size=100, - var_data_type=ScalarType.FLOAT64, - var_metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT))] - ) - assert len(builder._variables) == 1 - var0 = builder._variables[0] - assert var0.name == "length" - assert var0.long_name == "'length' dimension variable" - assert var0.data_type == ScalarType.FLOAT64 - assert var0.compressor is None - assert var0.coordinates is None - assert var0.metadata.units_v1.length == LengthUnitEnum.FOOT - -def test_add_dimension_with_attributes() -> None: - """Test adding dimensions with attributes.""" - builder = MDIODatasetBuilder("test_dataset") - - builder.add_dimension( - "length", - size=100, - var_data_type=ScalarType.FLOAT32, - var_metadata_info=[UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"})], - ) - assert len(builder._variables) == 1 - var0 = builder._variables[0] - assert var0.name == "length" - assert var0.data_type == ScalarType.FLOAT32 - assert var0.metadata.attributes["MGA"] == 51 - assert var0.metadata.attributes["UnitSystem"] == "Imperial" - - -def test_add_dimension_with_chunk_grid() -> None: - """Test adding dimensions with chunk grid.""" - builder = MDIODatasetBuilder("test_dataset") - - grid_definition = RegularChunkGrid(configuration=RegularChunkShape(chunk_shape=[20])) - builder.add_dimension( - "length", - size=100, - var_data_type=ScalarType.FLOAT32, - var_metadata_info=[ChunkGridMetadata(chunk_grid=grid_definition)], - ) - assert len(builder._variables) == 1 - var0 = builder._variables[0] - assert var0.name == "length" - assert var0.data_type == ScalarType.FLOAT32 - assert var0.metadata.chunk_grid.name == "regular" - assert var0.metadata.chunk_grid.configuration.chunk_shape == [20] - - -def test_add_dimension_with_stats() -> None: - """Test adding dimensions with stats.""" - builder = MDIODatasetBuilder("test_dataset") - - builder.add_dimension( - "depth", - size=100, - var_data_type=ScalarType.FLOAT32, - var_metadata_info=[ - StatisticsMetadata( - stats_v1=SummaryStatistics( - count=100, - sum=1215.1, - sumSquares=125.12, - min=5.61, - max=10.84, - # TODO(DmitriyRepin, #0): Also test EdgeDefinedHistogram - histogram=CenteredBinHistogram(binCenters=[1, 2], counts=[10, 15]), - ) - ) - ], - ) - assert len(builder._variables) == 1 - var0 = builder._variables[0] - assert var0.name == "depth" - assert var0.data_type == ScalarType.FLOAT32 - assert var0.metadata.stats_v1.count == 100 - assert var0.metadata.stats_v1.sum == 1215.1 - - -def test_add_dimension_with_full_metadata() -> None: - """Test adding dimensions with all metadata.""" - builder = MDIODatasetBuilder("test_dataset") - - builder.add_dimension( - "length", - size=100, - var_data_type=ScalarType.FLOAT32, - var_metadata_info=[ - AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)), - UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}), - ChunkGridMetadata( - chunk_grid=RegularChunkGrid(configuration=RegularChunkShape(chunk_shape=[20])) - ), - StatisticsMetadata( - stats_v1=SummaryStatistics( - count=100, - sum=1215.1, - sumSquares=125.12, - min=5.61, - max=10.84, - histogram=CenteredBinHistogram(binCenters=[1, 2], counts=[10, 15]), - ) - ), - ], - ) - - assert len(builder._variables) == 1 - var0 = builder._variables[0] - assert var0.name == "length" - assert var0.data_type == ScalarType.FLOAT32 - assert var0.metadata.units_v1.length == LengthUnitEnum.FOOT - assert var0.metadata.attributes["MGA"] == 51 - assert var0.metadata.attributes["UnitSystem"] == "Imperial" - assert var0.metadata.chunk_grid.name == "regular" - assert var0.metadata.chunk_grid.configuration.chunk_shape == [20] - assert var0.metadata.stats_v1.count == 100 - assert var0.metadata.stats_v1.sum == 1215.1 - assert var0.metadata.stats_v1.sum_squares == 125.12 - assert var0.metadata.stats_v1.min == 5.61 - assert var0.metadata.stats_v1.max == 10.84 - assert var0.metadata.stats_v1.histogram.bin_centers == [1, 2] - assert var0.metadata.stats_v1.histogram.counts == [10, 15] diff --git a/tests/unit/v1/test_dataset_builder_add_variable.py b/tests/unit/v1/test_dataset_builder_add_variable.py index 5484ea92b..ad24b9de4 100644 --- a/tests/unit/v1/test_dataset_builder_add_variable.py +++ b/tests/unit/v1/test_dataset_builder_add_variable.py @@ -6,13 +6,14 @@ import pytest +from mdio.schemas import builder from mdio.schemas.chunk_grid import RegularChunkGrid from mdio.schemas.chunk_grid import RegularChunkShape from mdio.schemas.compressors import Blosc from mdio.schemas.dtype import ScalarType from mdio.schemas.metadata import ChunkGridMetadata from mdio.schemas.metadata import UserAttributes -from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder, _get_named_dimension from mdio.schemas.v1.dataset_builder import _BuilderState from mdio.schemas.v1.stats import CenteredBinHistogram from mdio.schemas.v1.stats import StatisticsMetadata @@ -23,145 +24,299 @@ from mdio.schemas.v1.variable import VariableMetadata -def test_add_variable() -> None: +def test_add_variable_no_coords() -> None: """Test adding variable. Check the state transition and validate required parameters..""" builder = MDIODatasetBuilder("test_dataset") assert builder._state == _BuilderState.INITIAL - + + # Validate: Must add at least one dimension before adding variables msg = "Must add at least one dimension before adding variables" with pytest.raises(ValueError, match=msg): - builder.add_variable("amplitude", dimensions=["speed"], data_type = ScalarType.FLOAT32) + builder.add_variable("amplitude", dimensions=[ + "speed"], data_type=ScalarType.FLOAT32) + # Add dimension before we can add a data variable builder.add_dimension("inline", 100) - builder.add_dimension("crossline", 100) - builder.add_dimension("depth", 100) + builder.add_dimension("crossline", 200) + builder.add_dimension("depth", 300) - # Validate required parameters + # Validate: required parameters must be preset bad_name = None with pytest.raises(ValueError, match="'name' must be a non-empty string"): - builder.add_variable(bad_name, dimensions=["speed"], data_type = ScalarType.FLOAT32) + builder.add_variable(bad_name, dimensions=[ + "speed"], data_type=ScalarType.FLOAT32) with pytest.raises(ValueError, match="'name' must be a non-empty string"): - builder.add_variable("", dimensions=["speed"], data_type = ScalarType.FLOAT32) + builder.add_variable( + "", dimensions=["speed"], data_type=ScalarType.FLOAT32) with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): - builder.add_variable("bad_amplitude", dimensions=None, data_type = ScalarType.FLOAT32) + builder.add_variable("bad_amplitude", dimensions=None, + data_type=ScalarType.FLOAT32) with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): - builder.add_variable("bad_amplitude", dimensions=[], data_type = ScalarType.FLOAT32) + builder.add_variable("bad_amplitude", dimensions=[], + data_type=ScalarType.FLOAT32) - # Add a variable using non-existent dimensions - msg="Pre-existing dimension named 'xline' is not found" + # Validate: Add a variable using non-existent dimensions is not allowed + msg = "Pre-existing dimension named 'il' is not found" with pytest.raises(ValueError, match=msg): - builder.add_variable("bad_amplitude", - dimensions=["inline", "xline", "depth"], - data_type = ScalarType.FLOAT32) + builder.add_variable("bad_amplitude", + dimensions=["il", "xl", "depth"], + data_type=ScalarType.FLOAT32) - builder.add_variable("amplitude", - dimensions=["inline", "crossline", "depth"], - data_type = ScalarType.FLOAT32) + # Add a variable without coordinates + builder.add_variable("amplitude", + dimensions=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT32) assert builder._state == _BuilderState.HAS_VARIABLES - assert len(builder._dimensions) == 3 - assert len(builder._variables) == 4 - assert len(builder._coordinates) == 0 + assert len(builder._dimensions) == 3 + assert len(builder._variables) == 1 + assert len(builder._coordinates) == 0 + + # Validate the structure of the created variable + var_ampl = next((e for e in builder._variables if e.name == "amplitude"), None) + assert var_ampl is not None + # Validate that dimensions are stored as NamedDimensions + assert _get_named_dimension(var_ampl.dimensions, "inline", 100) is not None + assert _get_named_dimension(var_ampl.dimensions, "crossline", 200) is not None + assert _get_named_dimension(var_ampl.dimensions, "depth", 300) is not None + # Validate that no coordinates are set + assert var_ampl.coordinates is None - # Add a variable using non-existent coordinates - msg="Pre-existing coordinate named 'cdp-x' is not found" + # Validate: adding a variable with the same name twice is not allowed + msg = "Adding variable with the same name twice is not allowed" with pytest.raises(ValueError, match=msg): - builder.add_variable("bad_amplitude", + builder.add_variable("amplitude", dimensions=["inline", "crossline", "depth"], - data_type = ScalarType.FLOAT32, - coordinates=["cdp-x", "cdp-y"]) + data_type=ScalarType.FLOAT32) - builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"]) - builder.add_coordinate("cdp-y", dimensions=["inline", "crossline"]) - # Adding variable with the same name twice - msg="Adding variable with the same name twice is not allowed" +def test_add_variable_with_coords() -> None: + """Test adding variable. Check the state transition and validate required parameters..""" + builder = MDIODatasetBuilder("test_dataset") + builder.add_dimension("inline", 100) + builder.add_dimension("crossline", 200) + builder.add_dimension("depth", 300) + + # Add dimension coordinates before we can add a data variable + builder.add_dimension_coordinate("inline", data_type=ScalarType.INT32) + builder.add_dimension_coordinate("crossline", data_type=ScalarType.INT32) + + # Validate: adding a variable with a coordinate that has not been pre-created is not allowed + msg = "Pre-existing coordinate named 'depth' is not found" with pytest.raises(ValueError, match=msg): - builder.add_variable("amplitude", + builder.add_variable("ampl", dimensions=["inline", "crossline", "depth"], - data_type = ScalarType.FLOAT32) + coordinates=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT32) + + # Add a variable with pre-defined dimension coordinates + builder.add_variable("ampl", + dimensions=["inline", "crossline", "depth"], + coordinates=["inline", "crossline"], + data_type=ScalarType.FLOAT32) + + assert builder._state == _BuilderState.HAS_VARIABLES + assert len(builder._dimensions) == 3 + # 2 dim coordinate variables + 1 data variables + assert len(builder._variables) == 3 + assert len(builder._coordinates) == 2 + + # Validate: the structure of the created variable + var_ampl = next((e for e in builder._variables if e.name == "ampl"), None) + assert var_ampl is not None + # Validate: that dimensions are stored as NamedDimensions + assert len(var_ampl.dimensions) == 3 + assert _get_named_dimension(var_ampl.dimensions, "inline", 100) is not None + assert _get_named_dimension(var_ampl.dimensions, "crossline", 200) is not None + assert _get_named_dimension(var_ampl.dimensions, "depth", 300) is not None + assert len(var_ampl.coordinates) == 2 + # Validate that dim coordinates "inline" and "crossline" are set + assert builder._get_coordinate(var_ampl.coordinates, "inline") is not None + assert builder._get_coordinate(var_ampl.coordinates, "crossline") is not None + # "depth" coordinate is not set + + # Add non-dim coordinates (e.g., 2D coordinates) + builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"]) + builder.add_coordinate("cdp-y", dimensions=["inline", "crossline"]) + + # Add a variable with pre-defined dimension and non-dimension coordinates + builder.add_variable("ampl2", + dimensions=["inline", "crossline", "depth"], + coordinates=["inline", "crossline", "cdp-x", "cdp-y"], + data_type=ScalarType.FLOAT32) + + assert builder._state == _BuilderState.HAS_VARIABLES + assert len(builder._dimensions) == 3 + # 2 dim coordinate variables + 2 non-dim coordinate variables + 1 data variables + assert len(builder._variables) == 6 + assert len(builder._coordinates) == 4 + + # Validate: the structure of the created variable + var_ampl2 = next((e for e in builder._variables if e.name == "ampl2"), None) + assert var_ampl2 is not None + # Validate: that dimensions are stored as NamedDimensions + assert len(var_ampl2.dimensions) == 3 + assert _get_named_dimension(var_ampl2.dimensions, "inline", 100) is not None + assert _get_named_dimension(var_ampl2.dimensions, "crossline", 200) is not None + assert _get_named_dimension(var_ampl2.dimensions, "depth", 300) is not None + assert len(var_ampl2.coordinates) == 4 + # Validate that dim coordinates "inline" and "crossline" are set + assert builder._get_coordinate(var_ampl2.coordinates, "inline") is not None + assert builder._get_coordinate(var_ampl2.coordinates, "crossline") is not None + # "depth" coordinate is not set + # Validate that non-dimension coordinates "cdp-x" and "cdp-y" + assert builder._get_coordinate(var_ampl2.coordinates, "cdp-x") is not None + assert builder._get_coordinate(var_ampl2.coordinates, "cdp-y") is not None + + +def test_add_dimension_coordinate() -> None: + """Test adding dimension variable.""" + builder = MDIODatasetBuilder("test_dataset") + builder.add_dimension("inline", 100) + + builder.add_dimension_coordinate("inline", data_type=ScalarType.INT32) + + # Validate: that coordinate is stored in the builder global list + coord_il = builder._get_coordinate(builder._coordinates, "inline") + # Validate: that dimensions are stored as NamedDimensions in the coordinate + assert _get_named_dimension(coord_il.dimensions, "inline", 100) is not None + # Validate: a dim variable has been created + var_il = next((e for e in builder._variables if e.name == "inline"), None) + assert var_il is not None + # Validate: the variable has the expected properties + assert var_il.name == "inline" + assert var_il.long_name == "'inline' coordinate variable" + assert len(var_il.dimensions) == 1 + assert _get_named_dimension(var_il.dimensions, "inline", 100) is not None + assert var_il.data_type == ScalarType.INT32 + assert var_il.compressor is None # Default value + assert len(var_il.coordinates) == 1 + assert builder._get_coordinate(var_il.coordinates, "inline") is not None + assert var_il.metadata is None # Default value def test_add_variable_with_defaults() -> None: """Test adding variable with default arguments.""" builder = MDIODatasetBuilder("test_dataset") + # Add dimensions before we can add a data variables builder.add_dimension("inline", 100) - builder.add_dimension("crossline", 100) - builder.add_dimension("depth", 100) - # Add variable using defaults - builder.add_variable("seismic_amplitude", + builder.add_dimension("crossline", 200) + builder.add_dimension("depth", 300) + # Add dimension coordinates + builder.add_dimension_coordinate("inline", data_type=ScalarType.INT32) + builder.add_dimension_coordinate("crossline", data_type=ScalarType.INT32) + builder.add_dimension_coordinate("depth", + data_type=ScalarType.FLOAT32, + metadata_info=[ + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))]) + + # Add data variable using defaults + builder.add_variable("ampl", dimensions=["inline", "crossline", "depth"], data_type=ScalarType.FLOAT32) - assert len(builder._dimensions) == 3 - assert len(builder._variables) == 4 - assert len(builder._coordinates) == 0 - var0 = next((e for e in builder._variables if e.name == "seismic_amplitude"), None) - assert var0 is not None - # NOTE: add_variable() stores dimensions as names - assert set(var0.dimensions) == {"inline", "crossline", "depth"} - assert var0.long_name is None # Default value - assert var0.data_type == ScalarType.FLOAT32 # Default value - assert var0.compressor is None # Default value - assert var0.coordinates is None # Default value - assert var0.metadata is None # Default value + assert len(builder._dimensions) == 3 + # 3 dim coordinate variables + 1 data variable = 4 + assert len(builder._variables) == 4 + assert len(builder._coordinates) == 3 + + # Validate: the structure of the created variable + var_ampl = next((e for e in builder._variables if e.name == "ampl"), None) + assert var_ampl is not None + assert var_ampl.name == "ampl" + assert var_ampl.long_name is None # Default value + # Validate: that dimensions are stored as NamedDimensions + assert len(var_ampl.dimensions) == 3 + assert _get_named_dimension(var_ampl.dimensions, "inline", 100) is not None + assert _get_named_dimension(var_ampl.dimensions, "crossline", 200) is not None + assert _get_named_dimension(var_ampl.dimensions, "depth", 300) is not None + assert var_ampl.data_type == ScalarType.FLOAT32 + assert var_ampl.compressor is None # Default value + assert var_ampl.coordinates is None # Default value + # Validate: the variable has the expected properties + assert var_ampl.metadata is None # Default value + def test_add_variable_full_parameters() -> None: """Test adding variable with full parameters.""" builder = MDIODatasetBuilder("test_dataset") + # Add dimensions before we can add a data variables builder.add_dimension("inline", 100) - builder.add_dimension("crossline", 100) - builder.add_dimension("depth", 100) - builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"]) - builder.add_coordinate("cdp-y", dimensions=["inline", "crossline"]) - builder.add_variable("seismic_amplitude", - long_name="Amplitude (dimensionless)", - dimensions=["inline", "crossline", "depth"], - data_type=ScalarType.FLOAT64, - compressor=Blosc(algorithm="zstd"), - coordinates=["cdp-x", "cdp-y"], - metadata_info=[ - AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)), - UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}), - ChunkGridMetadata( - chunk_grid=RegularChunkGrid(configuration=RegularChunkShape(chunk_shape=[20])) - ), - StatisticsMetadata( - stats_v1=SummaryStatistics( - count=100, - sum=1215.1, - sumSquares=125.12, - min=5.61, - max=10.84, - histogram=CenteredBinHistogram(binCenters=[1, 2], counts=[10, 15]), - ) - ), - ]) + builder.add_dimension("crossline", 200) + builder.add_dimension("depth", 300) + + # Add dimension coordinates + builder.add_dimension_coordinate("inline", data_type=ScalarType.INT32) + builder.add_dimension_coordinate("crossline", data_type=ScalarType.INT32) + builder.add_dimension_coordinate("depth", data_type=ScalarType.INT32) + + # Add coordinates before we can add a data variable + builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64) + builder.add_coordinate("cdp-y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64) + + # Add data variable with full parameters + builder.add_variable("ampl", + long_name="Amplitude (dimensionless)", + dimensions=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT32, + compressor=Blosc(algorithm="zstd"), + coordinates=["inline", "crossline", "depth", "cdp-x", "cdp-y"], + metadata_info=[ + AllUnits(units_v1=LengthUnitModel( + length=LengthUnitEnum.FOOT)), + UserAttributes( + attributes={"MGA": 51, "UnitSystem": "Imperial"}), + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape(chunk_shape=[20])) + ), + StatisticsMetadata( + stats_v1=SummaryStatistics( + count=100, + sum=1215.1, + sumSquares=125.12, + min=5.61, + max=10.84, + histogram=CenteredBinHistogram( + binCenters=[1, 2], counts=[10, 15]), + ) + ), + ]) + # Validate: the state of the builder + assert builder._state == _BuilderState.HAS_VARIABLES assert len(builder._dimensions) == 3 - assert len(builder._coordinates) == 2 - # We expect 6 variables: - # 3 variables for dimensions, 2 variables for coordinates, and 1 variable for seismic_amplitude - assert len(builder._variables) == 6 - v = next((v for v in builder._variables if v.name == "seismic_amplitude"), None) + # 3 dim coords + 2 non-dim coords = 5 + assert len(builder._coordinates) == 5 + # 3 dim coord + 2 non-dim coords, and 1 data variable + assert len(builder._variables) == 6 + + # Validate: the structure of the created variable + v = next((v for v in builder._variables if v.name == "ampl"), None) assert v is not None + assert v.name == "ampl" assert v.long_name == "Amplitude (dimensionless)" - # NOTE: add_variable() stores dimensions as names - assert set(v.dimensions) == {"inline", "crossline", "depth"} - assert v.data_type == ScalarType.FLOAT64 + assert len(v.dimensions) == 3 + assert _get_named_dimension(v.dimensions, "inline", 100) is not None + assert _get_named_dimension(v.dimensions, "crossline", 200) is not None + assert _get_named_dimension(v.dimensions, "depth", 300) is not None + assert v.data_type == ScalarType.FLOAT32 assert isinstance(v.compressor, Blosc) assert v.compressor.algorithm == "zstd" - # NOTE: add_variable() stores coordinates as names - assert set(v.coordinates) == {"cdp-x", "cdp-y"} - assert v.metadata.stats_v1.count == 100 + assert len(v.coordinates) == 5 + assert builder._get_coordinate(v.coordinates, "inline") is not None + assert builder._get_coordinate(v.coordinates, "crossline") is not None + assert builder._get_coordinate(v.coordinates, "depth") is not None + assert builder._get_coordinate(v.coordinates, "cdp-x") is not None + assert builder._get_coordinate(v.coordinates, "cdp-y") is not None + assert v.metadata.stats_v1.count == 100 assert isinstance(v.metadata, VariableMetadata) assert v.metadata.units_v1.length == LengthUnitEnum.FOOT assert v.metadata.attributes["MGA"] == 51 - assert v.metadata.attributes["UnitSystem"] == "Imperial" + assert v.metadata.attributes["UnitSystem"] == "Imperial" assert v.metadata.chunk_grid.name == "regular" - assert v.metadata.chunk_grid.configuration.chunk_shape == [20] - assert v.metadata.stats_v1.count == 100 - assert v.metadata.stats_v1.sum == 1215.1 - assert v.metadata.stats_v1.sum_squares == 125.12 - assert v.metadata.stats_v1.min == 5.61 - assert v.metadata.stats_v1.max == 10.84 - assert v.metadata.stats_v1.histogram.bin_centers == [1, 2] - assert v.metadata.stats_v1.histogram.counts == [10, 15] - + assert v.metadata.chunk_grid.configuration.chunk_shape == [20] + assert v.metadata.stats_v1.count == 100 + assert v.metadata.stats_v1.sum == 1215.1 + assert v.metadata.stats_v1.sum_squares == 125.12 + assert v.metadata.stats_v1.min == 5.61 + assert v.metadata.stats_v1.max == 10.84 + assert v.metadata.stats_v1.histogram.bin_centers == [1, 2] + assert v.metadata.stats_v1.histogram.counts == [10, 15] diff --git a/tests/unit/v1/test_dataset_builder_build.py b/tests/unit/v1/test_dataset_builder_build.py index 2af86cdfc..8e06f08dd 100644 --- a/tests/unit/v1/test_dataset_builder_build.py +++ b/tests/unit/v1/test_dataset_builder_build.py @@ -14,7 +14,7 @@ from mdio.schemas.metadata import UserAttributes from mdio.schemas.v1.dataset import Dataset from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder -from mdio.schemas.v1.dataset_builder import _get_dimension +from mdio.schemas.v1.dataset_builder import _get_named_dimension from mdio.schemas.v1.stats import CenteredBinHistogram from mdio.schemas.v1.stats import StatisticsMetadata from mdio.schemas.v1.stats import SummaryStatistics @@ -29,21 +29,32 @@ def test_build() -> None: """Test building a complete dataset.""" dataset = ( MDIODatasetBuilder("test_dataset") - .add_dimension("x", 100) - .add_dimension("y", 200) - .add_coordinate("x_coord", dimensions=["x"]) - .add_coordinate("y_coord", dimensions=["y"]) - .add_variable("data", dimensions=["x", "y"], + .add_dimension("inline", 100) + .add_dimension("crossline", 200) + # Add a dimension coordinate explicitly using add_coordinate() + .add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.FLOAT64) + # Add a dimension coordinate using .add_dimension_coordinate() shortcut + .add_dimension_coordinate("crossline", data_type=ScalarType.FLOAT64) + .add_coordinate("x_coord", dimensions=["inline", "crossline"]) + .add_coordinate("y_coord", dimensions=["inline", "crossline"]) + .add_variable("data", long_name="Test Data", + dimensions=["inline", "crossline"], + coordinates=["inline", "crossline", "x_coord", "y_coord"], data_type=ScalarType.FLOAT32) .build() ) + + # TODO: Expand this assert isinstance(dataset, Dataset) assert dataset.metadata.name == "test_dataset" - # 2 dimension variables + 1 data variable + 2 coordinate variables + # 2 dim coord var + 2 non-dim coord var + 1 data variables = 5 variables assert len(dataset.variables) == 5 - assert next(v for v in dataset.variables if v.name == "x") is not None - assert next(v for v in dataset.variables if v.name == "y") is not None + assert next(v for v in dataset.variables if v.name == "inline") is not None + assert next(v for v in dataset.variables if v.name == "crossline") is not None + assert next(v for v in dataset.variables if v.name == "x_coord") is not None + assert next(v for v in dataset.variables if v.name == "y_coord") is not None + assert next(v for v in dataset.variables if v.name == "data") is not None var_data = next(v for v in dataset.variables if v.name == "data") assert var_data is not None assert var_data.long_name == "Test Data" @@ -68,35 +79,40 @@ def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50 inline_var = next(v for v in dataset.variables if v.name == "inline") assert inline_var.data_type == ScalarType.UINT32 # Dimension variables store dimensions as NamedDimension - assert _get_dimension(inline_var.dimensions, "inline", 256) + assert _get_named_dimension(inline_var.dimensions, "inline", 256) crossline_var = next(v for v in dataset.variables if v.name == "crossline") assert crossline_var.data_type == ScalarType.UINT32 # Dimension variables store dimensions as NamedDimension - assert _get_dimension(crossline_var.dimensions, "crossline", 512) + assert _get_named_dimension(crossline_var.dimensions, "crossline", 512) depth_var = next(v for v in dataset.variables if v.name == "depth") - assert depth_var.data_type == ScalarType.UINT32 + assert depth_var.data_type == ScalarType.FLOAT64 # Dimension variables store dimensions as NamedDimension - assert _get_dimension(depth_var.dimensions, "depth", 384) + assert _get_named_dimension(depth_var.dimensions, "depth", 384) assert depth_var.metadata.units_v1.length == LengthUnitEnum.METER # Verify coordinate variables cdp_x = next(v for v in dataset.variables if v.name == "cdp-x") assert cdp_x.data_type == ScalarType.FLOAT32 - # Coordinates variables store dimensions as names - assert set(cdp_x.dimensions) == {"inline", "crossline"} + assert len(cdp_x.dimensions) == 2 + assert _get_named_dimension(cdp_x.dimensions, "inline", 256) + assert _get_named_dimension(cdp_x.dimensions, "crossline", 512) assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER cdp_y = next(v for v in dataset.variables if v.name == "cdp-y") assert cdp_y.data_type == ScalarType.FLOAT32 - # Coordinates variables store dimensions as names - assert set(cdp_y.dimensions) == {"inline", "crossline"} + assert len(cdp_y.dimensions) == 2 + assert _get_named_dimension(cdp_y.dimensions, "inline", 256) + assert _get_named_dimension(cdp_y.dimensions, "crossline", 512) assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER # Verify image variable image = next(v for v in dataset.variables if v.name == "image") - assert set(image.dimensions) == {"inline", "crossline", "depth"} + assert len(image.dimensions) == 3 + assert _get_named_dimension(image.dimensions, "inline", 256) + assert _get_named_dimension(image.dimensions, "crossline", 512) + assert _get_named_dimension(image.dimensions, "depth", 384) assert image.data_type == ScalarType.FLOAT32 assert isinstance(image.compressor, Blosc) assert image.compressor.algorithm == "zstd" @@ -109,7 +125,10 @@ def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50 # Verify velocity variable velocity = next(v for v in dataset.variables if v.name == "velocity") - assert set(velocity.dimensions) == {"inline", "crossline", "depth"} + assert len(velocity.dimensions) == 3 + assert _get_named_dimension(velocity.dimensions, "inline", 256) + assert _get_named_dimension(velocity.dimensions, "crossline", 512) + assert _get_named_dimension(velocity.dimensions, "depth", 384) assert velocity.data_type == ScalarType.FLOAT16 assert velocity.compressor is None # Other variables store dimensions as names @@ -123,7 +142,10 @@ def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50 image_inline = next( v for v in dataset.variables if v.name == "image_inline") assert image_inline.long_name == "inline optimized version of 3d_stack" - assert set(image_inline.dimensions) == {"inline", "crossline", "depth"} + assert len(image_inline.dimensions) == 3 + assert _get_named_dimension(image_inline.dimensions, "inline", 256) + assert _get_named_dimension(image_inline.dimensions, "crossline", 512) + assert _get_named_dimension(image_inline.dimensions, "depth", 384) assert image_inline.data_type == ScalarType.FLOAT32 assert isinstance(image_inline.compressor, Blosc) assert image_inline.compressor.algorithm == "zstd" @@ -151,12 +173,15 @@ def make_campos_3d_dataset() -> Dataset: })) # Add dimensions - ds.add_dimension("inline", 256, var_data_type=ScalarType.UINT32) - ds.add_dimension("crossline", 512, var_data_type=ScalarType.UINT32) - ds.add_dimension("depth", 384, var_data_type=ScalarType.UINT32, - var_metadata_info=[ - AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))] - ) + ds.add_dimension("inline", 256) + ds.add_dimension("crossline", 512) + ds.add_dimension("depth", 384) + ds.add_dimension_coordinate("inline", data_type=ScalarType.UINT32) + ds.add_dimension_coordinate("crossline", data_type=ScalarType.UINT32) + ds.add_dimension_coordinate("depth", data_type=ScalarType.FLOAT64, + metadata_info=[ + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER)) + ]) # Add coordinates ds.add_coordinate( "cdp-x", @@ -170,6 +195,7 @@ def make_campos_3d_dataset() -> Dataset: metadata_info=[ AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))] ) + # Add image variable ds.add_variable( name="image", @@ -240,3 +266,30 @@ def make_campos_3d_dataset() -> Dataset: coordinates=["cdp-x", "cdp-y"], ) return ds.build() + +# def test_edge_case_not_used_dimension(): +# builder = MDIODatasetBuilder("test_dataset") + +# builder.add_dimension("inline", 100) +# builder.add_dimension("xline", 200) +# builder.add_dimension("depth", 300) +# builder.add_dimension("time", 600) + +# # Add 'dimension Coordinate' or 'index Coordinates', +# # the coordinates with the same name as a dimension, marked by *) on objects used in binary operations. +# builder.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.FLOAT32) +# builder.add_coordinate("xline", dimensions=["xline"], data_type=ScalarType.FLOAT32) +# # No 'depth' dimension coordinate is provided + +# # Add 'non-dimension coordinates' before we can add a data variable +# builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"]) +# builder.add_coordinate("cdp-y", dimensions=["inline", "crossline"]) + +# # Add data variable with full parameters +# builder.add_variable("seismic", +# dimensions=["inline", "crossline", "depth"], +# data_type=ScalarType.FLOAT64, +# coordinates=["cdp-x", "cdp-y"]) + +# # NOTE: The model has separate list list[Coordinate] | list[str] +# # It does not allow mixing names and NamedDimensions \ No newline at end of file diff --git a/tests/unit/v1/test_dataset_builder_helpers.py b/tests/unit/v1/test_dataset_builder_helpers.py index 6fbba42a5..aecd5ff6d 100644 --- a/tests/unit/v1/test_dataset_builder_helpers.py +++ b/tests/unit/v1/test_dataset_builder_helpers.py @@ -12,30 +12,30 @@ from mdio.schemas.core import StrictModel from mdio.schemas.dimension import NamedDimension -from mdio.schemas.v1.dataset_builder import _get_dimension +from mdio.schemas.v1.dataset_builder import _get_named_dimension from mdio.schemas.v1.dataset_builder import _to_dictionary -def test__get_dimension() -> None: +def test__get_named_dimension() -> None: """Test getting a dimension by name from the list of dimensions.""" dimensions = [NamedDimension(name="inline", size=2), NamedDimension( name="crossline", size=3)] - assert _get_dimension([], "inline") is None - assert _get_dimension(dimensions, "inline") == NamedDimension( + assert _get_named_dimension([], "inline") is None + assert _get_named_dimension(dimensions, "inline") == NamedDimension( name="inline", size=2) - assert _get_dimension(dimensions, "crossline") == NamedDimension( + assert _get_named_dimension(dimensions, "crossline") == NamedDimension( name="crossline", size=3) - assert _get_dimension(dimensions, "time") is None + assert _get_named_dimension(dimensions, "time") is None with pytest.raises(TypeError, match="Expected str, got NoneType"): - _get_dimension(dimensions, None) + _get_named_dimension(dimensions, None) with pytest.raises(TypeError, match="Expected str, got int"): - _get_dimension(dimensions, 42) + _get_named_dimension(dimensions, 42) with pytest.raises( ValueError, match="Dimension 'inline' found but size 2 does not match expected size 200" ): - _get_dimension(dimensions, "inline", size=200) + _get_named_dimension(dimensions, "inline", size=200) def test__to_dictionary() -> None: From 7b25d6bdf041dc6abe69002bdc45838213747eac Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Tue, 8 Jul 2025 19:06:12 +0000 Subject: [PATCH 31/56] PR Review: get api version from the package version --- src/mdio/schemas/v1/dataset_builder.py | 17 ++++++++++++----- tests/unit/v1/test_dataset_builder_build.py | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/mdio/schemas/v1/dataset_builder.py b/src/mdio/schemas/v1/dataset_builder.py index f0621de30..4b12375e7 100644 --- a/src/mdio/schemas/v1/dataset_builder.py +++ b/src/mdio/schemas/v1/dataset_builder.py @@ -6,6 +6,7 @@ from enum import auto from typing import Any from typing import TypeAlias +from importlib import metadata from pydantic import BaseModel from zarr.core.chunk_key_encodings import V2ChunkKeyEncoding # noqa: F401 @@ -17,7 +18,7 @@ from mdio.schemas.dtype import StructuredType from mdio.schemas.metadata import ChunkGridMetadata from mdio.schemas.metadata import UserAttributes -from mdio.schemas.v1.dataset import Dataset +from mdio.schemas.v1.dataset import Dataset, DatasetMetadata from mdio.schemas.v1.dataset import DatasetInfo from mdio.schemas.v1.stats import StatisticsMetadata from mdio.schemas.v1.units import AllUnits @@ -97,13 +98,16 @@ class MDIODatasetBuilder: def __init__(self, name: str, attributes: UserAttributes | None = None): - info = DatasetInfo( + try: + api_version = metadata.version("multidimio") + except metadata.PackageNotFoundError: + api_version = "unknown" + + self._info = DatasetInfo( name=name, - api_version="1.0.0", + api_version=api_version, created_on=datetime.now(UTC) ) - # TODO(BrianMichell, #0): Pull from package metadata - self._info = info self._attributes = attributes self._dimensions: list[NamedDimension] = [] self._coordinates: list[Coordinate] = [] @@ -252,6 +256,9 @@ def add_dimension_coordinate( """Add a dimension coordinate variable for a pre-existing dimension. This is a convenience method to create a coordinate variable that represents sampling along a dimension. + + The dimension coordinate is a coordinate that has a single dimension and + the name of the coordinate is the same as the name of the dimension """ self.add_coordinate(dimension_name, long_name=dimension_name, diff --git a/tests/unit/v1/test_dataset_builder_build.py b/tests/unit/v1/test_dataset_builder_build.py index 8e06f08dd..048f640d3 100644 --- a/tests/unit/v1/test_dataset_builder_build.py +++ b/tests/unit/v1/test_dataset_builder_build.py @@ -67,7 +67,7 @@ def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50 # Verify dataset structure assert dataset.metadata.name == "campos_3d" - assert dataset.metadata.api_version == "1.0.0" + assert dataset.metadata.api_version == "1.0.0a1" assert dataset.metadata.attributes["foo"] == "bar" assert len(dataset.metadata.attributes["textHeader"]) == 3 From 7ca3ed8fbc1b6f47cbf10e01737d4c8a51f6f7ba Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Wed, 9 Jul 2025 14:46:20 +0000 Subject: [PATCH 32/56] PR Review: remove add_dimension_coordinate --- .devcontainer/Dockerfile.cli | 47 ++++++++++++++ .devcontainer/Dockerfile.dev | 61 +++++++++++++++++++ .devcontainer/Dockerfile.nox | 49 +++++++++++++++ .devcontainer/devcontainer.json | 20 +++--- src/mdio/schemas/v1/dataset_builder.py | 24 -------- .../v1/test_dataset_builder_add_variable.py | 50 ++++----------- tests/unit/v1/test_dataset_builder_build.py | 16 +++-- 7 files changed, 187 insertions(+), 80 deletions(-) create mode 100644 .devcontainer/Dockerfile.cli create mode 100644 .devcontainer/Dockerfile.dev create mode 100644 .devcontainer/Dockerfile.nox diff --git a/.devcontainer/Dockerfile.cli b/.devcontainer/Dockerfile.cli new file mode 100644 index 000000000..92720e34e --- /dev/null +++ b/.devcontainer/Dockerfile.cli @@ -0,0 +1,47 @@ +# HOW TO BUILD AND RUN THIS DOCKERFILE +# * Clone mdio-python and build a Docker image: +# git clone https://github.com/TGSAI/mdio-python.git +# cd mdio-python +# docker build -t mdio-cli -f .devcontainer/Dockerfile.cli . +# * Run /bin/bash in the Docker container: +# +# +# USAGE: +# docker run -it --rm --name mdio-cli mdio-cli --version +# docker run -it --rm --name mdio-cli mdio-cli --help +# +# LOCAL_DATA_DIR=$(pwd); \ +# docker run -it --rm -v $LOCAL_DATA_DIR:/DATA --name mdio-cli mdio-cli \ +# segy import \ +# /DATA/segy_file.segy \ +# /DATA/mdio_file.mdio \ +# -loc 181,185 \ +# -names inline,crossline +# +# LOCAL_DATA_DIR=$(pwd); \ +# docker run -it --rm -v $LOCAL_DATA_DIR:/DATA --name mdio-cli mdio-cli \ +# segy export \ +# /DATA/mdio_file.mdio \ +# /DATA/segy_file_copy.segy +# +FROM python:3.13-bookworm +# Create the user (https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user) +ENV USERNAME=python +ENV USER_UID=1000 +ENV USER_GID=$USER_UID +RUN groupadd --gid $USER_GID $USERNAME && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME + +# Set the default non-root user +USER $USERNAME + +# Add path to the user-installed packages +ENV PYTHONUSERBASE=/home/$USERNAME/.local +ENV PATH="$PYTHONUSERBASE/bin:$PATH" + +COPY --chown=$USERNAME:$USERNAME ./ /home/$USERNAME/mdio-python + +WORKDIR /home/$USERNAME/mdio-python +RUN pip install . + +ENTRYPOINT ["mdio"] +CMD ["--version"] diff --git a/.devcontainer/Dockerfile.dev b/.devcontainer/Dockerfile.dev new file mode 100644 index 000000000..05f135799 --- /dev/null +++ b/.devcontainer/Dockerfile.dev @@ -0,0 +1,61 @@ +# USAGE: +# This file will be used by the VS Code DevContainer extension +# to create a development environment for the mdio-python project. +# HOW TO RUN TESTS +# 1. Open the project in VS Code. +# 2. Open the Command Palette (Ctrl+Shift+P) and select "Dev Containers: Reopen in Container". +# 3. Once the container is running, open a terminal in VS Code. +# 4. Run the tests using the command: `nox -s test`. +# HOW TO MANUALLY BUILD AND RUN THE CONTAINER +# docker build -t mdio-dev -f .devcontainer/Dockerfile.dev . +# docker run -it --rm --entrypoint /bin/bash --name mdio-dev mdio-dev +# NOTES: +# 1. The container will be run as the non-root user 'vscode' with UID 1000. +# 2. The virtual environment will be setup at /home/vscode/venv +# 3. The project source code will be mounted at /workspaces/mdio-python +ARG PYTHON_VERSION="3.13" +ARG LINUX_DISTRO="bookworm" +ARG UV_VERSION="0.6.11" +ARG NOX_VERSION="2025.2.9" +FROM mcr.microsoft.com/devcontainers/python:1-${PYTHON_VERSION}-${LINUX_DISTRO} + +# Install git for nox pre-commit +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + git \ + && rm -rf /var/lib/apt/lists/* + +ENV USERNAME="vscode" +USER $USERNAME + +# # Add path to the user-installed packages +# ENV PYTHONUSERBASE=/home/$USERNAME/.local +# ENV PATH="$PYTHONUSERBASE/bin:$PATH" + +COPY --chown=$USERNAME:$USERNAME ./ /workspaces/mdio-python + +WORKDIR /workspaces/mdio-python + +ARG UV_VERSION +ARG NOX_VERSION +RUN python3 -m pip install uv==${UV_VERSION} nox==${NOX_VERSION} msgpack ipykernel + +# Initialize virtual environement in the container +ENV VIRTUAL_ENV="/home/$USERNAME/venv" +RUN python3 -m venv $VIRTUAL_ENV +ENV PATH="$VIRTUAL_ENV/bin:$PATH" + +# installing pytest is required for VS Code Python Testing +RUN pip install pytest pytest-cov pytest-mock pytest-asyncio + +# Install the project in editable mode +# This allows for live reloading of the code during development +RUN pip install -e . + +# RUN uv pip install snakeviz + + + + + + diff --git a/.devcontainer/Dockerfile.nox b/.devcontainer/Dockerfile.nox new file mode 100644 index 000000000..103673fd2 --- /dev/null +++ b/.devcontainer/Dockerfile.nox @@ -0,0 +1,49 @@ +# HOW TO BUILD AND RUN THIS DOCKERFILE +# 1. Make sure you have Docker installed and running. +# 2. Clone mdio-python and build the Docker image: +# git clone https://github.com/TGSAI/mdio-python.git +# cd mdio-python +# docker build -t mdio-nox -f .devcontainer/Dockerfile.nox . +# 3. Run /bin/bash in the Docker container : +# LOCAL_DATA_DIR=$(pwd); \ +# docker run -it --rm -v $LOCAL_DATA_DIR:/DATA --entrypoint /bin/bash --name mdio-nox mdio-nox +# +# USAGE: +# docker run -it --rm mdio-nox --list +# docker run -it --rm mdio-nox -s tests-3.13 +# docker run -it --rm mdio-nox --no-stop-on-first-error +# +# NOTE: nox will fail if run in the directory mounted from the host machine +ARG PYTHON_VERSION="3.13" +ARG LINUX_DISTRO="bookworm" +ARG UV_VERSION="0.6.11" +ARG NOX_VERSION="2025.2.9" +FROM python:${PYTHON_VERSION}-${LINUX_DISTRO} +ARG PYTHON_VERSION +ARG LINUX_DISTRO +RUN echo "Using python:${PYTHON_VERSION}-${LINUX_DISTRO}" +# Create the user (https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user) +ENV USERNAME=python +ENV USER_UID=1000 +ENV USER_GID=$USER_UID +RUN groupadd --gid $USER_GID $USERNAME && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME +# Set the default non-root user +USER $USERNAME + +# Add path to the user-installed packages +ENV PYTHONUSERBASE=/home/$USERNAME/.local +ENV PATH="$PYTHONUSERBASE/bin:$PATH" + +COPY --chown=$USERNAME:$USERNAME ./ /home/$USERNAME/mdio-python + +WORKDIR /home/$USERNAME/mdio-python +RUN pip install . + +# Install UV dependency manager and Nox test automator +ARG UV_VERSION +ARG NOX_VERSION +RUN echo "Using uv: $UV_VERSION and nox: $NOX_VERSION" +RUN python3 -m pip install uv==${UV_VERSION} nox==${NOX_VERSION} msgpack ipykernel + +ENTRYPOINT ["nox"] +CMD ["--list"] \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b618a5260..dc80446c6 100755 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,12 +2,12 @@ // README at: https://github.com/devcontainers/templates/tree/main/src/python { "build": { - "dockerfile": "Dockerfile", + "dockerfile": "Dockerfile.dev", "context": ".." }, // Use 'postCreateCommand' to run commands after the container is created. "postCreateCommand": { - "post_create_script": "bash ./.devcontainer/post-install.sh" + // "post_create_script": "bash ./.devcontainer/post-install.sh" }, // Forward 8787 to enable us to view dask dashboard "forwardPorts": [8787], @@ -16,8 +16,9 @@ // Configure properties specific to VS Code. "vscode": { "settings": { - "python.terminal.activateEnvInCurrentTerminal": true, - "python.defaultInterpreterPath": "/opt/venv/bin/python" + "python.testing.pytestArgs": ["tests"], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true }, "extensions": [ "ms-python.python", @@ -27,17 +28,18 @@ "ms-toolsai.jupyter-renderers", "vscode-icons-team.vscode-icons", "wayou.vscode-todo-highlight", - "streetsidesoftware.code-spell-checker" + "streetsidesoftware.code-spell-checker", + "eamodio.gitlens", + "visualstudioexptteam.vscodeintellicode" ] } }, // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. // "remoteUser": "root", "updateRemoteUserUID": true, + "workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/mdio-python,type=bind", + "workspaceFolder": "/workspaces/mdio-python", "mounts": [ - // Re-use local Git configuration - "source=${localEnv:HOME}/.gitconfig,target=/home/vscode/.gitconfig_tmp,type=bind,consistency=cached", - "source=${localEnv:HOME}/.gitconfig,target=/root/.gitconfig_tmp,type=bind,consistency=cached", - "source=${localEnv:SCRATCH_DIR}/${localEnv:USER},target=/scratch/,type=bind,consistency=cached" + // "source=${localWorkspaceFolder}/../DATA/,target=/DATA/,type=bind,consistency=cached" ] } diff --git a/src/mdio/schemas/v1/dataset_builder.py b/src/mdio/schemas/v1/dataset_builder.py index 4b12375e7..2750e82f2 100644 --- a/src/mdio/schemas/v1/dataset_builder.py +++ b/src/mdio/schemas/v1/dataset_builder.py @@ -245,30 +245,6 @@ def add_coordinate( # noqa: PLR0913 self._state = _BuilderState.HAS_COORDINATES return self - def add_dimension_coordinate( - self, - dimension_name: str, - *, - data_type: ScalarType, - compressor: Blosc | ZFP | None = None, - metadata_info: VariableMetadataList | None = None, - ) -> "MDIODatasetBuilder": - """Add a dimension coordinate variable for a pre-existing dimension. - This is a convenience method to create a coordinate variable - that represents sampling along a dimension. - - The dimension coordinate is a coordinate that has a single dimension and - the name of the coordinate is the same as the name of the dimension - """ - self.add_coordinate(dimension_name, - long_name=dimension_name, - dimensions=[dimension_name], - data_type=data_type, - compressor=compressor, - metadata_info=_to_dictionary(metadata_info)) - - return self - def add_variable( # noqa: PLR0913 self, name: str, diff --git a/tests/unit/v1/test_dataset_builder_add_variable.py b/tests/unit/v1/test_dataset_builder_add_variable.py index ad24b9de4..3db688098 100644 --- a/tests/unit/v1/test_dataset_builder_add_variable.py +++ b/tests/unit/v1/test_dataset_builder_add_variable.py @@ -97,8 +97,8 @@ def test_add_variable_with_coords() -> None: builder.add_dimension("depth", 300) # Add dimension coordinates before we can add a data variable - builder.add_dimension_coordinate("inline", data_type=ScalarType.INT32) - builder.add_dimension_coordinate("crossline", data_type=ScalarType.INT32) + builder.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.UINT32) + builder.add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.UINT32) # Validate: adding a variable with a coordinate that has not been pre-created is not allowed msg = "Pre-existing coordinate named 'depth' is not found" @@ -168,32 +168,6 @@ def test_add_variable_with_coords() -> None: assert builder._get_coordinate(var_ampl2.coordinates, "cdp-y") is not None -def test_add_dimension_coordinate() -> None: - """Test adding dimension variable.""" - builder = MDIODatasetBuilder("test_dataset") - builder.add_dimension("inline", 100) - - builder.add_dimension_coordinate("inline", data_type=ScalarType.INT32) - - # Validate: that coordinate is stored in the builder global list - coord_il = builder._get_coordinate(builder._coordinates, "inline") - # Validate: that dimensions are stored as NamedDimensions in the coordinate - assert _get_named_dimension(coord_il.dimensions, "inline", 100) is not None - # Validate: a dim variable has been created - var_il = next((e for e in builder._variables if e.name == "inline"), None) - assert var_il is not None - # Validate: the variable has the expected properties - assert var_il.name == "inline" - assert var_il.long_name == "'inline' coordinate variable" - assert len(var_il.dimensions) == 1 - assert _get_named_dimension(var_il.dimensions, "inline", 100) is not None - assert var_il.data_type == ScalarType.INT32 - assert var_il.compressor is None # Default value - assert len(var_il.coordinates) == 1 - assert builder._get_coordinate(var_il.coordinates, "inline") is not None - assert var_il.metadata is None # Default value - - def test_add_variable_with_defaults() -> None: """Test adding variable with default arguments.""" builder = MDIODatasetBuilder("test_dataset") @@ -202,12 +176,12 @@ def test_add_variable_with_defaults() -> None: builder.add_dimension("crossline", 200) builder.add_dimension("depth", 300) # Add dimension coordinates - builder.add_dimension_coordinate("inline", data_type=ScalarType.INT32) - builder.add_dimension_coordinate("crossline", data_type=ScalarType.INT32) - builder.add_dimension_coordinate("depth", - data_type=ScalarType.FLOAT32, - metadata_info=[ - AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))]) + builder.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.UINT32) + builder.add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.UINT32) + builder.add_coordinate("depth", dimensions=["depth"], data_type=ScalarType.UINT32, + metadata_info=[ + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER)) + ]) # Add data variable using defaults builder.add_variable("ampl", @@ -244,10 +218,10 @@ def test_add_variable_full_parameters() -> None: builder.add_dimension("depth", 300) # Add dimension coordinates - builder.add_dimension_coordinate("inline", data_type=ScalarType.INT32) - builder.add_dimension_coordinate("crossline", data_type=ScalarType.INT32) - builder.add_dimension_coordinate("depth", data_type=ScalarType.INT32) - + builder.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.UINT32) + builder.add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.UINT32) + builder.add_coordinate("depth", dimensions=["depth"], data_type=ScalarType.UINT32) + # Add coordinates before we can add a data variable builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64) builder.add_coordinate("cdp-y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64) diff --git a/tests/unit/v1/test_dataset_builder_build.py b/tests/unit/v1/test_dataset_builder_build.py index 048f640d3..322855856 100644 --- a/tests/unit/v1/test_dataset_builder_build.py +++ b/tests/unit/v1/test_dataset_builder_build.py @@ -31,10 +31,8 @@ def test_build() -> None: MDIODatasetBuilder("test_dataset") .add_dimension("inline", 100) .add_dimension("crossline", 200) - # Add a dimension coordinate explicitly using add_coordinate() .add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.FLOAT64) - # Add a dimension coordinate using .add_dimension_coordinate() shortcut - .add_dimension_coordinate("crossline", data_type=ScalarType.FLOAT64) + .add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.FLOAT64) .add_coordinate("x_coord", dimensions=["inline", "crossline"]) .add_coordinate("y_coord", dimensions=["inline", "crossline"]) .add_variable("data", @@ -176,12 +174,12 @@ def make_campos_3d_dataset() -> Dataset: ds.add_dimension("inline", 256) ds.add_dimension("crossline", 512) ds.add_dimension("depth", 384) - ds.add_dimension_coordinate("inline", data_type=ScalarType.UINT32) - ds.add_dimension_coordinate("crossline", data_type=ScalarType.UINT32) - ds.add_dimension_coordinate("depth", data_type=ScalarType.FLOAT64, - metadata_info=[ - AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER)) - ]) + ds.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.UINT32) + ds.add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.UINT32) + ds.add_coordinate("depth", dimensions=["depth"], data_type=ScalarType.FLOAT64, + metadata_info=[ + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER)) + ]) # Add coordinates ds.add_coordinate( "cdp-x", From 4d1ec9cc4307d5febfee299ab7cdfeddb3c83725 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Wed, 9 Jul 2025 15:27:00 +0000 Subject: [PATCH 33/56] PR Review: add_coordinate() remove data_type default value --- src/mdio/schemas/v1/dataset_builder.py | 2 +- .../v1/test_dataset_builder_add_coordinate.py | 18 +++++----- .../v1/test_dataset_builder_add_variable.py | 4 +-- tests/unit/v1/test_dataset_builder_build.py | 34 +++---------------- 4 files changed, 16 insertions(+), 42 deletions(-) diff --git a/src/mdio/schemas/v1/dataset_builder.py b/src/mdio/schemas/v1/dataset_builder.py index 2750e82f2..80d4b8761 100644 --- a/src/mdio/schemas/v1/dataset_builder.py +++ b/src/mdio/schemas/v1/dataset_builder.py @@ -177,7 +177,7 @@ def add_coordinate( # noqa: PLR0913 *, long_name: str = None, dimensions: list[str], - data_type: ScalarType = ScalarType.FLOAT32, + data_type: ScalarType, compressor: Blosc | ZFP | None = None, metadata_info: CoordinateMetadataList | None = None, ) -> "MDIODatasetBuilder": diff --git a/tests/unit/v1/test_dataset_builder_add_coordinate.py b/tests/unit/v1/test_dataset_builder_add_coordinate.py index cae46834f..0d4fdc6eb 100644 --- a/tests/unit/v1/test_dataset_builder_add_coordinate.py +++ b/tests/unit/v1/test_dataset_builder_add_coordinate.py @@ -24,7 +24,7 @@ def test_add_coordinate() -> None: msg = "Must add at least one dimension before adding coordinates" with pytest.raises(ValueError, match=msg): - builder.add_coordinate("cdp", dimensions=["inline", "crossline"]) + builder.add_coordinate("cdp", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) builder.add_dimension("inline", 100) builder.add_dimension("crossline", 200) @@ -32,21 +32,21 @@ def test_add_coordinate() -> None: # Validate required parameters bad_name = None with pytest.raises(ValueError, match="'name' must be a non-empty string"): - builder.add_coordinate(bad_name, dimensions=["speed"]) + builder.add_coordinate(bad_name, dimensions=["speed"], data_type=ScalarType.FLOAT32) with pytest.raises(ValueError, match="'name' must be a non-empty string"): - builder.add_coordinate("", dimensions=["speed"]) + builder.add_coordinate("", dimensions=["speed"], data_type=ScalarType.FLOAT32) with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): - builder.add_coordinate("cdp-x", dimensions=None) + builder.add_coordinate("cdp-x", dimensions=None, data_type=ScalarType.FLOAT32) with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): - builder.add_coordinate("cdp-x", dimensions=[]) + builder.add_coordinate("cdp-x", dimensions=[], data_type=ScalarType.FLOAT32) # Add a variable using non-existent dimensions msg="Pre-existing dimension named 'xline' is not found" with pytest.raises(ValueError, match=msg): - builder.add_coordinate("bad_cdp-x", dimensions=["inline", "xline"]) + builder.add_coordinate("bad_cdp-x", dimensions=["inline", "xline"], data_type=ScalarType.FLOAT32) # Validate state transition - builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"]) + builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) assert builder._state == _BuilderState.HAS_COORDINATES assert len(builder._dimensions) == 2 # 1 variable for coordinates @@ -68,7 +68,7 @@ def test_add_coordinate() -> None: # Adding coordinate with the same name twice msg="Adding coordinate with the same name twice is not allowed" with pytest.raises(ValueError, match=msg): - builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"]) + builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) def test_add_coordinate_with_defaults() -> None: """Test adding coordinates with default arguments.""" @@ -76,7 +76,7 @@ def test_add_coordinate_with_defaults() -> None: builder.add_dimension("inline", 100) builder.add_dimension("crossline", 200) # Add coordinate using defaults - builder.add_coordinate("cdp", dimensions=["inline", "crossline"]) + builder.add_coordinate("cdp", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) assert len(builder._dimensions) == 2 # 1 variable for coordinates assert len(builder._variables) == 1 diff --git a/tests/unit/v1/test_dataset_builder_add_variable.py b/tests/unit/v1/test_dataset_builder_add_variable.py index 3db688098..99f2f994b 100644 --- a/tests/unit/v1/test_dataset_builder_add_variable.py +++ b/tests/unit/v1/test_dataset_builder_add_variable.py @@ -135,8 +135,8 @@ def test_add_variable_with_coords() -> None: # "depth" coordinate is not set # Add non-dim coordinates (e.g., 2D coordinates) - builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"]) - builder.add_coordinate("cdp-y", dimensions=["inline", "crossline"]) + builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) + builder.add_coordinate("cdp-y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) # Add a variable with pre-defined dimension and non-dimension coordinates builder.add_variable("ampl2", diff --git a/tests/unit/v1/test_dataset_builder_build.py b/tests/unit/v1/test_dataset_builder_build.py index 322855856..b008e062f 100644 --- a/tests/unit/v1/test_dataset_builder_build.py +++ b/tests/unit/v1/test_dataset_builder_build.py @@ -33,8 +33,8 @@ def test_build() -> None: .add_dimension("crossline", 200) .add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.FLOAT64) .add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.FLOAT64) - .add_coordinate("x_coord", dimensions=["inline", "crossline"]) - .add_coordinate("y_coord", dimensions=["inline", "crossline"]) + .add_coordinate("x_coord", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) + .add_coordinate("y_coord", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) .add_variable("data", long_name="Test Data", dimensions=["inline", "crossline"], @@ -43,7 +43,6 @@ def test_build() -> None: .build() ) - # TODO: Expand this assert isinstance(dataset, Dataset) assert dataset.metadata.name == "test_dataset" # 2 dim coord var + 2 non-dim coord var + 1 data variables = 5 variables @@ -184,12 +183,14 @@ def make_campos_3d_dataset() -> Dataset: ds.add_coordinate( "cdp-x", dimensions=["inline", "crossline"], + data_type=ScalarType.FLOAT32, metadata_info=[ AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))] ) ds.add_coordinate( "cdp-y", dimensions=["inline", "crossline"], + data_type=ScalarType.FLOAT32, metadata_info=[ AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))] ) @@ -264,30 +265,3 @@ def make_campos_3d_dataset() -> Dataset: coordinates=["cdp-x", "cdp-y"], ) return ds.build() - -# def test_edge_case_not_used_dimension(): -# builder = MDIODatasetBuilder("test_dataset") - -# builder.add_dimension("inline", 100) -# builder.add_dimension("xline", 200) -# builder.add_dimension("depth", 300) -# builder.add_dimension("time", 600) - -# # Add 'dimension Coordinate' or 'index Coordinates', -# # the coordinates with the same name as a dimension, marked by *) on objects used in binary operations. -# builder.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.FLOAT32) -# builder.add_coordinate("xline", dimensions=["xline"], data_type=ScalarType.FLOAT32) -# # No 'depth' dimension coordinate is provided - -# # Add 'non-dimension coordinates' before we can add a data variable -# builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"]) -# builder.add_coordinate("cdp-y", dimensions=["inline", "crossline"]) - -# # Add data variable with full parameters -# builder.add_variable("seismic", -# dimensions=["inline", "crossline", "depth"], -# data_type=ScalarType.FLOAT64, -# coordinates=["cdp-x", "cdp-y"]) - -# # NOTE: The model has separate list list[Coordinate] | list[str] -# # It does not allow mixing names and NamedDimensions \ No newline at end of file From 99fcf4385e5ce6147b37832b498f7d6d5ee3cca3 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Wed, 9 Jul 2025 19:10:44 +0000 Subject: [PATCH 34/56] PR Review: improve unit tests by extracting common functionality in validate* functions --- src/mdio/schemas/v1/dataset_builder.py | 35 +-- tests/unit/v1/helpers.py | 243 +++++++++++++++++ .../v1/test_dataset_builder_add_coordinate.py | 113 ++++---- .../v1/test_dataset_builder_add_dimension.py | 4 +- .../v1/test_dataset_builder_add_variable.py | 137 +++------- tests/unit/v1/test_dataset_builder_build.py | 244 ++++++------------ 6 files changed, 412 insertions(+), 364 deletions(-) create mode 100644 tests/unit/v1/helpers.py diff --git a/src/mdio/schemas/v1/dataset_builder.py b/src/mdio/schemas/v1/dataset_builder.py index 80d4b8761..3bfd914ea 100644 --- a/src/mdio/schemas/v1/dataset_builder.py +++ b/src/mdio/schemas/v1/dataset_builder.py @@ -146,30 +146,6 @@ def add_dimension( # noqa: PLR0913 self._state = _BuilderState.HAS_DIMENSIONS return self - def _get_coordinate( - self, - coordinates: list[Coordinate] | list[str], - name: str, size: int | None = None - ) -> Coordinate | None: - """Get a coordinate by name from the list[Coordinate] | list[str].""" - if coordinates is None: - return None - - for c in coordinates: - if isinstance(c, str) and c == name: - # The coordinate is stored by name (str). - # Find it in the builder global list and return it. - cc = next((v for v in self._coordinates if v.name == name), None) - if cc is None: - msg = f"Pre-existing coordinate named {name!r} is not found" - raise ValueError(msg) - return cc - if isinstance(c, Coordinate) and c.name == name: - # The coordinate is stored as an embedded Coordinate object. - # Return it. - return c - - return None def add_coordinate( # noqa: PLR0913 self, @@ -303,13 +279,22 @@ def add_variable( # noqa: PLR0913 raise ValueError(msg) named_dimensions.append(nd) + coordinate_objs: list[Coordinate] = [] # Validate that all referenced coordinates are already defined if coordinates is not None: for coord in coordinates: - if next((c for c in self._coordinates if c.name == coord), None) is None: + c: Coordinate = next((c for c in self._coordinates if c.name == coord), None) + if c is not None: + coordinate_objs.append(c) + else: msg = f"Pre-existing coordinate named {coord!r} is not found" raise ValueError(msg) + if coordinates is not None: + # If this is a dimension coordinate variable, embed the Coordinate into it + if len(coordinates) == 1 and coordinates[0] == name: + coordinates = coordinate_objs + meta_dict = _to_dictionary(metadata_info) var = Variable( name=name, diff --git a/tests/unit/v1/helpers.py b/tests/unit/v1/helpers.py new file mode 100644 index 000000000..814357b42 --- /dev/null +++ b/tests/unit/v1/helpers.py @@ -0,0 +1,243 @@ + +from mdio.schemas.chunk_grid import RegularChunkGrid +from mdio.schemas.chunk_grid import RegularChunkShape +from mdio.schemas.compressors import Blosc +from mdio.schemas.dtype import ScalarType, StructuredField +from mdio.schemas.dtype import StructuredType +from mdio.schemas.metadata import ChunkGridMetadata +from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.dataset import Dataset +from mdio.schemas.v1.dataset_builder import _BuilderState, MDIODatasetBuilder +from mdio.schemas.v1.dataset_builder import _get_named_dimension +from mdio.schemas.v1.stats import CenteredBinHistogram +from mdio.schemas.v1.stats import StatisticsMetadata +from mdio.schemas.v1.stats import SummaryStatistics +from mdio.schemas.v1.units import AllUnits +from mdio.schemas.v1.units import LengthUnitEnum +from mdio.schemas.v1.units import LengthUnitModel +from mdio.schemas.v1.units import SpeedUnitEnum +from mdio.schemas.v1.units import SpeedUnitModel +from mdio.schemas.v1.variable import Coordinate, Variable + + +def validate_builder(builder: MDIODatasetBuilder, + state: _BuilderState, + n_dims: int, + n_coords: int, + n_var: int) -> None: + """Validate the state of the builder and the number of dimensions, coordinates, and variables.""" + assert builder._state == state + assert len(builder._dimensions) == n_dims + assert len(builder._coordinates) == n_coords + assert len(builder._variables) == n_var + + +def validate_coordinate(builder: MDIODatasetBuilder, + name: str, + dims: list[tuple[str, int]], + dtype: ScalarType) -> Coordinate: + """Validate existence and the structure of the created coordinate.""" + # Validate that coordinate exists + c = next((c for c in builder._coordinates if c.name == name), None) + assert c is not None + assert isinstance(c, Coordinate) + + # Validate that dimensions are stored as NamedDimensions + for d in dims: + name = d[0] + size = d[1] + assert _get_named_dimension(c.dimensions, name, size) is not None + + assert c.data_type == dtype + return c + + +def validate_variable(container: MDIODatasetBuilder | Dataset, + name: str, + dims: list[tuple[str, int]], + coords: list[str], + dtype: ScalarType) -> Variable: + """Validate existence and the structure of the created variable.""" + + if isinstance(container, MDIODatasetBuilder): + var_list = container._variables + global_coord_list = container._coordinates + elif isinstance(container, Dataset): + var_list = container.variables + global_coord_list = _get_all_coordinates(container) + else: + raise TypeError("container must be MDIODatasetBuilder or Dataset") + + # Validate that the variable exists + v = next((e for e in var_list if e.name == name), None) + assert v is not None + assert isinstance(v, Variable) + + # Validate that dimensions are stored as NamedDimensions within the variable + assert len(v.dimensions) == len(dims) + for d in dims: + name = d[0] + size = d[1] + assert _get_named_dimension(v.dimensions, name, size) is not None + + # Validate that coordinates are either embedded or can be resolved from names to Coordinate + if coords is None: + assert v.coordinates is None + else: + assert len(v.coordinates) == len(coords) + for coord_name in coords: + assert _get_coordinate(global_coord_list, v.coordinates, coord_name) is not None + + assert v.data_type == dtype + return v + + +def _get_coordinate( + global_coord_list: list[Coordinate], + coordinates_or_references: list[Coordinate] | list[str], + name: str, size: int | None = None +) -> Coordinate | None: + """Get a coordinate by name from the list[Coordinate] | list[str]. + Validates that the coordinate referenced by the name can be found in the global coordinate list + """ + if coordinates_or_references is None: + return None + + for c in coordinates_or_references: + if isinstance(c, str) and c == name: + # The coordinate is stored by name (str). + cc = None + # Find the Coordinate in the global list and return it. + if global_coord_list is not None: + cc = next((cc for cc in global_coord_list if cc.name == name), None) + if cc is None: + msg = f"Pre-existing coordinate named {name!r} is not found" + raise ValueError(msg) + return cc + if isinstance(c, Coordinate) and c.name == name: + # The coordinate is stored as an embedded Coordinate object. + # Return it. + return c + + return None + + +def _get_all_coordinates(dataset: Dataset) -> list[Coordinate]: + all_coords: dict[str, Coordinate] = {} + for v in dataset.variables: + if v.coordinates is not None: + for c in v.coordinates: + if isinstance(c, Coordinate) and c.name not in all_coords: + all_coords[c.name] = c + return list(all_coords.values()) + + +def make_campos_3d_dataset() -> Dataset: + """Create in-memory campos_3d dataset.""" + ds = MDIODatasetBuilder( + "campos_3d", + attributes=UserAttributes(attributes={ + "textHeader": [ + "C01 .......................... ", + "C02 .......................... ", + "C03 .......................... ", + ], + "foo": "bar" + })) + + # Add dimensions + ds.add_dimension("inline", 256) + ds.add_dimension("crossline", 512) + ds.add_dimension("depth", 384) + ds.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.UINT32) + ds.add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.UINT32) + ds.add_coordinate("depth", dimensions=["depth"], data_type=ScalarType.FLOAT64, + metadata_info=[ + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER)) + ]) + # Add coordinates + ds.add_coordinate( + "cdp-x", + dimensions=["inline", "crossline"], + data_type=ScalarType.FLOAT32, + metadata_info=[ + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))] + ) + ds.add_coordinate( + "cdp-y", + dimensions=["inline", "crossline"], + data_type=ScalarType.FLOAT32, + metadata_info=[ + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))] + ) + + # Add image variable + ds.add_variable( + name="image", + dimensions=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT32, + compressor=Blosc(algorithm="zstd"), + coordinates=["cdp-x", "cdp-y"], + metadata_info=[ + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape(chunk_shape=[128, 128, 128])) + ), + StatisticsMetadata( + stats_v1=SummaryStatistics( + count=100, + sum=1215.1, + sumSquares=125.12, + min=5.61, + max=10.84, + histogram=CenteredBinHistogram( + binCenters=[1, 2], counts=[10, 15]), + ) + ), + UserAttributes( + attributes={"fizz": "buzz", "UnitSystem": "Canonical"}), + ]) + # Add velocity variable + ds.add_variable( + name="velocity", + dimensions=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT16, + coordinates=["cdp-x", "cdp-y"], + metadata_info=[ + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape(chunk_shape=[128, 128, 128])) + ), + AllUnits(units_v1=SpeedUnitModel( + speed=SpeedUnitEnum.METER_PER_SECOND)), + ], + ) + # Add inline-optimized image variable + ds.add_variable( + name="image_inline", + long_name="inline optimized version of 3d_stack", + dimensions=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT32, + compressor=Blosc(algorithm="zstd"), + coordinates=["cdp-x", "cdp-y"], + metadata_info=[ + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape(chunk_shape=[4, 512, 512])) + )] + ) + # Add headers variable with structured dtype + ds.add_variable( + name="image_headers", + dimensions=["inline", "crossline"], + data_type=StructuredType( + fields=[ + StructuredField(name="cdp-x", format=ScalarType.FLOAT32), + StructuredField(name="cdp-y", format=ScalarType.FLOAT32), + StructuredField(name="inline", format=ScalarType.UINT32), + StructuredField(name="crossline", format=ScalarType.UINT32), + ] + ), + coordinates=["cdp-x", "cdp-y"], + ) + return ds.build() diff --git a/tests/unit/v1/test_dataset_builder_add_coordinate.py b/tests/unit/v1/test_dataset_builder_add_coordinate.py index 0d4fdc6eb..232c525d8 100644 --- a/tests/unit/v1/test_dataset_builder_add_coordinate.py +++ b/tests/unit/v1/test_dataset_builder_add_coordinate.py @@ -6,6 +6,7 @@ import pytest +from mdio.schemas import builder from mdio.schemas.compressors import Blosc from mdio.schemas.dtype import ScalarType from mdio.schemas.metadata import UserAttributes @@ -15,7 +16,7 @@ from mdio.schemas.v1.units import LengthUnitEnum from mdio.schemas.v1.units import LengthUnitModel from mdio.schemas.v1.variable import VariableMetadata - +from .helpers import validate_builder, validate_coordinate, validate_variable def test_add_coordinate() -> None: """Test adding coordinates. Check the state transition and validate required parameters.""" @@ -47,23 +48,14 @@ def test_add_coordinate() -> None: # Validate state transition builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) - assert builder._state == _BuilderState.HAS_COORDINATES - assert len(builder._dimensions) == 2 - # 1 variable for coordinates - assert len(builder._variables) == 1 - assert len(builder._coordinates) == 1 - - # Validate that we created a coordinate variable - var_cdp = next(e for e in builder._variables if e.name == "cdp-x") - assert var_cdp is not None - assert len(var_cdp.dimensions) == 2 - assert _get_named_dimension(var_cdp.dimensions, "inline", 100) is not None - assert _get_named_dimension(var_cdp.dimensions, "crossline", 200) is not None - # Validate that coordinates are stored as Coordinate - assert len(var_cdp.coordinates) == 1 - # No dimensions are stored in coordinates - # Validate that non-dimension coordinates - assert builder._get_coordinate(var_cdp.coordinates, "cdp-x") is not None + validate_builder(builder, _BuilderState.HAS_COORDINATES, n_dims=2, n_coords=1, n_var=1) + validate_variable( + builder, + name="cdp-x", + dims=[("inline", 100), ("crossline", 200)], + coords=["cdp-x"], + dtype=ScalarType.FLOAT32 + ) # Adding coordinate with the same name twice msg="Adding coordinate with the same name twice is not allowed" @@ -75,23 +67,26 @@ def test_add_coordinate_with_defaults() -> None: builder = MDIODatasetBuilder("test_dataset") builder.add_dimension("inline", 100) builder.add_dimension("crossline", 200) + # Add coordinate using defaults builder.add_coordinate("cdp", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) - assert len(builder._dimensions) == 2 - # 1 variable for coordinates - assert len(builder._variables) == 1 - assert len(builder._coordinates) == 1 - - # Validate: the structure of the coordinate - coord_cdp = next((e for e in builder._coordinates if e.name == "cdp"), None) - assert coord_cdp is not None - assert len(coord_cdp.dimensions) == 2 - assert _get_named_dimension(coord_cdp.dimensions, "inline", 100) is not None - assert _get_named_dimension(coord_cdp.dimensions, "crossline", 200) is not None - assert coord_cdp.long_name is None # Default value - assert coord_cdp.data_type == ScalarType.FLOAT32 # Default value - assert coord_cdp.compressor is None # Default value - assert coord_cdp.metadata is None # Default value + validate_builder(builder, _BuilderState.HAS_COORDINATES, n_dims=2, n_coords=1, n_var=1) + validate_coordinate( + builder, + name="cdp", + dims=[("inline", 100), ("crossline", 200)], + dtype=ScalarType.FLOAT32 + ) + v = validate_variable( + builder, + name="cdp", + dims=[("inline", 100), ("crossline", 200)], + coords=["cdp"], + dtype=ScalarType.FLOAT32 + ) + assert v.long_name == "'cdp' coordinate variable" # Default value + assert v.compressor is None # Default value + assert v.metadata is None # Default value def test_coordinate_with_full_parameters() -> None: @@ -99,6 +94,7 @@ def test_coordinate_with_full_parameters() -> None: builder = MDIODatasetBuilder("test_dataset") builder.add_dimension("inline", 100) builder.add_dimension("crossline", 200) + # Add coordinate with all metadata builder.add_coordinate( "cdp", @@ -110,39 +106,28 @@ def test_coordinate_with_full_parameters() -> None: AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)), UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"})] ) - # Validate: the state of the builder - assert builder._state == _BuilderState.HAS_COORDINATES - assert len(builder._dimensions) == 2 - # 1 variable for coordinates - assert len(builder._variables) == 1 - assert len(builder._coordinates) == 1 - - # Validate: the structure of the coordinate - coord_cdp = next((e for e in builder._coordinates if e.name == "cdp"), None) - assert coord_cdp is not None - assert len(coord_cdp.dimensions) == 2 - assert _get_named_dimension(coord_cdp.dimensions, "inline", 100) is not None - assert _get_named_dimension(coord_cdp.dimensions, "crossline", 200) is not None - assert coord_cdp.long_name == "Common Depth Point" - assert coord_cdp.data_type == ScalarType.FLOAT16 - assert isinstance(coord_cdp.compressor, Blosc) - assert coord_cdp.compressor.algorithm == "zstd" - assert coord_cdp.metadata.attributes["MGA"] == 51 - assert coord_cdp.metadata.attributes["UnitSystem"] == "Imperial" - assert coord_cdp.metadata.units_v1.length == LengthUnitEnum.FOOT - - # Validate: the structure of the created variable - v = next((v for v in builder._variables if v.name == "cdp"), None) - assert v is not None - assert v.long_name == "'cdp' coordinate variable" - assert len(v.dimensions) == 2 - assert _get_named_dimension(v.dimensions, "inline", 100) is not None - assert _get_named_dimension(v.dimensions, "crossline", 200) is not None - assert v.data_type == ScalarType.FLOAT16 + validate_builder(builder, _BuilderState.HAS_COORDINATES, n_dims=2, n_coords=1, n_var=1) + c = validate_coordinate( + builder, + name="cdp", + dims=[("inline", 100), ("crossline", 200)], + dtype=ScalarType.FLOAT16 + ) + assert c.long_name == "Common Depth Point" + assert isinstance(c.compressor, Blosc) + assert c.compressor.algorithm == "zstd" + assert c.metadata.attributes["MGA"] == 51 + assert c.metadata.attributes["UnitSystem"] == "Imperial" + assert c.metadata.units_v1.length == LengthUnitEnum.FOOT + v = validate_variable( + builder, + name="cdp", + dims=[("inline", 100), ("crossline", 200)], + coords=["cdp"], + dtype=ScalarType.FLOAT16 + ) assert isinstance(v.compressor, Blosc) assert v.compressor.algorithm == "zstd" - assert len(v.coordinates) == 1 - assert builder._get_coordinate(v.coordinates, "cdp") is not None assert isinstance(v.metadata, VariableMetadata) assert v.metadata.units_v1.length == LengthUnitEnum.FOOT assert v.metadata.attributes["MGA"] == 51 diff --git a/tests/unit/v1/test_dataset_builder_add_dimension.py b/tests/unit/v1/test_dataset_builder_add_dimension.py index b701380fb..5fd70a016 100644 --- a/tests/unit/v1/test_dataset_builder_add_dimension.py +++ b/tests/unit/v1/test_dataset_builder_add_dimension.py @@ -20,6 +20,7 @@ from mdio.schemas.v1.units import AllUnits from mdio.schemas.v1.units import LengthUnitEnum from mdio.schemas.v1.units import LengthUnitModel +from .helpers import validate_builder def test_add_dimension() -> None: @@ -36,8 +37,7 @@ def test_add_dimension() -> None: # First dimension should change state to HAS_DIMENSIONS and create a variable builder.add_dimension("x", 100) - assert builder._state == _BuilderState.HAS_DIMENSIONS - assert len(builder._dimensions) == 1 + validate_builder(builder, _BuilderState.HAS_DIMENSIONS, n_dims=1, n_coords=0, n_var=0) assert _get_named_dimension(builder._dimensions, "x", 100) is not None # Validate that we can't add a dimension with the same name twice diff --git a/tests/unit/v1/test_dataset_builder_add_variable.py b/tests/unit/v1/test_dataset_builder_add_variable.py index 99f2f994b..3bd5ef370 100644 --- a/tests/unit/v1/test_dataset_builder_add_variable.py +++ b/tests/unit/v1/test_dataset_builder_add_variable.py @@ -21,13 +21,14 @@ from mdio.schemas.v1.units import AllUnits from mdio.schemas.v1.units import LengthUnitEnum from mdio.schemas.v1.units import LengthUnitModel -from mdio.schemas.v1.variable import VariableMetadata - +from mdio.schemas.v1.variable import VariableMetadata, Variable +from .helpers import validate_builder +from .helpers import validate_variable def test_add_variable_no_coords() -> None: """Test adding variable. Check the state transition and validate required parameters..""" builder = MDIODatasetBuilder("test_dataset") - assert builder._state == _BuilderState.INITIAL + validate_builder(builder, _BuilderState.INITIAL, n_dims=0, n_coords=0, n_var=0) # Validate: Must add at least one dimension before adding variables msg = "Must add at least one dimension before adding variables" @@ -66,20 +67,11 @@ def test_add_variable_no_coords() -> None: builder.add_variable("amplitude", dimensions=["inline", "crossline", "depth"], data_type=ScalarType.FLOAT32) - assert builder._state == _BuilderState.HAS_VARIABLES - assert len(builder._dimensions) == 3 - assert len(builder._variables) == 1 - assert len(builder._coordinates) == 0 - - # Validate the structure of the created variable - var_ampl = next((e for e in builder._variables if e.name == "amplitude"), None) - assert var_ampl is not None - # Validate that dimensions are stored as NamedDimensions - assert _get_named_dimension(var_ampl.dimensions, "inline", 100) is not None - assert _get_named_dimension(var_ampl.dimensions, "crossline", 200) is not None - assert _get_named_dimension(var_ampl.dimensions, "depth", 300) is not None - # Validate that no coordinates are set - assert var_ampl.coordinates is None + validate_builder(builder, _BuilderState.HAS_VARIABLES, n_dims=3, n_coords=0, n_var=1) + validate_variable(builder, "amplitude", + dims=[("inline", 100), ("crossline", 200), ("depth", 300)], + coords=None, + dtype=ScalarType.FLOAT32) # Validate: adding a variable with the same name twice is not allowed msg = "Adding variable with the same name twice is not allowed" @@ -113,26 +105,11 @@ def test_add_variable_with_coords() -> None: dimensions=["inline", "crossline", "depth"], coordinates=["inline", "crossline"], data_type=ScalarType.FLOAT32) - - assert builder._state == _BuilderState.HAS_VARIABLES - assert len(builder._dimensions) == 3 - # 2 dim coordinate variables + 1 data variables - assert len(builder._variables) == 3 - assert len(builder._coordinates) == 2 - - # Validate: the structure of the created variable - var_ampl = next((e for e in builder._variables if e.name == "ampl"), None) - assert var_ampl is not None - # Validate: that dimensions are stored as NamedDimensions - assert len(var_ampl.dimensions) == 3 - assert _get_named_dimension(var_ampl.dimensions, "inline", 100) is not None - assert _get_named_dimension(var_ampl.dimensions, "crossline", 200) is not None - assert _get_named_dimension(var_ampl.dimensions, "depth", 300) is not None - assert len(var_ampl.coordinates) == 2 - # Validate that dim coordinates "inline" and "crossline" are set - assert builder._get_coordinate(var_ampl.coordinates, "inline") is not None - assert builder._get_coordinate(var_ampl.coordinates, "crossline") is not None - # "depth" coordinate is not set + validate_builder(builder, _BuilderState.HAS_VARIABLES, n_dims=3, n_coords=2, n_var=3) + validate_variable(builder, "ampl", + dims=[("inline", 100), ("crossline", 200), ("depth", 300)], + coords=["inline", "crossline"], + dtype=ScalarType.FLOAT32) # Add non-dim coordinates (e.g., 2D coordinates) builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) @@ -143,29 +120,11 @@ def test_add_variable_with_coords() -> None: dimensions=["inline", "crossline", "depth"], coordinates=["inline", "crossline", "cdp-x", "cdp-y"], data_type=ScalarType.FLOAT32) - - assert builder._state == _BuilderState.HAS_VARIABLES - assert len(builder._dimensions) == 3 - # 2 dim coordinate variables + 2 non-dim coordinate variables + 1 data variables - assert len(builder._variables) == 6 - assert len(builder._coordinates) == 4 - - # Validate: the structure of the created variable - var_ampl2 = next((e for e in builder._variables if e.name == "ampl2"), None) - assert var_ampl2 is not None - # Validate: that dimensions are stored as NamedDimensions - assert len(var_ampl2.dimensions) == 3 - assert _get_named_dimension(var_ampl2.dimensions, "inline", 100) is not None - assert _get_named_dimension(var_ampl2.dimensions, "crossline", 200) is not None - assert _get_named_dimension(var_ampl2.dimensions, "depth", 300) is not None - assert len(var_ampl2.coordinates) == 4 - # Validate that dim coordinates "inline" and "crossline" are set - assert builder._get_coordinate(var_ampl2.coordinates, "inline") is not None - assert builder._get_coordinate(var_ampl2.coordinates, "crossline") is not None - # "depth" coordinate is not set - # Validate that non-dimension coordinates "cdp-x" and "cdp-y" - assert builder._get_coordinate(var_ampl2.coordinates, "cdp-x") is not None - assert builder._get_coordinate(var_ampl2.coordinates, "cdp-y") is not None + validate_builder(builder, _BuilderState.HAS_VARIABLES, n_dims=3, n_coords=4, n_var=6) + validate_variable(builder, "ampl2", + dims=[("inline", 100), ("crossline", 200), ("depth", 300)], + coords=["inline", "crossline", "cdp-x", "cdp-y"], + dtype=ScalarType.FLOAT32) def test_add_variable_with_defaults() -> None: @@ -187,26 +146,15 @@ def test_add_variable_with_defaults() -> None: builder.add_variable("ampl", dimensions=["inline", "crossline", "depth"], data_type=ScalarType.FLOAT32) - assert len(builder._dimensions) == 3 - # 3 dim coordinate variables + 1 data variable = 4 - assert len(builder._variables) == 4 - assert len(builder._coordinates) == 3 - - # Validate: the structure of the created variable - var_ampl = next((e for e in builder._variables if e.name == "ampl"), None) - assert var_ampl is not None - assert var_ampl.name == "ampl" - assert var_ampl.long_name is None # Default value - # Validate: that dimensions are stored as NamedDimensions - assert len(var_ampl.dimensions) == 3 - assert _get_named_dimension(var_ampl.dimensions, "inline", 100) is not None - assert _get_named_dimension(var_ampl.dimensions, "crossline", 200) is not None - assert _get_named_dimension(var_ampl.dimensions, "depth", 300) is not None - assert var_ampl.data_type == ScalarType.FLOAT32 - assert var_ampl.compressor is None # Default value - assert var_ampl.coordinates is None # Default value - # Validate: the variable has the expected properties - assert var_ampl.metadata is None # Default value + validate_builder(builder, _BuilderState.HAS_VARIABLES, n_dims=3, n_coords=3, n_var=4) + v = validate_variable(builder, "ampl", + dims=[("inline", 100), ("crossline", 200), ("depth", 300)], + coords=None, + dtype=ScalarType.FLOAT32) + assert v.long_name is None # Default value + assert v.compressor is None # Default value + assert v.coordinates is None # Default value + assert v.metadata is None # Default value def test_add_variable_full_parameters() -> None: @@ -216,12 +164,10 @@ def test_add_variable_full_parameters() -> None: builder.add_dimension("inline", 100) builder.add_dimension("crossline", 200) builder.add_dimension("depth", 300) - # Add dimension coordinates builder.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.UINT32) builder.add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.UINT32) builder.add_coordinate("depth", dimensions=["depth"], data_type=ScalarType.UINT32) - # Add coordinates before we can add a data variable builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64) builder.add_coordinate("cdp-y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64) @@ -254,32 +200,15 @@ def test_add_variable_full_parameters() -> None: ) ), ]) - # Validate: the state of the builder - assert builder._state == _BuilderState.HAS_VARIABLES - assert len(builder._dimensions) == 3 - # 3 dim coords + 2 non-dim coords = 5 - assert len(builder._coordinates) == 5 - # 3 dim coord + 2 non-dim coords, and 1 data variable - assert len(builder._variables) == 6 - - # Validate: the structure of the created variable - v = next((v for v in builder._variables if v.name == "ampl"), None) - assert v is not None - assert v.name == "ampl" + validate_builder(builder, _BuilderState.HAS_VARIABLES, n_dims=3, n_coords=5, n_var=6) + v = validate_variable(builder, "ampl", + dims=[("inline", 100), ("crossline", 200), ("depth", 300)], + coords=["inline", "crossline", "depth", "cdp-x", "cdp-y"], + dtype=ScalarType.FLOAT32) assert v.long_name == "Amplitude (dimensionless)" - assert len(v.dimensions) == 3 - assert _get_named_dimension(v.dimensions, "inline", 100) is not None - assert _get_named_dimension(v.dimensions, "crossline", 200) is not None - assert _get_named_dimension(v.dimensions, "depth", 300) is not None - assert v.data_type == ScalarType.FLOAT32 assert isinstance(v.compressor, Blosc) assert v.compressor.algorithm == "zstd" assert len(v.coordinates) == 5 - assert builder._get_coordinate(v.coordinates, "inline") is not None - assert builder._get_coordinate(v.coordinates, "crossline") is not None - assert builder._get_coordinate(v.coordinates, "depth") is not None - assert builder._get_coordinate(v.coordinates, "cdp-x") is not None - assert builder._get_coordinate(v.coordinates, "cdp-y") is not None assert v.metadata.stats_v1.count == 100 assert isinstance(v.metadata, VariableMetadata) assert v.metadata.units_v1.length == LengthUnitEnum.FOOT diff --git a/tests/unit/v1/test_dataset_builder_build.py b/tests/unit/v1/test_dataset_builder_build.py index b008e062f..f2bda0e5d 100644 --- a/tests/unit/v1/test_dataset_builder_build.py +++ b/tests/unit/v1/test_dataset_builder_build.py @@ -8,7 +8,7 @@ from mdio.schemas.chunk_grid import RegularChunkGrid from mdio.schemas.chunk_grid import RegularChunkShape from mdio.schemas.compressors import Blosc -from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import ScalarType, StructuredField from mdio.schemas.dtype import StructuredType from mdio.schemas.metadata import ChunkGridMetadata from mdio.schemas.metadata import UserAttributes @@ -23,7 +23,9 @@ from mdio.schemas.v1.units import LengthUnitModel from mdio.schemas.v1.units import SpeedUnitEnum from mdio.schemas.v1.units import SpeedUnitModel +from .helpers import make_campos_3d_dataset +from .helpers import validate_builder, validate_coordinate, validate_variable def test_build() -> None: """Test building a complete dataset.""" @@ -52,11 +54,6 @@ def test_build() -> None: assert next(v for v in dataset.variables if v.name == "x_coord") is not None assert next(v for v in dataset.variables if v.name == "y_coord") is not None assert next(v for v in dataset.variables if v.name == "data") is not None - var_data = next(v for v in dataset.variables if v.name == "data") - assert var_data is not None - assert var_data.long_name == "Test Data" - assert len(var_data.dimensions) == 2 - def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50) """Test building a Campos 3D dataset with multiple variables and attributes.""" @@ -72,82 +69,84 @@ def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50 # 3 dimension variables + 4 data variables + 2 coordinate variables assert len(dataset.variables) == 9 - # Verify dimension variables - inline_var = next(v for v in dataset.variables if v.name == "inline") - assert inline_var.data_type == ScalarType.UINT32 - # Dimension variables store dimensions as NamedDimension - assert _get_named_dimension(inline_var.dimensions, "inline", 256) + # Verify dimension coordinate variables + validate_variable( + dataset, + name="inline", + dims=[("inline", 256)], + coords=["inline"], + dtype=ScalarType.UINT32 + ) - crossline_var = next(v for v in dataset.variables if v.name == "crossline") - assert crossline_var.data_type == ScalarType.UINT32 - # Dimension variables store dimensions as NamedDimension - assert _get_named_dimension(crossline_var.dimensions, "crossline", 512) + validate_variable( + dataset, + name="crossline", + dims=[("crossline", 512)], + coords=["crossline"], + dtype=ScalarType.UINT32 + ) - depth_var = next(v for v in dataset.variables if v.name == "depth") - assert depth_var.data_type == ScalarType.FLOAT64 - # Dimension variables store dimensions as NamedDimension - assert _get_named_dimension(depth_var.dimensions, "depth", 384) - assert depth_var.metadata.units_v1.length == LengthUnitEnum.METER + depth = validate_variable( + dataset, + name="depth", + dims=[("depth", 384)], + coords=["depth"], + dtype=ScalarType.FLOAT64 + ) + assert depth.metadata.units_v1.length == LengthUnitEnum.METER # Verify coordinate variables - cdp_x = next(v for v in dataset.variables if v.name == "cdp-x") - assert cdp_x.data_type == ScalarType.FLOAT32 - assert len(cdp_x.dimensions) == 2 - assert _get_named_dimension(cdp_x.dimensions, "inline", 256) - assert _get_named_dimension(cdp_x.dimensions, "crossline", 512) + cdp_x = validate_variable( + dataset, + name="cdp-x", + dims=[("inline", 256), ("crossline", 512)], + coords=["cdp-x"], + dtype=ScalarType.FLOAT32 + ) assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER - cdp_y = next(v for v in dataset.variables if v.name == "cdp-y") - assert cdp_y.data_type == ScalarType.FLOAT32 - assert len(cdp_y.dimensions) == 2 - assert _get_named_dimension(cdp_y.dimensions, "inline", 256) - assert _get_named_dimension(cdp_y.dimensions, "crossline", 512) + cdp_y = validate_variable( + dataset, + name="cdp-y", + dims=[("inline", 256), ("crossline", 512)], + coords=["cdp-y"], + dtype=ScalarType.FLOAT32 + ) assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER - # Verify image variable - image = next(v for v in dataset.variables if v.name == "image") - assert len(image.dimensions) == 3 - assert _get_named_dimension(image.dimensions, "inline", 256) - assert _get_named_dimension(image.dimensions, "crossline", 512) - assert _get_named_dimension(image.dimensions, "depth", 384) - assert image.data_type == ScalarType.FLOAT32 - assert isinstance(image.compressor, Blosc) + # Verify data variables + image = validate_variable( + dataset, + name="image", + dims=[("inline", 256), ("crossline", 512), ("depth", 384)], + coords=["cdp-x", "cdp-y"], + dtype=ScalarType.FLOAT32 + ) + assert image.metadata.units_v1 is None # No units defined for image assert image.compressor.algorithm == "zstd" - # Other variables store dimensions as names - assert set(image.coordinates) == {"cdp-x", "cdp-y"} - assert isinstance(image.metadata.chunk_grid, RegularChunkGrid) assert image.metadata.chunk_grid.configuration.chunk_shape == [128, 128, 128] - assert isinstance(image.metadata.stats_v1, SummaryStatistics) assert image.metadata.stats_v1.count == 100 - # Verify velocity variable - velocity = next(v for v in dataset.variables if v.name == "velocity") - assert len(velocity.dimensions) == 3 - assert _get_named_dimension(velocity.dimensions, "inline", 256) - assert _get_named_dimension(velocity.dimensions, "crossline", 512) - assert _get_named_dimension(velocity.dimensions, "depth", 384) - assert velocity.data_type == ScalarType.FLOAT16 + velocity = validate_variable( + dataset, + name="velocity", + dims=[("inline", 256), ("crossline", 512), ("depth", 384)], + coords=["cdp-x", "cdp-y"], + dtype=ScalarType.FLOAT16 + ) assert velocity.compressor is None - # Other variables store dimensions as names - assert set(velocity.coordinates) == {"cdp-x", "cdp-y"} - assert isinstance(velocity.metadata.chunk_grid, RegularChunkGrid) assert velocity.metadata.chunk_grid.configuration.chunk_shape == [128, 128, 128] - assert isinstance(velocity.metadata.units_v1, SpeedUnitModel) assert velocity.metadata.units_v1.speed == SpeedUnitEnum.METER_PER_SECOND - # Verify image_inline variable - image_inline = next( - v for v in dataset.variables if v.name == "image_inline") + image_inline = validate_variable( + dataset, + name="image_inline", + dims=[("inline", 256), ("crossline", 512), ("depth", 384)], + coords=["cdp-x", "cdp-y"], + dtype=ScalarType.FLOAT32 + ) assert image_inline.long_name == "inline optimized version of 3d_stack" - assert len(image_inline.dimensions) == 3 - assert _get_named_dimension(image_inline.dimensions, "inline", 256) - assert _get_named_dimension(image_inline.dimensions, "crossline", 512) - assert _get_named_dimension(image_inline.dimensions, "depth", 384) - assert image_inline.data_type == ScalarType.FLOAT32 - assert isinstance(image_inline.compressor, Blosc) assert image_inline.compressor.algorithm == "zstd" - assert set(image_inline.coordinates) == {"cdp-x", "cdp-y"} - assert isinstance(image_inline.metadata.chunk_grid, RegularChunkGrid) assert image_inline.metadata.chunk_grid.configuration.chunk_shape == [4, 512, 512] # Verify image_headers variable @@ -156,112 +155,19 @@ def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50 assert len(headers.data_type.fields) == 4 assert headers.data_type.fields[0].name == "cdp-x" -def make_campos_3d_dataset() -> Dataset: - """Create in-memory campos_3d dataset.""" - ds = MDIODatasetBuilder( - "campos_3d", - attributes=UserAttributes(attributes={ - "textHeader": [ - "C01 .......................... ", - "C02 .......................... ", - "C03 .......................... ", - ], - "foo": "bar" - })) - - # Add dimensions - ds.add_dimension("inline", 256) - ds.add_dimension("crossline", 512) - ds.add_dimension("depth", 384) - ds.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.UINT32) - ds.add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.UINT32) - ds.add_coordinate("depth", dimensions=["depth"], data_type=ScalarType.FLOAT64, - metadata_info=[ - AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER)) - ]) - # Add coordinates - ds.add_coordinate( - "cdp-x", - dimensions=["inline", "crossline"], - data_type=ScalarType.FLOAT32, - metadata_info=[ - AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))] - ) - ds.add_coordinate( - "cdp-y", - dimensions=["inline", "crossline"], - data_type=ScalarType.FLOAT32, - metadata_info=[ - AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))] - ) - - # Add image variable - ds.add_variable( - name="image", - dimensions=["inline", "crossline", "depth"], - data_type=ScalarType.FLOAT32, - compressor=Blosc(algorithm="zstd"), - coordinates=["cdp-x", "cdp-y"], - metadata_info=[ - ChunkGridMetadata( - chunk_grid=RegularChunkGrid( - configuration=RegularChunkShape(chunk_shape=[128, 128, 128])) - ), - StatisticsMetadata( - stats_v1=SummaryStatistics( - count=100, - sum=1215.1, - sumSquares=125.12, - min=5.61, - max=10.84, - histogram=CenteredBinHistogram( - binCenters=[1, 2], counts=[10, 15]), - ) - ), - UserAttributes( - attributes={"fizz": "buzz", "UnitSystem": "Canonical"}), - ]) - # Add velocity variable - ds.add_variable( - name="velocity", - dimensions=["inline", "crossline", "depth"], - data_type=ScalarType.FLOAT16, - coordinates=["cdp-x", "cdp-y"], - metadata_info=[ - ChunkGridMetadata( - chunk_grid=RegularChunkGrid( - configuration=RegularChunkShape(chunk_shape=[128, 128, 128])) - ), - AllUnits(units_v1=SpeedUnitModel( - speed=SpeedUnitEnum.METER_PER_SECOND)), - ], - ) - # Add inline-optimized image variable - ds.add_variable( - name="image_inline", - long_name="inline optimized version of 3d_stack", - dimensions=["inline", "crossline", "depth"], - data_type=ScalarType.FLOAT32, - compressor=Blosc(algorithm="zstd"), - coordinates=["cdp-x", "cdp-y"], - metadata_info=[ - ChunkGridMetadata( - chunk_grid=RegularChunkGrid( - configuration=RegularChunkShape(chunk_shape=[4, 512, 512])) - )] - ) - # Add headers variable with structured dtype - ds.add_variable( + headers = validate_variable( + dataset, name="image_headers", - dimensions=["inline", "crossline"], - data_type=StructuredType( + dims=[("inline", 256), ("crossline", 512)], + coords=["cdp-x", "cdp-y"], + dtype=StructuredType( fields=[ - {"name": "cdp-x", "format": ScalarType.INT32}, - {"name": "cdp-y", "format": ScalarType.INT32}, - {"name": "elevation", "format": ScalarType.FLOAT16}, - {"name": "some_scalar", "format": ScalarType.FLOAT16}, + StructuredField(name="cdp-x", format=ScalarType.FLOAT32), + StructuredField(name="cdp-y", format=ScalarType.FLOAT32), + StructuredField(name="inline", format=ScalarType.UINT32), + StructuredField(name="crossline", format=ScalarType.UINT32), ] - ), - coordinates=["cdp-x", "cdp-y"], + ) ) - return ds.build() + + From 0778fdd251bba96595149f19ed675dcf92fa0c55 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Wed, 9 Jul 2025 19:17:18 +0000 Subject: [PATCH 35/56] Remove the Dockerfile changes. They are not supposed to be a part of this PR --- .devcontainer/Dockerfile.cli | 47 ------------------------- .devcontainer/Dockerfile.dev | 61 --------------------------------- .devcontainer/Dockerfile.nox | 49 -------------------------- .devcontainer/devcontainer.json | 20 +++++------ 4 files changed, 9 insertions(+), 168 deletions(-) delete mode 100644 .devcontainer/Dockerfile.cli delete mode 100644 .devcontainer/Dockerfile.dev delete mode 100644 .devcontainer/Dockerfile.nox diff --git a/.devcontainer/Dockerfile.cli b/.devcontainer/Dockerfile.cli deleted file mode 100644 index 92720e34e..000000000 --- a/.devcontainer/Dockerfile.cli +++ /dev/null @@ -1,47 +0,0 @@ -# HOW TO BUILD AND RUN THIS DOCKERFILE -# * Clone mdio-python and build a Docker image: -# git clone https://github.com/TGSAI/mdio-python.git -# cd mdio-python -# docker build -t mdio-cli -f .devcontainer/Dockerfile.cli . -# * Run /bin/bash in the Docker container: -# -# -# USAGE: -# docker run -it --rm --name mdio-cli mdio-cli --version -# docker run -it --rm --name mdio-cli mdio-cli --help -# -# LOCAL_DATA_DIR=$(pwd); \ -# docker run -it --rm -v $LOCAL_DATA_DIR:/DATA --name mdio-cli mdio-cli \ -# segy import \ -# /DATA/segy_file.segy \ -# /DATA/mdio_file.mdio \ -# -loc 181,185 \ -# -names inline,crossline -# -# LOCAL_DATA_DIR=$(pwd); \ -# docker run -it --rm -v $LOCAL_DATA_DIR:/DATA --name mdio-cli mdio-cli \ -# segy export \ -# /DATA/mdio_file.mdio \ -# /DATA/segy_file_copy.segy -# -FROM python:3.13-bookworm -# Create the user (https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user) -ENV USERNAME=python -ENV USER_UID=1000 -ENV USER_GID=$USER_UID -RUN groupadd --gid $USER_GID $USERNAME && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME - -# Set the default non-root user -USER $USERNAME - -# Add path to the user-installed packages -ENV PYTHONUSERBASE=/home/$USERNAME/.local -ENV PATH="$PYTHONUSERBASE/bin:$PATH" - -COPY --chown=$USERNAME:$USERNAME ./ /home/$USERNAME/mdio-python - -WORKDIR /home/$USERNAME/mdio-python -RUN pip install . - -ENTRYPOINT ["mdio"] -CMD ["--version"] diff --git a/.devcontainer/Dockerfile.dev b/.devcontainer/Dockerfile.dev deleted file mode 100644 index 05f135799..000000000 --- a/.devcontainer/Dockerfile.dev +++ /dev/null @@ -1,61 +0,0 @@ -# USAGE: -# This file will be used by the VS Code DevContainer extension -# to create a development environment for the mdio-python project. -# HOW TO RUN TESTS -# 1. Open the project in VS Code. -# 2. Open the Command Palette (Ctrl+Shift+P) and select "Dev Containers: Reopen in Container". -# 3. Once the container is running, open a terminal in VS Code. -# 4. Run the tests using the command: `nox -s test`. -# HOW TO MANUALLY BUILD AND RUN THE CONTAINER -# docker build -t mdio-dev -f .devcontainer/Dockerfile.dev . -# docker run -it --rm --entrypoint /bin/bash --name mdio-dev mdio-dev -# NOTES: -# 1. The container will be run as the non-root user 'vscode' with UID 1000. -# 2. The virtual environment will be setup at /home/vscode/venv -# 3. The project source code will be mounted at /workspaces/mdio-python -ARG PYTHON_VERSION="3.13" -ARG LINUX_DISTRO="bookworm" -ARG UV_VERSION="0.6.11" -ARG NOX_VERSION="2025.2.9" -FROM mcr.microsoft.com/devcontainers/python:1-${PYTHON_VERSION}-${LINUX_DISTRO} - -# Install git for nox pre-commit -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - git \ - && rm -rf /var/lib/apt/lists/* - -ENV USERNAME="vscode" -USER $USERNAME - -# # Add path to the user-installed packages -# ENV PYTHONUSERBASE=/home/$USERNAME/.local -# ENV PATH="$PYTHONUSERBASE/bin:$PATH" - -COPY --chown=$USERNAME:$USERNAME ./ /workspaces/mdio-python - -WORKDIR /workspaces/mdio-python - -ARG UV_VERSION -ARG NOX_VERSION -RUN python3 -m pip install uv==${UV_VERSION} nox==${NOX_VERSION} msgpack ipykernel - -# Initialize virtual environement in the container -ENV VIRTUAL_ENV="/home/$USERNAME/venv" -RUN python3 -m venv $VIRTUAL_ENV -ENV PATH="$VIRTUAL_ENV/bin:$PATH" - -# installing pytest is required for VS Code Python Testing -RUN pip install pytest pytest-cov pytest-mock pytest-asyncio - -# Install the project in editable mode -# This allows for live reloading of the code during development -RUN pip install -e . - -# RUN uv pip install snakeviz - - - - - - diff --git a/.devcontainer/Dockerfile.nox b/.devcontainer/Dockerfile.nox deleted file mode 100644 index 103673fd2..000000000 --- a/.devcontainer/Dockerfile.nox +++ /dev/null @@ -1,49 +0,0 @@ -# HOW TO BUILD AND RUN THIS DOCKERFILE -# 1. Make sure you have Docker installed and running. -# 2. Clone mdio-python and build the Docker image: -# git clone https://github.com/TGSAI/mdio-python.git -# cd mdio-python -# docker build -t mdio-nox -f .devcontainer/Dockerfile.nox . -# 3. Run /bin/bash in the Docker container : -# LOCAL_DATA_DIR=$(pwd); \ -# docker run -it --rm -v $LOCAL_DATA_DIR:/DATA --entrypoint /bin/bash --name mdio-nox mdio-nox -# -# USAGE: -# docker run -it --rm mdio-nox --list -# docker run -it --rm mdio-nox -s tests-3.13 -# docker run -it --rm mdio-nox --no-stop-on-first-error -# -# NOTE: nox will fail if run in the directory mounted from the host machine -ARG PYTHON_VERSION="3.13" -ARG LINUX_DISTRO="bookworm" -ARG UV_VERSION="0.6.11" -ARG NOX_VERSION="2025.2.9" -FROM python:${PYTHON_VERSION}-${LINUX_DISTRO} -ARG PYTHON_VERSION -ARG LINUX_DISTRO -RUN echo "Using python:${PYTHON_VERSION}-${LINUX_DISTRO}" -# Create the user (https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user) -ENV USERNAME=python -ENV USER_UID=1000 -ENV USER_GID=$USER_UID -RUN groupadd --gid $USER_GID $USERNAME && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME -# Set the default non-root user -USER $USERNAME - -# Add path to the user-installed packages -ENV PYTHONUSERBASE=/home/$USERNAME/.local -ENV PATH="$PYTHONUSERBASE/bin:$PATH" - -COPY --chown=$USERNAME:$USERNAME ./ /home/$USERNAME/mdio-python - -WORKDIR /home/$USERNAME/mdio-python -RUN pip install . - -# Install UV dependency manager and Nox test automator -ARG UV_VERSION -ARG NOX_VERSION -RUN echo "Using uv: $UV_VERSION and nox: $NOX_VERSION" -RUN python3 -m pip install uv==${UV_VERSION} nox==${NOX_VERSION} msgpack ipykernel - -ENTRYPOINT ["nox"] -CMD ["--list"] \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index dc80446c6..b618a5260 100755 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,12 +2,12 @@ // README at: https://github.com/devcontainers/templates/tree/main/src/python { "build": { - "dockerfile": "Dockerfile.dev", + "dockerfile": "Dockerfile", "context": ".." }, // Use 'postCreateCommand' to run commands after the container is created. "postCreateCommand": { - // "post_create_script": "bash ./.devcontainer/post-install.sh" + "post_create_script": "bash ./.devcontainer/post-install.sh" }, // Forward 8787 to enable us to view dask dashboard "forwardPorts": [8787], @@ -16,9 +16,8 @@ // Configure properties specific to VS Code. "vscode": { "settings": { - "python.testing.pytestArgs": ["tests"], - "python.testing.unittestEnabled": false, - "python.testing.pytestEnabled": true + "python.terminal.activateEnvInCurrentTerminal": true, + "python.defaultInterpreterPath": "/opt/venv/bin/python" }, "extensions": [ "ms-python.python", @@ -28,18 +27,17 @@ "ms-toolsai.jupyter-renderers", "vscode-icons-team.vscode-icons", "wayou.vscode-todo-highlight", - "streetsidesoftware.code-spell-checker", - "eamodio.gitlens", - "visualstudioexptteam.vscodeintellicode" + "streetsidesoftware.code-spell-checker" ] } }, // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. // "remoteUser": "root", "updateRemoteUserUID": true, - "workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/mdio-python,type=bind", - "workspaceFolder": "/workspaces/mdio-python", "mounts": [ - // "source=${localWorkspaceFolder}/../DATA/,target=/DATA/,type=bind,consistency=cached" + // Re-use local Git configuration + "source=${localEnv:HOME}/.gitconfig,target=/home/vscode/.gitconfig_tmp,type=bind,consistency=cached", + "source=${localEnv:HOME}/.gitconfig,target=/root/.gitconfig_tmp,type=bind,consistency=cached", + "source=${localEnv:SCRATCH_DIR}/${localEnv:USER},target=/scratch/,type=bind,consistency=cached" ] } From 7e74567ec615d0982b2239b0e916dbfdf2a5db48 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Wed, 9 Jul 2025 19:38:26 +0000 Subject: [PATCH 36/56] PR Review: run ruff --- src/mdio/schemas/v1/dataset_builder.py | 10 +++--- tests/unit/v1/helpers.py | 34 +++++++++++-------- .../v1/test_dataset_builder_add_coordinate.py | 25 +++++++++----- .../v1/test_dataset_builder_add_dimension.py | 12 +------ .../v1/test_dataset_builder_add_variable.py | 19 +++++++---- tests/unit/v1/test_dataset_builder_build.py | 18 +++------- 6 files changed, 58 insertions(+), 60 deletions(-) diff --git a/src/mdio/schemas/v1/dataset_builder.py b/src/mdio/schemas/v1/dataset_builder.py index 3bfd914ea..5b102ddd2 100644 --- a/src/mdio/schemas/v1/dataset_builder.py +++ b/src/mdio/schemas/v1/dataset_builder.py @@ -4,9 +4,9 @@ from datetime import datetime from enum import Enum from enum import auto +from importlib import metadata from typing import Any from typing import TypeAlias -from importlib import metadata from pydantic import BaseModel from zarr.core.chunk_key_encodings import V2ChunkKeyEncoding # noqa: F401 @@ -18,7 +18,7 @@ from mdio.schemas.dtype import StructuredType from mdio.schemas.metadata import ChunkGridMetadata from mdio.schemas.metadata import UserAttributes -from mdio.schemas.v1.dataset import Dataset, DatasetMetadata +from mdio.schemas.v1.dataset import Dataset from mdio.schemas.v1.dataset import DatasetInfo from mdio.schemas.v1.stats import StatisticsMetadata from mdio.schemas.v1.units import AllUnits @@ -167,6 +167,7 @@ def add_coordinate( # noqa: PLR0913 long_name: Optional long name for the coordinate dimensions: List of dimension names that the coordinate is associated with data_type: Data type for the coordinate (defaults to FLOAT32) + compressor: Compressor used for the variable (defaults to None) metadata_info: Optional metadata information for the coordinate Returns: @@ -290,9 +291,8 @@ def add_variable( # noqa: PLR0913 msg = f"Pre-existing coordinate named {coord!r} is not found" raise ValueError(msg) - if coordinates is not None: - # If this is a dimension coordinate variable, embed the Coordinate into it - if len(coordinates) == 1 and coordinates[0] == name: + # If this is a dimension coordinate variable, embed the Coordinate into it + if coordinates is not None and len(coordinates) == 1 and coordinates[0] == name: coordinates = coordinate_objs meta_dict = _to_dictionary(metadata_info) diff --git a/tests/unit/v1/helpers.py b/tests/unit/v1/helpers.py index 814357b42..699425c19 100644 --- a/tests/unit/v1/helpers.py +++ b/tests/unit/v1/helpers.py @@ -1,13 +1,15 @@ - +"""Helper methods used in unit tests.""" from mdio.schemas.chunk_grid import RegularChunkGrid from mdio.schemas.chunk_grid import RegularChunkShape from mdio.schemas.compressors import Blosc -from mdio.schemas.dtype import ScalarType, StructuredField +from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredField from mdio.schemas.dtype import StructuredType from mdio.schemas.metadata import ChunkGridMetadata from mdio.schemas.metadata import UserAttributes from mdio.schemas.v1.dataset import Dataset -from mdio.schemas.v1.dataset_builder import _BuilderState, MDIODatasetBuilder +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder +from mdio.schemas.v1.dataset_builder import _BuilderState from mdio.schemas.v1.dataset_builder import _get_named_dimension from mdio.schemas.v1.stats import CenteredBinHistogram from mdio.schemas.v1.stats import StatisticsMetadata @@ -17,7 +19,8 @@ from mdio.schemas.v1.units import LengthUnitModel from mdio.schemas.v1.units import SpeedUnitEnum from mdio.schemas.v1.units import SpeedUnitModel -from mdio.schemas.v1.variable import Coordinate, Variable +from mdio.schemas.v1.variable import Coordinate +from mdio.schemas.v1.variable import Variable def validate_builder(builder: MDIODatasetBuilder, @@ -25,7 +28,7 @@ def validate_builder(builder: MDIODatasetBuilder, n_dims: int, n_coords: int, n_var: int) -> None: - """Validate the state of the builder and the number of dimensions, coordinates, and variables.""" + """Validate the state of the builder, the number of dimensions, coordinates, and variables.""" assert builder._state == state assert len(builder._dimensions) == n_dims assert len(builder._coordinates) == n_coords @@ -58,7 +61,6 @@ def validate_variable(container: MDIODatasetBuilder | Dataset, coords: list[str], dtype: ScalarType) -> Variable: """Validate existence and the structure of the created variable.""" - if isinstance(container, MDIODatasetBuilder): var_list = container._variables global_coord_list = container._coordinates @@ -66,7 +68,8 @@ def validate_variable(container: MDIODatasetBuilder | Dataset, var_list = container.variables global_coord_list = _get_all_coordinates(container) else: - raise TypeError("container must be MDIODatasetBuilder or Dataset") + err_msg = f"Expected MDIODatasetBuilder or Dataset, got {type(container)}" + raise TypeError(err_msg) # Validate that the variable exists v = next((e for e in var_list if e.name == name), None) @@ -93,23 +96,26 @@ def validate_variable(container: MDIODatasetBuilder | Dataset, def _get_coordinate( - global_coord_list: list[Coordinate], - coordinates_or_references: list[Coordinate] | list[str], - name: str, size: int | None = None -) -> Coordinate | None: + global_coord_list: list[Coordinate], + coordinates_or_references: list[Coordinate] | list[str], + name: str) -> Coordinate | None: """Get a coordinate by name from the list[Coordinate] | list[str]. - Validates that the coordinate referenced by the name can be found in the global coordinate list + + The function validates that the coordinate referenced by the name can be found + in the global coordinate list. + If the coordinate is stored as a Coordinate object, it is returned directly. """ if coordinates_or_references is None: return None for c in coordinates_or_references: if isinstance(c, str) and c == name: - # The coordinate is stored by name (str). + # The coordinate is stored by name (str). cc = None # Find the Coordinate in the global list and return it. if global_coord_list is not None: - cc = next((cc for cc in global_coord_list if cc.name == name), None) + cc = next( + (cc for cc in global_coord_list if cc.name == name), None) if cc is None: msg = f"Pre-existing coordinate named {name!r} is not found" raise ValueError(msg) diff --git a/tests/unit/v1/test_dataset_builder_add_coordinate.py b/tests/unit/v1/test_dataset_builder_add_coordinate.py index 232c525d8..334c27b89 100644 --- a/tests/unit/v1/test_dataset_builder_add_coordinate.py +++ b/tests/unit/v1/test_dataset_builder_add_coordinate.py @@ -6,17 +6,20 @@ import pytest -from mdio.schemas import builder from mdio.schemas.compressors import Blosc from mdio.schemas.dtype import ScalarType from mdio.schemas.metadata import UserAttributes -from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder, _get_named_dimension +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder from mdio.schemas.v1.dataset_builder import _BuilderState from mdio.schemas.v1.units import AllUnits from mdio.schemas.v1.units import LengthUnitEnum from mdio.schemas.v1.units import LengthUnitModel from mdio.schemas.v1.variable import VariableMetadata -from .helpers import validate_builder, validate_coordinate, validate_variable + +from .helpers import validate_builder +from .helpers import validate_coordinate +from .helpers import validate_variable + def test_add_coordinate() -> None: """Test adding coordinates. Check the state transition and validate required parameters.""" @@ -25,7 +28,8 @@ def test_add_coordinate() -> None: msg = "Must add at least one dimension before adding coordinates" with pytest.raises(ValueError, match=msg): - builder.add_coordinate("cdp", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) + builder.add_coordinate( + "cdp", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) builder.add_dimension("inline", 100) builder.add_dimension("crossline", 200) @@ -42,12 +46,14 @@ def test_add_coordinate() -> None: builder.add_coordinate("cdp-x", dimensions=[], data_type=ScalarType.FLOAT32) # Add a variable using non-existent dimensions - msg="Pre-existing dimension named 'xline' is not found" + msg = "Pre-existing dimension named 'xline' is not found" with pytest.raises(ValueError, match=msg): - builder.add_coordinate("bad_cdp-x", dimensions=["inline", "xline"], data_type=ScalarType.FLOAT32) + builder.add_coordinate( + "bad_cdp-x", dimensions=["inline", "xline"], data_type=ScalarType.FLOAT32) # Validate state transition - builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) + builder.add_coordinate( + "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) validate_builder(builder, _BuilderState.HAS_COORDINATES, n_dims=2, n_coords=1, n_var=1) validate_variable( builder, @@ -58,9 +64,10 @@ def test_add_coordinate() -> None: ) # Adding coordinate with the same name twice - msg="Adding coordinate with the same name twice is not allowed" + msg = "Adding coordinate with the same name twice is not allowed" with pytest.raises(ValueError, match=msg): - builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) + builder.add_coordinate( + "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) def test_add_coordinate_with_defaults() -> None: """Test adding coordinates with default arguments.""" diff --git a/tests/unit/v1/test_dataset_builder_add_dimension.py b/tests/unit/v1/test_dataset_builder_add_dimension.py index 5fd70a016..e11a788de 100644 --- a/tests/unit/v1/test_dataset_builder_add_dimension.py +++ b/tests/unit/v1/test_dataset_builder_add_dimension.py @@ -6,20 +6,10 @@ import pytest -from mdio.schemas.chunk_grid import RegularChunkGrid -from mdio.schemas.chunk_grid import RegularChunkShape -from mdio.schemas.dtype import ScalarType -from mdio.schemas.metadata import ChunkGridMetadata -from mdio.schemas.metadata import UserAttributes from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder from mdio.schemas.v1.dataset_builder import _BuilderState from mdio.schemas.v1.dataset_builder import _get_named_dimension -from mdio.schemas.v1.stats import CenteredBinHistogram -from mdio.schemas.v1.stats import StatisticsMetadata -from mdio.schemas.v1.stats import SummaryStatistics -from mdio.schemas.v1.units import AllUnits -from mdio.schemas.v1.units import LengthUnitEnum -from mdio.schemas.v1.units import LengthUnitModel + from .helpers import validate_builder diff --git a/tests/unit/v1/test_dataset_builder_add_variable.py b/tests/unit/v1/test_dataset_builder_add_variable.py index 3bd5ef370..8227be473 100644 --- a/tests/unit/v1/test_dataset_builder_add_variable.py +++ b/tests/unit/v1/test_dataset_builder_add_variable.py @@ -6,14 +6,13 @@ import pytest -from mdio.schemas import builder from mdio.schemas.chunk_grid import RegularChunkGrid from mdio.schemas.chunk_grid import RegularChunkShape from mdio.schemas.compressors import Blosc from mdio.schemas.dtype import ScalarType from mdio.schemas.metadata import ChunkGridMetadata from mdio.schemas.metadata import UserAttributes -from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder, _get_named_dimension +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder from mdio.schemas.v1.dataset_builder import _BuilderState from mdio.schemas.v1.stats import CenteredBinHistogram from mdio.schemas.v1.stats import StatisticsMetadata @@ -21,10 +20,12 @@ from mdio.schemas.v1.units import AllUnits from mdio.schemas.v1.units import LengthUnitEnum from mdio.schemas.v1.units import LengthUnitModel -from mdio.schemas.v1.variable import VariableMetadata, Variable +from mdio.schemas.v1.variable import VariableMetadata + from .helpers import validate_builder from .helpers import validate_variable + def test_add_variable_no_coords() -> None: """Test adding variable. Check the state transition and validate required parameters..""" builder = MDIODatasetBuilder("test_dataset") @@ -112,8 +113,10 @@ def test_add_variable_with_coords() -> None: dtype=ScalarType.FLOAT32) # Add non-dim coordinates (e.g., 2D coordinates) - builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) - builder.add_coordinate("cdp-y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) + builder.add_coordinate( + "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) + builder.add_coordinate( + "cdp-y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) # Add a variable with pre-defined dimension and non-dimension coordinates builder.add_variable("ampl2", @@ -169,8 +172,10 @@ def test_add_variable_full_parameters() -> None: builder.add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.UINT32) builder.add_coordinate("depth", dimensions=["depth"], data_type=ScalarType.UINT32) # Add coordinates before we can add a data variable - builder.add_coordinate("cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64) - builder.add_coordinate("cdp-y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64) + builder.add_coordinate( + "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64) + builder.add_coordinate( + "cdp-y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64) # Add data variable with full parameters builder.add_variable("ampl", diff --git a/tests/unit/v1/test_dataset_builder_build.py b/tests/unit/v1/test_dataset_builder_build.py index f2bda0e5d..d42f29a7a 100644 --- a/tests/unit/v1/test_dataset_builder_build.py +++ b/tests/unit/v1/test_dataset_builder_build.py @@ -5,27 +5,17 @@ """Tests the schema v1 dataset_builder.add_coordinate() public API.""" -from mdio.schemas.chunk_grid import RegularChunkGrid -from mdio.schemas.chunk_grid import RegularChunkShape -from mdio.schemas.compressors import Blosc -from mdio.schemas.dtype import ScalarType, StructuredField +from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredField from mdio.schemas.dtype import StructuredType -from mdio.schemas.metadata import ChunkGridMetadata -from mdio.schemas.metadata import UserAttributes from mdio.schemas.v1.dataset import Dataset from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder -from mdio.schemas.v1.dataset_builder import _get_named_dimension -from mdio.schemas.v1.stats import CenteredBinHistogram -from mdio.schemas.v1.stats import StatisticsMetadata -from mdio.schemas.v1.stats import SummaryStatistics -from mdio.schemas.v1.units import AllUnits from mdio.schemas.v1.units import LengthUnitEnum -from mdio.schemas.v1.units import LengthUnitModel from mdio.schemas.v1.units import SpeedUnitEnum -from mdio.schemas.v1.units import SpeedUnitModel + from .helpers import make_campos_3d_dataset +from .helpers import validate_variable -from .helpers import validate_builder, validate_coordinate, validate_variable def test_build() -> None: """Test building a complete dataset.""" From 0aaa5f6110eb7afd59a5cb901a747da5fc60cbde Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Thu, 10 Jul 2025 15:10:07 +0000 Subject: [PATCH 37/56] PR Review: fix pre-commit errors --- src/mdio/schemas/v1/dataset_builder.py | 60 +++--- tests/unit/v1/helpers.py | 109 +++++----- .../v1/test_dataset_builder_add_coordinate.py | 44 ++-- .../v1/test_dataset_builder_add_dimension.py | 3 +- .../v1/test_dataset_builder_add_variable.py | 200 ++++++++++-------- tests/unit/v1/test_dataset_builder_build.py | 52 ++--- tests/unit/v1/test_dataset_builder_helpers.py | 68 +++--- 7 files changed, 283 insertions(+), 253 deletions(-) diff --git a/src/mdio/schemas/v1/dataset_builder.py b/src/mdio/schemas/v1/dataset_builder.py index 5b102ddd2..85bae21fe 100644 --- a/src/mdio/schemas/v1/dataset_builder.py +++ b/src/mdio/schemas/v1/dataset_builder.py @@ -25,16 +25,13 @@ from mdio.schemas.v1.variable import Coordinate from mdio.schemas.v1.variable import Variable -AnyMetadataList: TypeAlias = list[AllUnits | - UserAttributes | - ChunkGridMetadata | - StatisticsMetadata | - DatasetInfo] +AnyMetadataList: TypeAlias = list[ + AllUnits | UserAttributes | ChunkGridMetadata | StatisticsMetadata | DatasetInfo +] CoordinateMetadataList: TypeAlias = list[AllUnits | UserAttributes] -VariableMetadataList: TypeAlias = list[AllUnits | - UserAttributes | - ChunkGridMetadata | - StatisticsMetadata] +VariableMetadataList: TypeAlias = list[ + AllUnits | UserAttributes | ChunkGridMetadata | StatisticsMetadata +] DatasetMetadataList: TypeAlias = list[DatasetInfo | UserAttributes] @@ -97,17 +94,12 @@ class MDIODatasetBuilder: """ def __init__(self, name: str, attributes: UserAttributes | None = None): - try: api_version = metadata.version("multidimio") except metadata.PackageNotFoundError: api_version = "unknown" - self._info = DatasetInfo( - name=name, - api_version=api_version, - created_on=datetime.now(UTC) - ) + self._info = DatasetInfo(name=name, api_version=api_version, created_on=datetime.now(UTC)) self._attributes = attributes self._dimensions: list[NamedDimension] = [] self._coordinates: list[Coordinate] = [] @@ -116,9 +108,7 @@ def __init__(self, name: str, attributes: UserAttributes | None = None): self._unnamed_variable_counter = 0 def add_dimension( # noqa: PLR0913 - self, - name: str, - size: int + self, name: str, size: int ) -> "MDIODatasetBuilder": """Add a dimension. @@ -128,6 +118,10 @@ def add_dimension( # noqa: PLR0913 name: Name of the dimension size: Size of the dimension + Raises: + ValueError: If 'name' is not a non-empty string. + if the dimension is already defined. + Returns: self: Returns self for method chaining """ @@ -146,7 +140,6 @@ def add_dimension( # noqa: PLR0913 self._state = _BuilderState.HAS_DIMENSIONS return self - def add_coordinate( # noqa: PLR0913 self, name: str, @@ -170,6 +163,13 @@ def add_coordinate( # noqa: PLR0913 compressor: Compressor used for the variable (defaults to None) metadata_info: Optional metadata information for the coordinate + Raises: + ValueError: If no dimensions have been added yet. + If 'name' is not a non-empty string. + If 'dimensions' is not a non-empty list. + If the coordinate is already defined. + If any referenced dimension is not already defined. + Returns: self: Returns self for method chaining """ @@ -195,7 +195,7 @@ def add_coordinate( # noqa: PLR0913 if nd is None: msg = f"Pre-existing dimension named {dim_name!r} is not found" raise ValueError(msg) - named_dimensions.append(nd) + named_dimensions.append(nd) meta_dict = _to_dictionary(metadata_info) coord = Coordinate( @@ -204,7 +204,7 @@ def add_coordinate( # noqa: PLR0913 dimensions=named_dimensions, compressor=compressor, dataType=data_type, - metadata=meta_dict + metadata=meta_dict, ) self._coordinates.append(coord) @@ -216,7 +216,7 @@ def add_coordinate( # noqa: PLR0913 data_type=coord.data_type, compressor=compressor, coordinates=[name], # Use the coordinate name as a reference - metadata_info=coord.metadata + metadata_info=coord.metadata, ) self._state = _BuilderState.HAS_COORDINATES @@ -252,6 +252,14 @@ def add_variable( # noqa: PLR0913 (defaults to None, meaning no coordinates) metadata_info: Optional metadata information for the variable + Raises: + ValueError: If no dimensions have been added yet. + If 'name' is not a non-empty string. + If 'dimensions' is not a non-empty list. + If the variable is already defined. + If any referenced dimension is not already defined. + If any referenced coordinate is not already defined. + Returns: self: Returns self for method chaining. """ @@ -293,7 +301,7 @@ def add_variable( # noqa: PLR0913 # If this is a dimension coordinate variable, embed the Coordinate into it if coordinates is not None and len(coordinates) == 1 and coordinates[0] == name: - coordinates = coordinate_objs + coordinates = coordinate_objs meta_dict = _to_dictionary(metadata_info) var = Variable( @@ -303,7 +311,8 @@ def add_variable( # noqa: PLR0913 data_type=data_type, compressor=compressor, coordinates=coordinates, - metadata=meta_dict) + metadata=meta_dict, + ) self._variables.append(var) self._state = _BuilderState.HAS_VARIABLES @@ -315,6 +324,9 @@ def build(self) -> Dataset: This function must be called after at least one dimension is added via add_dimension(). It will create a Dataset object with all added dimensions, coordinates, and variables. + Raises: + ValueError: If no dimensions have been added yet. + Returns: Dataset: The built dataset with all added dimensions, coordinates, and variables. """ diff --git a/tests/unit/v1/helpers.py b/tests/unit/v1/helpers.py index 699425c19..2058bdd54 100644 --- a/tests/unit/v1/helpers.py +++ b/tests/unit/v1/helpers.py @@ -1,4 +1,5 @@ """Helper methods used in unit tests.""" + from mdio.schemas.chunk_grid import RegularChunkGrid from mdio.schemas.chunk_grid import RegularChunkShape from mdio.schemas.compressors import Blosc @@ -23,11 +24,9 @@ from mdio.schemas.v1.variable import Variable -def validate_builder(builder: MDIODatasetBuilder, - state: _BuilderState, - n_dims: int, - n_coords: int, - n_var: int) -> None: +def validate_builder( + builder: MDIODatasetBuilder, state: _BuilderState, n_dims: int, n_coords: int, n_var: int +) -> None: """Validate the state of the builder, the number of dimensions, coordinates, and variables.""" assert builder._state == state assert len(builder._dimensions) == n_dims @@ -35,10 +34,9 @@ def validate_builder(builder: MDIODatasetBuilder, assert len(builder._variables) == n_var -def validate_coordinate(builder: MDIODatasetBuilder, - name: str, - dims: list[tuple[str, int]], - dtype: ScalarType) -> Coordinate: +def validate_coordinate( + builder: MDIODatasetBuilder, name: str, dims: list[tuple[str, int]], dtype: ScalarType +) -> Coordinate: """Validate existence and the structure of the created coordinate.""" # Validate that coordinate exists c = next((c for c in builder._coordinates if c.name == name), None) @@ -55,11 +53,13 @@ def validate_coordinate(builder: MDIODatasetBuilder, return c -def validate_variable(container: MDIODatasetBuilder | Dataset, - name: str, - dims: list[tuple[str, int]], - coords: list[str], - dtype: ScalarType) -> Variable: +def validate_variable( + container: MDIODatasetBuilder | Dataset, + name: str, + dims: list[tuple[str, int]], + coords: list[str], + dtype: ScalarType, +) -> Variable: """Validate existence and the structure of the created variable.""" if isinstance(container, MDIODatasetBuilder): var_list = container._variables @@ -90,19 +90,20 @@ def validate_variable(container: MDIODatasetBuilder | Dataset, assert len(v.coordinates) == len(coords) for coord_name in coords: assert _get_coordinate(global_coord_list, v.coordinates, coord_name) is not None - + assert v.data_type == dtype return v def _get_coordinate( - global_coord_list: list[Coordinate], - coordinates_or_references: list[Coordinate] | list[str], - name: str) -> Coordinate | None: + global_coord_list: list[Coordinate], + coordinates_or_references: list[Coordinate] | list[str], + name: str, +) -> Coordinate | None: """Get a coordinate by name from the list[Coordinate] | list[str]. - The function validates that the coordinate referenced by the name can be found - in the global coordinate list. + The function validates that the coordinate referenced by the name can be found + in the global coordinate list. If the coordinate is stored as a Coordinate object, it is returned directly. """ if coordinates_or_references is None: @@ -114,8 +115,7 @@ def _get_coordinate( cc = None # Find the Coordinate in the global list and return it. if global_coord_list is not None: - cc = next( - (cc for cc in global_coord_list if cc.name == name), None) + cc = next((cc for cc in global_coord_list if cc.name == name), None) if cc is None: msg = f"Pre-existing coordinate named {name!r} is not found" raise ValueError(msg) @@ -142,39 +142,42 @@ def make_campos_3d_dataset() -> Dataset: """Create in-memory campos_3d dataset.""" ds = MDIODatasetBuilder( "campos_3d", - attributes=UserAttributes(attributes={ - "textHeader": [ - "C01 .......................... ", - "C02 .......................... ", - "C03 .......................... ", - ], - "foo": "bar" - })) + attributes=UserAttributes( + attributes={ + "textHeader": [ + "C01 .......................... ", + "C02 .......................... ", + "C03 .......................... ", + ], + "foo": "bar", + } + ), + ) # Add dimensions ds.add_dimension("inline", 256) ds.add_dimension("crossline", 512) ds.add_dimension("depth", 384) - ds.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.UINT32) - ds.add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.UINT32) - ds.add_coordinate("depth", dimensions=["depth"], data_type=ScalarType.FLOAT64, - metadata_info=[ - AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER)) - ]) + ds.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.UINT32) + ds.add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.UINT32) + ds.add_coordinate( + "depth", + dimensions=["depth"], + data_type=ScalarType.FLOAT64, + metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))], + ) # Add coordinates ds.add_coordinate( "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32, - metadata_info=[ - AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))] + metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))], ) ds.add_coordinate( "cdp-y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32, - metadata_info=[ - AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))] + metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))], ) # Add image variable @@ -187,7 +190,8 @@ def make_campos_3d_dataset() -> Dataset: metadata_info=[ ChunkGridMetadata( chunk_grid=RegularChunkGrid( - configuration=RegularChunkShape(chunk_shape=[128, 128, 128])) + configuration=RegularChunkShape(chunk_shape=[128, 128, 128]) + ) ), StatisticsMetadata( stats_v1=SummaryStatistics( @@ -196,13 +200,12 @@ def make_campos_3d_dataset() -> Dataset: sumSquares=125.12, min=5.61, max=10.84, - histogram=CenteredBinHistogram( - binCenters=[1, 2], counts=[10, 15]), + histogram=CenteredBinHistogram(binCenters=[1, 2], counts=[10, 15]), ) ), - UserAttributes( - attributes={"fizz": "buzz", "UnitSystem": "Canonical"}), - ]) + UserAttributes(attributes={"fizz": "buzz", "UnitSystem": "Canonical"}), + ], + ) # Add velocity variable ds.add_variable( name="velocity", @@ -212,10 +215,10 @@ def make_campos_3d_dataset() -> Dataset: metadata_info=[ ChunkGridMetadata( chunk_grid=RegularChunkGrid( - configuration=RegularChunkShape(chunk_shape=[128, 128, 128])) + configuration=RegularChunkShape(chunk_shape=[128, 128, 128]) + ) ), - AllUnits(units_v1=SpeedUnitModel( - speed=SpeedUnitEnum.METER_PER_SECOND)), + AllUnits(units_v1=SpeedUnitModel(speed=SpeedUnitEnum.METER_PER_SECOND)), ], ) # Add inline-optimized image variable @@ -229,8 +232,10 @@ def make_campos_3d_dataset() -> Dataset: metadata_info=[ ChunkGridMetadata( chunk_grid=RegularChunkGrid( - configuration=RegularChunkShape(chunk_shape=[4, 512, 512])) - )] + configuration=RegularChunkShape(chunk_shape=[4, 512, 512]) + ) + ) + ], ) # Add headers variable with structured dtype ds.add_variable( @@ -240,7 +245,7 @@ def make_campos_3d_dataset() -> Dataset: fields=[ StructuredField(name="cdp-x", format=ScalarType.FLOAT32), StructuredField(name="cdp-y", format=ScalarType.FLOAT32), - StructuredField(name="inline", format=ScalarType.UINT32), + StructuredField(name="inline", format=ScalarType.UINT32), StructuredField(name="crossline", format=ScalarType.UINT32), ] ), diff --git a/tests/unit/v1/test_dataset_builder_add_coordinate.py b/tests/unit/v1/test_dataset_builder_add_coordinate.py index 334c27b89..46cb27cd1 100644 --- a/tests/unit/v1/test_dataset_builder_add_coordinate.py +++ b/tests/unit/v1/test_dataset_builder_add_coordinate.py @@ -25,11 +25,12 @@ def test_add_coordinate() -> None: """Test adding coordinates. Check the state transition and validate required parameters.""" builder = MDIODatasetBuilder("test_dataset") assert builder._state == _BuilderState.INITIAL - + msg = "Must add at least one dimension before adding coordinates" with pytest.raises(ValueError, match=msg): builder.add_coordinate( - "cdp", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) + "cdp", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32 + ) builder.add_dimension("inline", 100) builder.add_dimension("crossline", 200) @@ -49,25 +50,29 @@ def test_add_coordinate() -> None: msg = "Pre-existing dimension named 'xline' is not found" with pytest.raises(ValueError, match=msg): builder.add_coordinate( - "bad_cdp-x", dimensions=["inline", "xline"], data_type=ScalarType.FLOAT32) + "bad_cdp-x", dimensions=["inline", "xline"], data_type=ScalarType.FLOAT32 + ) # Validate state transition builder.add_coordinate( - "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) + "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32 + ) validate_builder(builder, _BuilderState.HAS_COORDINATES, n_dims=2, n_coords=1, n_var=1) validate_variable( builder, name="cdp-x", dims=[("inline", 100), ("crossline", 200)], coords=["cdp-x"], - dtype=ScalarType.FLOAT32 + dtype=ScalarType.FLOAT32, ) # Adding coordinate with the same name twice msg = "Adding coordinate with the same name twice is not allowed" with pytest.raises(ValueError, match=msg): builder.add_coordinate( - "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) + "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32 + ) + def test_add_coordinate_with_defaults() -> None: """Test adding coordinates with default arguments.""" @@ -79,21 +84,18 @@ def test_add_coordinate_with_defaults() -> None: builder.add_coordinate("cdp", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) validate_builder(builder, _BuilderState.HAS_COORDINATES, n_dims=2, n_coords=1, n_var=1) validate_coordinate( - builder, - name="cdp", - dims=[("inline", 100), ("crossline", 200)], - dtype=ScalarType.FLOAT32 + builder, name="cdp", dims=[("inline", 100), ("crossline", 200)], dtype=ScalarType.FLOAT32 ) v = validate_variable( builder, name="cdp", dims=[("inline", 100), ("crossline", 200)], coords=["cdp"], - dtype=ScalarType.FLOAT32 + dtype=ScalarType.FLOAT32, ) assert v.long_name == "'cdp' coordinate variable" # Default value - assert v.compressor is None # Default value - assert v.metadata is None # Default value + assert v.compressor is None # Default value + assert v.metadata is None # Default value def test_coordinate_with_full_parameters() -> None: @@ -105,20 +107,18 @@ def test_coordinate_with_full_parameters() -> None: # Add coordinate with all metadata builder.add_coordinate( "cdp", - long_name = "Common Depth Point", + long_name="Common Depth Point", dimensions=["inline", "crossline"], - data_type = ScalarType.FLOAT16, - compressor = Blosc(algorithm="zstd"), + data_type=ScalarType.FLOAT16, + compressor=Blosc(algorithm="zstd"), metadata_info=[ AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)), - UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"})] + UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}), + ], ) validate_builder(builder, _BuilderState.HAS_COORDINATES, n_dims=2, n_coords=1, n_var=1) c = validate_coordinate( - builder, - name="cdp", - dims=[("inline", 100), ("crossline", 200)], - dtype=ScalarType.FLOAT16 + builder, name="cdp", dims=[("inline", 100), ("crossline", 200)], dtype=ScalarType.FLOAT16 ) assert c.long_name == "Common Depth Point" assert isinstance(c.compressor, Blosc) @@ -131,7 +131,7 @@ def test_coordinate_with_full_parameters() -> None: name="cdp", dims=[("inline", 100), ("crossline", 200)], coords=["cdp"], - dtype=ScalarType.FLOAT16 + dtype=ScalarType.FLOAT16, ) assert isinstance(v.compressor, Blosc) assert v.compressor.algorithm == "zstd" diff --git a/tests/unit/v1/test_dataset_builder_add_dimension.py b/tests/unit/v1/test_dataset_builder_add_dimension.py index e11a788de..ddcbd745c 100644 --- a/tests/unit/v1/test_dataset_builder_add_dimension.py +++ b/tests/unit/v1/test_dataset_builder_add_dimension.py @@ -38,7 +38,6 @@ def test_add_dimension() -> None: builder.add_dimension("x", 200) # Adding dimension with the same name twice - msg="Adding dimension with the same name twice is not allowed" + msg = "Adding dimension with the same name twice is not allowed" with pytest.raises(ValueError, match=msg): builder.add_dimension("x", 200) - diff --git a/tests/unit/v1/test_dataset_builder_add_variable.py b/tests/unit/v1/test_dataset_builder_add_variable.py index 8227be473..84abfe3ad 100644 --- a/tests/unit/v1/test_dataset_builder_add_variable.py +++ b/tests/unit/v1/test_dataset_builder_add_variable.py @@ -34,10 +34,9 @@ def test_add_variable_no_coords() -> None: # Validate: Must add at least one dimension before adding variables msg = "Must add at least one dimension before adding variables" with pytest.raises(ValueError, match=msg): - builder.add_variable("amplitude", dimensions=[ - "speed"], data_type=ScalarType.FLOAT32) + builder.add_variable("amplitude", dimensions=["speed"], data_type=ScalarType.FLOAT32) - # Add dimension before we can add a data variable + # Add dimension before we can add a data variable builder.add_dimension("inline", 100) builder.add_dimension("crossline", 200) builder.add_dimension("depth", 300) @@ -45,41 +44,40 @@ def test_add_variable_no_coords() -> None: # Validate: required parameters must be preset bad_name = None with pytest.raises(ValueError, match="'name' must be a non-empty string"): - builder.add_variable(bad_name, dimensions=[ - "speed"], data_type=ScalarType.FLOAT32) + builder.add_variable(bad_name, dimensions=["speed"], data_type=ScalarType.FLOAT32) with pytest.raises(ValueError, match="'name' must be a non-empty string"): - builder.add_variable( - "", dimensions=["speed"], data_type=ScalarType.FLOAT32) + builder.add_variable("", dimensions=["speed"], data_type=ScalarType.FLOAT32) with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): - builder.add_variable("bad_amplitude", dimensions=None, - data_type=ScalarType.FLOAT32) + builder.add_variable("bad_amplitude", dimensions=None, data_type=ScalarType.FLOAT32) with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): - builder.add_variable("bad_amplitude", dimensions=[], - data_type=ScalarType.FLOAT32) + builder.add_variable("bad_amplitude", dimensions=[], data_type=ScalarType.FLOAT32) # Validate: Add a variable using non-existent dimensions is not allowed msg = "Pre-existing dimension named 'il' is not found" with pytest.raises(ValueError, match=msg): - builder.add_variable("bad_amplitude", - dimensions=["il", "xl", "depth"], - data_type=ScalarType.FLOAT32) + builder.add_variable( + "bad_amplitude", dimensions=["il", "xl", "depth"], data_type=ScalarType.FLOAT32 + ) # Add a variable without coordinates - builder.add_variable("amplitude", - dimensions=["inline", "crossline", "depth"], - data_type=ScalarType.FLOAT32) + builder.add_variable( + "amplitude", dimensions=["inline", "crossline", "depth"], data_type=ScalarType.FLOAT32 + ) validate_builder(builder, _BuilderState.HAS_VARIABLES, n_dims=3, n_coords=0, n_var=1) - validate_variable(builder, "amplitude", - dims=[("inline", 100), ("crossline", 200), ("depth", 300)], - coords=None, - dtype=ScalarType.FLOAT32) + validate_variable( + builder, + "amplitude", + dims=[("inline", 100), ("crossline", 200), ("depth", 300)], + coords=None, + dtype=ScalarType.FLOAT32, + ) # Validate: adding a variable with the same name twice is not allowed msg = "Adding variable with the same name twice is not allowed" with pytest.raises(ValueError, match=msg): - builder.add_variable("amplitude", - dimensions=["inline", "crossline", "depth"], - data_type=ScalarType.FLOAT32) + builder.add_variable( + "amplitude", dimensions=["inline", "crossline", "depth"], data_type=ScalarType.FLOAT32 + ) def test_add_variable_with_coords() -> None: @@ -96,38 +94,52 @@ def test_add_variable_with_coords() -> None: # Validate: adding a variable with a coordinate that has not been pre-created is not allowed msg = "Pre-existing coordinate named 'depth' is not found" with pytest.raises(ValueError, match=msg): - builder.add_variable("ampl", - dimensions=["inline", "crossline", "depth"], - coordinates=["inline", "crossline", "depth"], - data_type=ScalarType.FLOAT32) + builder.add_variable( + "ampl", + dimensions=["inline", "crossline", "depth"], + coordinates=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT32, + ) # Add a variable with pre-defined dimension coordinates - builder.add_variable("ampl", - dimensions=["inline", "crossline", "depth"], - coordinates=["inline", "crossline"], - data_type=ScalarType.FLOAT32) + builder.add_variable( + "ampl", + dimensions=["inline", "crossline", "depth"], + coordinates=["inline", "crossline"], + data_type=ScalarType.FLOAT32, + ) validate_builder(builder, _BuilderState.HAS_VARIABLES, n_dims=3, n_coords=2, n_var=3) - validate_variable(builder, "ampl", - dims=[("inline", 100), ("crossline", 200), ("depth", 300)], - coords=["inline", "crossline"], - dtype=ScalarType.FLOAT32) + validate_variable( + builder, + "ampl", + dims=[("inline", 100), ("crossline", 200), ("depth", 300)], + coords=["inline", "crossline"], + dtype=ScalarType.FLOAT32, + ) # Add non-dim coordinates (e.g., 2D coordinates) builder.add_coordinate( - "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) + "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32 + ) builder.add_coordinate( - "cdp-y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) + "cdp-y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32 + ) # Add a variable with pre-defined dimension and non-dimension coordinates - builder.add_variable("ampl2", - dimensions=["inline", "crossline", "depth"], - coordinates=["inline", "crossline", "cdp-x", "cdp-y"], - data_type=ScalarType.FLOAT32) + builder.add_variable( + "ampl2", + dimensions=["inline", "crossline", "depth"], + coordinates=["inline", "crossline", "cdp-x", "cdp-y"], + data_type=ScalarType.FLOAT32, + ) validate_builder(builder, _BuilderState.HAS_VARIABLES, n_dims=3, n_coords=4, n_var=6) - validate_variable(builder, "ampl2", - dims=[("inline", 100), ("crossline", 200), ("depth", 300)], - coords=["inline", "crossline", "cdp-x", "cdp-y"], - dtype=ScalarType.FLOAT32) + validate_variable( + builder, + "ampl2", + dims=[("inline", 100), ("crossline", 200), ("depth", 300)], + coords=["inline", "crossline", "cdp-x", "cdp-y"], + dtype=ScalarType.FLOAT32, + ) def test_add_variable_with_defaults() -> None: @@ -140,20 +152,25 @@ def test_add_variable_with_defaults() -> None: # Add dimension coordinates builder.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.UINT32) builder.add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.UINT32) - builder.add_coordinate("depth", dimensions=["depth"], data_type=ScalarType.UINT32, - metadata_info=[ - AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER)) - ]) + builder.add_coordinate( + "depth", + dimensions=["depth"], + data_type=ScalarType.UINT32, + metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))], + ) # Add data variable using defaults - builder.add_variable("ampl", - dimensions=["inline", "crossline", "depth"], - data_type=ScalarType.FLOAT32) + builder.add_variable( + "ampl", dimensions=["inline", "crossline", "depth"], data_type=ScalarType.FLOAT32 + ) validate_builder(builder, _BuilderState.HAS_VARIABLES, n_dims=3, n_coords=3, n_var=4) - v = validate_variable(builder, "ampl", - dims=[("inline", 100), ("crossline", 200), ("depth", 300)], - coords=None, - dtype=ScalarType.FLOAT32) + v = validate_variable( + builder, + "ampl", + dims=[("inline", 100), ("crossline", 200), ("depth", 300)], + coords=None, + dtype=ScalarType.FLOAT32, + ) assert v.long_name is None # Default value assert v.compressor is None # Default value assert v.coordinates is None # Default value @@ -173,43 +190,46 @@ def test_add_variable_full_parameters() -> None: builder.add_coordinate("depth", dimensions=["depth"], data_type=ScalarType.UINT32) # Add coordinates before we can add a data variable builder.add_coordinate( - "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64) + "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64 + ) builder.add_coordinate( - "cdp-y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64) + "cdp-y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64 + ) # Add data variable with full parameters - builder.add_variable("ampl", - long_name="Amplitude (dimensionless)", - dimensions=["inline", "crossline", "depth"], - data_type=ScalarType.FLOAT32, - compressor=Blosc(algorithm="zstd"), - coordinates=["inline", "crossline", "depth", "cdp-x", "cdp-y"], - metadata_info=[ - AllUnits(units_v1=LengthUnitModel( - length=LengthUnitEnum.FOOT)), - UserAttributes( - attributes={"MGA": 51, "UnitSystem": "Imperial"}), - ChunkGridMetadata( - chunk_grid=RegularChunkGrid( - configuration=RegularChunkShape(chunk_shape=[20])) - ), - StatisticsMetadata( - stats_v1=SummaryStatistics( - count=100, - sum=1215.1, - sumSquares=125.12, - min=5.61, - max=10.84, - histogram=CenteredBinHistogram( - binCenters=[1, 2], counts=[10, 15]), - ) - ), - ]) + builder.add_variable( + "ampl", + long_name="Amplitude (dimensionless)", + dimensions=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT32, + compressor=Blosc(algorithm="zstd"), + coordinates=["inline", "crossline", "depth", "cdp-x", "cdp-y"], + metadata_info=[ + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)), + UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}), + ChunkGridMetadata( + chunk_grid=RegularChunkGrid(configuration=RegularChunkShape(chunk_shape=[20])) + ), + StatisticsMetadata( + stats_v1=SummaryStatistics( + count=100, + sum=1215.1, + sumSquares=125.12, + min=5.61, + max=10.84, + histogram=CenteredBinHistogram(binCenters=[1, 2], counts=[10, 15]), + ) + ), + ], + ) validate_builder(builder, _BuilderState.HAS_VARIABLES, n_dims=3, n_coords=5, n_var=6) - v = validate_variable(builder, "ampl", - dims=[("inline", 100), ("crossline", 200), ("depth", 300)], - coords=["inline", "crossline", "depth", "cdp-x", "cdp-y"], - dtype=ScalarType.FLOAT32) + v = validate_variable( + builder, + "ampl", + dims=[("inline", 100), ("crossline", 200), ("depth", 300)], + coords=["inline", "crossline", "depth", "cdp-x", "cdp-y"], + dtype=ScalarType.FLOAT32, + ) assert v.long_name == "Amplitude (dimensionless)" assert isinstance(v.compressor, Blosc) assert v.compressor.algorithm == "zstd" diff --git a/tests/unit/v1/test_dataset_builder_build.py b/tests/unit/v1/test_dataset_builder_build.py index d42f29a7a..aa5fad552 100644 --- a/tests/unit/v1/test_dataset_builder_build.py +++ b/tests/unit/v1/test_dataset_builder_build.py @@ -4,7 +4,6 @@ # Thus, disable it for this file """Tests the schema v1 dataset_builder.add_coordinate() public API.""" - from mdio.schemas.dtype import ScalarType from mdio.schemas.dtype import StructuredField from mdio.schemas.dtype import StructuredType @@ -23,15 +22,17 @@ def test_build() -> None: MDIODatasetBuilder("test_dataset") .add_dimension("inline", 100) .add_dimension("crossline", 200) - .add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.FLOAT64) - .add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.FLOAT64) + .add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.FLOAT64) + .add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.FLOAT64) .add_coordinate("x_coord", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) .add_coordinate("y_coord", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) - .add_variable("data", - long_name="Test Data", - dimensions=["inline", "crossline"], - coordinates=["inline", "crossline", "x_coord", "y_coord"], - data_type=ScalarType.FLOAT32) + .add_variable( + "data", + long_name="Test Data", + dimensions=["inline", "crossline"], + coordinates=["inline", "crossline", "x_coord", "y_coord"], + data_type=ScalarType.FLOAT32, + ) .build() ) @@ -45,7 +46,8 @@ def test_build() -> None: assert next(v for v in dataset.variables if v.name == "y_coord") is not None assert next(v for v in dataset.variables if v.name == "data") is not None -def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50) + +def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50) """Test building a Campos 3D dataset with multiple variables and attributes.""" dataset = make_campos_3d_dataset() @@ -61,11 +63,7 @@ def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50 # Verify dimension coordinate variables validate_variable( - dataset, - name="inline", - dims=[("inline", 256)], - coords=["inline"], - dtype=ScalarType.UINT32 + dataset, name="inline", dims=[("inline", 256)], coords=["inline"], dtype=ScalarType.UINT32 ) validate_variable( @@ -73,15 +71,11 @@ def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50 name="crossline", dims=[("crossline", 512)], coords=["crossline"], - dtype=ScalarType.UINT32 + dtype=ScalarType.UINT32, ) depth = validate_variable( - dataset, - name="depth", - dims=[("depth", 384)], - coords=["depth"], - dtype=ScalarType.FLOAT64 + dataset, name="depth", dims=[("depth", 384)], coords=["depth"], dtype=ScalarType.FLOAT64 ) assert depth.metadata.units_v1.length == LengthUnitEnum.METER @@ -91,7 +85,7 @@ def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50 name="cdp-x", dims=[("inline", 256), ("crossline", 512)], coords=["cdp-x"], - dtype=ScalarType.FLOAT32 + dtype=ScalarType.FLOAT32, ) assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER @@ -100,17 +94,17 @@ def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50 name="cdp-y", dims=[("inline", 256), ("crossline", 512)], coords=["cdp-y"], - dtype=ScalarType.FLOAT32 + dtype=ScalarType.FLOAT32, ) assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER # Verify data variables image = validate_variable( - dataset, + dataset, name="image", dims=[("inline", 256), ("crossline", 512), ("depth", 384)], coords=["cdp-x", "cdp-y"], - dtype=ScalarType.FLOAT32 + dtype=ScalarType.FLOAT32, ) assert image.metadata.units_v1 is None # No units defined for image assert image.compressor.algorithm == "zstd" @@ -122,7 +116,7 @@ def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50 name="velocity", dims=[("inline", 256), ("crossline", 512), ("depth", 384)], coords=["cdp-x", "cdp-y"], - dtype=ScalarType.FLOAT16 + dtype=ScalarType.FLOAT16, ) assert velocity.compressor is None assert velocity.metadata.chunk_grid.configuration.chunk_shape == [128, 128, 128] @@ -133,7 +127,7 @@ def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50 name="image_inline", dims=[("inline", 256), ("crossline", 512), ("depth", 384)], coords=["cdp-x", "cdp-y"], - dtype=ScalarType.FLOAT32 + dtype=ScalarType.FLOAT32, ) assert image_inline.long_name == "inline optimized version of 3d_stack" assert image_inline.compressor.algorithm == "zstd" @@ -154,10 +148,8 @@ def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50 fields=[ StructuredField(name="cdp-x", format=ScalarType.FLOAT32), StructuredField(name="cdp-y", format=ScalarType.FLOAT32), - StructuredField(name="inline", format=ScalarType.UINT32), + StructuredField(name="inline", format=ScalarType.UINT32), StructuredField(name="crossline", format=ScalarType.UINT32), ] - ) + ), ) - - diff --git a/tests/unit/v1/test_dataset_builder_helpers.py b/tests/unit/v1/test_dataset_builder_helpers.py index aecd5ff6d..b1ab99647 100644 --- a/tests/unit/v1/test_dataset_builder_helpers.py +++ b/tests/unit/v1/test_dataset_builder_helpers.py @@ -18,14 +18,11 @@ def test__get_named_dimension() -> None: """Test getting a dimension by name from the list of dimensions.""" - dimensions = [NamedDimension(name="inline", size=2), NamedDimension( - name="crossline", size=3)] + dimensions = [NamedDimension(name="inline", size=2), NamedDimension(name="crossline", size=3)] assert _get_named_dimension([], "inline") is None - assert _get_named_dimension(dimensions, "inline") == NamedDimension( - name="inline", size=2) - assert _get_named_dimension(dimensions, "crossline") == NamedDimension( - name="crossline", size=3) + assert _get_named_dimension(dimensions, "inline") == NamedDimension(name="inline", size=2) + assert _get_named_dimension(dimensions, "crossline") == NamedDimension(name="crossline", size=3) assert _get_named_dimension(dimensions, "time") is None with pytest.raises(TypeError, match="Expected str, got NoneType"): @@ -51,46 +48,51 @@ def test__to_dictionary() -> None: # Validate conversion of a Pydantic BaseModel class SomeModel(StrictModel): count: int = Field(default=None, description="Samples count") - samples: list[float] = Field( - default_factory=list, description="Samples.") + samples: list[float] = Field(default_factory=list, description="Samples.") created: datetime = Field( default_factory=datetime.now, description="Creation time with TZ info." ) - md = SomeModel(count=3, - samples=[1.0, 2.0, 3.0], - created=datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC)) + + md = SomeModel( + count=3, samples=[1.0, 2.0, 3.0], created=datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC) + ) result = _to_dictionary(md) assert isinstance(result, dict) - assert result == { - "count": 3, "created": "2023-10-01T12:00:00Z", "samples": [1.0, 2.0, 3.0]} + assert result == {"count": 3, "created": "2023-10-01T12:00:00Z", "samples": [1.0, 2.0, 3.0]} # Validate conversion of a dictionary dct = { "count": 3, "samples": [1.0, 2.0, 3.0], - "created": datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC)} + "created": datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC), + } result = _to_dictionary(dct) assert isinstance(result, dict) - assert result == {"count": 3, - "samples": [1.0, 2.0, 3.0], - "created": datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC), } + assert result == { + "count": 3, + "samples": [1.0, 2.0, 3.0], + "created": datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC), + } # Validate conversion of a dictionary - lst = [None, - SomeModel(count=3, - samples=[1.0, 2.0, 3.0], - created=datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC)), - { - "count2": 3, - "samples2": [1.0, 2.0, 3.0], - "created2": datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC) - }] + lst = [ + None, + SomeModel( + count=3, samples=[1.0, 2.0, 3.0], created=datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC) + ), + { + "count2": 3, + "samples2": [1.0, 2.0, 3.0], + "created2": datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC), + }, + ] result = _to_dictionary(lst) assert isinstance(result, dict) - assert result == {"count": 3, - "samples": [1.0, 2.0, 3.0], - "created": "2023-10-01T12:00:00Z", - "count2": 3, - "samples2": [1.0, 2.0, 3.0], - "created2": datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC) - } + assert result == { + "count": 3, + "samples": [1.0, 2.0, 3.0], + "created": "2023-10-01T12:00:00Z", + "count2": 3, + "samples2": [1.0, 2.0, 3.0], + "created2": datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC), + } From 1904deefe7dd58f3d4cb24cbbc682d93f0064926 Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Thu, 10 Jul 2025 10:45:04 -0500 Subject: [PATCH 38/56] remove some noqa overrides --- src/mdio/schemas/v1/dataset_builder.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/mdio/schemas/v1/dataset_builder.py b/src/mdio/schemas/v1/dataset_builder.py index 85bae21fe..facd0dc8d 100644 --- a/src/mdio/schemas/v1/dataset_builder.py +++ b/src/mdio/schemas/v1/dataset_builder.py @@ -9,7 +9,6 @@ from typing import TypeAlias from pydantic import BaseModel -from zarr.core.chunk_key_encodings import V2ChunkKeyEncoding # noqa: F401 from mdio.schemas.compressors import ZFP from mdio.schemas.compressors import Blosc @@ -107,9 +106,7 @@ def __init__(self, name: str, attributes: UserAttributes | None = None): self._state = _BuilderState.INITIAL self._unnamed_variable_counter = 0 - def add_dimension( # noqa: PLR0913 - self, name: str, size: int - ) -> "MDIODatasetBuilder": + def add_dimension(self, name: str, size: int) -> "MDIODatasetBuilder": """Add a dimension. This function be called at least once before adding coordinates or variables. From 90d31a1cd76724d2cb9ad64ede2a615533c80ca6 Mon Sep 17 00:00:00 2001 From: Dima From Texas <34629861+dmitriyrepin@users.noreply.github.com> Date: Thu, 10 Jul 2025 10:55:47 -0500 Subject: [PATCH 39/56] Implement MDIO Dataset builder to create in-memory instance of schemas.v1.dataset.Dataset (#568) * schema_v1-dataset_builder-add_dimension * First take on add_dimension(), add_coordinate(), add_variable() * Finished add_dimension, add_coordinate, add_variable * Work on build * Generalize _to_dictionary() * build * Dataset Build - pass one * Revert .container changes * PR review: remove DEVELOPER_NOTES.md * PR Review: add_coordinate() should accept only data_type: ScalarType * PR review: add_variable() data_type remove default * RE review: do not add dimension variable * PR Review: get api version from the package version * PR Review: remove add_dimension_coordinate * PR Review: add_coordinate() remove data_type default value * PR Review: improve unit tests by extracting common functionality in validate* functions * Remove the Dockerfile changes. They are not supposed to be a part of this PR * PR Review: run ruff * PR Review: fix pre-commit errors * remove some noqa overrides --------- Co-authored-by: Altay Sansal --- src/mdio/schemas/v1/dataset_builder.py | 335 ++++++++++++++++++ tests/unit/v1/__init__.py | 1 + tests/unit/v1/helpers.py | 254 +++++++++++++ .../v1/test_dataset_builder_add_coordinate.py | 141 ++++++++ .../v1/test_dataset_builder_add_dimension.py | 43 +++ .../v1/test_dataset_builder_add_variable.py | 250 +++++++++++++ tests/unit/v1/test_dataset_builder_build.py | 155 ++++++++ tests/unit/v1/test_dataset_builder_helpers.py | 98 +++++ 8 files changed, 1277 insertions(+) create mode 100644 src/mdio/schemas/v1/dataset_builder.py create mode 100644 tests/unit/v1/__init__.py create mode 100644 tests/unit/v1/helpers.py create mode 100644 tests/unit/v1/test_dataset_builder_add_coordinate.py create mode 100644 tests/unit/v1/test_dataset_builder_add_dimension.py create mode 100644 tests/unit/v1/test_dataset_builder_add_variable.py create mode 100644 tests/unit/v1/test_dataset_builder_build.py create mode 100644 tests/unit/v1/test_dataset_builder_helpers.py diff --git a/src/mdio/schemas/v1/dataset_builder.py b/src/mdio/schemas/v1/dataset_builder.py new file mode 100644 index 000000000..facd0dc8d --- /dev/null +++ b/src/mdio/schemas/v1/dataset_builder.py @@ -0,0 +1,335 @@ +"""Builder pattern implementation for MDIO v1 schema models.""" + +from datetime import UTC +from datetime import datetime +from enum import Enum +from enum import auto +from importlib import metadata +from typing import Any +from typing import TypeAlias + +from pydantic import BaseModel + +from mdio.schemas.compressors import ZFP +from mdio.schemas.compressors import Blosc +from mdio.schemas.dimension import NamedDimension +from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredType +from mdio.schemas.metadata import ChunkGridMetadata +from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.dataset import Dataset +from mdio.schemas.v1.dataset import DatasetInfo +from mdio.schemas.v1.stats import StatisticsMetadata +from mdio.schemas.v1.units import AllUnits +from mdio.schemas.v1.variable import Coordinate +from mdio.schemas.v1.variable import Variable + +AnyMetadataList: TypeAlias = list[ + AllUnits | UserAttributes | ChunkGridMetadata | StatisticsMetadata | DatasetInfo +] +CoordinateMetadataList: TypeAlias = list[AllUnits | UserAttributes] +VariableMetadataList: TypeAlias = list[ + AllUnits | UserAttributes | ChunkGridMetadata | StatisticsMetadata +] +DatasetMetadataList: TypeAlias = list[DatasetInfo | UserAttributes] + + +class _BuilderState(Enum): + """States for the template builder.""" + + INITIAL = auto() + HAS_DIMENSIONS = auto() + HAS_COORDINATES = auto() + HAS_VARIABLES = auto() + + +def _get_named_dimension( + dimensions: list[NamedDimension], name: str, size: int | None = None +) -> NamedDimension | None: + """Get a dimension by name and optional size from the list[NamedDimension].""" + if dimensions is None: + return False + if not isinstance(name, str): + msg = f"Expected str, got {type(name).__name__}" + raise TypeError(msg) + + nd = next((dim for dim in dimensions if dim.name == name), None) + if nd is None: + return None + if size is not None and nd.size != size: + msg = f"Dimension {name!r} found but size {nd.size} does not match expected size {size}" + raise ValueError(msg) + return nd + + +def _to_dictionary(val: BaseModel | dict[str, Any] | AnyMetadataList) -> dict[str, Any]: + """Convert a dictionary, list or pydantic BaseModel to a dictionary.""" + if val is None: + return None + if isinstance(val, BaseModel): + return val.model_dump(mode="json", by_alias=True) + if isinstance(val, dict): + return val + if isinstance(val, list): + metadata_dict = {} + for md in val: + if md is None: + continue + metadata_dict.update(_to_dictionary(md)) + return metadata_dict + msg = f"Expected BaseModel, dict or list, got {type(val).__name__}" + raise TypeError(msg) + + +class MDIODatasetBuilder: + """Builder for creating MDIO datasets with enforced build order. + + This builder implements the builder pattern to create MDIO datasets with a v1 schema. + It enforces a specific build order to ensure valid dataset construction: + 1. Must add dimensions first via add_dimension() + 2. Can optionally add coordinates via add_coordinate() + 3. Must add variables via add_variable() + 4. Must call build() to create the dataset. + """ + + def __init__(self, name: str, attributes: UserAttributes | None = None): + try: + api_version = metadata.version("multidimio") + except metadata.PackageNotFoundError: + api_version = "unknown" + + self._info = DatasetInfo(name=name, api_version=api_version, created_on=datetime.now(UTC)) + self._attributes = attributes + self._dimensions: list[NamedDimension] = [] + self._coordinates: list[Coordinate] = [] + self._variables: list[Variable] = [] + self._state = _BuilderState.INITIAL + self._unnamed_variable_counter = 0 + + def add_dimension(self, name: str, size: int) -> "MDIODatasetBuilder": + """Add a dimension. + + This function be called at least once before adding coordinates or variables. + + Args: + name: Name of the dimension + size: Size of the dimension + + Raises: + ValueError: If 'name' is not a non-empty string. + if the dimension is already defined. + + Returns: + self: Returns self for method chaining + """ + if not name: + msg = "'name' must be a non-empty string" + raise ValueError(msg) + + # Validate that the dimension is not already defined + old_var = next((e for e in self._dimensions if e.name == name), None) + if old_var is not None: + msg = "Adding dimension with the same name twice is not allowed" + raise ValueError(msg) + + dim = NamedDimension(name=name, size=size) + self._dimensions.append(dim) + self._state = _BuilderState.HAS_DIMENSIONS + return self + + def add_coordinate( # noqa: PLR0913 + self, + name: str, + *, + long_name: str = None, + dimensions: list[str], + data_type: ScalarType, + compressor: Blosc | ZFP | None = None, + metadata_info: CoordinateMetadataList | None = None, + ) -> "MDIODatasetBuilder": + """Add a coordinate after adding at least one dimension. + + This function must be called after all required dimensions are added via add_dimension(). + This call will create a coordinate variable. + + Args: + name: Name of the coordinate + long_name: Optional long name for the coordinate + dimensions: List of dimension names that the coordinate is associated with + data_type: Data type for the coordinate (defaults to FLOAT32) + compressor: Compressor used for the variable (defaults to None) + metadata_info: Optional metadata information for the coordinate + + Raises: + ValueError: If no dimensions have been added yet. + If 'name' is not a non-empty string. + If 'dimensions' is not a non-empty list. + If the coordinate is already defined. + If any referenced dimension is not already defined. + + Returns: + self: Returns self for method chaining + """ + if self._state == _BuilderState.INITIAL: + msg = "Must add at least one dimension before adding coordinates" + raise ValueError(msg) + if not name: + msg = "'name' must be a non-empty string" + raise ValueError(msg) + if dimensions is None or not dimensions: + msg = "'dimensions' must be a non-empty list" + raise ValueError(msg) + old_var = next((e for e in self._coordinates if e.name == name), None) + # Validate that the coordinate is not already defined + if old_var is not None: + msg = "Adding coordinate with the same name twice is not allowed" + raise ValueError(msg) + + # Validate that all referenced dimensions are already defined + named_dimensions = [] + for dim_name in dimensions: + nd = _get_named_dimension(self._dimensions, dim_name) + if nd is None: + msg = f"Pre-existing dimension named {dim_name!r} is not found" + raise ValueError(msg) + named_dimensions.append(nd) + + meta_dict = _to_dictionary(metadata_info) + coord = Coordinate( + name=name, + longName=long_name, + dimensions=named_dimensions, + compressor=compressor, + dataType=data_type, + metadata=meta_dict, + ) + self._coordinates.append(coord) + + # Add a coordinate variable to the dataset + self.add_variable( + name=coord.name, + long_name=f"'{coord.name}' coordinate variable", + dimensions=dimensions, # dimension names (list[str]) + data_type=coord.data_type, + compressor=compressor, + coordinates=[name], # Use the coordinate name as a reference + metadata_info=coord.metadata, + ) + + self._state = _BuilderState.HAS_COORDINATES + return self + + def add_variable( # noqa: PLR0913 + self, + name: str, + *, + long_name: str = None, + dimensions: list[str], + data_type: ScalarType | StructuredType, + compressor: Blosc | ZFP | None = None, + coordinates: list[str] | None = None, + metadata_info: VariableMetadataList | None = None, + ) -> "MDIODatasetBuilder": + """Add a variable after adding at least one dimension and, optionally, coordinate. + + This function must be called after all required dimensions are added via add_dimension() + This function must be called after all required coordinates are added via add_coordinate(). + + If this function is called with a single dimension name that matches the variable name, + it will create a dimension variable. Dimension variables are special variables that + represent sampling along a dimension. + + Args: + name: Name of the variable + long_name: Optional long name for the variable + dimensions: List of dimension names that the variable is associated with + data_type: Data type for the variable (defaults to FLOAT32) + compressor: Compressor used for the variable (defaults to None) + coordinates: List of coordinate names that the variable is associated with + (defaults to None, meaning no coordinates) + metadata_info: Optional metadata information for the variable + + Raises: + ValueError: If no dimensions have been added yet. + If 'name' is not a non-empty string. + If 'dimensions' is not a non-empty list. + If the variable is already defined. + If any referenced dimension is not already defined. + If any referenced coordinate is not already defined. + + Returns: + self: Returns self for method chaining. + """ + if self._state == _BuilderState.INITIAL: + msg = "Must add at least one dimension before adding variables" + raise ValueError(msg) + if not name: + msg = "'name' must be a non-empty string" + raise ValueError(msg) + if dimensions is None or not dimensions: + msg = "'dimensions' must be a non-empty list" + raise ValueError(msg) + + # Validate that the variable is not already defined + old_var = next((e for e in self._variables if e.name == name), None) + if old_var is not None: + msg = "Adding variable with the same name twice is not allowed" + raise ValueError(msg) + + # Validate that all referenced dimensions are already defined + named_dimensions = [] + for dim_name in dimensions: + nd = _get_named_dimension(self._dimensions, dim_name) + if nd is None: + msg = f"Pre-existing dimension named {dim_name!r} is not found" + raise ValueError(msg) + named_dimensions.append(nd) + + coordinate_objs: list[Coordinate] = [] + # Validate that all referenced coordinates are already defined + if coordinates is not None: + for coord in coordinates: + c: Coordinate = next((c for c in self._coordinates if c.name == coord), None) + if c is not None: + coordinate_objs.append(c) + else: + msg = f"Pre-existing coordinate named {coord!r} is not found" + raise ValueError(msg) + + # If this is a dimension coordinate variable, embed the Coordinate into it + if coordinates is not None and len(coordinates) == 1 and coordinates[0] == name: + coordinates = coordinate_objs + + meta_dict = _to_dictionary(metadata_info) + var = Variable( + name=name, + long_name=long_name, + dimensions=named_dimensions, + data_type=data_type, + compressor=compressor, + coordinates=coordinates, + metadata=meta_dict, + ) + self._variables.append(var) + + self._state = _BuilderState.HAS_VARIABLES + return self + + def build(self) -> Dataset: + """Build the final dataset. + + This function must be called after at least one dimension is added via add_dimension(). + It will create a Dataset object with all added dimensions, coordinates, and variables. + + Raises: + ValueError: If no dimensions have been added yet. + + Returns: + Dataset: The built dataset with all added dimensions, coordinates, and variables. + """ + if self._state == _BuilderState.INITIAL: + msg = "Must add at least one dimension before building" + raise ValueError(msg) + + var_meta_dict = _to_dictionary([self._info, self._attributes]) + return Dataset(variables=self._variables, metadata=var_meta_dict) diff --git a/tests/unit/v1/__init__.py b/tests/unit/v1/__init__.py new file mode 100644 index 000000000..fa2ea633b --- /dev/null +++ b/tests/unit/v1/__init__.py @@ -0,0 +1 @@ +"""Unit tests for parts of the MDIO package related to the v1 schema.""" diff --git a/tests/unit/v1/helpers.py b/tests/unit/v1/helpers.py new file mode 100644 index 000000000..2058bdd54 --- /dev/null +++ b/tests/unit/v1/helpers.py @@ -0,0 +1,254 @@ +"""Helper methods used in unit tests.""" + +from mdio.schemas.chunk_grid import RegularChunkGrid +from mdio.schemas.chunk_grid import RegularChunkShape +from mdio.schemas.compressors import Blosc +from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredField +from mdio.schemas.dtype import StructuredType +from mdio.schemas.metadata import ChunkGridMetadata +from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.dataset import Dataset +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder +from mdio.schemas.v1.dataset_builder import _BuilderState +from mdio.schemas.v1.dataset_builder import _get_named_dimension +from mdio.schemas.v1.stats import CenteredBinHistogram +from mdio.schemas.v1.stats import StatisticsMetadata +from mdio.schemas.v1.stats import SummaryStatistics +from mdio.schemas.v1.units import AllUnits +from mdio.schemas.v1.units import LengthUnitEnum +from mdio.schemas.v1.units import LengthUnitModel +from mdio.schemas.v1.units import SpeedUnitEnum +from mdio.schemas.v1.units import SpeedUnitModel +from mdio.schemas.v1.variable import Coordinate +from mdio.schemas.v1.variable import Variable + + +def validate_builder( + builder: MDIODatasetBuilder, state: _BuilderState, n_dims: int, n_coords: int, n_var: int +) -> None: + """Validate the state of the builder, the number of dimensions, coordinates, and variables.""" + assert builder._state == state + assert len(builder._dimensions) == n_dims + assert len(builder._coordinates) == n_coords + assert len(builder._variables) == n_var + + +def validate_coordinate( + builder: MDIODatasetBuilder, name: str, dims: list[tuple[str, int]], dtype: ScalarType +) -> Coordinate: + """Validate existence and the structure of the created coordinate.""" + # Validate that coordinate exists + c = next((c for c in builder._coordinates if c.name == name), None) + assert c is not None + assert isinstance(c, Coordinate) + + # Validate that dimensions are stored as NamedDimensions + for d in dims: + name = d[0] + size = d[1] + assert _get_named_dimension(c.dimensions, name, size) is not None + + assert c.data_type == dtype + return c + + +def validate_variable( + container: MDIODatasetBuilder | Dataset, + name: str, + dims: list[tuple[str, int]], + coords: list[str], + dtype: ScalarType, +) -> Variable: + """Validate existence and the structure of the created variable.""" + if isinstance(container, MDIODatasetBuilder): + var_list = container._variables + global_coord_list = container._coordinates + elif isinstance(container, Dataset): + var_list = container.variables + global_coord_list = _get_all_coordinates(container) + else: + err_msg = f"Expected MDIODatasetBuilder or Dataset, got {type(container)}" + raise TypeError(err_msg) + + # Validate that the variable exists + v = next((e for e in var_list if e.name == name), None) + assert v is not None + assert isinstance(v, Variable) + + # Validate that dimensions are stored as NamedDimensions within the variable + assert len(v.dimensions) == len(dims) + for d in dims: + name = d[0] + size = d[1] + assert _get_named_dimension(v.dimensions, name, size) is not None + + # Validate that coordinates are either embedded or can be resolved from names to Coordinate + if coords is None: + assert v.coordinates is None + else: + assert len(v.coordinates) == len(coords) + for coord_name in coords: + assert _get_coordinate(global_coord_list, v.coordinates, coord_name) is not None + + assert v.data_type == dtype + return v + + +def _get_coordinate( + global_coord_list: list[Coordinate], + coordinates_or_references: list[Coordinate] | list[str], + name: str, +) -> Coordinate | None: + """Get a coordinate by name from the list[Coordinate] | list[str]. + + The function validates that the coordinate referenced by the name can be found + in the global coordinate list. + If the coordinate is stored as a Coordinate object, it is returned directly. + """ + if coordinates_or_references is None: + return None + + for c in coordinates_or_references: + if isinstance(c, str) and c == name: + # The coordinate is stored by name (str). + cc = None + # Find the Coordinate in the global list and return it. + if global_coord_list is not None: + cc = next((cc for cc in global_coord_list if cc.name == name), None) + if cc is None: + msg = f"Pre-existing coordinate named {name!r} is not found" + raise ValueError(msg) + return cc + if isinstance(c, Coordinate) and c.name == name: + # The coordinate is stored as an embedded Coordinate object. + # Return it. + return c + + return None + + +def _get_all_coordinates(dataset: Dataset) -> list[Coordinate]: + all_coords: dict[str, Coordinate] = {} + for v in dataset.variables: + if v.coordinates is not None: + for c in v.coordinates: + if isinstance(c, Coordinate) and c.name not in all_coords: + all_coords[c.name] = c + return list(all_coords.values()) + + +def make_campos_3d_dataset() -> Dataset: + """Create in-memory campos_3d dataset.""" + ds = MDIODatasetBuilder( + "campos_3d", + attributes=UserAttributes( + attributes={ + "textHeader": [ + "C01 .......................... ", + "C02 .......................... ", + "C03 .......................... ", + ], + "foo": "bar", + } + ), + ) + + # Add dimensions + ds.add_dimension("inline", 256) + ds.add_dimension("crossline", 512) + ds.add_dimension("depth", 384) + ds.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.UINT32) + ds.add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.UINT32) + ds.add_coordinate( + "depth", + dimensions=["depth"], + data_type=ScalarType.FLOAT64, + metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))], + ) + # Add coordinates + ds.add_coordinate( + "cdp-x", + dimensions=["inline", "crossline"], + data_type=ScalarType.FLOAT32, + metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))], + ) + ds.add_coordinate( + "cdp-y", + dimensions=["inline", "crossline"], + data_type=ScalarType.FLOAT32, + metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))], + ) + + # Add image variable + ds.add_variable( + name="image", + dimensions=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT32, + compressor=Blosc(algorithm="zstd"), + coordinates=["cdp-x", "cdp-y"], + metadata_info=[ + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape(chunk_shape=[128, 128, 128]) + ) + ), + StatisticsMetadata( + stats_v1=SummaryStatistics( + count=100, + sum=1215.1, + sumSquares=125.12, + min=5.61, + max=10.84, + histogram=CenteredBinHistogram(binCenters=[1, 2], counts=[10, 15]), + ) + ), + UserAttributes(attributes={"fizz": "buzz", "UnitSystem": "Canonical"}), + ], + ) + # Add velocity variable + ds.add_variable( + name="velocity", + dimensions=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT16, + coordinates=["cdp-x", "cdp-y"], + metadata_info=[ + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape(chunk_shape=[128, 128, 128]) + ) + ), + AllUnits(units_v1=SpeedUnitModel(speed=SpeedUnitEnum.METER_PER_SECOND)), + ], + ) + # Add inline-optimized image variable + ds.add_variable( + name="image_inline", + long_name="inline optimized version of 3d_stack", + dimensions=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT32, + compressor=Blosc(algorithm="zstd"), + coordinates=["cdp-x", "cdp-y"], + metadata_info=[ + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape(chunk_shape=[4, 512, 512]) + ) + ) + ], + ) + # Add headers variable with structured dtype + ds.add_variable( + name="image_headers", + dimensions=["inline", "crossline"], + data_type=StructuredType( + fields=[ + StructuredField(name="cdp-x", format=ScalarType.FLOAT32), + StructuredField(name="cdp-y", format=ScalarType.FLOAT32), + StructuredField(name="inline", format=ScalarType.UINT32), + StructuredField(name="crossline", format=ScalarType.UINT32), + ] + ), + coordinates=["cdp-x", "cdp-y"], + ) + return ds.build() diff --git a/tests/unit/v1/test_dataset_builder_add_coordinate.py b/tests/unit/v1/test_dataset_builder_add_coordinate.py new file mode 100644 index 000000000..46cb27cd1 --- /dev/null +++ b/tests/unit/v1/test_dataset_builder_add_coordinate.py @@ -0,0 +1,141 @@ +# ruff: noqa: PLR2004 +# PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable +# The above erroneous warning is generated for every numerical assert. +# Thus, disable it for this file +"""Tests the schema v1 dataset_builder.add_coordinate() public API.""" + +import pytest + +from mdio.schemas.compressors import Blosc +from mdio.schemas.dtype import ScalarType +from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder +from mdio.schemas.v1.dataset_builder import _BuilderState +from mdio.schemas.v1.units import AllUnits +from mdio.schemas.v1.units import LengthUnitEnum +from mdio.schemas.v1.units import LengthUnitModel +from mdio.schemas.v1.variable import VariableMetadata + +from .helpers import validate_builder +from .helpers import validate_coordinate +from .helpers import validate_variable + + +def test_add_coordinate() -> None: + """Test adding coordinates. Check the state transition and validate required parameters.""" + builder = MDIODatasetBuilder("test_dataset") + assert builder._state == _BuilderState.INITIAL + + msg = "Must add at least one dimension before adding coordinates" + with pytest.raises(ValueError, match=msg): + builder.add_coordinate( + "cdp", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32 + ) + + builder.add_dimension("inline", 100) + builder.add_dimension("crossline", 200) + + # Validate required parameters + bad_name = None + with pytest.raises(ValueError, match="'name' must be a non-empty string"): + builder.add_coordinate(bad_name, dimensions=["speed"], data_type=ScalarType.FLOAT32) + with pytest.raises(ValueError, match="'name' must be a non-empty string"): + builder.add_coordinate("", dimensions=["speed"], data_type=ScalarType.FLOAT32) + with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): + builder.add_coordinate("cdp-x", dimensions=None, data_type=ScalarType.FLOAT32) + with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): + builder.add_coordinate("cdp-x", dimensions=[], data_type=ScalarType.FLOAT32) + + # Add a variable using non-existent dimensions + msg = "Pre-existing dimension named 'xline' is not found" + with pytest.raises(ValueError, match=msg): + builder.add_coordinate( + "bad_cdp-x", dimensions=["inline", "xline"], data_type=ScalarType.FLOAT32 + ) + + # Validate state transition + builder.add_coordinate( + "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32 + ) + validate_builder(builder, _BuilderState.HAS_COORDINATES, n_dims=2, n_coords=1, n_var=1) + validate_variable( + builder, + name="cdp-x", + dims=[("inline", 100), ("crossline", 200)], + coords=["cdp-x"], + dtype=ScalarType.FLOAT32, + ) + + # Adding coordinate with the same name twice + msg = "Adding coordinate with the same name twice is not allowed" + with pytest.raises(ValueError, match=msg): + builder.add_coordinate( + "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32 + ) + + +def test_add_coordinate_with_defaults() -> None: + """Test adding coordinates with default arguments.""" + builder = MDIODatasetBuilder("test_dataset") + builder.add_dimension("inline", 100) + builder.add_dimension("crossline", 200) + + # Add coordinate using defaults + builder.add_coordinate("cdp", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) + validate_builder(builder, _BuilderState.HAS_COORDINATES, n_dims=2, n_coords=1, n_var=1) + validate_coordinate( + builder, name="cdp", dims=[("inline", 100), ("crossline", 200)], dtype=ScalarType.FLOAT32 + ) + v = validate_variable( + builder, + name="cdp", + dims=[("inline", 100), ("crossline", 200)], + coords=["cdp"], + dtype=ScalarType.FLOAT32, + ) + assert v.long_name == "'cdp' coordinate variable" # Default value + assert v.compressor is None # Default value + assert v.metadata is None # Default value + + +def test_coordinate_with_full_parameters() -> None: + """Test adding coordinates with all metadata.""" + builder = MDIODatasetBuilder("test_dataset") + builder.add_dimension("inline", 100) + builder.add_dimension("crossline", 200) + + # Add coordinate with all metadata + builder.add_coordinate( + "cdp", + long_name="Common Depth Point", + dimensions=["inline", "crossline"], + data_type=ScalarType.FLOAT16, + compressor=Blosc(algorithm="zstd"), + metadata_info=[ + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)), + UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}), + ], + ) + validate_builder(builder, _BuilderState.HAS_COORDINATES, n_dims=2, n_coords=1, n_var=1) + c = validate_coordinate( + builder, name="cdp", dims=[("inline", 100), ("crossline", 200)], dtype=ScalarType.FLOAT16 + ) + assert c.long_name == "Common Depth Point" + assert isinstance(c.compressor, Blosc) + assert c.compressor.algorithm == "zstd" + assert c.metadata.attributes["MGA"] == 51 + assert c.metadata.attributes["UnitSystem"] == "Imperial" + assert c.metadata.units_v1.length == LengthUnitEnum.FOOT + v = validate_variable( + builder, + name="cdp", + dims=[("inline", 100), ("crossline", 200)], + coords=["cdp"], + dtype=ScalarType.FLOAT16, + ) + assert isinstance(v.compressor, Blosc) + assert v.compressor.algorithm == "zstd" + assert isinstance(v.metadata, VariableMetadata) + assert v.metadata.units_v1.length == LengthUnitEnum.FOOT + assert v.metadata.attributes["MGA"] == 51 + assert v.metadata.attributes["UnitSystem"] == "Imperial" diff --git a/tests/unit/v1/test_dataset_builder_add_dimension.py b/tests/unit/v1/test_dataset_builder_add_dimension.py new file mode 100644 index 000000000..ddcbd745c --- /dev/null +++ b/tests/unit/v1/test_dataset_builder_add_dimension.py @@ -0,0 +1,43 @@ +# ruff: noqa: PLR2004 +# PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable +# The above erroneous warning is generated for every numerical assert. +# Thus, disable it for this file +"""Tests the schema v1 dataset_builder.add_dimension() public API.""" + +import pytest + +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder +from mdio.schemas.v1.dataset_builder import _BuilderState +from mdio.schemas.v1.dataset_builder import _get_named_dimension + +from .helpers import validate_builder + + +def test_add_dimension() -> None: + """Test adding dimension. Check the state transition and validate required parameters.""" + builder = MDIODatasetBuilder("test_dataset") + assert builder._state == _BuilderState.INITIAL + + # Validate required parameters + bad_name = None + with pytest.raises(ValueError, match="'name' must be a non-empty string"): + builder.add_dimension(bad_name, 200) + with pytest.raises(ValueError, match="'name' must be a non-empty string"): + builder.add_dimension("", 200) + + # First dimension should change state to HAS_DIMENSIONS and create a variable + builder.add_dimension("x", 100) + validate_builder(builder, _BuilderState.HAS_DIMENSIONS, n_dims=1, n_coords=0, n_var=0) + assert _get_named_dimension(builder._dimensions, "x", 100) is not None + + # Validate that we can't add a dimension with the same name twice + with pytest.raises( + ValueError, + match="Adding dimension with the same name twice is not allowed", + ): + builder.add_dimension("x", 200) + + # Adding dimension with the same name twice + msg = "Adding dimension with the same name twice is not allowed" + with pytest.raises(ValueError, match=msg): + builder.add_dimension("x", 200) diff --git a/tests/unit/v1/test_dataset_builder_add_variable.py b/tests/unit/v1/test_dataset_builder_add_variable.py new file mode 100644 index 000000000..84abfe3ad --- /dev/null +++ b/tests/unit/v1/test_dataset_builder_add_variable.py @@ -0,0 +1,250 @@ +# ruff: noqa: PLR2004 +# PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable +# The above erroneous warning is generated for every numerical assert. +# Thus, disable it for this file +"""Tests the schema v1 Variable public API.""" + +import pytest + +from mdio.schemas.chunk_grid import RegularChunkGrid +from mdio.schemas.chunk_grid import RegularChunkShape +from mdio.schemas.compressors import Blosc +from mdio.schemas.dtype import ScalarType +from mdio.schemas.metadata import ChunkGridMetadata +from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder +from mdio.schemas.v1.dataset_builder import _BuilderState +from mdio.schemas.v1.stats import CenteredBinHistogram +from mdio.schemas.v1.stats import StatisticsMetadata +from mdio.schemas.v1.stats import SummaryStatistics +from mdio.schemas.v1.units import AllUnits +from mdio.schemas.v1.units import LengthUnitEnum +from mdio.schemas.v1.units import LengthUnitModel +from mdio.schemas.v1.variable import VariableMetadata + +from .helpers import validate_builder +from .helpers import validate_variable + + +def test_add_variable_no_coords() -> None: + """Test adding variable. Check the state transition and validate required parameters..""" + builder = MDIODatasetBuilder("test_dataset") + validate_builder(builder, _BuilderState.INITIAL, n_dims=0, n_coords=0, n_var=0) + + # Validate: Must add at least one dimension before adding variables + msg = "Must add at least one dimension before adding variables" + with pytest.raises(ValueError, match=msg): + builder.add_variable("amplitude", dimensions=["speed"], data_type=ScalarType.FLOAT32) + + # Add dimension before we can add a data variable + builder.add_dimension("inline", 100) + builder.add_dimension("crossline", 200) + builder.add_dimension("depth", 300) + + # Validate: required parameters must be preset + bad_name = None + with pytest.raises(ValueError, match="'name' must be a non-empty string"): + builder.add_variable(bad_name, dimensions=["speed"], data_type=ScalarType.FLOAT32) + with pytest.raises(ValueError, match="'name' must be a non-empty string"): + builder.add_variable("", dimensions=["speed"], data_type=ScalarType.FLOAT32) + with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): + builder.add_variable("bad_amplitude", dimensions=None, data_type=ScalarType.FLOAT32) + with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): + builder.add_variable("bad_amplitude", dimensions=[], data_type=ScalarType.FLOAT32) + + # Validate: Add a variable using non-existent dimensions is not allowed + msg = "Pre-existing dimension named 'il' is not found" + with pytest.raises(ValueError, match=msg): + builder.add_variable( + "bad_amplitude", dimensions=["il", "xl", "depth"], data_type=ScalarType.FLOAT32 + ) + + # Add a variable without coordinates + builder.add_variable( + "amplitude", dimensions=["inline", "crossline", "depth"], data_type=ScalarType.FLOAT32 + ) + validate_builder(builder, _BuilderState.HAS_VARIABLES, n_dims=3, n_coords=0, n_var=1) + validate_variable( + builder, + "amplitude", + dims=[("inline", 100), ("crossline", 200), ("depth", 300)], + coords=None, + dtype=ScalarType.FLOAT32, + ) + + # Validate: adding a variable with the same name twice is not allowed + msg = "Adding variable with the same name twice is not allowed" + with pytest.raises(ValueError, match=msg): + builder.add_variable( + "amplitude", dimensions=["inline", "crossline", "depth"], data_type=ScalarType.FLOAT32 + ) + + +def test_add_variable_with_coords() -> None: + """Test adding variable. Check the state transition and validate required parameters..""" + builder = MDIODatasetBuilder("test_dataset") + builder.add_dimension("inline", 100) + builder.add_dimension("crossline", 200) + builder.add_dimension("depth", 300) + + # Add dimension coordinates before we can add a data variable + builder.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.UINT32) + builder.add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.UINT32) + + # Validate: adding a variable with a coordinate that has not been pre-created is not allowed + msg = "Pre-existing coordinate named 'depth' is not found" + with pytest.raises(ValueError, match=msg): + builder.add_variable( + "ampl", + dimensions=["inline", "crossline", "depth"], + coordinates=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT32, + ) + + # Add a variable with pre-defined dimension coordinates + builder.add_variable( + "ampl", + dimensions=["inline", "crossline", "depth"], + coordinates=["inline", "crossline"], + data_type=ScalarType.FLOAT32, + ) + validate_builder(builder, _BuilderState.HAS_VARIABLES, n_dims=3, n_coords=2, n_var=3) + validate_variable( + builder, + "ampl", + dims=[("inline", 100), ("crossline", 200), ("depth", 300)], + coords=["inline", "crossline"], + dtype=ScalarType.FLOAT32, + ) + + # Add non-dim coordinates (e.g., 2D coordinates) + builder.add_coordinate( + "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32 + ) + builder.add_coordinate( + "cdp-y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32 + ) + + # Add a variable with pre-defined dimension and non-dimension coordinates + builder.add_variable( + "ampl2", + dimensions=["inline", "crossline", "depth"], + coordinates=["inline", "crossline", "cdp-x", "cdp-y"], + data_type=ScalarType.FLOAT32, + ) + validate_builder(builder, _BuilderState.HAS_VARIABLES, n_dims=3, n_coords=4, n_var=6) + validate_variable( + builder, + "ampl2", + dims=[("inline", 100), ("crossline", 200), ("depth", 300)], + coords=["inline", "crossline", "cdp-x", "cdp-y"], + dtype=ScalarType.FLOAT32, + ) + + +def test_add_variable_with_defaults() -> None: + """Test adding variable with default arguments.""" + builder = MDIODatasetBuilder("test_dataset") + # Add dimensions before we can add a data variables + builder.add_dimension("inline", 100) + builder.add_dimension("crossline", 200) + builder.add_dimension("depth", 300) + # Add dimension coordinates + builder.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.UINT32) + builder.add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.UINT32) + builder.add_coordinate( + "depth", + dimensions=["depth"], + data_type=ScalarType.UINT32, + metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))], + ) + + # Add data variable using defaults + builder.add_variable( + "ampl", dimensions=["inline", "crossline", "depth"], data_type=ScalarType.FLOAT32 + ) + validate_builder(builder, _BuilderState.HAS_VARIABLES, n_dims=3, n_coords=3, n_var=4) + v = validate_variable( + builder, + "ampl", + dims=[("inline", 100), ("crossline", 200), ("depth", 300)], + coords=None, + dtype=ScalarType.FLOAT32, + ) + assert v.long_name is None # Default value + assert v.compressor is None # Default value + assert v.coordinates is None # Default value + assert v.metadata is None # Default value + + +def test_add_variable_full_parameters() -> None: + """Test adding variable with full parameters.""" + builder = MDIODatasetBuilder("test_dataset") + # Add dimensions before we can add a data variables + builder.add_dimension("inline", 100) + builder.add_dimension("crossline", 200) + builder.add_dimension("depth", 300) + # Add dimension coordinates + builder.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.UINT32) + builder.add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.UINT32) + builder.add_coordinate("depth", dimensions=["depth"], data_type=ScalarType.UINT32) + # Add coordinates before we can add a data variable + builder.add_coordinate( + "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64 + ) + builder.add_coordinate( + "cdp-y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64 + ) + + # Add data variable with full parameters + builder.add_variable( + "ampl", + long_name="Amplitude (dimensionless)", + dimensions=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT32, + compressor=Blosc(algorithm="zstd"), + coordinates=["inline", "crossline", "depth", "cdp-x", "cdp-y"], + metadata_info=[ + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)), + UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}), + ChunkGridMetadata( + chunk_grid=RegularChunkGrid(configuration=RegularChunkShape(chunk_shape=[20])) + ), + StatisticsMetadata( + stats_v1=SummaryStatistics( + count=100, + sum=1215.1, + sumSquares=125.12, + min=5.61, + max=10.84, + histogram=CenteredBinHistogram(binCenters=[1, 2], counts=[10, 15]), + ) + ), + ], + ) + validate_builder(builder, _BuilderState.HAS_VARIABLES, n_dims=3, n_coords=5, n_var=6) + v = validate_variable( + builder, + "ampl", + dims=[("inline", 100), ("crossline", 200), ("depth", 300)], + coords=["inline", "crossline", "depth", "cdp-x", "cdp-y"], + dtype=ScalarType.FLOAT32, + ) + assert v.long_name == "Amplitude (dimensionless)" + assert isinstance(v.compressor, Blosc) + assert v.compressor.algorithm == "zstd" + assert len(v.coordinates) == 5 + assert v.metadata.stats_v1.count == 100 + assert isinstance(v.metadata, VariableMetadata) + assert v.metadata.units_v1.length == LengthUnitEnum.FOOT + assert v.metadata.attributes["MGA"] == 51 + assert v.metadata.attributes["UnitSystem"] == "Imperial" + assert v.metadata.chunk_grid.name == "regular" + assert v.metadata.chunk_grid.configuration.chunk_shape == [20] + assert v.metadata.stats_v1.count == 100 + assert v.metadata.stats_v1.sum == 1215.1 + assert v.metadata.stats_v1.sum_squares == 125.12 + assert v.metadata.stats_v1.min == 5.61 + assert v.metadata.stats_v1.max == 10.84 + assert v.metadata.stats_v1.histogram.bin_centers == [1, 2] + assert v.metadata.stats_v1.histogram.counts == [10, 15] diff --git a/tests/unit/v1/test_dataset_builder_build.py b/tests/unit/v1/test_dataset_builder_build.py new file mode 100644 index 000000000..aa5fad552 --- /dev/null +++ b/tests/unit/v1/test_dataset_builder_build.py @@ -0,0 +1,155 @@ +# ruff: noqa: PLR2004 +# PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable +# The above erroneous warning is generated for every numerical assert. +# Thus, disable it for this file +"""Tests the schema v1 dataset_builder.add_coordinate() public API.""" + +from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredField +from mdio.schemas.dtype import StructuredType +from mdio.schemas.v1.dataset import Dataset +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder +from mdio.schemas.v1.units import LengthUnitEnum +from mdio.schemas.v1.units import SpeedUnitEnum + +from .helpers import make_campos_3d_dataset +from .helpers import validate_variable + + +def test_build() -> None: + """Test building a complete dataset.""" + dataset = ( + MDIODatasetBuilder("test_dataset") + .add_dimension("inline", 100) + .add_dimension("crossline", 200) + .add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.FLOAT64) + .add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.FLOAT64) + .add_coordinate("x_coord", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) + .add_coordinate("y_coord", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) + .add_variable( + "data", + long_name="Test Data", + dimensions=["inline", "crossline"], + coordinates=["inline", "crossline", "x_coord", "y_coord"], + data_type=ScalarType.FLOAT32, + ) + .build() + ) + + assert isinstance(dataset, Dataset) + assert dataset.metadata.name == "test_dataset" + # 2 dim coord var + 2 non-dim coord var + 1 data variables = 5 variables + assert len(dataset.variables) == 5 + assert next(v for v in dataset.variables if v.name == "inline") is not None + assert next(v for v in dataset.variables if v.name == "crossline") is not None + assert next(v for v in dataset.variables if v.name == "x_coord") is not None + assert next(v for v in dataset.variables if v.name == "y_coord") is not None + assert next(v for v in dataset.variables if v.name == "data") is not None + + +def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50) + """Test building a Campos 3D dataset with multiple variables and attributes.""" + dataset = make_campos_3d_dataset() + + # Verify dataset structure + assert dataset.metadata.name == "campos_3d" + assert dataset.metadata.api_version == "1.0.0a1" + assert dataset.metadata.attributes["foo"] == "bar" + assert len(dataset.metadata.attributes["textHeader"]) == 3 + + # Verify variables (including dimension variables) + # 3 dimension variables + 4 data variables + 2 coordinate variables + assert len(dataset.variables) == 9 + + # Verify dimension coordinate variables + validate_variable( + dataset, name="inline", dims=[("inline", 256)], coords=["inline"], dtype=ScalarType.UINT32 + ) + + validate_variable( + dataset, + name="crossline", + dims=[("crossline", 512)], + coords=["crossline"], + dtype=ScalarType.UINT32, + ) + + depth = validate_variable( + dataset, name="depth", dims=[("depth", 384)], coords=["depth"], dtype=ScalarType.FLOAT64 + ) + assert depth.metadata.units_v1.length == LengthUnitEnum.METER + + # Verify coordinate variables + cdp_x = validate_variable( + dataset, + name="cdp-x", + dims=[("inline", 256), ("crossline", 512)], + coords=["cdp-x"], + dtype=ScalarType.FLOAT32, + ) + assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER + + cdp_y = validate_variable( + dataset, + name="cdp-y", + dims=[("inline", 256), ("crossline", 512)], + coords=["cdp-y"], + dtype=ScalarType.FLOAT32, + ) + assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER + + # Verify data variables + image = validate_variable( + dataset, + name="image", + dims=[("inline", 256), ("crossline", 512), ("depth", 384)], + coords=["cdp-x", "cdp-y"], + dtype=ScalarType.FLOAT32, + ) + assert image.metadata.units_v1 is None # No units defined for image + assert image.compressor.algorithm == "zstd" + assert image.metadata.chunk_grid.configuration.chunk_shape == [128, 128, 128] + assert image.metadata.stats_v1.count == 100 + + velocity = validate_variable( + dataset, + name="velocity", + dims=[("inline", 256), ("crossline", 512), ("depth", 384)], + coords=["cdp-x", "cdp-y"], + dtype=ScalarType.FLOAT16, + ) + assert velocity.compressor is None + assert velocity.metadata.chunk_grid.configuration.chunk_shape == [128, 128, 128] + assert velocity.metadata.units_v1.speed == SpeedUnitEnum.METER_PER_SECOND + + image_inline = validate_variable( + dataset, + name="image_inline", + dims=[("inline", 256), ("crossline", 512), ("depth", 384)], + coords=["cdp-x", "cdp-y"], + dtype=ScalarType.FLOAT32, + ) + assert image_inline.long_name == "inline optimized version of 3d_stack" + assert image_inline.compressor.algorithm == "zstd" + assert image_inline.metadata.chunk_grid.configuration.chunk_shape == [4, 512, 512] + + # Verify image_headers variable + headers = next(v for v in dataset.variables if v.name == "image_headers") + assert isinstance(headers.data_type, StructuredType) + assert len(headers.data_type.fields) == 4 + assert headers.data_type.fields[0].name == "cdp-x" + + headers = validate_variable( + dataset, + name="image_headers", + dims=[("inline", 256), ("crossline", 512)], + coords=["cdp-x", "cdp-y"], + dtype=StructuredType( + fields=[ + StructuredField(name="cdp-x", format=ScalarType.FLOAT32), + StructuredField(name="cdp-y", format=ScalarType.FLOAT32), + StructuredField(name="inline", format=ScalarType.UINT32), + StructuredField(name="crossline", format=ScalarType.UINT32), + ] + ), + ) diff --git a/tests/unit/v1/test_dataset_builder_helpers.py b/tests/unit/v1/test_dataset_builder_helpers.py new file mode 100644 index 000000000..b1ab99647 --- /dev/null +++ b/tests/unit/v1/test_dataset_builder_helpers.py @@ -0,0 +1,98 @@ +# ruff: noqa: PLR2004 +# PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable +# The above erroneous warning is generated for every numerical assert. +# Thus, disable it for this file +"""Tests the schema v1 dataset_builder internal methods.""" + +from datetime import UTC +from datetime import datetime + +import pytest +from pydantic import Field + +from mdio.schemas.core import StrictModel +from mdio.schemas.dimension import NamedDimension +from mdio.schemas.v1.dataset_builder import _get_named_dimension +from mdio.schemas.v1.dataset_builder import _to_dictionary + + +def test__get_named_dimension() -> None: + """Test getting a dimension by name from the list of dimensions.""" + dimensions = [NamedDimension(name="inline", size=2), NamedDimension(name="crossline", size=3)] + + assert _get_named_dimension([], "inline") is None + assert _get_named_dimension(dimensions, "inline") == NamedDimension(name="inline", size=2) + assert _get_named_dimension(dimensions, "crossline") == NamedDimension(name="crossline", size=3) + assert _get_named_dimension(dimensions, "time") is None + + with pytest.raises(TypeError, match="Expected str, got NoneType"): + _get_named_dimension(dimensions, None) + with pytest.raises(TypeError, match="Expected str, got int"): + _get_named_dimension(dimensions, 42) + with pytest.raises( + ValueError, match="Dimension 'inline' found but size 2 does not match expected size 200" + ): + _get_named_dimension(dimensions, "inline", size=200) + + +def test__to_dictionary() -> None: + """Test converting a dictionary, list or pydantic BaseModel to a dictionary.""" + # Validate inputs + with pytest.raises(TypeError, match="Expected BaseModel, dict or list, got datetime"): + _to_dictionary(datetime.now(UTC)) + + # Convert None to None + result = _to_dictionary(None) + assert result is None + + # Validate conversion of a Pydantic BaseModel + class SomeModel(StrictModel): + count: int = Field(default=None, description="Samples count") + samples: list[float] = Field(default_factory=list, description="Samples.") + created: datetime = Field( + default_factory=datetime.now, description="Creation time with TZ info." + ) + + md = SomeModel( + count=3, samples=[1.0, 2.0, 3.0], created=datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC) + ) + result = _to_dictionary(md) + assert isinstance(result, dict) + assert result == {"count": 3, "created": "2023-10-01T12:00:00Z", "samples": [1.0, 2.0, 3.0]} + + # Validate conversion of a dictionary + dct = { + "count": 3, + "samples": [1.0, 2.0, 3.0], + "created": datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC), + } + result = _to_dictionary(dct) + assert isinstance(result, dict) + assert result == { + "count": 3, + "samples": [1.0, 2.0, 3.0], + "created": datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC), + } + + # Validate conversion of a dictionary + lst = [ + None, + SomeModel( + count=3, samples=[1.0, 2.0, 3.0], created=datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC) + ), + { + "count2": 3, + "samples2": [1.0, 2.0, 3.0], + "created2": datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC), + }, + ] + result = _to_dictionary(lst) + assert isinstance(result, dict) + assert result == { + "count": 3, + "samples": [1.0, 2.0, 3.0], + "created": "2023-10-01T12:00:00Z", + "count2": 3, + "samples2": [1.0, 2.0, 3.0], + "created2": datetime(2023, 10, 1, 12, 0, 0, tzinfo=UTC), + } From 4c7c8337f16d3d1ee5602f54df66a3fcc0dc1581 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Thu, 10 Jul 2025 23:34:39 +0000 Subject: [PATCH 40/56] Writing XArray / Zarr --- _dev/DEVELOPERS_NOTES.md | 10 + _dev/zmetadata.cpp.json | 294 ++++++++++++++++++ _dev/zmetadata.python.json | 282 +++++++++++++++++ src/mdio/schemas/v1/dataset_builder.py | 2 +- src/mdio/schemas/v1/dataset_serializer.py | 224 +++++++++++++ tests/unit/v1/helpers.py | 122 ++++++++ .../v1/test_dataset_builder_add_coordinate.py | 2 +- .../v1/test_dataset_builder_add_variable.py | 2 +- tests/unit/v1/test_dataset_builder_build.py | 2 +- tests/unit/v1/test_dataset_serializer.py | 60 ++++ 10 files changed, 996 insertions(+), 4 deletions(-) create mode 100644 _dev/DEVELOPERS_NOTES.md create mode 100644 _dev/zmetadata.cpp.json create mode 100644 _dev/zmetadata.python.json create mode 100644 src/mdio/schemas/v1/dataset_serializer.py create mode 100644 tests/unit/v1/test_dataset_serializer.py diff --git a/_dev/DEVELOPERS_NOTES.md b/_dev/DEVELOPERS_NOTES.md new file mode 100644 index 000000000..2e4718a4b --- /dev/null +++ b/_dev/DEVELOPERS_NOTES.md @@ -0,0 +1,10 @@ +# Wring empty XArray / Zarr to a local storage + +src/mdio/schemas/v1/dataset_serializer.py + +## Issues encountered + +1. Non-zero size of the serialized data files +2. Not clear how to properly set `compressor`, `dimension_separator`, and `fill_value` + * Should `fill_value` be a part f the model? +3. For image_inline chunks[2] are somehow different? \ No newline at end of file diff --git a/_dev/zmetadata.cpp.json b/_dev/zmetadata.cpp.json new file mode 100644 index 000000000..40a12d6de --- /dev/null +++ b/_dev/zmetadata.cpp.json @@ -0,0 +1,294 @@ +{ + "metadata": { + ".zattrs": { + "apiVersion": "1.0.0", + "attributes": { + "foo": "bar", + "textHeader": [ + "C01 .......................... ", + "C02 .......................... ", + "C03 .......................... " + ] + }, + "createdOn": "2023-12-12T15:02:06.413469-06:00", + "name": "campos_3d" + }, + ".zgroup": { + "zarr_format": 2 + }, + "cdp-x/.zarray": { + "chunks": [ + 256, + 512 + ], + "compressor": null, + "dimension_separator": "/", + "dtype": " dict[str, NamedDimension]: + all_named_dims: dict[str, NamedDimension] = {} + for v in dataset.variables: + if v.dimensions is not None: + for d in v.dimensions: + if isinstance(d, NamedDimension): + all_named_dims[d.name] = d + else: + # Skip, if this is a named reference + # This should not be ever a case for the dataset generated with the dataset builder + warnings.warn( + f"Unsupported dimension type: {type(d)} in variable {v.name}. " + "Expected NamedDimension." + ) + pass + return all_named_dims + +def _get_all_coordinates(dataset: Dataset) -> dict[str, Coordinate]: + all_coords: dict[str, Coordinate] = {} + for v in dataset.variables: + if v.coordinates is not None: + for c in v.coordinates: + if isinstance(c, Coordinate) and c.name not in all_coords: + all_coords[c.name] = c + return all_coords + +def _get_dimension_names(var: Variable) -> list[str]: + dim_names: list[str] = [] + if var.dimensions is not None: + for d in var.dimensions: + if isinstance(d, NamedDimension): + dim_names.append(d.name) + elif isinstance(d, str): + # This should not be ever a case for the dataset generated with the dataset builder + warnings.warn(f"Unsupported dimension type: 'str' in variable {var.name}. " + "Expected NamedDimension." + ) + dim_names.append(d) + else: + err = f"Unsupported dimension type: {type(d)} in variable {var.name}" + raise TypeError(err) + return dim_names + +def _get_coord_names(var: Variable) -> list[str]: + coord_names: list[str] = [] + if var.coordinates is not None: + for c in var.coordinates: + if isinstance(c, Coordinate): + coord_names.append(c.name) + elif isinstance(c, str): + coord_names.append(c) + else: + err = f"Unsupported coordinate type: {type(c)} in variable {var.name}" + raise TypeError(err) + return coord_names + +def _get_np_datatype(var: Variable) -> np.dtype: + data_type = var.data_type + if isinstance(data_type, ScalarType): + return np.dtype(data_type.value) + elif isinstance(data_type, StructuredType): + return np.dtype([(f.name, f.format.value) for f in data_type.fields]) + else: + raise TypeError(f"Unsupported data_type: {data_type}") + +def _get_zarr_shape(var: Variable) -> tuple[int, ...]: + # NOTE: This assumes that the variable dimensions are all NamedDimension + return tuple(dim.size for dim in var.dimensions) + +def _get_zarr_chunks(var: Variable) -> tuple[int, ...]: + """Get the chunk shape for a variable, defaulting to its shape if no chunk grid is defined.""" + if var.metadata is not None and var.metadata.chunk_grid is not None: + return var.metadata.chunk_grid.configuration.chunk_shape + else: + # Default to full shape if no chunk grid is defined + return _get_zarr_shape(var) + +def to_xarray_dataset(ds: Dataset) -> xr.DataArray: # noqa: PLR0912 + """Build an MDIO dataset with correct dimensions and dtypes. + + This internal function constructs the underlying data structure for an MDIO dataset, + handling dimension mapping, data types, and metadata organization. + + Args: + mdio_ds: The source MDIO dataset to construct from. + + Returns: + The constructed dataset with proper MDIO structure and metadata. + + Raises: + TypeError: If an unsupported data type is encountered. + """ + + # See the xarray tutorial for more details on how to create datasets: + # https://tutorial.xarray.dev/fundamentals/01.1_creating_data_structures.html + + # all_dims = _get_all_named_dimensions(ds) + # all_coords = _get_all_coordinates(ds) + + # Build all variables + data_arrays: dict[str, xr.DataArray] = {} + for v in ds.variables: + + # Use dask array instead of numpy array for lazy evaluation + shape = _get_zarr_shape(v) + dtype = _get_np_datatype(v) + chunks = _get_zarr_chunks(v) + arr = dask.array.zeros(shape, dtype=dtype, chunks=chunks) + + # Create a DataArray for the variable. We will set coords in the second pass + dim_names = _get_dimension_names(v) + data_array = xr.DataArray(arr, dims=dim_names) + + # https://docs.xarray.dev/en/stable/internals/zarr-encoding-spec.html#zarr-encoding + # If you don't explicitly specify a compressor when creating a Zarr array, Z + # arr will use a default compressor based on the Zarr format version and the data type of your array. + # Zarr V2 (Default is Blosc) + # data_array.encoding.compressor = None + #TODO: beging the par that does not work + data_array.encoding["fill_value"] = 0.0 + data_array.encoding["dimension_separator"] = "/" # Does not work + if v.compressor is not None: + compressor = _to_dictionary(v.compressor) + data_array.encoding["compressor"] = compressor + else: + data_array.encoding["compressor"] = None + #TODO: end the part that does not work + + # Add array attributes + if v.metadata is not None: + meta_dict = _to_dictionary(v.metadata) + # Exclude chunk_grid + del meta_dict["chunkGrid"] + # Remove empty attributes + meta_dict = {k: v for k, v in meta_dict.items() if v is not None} + # Add metadata to the data array attributes + data_array.attrs.update(meta_dict) + pass + if v.long_name: + data_array.attrs["long_name"] = v.long_name + + # Let's store the data array for the second pass + data_arrays[v.name] = data_array + + # Add non-dimension coordinates to the data arrays + for v in ds.variables: + da = data_arrays[v.name] + non_dim_coords_names = set(_get_coord_names(v)) - set(_get_dimension_names(v)) - {v.name} + # Create a populate a dictionary {coord_name: DataArray for the coordinate} + non_dim_coords_dict : dict[str, xr.DataArray] = {} + for name in non_dim_coords_names: + non_dim_coords_dict[name] = data_arrays[name] + if non_dim_coords_dict: + # NOTE: here is a gotcha: assign_coords() does not update in-place, + # but returns an updated instance! + data_arrays[v.name] = da.assign_coords(non_dim_coords_dict) + pass + + # Now let's create a dataset with all data arrays + xr_ds = xr.Dataset(data_arrays) + # Attach dataset metadata + if ds.metadata is not None: + xr_ds.attrs["apiVersion"] = ds.metadata.api_version + xr_ds.attrs["createdOn"] = str(ds.metadata.created_on) + xr_ds.attrs["name"] = ds.metadata.name + if ds.metadata.attributes: + xr_ds.attrs["attributes"] = ds.metadata.attributes + + return xr_ds + + +def to_zarr(dataset: xr.Dataset, + store: str | None = None, + *args: str | int | float | bool, + **kwargs: Mapping[str, str | int | float | bool], +) -> None: + """Alias for `.to_zarr()`.""" + # Ensure zarr_format=2 by default unless explicitly overridden + zarr_format = kwargs.get("zarr_format", 2) + if zarr_format != 2: # noqa: PLR2004 + msg = "MDIO only supports zarr_format=2" + raise ValueError(msg) + + # ds.to_zarr("foo.zarr", consolidated=False, encoding={"foo": {"compressors": [compressor]}}) + # Define compressor + # compressor = zarr.Blosc(cname="zstd", clevel=5, shuffle=2) + # # Define encoding + # encoding = { + # "foo": {"compressor": compressor}, + # "bar": {"compressor": compressor}, + # } + # kwargs["encoding"] = encoding + encoding = {} + for key in dataset.data_vars.keys(): + c = dataset[key].encoding.get("compressors", None) + encoding[key] = {"compressors": c} + kwargs["encoding"] = encoding + + kwargs["zarr_format"] = zarr_format + + + + + return dataset.to_zarr(*args, store=store, **kwargs) + +# https://docs.xarray.dev/en/stable/user-guide/io.html +# ds.to_zarr("path/to/directory.zarr", zarr_format=2, consolidated=False) \ No newline at end of file diff --git a/tests/unit/v1/helpers.py b/tests/unit/v1/helpers.py index 2058bdd54..8a01a9663 100644 --- a/tests/unit/v1/helpers.py +++ b/tests/unit/v1/helpers.py @@ -138,6 +138,128 @@ def _get_all_coordinates(dataset: Dataset) -> list[Coordinate]: return list(all_coords.values()) +def make_campos_3d_acceptance_dataset() -> Dataset: + """Create in-memory campos_3d dataset.""" + ds = MDIODatasetBuilder( + "campos_3d", + attributes=UserAttributes( + attributes={ + "textHeader": [ + "C01 .......................... ", + "C02 .......................... ", + "C03 .......................... ", + ], + "foo": "bar", + } + ), + ) + + # Add dimensions + ds.add_dimension("inline", 256) + ds.add_dimension("crossline", 512) + ds.add_dimension("depth", 384) # data_type=ScalarType.UINT32, LengthUnitEnum.METER + ds.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.UINT32) + ds.add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.UINT32) + ds.add_coordinate( + "depth", + dimensions=["depth"], + data_type=ScalarType.UINT32, + metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))], + ) + # Add coordinates + ds.add_coordinate( + "cdp-x", + dimensions=["inline", "crossline"], + data_type=ScalarType.FLOAT32, + metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))], + ) + ds.add_coordinate( + "cdp-y", + dimensions=["inline", "crossline"], + data_type=ScalarType.FLOAT32, + metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))], + ) + + # Add image variable + ds.add_variable( + name="image", + dimensions=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT32, + compressor=Blosc(algorithm="zstd"), + coordinates=["cdp-x", "cdp-y"], + metadata_info=[ + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape(chunk_shape=[128, 128, 128]) + ) + ), + StatisticsMetadata( + stats_v1=SummaryStatistics( + count=100, + sum=1215.1, + sumSquares=125.12, + min=5.61, + max=10.84, + histogram=CenteredBinHistogram(binCenters=[1, 2], counts=[10, 15]), + ) + ), + UserAttributes(attributes={"fizz": "buzz"}), + ], + ) + # Add velocity variable + ds.add_variable( + name="velocity", + dimensions=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT16, + coordinates=["cdp-x", "cdp-y"], + metadata_info=[ + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape(chunk_shape=[128, 128, 128]) + ) + ), + AllUnits(units_v1=SpeedUnitModel(speed=SpeedUnitEnum.METER_PER_SECOND)), + ], + ) + # Add inline-optimized image variable + ds.add_variable( + name="image_inline", + long_name="inline optimized version of 3d_stack", + dimensions=["inline", "crossline", "depth"], + data_type=ScalarType.FLOAT32, + compressor=Blosc(algorithm="zstd"), + coordinates=["cdp-x", "cdp-y"], + metadata_info=[ + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape(chunk_shape=[4, 512, 512]) + ) + ) + ], + ) + # Add headers variable with structured dtype + ds.add_variable( + name="image_headers", + dimensions=["inline", "crossline"], + data_type=StructuredType( + fields=[ + StructuredField(name="cdp-x", format=ScalarType.INT32), + StructuredField(name="cdp-y", format=ScalarType.INT32), + StructuredField(name="elevation", format=ScalarType.FLOAT16), + StructuredField(name="some_scalar", format=ScalarType.FLOAT16), + ] + ), + metadata_info=[ + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape(chunk_shape=[128, 128]) + ) + ) + ], + coordinates=["cdp-x", "cdp-y"], + ) + return ds.build() + def make_campos_3d_dataset() -> Dataset: """Create in-memory campos_3d dataset.""" ds = MDIODatasetBuilder( diff --git a/tests/unit/v1/test_dataset_builder_add_coordinate.py b/tests/unit/v1/test_dataset_builder_add_coordinate.py index 46cb27cd1..20f686024 100644 --- a/tests/unit/v1/test_dataset_builder_add_coordinate.py +++ b/tests/unit/v1/test_dataset_builder_add_coordinate.py @@ -93,7 +93,7 @@ def test_add_coordinate_with_defaults() -> None: coords=["cdp"], dtype=ScalarType.FLOAT32, ) - assert v.long_name == "'cdp' coordinate variable" # Default value + assert v.long_name is None # Default value assert v.compressor is None # Default value assert v.metadata is None # Default value diff --git a/tests/unit/v1/test_dataset_builder_add_variable.py b/tests/unit/v1/test_dataset_builder_add_variable.py index 84abfe3ad..6f46db501 100644 --- a/tests/unit/v1/test_dataset_builder_add_variable.py +++ b/tests/unit/v1/test_dataset_builder_add_variable.py @@ -2,7 +2,7 @@ # PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable # The above erroneous warning is generated for every numerical assert. # Thus, disable it for this file -"""Tests the schema v1 Variable public API.""" +"""Tests the schema v1 dataset_builder.add_variable() public API.""" import pytest diff --git a/tests/unit/v1/test_dataset_builder_build.py b/tests/unit/v1/test_dataset_builder_build.py index aa5fad552..832f624c1 100644 --- a/tests/unit/v1/test_dataset_builder_build.py +++ b/tests/unit/v1/test_dataset_builder_build.py @@ -2,7 +2,7 @@ # PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable # The above erroneous warning is generated for every numerical assert. # Thus, disable it for this file -"""Tests the schema v1 dataset_builder.add_coordinate() public API.""" +"""Tests the schema v1 dataset_builder.build() public API.""" from mdio.schemas.dtype import ScalarType from mdio.schemas.dtype import StructuredField diff --git a/tests/unit/v1/test_dataset_serializer.py b/tests/unit/v1/test_dataset_serializer.py new file mode 100644 index 000000000..ddd43563a --- /dev/null +++ b/tests/unit/v1/test_dataset_serializer.py @@ -0,0 +1,60 @@ +# ruff: noqa: PLR2004 +# PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable +# The above erroneous warning is generated for every numerical assert. +# Thus, disable it for this file +"""Tests the schema v1 dataset_serializer public API.""" + +import dask +import xarray as xr +import numpy as np + +from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredField +from mdio.schemas.dtype import StructuredType +from mdio.schemas.v1.dataset import Dataset +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder +from mdio.schemas.v1.dataset_serializer import to_xarray_dataset, to_zarr +from mdio.schemas.v1.units import LengthUnitEnum +from mdio.schemas.v1.units import SpeedUnitEnum + +from .helpers import make_campos_3d_acceptance_dataset, make_campos_3d_dataset +from .helpers import validate_variable + + +# def test_to_xarray_dataset(capsys) -> None: +# """Test building a complete dataset.""" +# dataset = ( +# MDIODatasetBuilder("test_dataset") +# .add_dimension("inline", 100) +# .add_dimension("crossline", 200) +# .add_dimension("depth", 300) +# .add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.FLOAT64) +# .add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.FLOAT64) +# .add_coordinate("x_coord", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) +# .add_coordinate("y_coord", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) +# .add_variable( +# "data", +# long_name="Test Data", +# dimensions=["inline", "crossline", "depth"], +# coordinates=["inline", "crossline", "x_coord", "y_coord"], +# data_type=ScalarType.FLOAT32, +# ) +# .build() +# ) + +# # with capsys.disabled(): +# xds : xr.Dataset = to_xarray_dataset(dataset) + +# to_zarr(xds, f"test-dataset-{xds.attrs["name"]}.zarr", mode="w") + + +def test_campos_3d_acceptance_to_xarray_dataset(capsys) -> None: + """Test building a complete dataset.""" + dataset = make_campos_3d_acceptance_dataset() + + + xds : xr.Dataset = to_xarray_dataset(dataset) + + # file_name = "XYZ" + file_name = f"{xds.attrs['name']}" + to_zarr(xds, f"test-data/{file_name}.zarr", mode="w") \ No newline at end of file From 4b39ffa844367df72e6f9ef2facb4dcd5ea701f0 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Thu, 10 Jul 2025 23:37:17 +0000 Subject: [PATCH 41/56] gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index bfdc38f28..643394a40 100644 --- a/.gitignore +++ b/.gitignore @@ -153,3 +153,5 @@ mdio1/* pytest-of-* tmp debugging/* + +test-data/* From cea73086ec1754dfc2a87fc0b768f42767e306b8 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Fri, 11 Jul 2025 20:13:09 +0000 Subject: [PATCH 42/56] to_zarr() fix compression --- _dev/DEVELOPERS_NOTES.md | 13 +- _dev/zmetadata.cpp.json | 483 +++++++++------------- _dev/zmetadata.python.json | 473 +++++++++------------ src/mdio/schemas/v1/dataset_serializer.py | 248 +++++++---- tests/unit/v1/helpers.py | 7 +- tests/unit/v1/test_dataset_serializer.py | 75 ++-- 6 files changed, 592 insertions(+), 707 deletions(-) diff --git a/_dev/DEVELOPERS_NOTES.md b/_dev/DEVELOPERS_NOTES.md index 2e4718a4b..8c575025a 100644 --- a/_dev/DEVELOPERS_NOTES.md +++ b/_dev/DEVELOPERS_NOTES.md @@ -4,7 +4,12 @@ src/mdio/schemas/v1/dataset_serializer.py ## Issues encountered -1. Non-zero size of the serialized data files -2. Not clear how to properly set `compressor`, `dimension_separator`, and `fill_value` - * Should `fill_value` be a part f the model? -3. For image_inline chunks[2] are somehow different? \ No newline at end of file +1. FIXED: Non-zero size of the serialized data files +2. FIXED: Not clear how to properly set `compressor`, `dimension_separator`, and `fill_value` +3. FIXED: For image_inline chunks[2] are somehow different? + +4. `fill_value` for StructuredType is set to null, but "AAAAAAAAAAAAAAAA" is expected + +## TO DO: +* Add more unit tests for internal functions +* Add a trest comparing expected and actual .zmetadata for the serialized dataset diff --git a/_dev/zmetadata.cpp.json b/_dev/zmetadata.cpp.json index 40a12d6de..394de1a8f 100644 --- a/_dev/zmetadata.cpp.json +++ b/_dev/zmetadata.cpp.json @@ -1,294 +1,195 @@ { - "metadata": { - ".zattrs": { - "apiVersion": "1.0.0", - "attributes": { - "foo": "bar", - "textHeader": [ - "C01 .......................... ", - "C02 .......................... ", - "C03 .......................... " - ] - }, - "createdOn": "2023-12-12T15:02:06.413469-06:00", - "name": "campos_3d" - }, - ".zgroup": { - "zarr_format": 2 - }, - "cdp-x/.zarray": { - "chunks": [ - 256, - 512 - ], - "compressor": null, - "dimension_separator": "/", - "dtype": " dict[str, NamedDimension]: f"Unsupported dimension type: {type(d)} in variable {v.name}. " "Expected NamedDimension." ) - pass return all_named_dims + def _get_all_coordinates(dataset: Dataset) -> dict[str, Coordinate]: all_coords: dict[str, Coordinate] = {} for v in dataset.variables: @@ -41,6 +53,7 @@ def _get_all_coordinates(dataset: Dataset) -> dict[str, Coordinate]: all_coords[c.name] = c return all_coords + def _get_dimension_names(var: Variable) -> list[str]: dim_names: list[str] = [] if var.dimensions is not None: @@ -49,15 +62,17 @@ def _get_dimension_names(var: Variable) -> list[str]: dim_names.append(d.name) elif isinstance(d, str): # This should not be ever a case for the dataset generated with the dataset builder - warnings.warn(f"Unsupported dimension type: 'str' in variable {var.name}. " - "Expected NamedDimension." - ) + warnings.warn( + f"Unsupported dimension type: 'str' in variable {var.name}. " + "Expected NamedDimension." + ) dim_names.append(d) else: err = f"Unsupported dimension type: {type(d)} in variable {var.name}" raise TypeError(err) return dim_names - + + def _get_coord_names(var: Variable) -> list[str]: coord_names: list[str] = [] if var.coordinates is not None: @@ -71,31 +86,99 @@ def _get_coord_names(var: Variable) -> list[str]: raise TypeError(err) return coord_names + def _get_np_datatype(var: Variable) -> np.dtype: data_type = var.data_type if isinstance(data_type, ScalarType): return np.dtype(data_type.value) - elif isinstance(data_type, StructuredType): + if isinstance(data_type, StructuredType): return np.dtype([(f.name, f.format.value) for f in data_type.fields]) - else: - raise TypeError(f"Unsupported data_type: {data_type}") + raise TypeError(f"Unsupported data_type: {data_type}") + def _get_zarr_shape(var: Variable) -> tuple[int, ...]: # NOTE: This assumes that the variable dimensions are all NamedDimension return tuple(dim.size for dim in var.dimensions) + def _get_zarr_chunks(var: Variable) -> tuple[int, ...]: """Get the chunk shape for a variable, defaulting to its shape if no chunk grid is defined.""" if var.metadata is not None and var.metadata.chunk_grid is not None: return var.metadata.chunk_grid.configuration.chunk_shape - else: - # Default to full shape if no chunk grid is defined - return _get_zarr_shape(var) + # Default to full shape if no chunk grid is defined + return _get_zarr_shape(var) + + +def _convert_compressor( + compressor: mdio_Blosc | mdio_ZFP | None, +) -> numcodecs.Blosc | zfpy_ZFPY | None: + """Convert a compressor to a numcodecs compatible format.""" + if compressor is None: + return None + + if isinstance(compressor, mdio_Blosc): + return numcodecs.Blosc( + cname=compressor.algorithm.value, + clevel=compressor.level, + shuffle=compressor.shuffle.value, + blocksize=compressor.blocksize if compressor.blocksize > 0 else 0, + ) + + if isinstance(compressor, mdio_ZFP): + if zfpy_ZFPY is None: + msg = "zfpy and numcodecs are required to use ZFP compression" + raise ImportError(msg) + return zfpy_ZFPY( + mode=compressor.mode.value, + tolerance=compressor.tolerance, + rate=compressor.rate, + precision=compressor.precision, + ) + + msg = f"Unsupported compressor model: {type(compressor)}" + raise TypeError(msg) + + +# Do we already have it somewhere in the codebase? I could not find it. +fill_value_map = { + ScalarType.BOOL: None, + ScalarType.FLOAT16: np.nan, + ScalarType.FLOAT32: np.nan, + ScalarType.FLOAT64: np.nan, + ScalarType.UINT8: 2**8 - 1, # Max value for uint8 + ScalarType.UINT16: 2**16 - 1, # Max value for uint16 + ScalarType.UINT32: 2**32 - 1, # Max value for uint32 + ScalarType.UINT64: 2**64 - 1, # Max value for uint64 + ScalarType.INT8: 2**7 - 1, # Max value for int8 + ScalarType.INT16: 2**15 - 1, # Max value for int16 + ScalarType.INT32: 2**31 - 1, # Max value for int32 + ScalarType.INT64: 2**63 - 1, # Max value for int64 + ScalarType.COMPLEX64: complex(np.nan, np.nan), + ScalarType.COMPLEX128: complex(np.nan, np.nan), + ScalarType.COMPLEX256: complex(np.nan, np.nan), +} + + +def get_fill_value(data_type: ScalarType | StructuredType | str) -> any: + """Get the fill value for a given data type. + The Zarr fill_value is a scalar value providing the default value to use for + uninitialized portions of the array, or null if no fill_value is to be used + https://zarr-specs.readthedocs.io/en/latest/v2/v2.0.html + """ + if isinstance(data_type, ScalarType): + return fill_value_map.get(data_type) + if isinstance(data_type, StructuredType): + return "AAAAAAAAAAAAAAAA" # BUG: this does not work!!! + if isinstance(data_type, str): + return "" + # If we do not have a fill value for this type, use None + return None + -def to_xarray_dataset(ds: Dataset) -> xr.DataArray: # noqa: PLR0912 - """Build an MDIO dataset with correct dimensions and dtypes. +def to_xarray_dataset(mdio_ds: Dataset) -> xr.DataArray: # noqa: PLR0912 + """Build an XArray dataset with correct dimensions and dtypes. - This internal function constructs the underlying data structure for an MDIO dataset, + This function constructs the underlying data structure for an XArray dataset, handling dimension mapping, data types, and metadata organization. Args: @@ -107,17 +190,15 @@ def to_xarray_dataset(ds: Dataset) -> xr.DataArray: # noqa: PLR0912 Raises: TypeError: If an unsupported data type is encountered. """ - # See the xarray tutorial for more details on how to create datasets: - # https://tutorial.xarray.dev/fundamentals/01.1_creating_data_structures.html + # https://tutorial.xarray.dev/fundamentals/01.1_creating_data_structures.html # all_dims = _get_all_named_dimensions(ds) # all_coords = _get_all_coordinates(ds) - # Build all variables + # First pass: Build all variables data_arrays: dict[str, xr.DataArray] = {} - for v in ds.variables: - + for v in mdio_ds.variables: # Use dask array instead of numpy array for lazy evaluation shape = _get_zarr_shape(v) dtype = _get_np_datatype(v) @@ -126,99 +207,92 @@ def to_xarray_dataset(ds: Dataset) -> xr.DataArray: # noqa: PLR0912 # Create a DataArray for the variable. We will set coords in the second pass dim_names = _get_dimension_names(v) - data_array = xr.DataArray(arr, dims=dim_names) - - # https://docs.xarray.dev/en/stable/internals/zarr-encoding-spec.html#zarr-encoding - # If you don't explicitly specify a compressor when creating a Zarr array, Z - # arr will use a default compressor based on the Zarr format version and the data type of your array. - # Zarr V2 (Default is Blosc) - # data_array.encoding.compressor = None - #TODO: beging the par that does not work - data_array.encoding["fill_value"] = 0.0 - data_array.encoding["dimension_separator"] = "/" # Does not work - if v.compressor is not None: - compressor = _to_dictionary(v.compressor) - data_array.encoding["compressor"] = compressor - else: - data_array.encoding["compressor"] = None - #TODO: end the part that does not work + data_array = xr.DataArray(arr, dims=dim_names) # Add array attributes if v.metadata is not None: meta_dict = _to_dictionary(v.metadata) # Exclude chunk_grid - del meta_dict["chunkGrid"] + del meta_dict["chunkGrid"] # Remove empty attributes meta_dict = {k: v for k, v in meta_dict.items() if v is not None} # Add metadata to the data array attributes data_array.attrs.update(meta_dict) - pass if v.long_name: data_array.attrs["long_name"] = v.long_name + # Compression: + # https://docs.xarray.dev/en/stable/internals/zarr-encoding-spec.html#zarr-encoding + # If you don't explicitly specify a compressor when creating a Zarr array, Z + # arr will use a default compressor based on the Zarr format version and the data type of your array. + # Zarr V2 (Default is Blosc). + # Thus, if there is no compressor, we will explicitly set "compressor" to None. + # + # Create a custom chunk key encoding with "/" as separator + from zarr.core.chunk_key_encodings import V2ChunkKeyEncoding + chunk_key_encoding = V2ChunkKeyEncoding(separator="/").to_dict() + encoding = { + "fill_value": get_fill_value(v.data_type), + "chunks": chunks, + "chunk_key_encoding": chunk_key_encoding, + # I was hoping the following would work, but it does not. + # I see: + # >_compressor = parse_compressor(compressor[0]) + # > return numcodecs.get_codec(data) + # E - numcodecs.errors.UnknownCodecError: codec not available: 'None'" + # Example: https://zarr.readthedocs.io/en/stable/user-guide/arrays.html#compressors + # from zarr.codecs import BloscCodec + # compressor = BloscCodec(cname="zstd", clevel=3, shuffle="shuffle") + # + # "compressor": _to_dictionary(v.compressor) + # Thus, we will call the conversion function: + "compressor": _convert_compressor(v.compressor), + } + data_array.encoding = encoding + # Let's store the data array for the second pass data_arrays[v.name] = data_array - # Add non-dimension coordinates to the data arrays - for v in ds.variables: + # Second pass: Add non-dimension coordinates to the data arrays + for v in mdio_ds.variables: da = data_arrays[v.name] non_dim_coords_names = set(_get_coord_names(v)) - set(_get_dimension_names(v)) - {v.name} - # Create a populate a dictionary {coord_name: DataArray for the coordinate} - non_dim_coords_dict : dict[str, xr.DataArray] = {} + # Create and populate a dictionary {coord_name: DataArray for the coordinate} + non_dim_coords_dict: dict[str, xr.DataArray] = {} for name in non_dim_coords_names: non_dim_coords_dict[name] = data_arrays[name] if non_dim_coords_dict: - # NOTE: here is a gotcha: assign_coords() does not update in-place, + # NOTE: here is a gotcha: assign_coords() does not update in-place, # but returns an updated instance! data_arrays[v.name] = da.assign_coords(non_dim_coords_dict) - pass # Now let's create a dataset with all data arrays xr_ds = xr.Dataset(data_arrays) # Attach dataset metadata - if ds.metadata is not None: - xr_ds.attrs["apiVersion"] = ds.metadata.api_version - xr_ds.attrs["createdOn"] = str(ds.metadata.created_on) - xr_ds.attrs["name"] = ds.metadata.name - if ds.metadata.attributes: - xr_ds.attrs["attributes"] = ds.metadata.attributes + if mdio_ds.metadata is not None: + xr_ds.attrs["apiVersion"] = mdio_ds.metadata.api_version + xr_ds.attrs["createdOn"] = str(mdio_ds.metadata.created_on) + xr_ds.attrs["name"] = mdio_ds.metadata.name + if mdio_ds.metadata.attributes: + xr_ds.attrs["attributes"] = mdio_ds.metadata.attributes return xr_ds -def to_zarr(dataset: xr.Dataset, +def to_zarr( + dataset: xr.Dataset, store: str | None = None, *args: str | int | float | bool, **kwargs: Mapping[str, str | int | float | bool], ) -> None: - """Alias for `.to_zarr()`.""" - # Ensure zarr_format=2 by default unless explicitly overridden - zarr_format = kwargs.get("zarr_format", 2) - if zarr_format != 2: # noqa: PLR2004 - msg = "MDIO only supports zarr_format=2" - raise ValueError(msg) - - # ds.to_zarr("foo.zarr", consolidated=False, encoding={"foo": {"compressors": [compressor]}}) - # Define compressor - # compressor = zarr.Blosc(cname="zstd", clevel=5, shuffle=2) - # # Define encoding - # encoding = { - # "foo": {"compressor": compressor}, - # "bar": {"compressor": compressor}, - # } - # kwargs["encoding"] = encoding - encoding = {} - for key in dataset.data_vars.keys(): - c = dataset[key].encoding.get("compressors", None) - encoding[key] = {"compressors": c} - kwargs["encoding"] = encoding - - kwargs["zarr_format"] = zarr_format - - - - + """Write an XArray dataset to Zarr format.""" + # MDIO only supports zarr_format=2 + kwargs["zarr_format"] = 2 + # compute: default: True) – If True write array data immediately, + # otherwise return a dask.delayed.Delayed object that can be computed + # to write array data later. + # *** Metadata is always updated eagerly. *** + kwargs["compute"] = False + # https://docs.xarray.dev/en/stable/user-guide/io.html + # https://docs.xarray.dev/en/latest/generated/xarray.DataArray.to_zarr.html return dataset.to_zarr(*args, store=store, **kwargs) - -# https://docs.xarray.dev/en/stable/user-guide/io.html -# ds.to_zarr("path/to/directory.zarr", zarr_format=2, consolidated=False) \ No newline at end of file diff --git a/tests/unit/v1/helpers.py b/tests/unit/v1/helpers.py index 8a01a9663..336f2f0d6 100644 --- a/tests/unit/v1/helpers.py +++ b/tests/unit/v1/helpers.py @@ -157,7 +157,7 @@ def make_campos_3d_acceptance_dataset() -> Dataset: # Add dimensions ds.add_dimension("inline", 256) ds.add_dimension("crossline", 512) - ds.add_dimension("depth", 384) # data_type=ScalarType.UINT32, LengthUnitEnum.METER + ds.add_dimension("depth", 384) ds.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.UINT32) ds.add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.UINT32) ds.add_coordinate( @@ -251,15 +251,14 @@ def make_campos_3d_acceptance_dataset() -> Dataset: ), metadata_info=[ ChunkGridMetadata( - chunk_grid=RegularChunkGrid( - configuration=RegularChunkShape(chunk_shape=[128, 128]) - ) + chunk_grid=RegularChunkGrid(configuration=RegularChunkShape(chunk_shape=[128, 128])) ) ], coordinates=["cdp-x", "cdp-y"], ) return ds.build() + def make_campos_3d_dataset() -> Dataset: """Create in-memory campos_3d dataset.""" ds = MDIODatasetBuilder( diff --git a/tests/unit/v1/test_dataset_serializer.py b/tests/unit/v1/test_dataset_serializer.py index ddd43563a..1bee02e3c 100644 --- a/tests/unit/v1/test_dataset_serializer.py +++ b/tests/unit/v1/test_dataset_serializer.py @@ -4,57 +4,50 @@ # Thus, disable it for this file """Tests the schema v1 dataset_serializer public API.""" -import dask import xarray as xr -import numpy as np from mdio.schemas.dtype import ScalarType -from mdio.schemas.dtype import StructuredField -from mdio.schemas.dtype import StructuredType -from mdio.schemas.v1.dataset import Dataset from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder -from mdio.schemas.v1.dataset_serializer import to_xarray_dataset, to_zarr -from mdio.schemas.v1.units import LengthUnitEnum -from mdio.schemas.v1.units import SpeedUnitEnum - -from .helpers import make_campos_3d_acceptance_dataset, make_campos_3d_dataset -from .helpers import validate_variable - - -# def test_to_xarray_dataset(capsys) -> None: -# """Test building a complete dataset.""" -# dataset = ( -# MDIODatasetBuilder("test_dataset") -# .add_dimension("inline", 100) -# .add_dimension("crossline", 200) -# .add_dimension("depth", 300) -# .add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.FLOAT64) -# .add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.FLOAT64) -# .add_coordinate("x_coord", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) -# .add_coordinate("y_coord", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) -# .add_variable( -# "data", -# long_name="Test Data", -# dimensions=["inline", "crossline", "depth"], -# coordinates=["inline", "crossline", "x_coord", "y_coord"], -# data_type=ScalarType.FLOAT32, -# ) -# .build() -# ) - -# # with capsys.disabled(): -# xds : xr.Dataset = to_xarray_dataset(dataset) - -# to_zarr(xds, f"test-dataset-{xds.attrs["name"]}.zarr", mode="w") +from mdio.schemas.v1.dataset_serializer import to_xarray_dataset +from mdio.schemas.v1.dataset_serializer import to_zarr + +from .helpers import make_campos_3d_acceptance_dataset + + +def test_to_xarray_dataset(capsys) -> None: + """Test building a complete dataset.""" + dataset = ( + MDIODatasetBuilder("test_dataset") + .add_dimension("inline", 100) + .add_dimension("crossline", 200) + .add_dimension("depth", 300) + .add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.FLOAT64) + .add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.FLOAT64) + .add_coordinate("x_coord", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) + .add_coordinate("y_coord", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32) + .add_variable( + "data", + long_name="Test Data", + dimensions=["inline", "crossline", "depth"], + coordinates=["inline", "crossline", "x_coord", "y_coord"], + data_type=ScalarType.FLOAT32, + ) + .build() + ) + + # with capsys.disabled(): + xds: xr.Dataset = to_xarray_dataset(dataset) + + file_name = "sample_dataset" + to_zarr(xds, f"test-data/{file_name}.zarr", mode="w") def test_campos_3d_acceptance_to_xarray_dataset(capsys) -> None: """Test building a complete dataset.""" dataset = make_campos_3d_acceptance_dataset() - - xds : xr.Dataset = to_xarray_dataset(dataset) + xds: xr.Dataset = to_xarray_dataset(dataset) # file_name = "XYZ" file_name = f"{xds.attrs['name']}" - to_zarr(xds, f"test-data/{file_name}.zarr", mode="w") \ No newline at end of file + to_zarr(xds, f"test-data/{file_name}.zarr", mode="w") From 850135ea3d0f21f9a04b4ede6d7888c46e2e36a1 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Fri, 11 Jul 2025 20:55:45 +0000 Subject: [PATCH 43/56] Fix precommit issues --- _dev/DEVELOPERS_NOTES.md | 5 +- src/mdio/schemas/v1/dataset_serializer.py | 89 ++++++++++------------- tests/unit/v1/test_dataset_serializer.py | 17 ++--- 3 files changed, 50 insertions(+), 61 deletions(-) diff --git a/_dev/DEVELOPERS_NOTES.md b/_dev/DEVELOPERS_NOTES.md index 8c575025a..a9df833e0 100644 --- a/_dev/DEVELOPERS_NOTES.md +++ b/_dev/DEVELOPERS_NOTES.md @@ -11,5 +11,6 @@ src/mdio/schemas/v1/dataset_serializer.py 4. `fill_value` for StructuredType is set to null, but "AAAAAAAAAAAAAAAA" is expected ## TO DO: -* Add more unit tests for internal functions -* Add a trest comparing expected and actual .zmetadata for the serialized dataset + +- Add more unit tests for internal functions +- Add a trest comparing expected and actual .zmetadata for the serialized dataset diff --git a/src/mdio/schemas/v1/dataset_serializer.py b/src/mdio/schemas/v1/dataset_serializer.py index 1592e93ba..10e9f4628 100644 --- a/src/mdio/schemas/v1/dataset_serializer.py +++ b/src/mdio/schemas/v1/dataset_serializer.py @@ -1,22 +1,23 @@ -import warnings +"""Convert MDIO v1 schema Dataset to Xarray DataSet and write it in Zarr.""" + from collections.abc import Mapping -import dask as dask -import numcodecs as numcodecs -import numpy as np -import xarray as xr -import zarr as zarr +from dask import array as dask_array +from numcodecs import Blosc as nc_Blosc +from numpy import dtype as np_dtype +from numpy import nan as np_nan +from xarray import DataArray as xr_DataArray +from xarray import Dataset as xr_Dataset +from zarr.core.chunk_key_encodings import V2ChunkKeyEncoding try: # zfpy is an optional dependency for ZFP compression # It is not installed by default, so we check for its presence and import it only if available. - import zfpy as zfpy - from zfpy import ZFPY as zfpy_ZFPY + from zfpy import ZFPY as zfpy_ZFPY # noqa: N811 except ImportError: - zfpy = None - zfpy_ZFPY = None + zfpy_ZFPY = None # noqa: N816 -from mdio.schemas.compressors import ZFP as mdio_ZFP +from mdio.schemas.compressors import ZFP as mdio_ZFP # noqa: N811 from mdio.schemas.compressors import Blosc as mdio_Blosc from mdio.schemas.dimension import NamedDimension from mdio.schemas.dtype import ScalarType @@ -35,12 +36,8 @@ def _get_all_named_dimensions(dataset: Dataset) -> dict[str, NamedDimension]: if isinstance(d, NamedDimension): all_named_dims[d.name] = d else: - # Skip, if this is a named reference - # This should not be ever a case for the dataset generated with the dataset builder - warnings.warn( - f"Unsupported dimension type: {type(d)} in variable {v.name}. " - "Expected NamedDimension." - ) + # Never happens for the dataset generated with the dataset builder + pass return all_named_dims @@ -61,11 +58,7 @@ def _get_dimension_names(var: Variable) -> list[str]: if isinstance(d, NamedDimension): dim_names.append(d.name) elif isinstance(d, str): - # This should not be ever a case for the dataset generated with the dataset builder - warnings.warn( - f"Unsupported dimension type: 'str' in variable {var.name}. " - "Expected NamedDimension." - ) + # Never happens for the dataset generated with the dataset builder dim_names.append(d) else: err = f"Unsupported dimension type: {type(d)} in variable {var.name}" @@ -87,13 +80,14 @@ def _get_coord_names(var: Variable) -> list[str]: return coord_names -def _get_np_datatype(var: Variable) -> np.dtype: +def _get_np_datatype(var: Variable) -> np_dtype: data_type = var.data_type if isinstance(data_type, ScalarType): - return np.dtype(data_type.value) + return np_dtype(data_type.value) if isinstance(data_type, StructuredType): - return np.dtype([(f.name, f.format.value) for f in data_type.fields]) - raise TypeError(f"Unsupported data_type: {data_type}") + return np_dtype([(f.name, f.format.value) for f in data_type.fields]) + err = f"Unsupported data type: {type(data_type)} in variable {var.name}" + raise TypeError(err) def _get_zarr_shape(var: Variable) -> tuple[int, ...]: @@ -111,13 +105,13 @@ def _get_zarr_chunks(var: Variable) -> tuple[int, ...]: def _convert_compressor( compressor: mdio_Blosc | mdio_ZFP | None, -) -> numcodecs.Blosc | zfpy_ZFPY | None: +) -> nc_Blosc | zfpy_ZFPY | None: """Convert a compressor to a numcodecs compatible format.""" if compressor is None: return None if isinstance(compressor, mdio_Blosc): - return numcodecs.Blosc( + return nc_Blosc( cname=compressor.algorithm.value, clevel=compressor.level, shuffle=compressor.shuffle.value, @@ -142,9 +136,9 @@ def _convert_compressor( # Do we already have it somewhere in the codebase? I could not find it. fill_value_map = { ScalarType.BOOL: None, - ScalarType.FLOAT16: np.nan, - ScalarType.FLOAT32: np.nan, - ScalarType.FLOAT64: np.nan, + ScalarType.FLOAT16: np_nan, + ScalarType.FLOAT32: np_nan, + ScalarType.FLOAT64: np_nan, ScalarType.UINT8: 2**8 - 1, # Max value for uint8 ScalarType.UINT16: 2**16 - 1, # Max value for uint16 ScalarType.UINT32: 2**32 - 1, # Max value for uint32 @@ -153,14 +147,15 @@ def _convert_compressor( ScalarType.INT16: 2**15 - 1, # Max value for int16 ScalarType.INT32: 2**31 - 1, # Max value for int32 ScalarType.INT64: 2**63 - 1, # Max value for int64 - ScalarType.COMPLEX64: complex(np.nan, np.nan), - ScalarType.COMPLEX128: complex(np.nan, np.nan), - ScalarType.COMPLEX256: complex(np.nan, np.nan), + ScalarType.COMPLEX64: complex(np_nan, np_nan), + ScalarType.COMPLEX128: complex(np_nan, np_nan), + ScalarType.COMPLEX256: complex(np_nan, np_nan), } -def get_fill_value(data_type: ScalarType | StructuredType | str) -> any: +def _get_fill_value(data_type: ScalarType | StructuredType | str) -> any: """Get the fill value for a given data type. + The Zarr fill_value is a scalar value providing the default value to use for uninitialized portions of the array, or null if no fill_value is to be used https://zarr-specs.readthedocs.io/en/latest/v2/v2.0.html @@ -175,7 +170,7 @@ def get_fill_value(data_type: ScalarType | StructuredType | str) -> any: return None -def to_xarray_dataset(mdio_ds: Dataset) -> xr.DataArray: # noqa: PLR0912 +def to_xarray_dataset(mdio_ds: Dataset) -> xr_DataArray: # noqa: PLR0912 """Build an XArray dataset with correct dimensions and dtypes. This function constructs the underlying data structure for an XArray dataset, @@ -186,9 +181,6 @@ def to_xarray_dataset(mdio_ds: Dataset) -> xr.DataArray: # noqa: PLR0912 Returns: The constructed dataset with proper MDIO structure and metadata. - - Raises: - TypeError: If an unsupported data type is encountered. """ # See the xarray tutorial for more details on how to create datasets: # https://tutorial.xarray.dev/fundamentals/01.1_creating_data_structures.html @@ -197,17 +189,17 @@ def to_xarray_dataset(mdio_ds: Dataset) -> xr.DataArray: # noqa: PLR0912 # all_coords = _get_all_coordinates(ds) # First pass: Build all variables - data_arrays: dict[str, xr.DataArray] = {} + data_arrays: dict[str, xr_DataArray] = {} for v in mdio_ds.variables: # Use dask array instead of numpy array for lazy evaluation shape = _get_zarr_shape(v) dtype = _get_np_datatype(v) chunks = _get_zarr_chunks(v) - arr = dask.array.zeros(shape, dtype=dtype, chunks=chunks) + arr = dask_array.zeros(shape, dtype=dtype, chunks=chunks) # Create a DataArray for the variable. We will set coords in the second pass dim_names = _get_dimension_names(v) - data_array = xr.DataArray(arr, dims=dim_names) + data_array = xr_DataArray(arr, dims=dim_names) # Add array attributes if v.metadata is not None: @@ -224,15 +216,14 @@ def to_xarray_dataset(mdio_ds: Dataset) -> xr.DataArray: # noqa: PLR0912 # Compression: # https://docs.xarray.dev/en/stable/internals/zarr-encoding-spec.html#zarr-encoding # If you don't explicitly specify a compressor when creating a Zarr array, Z - # arr will use a default compressor based on the Zarr format version and the data type of your array. - # Zarr V2 (Default is Blosc). + # arr will use a default compressor based on the Zarr format version and the data + # type of your array. Zarr V2 (Default is Blosc). # Thus, if there is no compressor, we will explicitly set "compressor" to None. # # Create a custom chunk key encoding with "/" as separator - from zarr.core.chunk_key_encodings import V2ChunkKeyEncoding chunk_key_encoding = V2ChunkKeyEncoding(separator="/").to_dict() encoding = { - "fill_value": get_fill_value(v.data_type), + "fill_value": _get_fill_value(v.data_type), "chunks": chunks, "chunk_key_encoding": chunk_key_encoding, # I was hoping the following would work, but it does not. @@ -258,7 +249,7 @@ def to_xarray_dataset(mdio_ds: Dataset) -> xr.DataArray: # noqa: PLR0912 da = data_arrays[v.name] non_dim_coords_names = set(_get_coord_names(v)) - set(_get_dimension_names(v)) - {v.name} # Create and populate a dictionary {coord_name: DataArray for the coordinate} - non_dim_coords_dict: dict[str, xr.DataArray] = {} + non_dim_coords_dict: dict[str, xr_DataArray] = {} for name in non_dim_coords_names: non_dim_coords_dict[name] = data_arrays[name] if non_dim_coords_dict: @@ -267,7 +258,7 @@ def to_xarray_dataset(mdio_ds: Dataset) -> xr.DataArray: # noqa: PLR0912 data_arrays[v.name] = da.assign_coords(non_dim_coords_dict) # Now let's create a dataset with all data arrays - xr_ds = xr.Dataset(data_arrays) + xr_ds = xr_Dataset(data_arrays) # Attach dataset metadata if mdio_ds.metadata is not None: xr_ds.attrs["apiVersion"] = mdio_ds.metadata.api_version @@ -280,7 +271,7 @@ def to_xarray_dataset(mdio_ds: Dataset) -> xr.DataArray: # noqa: PLR0912 def to_zarr( - dataset: xr.Dataset, + dataset: xr_Dataset, store: str | None = None, *args: str | int | float | bool, **kwargs: Mapping[str, str | int | float | bool], diff --git a/tests/unit/v1/test_dataset_serializer.py b/tests/unit/v1/test_dataset_serializer.py index 1bee02e3c..d1ec69a35 100644 --- a/tests/unit/v1/test_dataset_serializer.py +++ b/tests/unit/v1/test_dataset_serializer.py @@ -4,8 +4,6 @@ # Thus, disable it for this file """Tests the schema v1 dataset_serializer public API.""" -import xarray as xr - from mdio.schemas.dtype import ScalarType from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder from mdio.schemas.v1.dataset_serializer import to_xarray_dataset @@ -14,7 +12,7 @@ from .helpers import make_campos_3d_acceptance_dataset -def test_to_xarray_dataset(capsys) -> None: +def test_to_xarray_dataset() -> None: """Test building a complete dataset.""" dataset = ( MDIODatasetBuilder("test_dataset") @@ -35,19 +33,18 @@ def test_to_xarray_dataset(capsys) -> None: .build() ) - # with capsys.disabled(): - xds: xr.Dataset = to_xarray_dataset(dataset) + xr_ds = to_xarray_dataset(dataset) file_name = "sample_dataset" - to_zarr(xds, f"test-data/{file_name}.zarr", mode="w") + to_zarr(xr_ds, f"test-data/{file_name}.zarr", mode="w") -def test_campos_3d_acceptance_to_xarray_dataset(capsys) -> None: +def test_campos_3d_acceptance_to_xarray_dataset() -> None: """Test building a complete dataset.""" dataset = make_campos_3d_acceptance_dataset() - xds: xr.Dataset = to_xarray_dataset(dataset) + xr_ds = to_xarray_dataset(dataset) # file_name = "XYZ" - file_name = f"{xds.attrs['name']}" - to_zarr(xds, f"test-data/{file_name}.zarr", mode="w") + file_name = f"{xr_ds.attrs['name']}" + to_zarr(xr_ds, f"test-data/{file_name}.zarr", mode="w") From 82f1960da9939222c2d44077624a6ae126812ee4 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Fri, 11 Jul 2025 22:26:34 +0000 Subject: [PATCH 44/56] Use only make_campos_3d_acceptance_dataset --- tests/unit/v1/helpers.py | 117 +------------------- tests/unit/v1/test_dataset_builder_build.py | 15 +-- 2 files changed, 9 insertions(+), 123 deletions(-) diff --git a/tests/unit/v1/helpers.py b/tests/unit/v1/helpers.py index 336f2f0d6..ccd212895 100644 --- a/tests/unit/v1/helpers.py +++ b/tests/unit/v1/helpers.py @@ -241,6 +241,7 @@ def make_campos_3d_acceptance_dataset() -> Dataset: ds.add_variable( name="image_headers", dimensions=["inline", "crossline"], + coordinates=["cdp-x", "cdp-y"], data_type=StructuredType( fields=[ StructuredField(name="cdp-x", format=ScalarType.INT32), @@ -254,122 +255,6 @@ def make_campos_3d_acceptance_dataset() -> Dataset: chunk_grid=RegularChunkGrid(configuration=RegularChunkShape(chunk_shape=[128, 128])) ) ], - coordinates=["cdp-x", "cdp-y"], ) return ds.build() - -def make_campos_3d_dataset() -> Dataset: - """Create in-memory campos_3d dataset.""" - ds = MDIODatasetBuilder( - "campos_3d", - attributes=UserAttributes( - attributes={ - "textHeader": [ - "C01 .......................... ", - "C02 .......................... ", - "C03 .......................... ", - ], - "foo": "bar", - } - ), - ) - - # Add dimensions - ds.add_dimension("inline", 256) - ds.add_dimension("crossline", 512) - ds.add_dimension("depth", 384) - ds.add_coordinate("inline", dimensions=["inline"], data_type=ScalarType.UINT32) - ds.add_coordinate("crossline", dimensions=["crossline"], data_type=ScalarType.UINT32) - ds.add_coordinate( - "depth", - dimensions=["depth"], - data_type=ScalarType.FLOAT64, - metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))], - ) - # Add coordinates - ds.add_coordinate( - "cdp-x", - dimensions=["inline", "crossline"], - data_type=ScalarType.FLOAT32, - metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))], - ) - ds.add_coordinate( - "cdp-y", - dimensions=["inline", "crossline"], - data_type=ScalarType.FLOAT32, - metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))], - ) - - # Add image variable - ds.add_variable( - name="image", - dimensions=["inline", "crossline", "depth"], - data_type=ScalarType.FLOAT32, - compressor=Blosc(algorithm="zstd"), - coordinates=["cdp-x", "cdp-y"], - metadata_info=[ - ChunkGridMetadata( - chunk_grid=RegularChunkGrid( - configuration=RegularChunkShape(chunk_shape=[128, 128, 128]) - ) - ), - StatisticsMetadata( - stats_v1=SummaryStatistics( - count=100, - sum=1215.1, - sumSquares=125.12, - min=5.61, - max=10.84, - histogram=CenteredBinHistogram(binCenters=[1, 2], counts=[10, 15]), - ) - ), - UserAttributes(attributes={"fizz": "buzz", "UnitSystem": "Canonical"}), - ], - ) - # Add velocity variable - ds.add_variable( - name="velocity", - dimensions=["inline", "crossline", "depth"], - data_type=ScalarType.FLOAT16, - coordinates=["cdp-x", "cdp-y"], - metadata_info=[ - ChunkGridMetadata( - chunk_grid=RegularChunkGrid( - configuration=RegularChunkShape(chunk_shape=[128, 128, 128]) - ) - ), - AllUnits(units_v1=SpeedUnitModel(speed=SpeedUnitEnum.METER_PER_SECOND)), - ], - ) - # Add inline-optimized image variable - ds.add_variable( - name="image_inline", - long_name="inline optimized version of 3d_stack", - dimensions=["inline", "crossline", "depth"], - data_type=ScalarType.FLOAT32, - compressor=Blosc(algorithm="zstd"), - coordinates=["cdp-x", "cdp-y"], - metadata_info=[ - ChunkGridMetadata( - chunk_grid=RegularChunkGrid( - configuration=RegularChunkShape(chunk_shape=[4, 512, 512]) - ) - ) - ], - ) - # Add headers variable with structured dtype - ds.add_variable( - name="image_headers", - dimensions=["inline", "crossline"], - data_type=StructuredType( - fields=[ - StructuredField(name="cdp-x", format=ScalarType.FLOAT32), - StructuredField(name="cdp-y", format=ScalarType.FLOAT32), - StructuredField(name="inline", format=ScalarType.UINT32), - StructuredField(name="crossline", format=ScalarType.UINT32), - ] - ), - coordinates=["cdp-x", "cdp-y"], - ) - return ds.build() diff --git a/tests/unit/v1/test_dataset_builder_build.py b/tests/unit/v1/test_dataset_builder_build.py index 832f624c1..d726c32d4 100644 --- a/tests/unit/v1/test_dataset_builder_build.py +++ b/tests/unit/v1/test_dataset_builder_build.py @@ -12,7 +12,7 @@ from mdio.schemas.v1.units import LengthUnitEnum from mdio.schemas.v1.units import SpeedUnitEnum -from .helpers import make_campos_3d_dataset +from .helpers import make_campos_3d_acceptance_dataset from .helpers import validate_variable @@ -49,7 +49,7 @@ def test_build() -> None: def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50) """Test building a Campos 3D dataset with multiple variables and attributes.""" - dataset = make_campos_3d_dataset() + dataset = make_campos_3d_acceptance_dataset() # Verify dataset structure assert dataset.metadata.name == "campos_3d" @@ -75,7 +75,7 @@ def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 5 ) depth = validate_variable( - dataset, name="depth", dims=[("depth", 384)], coords=["depth"], dtype=ScalarType.FLOAT64 + dataset, name="depth", dims=[("depth", 384)], coords=["depth"], dtype=ScalarType.UINT32 ) assert depth.metadata.units_v1.length == LengthUnitEnum.METER @@ -146,10 +146,11 @@ def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 5 coords=["cdp-x", "cdp-y"], dtype=StructuredType( fields=[ - StructuredField(name="cdp-x", format=ScalarType.FLOAT32), - StructuredField(name="cdp-y", format=ScalarType.FLOAT32), - StructuredField(name="inline", format=ScalarType.UINT32), - StructuredField(name="crossline", format=ScalarType.UINT32), + StructuredField(name="cdp-x", format=ScalarType.INT32), + StructuredField(name="cdp-y", format=ScalarType.INT32), + StructuredField(name="elevation", format=ScalarType.FLOAT16), + StructuredField(name="some_scalar", format=ScalarType.FLOAT16), ] ), ) + assert headers.metadata.chunk_grid.configuration.chunk_shape == [128, 128] From b5ee31e90e366395df26674a4f8407c0343ae580 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Mon, 14 Jul 2025 21:51:54 +0000 Subject: [PATCH 45/56] PR Review: address the review comments --- .gitignore | 2 - _dev/DEVELOPERS_NOTES.md | 16 - _dev/zmetadata.cpp.json | 195 ----------- _dev/zmetadata.python.json | 195 ----------- src/mdio/constants.py | 61 ++-- src/mdio/schemas/v1/dataset_serializer.py | 153 ++++----- tests/unit/v1/helpers.py | 22 +- tests/unit/v1/test_dataset_builder_build.py | 8 +- tests/unit/v1/test_dataset_serializer.py | 350 +++++++++++++++++++- 9 files changed, 483 insertions(+), 519 deletions(-) delete mode 100644 _dev/DEVELOPERS_NOTES.md delete mode 100644 _dev/zmetadata.cpp.json delete mode 100644 _dev/zmetadata.python.json diff --git a/.gitignore b/.gitignore index 643394a40..bfdc38f28 100644 --- a/.gitignore +++ b/.gitignore @@ -153,5 +153,3 @@ mdio1/* pytest-of-* tmp debugging/* - -test-data/* diff --git a/_dev/DEVELOPERS_NOTES.md b/_dev/DEVELOPERS_NOTES.md deleted file mode 100644 index a9df833e0..000000000 --- a/_dev/DEVELOPERS_NOTES.md +++ /dev/null @@ -1,16 +0,0 @@ -# Wring empty XArray / Zarr to a local storage - -src/mdio/schemas/v1/dataset_serializer.py - -## Issues encountered - -1. FIXED: Non-zero size of the serialized data files -2. FIXED: Not clear how to properly set `compressor`, `dimension_separator`, and `fill_value` -3. FIXED: For image_inline chunks[2] are somehow different? - -4. `fill_value` for StructuredType is set to null, but "AAAAAAAAAAAAAAAA" is expected - -## TO DO: - -- Add more unit tests for internal functions -- Add a trest comparing expected and actual .zmetadata for the serialized dataset diff --git a/_dev/zmetadata.cpp.json b/_dev/zmetadata.cpp.json deleted file mode 100644 index 394de1a8f..000000000 --- a/_dev/zmetadata.cpp.json +++ /dev/null @@ -1,195 +0,0 @@ -{ - "metadata": { - ".zattrs": { - "apiVersion": "1.0.0", - "attributes": { - "foo": "bar", - "textHeader": [ - "C01 .......................... ", - "C02 .......................... ", - "C03 .......................... " - ] - }, - "createdOn": "2023-12-12T15:02:06.413469-06:00", - "name": "campos_3d" - }, - ".zgroup": { - "zarr_format": 2 - }, - "cdp-x/.zarray": { - "chunks": [256, 512], - "compressor": null, - "dimension_separator": "/", - "dtype": " dict[str, NamedDimension]: + """Get all NamedDimensions from the dataset variables. + + This function returns a dictionary of NamedDimensions, but if some dimensions + are not resolvable, they will not be included in the result. + + Args: + dataset: The MDIO Dataset to extract NamedDimensions from. + + Note: + The Dataset Builder ensures that all dimensions are resolvable by always embedding + dimensions as NamedDimension and never as str. + If the dataset is created in a different way, some dimensions may be specified as + dimension names (str) instead of NamedDimension. In this case, we will try to resolve + them to NamedDimension, but if the dimension is not found, it will be skipped. + It is the responsibility of the Dataset creator to ensure that all dimensions are + resolvable at the Dataset level. + + Returns: + A dictionary mapping dimension names to NamedDimension instances. + """ all_named_dims: dict[str, NamedDimension] = {} for v in dataset.variables: if v.dimensions is not None: @@ -36,37 +56,30 @@ def _get_all_named_dimensions(dataset: Dataset) -> dict[str, NamedDimension]: if isinstance(d, NamedDimension): all_named_dims[d.name] = d else: - # Never happens for the dataset generated with the dataset builder pass return all_named_dims -def _get_all_coordinates(dataset: Dataset) -> dict[str, Coordinate]: - all_coords: dict[str, Coordinate] = {} - for v in dataset.variables: - if v.coordinates is not None: - for c in v.coordinates: - if isinstance(c, Coordinate) and c.name not in all_coords: - all_coords[c.name] = c - return all_coords - - def _get_dimension_names(var: Variable) -> list[str]: + """Get the names of dimensions for a variable. + + Note: + We expect that Datasets produced by DatasetBuilder has all dimensions + embedded as NamedDimension, but we also support dimension name strings for + compatibility with Dataset produced in a different way. + """ dim_names: list[str] = [] if var.dimensions is not None: for d in var.dimensions: if isinstance(d, NamedDimension): dim_names.append(d.name) elif isinstance(d, str): - # Never happens for the dataset generated with the dataset builder dim_names.append(d) - else: - err = f"Unsupported dimension type: {type(d)} in variable {var.name}" - raise TypeError(err) return dim_names def _get_coord_names(var: Variable) -> list[str]: + """Get the names of coordinates for a variable.""" coord_names: list[str] = [] if var.coordinates is not None: for c in var.coordinates: @@ -74,13 +87,11 @@ def _get_coord_names(var: Variable) -> list[str]: coord_names.append(c.name) elif isinstance(c, str): coord_names.append(c) - else: - err = f"Unsupported coordinate type: {type(c)} in variable {var.name}" - raise TypeError(err) return coord_names def _get_np_datatype(var: Variable) -> np_dtype: + """Get the numpy dtype for a variable.""" data_type = var.data_type if isinstance(data_type, ScalarType): return np_dtype(data_type.value) @@ -90,17 +101,33 @@ def _get_np_datatype(var: Variable) -> np_dtype: raise TypeError(err) -def _get_zarr_shape(var: Variable) -> tuple[int, ...]: - # NOTE: This assumes that the variable dimensions are all NamedDimension - return tuple(dim.size for dim in var.dimensions) +def _get_zarr_shape(var: Variable, all_named_dims: dict[str, NamedDimension]) -> tuple[int, ...]: + """Get the shape of a variable for Zarr storage. - -def _get_zarr_chunks(var: Variable) -> tuple[int, ...]: + Note: + We expect that Datasets produced by DatasetBuilder has all dimensions + embedded as NamedDimension, but we also support dimension name strings for + compatibility with Dataset produced in a different way. + """ + shape: list[int] = [] + for dim in var.dimensions: + if isinstance(dim, NamedDimension): + shape.append(dim.size) + if isinstance(dim, str): + named_dim = all_named_dims.get(dim) + if named_dim is None: + err = f"Dimension named '{dim}' can't be resolved to a NamedDimension." + raise ValueError(err) + shape.append(named_dim.size) + return tuple(shape) + + +def _get_zarr_chunks(var: Variable, all_named_dims: dict[str, NamedDimension]) -> tuple[int, ...]: """Get the chunk shape for a variable, defaulting to its shape if no chunk grid is defined.""" if var.metadata is not None and var.metadata.chunk_grid is not None: - return var.metadata.chunk_grid.configuration.chunk_shape + return tuple(var.metadata.chunk_grid.configuration.chunk_shape) # Default to full shape if no chunk grid is defined - return _get_zarr_shape(var) + return _get_zarr_shape(var, all_named_dims=all_named_dims) def _convert_compressor( @@ -133,26 +160,6 @@ def _convert_compressor( raise TypeError(msg) -# Do we already have it somewhere in the codebase? I could not find it. -fill_value_map = { - ScalarType.BOOL: None, - ScalarType.FLOAT16: np_nan, - ScalarType.FLOAT32: np_nan, - ScalarType.FLOAT64: np_nan, - ScalarType.UINT8: 2**8 - 1, # Max value for uint8 - ScalarType.UINT16: 2**16 - 1, # Max value for uint16 - ScalarType.UINT32: 2**32 - 1, # Max value for uint32 - ScalarType.UINT64: 2**64 - 1, # Max value for uint64 - ScalarType.INT8: 2**7 - 1, # Max value for int8 - ScalarType.INT16: 2**15 - 1, # Max value for int16 - ScalarType.INT32: 2**31 - 1, # Max value for int32 - ScalarType.INT64: 2**63 - 1, # Max value for int64 - ScalarType.COMPLEX64: complex(np_nan, np_nan), - ScalarType.COMPLEX128: complex(np_nan, np_nan), - ScalarType.COMPLEX256: complex(np_nan, np_nan), -} - - def _get_fill_value(data_type: ScalarType | StructuredType | str) -> any: """Get the fill value for a given data type. @@ -185,16 +192,15 @@ def to_xarray_dataset(mdio_ds: Dataset) -> xr_DataArray: # noqa: PLR0912 # See the xarray tutorial for more details on how to create datasets: # https://tutorial.xarray.dev/fundamentals/01.1_creating_data_structures.html - # all_dims = _get_all_named_dimensions(ds) - # all_coords = _get_all_coordinates(ds) + all_named_dims = _get_all_named_dimensions(mdio_ds) # First pass: Build all variables data_arrays: dict[str, xr_DataArray] = {} for v in mdio_ds.variables: # Use dask array instead of numpy array for lazy evaluation - shape = _get_zarr_shape(v) + shape = _get_zarr_shape(v, all_named_dims=all_named_dims) dtype = _get_np_datatype(v) - chunks = _get_zarr_chunks(v) + chunks = _get_zarr_chunks(v, all_named_dims=all_named_dims) arr = dask_array.zeros(shape, dtype=dtype, chunks=chunks) # Create a DataArray for the variable. We will set coords in the second pass @@ -213,30 +219,12 @@ def to_xarray_dataset(mdio_ds: Dataset) -> xr_DataArray: # noqa: PLR0912 if v.long_name: data_array.attrs["long_name"] = v.long_name - # Compression: - # https://docs.xarray.dev/en/stable/internals/zarr-encoding-spec.html#zarr-encoding - # If you don't explicitly specify a compressor when creating a Zarr array, Z - # arr will use a default compressor based on the Zarr format version and the data - # type of your array. Zarr V2 (Default is Blosc). - # Thus, if there is no compressor, we will explicitly set "compressor" to None. - # # Create a custom chunk key encoding with "/" as separator chunk_key_encoding = V2ChunkKeyEncoding(separator="/").to_dict() encoding = { "fill_value": _get_fill_value(v.data_type), "chunks": chunks, "chunk_key_encoding": chunk_key_encoding, - # I was hoping the following would work, but it does not. - # I see: - # >_compressor = parse_compressor(compressor[0]) - # > return numcodecs.get_codec(data) - # E - numcodecs.errors.UnknownCodecError: codec not available: 'None'" - # Example: https://zarr.readthedocs.io/en/stable/user-guide/arrays.html#compressors - # from zarr.codecs import BloscCodec - # compressor = BloscCodec(cname="zstd", clevel=3, shuffle="shuffle") - # - # "compressor": _to_dictionary(v.compressor) - # Thus, we will call the conversion function: "compressor": _convert_compressor(v.compressor), } data_array.encoding = encoding @@ -276,14 +264,27 @@ def to_zarr( *args: str | int | float | bool, **kwargs: Mapping[str, str | int | float | bool], ) -> None: - """Write an XArray dataset to Zarr format.""" - # MDIO only supports zarr_format=2 + """Write an XArray dataset to Zarr format. + + Args: + dataset: The XArray dataset to write. + store: The Zarr store to write to. If None, defaults to in-memory store. + *args: Additional positional arguments for the Zarr store. + **kwargs: Additional keyword arguments for the Zarr store. + + Notes: + It sets the zarr_format to 2, which is the default for XArray datasets. + Since we set kwargs["compute"], this method will return a dask.delayed.Delayed object + and the arrays will not be immediately written. + + References: + https://docs.xarray.dev/en/stable/user-guide/io.html + https://docs.xarray.dev/en/latest/generated/xarray.DataArray.to_zarr.html + + Returns: + None: The function writes the dataset as dask.delayed.Delayed object to the + specified Zarr store. + """ kwargs["zarr_format"] = 2 - # compute: default: True) – If True write array data immediately, - # otherwise return a dask.delayed.Delayed object that can be computed - # to write array data later. - # *** Metadata is always updated eagerly. *** kwargs["compute"] = False - # https://docs.xarray.dev/en/stable/user-guide/io.html - # https://docs.xarray.dev/en/latest/generated/xarray.DataArray.to_zarr.html return dataset.to_zarr(*args, store=store, **kwargs) diff --git a/tests/unit/v1/helpers.py b/tests/unit/v1/helpers.py index ccd212895..d0ebe5d79 100644 --- a/tests/unit/v1/helpers.py +++ b/tests/unit/v1/helpers.py @@ -129,6 +129,7 @@ def _get_coordinate( def _get_all_coordinates(dataset: Dataset) -> list[Coordinate]: + """Get all coordinates from the dataset.""" all_coords: dict[str, Coordinate] = {} for v in dataset.variables: if v.coordinates is not None: @@ -138,8 +139,24 @@ def _get_all_coordinates(dataset: Dataset) -> list[Coordinate]: return list(all_coords.values()) -def make_campos_3d_acceptance_dataset() -> Dataset: - """Create in-memory campos_3d dataset.""" +def output_path(file_dir: str, file_name: str, debugging: bool = False) -> str: + """Generate the output path for the test file-system output. + + Note: + Use debugging=True, if you need to retain the created files for debugging + purposes. Otherwise, the files will be created in-memory and not saved to disk. + """ + if debugging: + # Use the following for debugging: + file_path = f"{file_dir}/mdio-tests/{file_name}.zarr" + else: + # Use the following for normal runs: + file_path = f"memory://path_to_zarr/mdio-tests/{file_name}.zarr" + return file_path + + +def make_seismic_poststack_3d_acceptance_dataset() -> Dataset: + """Create in-memory Seismic PostStack 3D Acceptance dataset.""" ds = MDIODatasetBuilder( "campos_3d", attributes=UserAttributes( @@ -257,4 +274,3 @@ def make_campos_3d_acceptance_dataset() -> Dataset: ], ) return ds.build() - diff --git a/tests/unit/v1/test_dataset_builder_build.py b/tests/unit/v1/test_dataset_builder_build.py index d726c32d4..2a68c8337 100644 --- a/tests/unit/v1/test_dataset_builder_build.py +++ b/tests/unit/v1/test_dataset_builder_build.py @@ -12,7 +12,7 @@ from mdio.schemas.v1.units import LengthUnitEnum from mdio.schemas.v1.units import SpeedUnitEnum -from .helpers import make_campos_3d_acceptance_dataset +from .helpers import make_seismic_poststack_3d_acceptance_dataset from .helpers import validate_variable @@ -47,9 +47,9 @@ def test_build() -> None: assert next(v for v in dataset.variables if v.name == "data") is not None -def test_build_campos_3d() -> None: # noqa: PLR0915 Too many statements (57 > 50) - """Test building a Campos 3D dataset with multiple variables and attributes.""" - dataset = make_campos_3d_acceptance_dataset() +def test_build_seismic_poststack_3d_acceptance_dataset() -> None: # noqa: PLR0915 Too many statements (57 > 50) + """Test building a Seismic PostStack 3D Acceptance dataset.""" + dataset = make_seismic_poststack_3d_acceptance_dataset() # Verify dataset structure assert dataset.metadata.name == "campos_3d" diff --git a/tests/unit/v1/test_dataset_serializer.py b/tests/unit/v1/test_dataset_serializer.py index d1ec69a35..19e3db505 100644 --- a/tests/unit/v1/test_dataset_serializer.py +++ b/tests/unit/v1/test_dataset_serializer.py @@ -4,15 +4,348 @@ # Thus, disable it for this file """Tests the schema v1 dataset_serializer public API.""" +import pytest +from numpy import dtype as np_dtype +from numpy import isnan as np_isnan + +from mdio.constants import fill_value_map +from mdio.schemas.chunk_grid import RegularChunkGrid +from mdio.schemas.chunk_grid import RegularChunkShape +from mdio.schemas.dimension import NamedDimension from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredField +from mdio.schemas.dtype import StructuredType +from mdio.schemas.metadata import ChunkGridMetadata +from mdio.schemas.v1.dataset import Dataset +from mdio.schemas.v1.dataset import DatasetInfo from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder +from mdio.schemas.v1.dataset_builder import _to_dictionary +from mdio.schemas.v1.dataset_serializer import _convert_compressor +from mdio.schemas.v1.dataset_serializer import _get_all_named_dimensions +from mdio.schemas.v1.dataset_serializer import _get_coord_names +from mdio.schemas.v1.dataset_serializer import _get_dimension_names +from mdio.schemas.v1.dataset_serializer import _get_fill_value +from mdio.schemas.v1.dataset_serializer import _get_np_datatype +from mdio.schemas.v1.dataset_serializer import _get_zarr_chunks +from mdio.schemas.v1.dataset_serializer import _get_zarr_shape from mdio.schemas.v1.dataset_serializer import to_xarray_dataset from mdio.schemas.v1.dataset_serializer import to_zarr +from mdio.schemas.v1.variable import Coordinate +from mdio.schemas.v1.variable import Variable + +from .helpers import make_seismic_poststack_3d_acceptance_dataset +from .helpers import output_path + +try: + from zfpy import ZFPY as zfpy_ZFPY # noqa: N811 + + HAS_ZFPY = True +except ImportError: + zfpy_ZFPY = None # noqa: N816 + HAS_ZFPY = False + +from numcodecs import Blosc as nc_Blosc + +from mdio.schemas.compressors import ZFP as mdio_ZFP # noqa: N811 +from mdio.schemas.compressors import Blosc as mdio_Blosc +from mdio.schemas.compressors import BloscAlgorithm as mdio_BloscAlgorithm +from mdio.schemas.compressors import BloscShuffle as mdio_BloscShuffle +from mdio.schemas.compressors import ZFPMode as mdio_ZFPMode + + +def test__get_all_named_dimensions() -> None: + """Test _get_all_named_dimensions function.""" + dim1 = NamedDimension(name="inline", size=100) + dim2 = NamedDimension(name="crossline", size=200) + dim3 = NamedDimension(name="depth", size=300) + v1 = Variable(name="named_dims", data_type=ScalarType.FLOAT32, dimensions=[dim1, dim2, dim3]) + v2 = Variable( + name="string_dims", + data_type=ScalarType.FLOAT32, + dimensions=["inline", "crossline", "depth"], + ) + v3 = Variable(name="unresolved_dims", data_type=ScalarType.FLOAT32, dimensions=["x", "y", "z"]) + ds = Dataset( + variables=[v1, v2, v3], + metadata=_to_dictionary( + [ + DatasetInfo( + name="test_dataset", api_version="1.0.0", created_on="2023-10-01T00:00:00Z" + ) + ] + ), + ) + + all_dims = _get_all_named_dimensions(ds) + # Only 3 named dimensions could be resolved. + # The dimension names "x", "y', "z" are unresolvable. + assert set(all_dims) == {"inline", "crossline", "depth"} + + +def test__get_dimension_names() -> None: + """Test _get_dimension_names function with various dimension types.""" + dim1 = NamedDimension(name="inline", size=100) + dim2 = NamedDimension(name="crossline", size=200) + + # Test case 1: Variable with NamedDimension + var_named_dims = Variable( + name="Variable with NamedDimension dimensions", + data_type=ScalarType.FLOAT32, + dimensions=[dim1, dim2], + ) + assert set(_get_dimension_names(var_named_dims)) == {"inline", "crossline"} + + # Test case 2: Variable with string dimensions + var_string_dims = Variable( + name="Variable with string dimensions", + data_type=ScalarType.FLOAT32, + dimensions=["x", "y", "z"], + ) + assert set(_get_dimension_names(var_string_dims)) == {"x", "y", "z"} + + # Test case 3: Mixed NamedDimension and string dimensions + # NOTE: mixing NamedDimension and string dimensions is not allowed by the Variable schema + + +def test__get_coord_names() -> None: + """Comprehensive test for _get_coord_names function covering all scenarios.""" + dim1 = NamedDimension(name="inline", size=100) + dim2 = NamedDimension(name="crossline", size=200) + + # Test 1: Variable with Coordinate objects + coord1 = Coordinate(name="x_coord", dimensions=[dim1, dim2], data_type=ScalarType.FLOAT32) + coord2 = Coordinate(name="y_coord", dimensions=[dim1, dim2], data_type=ScalarType.FLOAT64) + variable_coords = Variable( + name="Variable with Coordinate objects", + data_type=ScalarType.FLOAT32, + dimensions=[dim1, dim2], + coordinates=[coord1, coord2], + ) + assert set(_get_coord_names(variable_coords)) == {"x_coord", "y_coord"} + + # Test 2: Variable with string coordinates + variable_strings = Variable( + name="Variable with string coordinates", + data_type=ScalarType.FLOAT32, + dimensions=[dim1, dim2], + coordinates=["lat", "lon", "time"], + ) + assert set(_get_coord_names(variable_strings)) == {"lat", "lon", "time"} + + # Test 3: Variable with mixed coordinate types + # NOTE: mixing Coordinate objects and coordinate name strings is not allowed by the + # Variable schema + + +def test__get_np_datatype() -> None: + """Comprehensive test for _get_np_datatype function.""" + # Test 1: ScalarType cases - all supported scalar types + scalar_type_tests = [ + (ScalarType.FLOAT32, "float32"), + (ScalarType.FLOAT64, "float64"), + (ScalarType.INT8, "int8"), + (ScalarType.INT16, "int16"), + (ScalarType.INT32, "int32"), + (ScalarType.INT64, "int64"), + (ScalarType.UINT8, "uint8"), + (ScalarType.UINT16, "uint16"), + (ScalarType.UINT32, "uint32"), + (ScalarType.UINT64, "uint64"), + (ScalarType.COMPLEX64, "complex64"), + (ScalarType.COMPLEX128, "complex128"), + (ScalarType.BOOL, "bool"), + ] + + for scalar_type, expected_numpy_type in scalar_type_tests: + variable = Variable(name="test_var", dimensions=[], data_type=scalar_type) + + result = _get_np_datatype(variable) + expected = np_dtype(expected_numpy_type) + + assert result == expected + assert isinstance(result, np_dtype) + assert result.name == expected.name + + # Test 2: StructuredType with multiple fields + multi_fields = [ + StructuredField(name="x", format=ScalarType.FLOAT64), + StructuredField(name="y", format=ScalarType.FLOAT64), + StructuredField(name="z", format=ScalarType.FLOAT64), + StructuredField(name="id", format=ScalarType.INT32), + StructuredField(name="valid", format=ScalarType.BOOL), + ] + structured_multi = StructuredType(fields=multi_fields) + + variable_multi_struct = Variable( + name="multi_struct_var", dimensions=[], data_type=structured_multi + ) + + result_multi = _get_np_datatype(variable_multi_struct) + expected_multi = np_dtype( + [("x", "float64"), ("y", "float64"), ("z", "float64"), ("id", "int32"), ("valid", "bool")] + ) + + assert result_multi == expected_multi + assert isinstance(result_multi, np_dtype) + assert len(result_multi.names) == 5 + assert set(result_multi.names) == {"x", "y", "z", "id", "valid"} + + +def test__get_zarr_shape() -> None: + """Test for _get_zarr_shape function.""" + d1 = NamedDimension(name="inline", size=100) + d2 = NamedDimension(name="crossline", size=200) + d3 = NamedDimension(name="depth", size=300) + + v = Variable(name="seismic 3d var", data_type=ScalarType.FLOAT32, dimensions=[d1, d2, d3]) + assert _get_zarr_shape(v, all_named_dims=[d1, d2, d3]) == (100, 200, 300) + + +def test__get_zarr_chunks() -> None: + """Test for _get_zarr_chunks function.""" + d1 = NamedDimension(name="inline", size=100) + d2 = NamedDimension(name="crossline", size=200) + d3 = NamedDimension(name="depth", size=300) + + # Test 1: Variable with chunk defined in metadata + v = Variable( + name="seismic 3d var", + data_type=ScalarType.FLOAT32, + dimensions=[d1, d2, d3], + metadata=_to_dictionary( + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape(chunk_shape=[10, 20, 30]) + ) + ) + ), + ) + assert _get_zarr_chunks(v, all_named_dims=[d1, d2, d3]) == (10, 20, 30) + + # Test 2: Variable with no chunks defined + v = Variable(name="seismic 3d var", data_type=ScalarType.FLOAT32, dimensions=[d1, d2, d3]) + assert _get_zarr_chunks(v, all_named_dims=[d1, d2, d3]) == (100, 200, 300) + + +def test__get_fill_value() -> None: + """Test for _get_fill_value function.""" + # Test 1: ScalarType cases - should return values from fill_value_map + scalar_types = [ + ScalarType.BOOL, + ] + for scalar_type in scalar_types: + assert _get_fill_value(scalar_type) is None + + scalar_types = [ + ScalarType.FLOAT16, + ScalarType.FLOAT32, + ScalarType.FLOAT64, + ] + for scalar_type in scalar_types: + assert np_isnan(_get_fill_value(scalar_type)) + + scalar_types = [ + ScalarType.UINT8, + ScalarType.UINT16, + ScalarType.UINT32, + ScalarType.INT8, + ScalarType.INT16, + ScalarType.INT32, + ] + for scalar_type in scalar_types: + assert fill_value_map[scalar_type] == _get_fill_value(scalar_type) + + scalar_types = [ + ScalarType.COMPLEX64, + ScalarType.COMPLEX128, + ScalarType.COMPLEX256, + ] + for scalar_type in scalar_types: + val = _get_fill_value(scalar_type) + assert isinstance(val, complex) + assert np_isnan(val.real) + assert np_isnan(val.imag) + + # Test 2: StructuredType - should return "AAAAAAAAAAAAAAAA" + field = StructuredField(name="test_field", format=ScalarType.FLOAT32) + structured_type = StructuredType(fields=[field]) + result_structured = _get_fill_value(structured_type) + assert result_structured == "AAAAAAAAAAAAAAAA" + + # Test 3: String type - should return empty string + result_string = _get_fill_value("string_type") + assert result_string == "" + + # Test 4: Unknown type - should return None + result_none = _get_fill_value(42) # Invalid type + assert result_none is None + + # Test 5: None input - should return None + result_none_input = _get_fill_value(None) + assert result_none_input is None + + +def test__convert_compressor() -> None: + """Simple test for _convert_compressor function covering basic scenarios.""" + # Test 1: None input - should return None + result_none = _convert_compressor(None) + assert result_none is None + + # Test 2: mdio_Blosc compressor - should return nc_Blosc + result_blosc = _convert_compressor( + mdio_Blosc( + algorithm=mdio_BloscAlgorithm.LZ4, + level=5, + shuffle=mdio_BloscShuffle.AUTOSHUFFLE, + blocksize=1024, + ) + ) + assert isinstance(result_blosc, nc_Blosc) + assert result_blosc.cname == "lz4" # BloscAlgorithm.LZ4.value + assert result_blosc.clevel == 5 + assert result_blosc.shuffle == -1 # BloscShuffle.UTOSHUFFLE = -1 + assert result_blosc.blocksize == 1024 + + # Test 3: mdio_Blosc with blocksize 0 - should use 0 as blocksize + result_blosc_zero = _convert_compressor( + mdio_Blosc( + algorithm=mdio_BloscAlgorithm.ZSTD, + level=3, + shuffle=mdio_BloscShuffle.AUTOSHUFFLE, + blocksize=0, + ) + ) + assert isinstance(result_blosc_zero, nc_Blosc) + assert result_blosc_zero.blocksize == 0 + + # Test 4: mdio_ZFP compressor - should return zfpy_ZFPY if available + zfp_compressor = mdio_ZFP(mode=mdio_ZFPMode.FIXED_RATE, tolerance=0.01, rate=8.0, precision=16) + + if HAS_ZFPY: + result_zfp = _convert_compressor(zfp_compressor) + assert isinstance(result_zfp, zfpy_ZFPY) + assert result_zfp.mode == 1 # ZFPMode.FIXED_RATE.value = "fixed_rate" + assert result_zfp.tolerance == 0.01 + assert result_zfp.rate == 8.0 + assert result_zfp.precision == 16 + else: + # Test 5: mdio_ZFP without zfpy installed - should raise ImportError + with pytest.raises(ImportError) as exc_info: + _convert_compressor(zfp_compressor) + + error_message = str(exc_info.value) + assert "zfpy and numcodecs are required to use ZFP compression" in error_message -from .helpers import make_campos_3d_acceptance_dataset + # Test 6: Unsupported compressor type - should raise TypeError + unsupported_compressor = "invalid_compressor" + with pytest.raises(TypeError) as exc_info: + _convert_compressor(unsupported_compressor) + error_message = str(exc_info.value) + assert "Unsupported compressor model" in error_message + assert "" in error_message -def test_to_xarray_dataset() -> None: +def test_to_xarray_dataset(tmp_path) -> None: # noqa: ANN001 - tmp_path is a pytest fixture """Test building a complete dataset.""" dataset = ( MDIODatasetBuilder("test_dataset") @@ -35,16 +368,15 @@ def test_to_xarray_dataset() -> None: xr_ds = to_xarray_dataset(dataset) - file_name = "sample_dataset" - to_zarr(xr_ds, f"test-data/{file_name}.zarr", mode="w") + file_path = output_path(tmp_path, f"{xr_ds.attrs['name']}", debugging=False) + to_zarr(xr_ds, file_path, mode="w") -def test_campos_3d_acceptance_to_xarray_dataset() -> None: +def test_seismic_poststack_3d_acceptance_to_xarray_dataset(tmp_path) -> None: # noqa: ANN001 """Test building a complete dataset.""" - dataset = make_campos_3d_acceptance_dataset() + dataset = make_seismic_poststack_3d_acceptance_dataset() xr_ds = to_xarray_dataset(dataset) - # file_name = "XYZ" - file_name = f"{xr_ds.attrs['name']}" - to_zarr(xr_ds, f"test-data/{file_name}.zarr", mode="w") + file_path = output_path(tmp_path, f"{xr_ds.attrs['name']}", debugging=False) + to_zarr(xr_ds, file_path, mode="w") From 7b3ba70ecc508cc28fd472390254ca47e37c1d62 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Mon, 14 Jul 2025 23:12:56 +0000 Subject: [PATCH 46/56] Update _get_fill_value for StructuredType --- src/mdio/schemas/v1/dataset_serializer.py | 10 ++++++++-- tests/unit/v1/test_dataset_serializer.py | 18 +++++++++++------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/mdio/schemas/v1/dataset_serializer.py b/src/mdio/schemas/v1/dataset_serializer.py index a8c871ac4..932816f25 100644 --- a/src/mdio/schemas/v1/dataset_serializer.py +++ b/src/mdio/schemas/v1/dataset_serializer.py @@ -170,8 +170,8 @@ def _get_fill_value(data_type: ScalarType | StructuredType | str) -> any: if isinstance(data_type, ScalarType): return fill_value_map.get(data_type) if isinstance(data_type, StructuredType): - return "AAAAAAAAAAAAAAAA" # BUG: this does not work!!! - if isinstance(data_type, str): + return tuple(fill_value_map.get(field.format) for field in data_type.fields) + if isinstance(data_type, str): return "" # If we do not have a fill value for this type, use None return None @@ -222,6 +222,12 @@ def to_xarray_dataset(mdio_ds: Dataset) -> xr_DataArray: # noqa: PLR0912 # Create a custom chunk key encoding with "/" as separator chunk_key_encoding = V2ChunkKeyEncoding(separator="/").to_dict() encoding = { + # Is this a bug in Zarr? For datatype: + # dtype([('cdp-x', ' None: val = _get_fill_value(scalar_type) assert isinstance(val, complex) assert np_isnan(val.real) - assert np_isnan(val.imag) - - # Test 2: StructuredType - should return "AAAAAAAAAAAAAAAA" - field = StructuredField(name="test_field", format=ScalarType.FLOAT32) - structured_type = StructuredType(fields=[field]) + assert np_isnan(val.imag) + + # Test 2: StructuredType + f1 = StructuredField(name="cdp-x", format=ScalarType.INT32) + f2 = StructuredField(name="cdp-y", format=ScalarType.INT32) + f3 = StructuredField(name="elevation", format=ScalarType.FLOAT16) + f4 = StructuredField(name="some_scalar", format=ScalarType.FLOAT16) + structured_type = StructuredType(fields=[f1, f2, f3, f4]) result_structured = _get_fill_value(structured_type) - assert result_structured == "AAAAAAAAAAAAAAAA" + assert result_structured == (2147483647, 2147483647, np_nan, np_nan) # Test 3: String type - should return empty string result_string = _get_fill_value("string_type") @@ -378,5 +382,5 @@ def test_seismic_poststack_3d_acceptance_to_xarray_dataset(tmp_path) -> None: # xr_ds = to_xarray_dataset(dataset) - file_path = output_path(tmp_path, f"{xr_ds.attrs['name']}", debugging=False) + file_path = output_path(tmp_path, f"{xr_ds.attrs['name']}", debugging=True) to_zarr(xr_ds, file_path, mode="w") From a4ff4a988188fb5859082566c5db2f1095b98a8f Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Wed, 16 Jul 2025 20:05:30 +0000 Subject: [PATCH 47/56] Fix fill type issue for the Structured Types --- src/mdio/constants.py | 16 +-- src/mdio/schemas/v1/dataset_serializer.py | 37 +++--- tests/unit/v1/test_dataset_serializer.py | 137 +++++++++++++++++++--- 3 files changed, 149 insertions(+), 41 deletions(-) diff --git a/src/mdio/constants.py b/src/mdio/constants.py index b6fff807c..5b8384e02 100644 --- a/src/mdio/constants.py +++ b/src/mdio/constants.py @@ -45,14 +45,14 @@ ScalarType.FLOAT16: np_nan, ScalarType.FLOAT32: np_nan, ScalarType.FLOAT64: np_nan, - ScalarType.UINT8: 2**8 - 1, # Max value for uint8 - ScalarType.UINT16: 2**16 - 1, # Max value for uint16 - ScalarType.UINT32: 2**32 - 1, # Max value for uint32 - ScalarType.UINT64: 2**64 - 1, # Max value for uint64 - ScalarType.INT8: 2**7 - 1, # Max value for int8 - ScalarType.INT16: 2**15 - 1, # Max value for int16 - ScalarType.INT32: 2**31 - 1, # Max value for int32 - ScalarType.INT64: 2**63 - 1, # Max value for int64 + ScalarType.UINT8: UINT8_MAX, + ScalarType.UINT16: UINT16_MAX, + ScalarType.UINT32: UINT32_MAX, + ScalarType.UINT64: UINT64_MAX, + ScalarType.INT8: INT8_MAX, + ScalarType.INT16: INT16_MAX, + ScalarType.INT32: INT32_MAX, + ScalarType.INT64: INT64_MAX, ScalarType.COMPLEX64: complex(np_nan, np_nan), ScalarType.COMPLEX128: complex(np_nan, np_nan), ScalarType.COMPLEX256: complex(np_nan, np_nan), diff --git a/src/mdio/schemas/v1/dataset_serializer.py b/src/mdio/schemas/v1/dataset_serializer.py index 932816f25..f3dcdb169 100644 --- a/src/mdio/schemas/v1/dataset_serializer.py +++ b/src/mdio/schemas/v1/dataset_serializer.py @@ -2,11 +2,12 @@ from collections.abc import Mapping -from dask import array as dask_array +import numpy as np from numcodecs import Blosc as nc_Blosc from numpy import dtype as np_dtype from xarray import DataArray as xr_DataArray from xarray import Dataset as xr_Dataset +from zarr import zeros as zarr_zeros from zarr.core.chunk_key_encodings import V2ChunkKeyEncoding try: @@ -90,15 +91,14 @@ def _get_coord_names(var: Variable) -> list[str]: return coord_names -def _get_np_datatype(var: Variable) -> np_dtype: +def _get_np_datatype(data_type: ScalarType | StructuredType) -> np_dtype: """Get the numpy dtype for a variable.""" - data_type = var.data_type if isinstance(data_type, ScalarType): return np_dtype(data_type.value) if isinstance(data_type, StructuredType): return np_dtype([(f.name, f.format.value) for f in data_type.fields]) - err = f"Unsupported data type: {type(data_type)} in variable {var.name}" - raise TypeError(err) + msg = f"Expected ScalarType or StructuredType, got {type(data_type).__name__}" + raise ValueError(msg) def _get_zarr_shape(var: Variable, all_named_dims: dict[str, NamedDimension]) -> tuple[int, ...]: @@ -170,8 +170,9 @@ def _get_fill_value(data_type: ScalarType | StructuredType | str) -> any: if isinstance(data_type, ScalarType): return fill_value_map.get(data_type) if isinstance(data_type, StructuredType): - return tuple(fill_value_map.get(field.format) for field in data_type.fields) - if isinstance(data_type, str): + d_type = _get_np_datatype(data_type) + return np.zeros((), dtype=d_type) + if isinstance(data_type, str): return "" # If we do not have a fill value for this type, use None return None @@ -186,6 +187,10 @@ def to_xarray_dataset(mdio_ds: Dataset) -> xr_DataArray: # noqa: PLR0912 Args: mdio_ds: The source MDIO dataset to construct from. + Notes: + - We can't use Dask (e.g., dask_array.zeros) because of the problems with + structured type support. We will uze zarr.zeros instead + Returns: The constructed dataset with proper MDIO structure and metadata. """ @@ -197,15 +202,16 @@ def to_xarray_dataset(mdio_ds: Dataset) -> xr_DataArray: # noqa: PLR0912 # First pass: Build all variables data_arrays: dict[str, xr_DataArray] = {} for v in mdio_ds.variables: - # Use dask array instead of numpy array for lazy evaluation shape = _get_zarr_shape(v, all_named_dims=all_named_dims) - dtype = _get_np_datatype(v) + dtype = _get_np_datatype(v.data_type) chunks = _get_zarr_chunks(v, all_named_dims=all_named_dims) - arr = dask_array.zeros(shape, dtype=dtype, chunks=chunks) + # Use zarr.zeros to create an empty array with the specified shape and dtype + # NOTE: zarr_format=2 is essential, to_zarr() will fail if zarr_format=2 is used + data = zarr_zeros(shape=shape, dtype=dtype, zarr_format=2) # Create a DataArray for the variable. We will set coords in the second pass dim_names = _get_dimension_names(v) - data_array = xr_DataArray(arr, dims=dim_names) + data_array = xr_DataArray(data, dims=dim_names) # Add array attributes if v.metadata is not None: @@ -222,13 +228,8 @@ def to_xarray_dataset(mdio_ds: Dataset) -> xr_DataArray: # noqa: PLR0912 # Create a custom chunk key encoding with "/" as separator chunk_key_encoding = V2ChunkKeyEncoding(separator="/").to_dict() encoding = { - # Is this a bug in Zarr? For datatype: - # dtype([('cdp-x', ' None: ] for scalar_type, expected_numpy_type in scalar_type_tests: - variable = Variable(name="test_var", dimensions=[], data_type=scalar_type) - - result = _get_np_datatype(variable) + result = _get_np_datatype(scalar_type) expected = np_dtype(expected_numpy_type) assert result == expected @@ -176,12 +178,7 @@ def test__get_np_datatype() -> None: StructuredField(name="valid", format=ScalarType.BOOL), ] structured_multi = StructuredType(fields=multi_fields) - - variable_multi_struct = Variable( - name="multi_struct_var", dimensions=[], data_type=structured_multi - ) - - result_multi = _get_np_datatype(variable_multi_struct) + result_multi = _get_np_datatype(structured_multi) expected_multi = np_dtype( [("x", "float64"), ("y", "float64"), ("z", "float64"), ("id", "int32"), ("valid", "bool")] ) @@ -254,7 +251,8 @@ def test__get_fill_value() -> None: ScalarType.INT32, ] for scalar_type in scalar_types: - assert fill_value_map[scalar_type] == _get_fill_value(scalar_type) + fill_value = _get_fill_value(scalar_type) + assert fill_value_map[scalar_type] == fill_value scalar_types = [ ScalarType.COMPLEX64, @@ -265,7 +263,7 @@ def test__get_fill_value() -> None: val = _get_fill_value(scalar_type) assert isinstance(val, complex) assert np_isnan(val.real) - assert np_isnan(val.imag) + assert np_isnan(val.imag) # Test 2: StructuredType f1 = StructuredField(name="cdp-x", format=ScalarType.INT32) @@ -273,8 +271,15 @@ def test__get_fill_value() -> None: f3 = StructuredField(name="elevation", format=ScalarType.FLOAT16) f4 = StructuredField(name="some_scalar", format=ScalarType.FLOAT16) structured_type = StructuredType(fields=[f1, f2, f3, f4]) - result_structured = _get_fill_value(structured_type) - assert result_structured == (2147483647, 2147483647, np_nan, np_nan) + + expected = np_array( + (0, 0, 0.0, 0.0), + dtype=np_dtype( + [("cdp-x", " None: # xr_ds = to_xarray_dataset(dataset) - file_path = output_path(tmp_path, f"{xr_ds.attrs['name']}", debugging=True) + file_path = output_path(tmp_path, f"{xr_ds.attrs['name']}", debugging=False) to_zarr(xr_ds, file_path, mode="w") + + +@pytest.mark.skip(reason="Issues serializing dask arrays of structured types to dask.") +def test_to_zarr_dask(tmp_path) -> None: # noqa: ANN001 + """Test writing XArray dataset with data as dask array to Zar.""" + # Create a data type and the fill value + dtype = np_dtype([("inline", "int32"), ("cdp-x", "float64")]) + dtype_fill_value = np_zeros((), dtype=dtype) + + # Use '_FillValue' instead of 'fill_value' + # 'fill_value' is not a valid encoding key in Zarr v2 + my_attr_encoding = { + "_FillValue": dtype_fill_value, + "chunk_key_encoding": {"name": "v2", "separator": "/"}, + } + + # Create a dask array using the data type + # Do not specify encoding as the array attribute + data = dask_array.zeros((36,), dtype=dtype, chunks=(36,)) + aa = xr_DataArray(name="myattr", data=data) + + # Specify encoding per array + encoding = {"myattr": my_attr_encoding} + file_path = output_path(tmp_path, "to_zarr/zarr_dask", debugging=False) + aa.to_zarr(file_path, mode="w", zarr_format=2, encoding=encoding, compute=False) + + +def test_to_zarr_zarr_zerros_1(tmp_path) -> None: # noqa: ANN001 + """Test writing XArray dataset with data as Zarr zero array to Zar. + + Set encoding in as DataArray attributes + """ + # Create a data type and the fill value + dtype = np_dtype([("inline", "int32"), ("cdp-x", "float64")]) + dtype_fill_value = np_zeros((), dtype=dtype) + + # Use '_FillValue' instead of 'fill_value' + # 'fill_value' is not a valid encoding key in Zarr v2 + my_attr_encoding = { + "_FillValue": dtype_fill_value, + "chunk_key_encoding": {"name": "v2", "separator": "/"}, + } + + # Create a zarr array using the data type, + # Specify encoding as the array attribute + data = zarr_zeros((36, 36), dtype=dtype, zarr_format=2) + aa = xr_DataArray(name="myattr", data=data) + aa.encoding = my_attr_encoding + + file_path = output_path(tmp_path, "to_zarr/zarr_zarr_zerros_1", debugging=False) + aa.to_zarr(file_path, mode="w", zarr_format=2, compute=False) + + +def test_to_zarr_zarr_zerros_2(tmp_path) -> None: # noqa: ANN001 + """Test writing XArray dataset with data as Zarr zero array to Zar. + + Set encoding in the to_zar method + """ + # Create a data type and the fill value + dtype = np_dtype([("inline", "int32"), ("cdp-x", "float64")]) + dtype_fill_value = np_zeros((), dtype=dtype) + + # Use '_FillValue' instead of 'fill_value' + # 'fill_value' is not a valid encoding key in Zarr v2 + my_attr_encoding = { + "_FillValue": dtype_fill_value, + "chunk_key_encoding": {"name": "v2", "separator": "/"}, + } + + # Create a zarr array using the data type, + # Do not specify encoding as the array attribute + data = zarr_zeros((36, 36), dtype=dtype, zarr_format=2) + aa = xr_DataArray(name="myattr", data=data) + + file_path = output_path(tmp_path, "to_zarr/zarr_zarr_zerros_2", debugging=False) + # Specify encoding per array + encoding = {"myattr": my_attr_encoding} + aa.to_zarr(file_path, mode="w", zarr_format=2, encoding=encoding, compute=False) + + +def test_to_zarr_np(tmp_path) -> None: # noqa: ANN001 + """Test writing XArray dataset with data as NumPy array to Zar.""" + # Create a data type and the fill value + dtype = np_dtype([("inline", "int32"), ("cdp-x", "float64")]) + dtype_fill_value = np_zeros((), dtype=dtype) + + # Use '_FillValue' instead of 'fill_value' + # 'fill_value' is not a valid encoding key in Zarr v2 + my_attr_encoding = { + "_FillValue": dtype_fill_value, + "chunk_key_encoding": {"name": "v2", "separator": "/"}, + } + + # Create a zarr array using the data type + # Do not specify encoding as the array attribute + data = np_zeros((36, 36), dtype=dtype) + aa = xr_DataArray(name="myattr", data=data) + + file_path = output_path(tmp_path, "to_zarr/zarr_np", debugging=False) + # Specify encoding per array + encoding = {"myattr": my_attr_encoding} + aa.to_zarr(file_path, mode="w", zarr_format=2, encoding=encoding, compute=False) From 81bfa762c8b6903a6ee7a46ab06cd1d381196c26 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Wed, 16 Jul 2025 20:43:11 +0000 Subject: [PATCH 48/56] Improve code coverage --- src/mdio/schemas/v1/dataset_serializer.py | 2 +- tests/unit/v1/test_dataset_serializer.py | 23 ++++++++++++++++++++--- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/mdio/schemas/v1/dataset_serializer.py b/src/mdio/schemas/v1/dataset_serializer.py index f3dcdb169..f1d21221e 100644 --- a/src/mdio/schemas/v1/dataset_serializer.py +++ b/src/mdio/schemas/v1/dataset_serializer.py @@ -97,7 +97,7 @@ def _get_np_datatype(data_type: ScalarType | StructuredType) -> np_dtype: return np_dtype(data_type.value) if isinstance(data_type, StructuredType): return np_dtype([(f.name, f.format.value) for f in data_type.fields]) - msg = f"Expected ScalarType or StructuredType, got {type(data_type).__name__}" + msg = f"Expected ScalarType or StructuredType, got '{type(data_type).__name__}'" raise ValueError(msg) diff --git a/tests/unit/v1/test_dataset_serializer.py b/tests/unit/v1/test_dataset_serializer.py index 8aff471a4..3b135f83d 100644 --- a/tests/unit/v1/test_dataset_serializer.py +++ b/tests/unit/v1/test_dataset_serializer.py @@ -160,6 +160,9 @@ def test__get_np_datatype() -> None: (ScalarType.COMPLEX128, "complex128"), (ScalarType.BOOL, "bool"), ] + err = "Expected ScalarType or StructuredType, got 'str'" + with pytest.raises(ValueError, match=err): + _get_np_datatype("parameter of invalid type") for scalar_type, expected_numpy_type in scalar_type_tests: result = _get_np_datatype(scalar_type) @@ -194,9 +197,24 @@ def test__get_zarr_shape() -> None: d1 = NamedDimension(name="inline", size=100) d2 = NamedDimension(name="crossline", size=200) d3 = NamedDimension(name="depth", size=300) + all_named_dims = {"inline": d1, "crossline": d2, "depth": d3} + v1 = Variable(name="named dims var", data_type=ScalarType.FLOAT32, dimensions=[d1, d2, d3]) + v2 = Variable( + name="str var", data_type=ScalarType.FLOAT32, dimensions=["inline", "crossline", "depth"] + ) + Dataset( + variables=[v1, v2], + metadata=_to_dictionary( + [ + DatasetInfo( + name="test_dataset", api_version="1.0.0", created_on="2023-10-01T00:00:00Z" + ) + ] + ), + ) - v = Variable(name="seismic 3d var", data_type=ScalarType.FLOAT32, dimensions=[d1, d2, d3]) - assert _get_zarr_shape(v, all_named_dims=[d1, d2, d3]) == (100, 200, 300) + assert _get_zarr_shape(v1, all_named_dims) == (100, 200, 300) + assert _get_zarr_shape(v2, all_named_dims) == (100, 200, 300) def test__get_zarr_chunks() -> None: @@ -341,7 +359,6 @@ def test__convert_compressor() -> None: # Test 5: mdio_ZFP without zfpy installed - should raise ImportError with pytest.raises(ImportError) as exc_info: _convert_compressor(zfp_compressor) - error_message = str(exc_info.value) assert "zfpy and numcodecs are required to use ZFP compression" in error_message From 04476597f92721ccf2c040caba9c1e402ba5cea7 Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Thu, 17 Jul 2025 15:50:33 +0000 Subject: [PATCH 49/56] Fix spelling --- .devcontainer/Dockerfile.cli | 48 +++++++++++++++++++++++++ .devcontainer/Dockerfile.dev | 63 +++++++++++++++++++++++++++++++++ .devcontainer/Dockerfile.nox | 49 +++++++++++++++++++++++++ .devcontainer/devcontainer.json | 20 ++++++----- tests/unit/v1/helpers.py | 2 +- 5 files changed, 172 insertions(+), 10 deletions(-) create mode 100644 .devcontainer/Dockerfile.cli create mode 100644 .devcontainer/Dockerfile.dev create mode 100644 .devcontainer/Dockerfile.nox diff --git a/.devcontainer/Dockerfile.cli b/.devcontainer/Dockerfile.cli new file mode 100644 index 000000000..f35cbac7b --- /dev/null +++ b/.devcontainer/Dockerfile.cli @@ -0,0 +1,48 @@ +# HOW TO BUILD AND RUN THIS DOCKERFILE +# * Clone mdio-python and build a Docker image: +# git clone https://github.com/TGSAI/mdio-python.git +# cd mdio-python +# docker build -t mdio-cli -f .devcontainer/Dockerfile.cli . +# * Run /bin/bash in the Docker container: +# +# +# USAGE: +# docker run -it --rm --name mdio-cli mdio-cli --version +# docker run -it --rm --name mdio-cli mdio-cli --help +# +# LOCAL_DATA_DIR=$(pwd); \ +# docker run -it --rm -v $LOCAL_DATA_DIR:/DATA --name mdio-cli mdio-cli \ +# segy import \ +# /DATA/segy_file.segy \ +# /DATA/mdio_file.mdio \ +# -loc 181,185 \ +# -names inline,crossline +# +# LOCAL_DATA_DIR=$(pwd); \ +# docker run -it --rm -v $LOCAL_DATA_DIR:/DATA --name mdio-cli mdio-cli \ +# segy export \ +# /DATA/mdio_file.mdio \ +# /DATA/segy_file_copy.segy +# +FROM python:3.13-bookworm +# Create the user (https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user) +ENV USERNAME=python +ENV USER_UID=1000 +ENV USER_GID=$USER_UID +RUN groupadd --gid $USER_GID $USERNAME && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME + +# Set the default non-root user +USER $USERNAME + +# Add path to the user-installed packages +ENV PYTHONUSERBASE=/home/$USERNAME/.local +ENV PATH="$PYTHONUSERBASE/bin:$PATH" + +COPY --chown=$USERNAME:$USERNAME ./ /home/$USERNAME/mdio-python + +WORKDIR /home/$USERNAME/mdio-python +RUN pip install pre-commit ruff +RUN pip install . + +ENTRYPOINT ["mdio"] +CMD ["--version"] diff --git a/.devcontainer/Dockerfile.dev b/.devcontainer/Dockerfile.dev new file mode 100644 index 000000000..6657bf581 --- /dev/null +++ b/.devcontainer/Dockerfile.dev @@ -0,0 +1,63 @@ +# USAGE: +# This file will be used by the VS Code DevContainer extension +# to create a development environment for the mdio-python project. +# HOW TO RUN TESTS +# 1. Open the project in VS Code. +# 2. Open the Command Palette (Ctrl+Shift+P) and select "Dev Containers: Reopen in Container". +# 3. Once the container is running, open a terminal in VS Code. +# 4. Run the tests using the command: `nox -s test`. +# HOW TO MANUALLY BUILD AND RUN THE CONTAINER +# docker build -t mdio-dev -f .devcontainer/Dockerfile.dev . +# docker run -it --rm --entrypoint /bin/bash --name mdio-dev mdio-dev +# NOTES: +# 1. The container will be run as the non-root user 'vscode' with UID 1000. +# 2. The virtual environment will be setup at /home/vscode/venv +# 3. The project source code will be mounted at /workspaces/mdio-python +ARG PYTHON_VERSION="3.13" +ARG LINUX_DISTRO="bookworm" +ARG UV_VERSION="0.6.11" +ARG NOX_VERSION="2025.2.9" +FROM mcr.microsoft.com/devcontainers/python:1-${PYTHON_VERSION}-${LINUX_DISTRO} + +# Install git for nox pre-commit +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + git \ + && rm -rf /var/lib/apt/lists/* + +ENV USERNAME="vscode" +USER $USERNAME + +# # Add path to the user-installed packages +# ENV PYTHONUSERBASE=/home/$USERNAME/.local +# ENV PATH="$PYTHONUSERBASE/bin:$PATH" + +COPY --chown=$USERNAME:$USERNAME ./ /workspaces/mdio-python + +WORKDIR /workspaces/mdio-python + +ARG UV_VERSION +ARG NOX_VERSION +RUN python3 -m pip install uv==${UV_VERSION} nox==${NOX_VERSION} msgpack ipykernel + +# Initialize virtual environement in the container +ENV VIRTUAL_ENV="/home/$USERNAME/venv" +RUN python3 -m venv $VIRTUAL_ENV +ENV PATH="$VIRTUAL_ENV/bin:$PATH" + +# installing pytest is required for VS Code Python Testing +RUN pip install pytest pytest-cov pytest-mock pytest-asyncio +# install packages required to run `pre-commit run --all-files` +RUN pip install ruff pre-commit pre-commit-hooks + +# Install the project in editable mode +# This allows for live reloading of the code during development +RUN pip install -e . + +# RUN uv pip install snakeviz + + + + + + diff --git a/.devcontainer/Dockerfile.nox b/.devcontainer/Dockerfile.nox new file mode 100644 index 000000000..103673fd2 --- /dev/null +++ b/.devcontainer/Dockerfile.nox @@ -0,0 +1,49 @@ +# HOW TO BUILD AND RUN THIS DOCKERFILE +# 1. Make sure you have Docker installed and running. +# 2. Clone mdio-python and build the Docker image: +# git clone https://github.com/TGSAI/mdio-python.git +# cd mdio-python +# docker build -t mdio-nox -f .devcontainer/Dockerfile.nox . +# 3. Run /bin/bash in the Docker container : +# LOCAL_DATA_DIR=$(pwd); \ +# docker run -it --rm -v $LOCAL_DATA_DIR:/DATA --entrypoint /bin/bash --name mdio-nox mdio-nox +# +# USAGE: +# docker run -it --rm mdio-nox --list +# docker run -it --rm mdio-nox -s tests-3.13 +# docker run -it --rm mdio-nox --no-stop-on-first-error +# +# NOTE: nox will fail if run in the directory mounted from the host machine +ARG PYTHON_VERSION="3.13" +ARG LINUX_DISTRO="bookworm" +ARG UV_VERSION="0.6.11" +ARG NOX_VERSION="2025.2.9" +FROM python:${PYTHON_VERSION}-${LINUX_DISTRO} +ARG PYTHON_VERSION +ARG LINUX_DISTRO +RUN echo "Using python:${PYTHON_VERSION}-${LINUX_DISTRO}" +# Create the user (https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user) +ENV USERNAME=python +ENV USER_UID=1000 +ENV USER_GID=$USER_UID +RUN groupadd --gid $USER_GID $USERNAME && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME +# Set the default non-root user +USER $USERNAME + +# Add path to the user-installed packages +ENV PYTHONUSERBASE=/home/$USERNAME/.local +ENV PATH="$PYTHONUSERBASE/bin:$PATH" + +COPY --chown=$USERNAME:$USERNAME ./ /home/$USERNAME/mdio-python + +WORKDIR /home/$USERNAME/mdio-python +RUN pip install . + +# Install UV dependency manager and Nox test automator +ARG UV_VERSION +ARG NOX_VERSION +RUN echo "Using uv: $UV_VERSION and nox: $NOX_VERSION" +RUN python3 -m pip install uv==${UV_VERSION} nox==${NOX_VERSION} msgpack ipykernel + +ENTRYPOINT ["nox"] +CMD ["--list"] \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b618a5260..9eaf41dc0 100755 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,12 +2,12 @@ // README at: https://github.com/devcontainers/templates/tree/main/src/python { "build": { - "dockerfile": "Dockerfile", + "dockerfile": "Dockerfile.dev", "context": ".." }, // Use 'postCreateCommand' to run commands after the container is created. "postCreateCommand": { - "post_create_script": "bash ./.devcontainer/post-install.sh" + // "post_create_script": "bash ./.devcontainer/post-install.sh" }, // Forward 8787 to enable us to view dask dashboard "forwardPorts": [8787], @@ -16,8 +16,9 @@ // Configure properties specific to VS Code. "vscode": { "settings": { - "python.terminal.activateEnvInCurrentTerminal": true, - "python.defaultInterpreterPath": "/opt/venv/bin/python" + "python.testing.pytestArgs": ["tests"], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true }, "extensions": [ "ms-python.python", @@ -27,17 +28,18 @@ "ms-toolsai.jupyter-renderers", "vscode-icons-team.vscode-icons", "wayou.vscode-todo-highlight", - "streetsidesoftware.code-spell-checker" + "streetsidesoftware.code-spell-checker", + "eamodio.gitlens", + "visualstudioexptteam.vscodeintellicode" ] } }, // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. // "remoteUser": "root", "updateRemoteUserUID": true, + "workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/mdio-python,type=bind", + "workspaceFolder": "/workspaces/mdio-python", "mounts": [ - // Re-use local Git configuration - "source=${localEnv:HOME}/.gitconfig,target=/home/vscode/.gitconfig_tmp,type=bind,consistency=cached", - "source=${localEnv:HOME}/.gitconfig,target=/root/.gitconfig_tmp,type=bind,consistency=cached", - "source=${localEnv:SCRATCH_DIR}/${localEnv:USER},target=/scratch/,type=bind,consistency=cached" + // "source=${localWorkspaceFolder}/../DATA/,target=/DATA/,type=bind,consistency=cached" ] } diff --git a/tests/unit/v1/helpers.py b/tests/unit/v1/helpers.py index d0ebe5d79..c031f6c5e 100644 --- a/tests/unit/v1/helpers.py +++ b/tests/unit/v1/helpers.py @@ -129,7 +129,7 @@ def _get_coordinate( def _get_all_coordinates(dataset: Dataset) -> list[Coordinate]: - """Get all coordinates from the dataset.""" + """Get all Coordinates from the Dataset.""" all_coords: dict[str, Coordinate] = {} for v in dataset.variables: if v.coordinates is not None: From d08e2c43f0c10cb187ec5b0226984ff80c44b74e Mon Sep 17 00:00:00 2001 From: Dmitriy Repin Date: Thu, 17 Jul 2025 11:19:14 -0500 Subject: [PATCH 50/56] Revert "Fix spelling" This reverts commit 04476597f92721ccf2c040caba9c1e402ba5cea7. --- .devcontainer/Dockerfile.cli | 48 ------------------------- .devcontainer/Dockerfile.dev | 63 --------------------------------- .devcontainer/Dockerfile.nox | 49 ------------------------- .devcontainer/devcontainer.json | 20 +++++------ tests/unit/v1/helpers.py | 2 +- 5 files changed, 10 insertions(+), 172 deletions(-) delete mode 100644 .devcontainer/Dockerfile.cli delete mode 100644 .devcontainer/Dockerfile.dev delete mode 100644 .devcontainer/Dockerfile.nox diff --git a/.devcontainer/Dockerfile.cli b/.devcontainer/Dockerfile.cli deleted file mode 100644 index f35cbac7b..000000000 --- a/.devcontainer/Dockerfile.cli +++ /dev/null @@ -1,48 +0,0 @@ -# HOW TO BUILD AND RUN THIS DOCKERFILE -# * Clone mdio-python and build a Docker image: -# git clone https://github.com/TGSAI/mdio-python.git -# cd mdio-python -# docker build -t mdio-cli -f .devcontainer/Dockerfile.cli . -# * Run /bin/bash in the Docker container: -# -# -# USAGE: -# docker run -it --rm --name mdio-cli mdio-cli --version -# docker run -it --rm --name mdio-cli mdio-cli --help -# -# LOCAL_DATA_DIR=$(pwd); \ -# docker run -it --rm -v $LOCAL_DATA_DIR:/DATA --name mdio-cli mdio-cli \ -# segy import \ -# /DATA/segy_file.segy \ -# /DATA/mdio_file.mdio \ -# -loc 181,185 \ -# -names inline,crossline -# -# LOCAL_DATA_DIR=$(pwd); \ -# docker run -it --rm -v $LOCAL_DATA_DIR:/DATA --name mdio-cli mdio-cli \ -# segy export \ -# /DATA/mdio_file.mdio \ -# /DATA/segy_file_copy.segy -# -FROM python:3.13-bookworm -# Create the user (https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user) -ENV USERNAME=python -ENV USER_UID=1000 -ENV USER_GID=$USER_UID -RUN groupadd --gid $USER_GID $USERNAME && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME - -# Set the default non-root user -USER $USERNAME - -# Add path to the user-installed packages -ENV PYTHONUSERBASE=/home/$USERNAME/.local -ENV PATH="$PYTHONUSERBASE/bin:$PATH" - -COPY --chown=$USERNAME:$USERNAME ./ /home/$USERNAME/mdio-python - -WORKDIR /home/$USERNAME/mdio-python -RUN pip install pre-commit ruff -RUN pip install . - -ENTRYPOINT ["mdio"] -CMD ["--version"] diff --git a/.devcontainer/Dockerfile.dev b/.devcontainer/Dockerfile.dev deleted file mode 100644 index 6657bf581..000000000 --- a/.devcontainer/Dockerfile.dev +++ /dev/null @@ -1,63 +0,0 @@ -# USAGE: -# This file will be used by the VS Code DevContainer extension -# to create a development environment for the mdio-python project. -# HOW TO RUN TESTS -# 1. Open the project in VS Code. -# 2. Open the Command Palette (Ctrl+Shift+P) and select "Dev Containers: Reopen in Container". -# 3. Once the container is running, open a terminal in VS Code. -# 4. Run the tests using the command: `nox -s test`. -# HOW TO MANUALLY BUILD AND RUN THE CONTAINER -# docker build -t mdio-dev -f .devcontainer/Dockerfile.dev . -# docker run -it --rm --entrypoint /bin/bash --name mdio-dev mdio-dev -# NOTES: -# 1. The container will be run as the non-root user 'vscode' with UID 1000. -# 2. The virtual environment will be setup at /home/vscode/venv -# 3. The project source code will be mounted at /workspaces/mdio-python -ARG PYTHON_VERSION="3.13" -ARG LINUX_DISTRO="bookworm" -ARG UV_VERSION="0.6.11" -ARG NOX_VERSION="2025.2.9" -FROM mcr.microsoft.com/devcontainers/python:1-${PYTHON_VERSION}-${LINUX_DISTRO} - -# Install git for nox pre-commit -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - git \ - && rm -rf /var/lib/apt/lists/* - -ENV USERNAME="vscode" -USER $USERNAME - -# # Add path to the user-installed packages -# ENV PYTHONUSERBASE=/home/$USERNAME/.local -# ENV PATH="$PYTHONUSERBASE/bin:$PATH" - -COPY --chown=$USERNAME:$USERNAME ./ /workspaces/mdio-python - -WORKDIR /workspaces/mdio-python - -ARG UV_VERSION -ARG NOX_VERSION -RUN python3 -m pip install uv==${UV_VERSION} nox==${NOX_VERSION} msgpack ipykernel - -# Initialize virtual environement in the container -ENV VIRTUAL_ENV="/home/$USERNAME/venv" -RUN python3 -m venv $VIRTUAL_ENV -ENV PATH="$VIRTUAL_ENV/bin:$PATH" - -# installing pytest is required for VS Code Python Testing -RUN pip install pytest pytest-cov pytest-mock pytest-asyncio -# install packages required to run `pre-commit run --all-files` -RUN pip install ruff pre-commit pre-commit-hooks - -# Install the project in editable mode -# This allows for live reloading of the code during development -RUN pip install -e . - -# RUN uv pip install snakeviz - - - - - - diff --git a/.devcontainer/Dockerfile.nox b/.devcontainer/Dockerfile.nox deleted file mode 100644 index 103673fd2..000000000 --- a/.devcontainer/Dockerfile.nox +++ /dev/null @@ -1,49 +0,0 @@ -# HOW TO BUILD AND RUN THIS DOCKERFILE -# 1. Make sure you have Docker installed and running. -# 2. Clone mdio-python and build the Docker image: -# git clone https://github.com/TGSAI/mdio-python.git -# cd mdio-python -# docker build -t mdio-nox -f .devcontainer/Dockerfile.nox . -# 3. Run /bin/bash in the Docker container : -# LOCAL_DATA_DIR=$(pwd); \ -# docker run -it --rm -v $LOCAL_DATA_DIR:/DATA --entrypoint /bin/bash --name mdio-nox mdio-nox -# -# USAGE: -# docker run -it --rm mdio-nox --list -# docker run -it --rm mdio-nox -s tests-3.13 -# docker run -it --rm mdio-nox --no-stop-on-first-error -# -# NOTE: nox will fail if run in the directory mounted from the host machine -ARG PYTHON_VERSION="3.13" -ARG LINUX_DISTRO="bookworm" -ARG UV_VERSION="0.6.11" -ARG NOX_VERSION="2025.2.9" -FROM python:${PYTHON_VERSION}-${LINUX_DISTRO} -ARG PYTHON_VERSION -ARG LINUX_DISTRO -RUN echo "Using python:${PYTHON_VERSION}-${LINUX_DISTRO}" -# Create the user (https://code.visualstudio.com/remote/advancedcontainers/add-nonroot-user) -ENV USERNAME=python -ENV USER_UID=1000 -ENV USER_GID=$USER_UID -RUN groupadd --gid $USER_GID $USERNAME && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME -# Set the default non-root user -USER $USERNAME - -# Add path to the user-installed packages -ENV PYTHONUSERBASE=/home/$USERNAME/.local -ENV PATH="$PYTHONUSERBASE/bin:$PATH" - -COPY --chown=$USERNAME:$USERNAME ./ /home/$USERNAME/mdio-python - -WORKDIR /home/$USERNAME/mdio-python -RUN pip install . - -# Install UV dependency manager and Nox test automator -ARG UV_VERSION -ARG NOX_VERSION -RUN echo "Using uv: $UV_VERSION and nox: $NOX_VERSION" -RUN python3 -m pip install uv==${UV_VERSION} nox==${NOX_VERSION} msgpack ipykernel - -ENTRYPOINT ["nox"] -CMD ["--list"] \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 9eaf41dc0..b618a5260 100755 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,12 +2,12 @@ // README at: https://github.com/devcontainers/templates/tree/main/src/python { "build": { - "dockerfile": "Dockerfile.dev", + "dockerfile": "Dockerfile", "context": ".." }, // Use 'postCreateCommand' to run commands after the container is created. "postCreateCommand": { - // "post_create_script": "bash ./.devcontainer/post-install.sh" + "post_create_script": "bash ./.devcontainer/post-install.sh" }, // Forward 8787 to enable us to view dask dashboard "forwardPorts": [8787], @@ -16,9 +16,8 @@ // Configure properties specific to VS Code. "vscode": { "settings": { - "python.testing.pytestArgs": ["tests"], - "python.testing.unittestEnabled": false, - "python.testing.pytestEnabled": true + "python.terminal.activateEnvInCurrentTerminal": true, + "python.defaultInterpreterPath": "/opt/venv/bin/python" }, "extensions": [ "ms-python.python", @@ -28,18 +27,17 @@ "ms-toolsai.jupyter-renderers", "vscode-icons-team.vscode-icons", "wayou.vscode-todo-highlight", - "streetsidesoftware.code-spell-checker", - "eamodio.gitlens", - "visualstudioexptteam.vscodeintellicode" + "streetsidesoftware.code-spell-checker" ] } }, // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. // "remoteUser": "root", "updateRemoteUserUID": true, - "workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/mdio-python,type=bind", - "workspaceFolder": "/workspaces/mdio-python", "mounts": [ - // "source=${localWorkspaceFolder}/../DATA/,target=/DATA/,type=bind,consistency=cached" + // Re-use local Git configuration + "source=${localEnv:HOME}/.gitconfig,target=/home/vscode/.gitconfig_tmp,type=bind,consistency=cached", + "source=${localEnv:HOME}/.gitconfig,target=/root/.gitconfig_tmp,type=bind,consistency=cached", + "source=${localEnv:SCRATCH_DIR}/${localEnv:USER},target=/scratch/,type=bind,consistency=cached" ] } diff --git a/tests/unit/v1/helpers.py b/tests/unit/v1/helpers.py index c031f6c5e..d0ebe5d79 100644 --- a/tests/unit/v1/helpers.py +++ b/tests/unit/v1/helpers.py @@ -129,7 +129,7 @@ def _get_coordinate( def _get_all_coordinates(dataset: Dataset) -> list[Coordinate]: - """Get all Coordinates from the Dataset.""" + """Get all coordinates from the dataset.""" all_coords: dict[str, Coordinate] = {} for v in dataset.variables: if v.coordinates is not None: From 657d2cf3438df71e2627a4b48de272b03e80581e Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Thu, 17 Jul 2025 13:11:48 -0500 Subject: [PATCH 51/56] extend per-file ignores for PLR2004 and remove noqa overrides in specific tests --- pyproject.toml | 2 +- tests/integration/test_segy_import_export.py | 4 ++-- tests/unit/test_dimension.py | 2 +- tests/unit/v1/test_dataset_builder_add_coordinate.py | 4 ---- tests/unit/v1/test_dataset_builder_add_dimension.py | 4 ---- tests/unit/v1/test_dataset_builder_add_variable.py | 4 ---- tests/unit/v1/test_dataset_builder_build.py | 4 ---- tests/unit/v1/test_dataset_builder_helpers.py | 4 ---- tests/unit/v1/test_dataset_serializer.py | 4 ---- 9 files changed, 4 insertions(+), 28 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index e2f72190f..f57ecf196 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -134,7 +134,7 @@ ignore = [ ] [tool.ruff.lint.per-file-ignores] -"tests/*" = ["S101"] +"tests/*" = ["S101", "PLR2004"] "tests/integration/test_segy_import_export_masked.py" = ["E501"] "docs/tutorials/*.ipynb" = ["S101"] diff --git a/tests/integration/test_segy_import_export.py b/tests/integration/test_segy_import_export.py index 9e3d0e1be..ecea8d1d2 100644 --- a/tests/integration/test_segy_import_export.py +++ b/tests/integration/test_segy_import_export.py @@ -272,8 +272,8 @@ class TestReader: def test_meta_read(self, zarr_tmp: Path) -> None: """Metadata reading tests.""" mdio = MDIOReader(zarr_tmp.__str__()) - assert mdio.binary_header["samples_per_trace"] == 1501 # noqa: PLR2004 - assert mdio.binary_header["sample_interval"] == 2000 # noqa: PLR2004 + assert mdio.binary_header["samples_per_trace"] == 1501 + assert mdio.binary_header["sample_interval"] == 2000 def test_grid(self, zarr_tmp: Path) -> None: """Grid reading tests.""" diff --git a/tests/unit/test_dimension.py b/tests/unit/test_dimension.py index fc40da228..e5645290e 100644 --- a/tests/unit/test_dimension.py +++ b/tests/unit/test_dimension.py @@ -17,7 +17,7 @@ class TestDimension: def test_len(self, my_dimension: Dimension) -> None: """Test length method.""" - assert len(my_dimension) == 4 # noqa: PLR2004 + assert len(my_dimension) == 4 @pytest.mark.parametrize(("index", "expected"), [(1, 12), (-1, 16), (2, 14)]) def test_getitem(self, my_dimension: Dimension, index: int, expected: int) -> None: diff --git a/tests/unit/v1/test_dataset_builder_add_coordinate.py b/tests/unit/v1/test_dataset_builder_add_coordinate.py index 20f686024..9d5f123b5 100644 --- a/tests/unit/v1/test_dataset_builder_add_coordinate.py +++ b/tests/unit/v1/test_dataset_builder_add_coordinate.py @@ -1,7 +1,3 @@ -# ruff: noqa: PLR2004 -# PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable -# The above erroneous warning is generated for every numerical assert. -# Thus, disable it for this file """Tests the schema v1 dataset_builder.add_coordinate() public API.""" import pytest diff --git a/tests/unit/v1/test_dataset_builder_add_dimension.py b/tests/unit/v1/test_dataset_builder_add_dimension.py index ddcbd745c..112e7c9cf 100644 --- a/tests/unit/v1/test_dataset_builder_add_dimension.py +++ b/tests/unit/v1/test_dataset_builder_add_dimension.py @@ -1,7 +1,3 @@ -# ruff: noqa: PLR2004 -# PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable -# The above erroneous warning is generated for every numerical assert. -# Thus, disable it for this file """Tests the schema v1 dataset_builder.add_dimension() public API.""" import pytest diff --git a/tests/unit/v1/test_dataset_builder_add_variable.py b/tests/unit/v1/test_dataset_builder_add_variable.py index 6f46db501..2db85f3ca 100644 --- a/tests/unit/v1/test_dataset_builder_add_variable.py +++ b/tests/unit/v1/test_dataset_builder_add_variable.py @@ -1,7 +1,3 @@ -# ruff: noqa: PLR2004 -# PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable -# The above erroneous warning is generated for every numerical assert. -# Thus, disable it for this file """Tests the schema v1 dataset_builder.add_variable() public API.""" import pytest diff --git a/tests/unit/v1/test_dataset_builder_build.py b/tests/unit/v1/test_dataset_builder_build.py index 2a68c8337..833fad981 100644 --- a/tests/unit/v1/test_dataset_builder_build.py +++ b/tests/unit/v1/test_dataset_builder_build.py @@ -1,7 +1,3 @@ -# ruff: noqa: PLR2004 -# PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable -# The above erroneous warning is generated for every numerical assert. -# Thus, disable it for this file """Tests the schema v1 dataset_builder.build() public API.""" from mdio.schemas.dtype import ScalarType diff --git a/tests/unit/v1/test_dataset_builder_helpers.py b/tests/unit/v1/test_dataset_builder_helpers.py index b1ab99647..619321d81 100644 --- a/tests/unit/v1/test_dataset_builder_helpers.py +++ b/tests/unit/v1/test_dataset_builder_helpers.py @@ -1,7 +1,3 @@ -# ruff: noqa: PLR2004 -# PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable -# The above erroneous warning is generated for every numerical assert. -# Thus, disable it for this file """Tests the schema v1 dataset_builder internal methods.""" from datetime import UTC diff --git a/tests/unit/v1/test_dataset_serializer.py b/tests/unit/v1/test_dataset_serializer.py index 3b135f83d..e363b7ace 100644 --- a/tests/unit/v1/test_dataset_serializer.py +++ b/tests/unit/v1/test_dataset_serializer.py @@ -1,7 +1,3 @@ -# ruff: noqa: PLR2004 -# PLR2004 Magic value used in comparison, consider replacing `3` with a constant variable -# The above erroneous warning is generated for every numerical assert. -# Thus, disable it for this file """Tests the schema v1 dataset_serializer public API.""" import pytest From bfab1d7d19d9a50454b657bc1d533919fa5ef130 Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Thu, 17 Jul 2025 13:12:09 -0500 Subject: [PATCH 52/56] Refactor tests: clarify Zarr-related test names, fix type hints, and clean unused `# noqa` comments. --- tests/unit/v1/test_dataset_serializer.py | 32 +++++++++++++----------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/tests/unit/v1/test_dataset_serializer.py b/tests/unit/v1/test_dataset_serializer.py index e363b7ace..f8439585e 100644 --- a/tests/unit/v1/test_dataset_serializer.py +++ b/tests/unit/v1/test_dataset_serializer.py @@ -1,5 +1,7 @@ """Tests the schema v1 dataset_serializer public API.""" +from pathlib import Path + import pytest from dask import array as dask_array from numpy import array as np_array @@ -38,16 +40,16 @@ from .helpers import output_path try: - from zfpy import ZFPY as zfpy_ZFPY # noqa: N811 + from zfpy import ZFPY HAS_ZFPY = True except ImportError: - zfpy_ZFPY = None # noqa: N816 + ZFPY = None HAS_ZFPY = False from numcodecs import Blosc as nc_Blosc -from mdio.schemas.compressors import ZFP as mdio_ZFP # noqa: N811 +from mdio.schemas.compressors import ZFP as MDIO_ZFP from mdio.schemas.compressors import Blosc as mdio_Blosc from mdio.schemas.compressors import BloscAlgorithm as mdio_BloscAlgorithm from mdio.schemas.compressors import BloscShuffle as mdio_BloscShuffle @@ -342,11 +344,11 @@ def test__convert_compressor() -> None: assert result_blosc_zero.blocksize == 0 # Test 4: mdio_ZFP compressor - should return zfpy_ZFPY if available - zfp_compressor = mdio_ZFP(mode=mdio_ZFPMode.FIXED_RATE, tolerance=0.01, rate=8.0, precision=16) + zfp_compressor = MDIO_ZFP(mode=mdio_ZFPMode.FIXED_RATE, tolerance=0.01, rate=8.0, precision=16) if HAS_ZFPY: result_zfp = _convert_compressor(zfp_compressor) - assert isinstance(result_zfp, zfpy_ZFPY) + assert isinstance(result_zfp, ZFPY) assert result_zfp.mode == 1 # ZFPMode.FIXED_RATE.value = "fixed_rate" assert result_zfp.tolerance == 0.01 assert result_zfp.rate == 8.0 @@ -367,7 +369,7 @@ def test__convert_compressor() -> None: assert "" in error_message -def test_to_xarray_dataset(tmp_path) -> None: # noqa: ANN001 - tmp_path is a pytest fixture +def test_to_xarray_dataset(tmp_path: Path) -> None: """Test building a complete dataset.""" dataset = ( MDIODatasetBuilder("test_dataset") @@ -394,7 +396,7 @@ def test_to_xarray_dataset(tmp_path) -> None: # noqa: ANN001 - tmp_path is a py to_zarr(xr_ds, file_path, mode="w") -def test_seismic_poststack_3d_acceptance_to_xarray_dataset(tmp_path) -> None: # noqa: ANN001 +def test_seismic_poststack_3d_acceptance_to_xarray_dataset(tmp_path: Path) -> None: """Test building a complete dataset.""" dataset = make_seismic_poststack_3d_acceptance_dataset() @@ -405,8 +407,8 @@ def test_seismic_poststack_3d_acceptance_to_xarray_dataset(tmp_path) -> None: # @pytest.mark.skip(reason="Issues serializing dask arrays of structured types to dask.") -def test_to_zarr_dask(tmp_path) -> None: # noqa: ANN001 - """Test writing XArray dataset with data as dask array to Zar.""" +def test_to_zarr_dask(tmp_path: Path) -> None: + """Test writing XArray dataset with data as dask array to Zarr.""" # Create a data type and the fill value dtype = np_dtype([("inline", "int32"), ("cdp-x", "float64")]) dtype_fill_value = np_zeros((), dtype=dtype) @@ -429,8 +431,8 @@ def test_to_zarr_dask(tmp_path) -> None: # noqa: ANN001 aa.to_zarr(file_path, mode="w", zarr_format=2, encoding=encoding, compute=False) -def test_to_zarr_zarr_zerros_1(tmp_path) -> None: # noqa: ANN001 - """Test writing XArray dataset with data as Zarr zero array to Zar. +def test_to_zarr_from_zarr_zeros_1(tmp_path: Path) -> None: + """Test writing XArray dataset with data as Zarr zero array to Zarr. Set encoding in as DataArray attributes """ @@ -455,8 +457,8 @@ def test_to_zarr_zarr_zerros_1(tmp_path) -> None: # noqa: ANN001 aa.to_zarr(file_path, mode="w", zarr_format=2, compute=False) -def test_to_zarr_zarr_zerros_2(tmp_path) -> None: # noqa: ANN001 - """Test writing XArray dataset with data as Zarr zero array to Zar. +def test_to_zarr_from_zarr_zeros_2(tmp_path: Path) -> None: + """Test writing XArray dataset with data as Zarr zero array to Zarr. Set encoding in the to_zar method """ @@ -482,8 +484,8 @@ def test_to_zarr_zarr_zerros_2(tmp_path) -> None: # noqa: ANN001 aa.to_zarr(file_path, mode="w", zarr_format=2, encoding=encoding, compute=False) -def test_to_zarr_np(tmp_path) -> None: # noqa: ANN001 - """Test writing XArray dataset with data as NumPy array to Zar.""" +def test_to_zarr_from_np(tmp_path: Path) -> None: + """Test writing XArray dataset with data as NumPy array to Zarr.""" # Create a data type and the fill value dtype = np_dtype([("inline", "int32"), ("cdp-x", "float64")]) dtype_fill_value = np_zeros((), dtype=dtype) From 5878e97cc15371a5c69c8b4bbc346070269fa0cd Mon Sep 17 00:00:00 2001 From: Dima From Texas <34629861+dmitriyrepin@users.noreply.github.com> Date: Mon, 21 Jul 2025 20:36:39 -0500 Subject: [PATCH 53/56] MDIO v1 Templates and Template Registry (#573) * Templates and TemplateRegistry * Fix pre-commit issues * Rever dev container changes * PR Review: address issues * PR Review: register default templates at registry initialization --- docs/index.md | 1 + docs/template_registry.md | 254 +++++++++++ .../v1/templates/abstract_dataset_template.py | 152 +++++++ .../v1/templates/seismic_2d_poststack.py | 29 ++ .../v1/templates/seismic_3d_poststack.py | 29 ++ .../v1/templates/seismic_3d_prestack_cdp.py | 29 ++ .../v1/templates/seismic_3d_prestack_shot.py | 63 +++ .../schemas/v1/templates/template_registry.py | 212 ++++++++++ tests/unit/v1/helpers.py | 4 +- .../v1/templates/test_seismic_2d_poststack.py | 192 +++++++++ .../v1/templates/test_seismic_3d_poststack.py | 182 ++++++++ .../templates/test_seismic_3d_prestack_cdp.py | 192 +++++++++ .../test_seismic_3d_prestack_shot.py | 244 +++++++++++ .../v1/templates/test_seismic_templates.py | 59 +++ .../v1/templates/test_template_registry.py | 395 ++++++++++++++++++ tests/unit/v1/test_dataset_builder_build.py | 4 +- tests/unit/v1/test_dataset_serializer.py | 2 +- 17 files changed, 2038 insertions(+), 5 deletions(-) create mode 100644 docs/template_registry.md create mode 100644 src/mdio/schemas/v1/templates/abstract_dataset_template.py create mode 100644 src/mdio/schemas/v1/templates/seismic_2d_poststack.py create mode 100644 src/mdio/schemas/v1/templates/seismic_3d_poststack.py create mode 100644 src/mdio/schemas/v1/templates/seismic_3d_prestack_cdp.py create mode 100644 src/mdio/schemas/v1/templates/seismic_3d_prestack_shot.py create mode 100644 src/mdio/schemas/v1/templates/template_registry.py create mode 100644 tests/unit/v1/templates/test_seismic_2d_poststack.py create mode 100644 tests/unit/v1/templates/test_seismic_3d_poststack.py create mode 100644 tests/unit/v1/templates/test_seismic_3d_prestack_cdp.py create mode 100644 tests/unit/v1/templates/test_seismic_3d_prestack_shot.py create mode 100644 tests/unit/v1/templates/test_seismic_templates.py create mode 100644 tests/unit/v1/templates/test_template_registry.py diff --git a/docs/index.md b/docs/index.md index ba4db72de..da8408e32 100644 --- a/docs/index.md +++ b/docs/index.md @@ -35,6 +35,7 @@ data_models/dimensions data_models/chunk_grids data_models/data_types data_models/compressors +template_registry ``` ```{toctree} diff --git a/docs/template_registry.md b/docs/template_registry.md new file mode 100644 index 000000000..3b51de811 --- /dev/null +++ b/docs/template_registry.md @@ -0,0 +1,254 @@ +# Template Registry Singleton + +A thread-safe singleton registry for managing dataset templates in MDIO applications. + +## Overview + +The `TemplateRegistry` implements the singleton pattern to ensure there's only one instance managing all dataset templates throughout the application lifecycle. This provides a centralized registry for template management with thread-safe operations. + +## Features + +- **Singleton Pattern**: Ensures only one registry instance exists +- **Thread Safety**: All operations are thread-safe using locks +- **Global Access**: Convenient global functions for common operations +- **Advanced Support**: Reset functionality for environment re-usability. +- **Default Templates**: The registry is instantiated with the default set of templates: + - PostStack2DTime + - PostStack3DTime + - PreStackCdpGathers3DTime + - PreStackShotGathers3DTime + - PostStack2DDepth + - PostStack3DDepth + - PreStackCdpGathers3DDepth + - PreStackShotGathers3DDepth + +## Usage + +### Basic Usage + +```python +from mdio.schemas.v1.templates.template_registry import TemplateRegistry + +# Get the singleton instance +registry = TemplateRegistry() + +# Or use the class method +registry = TemplateRegistry.get_instance() + +# Register a template +template = MyDatasetTemplate() +template_name=registry.register(template) +print(f"Registered template named {template_name}") + +# Retrieve a template using a well-known name +template = registry.get("my_template") +# Retrieve a template using the name returned when the template was registered +template = registry.get(template_name) + +# Check if template exists +if registry.is_registered("my_template"): + print("Template is registered") + +# List all templates +template_names = registry.list_all_templates() +``` + +### Global Functions + +For convenience, you can use global functions that operate on the singleton instance: + +```python +from mdio.schemas.v1.templates.template_registry import ( + register_template, + get_template, + is_template_registered, + list_templates +) + +# Register a template globally +register_template(Seismic3DTemplate()) + +# Get a template +template = get_template("seismic_3d") + +# Check registration +if is_template_registered("seismic_3d"): + print("Template available") + +# List all registered templates +templates = list_templates() +``` + +### Multiple Instantiation + +The singleton pattern ensures all instantiations return the same object: + +```python +registry1 = TemplateRegistry() +registry2 = TemplateRegistry() +registry3 = TemplateRegistry.get_instance() + +# All variables point to the same instance +assert registry1 is registry2 is registry3 +``` + +## API Reference + +### Core Methods + +#### `register(instance: AbstractDatasetTemplate) -> str` + +Registers a template instance and returns its normalized name. + +- **Parameters:** + - `instance`: Template instance implementing `AbstractDatasetTemplate` +- **Returns:** The template name +- **Raises:** `ValueError` if template name is already registered + +#### `get(template_name: str) -> AbstractDatasetTemplate` + +Retrieves a registered template by name. + +- **Parameters:** + - `template_name`: Name of the template (case-insensitive) +- **Returns:** The registered template instance +- **Raises:** `KeyError` if template is not registered + +#### `unregister(template_name: str) -> None` + +Removes a template from the registry. + +- **Parameters:** + - `template_name`: Name of the template to remove +- **Raises:** `KeyError` if template is not registered + +#### `is_registered(template_name: str) -> bool` + +Checks if a template is registered. + +- **Parameters:** + - `template_name`: Name of the template to check +- **Returns:** `True` if template is registered, `False` otherwise + +#### `list_all_templates() -> List[str]` + +Returns a list of all registered template names. + +- **Returns:** List of template names + +#### `clear() -> None` + +Removes all registered templates. Useful for testing. + +### Class Methods + +#### `get_instance() -> TemplateRegistry` + +Alternative way to get the singleton instance. + +- **Returns:** The singleton registry instance + +### Global Functions + +#### `get_template_registry() -> TemplateRegistry` + +Returns the global singleton registry instance. + +#### `register_template(template: AbstractDatasetTemplate) -> str` + +Registers a template in the global registry. + +#### `get_template(name: str) -> AbstractDatasetTemplate` + +Gets a template from the global registry. + +#### `is_template_registered(name: str) -> bool` + +Checks if a template is registered in the global registry. + +#### `list_templates() -> List[str]` + +Lists all templates in the global registry. + +## Thread Safety + +All operations on the registry are thread-safe: + +```python +import threading + +def register_templates(): + registry = TemplateRegistry() + for i in range(10): + template = MyTemplate(f"template_{i}") + registry.register(template) + +# Multiple threads can safely access the registry +threads = [threading.Thread(target=register_templates) for _ in range(5)] +for thread in threads: + thread.start() +for thread in threads: + thread.join() +``` + +## Best Practices + +1. **Use Global Functions**: For simple operations, prefer the global convenience functions +2. **Register Early**: Register all templates during application startup +3. **Thread Safety**: The registry is thread-safe, but individual templates may not be +4. **Testing Isolation**: Always reset the singleton in test setup/teardown + +## Example: Complete Template Management + +```python +from mdio.schemas.v1.templates.template_registry import TemplateRegistry +from mdio.schemas.v1.templates.seismic_3d_poststack import Seismic3DPostStackTemplate +from mdio.schemas.v1.templates.seismic_3d_prestack_time import Seismic3DPostStackTimeTemplate +from mdio.schemas.v1.templates.seismic_3d_prestack import Seismic3DPreStackTemplate + +def setup_templates(): + """Register MDIO templates runtime. + Custom templates can be created in external projects and added without modifying the MDIO library code + """ + # Use strongly-typed template + template_name = TemplateRegistry.register(Seismic3DPostStackTimeTemplate()) + print(f"Registered template named {template_name}") + # Use parametrized template + template_name = TemplateRegistry.register(Seismic3DPostStackTemplate("Depth")) + print(f"Registered template named {template_name}") + template_name = TemplateRegistry.register(Seismic3DPreStackTemplate()) + print(f"Registered template named {template_name}") + + print(f"Registered templates: {list_templates()}") + +# Application startup +setup_standard_templates() + +# Later in the application +template = TemplateRegistry().get_template("PostStack3DDepth") +dataset = template.create_dataset(name="Seismic 3d m/m/ft", + sizes = [256, 512, 384] + coord_units = [ + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER)), + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER)), + AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT))] +``` + +## Error Handling + +The registry provides clear error messages: + +```python +# Template not registered +try: + template = get_template("nonexistent") +except KeyError as e: + print(f"Error: {e}") # "Template 'nonexistent' is not registered." + +# Duplicate registration +try: + register_template("duplicate", template1) + register_template("duplicate", template2) +except ValueError as e: + print(f"Error: {e}") # "Template 'duplicate' is already registered." +``` diff --git a/src/mdio/schemas/v1/templates/abstract_dataset_template.py b/src/mdio/schemas/v1/templates/abstract_dataset_template.py new file mode 100644 index 000000000..776a65ce0 --- /dev/null +++ b/src/mdio/schemas/v1/templates/abstract_dataset_template.py @@ -0,0 +1,152 @@ +"""Template method pattern implementation for MDIO v1 dataset template.""" + +from abc import ABC +from abc import abstractmethod + +from mdio.schemas import compressors +from mdio.schemas.chunk_grid import RegularChunkGrid +from mdio.schemas.chunk_grid import RegularChunkShape +from mdio.schemas.dtype import ScalarType +from mdio.schemas.metadata import ChunkGridMetadata +from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.dataset import Dataset +from mdio.schemas.v1.dataset_builder import MDIODatasetBuilder +from mdio.schemas.v1.units import AllUnits + + +class AbstractDatasetTemplate(ABC): + """Abstract base class that defines the template method for Dataset building factory. + + The template method defines the skeleton of the data processing algorithm, + while allowing subclasses to override specific steps. + """ + + def __init__(self, domain: str = "") -> None: + # Template attributes to be overridden by subclasses + # Domain of the seismic data, e.g. "time" or "depth" + self._trace_domain = domain.lower() + # Names of all coordinate dimensions in the dataset + # e.g. ["cdp"] for 2D post-stack depth + # e.g. ["inline", "crossline"] for 3D post-stack + # e.g. ["inline", "crossline"] for 3D pre-stack CDP gathers + # Note: For pre-stack Shot gathers, the coordinates are defined differently + # and are not directly tied to _coord_dim_names. + self._coord_dim_names = [] + # Names of all dimensions in the dataset + # e.g. ["cdp", "depth"] for 2D post-stack depth + # e.g. ["inline", "crossline", "depth"] for 3D post-stack depth + # e.g. ["inline", "crossline", "offset", "depth"] for 3D pre-stack depth CPD gathers + # e.g. ["shot_point", "cable", "channel", "time"] for 3D pre-stack time Shot gathers + self._dim_names = [] + # Names of all coordinates in the dataset + # e.g. ["cdp-x", "cdp-y"] for 2D post-stack depth + # e.g. ["cdp-x", "cdp-y"] for 3D post-stack depth + # e.g. ["cdp-x", "cdp-y"] for 3D pre-stack CPD depth + # e.g. ["gun", "shot-x", "shot-y", "receiver-x", "receiver-y"] for 3D pre-stack + # time Shot gathers + self._coord_names = [] + # Name of the variable in the dataset + # e.g. "StackedAmplitude" for 2D post-stack depth + # e.g. "StackedAmplitude" for 3D post-stack depth + # e.g. "AmplitudeCDP" for 3D pre-stack CPD depth + # e.g. "AmplitudeShot" for 3D pre-stack time Shot gathers + self._var_name = "" + # Chunk shape for the variable in the dataset + # e.g. [1024, 1024] for 2D post-stack depth + # e.g. [128, 128, 128] for 3D post-stack depth + # e.g. [1, 1, 512, 4096] for 3D pre-stack CPD depth + # e.g. [1, 1, 512, 4096] for 3D pre-stack time Shot gathers + self._var_chunk_shape = [] + + # Variables instantiated when build_dataset() is called + self._builder: MDIODatasetBuilder = None + # Sizes of the dimensions in the dataset, to be set when build_dataset() is called + self._dim_sizes = [] + # Horizontal units for the coordinates (e.g, "m", "ft"), to be set when + # build_dataset() is called + self._coord_units = [] + + def build_dataset(self, name: str, sizes: list[int], coord_units: list[AllUnits]) -> Dataset: + """Template method that builds the dataset. + + Args: + name: The name of the dataset. + sizes: The sizes of the dimensions. + coord_units: The units for the coordinates. + + Returns: + Dataset: The constructed dataset + """ + self._dim_sizes = sizes + self._coord_units = coord_units + + self._builder = MDIODatasetBuilder(name=name, attributes=self._load_dataset_attributes()) + self._add_dimensions() + self._add_coordinates() + self._add_variables() + return self._builder.build() + + def get_name(self) -> str: + """Returns the name of the template.""" + return self._get_name() + + @abstractmethod + def _get_name(self) -> str: + """Abstract method to get the name of the template. + + Must be implemented by subclasses. + + Returns: + str: The name of the template + """ + + @abstractmethod + def _load_dataset_attributes(self) -> UserAttributes: + """Abstract method to load dataset attributes. + + Must be implemented by subclasses. + + Returns: + UserAttributes: The dataset attributes + """ + + def _add_dimensions(self) -> None: + """A virtual method that can be overwritten by subclasses to add custom dimensions. + + Uses the class field 'builder' to add dimensions to the dataset. + """ + for i in range(len(self._dim_names)): + self._builder.add_dimension(self._dim_names[i], self._dim_sizes[i]) + + def _add_coordinates(self) -> None: + """A virtual method that can be overwritten by subclasses to add custom coordinates. + + Uses the class field 'builder' to add coordinates to the dataset. + """ + for i in range(len(self._coord_names)): + self._builder.add_coordinate( + self._coord_names[i], + dimensions=self._coord_dim_names, + data_type=ScalarType.FLOAT64, + metadata_info=[self._coord_units], + ) + + def _add_variables(self) -> None: + """A virtual method that can be overwritten by subclasses to add custom variables. + + Uses the class field 'builder' to add variables to the dataset. + """ + self._builder.add_variable( + name=self._var_name, + dimensions=self._dim_names, + data_type=ScalarType.FLOAT32, + compressor=compressors.Blosc(algorithm=compressors.BloscAlgorithm.ZSTD), + coordinates=self._coord_names, + metadata_info=[ + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape(chunk_shape=self._var_chunk_shape) + ) + ) + ], + ) diff --git a/src/mdio/schemas/v1/templates/seismic_2d_poststack.py b/src/mdio/schemas/v1/templates/seismic_2d_poststack.py new file mode 100644 index 000000000..4f0d81b68 --- /dev/null +++ b/src/mdio/schemas/v1/templates/seismic_2d_poststack.py @@ -0,0 +1,29 @@ +"""Seismic2DPostStackTemplate MDIO v1 dataset templates.""" + +from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.templates.abstract_dataset_template import AbstractDatasetTemplate + + +class Seismic2DPostStackTemplate(AbstractDatasetTemplate): + """Seismic post-stack 2D time or depth Dataset template.""" + + def __init__(self, domain: str): + super().__init__(domain=domain) + + self._coord_dim_names = ["cdp"] + self._dim_names = [*self._coord_dim_names, self._trace_domain] + self._coord_names = ["cdp-x", "cdp-y"] + self._var_name = "StackedAmplitude" + self._var_chunk_shape = [1024, 1024] + + def _get_name(self) -> str: + return f"PostStack2D{self._trace_domain.capitalize()}" + + def _load_dataset_attributes(self) -> UserAttributes: + return UserAttributes( + attributes={ + "surveyDimensionality": "2D", + "ensembleType": "line", + "processingStage": "post-stack", + } + ) diff --git a/src/mdio/schemas/v1/templates/seismic_3d_poststack.py b/src/mdio/schemas/v1/templates/seismic_3d_poststack.py new file mode 100644 index 000000000..3fd3950a3 --- /dev/null +++ b/src/mdio/schemas/v1/templates/seismic_3d_poststack.py @@ -0,0 +1,29 @@ +"""Seismic3DPostStackTemplate MDIO v1 dataset templates.""" + +from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.templates.abstract_dataset_template import AbstractDatasetTemplate + + +class Seismic3DPostStackTemplate(AbstractDatasetTemplate): + """Seismic post-stack 3D time or depth Dataset template.""" + + def __init__(self, domain: str): + super().__init__(domain=domain) + # Template attributes to be overridden by subclasses + self._coord_dim_names = ["inline", "crossline"] + self._dim_names = [*self._coord_dim_names, self._trace_domain] + self._coord_names = ["cdp-x", "cdp-y"] + self._var_name = "StackedAmplitude" + self._var_chunk_shape = [128, 128, 128] + + def _get_name(self) -> str: + return f"PostStack3D{self._trace_domain.capitalize()}" + + def _load_dataset_attributes(self) -> UserAttributes: + return UserAttributes( + attributes={ + "surveyDimensionality": "3D", + "ensembleType": "line", + "processingStage": "post-stack", + } + ) diff --git a/src/mdio/schemas/v1/templates/seismic_3d_prestack_cdp.py b/src/mdio/schemas/v1/templates/seismic_3d_prestack_cdp.py new file mode 100644 index 000000000..fa95729b8 --- /dev/null +++ b/src/mdio/schemas/v1/templates/seismic_3d_prestack_cdp.py @@ -0,0 +1,29 @@ +"""Seismic3DPreStackCDPTemplate MDIO v1 dataset templates.""" + +from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.templates.abstract_dataset_template import AbstractDatasetTemplate + + +class Seismic3DPreStackCDPTemplate(AbstractDatasetTemplate): + """Seismic CDP pre-stack 3D time or depth Dataset template.""" + + def __init__(self, domain: str): + super().__init__(domain=domain) + + self._coord_dim_names = ["inline", "crossline"] + self._dim_names = [*self._coord_dim_names, "offset", self._trace_domain] + self._coord_names = ["cdp-x", "cdp-y"] + self._var_name = "AmplitudeCDP" + self._var_chunk_shape = [1, 1, 512, 4096] + + def _get_name(self) -> str: + return f"PreStackCdpGathers3D{self._trace_domain.capitalize()}" + + def _load_dataset_attributes(self) -> UserAttributes: + return UserAttributes( + attributes={ + "surveyDimensionality": "3D", + "ensembleType": "cdp", + "processingStage": "pre-stack", + } + ) diff --git a/src/mdio/schemas/v1/templates/seismic_3d_prestack_shot.py b/src/mdio/schemas/v1/templates/seismic_3d_prestack_shot.py new file mode 100644 index 000000000..a39331276 --- /dev/null +++ b/src/mdio/schemas/v1/templates/seismic_3d_prestack_shot.py @@ -0,0 +1,63 @@ +"""Seismic3DPreStackShotTemplate MDIO v1 dataset templates.""" + +from mdio.schemas.dtype import ScalarType +from mdio.schemas.metadata import UserAttributes +from mdio.schemas.v1.templates.abstract_dataset_template import AbstractDatasetTemplate +from mdio.schemas.v1.units import AllUnits + + +class Seismic3DPreStackShotTemplate(AbstractDatasetTemplate): + """Seismic Shot pre-stack 3D time or depth Dataset template.""" + + def __init__(self, domain: str): + super().__init__(domain=domain) + + self._coord_dim_names = [] # Custom coordinate definition for shot gathers + self._dim_names = ["shot_point", "cable", "channel", self._trace_domain] + self._coord_names = ["gun", "shot-x", "shot-y", "receiver-x", "receiver-y"] + self._var_name = "AmplitudeShot" + self._var_chunk_shape = [1, 1, 512, 4096] + + def _get_name(self) -> str: + return f"PreStackShotGathers3D{self._trace_domain.capitalize()}" + + def _load_dataset_attributes(self) -> UserAttributes: + return UserAttributes( + attributes={ + "surveyDimensionality": "3D", + "ensembleType": "shot", + "processingStage": "pre-stack", + } + ) + + def _add_coordinates(self) -> None: + self._builder.add_coordinate( + "gun", + dimensions=["shot_point"], + data_type=ScalarType.UINT8, + metadata_info=[AllUnits(units_v1=None)], + ) + self._builder.add_coordinate( + "shot-x", + dimensions=["shot_point"], + data_type=ScalarType.FLOAT64, + metadata_info=[self._coord_units[0]], + ) + self._builder.add_coordinate( + "shot-y", + dimensions=["shot_point"], + data_type=ScalarType.FLOAT64, + metadata_info=[self._coord_units[1]], + ) + self._builder.add_coordinate( + "receiver-x", + dimensions=["shot_point", "cable", "channel"], + data_type=ScalarType.FLOAT64, + metadata_info=[self._coord_units[0]], + ) + self._builder.add_coordinate( + "receiver-y", + dimensions=["shot_point", "cable", "channel"], + data_type=ScalarType.FLOAT64, + metadata_info=[self._coord_units[1]], + ) diff --git a/src/mdio/schemas/v1/templates/template_registry.py b/src/mdio/schemas/v1/templates/template_registry.py new file mode 100644 index 000000000..c674b0c20 --- /dev/null +++ b/src/mdio/schemas/v1/templates/template_registry.py @@ -0,0 +1,212 @@ +"""Template registry for MDIO v1 dataset templates.""" + +import threading +from typing import Optional + +from mdio.schemas.v1.templates.abstract_dataset_template import AbstractDatasetTemplate +from mdio.schemas.v1.templates.seismic_2d_poststack import Seismic2DPostStackTemplate +from mdio.schemas.v1.templates.seismic_3d_poststack import Seismic3DPostStackTemplate +from mdio.schemas.v1.templates.seismic_3d_prestack_cdp import Seismic3DPreStackCDPTemplate +from mdio.schemas.v1.templates.seismic_3d_prestack_shot import Seismic3DPreStackShotTemplate + + +class TemplateRegistry: + """A thread-safe singleton registry for dataset templates.""" + + _instance: Optional["TemplateRegistry"] = None + _lock = threading.RLock() + _initialized = False + + def __new__(cls) -> "TemplateRegistry": + """Create or return the singleton instance. + + Uses double-checked locking pattern to ensure thread safety. + + Returns: + The singleton instance of TemplateRegistry. + """ + if cls._instance is None: + with cls._lock: + # Double-checked locking pattern + if cls._instance is None: + cls._instance = super().__new__(cls) + return cls._instance + + def __init__(self) -> None: + if not self._initialized: + with self._lock: + if not self._initialized: + self._templates: dict[str, AbstractDatasetTemplate] = {} + self._registry_lock = threading.RLock() + self._register_default_templates() + TemplateRegistry._initialized = True + + def register(self, instance: AbstractDatasetTemplate) -> str: + """Register a template instance by its name. + + Args: + instance: An instance of template to register. + + Returns: + The name of the registered template. + + Raises: + ValueError: If the template name is already registered. + """ + with self._registry_lock: + name = instance.get_name() + if name in self._templates: + err = f"Template '{name}' is already registered." + raise ValueError(err) + self._templates[name] = instance + return name + + def _register_default_templates(self) -> None: + """Register default templates if needed. + + This method can be overridden by subclasses to register default templates. + """ + self.register(Seismic2DPostStackTemplate("time")) + self.register(Seismic2DPostStackTemplate("depth")) + + self.register(Seismic3DPostStackTemplate("time")) + self.register(Seismic3DPostStackTemplate("depth")) + + self.register(Seismic3DPreStackCDPTemplate("time")) + self.register(Seismic3DPreStackCDPTemplate("depth")) + + self.register(Seismic3DPreStackShotTemplate("time")) + self.register(Seismic3DPreStackShotTemplate("depth")) + + def get(self, template_name: str) -> AbstractDatasetTemplate: + """Get a template from the registry by its name. + + Args: + template_name: The name of the template to retrieve. + + Returns: + The template instance if found. + + Raises: + KeyError: If the template is not registered. + """ + with self._registry_lock: + name = template_name + if name not in self._templates: + err = f"Template '{name}' is not registered." + raise KeyError(err) + return self._templates[name] + + def unregister(self, template_name: str) -> None: + """Unregister a template from the registry. + + Args: + template_name: The name of the template to unregister. + + Raises: + KeyError: If the template is not registered. + """ + with self._registry_lock: + name = template_name + if name not in self._templates: + err_msg = f"Template '{name}' is not registered." + raise KeyError(err_msg) + del self._templates[name] + + def is_registered(self, template_name: str) -> bool: + """Check if a template is registered in the registry. + + Args: + template_name: The name of the template to check. + + Returns: + True if the template is registered, False otherwise. + """ + with self._registry_lock: + name = template_name + return name in self._templates + + def list_all_templates(self) -> list[str]: + """Get all registered template names. + + Returns: + A list of all registered template names. + """ + with self._registry_lock: + return list(self._templates.keys()) + + def clear(self) -> None: + """Clear all registered templates (useful for testing).""" + with self._registry_lock: + self._templates.clear() + + @classmethod + def get_instance(cls) -> "TemplateRegistry": + """Get the singleton instance (alternative to constructor). + + Returns: + The singleton instance of TemplateRegistry. + """ + return cls() + + @classmethod + def _reset_instance(cls) -> None: + """Reset the singleton instance (useful for testing).""" + with cls._lock: + cls._instance = None + cls._initialized = False + + +# Global convenience functions +def get_template_registry() -> TemplateRegistry: + """Get the global template registry instance. + + Returns: + The singleton instance of TemplateRegistry. + """ + return TemplateRegistry.get_instance() + + +def register_template(template: AbstractDatasetTemplate) -> str: + """Register a template in the global registry. + + Args: + template: An instance of AbstractDatasetTemplate to register. + + Returns: + The name of the registered template. + """ + return get_template_registry().register(template) + + +def get_template(name: str) -> AbstractDatasetTemplate: + """Get a template from the global registry. + + Args: + name: The name of the template to retrieve. + + Returns: + The template instance if found. + """ + return get_template_registry().get(name) + + +def is_template_registered(name: str) -> bool: + """Check if a template is registered in the global registry. + + Args: + name: The name of the template to check. + + Returns: + True if the template is registered, False otherwise. + """ + return get_template_registry().is_registered(name) + + +def list_templates() -> list[str]: + """List all registered template names. + + Returns: + A list of all registered template names. + """ + return get_template_registry().list_all_templates() diff --git a/tests/unit/v1/helpers.py b/tests/unit/v1/helpers.py index d0ebe5d79..f9d209690 100644 --- a/tests/unit/v1/helpers.py +++ b/tests/unit/v1/helpers.py @@ -155,10 +155,10 @@ def output_path(file_dir: str, file_name: str, debugging: bool = False) -> str: return file_path -def make_seismic_poststack_3d_acceptance_dataset() -> Dataset: +def make_seismic_poststack_3d_acceptance_dataset(dataset_name: str) -> Dataset: """Create in-memory Seismic PostStack 3D Acceptance dataset.""" ds = MDIODatasetBuilder( - "campos_3d", + dataset_name, attributes=UserAttributes( attributes={ "textHeader": [ diff --git a/tests/unit/v1/templates/test_seismic_2d_poststack.py b/tests/unit/v1/templates/test_seismic_2d_poststack.py new file mode 100644 index 000000000..79f795854 --- /dev/null +++ b/tests/unit/v1/templates/test_seismic_2d_poststack.py @@ -0,0 +1,192 @@ +"""Unit tests for Seismic2DPostStackTemplate.""" + +from tests.unit.v1.helpers import validate_variable + +from mdio.schemas.chunk_grid import RegularChunkGrid +from mdio.schemas.dtype import ScalarType +from mdio.schemas.v1.templates.seismic_2d_poststack import Seismic2DPostStackTemplate +from mdio.schemas.v1.units import AllUnits +from mdio.schemas.v1.units import LengthUnitEnum +from mdio.schemas.v1.units import LengthUnitModel +from mdio.schemas.v1.units import TimeUnitEnum +from mdio.schemas.v1.units import TimeUnitModel + +_UNIT_METER = AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER)) +_UNIT_SECOND = AllUnits(units_v1=TimeUnitModel(time=TimeUnitEnum.SECOND)) + + +class TestSeismic2DPostStackTemplate: + """Unit tests for Seismic2DPostStackTemplate.""" + + def test_configuration_depth(self) -> None: + """Test configuration of Seismic2DPostStackTemplate with depth domain.""" + t = Seismic2DPostStackTemplate("depth") + + # Template attributes + assert t._trace_domain == "depth" + assert t._coord_dim_names == ["cdp"] + assert t._dim_names == ["cdp", "depth"] + assert t._coord_names == ["cdp-x", "cdp-y"] + assert t._var_name == "StackedAmplitude" + assert t._var_chunk_shape == [1024, 1024] + + # Variables instantiated when build_dataset() is called + assert t._builder is None + assert t._dim_sizes == [] + assert t._coord_units == [] + + # Verify dataset attributes + attrs = t._load_dataset_attributes() + assert attrs.attributes == { + "surveyDimensionality": "2D", + "ensembleType": "line", + "processingStage": "post-stack", + } + + def test_configuration_time(self) -> None: + """Test configuration of Seismic2DPostStackTemplate with time domain.""" + t = Seismic2DPostStackTemplate("time") + + # Template attributes + assert t._trace_domain == "time" + assert t._coord_dim_names == ["cdp"] + assert t._dim_names == ["cdp", "time"] + assert t._coord_names == ["cdp-x", "cdp-y"] + assert t._var_name == "StackedAmplitude" + assert t._var_chunk_shape == [1024, 1024] + + # Variables instantiated when build_dataset() is called + assert t._builder is None + assert t._dim_sizes == [] + assert t._coord_units == [] + + def test_domain_case_handling(self) -> None: + """Test that domain parameter handles different cases correctly.""" + # Test uppercase + t1 = Seismic2DPostStackTemplate("ELEVATION") + assert t1._trace_domain == "elevation" + assert t1.get_name() == "PostStack2DElevation" + + # Test mixed case + t2 = Seismic2DPostStackTemplate("elevatioN") + assert t2._trace_domain == "elevation" + assert t2.get_name() == "PostStack2DElevation" + + def test_build_dataset_depth(self) -> None: + """Test building a complete 2D depth dataset.""" + t = Seismic2DPostStackTemplate("depth") + + dataset = t.build_dataset( + "Seismic 2D Depth Line 001", + sizes=[2048, 4096], + coord_units=[_UNIT_METER, _UNIT_METER], # Both coordinates and depth in meters + ) + + # Verify dataset metadata + assert dataset.metadata.name == "Seismic 2D Depth Line 001" + assert dataset.metadata.attributes["surveyDimensionality"] == "2D" + assert dataset.metadata.attributes["ensembleType"] == "line" + assert dataset.metadata.attributes["processingStage"] == "post-stack" + + # 2 coordinate variables + 1 data variable = 5 variables + assert len(dataset.variables) == 3 + + # Verify coordinate variables + cdp_x = validate_variable( + dataset, + name="cdp-x", + dims=[("cdp", 2048)], + coords=["cdp-x"], + dtype=ScalarType.FLOAT64, + ) + assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER + + cdp_y = validate_variable( + dataset, + name="cdp-y", + dims=[("cdp", 2048)], + coords=["cdp-y"], + dtype=ScalarType.FLOAT64, + ) + assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER + + # Verify seismic variable + seismic = validate_variable( + dataset, + name="StackedAmplitude", + dims=[("cdp", 2048), ("depth", 4096)], + coords=["cdp-x", "cdp-y"], + dtype=ScalarType.FLOAT32, + ) + assert isinstance(seismic.metadata.chunk_grid, RegularChunkGrid) + assert seismic.metadata.chunk_grid.configuration.chunk_shape == [1024, 1024] + assert seismic.metadata.stats_v1 is None + + def test_build_dataset_time(self) -> None: + """Test building a complete 2D time dataset.""" + t = Seismic2DPostStackTemplate("time") + + dataset = t.build_dataset( + "Seismic 2D Time Line 001", + sizes=[2048, 4096], + coord_units=[_UNIT_METER, _UNIT_METER], # Coordinates in meters, time in seconds + ) + + # Verify dataset metadata + assert dataset.metadata.name == "Seismic 2D Time Line 001" + assert dataset.metadata.attributes["surveyDimensionality"] == "2D" + assert dataset.metadata.attributes["ensembleType"] == "line" + assert dataset.metadata.attributes["processingStage"] == "post-stack" + + # Verify variables count + assert len(dataset.variables) == 3 + + # Verify coordinate variables + v = validate_variable( + dataset, + name="cdp-x", + dims=[("cdp", 2048)], + coords=["cdp-x"], + dtype=ScalarType.FLOAT64, + ) + assert v.metadata.units_v1.length == LengthUnitEnum.METER + + v = validate_variable( + dataset, + name="cdp-y", + dims=[("cdp", 2048)], + coords=["cdp-y"], + dtype=ScalarType.FLOAT64, + ) + assert v.metadata.units_v1.length == LengthUnitEnum.METER + + # Verify seismic variable + v = validate_variable( + dataset, + name="StackedAmplitude", + dims=[("cdp", 2048), ("time", 4096)], + coords=["cdp-x", "cdp-y"], + dtype=ScalarType.FLOAT32, + ) + assert isinstance(v.metadata.chunk_grid, RegularChunkGrid) + assert v.metadata.chunk_grid.configuration.chunk_shape == [1024, 1024] + assert v.metadata.stats_v1 is None + + def test_time_vs_depth_comparison(self) -> None: + """Test differences between time and depth templates.""" + time_template = Seismic2DPostStackTemplate("time") + depth_template = Seismic2DPostStackTemplate("depth") + + # Different trace domains + assert time_template._trace_domain == "time" + assert depth_template._trace_domain == "depth" + + # Different names + assert time_template.get_name() == "PostStack2DTime" + assert depth_template.get_name() == "PostStack2DDepth" + + # Same other attributes + assert time_template._coord_dim_names == depth_template._coord_dim_names + assert time_template._coord_names == depth_template._coord_names + assert time_template._var_name == depth_template._var_name + assert time_template._var_chunk_shape == depth_template._var_chunk_shape diff --git a/tests/unit/v1/templates/test_seismic_3d_poststack.py b/tests/unit/v1/templates/test_seismic_3d_poststack.py new file mode 100644 index 000000000..3e205b0ae --- /dev/null +++ b/tests/unit/v1/templates/test_seismic_3d_poststack.py @@ -0,0 +1,182 @@ +"""Unit tests for Seismic3DPostStackTemplate.""" + +from tests.unit.v1.helpers import validate_variable + +from mdio.schemas.chunk_grid import RegularChunkGrid +from mdio.schemas.compressors import Blosc +from mdio.schemas.dtype import ScalarType +from mdio.schemas.v1.templates.seismic_3d_poststack import Seismic3DPostStackTemplate +from mdio.schemas.v1.units import AllUnits +from mdio.schemas.v1.units import LengthUnitEnum +from mdio.schemas.v1.units import LengthUnitModel +from mdio.schemas.v1.units import TimeUnitEnum +from mdio.schemas.v1.units import TimeUnitModel + +_UNIT_METER = AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER)) +_UNIT_SECOND = AllUnits(units_v1=TimeUnitModel(time=TimeUnitEnum.SECOND)) + + +class TestSeismic3DPostStackTemplate: + """Unit tests for Seismic3DPostStackTemplate.""" + + def test_configuration_depth(self) -> None: + """Unit tests for Seismic3DPostStackTemplate with depth domain.""" + t = Seismic3DPostStackTemplate(domain="depth") + + # Template attributes to be overridden by subclasses + assert t._trace_domain == "depth" # Domain should be lowercased + assert t._coord_dim_names == ["inline", "crossline"] + assert t._dim_names == ["inline", "crossline", "depth"] + assert t._coord_names == ["cdp-x", "cdp-y"] + assert t._var_chunk_shape == [128, 128, 128] + + # Variables instantiated when build_dataset() is called + assert t._builder is None + assert t._dim_sizes == [] + assert t._coord_units == [] + + assert t._load_dataset_attributes().attributes == { + "surveyDimensionality": "3D", + "ensembleType": "line", + "processingStage": "post-stack", + } + + assert t.get_name() == "PostStack3DDepth" + + def test_configuration_time(self) -> None: + """Unit tests for Seismic3DPostStackTemplate with time domain.""" + t = Seismic3DPostStackTemplate(domain="time") + + # Template attributes to be overridden by subclasses + assert t._trace_domain == "time" # Domain should be lowercased + assert t._coord_dim_names == ["inline", "crossline"] + assert t._dim_names == ["inline", "crossline", "time"] + assert t._coord_names == ["cdp-x", "cdp-y"] + assert t._var_chunk_shape == [128, 128, 128] + + # Variables instantiated when build_dataset() is called + assert t._builder is None + assert t._dim_sizes == [] + assert t._coord_units == [] + + assert t._load_dataset_attributes().attributes == { + "surveyDimensionality": "3D", + "ensembleType": "line", + "processingStage": "post-stack", + } + + assert t.get_name() == "PostStack3DTime" + + def test_domain_case_handling(self) -> None: + """Test that domain parameter handles different cases correctly.""" + # Test uppercase + t1 = Seismic3DPostStackTemplate("ELEVATION") + assert t1._trace_domain == "elevation" + assert t1.get_name() == "PostStack3DElevation" + + # Test mixed case + t2 = Seismic3DPostStackTemplate("elevatioN") + assert t2._trace_domain == "elevation" + assert t2.get_name() == "PostStack3DElevation" + + def test_build_dataset_depth(self) -> None: + """Unit tests for Seismic3DPostStackTemplate build with depth domain.""" + t = Seismic3DPostStackTemplate(domain="depth") + + assert t.get_name() == "PostStack3DDepth" + dataset = t.build_dataset( + "Seismic 3D", sizes=[256, 512, 1024], coord_units=[_UNIT_METER, _UNIT_METER] + ) + + assert dataset.metadata.name == "Seismic 3D" + assert dataset.metadata.attributes["surveyDimensionality"] == "3D" + assert dataset.metadata.attributes["ensembleType"] == "line" + assert dataset.metadata.attributes["processingStage"] == "post-stack" + + # Verify variables + # 2 coordinate variables + 1 data variables = 3 variables + assert len(dataset.variables) == 3 + + # Verify coordinate variables + cdp_x = validate_variable( + dataset, + name="cdp-x", + dims=[("inline", 256), ("crossline", 512)], + coords=["cdp-x"], + dtype=ScalarType.FLOAT64, + ) + assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER + + cdp_y = validate_variable( + dataset, + name="cdp-y", + dims=[("inline", 256), ("crossline", 512)], + coords=["cdp-y"], + dtype=ScalarType.FLOAT64, + ) + assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER + + # Verify seismic variable + seismic = validate_variable( + dataset, + name="StackedAmplitude", + dims=[("inline", 256), ("crossline", 512), ("depth", 1024)], + coords=["cdp-x", "cdp-y"], + dtype=ScalarType.FLOAT32, + ) + assert isinstance(seismic.compressor, Blosc) + assert seismic.compressor.algorithm == "zstd" + assert isinstance(seismic.metadata.chunk_grid, RegularChunkGrid) + assert seismic.metadata.chunk_grid.configuration.chunk_shape == [128, 128, 128] + assert seismic.metadata.stats_v1 is None + + def test_build_dataset_time(self) -> None: + """Unit tests for Seismic3DPostStackTimeTemplate build with time domain.""" + t = Seismic3DPostStackTemplate(domain="time") + + assert t.get_name() == "PostStack3DTime" + dataset = t.build_dataset( + "Seismic 3D", sizes=[256, 512, 1024], coord_units=[_UNIT_METER, _UNIT_METER] + ) + + assert dataset.metadata.name == "Seismic 3D" + assert dataset.metadata.attributes["surveyDimensionality"] == "3D" + assert dataset.metadata.attributes["ensembleType"] == "line" + assert dataset.metadata.attributes["processingStage"] == "post-stack" + + # Verify variables + # 2 coordinate variables + 1 data variables = 3 variables + assert len(dataset.variables) == 3 + + # Verify coordinate variables + cdp_x = validate_variable( + dataset, + name="cdp-x", + dims=[("inline", 256), ("crossline", 512)], + coords=["cdp-x"], + dtype=ScalarType.FLOAT64, + ) + assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER + + cdp_y = validate_variable( + dataset, + name="cdp-y", + dims=[("inline", 256), ("crossline", 512)], + coords=["cdp-y"], + dtype=ScalarType.FLOAT64, + ) + assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER + + # Verify seismic variable + seismic = validate_variable( + dataset, + name="StackedAmplitude", + dims=[("inline", 256), ("crossline", 512), ("time", 1024)], + coords=["cdp-x", "cdp-y"], + dtype=ScalarType.FLOAT32, + ) + assert isinstance(seismic.compressor, Blosc) + assert seismic.compressor.algorithm == "zstd" + assert isinstance(seismic.metadata.chunk_grid, RegularChunkGrid) + assert seismic.metadata.chunk_grid.configuration.chunk_shape == [128, 128, 128] + assert seismic.metadata.stats_v1 is None diff --git a/tests/unit/v1/templates/test_seismic_3d_prestack_cdp.py b/tests/unit/v1/templates/test_seismic_3d_prestack_cdp.py new file mode 100644 index 000000000..4f936940e --- /dev/null +++ b/tests/unit/v1/templates/test_seismic_3d_prestack_cdp.py @@ -0,0 +1,192 @@ +"""Unit tests for Seismic3DPreStackCDPTemplate.""" + +from tests.unit.v1.helpers import validate_variable + +from mdio.schemas.chunk_grid import RegularChunkGrid +from mdio.schemas.compressors import Blosc +from mdio.schemas.dtype import ScalarType +from mdio.schemas.v1.templates.seismic_3d_prestack_cdp import Seismic3DPreStackCDPTemplate +from mdio.schemas.v1.units import AllUnits +from mdio.schemas.v1.units import LengthUnitEnum +from mdio.schemas.v1.units import LengthUnitModel +from mdio.schemas.v1.units import TimeUnitEnum +from mdio.schemas.v1.units import TimeUnitModel + +_UNIT_METER = AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER)) +_UNIT_SECOND = AllUnits(units_v1=TimeUnitModel(time=TimeUnitEnum.SECOND)) + + +class TestSeismic3DPreStackCDPTemplate: + """Unit tests for Seismic3DPreStackCDPTemplate.""" + + def test_configuration_depth(self) -> None: + """Unit tests for Seismic3DPreStackCDPTemplate.""" + t = Seismic3DPreStackCDPTemplate(domain="DEPTH") + + # Template attributes for prestack CDP + assert t._trace_domain == "depth" + assert t._coord_dim_names == ["inline", "crossline"] + assert t._dim_names == ["inline", "crossline", "offset", "depth"] + assert t._coord_names == ["cdp-x", "cdp-y"] + assert t._var_name == "AmplitudeCDP" + assert t._var_chunk_shape == [1, 1, 512, 4096] + + # Variables instantiated when build_dataset() is called + assert t._builder is None + assert t._dim_sizes == [] + assert t._coord_units == [] + + # Verify prestack CDP attributes + attrs = t._load_dataset_attributes() + assert attrs.attributes == { + "surveyDimensionality": "3D", + "ensembleType": "cdp", + "processingStage": "pre-stack", + } + + assert t.get_name() == "PreStackCdpGathers3DDepth" + + def test_configuration_time(self) -> None: + """Unit tests for Seismic3DPreStackCDPTemplate.""" + t = Seismic3DPreStackCDPTemplate(domain="TIME") + + # Template attributes for prestack CDP + assert t._trace_domain == "time" + assert t._coord_dim_names == ["inline", "crossline"] + assert t._dim_names == ["inline", "crossline", "offset", "time"] + assert t._coord_names == ["cdp-x", "cdp-y"] + assert t._var_name == "AmplitudeCDP" + assert t._var_chunk_shape == [1, 1, 512, 4096] + + # Variables instantiated when build_dataset() is called + assert t._builder is None + assert t._dim_sizes == [] + assert t._coord_units == [] + + # Verify prestack CDP attributes + attrs = t._load_dataset_attributes() + assert attrs.attributes == { + "surveyDimensionality": "3D", + "ensembleType": "cdp", + "processingStage": "pre-stack", + } + + assert t.get_name() == "PreStackCdpGathers3DTime" + + def test_domain_case_handling(self) -> None: + """Test that domain parameter handles different cases correctly.""" + # Test uppercase + t1 = Seismic3DPreStackCDPTemplate("ELEVATION") + assert t1._trace_domain == "elevation" + assert t1.get_name() == "PreStackCdpGathers3DElevation" + + # Test mixed case + t2 = Seismic3DPreStackCDPTemplate("elevatioN") + assert t2._trace_domain == "elevation" + assert t2.get_name() == "PreStackCdpGathers3DElevation" + + def test_build_dataset_depth(self) -> None: + """Unit tests for Seismic3DPreStackCDPDepthTemplate build with depth domain.""" + t = Seismic3DPreStackCDPTemplate(domain="depth") + + assert t.get_name() == "PreStackCdpGathers3DDepth" + dataset = t.build_dataset( + "North Sea 3D Prestack Depth", + sizes=[512, 768, 36, 1536], + coord_units=[_UNIT_METER, _UNIT_METER], + ) + + assert dataset.metadata.name == "North Sea 3D Prestack Depth" + assert dataset.metadata.attributes["surveyDimensionality"] == "3D" + assert dataset.metadata.attributes["ensembleType"] == "cdp" + assert dataset.metadata.attributes["processingStage"] == "pre-stack" + + # Verify variables + # 2 coordinate variables + 1 data variable = 3 variables + assert len(dataset.variables) == 3 + + # Verify coordinate variables + cdp_x = validate_variable( + dataset, + name="cdp-x", + dims=[("inline", 512), ("crossline", 768)], + coords=["cdp-x"], + dtype=ScalarType.FLOAT64, + ) + assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER + + cdp_y = validate_variable( + dataset, + name="cdp-y", + dims=[("inline", 512), ("crossline", 768)], + coords=["cdp-y"], + dtype=ScalarType.FLOAT64, + ) + assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER + + # Verify seismic variable (prestack depth data) + seismic = validate_variable( + dataset, + name="AmplitudeCDP", + dims=[("inline", 512), ("crossline", 768), ("offset", 36), ("depth", 1536)], + coords=["cdp-x", "cdp-y"], + dtype=ScalarType.FLOAT32, + ) + assert isinstance(seismic.compressor, Blosc) + assert seismic.compressor.algorithm == "zstd" + assert isinstance(seismic.metadata.chunk_grid, RegularChunkGrid) + assert seismic.metadata.chunk_grid.configuration.chunk_shape == [1, 1, 512, 4096] + assert seismic.metadata.stats_v1 is None + + def test_build_dataset_time(self) -> None: + """Unit tests for Seismic3DPreStackCDPTimeTemplate build with time domain.""" + t = Seismic3DPreStackCDPTemplate(domain="time") + + assert t.get_name() == "PreStackCdpGathers3DTime" + dataset = t.build_dataset( + "Santos Basin 3D Prestack", + sizes=[512, 768, 36, 1536], + coord_units=[_UNIT_METER, _UNIT_METER], + ) + + assert dataset.metadata.name == "Santos Basin 3D Prestack" + assert dataset.metadata.attributes["surveyDimensionality"] == "3D" + assert dataset.metadata.attributes["ensembleType"] == "cdp" + assert dataset.metadata.attributes["processingStage"] == "pre-stack" + + # Verify variables + # 2 coordinate variables + 1 data variable = 3 variables + assert len(dataset.variables) == 3 + + # Verify coordinate variables + cdp_x = validate_variable( + dataset, + name="cdp-x", + dims=[("inline", 512), ("crossline", 768)], + coords=["cdp-x"], + dtype=ScalarType.FLOAT64, + ) + assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER + + cdp_y = validate_variable( + dataset, + name="cdp-y", + dims=[("inline", 512), ("crossline", 768)], + coords=["cdp-y"], + dtype=ScalarType.FLOAT64, + ) + assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER + + # Verify seismic variable (prestack time data) + seismic = validate_variable( + dataset, + name="AmplitudeCDP", + dims=[("inline", 512), ("crossline", 768), ("offset", 36), ("time", 1536)], + coords=["cdp-x", "cdp-y"], + dtype=ScalarType.FLOAT32, + ) + assert isinstance(seismic.compressor, Blosc) + assert seismic.compressor.algorithm == "zstd" + assert isinstance(seismic.metadata.chunk_grid, RegularChunkGrid) + assert seismic.metadata.chunk_grid.configuration.chunk_shape == [1, 1, 512, 4096] + assert seismic.metadata.stats_v1 is None diff --git a/tests/unit/v1/templates/test_seismic_3d_prestack_shot.py b/tests/unit/v1/templates/test_seismic_3d_prestack_shot.py new file mode 100644 index 000000000..eea66cf6b --- /dev/null +++ b/tests/unit/v1/templates/test_seismic_3d_prestack_shot.py @@ -0,0 +1,244 @@ +"""Unit tests for Seismic3DPreStackShotTemplate.""" + +from tests.unit.v1.helpers import validate_variable + +from mdio.schemas.chunk_grid import RegularChunkGrid +from mdio.schemas.compressors import Blosc +from mdio.schemas.dtype import ScalarType +from mdio.schemas.v1.templates.seismic_3d_prestack_shot import Seismic3DPreStackShotTemplate +from mdio.schemas.v1.units import AllUnits +from mdio.schemas.v1.units import LengthUnitEnum +from mdio.schemas.v1.units import LengthUnitModel +from mdio.schemas.v1.units import TimeUnitEnum +from mdio.schemas.v1.units import TimeUnitModel + +_UNIT_METER = AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER)) +_UNIT_SECOND = AllUnits(units_v1=TimeUnitModel(time=TimeUnitEnum.SECOND)) + + +class TestSeismic3DPreStackShotTemplate: + """Unit tests for Seismic3DPreStackShotTemplate.""" + + def test_configuration_depth(self) -> None: + """Unit tests for Seismic3DPreStackShotTemplate in depth domain.""" + t = Seismic3DPreStackShotTemplate(domain="DEPTH") + + # Template attributes for prestack shot + assert t._trace_domain == "depth" + assert t._coord_dim_names == [] + assert t._dim_names == ["shot_point", "cable", "channel", "depth"] + assert t._coord_names == ["gun", "shot-x", "shot-y", "receiver-x", "receiver-y"] + assert t._var_name == "AmplitudeShot" + assert t._var_chunk_shape == [1, 1, 512, 4096] + + # Variables instantiated when build_dataset() is called + assert t._builder is None + assert t._dim_sizes == [] + assert t._coord_units == [] + + # Verify prestack shot attributes + attrs = t._load_dataset_attributes() + assert attrs.attributes == { + "surveyDimensionality": "3D", + "ensembleType": "shot", + "processingStage": "pre-stack", + } + + assert t.get_name() == "PreStackShotGathers3DDepth" + + def test_configuration_time(self) -> None: + """Unit tests for Seismic3DPreStackShotTemplate in time domain.""" + t = Seismic3DPreStackShotTemplate(domain="TIME") + + # Template attributes for prestack shot + assert t._trace_domain == "time" + assert t._coord_dim_names == [] + assert t._dim_names == ["shot_point", "cable", "channel", "time"] + assert t._coord_names == ["gun", "shot-x", "shot-y", "receiver-x", "receiver-y"] + assert t._var_name == "AmplitudeShot" + assert t._var_chunk_shape == [1, 1, 512, 4096] + + # Variables instantiated when build_dataset() is called + assert t._builder is None + assert t._dim_sizes == [] + assert t._coord_units == [] + + # Verify prestack shot attributes + attrs = t._load_dataset_attributes() + assert attrs.attributes == { + "surveyDimensionality": "3D", + "ensembleType": "shot", + "processingStage": "pre-stack", + } + + assert t.get_name() == "PreStackShotGathers3DTime" + + def test_domain_case_handling(self) -> None: + """Test that domain parameter handles different cases correctly.""" + # Test uppercase + t1 = Seismic3DPreStackShotTemplate("ELEVATION") + assert t1._trace_domain == "elevation" + assert t1.get_name() == "PreStackShotGathers3DElevation" + + # Test mixed case + t2 = Seismic3DPreStackShotTemplate("elevatioN") + assert t2._trace_domain == "elevation" + assert t2.get_name() == "PreStackShotGathers3DElevation" + + def test_build_dataset_depth(self) -> None: + """Unit tests for Seismic3DPreStackShotTemplate build in depth domain.""" + t = Seismic3DPreStackShotTemplate(domain="depth") + + assert t.get_name() == "PreStackShotGathers3DDepth" + dataset = t.build_dataset( + "Gulf of Mexico 3D Shot Depth", + sizes=[256, 512, 24, 2048], + coord_units=[_UNIT_METER, _UNIT_METER], + ) + + assert dataset.metadata.name == "Gulf of Mexico 3D Shot Depth" + assert dataset.metadata.attributes["surveyDimensionality"] == "3D" + assert dataset.metadata.attributes["ensembleType"] == "shot" + assert dataset.metadata.attributes["processingStage"] == "pre-stack" + + # Verify variables (including dimension variables) + # 5 coordinate variables + 1 data variable = 6 variables + assert len(dataset.variables) == 6 + + # Verify coordinate variables + validate_variable( + dataset, + name="gun", + dims=[("shot_point", 256)], + coords=["gun"], + dtype=ScalarType.UINT8, + ) + + shot_x = validate_variable( + dataset, + name="shot-x", + dims=[("shot_point", 256)], + coords=["shot-x"], + dtype=ScalarType.FLOAT64, + ) + assert shot_x.metadata.units_v1.length == LengthUnitEnum.METER + + shot_y = validate_variable( + dataset, + name="shot-y", + dims=[("shot_point", 256)], + coords=["shot-y"], + dtype=ScalarType.FLOAT64, + ) + assert shot_y.metadata.units_v1.length == LengthUnitEnum.METER + + receiver_x = validate_variable( + dataset, + name="receiver-x", + dims=[("shot_point", 256), ("cable", 512), ("channel", 24)], + coords=["receiver-x"], + dtype=ScalarType.FLOAT64, + ) + assert receiver_x.metadata.units_v1.length == LengthUnitEnum.METER + + receiver_y = validate_variable( + dataset, + name="receiver-y", + dims=[("shot_point", 256), ("cable", 512), ("channel", 24)], + coords=["receiver-y"], + dtype=ScalarType.FLOAT64, + ) + assert receiver_y.metadata.units_v1.length == LengthUnitEnum.METER + + # Verify seismic variable (prestack shot depth data) + seismic = validate_variable( + dataset, + name="AmplitudeShot", + dims=[("shot_point", 256), ("cable", 512), ("channel", 24), ("depth", 2048)], + coords=["gun", "shot-x", "shot-y", "receiver-x", "receiver-y"], + dtype=ScalarType.FLOAT32, + ) + assert isinstance(seismic.compressor, Blosc) + assert seismic.compressor.algorithm == "zstd" + assert isinstance(seismic.metadata.chunk_grid, RegularChunkGrid) + assert seismic.metadata.chunk_grid.configuration.chunk_shape == [1, 1, 512, 4096] + assert seismic.metadata.stats_v1 is None + + def test_build_dataset_time(self) -> None: + """Unit tests for Seismic3DPreStackShotTemplate build in time domain.""" + t = Seismic3DPreStackShotTemplate(domain="time") + + assert t.get_name() == "PreStackShotGathers3DTime" + dataset = t.build_dataset( + "North Sea 3D Shot Time", + sizes=[256, 512, 24, 2048], + coord_units=[_UNIT_METER, _UNIT_METER], + ) + + assert dataset.metadata.name == "North Sea 3D Shot Time" + assert dataset.metadata.attributes["surveyDimensionality"] == "3D" + assert dataset.metadata.attributes["ensembleType"] == "shot" + assert dataset.metadata.attributes["processingStage"] == "pre-stack" + + # Verify variables (including dimension variables) + # 5 coordinate variables + 1 data variable = 6 variables + assert len(dataset.variables) == 6 + + # Verify coordinate variables + validate_variable( + dataset, + name="gun", + dims=[("shot_point", 256)], + coords=["gun"], + dtype=ScalarType.UINT8, + ) + + shot_x = validate_variable( + dataset, + name="shot-x", + dims=[("shot_point", 256)], + coords=["shot-x"], + dtype=ScalarType.FLOAT64, + ) + assert shot_x.metadata.units_v1.length == LengthUnitEnum.METER + + shot_y = validate_variable( + dataset, + name="shot-y", + dims=[("shot_point", 256)], + coords=["shot-y"], + dtype=ScalarType.FLOAT64, + ) + assert shot_y.metadata.units_v1.length == LengthUnitEnum.METER + + receiver_x = validate_variable( + dataset, + name="receiver-x", + dims=[("shot_point", 256), ("cable", 512), ("channel", 24)], + coords=["receiver-x"], + dtype=ScalarType.FLOAT64, + ) + assert receiver_x.metadata.units_v1.length == LengthUnitEnum.METER + + receiver_y = validate_variable( + dataset, + name="receiver-y", + dims=[("shot_point", 256), ("cable", 512), ("channel", 24)], + coords=["receiver-y"], + dtype=ScalarType.FLOAT64, + ) + assert receiver_y.metadata.units_v1.length == LengthUnitEnum.METER + + # Verify seismic variable (prestack shot time data) + seismic = validate_variable( + dataset, + name="AmplitudeShot", + dims=[("shot_point", 256), ("cable", 512), ("channel", 24), ("time", 2048)], + coords=["gun", "shot-x", "shot-y", "receiver-x", "receiver-y"], + dtype=ScalarType.FLOAT32, + ) + assert isinstance(seismic.compressor, Blosc) + assert seismic.compressor.algorithm == "zstd" + assert isinstance(seismic.metadata.chunk_grid, RegularChunkGrid) + assert seismic.metadata.chunk_grid.configuration.chunk_shape == [1, 1, 512, 4096] + assert seismic.metadata.stats_v1 is None diff --git a/tests/unit/v1/templates/test_seismic_templates.py b/tests/unit/v1/templates/test_seismic_templates.py new file mode 100644 index 000000000..46d2245a2 --- /dev/null +++ b/tests/unit/v1/templates/test_seismic_templates.py @@ -0,0 +1,59 @@ +"""Unit tests for concrete seismic dataset template implementations.""" + +# Import all concrete template classes +from mdio.schemas.v1.templates.abstract_dataset_template import AbstractDatasetTemplate +from mdio.schemas.v1.templates.seismic_2d_poststack import Seismic2DPostStackTemplate +from mdio.schemas.v1.templates.seismic_3d_poststack import Seismic3DPostStackTemplate +from mdio.schemas.v1.templates.seismic_3d_prestack_cdp import Seismic3DPreStackCDPTemplate +from mdio.schemas.v1.templates.seismic_3d_prestack_shot import Seismic3DPreStackShotTemplate + + +class TestSeismicTemplates: + """Test cases for Seismic2DPostStackTemplate.""" + + def test_get_name_time(self) -> None: + """Test get_name with domain.""" + time_template = Seismic2DPostStackTemplate("time") + dpth_template = Seismic2DPostStackTemplate("depth") + + assert time_template.get_name() == "PostStack2DTime" + assert dpth_template.get_name() == "PostStack2DDepth" + + time_template = Seismic3DPostStackTemplate("time") + dpth_template = Seismic3DPostStackTemplate("depth") + + assert time_template.get_name() == "PostStack3DTime" + assert dpth_template.get_name() == "PostStack3DDepth" + + time_template = Seismic3DPreStackCDPTemplate("time") + dpth_template = Seismic3DPreStackCDPTemplate("depth") + + assert time_template.get_name() == "PreStackCdpGathers3DTime" + assert dpth_template.get_name() == "PreStackCdpGathers3DDepth" + + time_template = Seismic3DPreStackShotTemplate("time") + dpth_template = Seismic3DPreStackShotTemplate("depth") + + assert time_template.get_name() == "PreStackShotGathers3DTime" + assert dpth_template.get_name() == "PreStackShotGathers3DDepth" + + def test_all_templates_inherit_from_abstract(self) -> None: + """Test that all concrete templates inherit from AbstractDatasetTemplate.""" + templates = [ + Seismic2DPostStackTemplate("time"), + Seismic3DPostStackTemplate("time"), + Seismic3DPreStackCDPTemplate("time"), + Seismic3DPreStackShotTemplate("time"), + Seismic2DPostStackTemplate("depth"), + Seismic3DPostStackTemplate("depth"), + Seismic3DPreStackCDPTemplate("depth"), + Seismic3DPreStackShotTemplate("depth"), + ] + + for template in templates: + assert isinstance(template, AbstractDatasetTemplate) + assert hasattr(template, "get_name") + assert hasattr(template, "build_dataset") + + names = [template.get_name() for template in templates] + assert len(names) == len(set(names)), f"Duplicate template names found: {names}" diff --git a/tests/unit/v1/templates/test_template_registry.py b/tests/unit/v1/templates/test_template_registry.py new file mode 100644 index 000000000..a40f5021c --- /dev/null +++ b/tests/unit/v1/templates/test_template_registry.py @@ -0,0 +1,395 @@ +"""Tests for the singleton TemplateRegistry implementation.""" + +import threading +import time + +import pytest + +from mdio.schemas.v1.templates.abstract_dataset_template import AbstractDatasetTemplate +from mdio.schemas.v1.templates.template_registry import TemplateRegistry +from mdio.schemas.v1.templates.template_registry import get_template +from mdio.schemas.v1.templates.template_registry import get_template_registry +from mdio.schemas.v1.templates.template_registry import is_template_registered +from mdio.schemas.v1.templates.template_registry import list_templates +from mdio.schemas.v1.templates.template_registry import register_template + + +class MockDatasetTemplate(AbstractDatasetTemplate): + """Mock template for testing.""" + + def __init__(self, name: str): + super().__init__() + self.template_name = name + + def _get_name(self) -> str: + return self.template_name + + def _load_dataset_attributes(self) -> None: + return None # Mock implementation + + def create_dataset(self) -> str: + """Create a mock dataset. + + Returns: + str: A message indicating the dataset creation. + """ + return f"Mock dataset created by {self.template_name}" + + +class TestTemplateRegistrySingleton: + """Test cases for TemplateRegistry singleton pattern.""" + + def setup_method(self) -> None: + """Reset singleton before each test.""" + TemplateRegistry._reset_instance() + + def teardown_method(self) -> None: + """Clean up after each test.""" + if TemplateRegistry._instance: + TemplateRegistry._instance.clear() + TemplateRegistry._reset_instance() + + def test_singleton_same_instance(self) -> None: + """Test that multiple instantiations return the same instance.""" + registry1 = TemplateRegistry() + registry2 = TemplateRegistry() + registry3 = TemplateRegistry.get_instance() + + assert registry1 is registry2 + assert registry2 is registry3 + assert id(registry1) == id(registry2) == id(registry3) + + def test_singleton_thread_safety(self) -> None: + """Test that singleton is thread-safe during creation.""" + instances = [] + errors = [] + + def create_instance() -> None: + try: + instance = TemplateRegistry() + instances.append(instance) + time.sleep(0.001) # Small delay to increase contention + except Exception as e: + errors.append(e) + + # Create multiple threads trying to create instances + threads = [threading.Thread(target=create_instance) for _ in range(10)] + + for thread in threads: + thread.start() + + for thread in threads: + thread.join() + + # All instances should be the same + assert len(errors) == 0 + assert len(instances) == 10 + assert all(instance is instances[0] for instance in instances) + + def test_initialization_only_once(self) -> None: + """Test that internal state is initialized only once.""" + registry1 = TemplateRegistry() + template1 = MockDatasetTemplate("test_template") + registry1.register(template1) + + # Create another instance - should have same templates + registry2 = TemplateRegistry() + + assert registry1 is registry2 + assert registry2.is_registered("test_template") + assert registry2.get("test_template") is template1 + + def test_register_template(self) -> None: + """Test template registration.""" + registry = TemplateRegistry() + template = MockDatasetTemplate("test") + + name = registry.register(template) + + assert name == "test" # Should be the template name + assert registry.is_registered("test") + assert registry.get("test") is template + + def test_register_duplicate_template(self) -> None: + """Test error when registering duplicate template.""" + registry = TemplateRegistry() + template1 = MockDatasetTemplate("duplicate") + template2 = MockDatasetTemplate("duplicate") + + registry.register(template1) + + with pytest.raises(ValueError, match="Template 'duplicate' is already registered"): + registry.register(template2) + + def test_get_nonexistent_template(self) -> None: + """Test error when getting non-existent template.""" + registry = TemplateRegistry() + + with pytest.raises(KeyError, match="Template 'nonexistent' is not registered"): + registry.get("nonexistent") + + def test_unregister_template(self) -> None: + """Test template unregistration.""" + registry = TemplateRegistry() + template = MockDatasetTemplate("test_template") + + registry.register(template) + assert registry.is_registered("test_template") + + registry.unregister("test_template") + assert not registry.is_registered("test_template") + + def test_unregister_nonexistent_template(self) -> None: + """Test error when unregistering non-existent template.""" + registry = TemplateRegistry() + + with pytest.raises(KeyError, match="Template 'nonexistent' is not registered"): + registry.unregister("nonexistent") + + def test_list_all_templates(self) -> None: + """Test listing all registered templates.""" + registry = TemplateRegistry() + + # Default templates are always installed + templates = list_templates() + assert len(templates) == 8 + assert "PostStack2DTime" in templates + assert "PostStack3DTime" in templates + assert "PreStackCdpGathers3DTime" in templates + assert "PreStackShotGathers3DTime" in templates + + assert "PostStack2DDepth" in templates + assert "PostStack3DDepth" in templates + assert "PreStackCdpGathers3DDepth" in templates + assert "PreStackShotGathers3DDepth" in templates + + # Add some templates + template1 = MockDatasetTemplate("Template_One") + template2 = MockDatasetTemplate("Template_Two") + + registry.register(template1) + registry.register(template2) + + templates = registry.list_all_templates() + assert len(templates) == 10 + assert "Template_One" in templates + assert "Template_Two" in templates + + def test_clear_templates(self) -> None: + """Test clearing all templates.""" + registry = TemplateRegistry() + + # Default templates are always installed + templates = list_templates() + assert len(templates) == 8 + + # Add some templates + template1 = MockDatasetTemplate("Template1") + template2 = MockDatasetTemplate("Template2") + + registry.register(template1) + registry.register(template2) + + assert len(registry.list_all_templates()) == 10 + + # Clear all + registry.clear() + + assert len(registry.list_all_templates()) == 0 + assert not registry.is_registered("Template1") + assert not registry.is_registered("Template2") + # default templates are also cleared + assert not registry.is_registered("PostStack2DTime") + assert not registry.is_registered("PostStack3DTime") + assert not registry.is_registered("PreStackCdpGathers3DTime") + assert not registry.is_registered("PreStackShotGathers3DTime") + assert not registry.is_registered("PostStack2DDepth") + assert not registry.is_registered("PostStack3DDepth") + assert not registry.is_registered("PreStackCdpGathers3DDepth") + assert not registry.is_registered("PreStackShotGathers3DDepth") + + def test_reset_instance(self) -> None: + """Test resetting the singleton instance.""" + registry1 = TemplateRegistry() + template = MockDatasetTemplate("test") + registry1.register(template) + + # Reset the instance + TemplateRegistry._reset_instance() + + # New instance should be different and contain default templates only + registry2 = TemplateRegistry() + + assert registry1 is not registry2 + assert not registry2.is_registered("test") + + # default templates are registered + assert len(registry2.list_all_templates()) == 8 + assert registry2.is_registered("PostStack2DTime") + assert registry2.is_registered("PostStack3DTime") + assert registry2.is_registered("PreStackCdpGathers3DTime") + assert registry2.is_registered("PreStackShotGathers3DTime") + assert registry2.is_registered("PostStack2DDepth") + assert registry2.is_registered("PostStack3DDepth") + assert registry2.is_registered("PreStackCdpGathers3DDepth") + assert registry2.is_registered("PreStackShotGathers3DDepth") + + +class TestGlobalFunctions: + """Test cases for global convenience functions.""" + + def setup_method(self) -> None: + """Reset singleton before each test.""" + TemplateRegistry._reset_instance() + + def teardown_method(self) -> None: + """Clean up after each test.""" + if TemplateRegistry._instance: + TemplateRegistry._instance.clear() + TemplateRegistry._reset_instance() + + def test_get_template_registry(self) -> None: + """Test global registry getter.""" + registry1 = get_template_registry() + registry2 = get_template_registry() + direct_registry = TemplateRegistry() + + assert registry1 is registry2 + assert registry1 is direct_registry + + def test_register_template_global(self) -> None: + """Test global template registration.""" + template = MockDatasetTemplate("global_test") + + name = register_template(template) + + assert name == "global_test" + assert is_template_registered("global_test") + assert get_template("global_test") is template + + def test_list_templates_global(self) -> None: + """Test global template listing.""" + # Default templates are always installed + templates = list_templates() + assert len(templates) == 8 + assert "PostStack2DTime" in templates + assert "PostStack3DTime" in templates + assert "PreStackCdpGathers3DTime" in templates + assert "PreStackShotGathers3DTime" in templates + + assert "PostStack2DDepth" in templates + assert "PostStack3DDepth" in templates + assert "PreStackCdpGathers3DDepth" in templates + assert "PreStackShotGathers3DDepth" in templates + + template1 = MockDatasetTemplate("template1") + template2 = MockDatasetTemplate("template2") + + register_template(template1) + register_template(template2) + + templates = list_templates() + assert len(templates) == 10 + assert "template1" in templates + assert "template2" in templates + + +class TestConcurrentAccess: + """Test concurrent access to the singleton registry.""" + + def setup_method(self) -> None: + """Reset singleton before each test.""" + TemplateRegistry._reset_instance() + + def teardown_method(self) -> None: + """Clean up after each test.""" + if TemplateRegistry._instance: + TemplateRegistry._instance.clear() + TemplateRegistry._reset_instance() + + def test_concurrent_registration(self) -> None: + """Test concurrent template registration.""" + registry = TemplateRegistry() + results = [] + errors = [] + + def register_template_worker(template_id: int) -> None: + try: + template = MockDatasetTemplate(f"template_{template_id}") + name = registry.register(template) + results.append((template_id, name)) + time.sleep(0.001) # Small delay + except Exception as e: + errors.append((template_id, e)) + + # Create multiple threads registering different templates + threads = [threading.Thread(target=register_template_worker, args=(i,)) for i in range(10)] + + for thread in threads: + thread.start() + + for thread in threads: + thread.join() + + # All registrations should succeed + assert len(errors) == 0 + assert len(results) == 10 + # Including 8 default templates + assert len(registry.list_all_templates()) == 18 + + # Check all templates are registered + for i in range(10): + assert registry.is_registered(f"template_{i}") + + def test_concurrent_access_mixed_operations(self) -> None: + """Test concurrent mixed operations (register, get, list).""" + registry = TemplateRegistry() + + # Pre-register some templates + for i in range(5): + template = MockDatasetTemplate(f"initial_{i}") + registry.register(template) + + results = [] + errors = [] + + def mixed_operations_worker(worker_id: int) -> None: + try: + operations_results = [] + + # Get existing template + if worker_id % 2 == 0: + template = registry.get("initial_0") + operations_results.append(("get", template.template_name)) + + # Register new template + if worker_id % 3 == 0: + new_template = MockDatasetTemplate(f"worker_{worker_id}") + name = registry.register(new_template) + operations_results.append(("register", name)) + + # List templates + templates = registry.list_all_templates() + operations_results.append(("list", len(templates))) + + results.append((worker_id, operations_results)) + + except Exception as e: + errors.append((worker_id, e)) + + # Run concurrent operations + threads = [threading.Thread(target=mixed_operations_worker, args=(i,)) for i in range(15)] + + for thread in threads: + thread.start() + + for thread in threads: + thread.join() + + # Check that operations completed without errors + assert len(errors) == 0 + assert len(results) == 15 + + # Verify final state is consistent + final_templates = registry.list_all_templates() + assert len(final_templates) >= 5 # At least the initial templates diff --git a/tests/unit/v1/test_dataset_builder_build.py b/tests/unit/v1/test_dataset_builder_build.py index 833fad981..43b87fb5f 100644 --- a/tests/unit/v1/test_dataset_builder_build.py +++ b/tests/unit/v1/test_dataset_builder_build.py @@ -45,10 +45,10 @@ def test_build() -> None: def test_build_seismic_poststack_3d_acceptance_dataset() -> None: # noqa: PLR0915 Too many statements (57 > 50) """Test building a Seismic PostStack 3D Acceptance dataset.""" - dataset = make_seismic_poststack_3d_acceptance_dataset() + dataset = make_seismic_poststack_3d_acceptance_dataset("Seismic") # Verify dataset structure - assert dataset.metadata.name == "campos_3d" + assert dataset.metadata.name == "Seismic" assert dataset.metadata.api_version == "1.0.0a1" assert dataset.metadata.attributes["foo"] == "bar" assert len(dataset.metadata.attributes["textHeader"]) == 3 diff --git a/tests/unit/v1/test_dataset_serializer.py b/tests/unit/v1/test_dataset_serializer.py index f8439585e..9db2deee1 100644 --- a/tests/unit/v1/test_dataset_serializer.py +++ b/tests/unit/v1/test_dataset_serializer.py @@ -398,7 +398,7 @@ def test_to_xarray_dataset(tmp_path: Path) -> None: def test_seismic_poststack_3d_acceptance_to_xarray_dataset(tmp_path: Path) -> None: """Test building a complete dataset.""" - dataset = make_seismic_poststack_3d_acceptance_dataset() + dataset = make_seismic_poststack_3d_acceptance_dataset("Seismic") xr_ds = to_xarray_dataset(dataset) From bc35bdfa5b53cb4cd6822094569c5fa77a282582 Mon Sep 17 00:00:00 2001 From: Altay Sansal Date: Tue, 5 Aug 2025 20:29:09 -0500 Subject: [PATCH 54/56] update deps --- pyproject.toml | 18 +- uv.lock | 3668 ++++++++++++++++++++++++------------------------ 2 files changed, 1852 insertions(+), 1834 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 2a1c821dd..4bbf4c18f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,27 +25,27 @@ classifiers = [ dependencies = [ "click (>=8.2.1,<9.0.0)", "click-params (>=0.5.0,<0.6.0)", - "dask (>=2025.5.1)", - "fsspec (>=2025.5.1)", + "dask (>=2025.7.0)", + "fsspec (>=2025.7.0)", "pint>=0.24.4,<0.25", "psutil (>=7.0.0,<8.0.0)", "pydantic (>=2.11.7,<3.0.0)", "pydantic-settings (>=2.10.1,<3.0.0)", - "rich (>=14.0.0,<15.0.0)", - "segy (>=0.4.1.post2,<0.5.0)", + "rich (>=14.1.0,<15.0.0)", + "segy (>=0.4.2,<0.5.0)", "tqdm (>=4.67.1,<5.0.0)", - "xarray>=2025.6.1", - "zarr (>=3.1.0,<4.0.0)", + "xarray>=2025.7.1", + "zarr (>=3.1.1,<4.0.0)", ] [project.optional-dependencies] cloud = [ - "s3fs == 2025.5.1", - "gcsfs (>=2025.5.1)", + "s3fs (>=2025.7.0)", + "gcsfs (>=2025.7.0)", "adlfs (>=2024.12.0)", ] distributed = [ - "distributed (>=2025.5.1)", + "distributed (>=2025.7.0)", "bokeh (>=3.7.3,<4.0.0)", ] lossy = ["zfpy (>=1.0.1,<2.0.0)"] diff --git a/uv.lock b/uv.lock index a580acd5c..9ecc1d26f 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 1 +revision = 2 requires-python = ">=3.11, <3.14" resolution-markers = [ "python_full_version >= '3.13'", @@ -7,6 +7,18 @@ resolution-markers = [ "python_full_version < '3.12'", ] +[[package]] +name = "accessible-pygments" +version = "0.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/c1/bbac6a50d02774f91572938964c582fff4270eee73ab822a4aeea4d8b11b/accessible_pygments-0.0.5.tar.gz", hash = "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872", size = 1377899, upload-time = "2024-05-10T11:23:10.216Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/3f/95338030883d8c8b91223b4e21744b04d11b161a3ef117295d8241f50ab4/accessible_pygments-0.0.5-py3-none-any.whl", hash = "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7", size = 1395903, upload-time = "2024-05-10T11:23:08.421Z" }, +] + [[package]] name = "adlfs" version = "2024.12.0" @@ -19,14 +31,14 @@ dependencies = [ { name = "azure-storage-blob" }, { name = "fsspec" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/82/e30891af574fb358449fb9436aac53569814452cb88b0cba4f488171b8dc/adlfs-2024.12.0.tar.gz", hash = "sha256:04582bf7461a57365766d01a295a0a88b2b8c42c4fea06e2d673f62675cac5c6", size = 49189 } +sdist = { url = "https://files.pythonhosted.org/packages/76/82/e30891af574fb358449fb9436aac53569814452cb88b0cba4f488171b8dc/adlfs-2024.12.0.tar.gz", hash = "sha256:04582bf7461a57365766d01a295a0a88b2b8c42c4fea06e2d673f62675cac5c6", size = 49189, upload-time = "2024-12-15T19:06:30.939Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/ed/d1bf75c089857d38332cf45416e419b47382b345ba5dfc4fae69397830d9/adlfs-2024.12.0-py3-none-any.whl", hash = "sha256:00aab061ddec0413b2039487e656b62e01ece8ef1ca0493f76034a596cf069e3", size = 41792 }, + { url = "https://files.pythonhosted.org/packages/cb/ed/d1bf75c089857d38332cf45416e419b47382b345ba5dfc4fae69397830d9/adlfs-2024.12.0-py3-none-any.whl", hash = "sha256:00aab061ddec0413b2039487e656b62e01ece8ef1ca0493f76034a596cf069e3", size = 41792, upload-time = "2024-12-15T19:06:27.718Z" }, ] [[package]] name = "aiobotocore" -version = "2.23.0" +version = "2.23.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -37,23 +49,23 @@ dependencies = [ { name = "python-dateutil" }, { name = "wrapt" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9d/25/4b06ea1214ddf020a28df27dc7136ac9dfaf87929d51e6f6044dd350ed67/aiobotocore-2.23.0.tar.gz", hash = "sha256:0333931365a6c7053aee292fe6ef50c74690c4ae06bb019afdf706cb6f2f5e32", size = 115825 } +sdist = { url = "https://files.pythonhosted.org/packages/1d/ae/523d48504902a6f17f6ec94311899f217f1bf64b9ca394c89c690c37434c/aiobotocore-2.23.2.tar.gz", hash = "sha256:9c2cbd6e813bb6c60b7f20fc11897976a583c57b0093a87bebfe80a9b08746b2", size = 115881, upload-time = "2025-07-24T17:48:15.957Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/43/ccf9b29669cdb09fd4bfc0a8effeb2973b22a0f3c3be4142d0b485975d11/aiobotocore-2.23.0-py3-none-any.whl", hash = "sha256:8202cebbf147804a083a02bc282fbfda873bfdd0065fd34b64784acb7757b66e", size = 84161 }, + { url = "https://files.pythonhosted.org/packages/c9/2e/55780065672a69ab3d16062368d358ace7eac196b246e6b15b07301f8fbf/aiobotocore-2.23.2-py3-none-any.whl", hash = "sha256:5ca24feb49be73bd6cd92e82e95aefb0647c07bb85ca57000a0361b9554503d8", size = 84301, upload-time = "2025-07-24T17:48:14.494Z" }, ] [[package]] name = "aiohappyeyeballs" version = "2.6.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760 } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265 }, + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, ] [[package]] name = "aiohttp" -version = "3.12.14" +version = "3.12.15" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -64,68 +76,68 @@ dependencies = [ { name = "propcache" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e6/0b/e39ad954107ebf213a2325038a3e7a506be3d98e1435e1f82086eec4cde2/aiohttp-3.12.14.tar.gz", hash = "sha256:6e06e120e34d93100de448fd941522e11dafa78ef1a893c179901b7d66aa29f2", size = 7822921 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/53/e1/8029b29316971c5fa89cec170274582619a01b3d82dd1036872acc9bc7e8/aiohttp-3.12.14-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f4552ff7b18bcec18b60a90c6982049cdb9dac1dba48cf00b97934a06ce2e597", size = 709960 }, - { url = "https://files.pythonhosted.org/packages/96/bd/4f204cf1e282041f7b7e8155f846583b19149e0872752711d0da5e9cc023/aiohttp-3.12.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8283f42181ff6ccbcf25acaae4e8ab2ff7e92b3ca4a4ced73b2c12d8cd971393", size = 482235 }, - { url = "https://files.pythonhosted.org/packages/d6/0f/2a580fcdd113fe2197a3b9df30230c7e85bb10bf56f7915457c60e9addd9/aiohttp-3.12.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:040afa180ea514495aaff7ad34ec3d27826eaa5d19812730fe9e529b04bb2179", size = 470501 }, - { url = "https://files.pythonhosted.org/packages/38/78/2c1089f6adca90c3dd74915bafed6d6d8a87df5e3da74200f6b3a8b8906f/aiohttp-3.12.14-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b413c12f14c1149f0ffd890f4141a7471ba4b41234fe4fd4a0ff82b1dc299dbb", size = 1740696 }, - { url = "https://files.pythonhosted.org/packages/4a/c8/ce6c7a34d9c589f007cfe064da2d943b3dee5aabc64eaecd21faf927ab11/aiohttp-3.12.14-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:1d6f607ce2e1a93315414e3d448b831238f1874b9968e1195b06efaa5c87e245", size = 1689365 }, - { url = "https://files.pythonhosted.org/packages/18/10/431cd3d089de700756a56aa896faf3ea82bee39d22f89db7ddc957580308/aiohttp-3.12.14-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:565e70d03e924333004ed101599902bba09ebb14843c8ea39d657f037115201b", size = 1788157 }, - { url = "https://files.pythonhosted.org/packages/fa/b2/26f4524184e0f7ba46671c512d4b03022633bcf7d32fa0c6f1ef49d55800/aiohttp-3.12.14-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4699979560728b168d5ab63c668a093c9570af2c7a78ea24ca5212c6cdc2b641", size = 1827203 }, - { url = "https://files.pythonhosted.org/packages/e0/30/aadcdf71b510a718e3d98a7bfeaea2396ac847f218b7e8edb241b09bd99a/aiohttp-3.12.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad5fdf6af93ec6c99bf800eba3af9a43d8bfd66dce920ac905c817ef4a712afe", size = 1729664 }, - { url = "https://files.pythonhosted.org/packages/67/7f/7ccf11756ae498fdedc3d689a0c36ace8fc82f9d52d3517da24adf6e9a74/aiohttp-3.12.14-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ac76627c0b7ee0e80e871bde0d376a057916cb008a8f3ffc889570a838f5cc7", size = 1666741 }, - { url = "https://files.pythonhosted.org/packages/6b/4d/35ebc170b1856dd020c92376dbfe4297217625ef4004d56587024dc2289c/aiohttp-3.12.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:798204af1180885651b77bf03adc903743a86a39c7392c472891649610844635", size = 1715013 }, - { url = "https://files.pythonhosted.org/packages/7b/24/46dc0380146f33e2e4aa088b92374b598f5bdcde1718c77e8d1a0094f1a4/aiohttp-3.12.14-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:4f1205f97de92c37dd71cf2d5bcfb65fdaed3c255d246172cce729a8d849b4da", size = 1710172 }, - { url = "https://files.pythonhosted.org/packages/2f/0a/46599d7d19b64f4d0fe1b57bdf96a9a40b5c125f0ae0d8899bc22e91fdce/aiohttp-3.12.14-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:76ae6f1dd041f85065d9df77c6bc9c9703da9b5c018479d20262acc3df97d419", size = 1690355 }, - { url = "https://files.pythonhosted.org/packages/08/86/b21b682e33d5ca317ef96bd21294984f72379454e689d7da584df1512a19/aiohttp-3.12.14-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a194ace7bc43ce765338ca2dfb5661489317db216ea7ea700b0332878b392cab", size = 1783958 }, - { url = "https://files.pythonhosted.org/packages/4f/45/f639482530b1396c365f23c5e3b1ae51c9bc02ba2b2248ca0c855a730059/aiohttp-3.12.14-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:16260e8e03744a6fe3fcb05259eeab8e08342c4c33decf96a9dad9f1187275d0", size = 1804423 }, - { url = "https://files.pythonhosted.org/packages/7e/e5/39635a9e06eed1d73671bd4079a3caf9cf09a49df08490686f45a710b80e/aiohttp-3.12.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8c779e5ebbf0e2e15334ea404fcce54009dc069210164a244d2eac8352a44b28", size = 1717479 }, - { url = "https://files.pythonhosted.org/packages/51/e1/7f1c77515d369b7419c5b501196526dad3e72800946c0099594c1f0c20b4/aiohttp-3.12.14-cp311-cp311-win32.whl", hash = "sha256:a289f50bf1bd5be227376c067927f78079a7bdeccf8daa6a9e65c38bae14324b", size = 427907 }, - { url = "https://files.pythonhosted.org/packages/06/24/a6bf915c85b7a5b07beba3d42b3282936b51e4578b64a51e8e875643c276/aiohttp-3.12.14-cp311-cp311-win_amd64.whl", hash = "sha256:0b8a69acaf06b17e9c54151a6c956339cf46db4ff72b3ac28516d0f7068f4ced", size = 452334 }, - { url = "https://files.pythonhosted.org/packages/c3/0d/29026524e9336e33d9767a1e593ae2b24c2b8b09af7c2bd8193762f76b3e/aiohttp-3.12.14-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a0ecbb32fc3e69bc25efcda7d28d38e987d007096cbbeed04f14a6662d0eee22", size = 701055 }, - { url = "https://files.pythonhosted.org/packages/0a/b8/a5e8e583e6c8c1056f4b012b50a03c77a669c2e9bf012b7cf33d6bc4b141/aiohttp-3.12.14-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0400f0ca9bb3e0b02f6466421f253797f6384e9845820c8b05e976398ac1d81a", size = 475670 }, - { url = "https://files.pythonhosted.org/packages/29/e8/5202890c9e81a4ec2c2808dd90ffe024952e72c061729e1d49917677952f/aiohttp-3.12.14-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a56809fed4c8a830b5cae18454b7464e1529dbf66f71c4772e3cfa9cbec0a1ff", size = 468513 }, - { url = "https://files.pythonhosted.org/packages/23/e5/d11db8c23d8923d3484a27468a40737d50f05b05eebbb6288bafcb467356/aiohttp-3.12.14-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27f2e373276e4755691a963e5d11756d093e346119f0627c2d6518208483fb6d", size = 1715309 }, - { url = "https://files.pythonhosted.org/packages/53/44/af6879ca0eff7a16b1b650b7ea4a827301737a350a464239e58aa7c387ef/aiohttp-3.12.14-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:ca39e433630e9a16281125ef57ece6817afd1d54c9f1bf32e901f38f16035869", size = 1697961 }, - { url = "https://files.pythonhosted.org/packages/bb/94/18457f043399e1ec0e59ad8674c0372f925363059c276a45a1459e17f423/aiohttp-3.12.14-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9c748b3f8b14c77720132b2510a7d9907a03c20ba80f469e58d5dfd90c079a1c", size = 1753055 }, - { url = "https://files.pythonhosted.org/packages/26/d9/1d3744dc588fafb50ff8a6226d58f484a2242b5dd93d8038882f55474d41/aiohttp-3.12.14-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0a568abe1b15ce69d4cc37e23020720423f0728e3cb1f9bcd3f53420ec3bfe7", size = 1799211 }, - { url = "https://files.pythonhosted.org/packages/73/12/2530fb2b08773f717ab2d249ca7a982ac66e32187c62d49e2c86c9bba9b4/aiohttp-3.12.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9888e60c2c54eaf56704b17feb558c7ed6b7439bca1e07d4818ab878f2083660", size = 1718649 }, - { url = "https://files.pythonhosted.org/packages/b9/34/8d6015a729f6571341a311061b578e8b8072ea3656b3d72329fa0faa2c7c/aiohttp-3.12.14-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3006a1dc579b9156de01e7916d38c63dc1ea0679b14627a37edf6151bc530088", size = 1634452 }, - { url = "https://files.pythonhosted.org/packages/ff/4b/08b83ea02595a582447aeb0c1986792d0de35fe7a22fb2125d65091cbaf3/aiohttp-3.12.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:aa8ec5c15ab80e5501a26719eb48a55f3c567da45c6ea5bb78c52c036b2655c7", size = 1695511 }, - { url = "https://files.pythonhosted.org/packages/b5/66/9c7c31037a063eec13ecf1976185c65d1394ded4a5120dd5965e3473cb21/aiohttp-3.12.14-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:39b94e50959aa07844c7fe2206b9f75d63cc3ad1c648aaa755aa257f6f2498a9", size = 1716967 }, - { url = "https://files.pythonhosted.org/packages/ba/02/84406e0ad1acb0fb61fd617651ab6de760b2d6a31700904bc0b33bd0894d/aiohttp-3.12.14-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:04c11907492f416dad9885d503fbfc5dcb6768d90cad8639a771922d584609d3", size = 1657620 }, - { url = "https://files.pythonhosted.org/packages/07/53/da018f4013a7a179017b9a274b46b9a12cbeb387570f116964f498a6f211/aiohttp-3.12.14-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:88167bd9ab69bb46cee91bd9761db6dfd45b6e76a0438c7e884c3f8160ff21eb", size = 1737179 }, - { url = "https://files.pythonhosted.org/packages/49/e8/ca01c5ccfeaafb026d85fa4f43ceb23eb80ea9c1385688db0ef322c751e9/aiohttp-3.12.14-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:791504763f25e8f9f251e4688195e8b455f8820274320204f7eafc467e609425", size = 1765156 }, - { url = "https://files.pythonhosted.org/packages/22/32/5501ab525a47ba23c20613e568174d6c63aa09e2caa22cded5c6ea8e3ada/aiohttp-3.12.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2785b112346e435dd3a1a67f67713a3fe692d288542f1347ad255683f066d8e0", size = 1724766 }, - { url = "https://files.pythonhosted.org/packages/06/af/28e24574801fcf1657945347ee10df3892311c2829b41232be6089e461e7/aiohttp-3.12.14-cp312-cp312-win32.whl", hash = "sha256:15f5f4792c9c999a31d8decf444e79fcfd98497bf98e94284bf390a7bb8c1729", size = 422641 }, - { url = "https://files.pythonhosted.org/packages/98/d5/7ac2464aebd2eecac38dbe96148c9eb487679c512449ba5215d233755582/aiohttp-3.12.14-cp312-cp312-win_amd64.whl", hash = "sha256:3b66e1a182879f579b105a80d5c4bd448b91a57e8933564bf41665064796a338", size = 449316 }, - { url = "https://files.pythonhosted.org/packages/06/48/e0d2fa8ac778008071e7b79b93ab31ef14ab88804d7ba71b5c964a7c844e/aiohttp-3.12.14-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3143a7893d94dc82bc409f7308bc10d60285a3cd831a68faf1aa0836c5c3c767", size = 695471 }, - { url = "https://files.pythonhosted.org/packages/8d/e7/f73206afa33100804f790b71092888f47df65fd9a4cd0e6800d7c6826441/aiohttp-3.12.14-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3d62ac3d506cef54b355bd34c2a7c230eb693880001dfcda0bf88b38f5d7af7e", size = 473128 }, - { url = "https://files.pythonhosted.org/packages/df/e2/4dd00180be551a6e7ee979c20fc7c32727f4889ee3fd5b0586e0d47f30e1/aiohttp-3.12.14-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:48e43e075c6a438937c4de48ec30fa8ad8e6dfef122a038847456bfe7b947b63", size = 465426 }, - { url = "https://files.pythonhosted.org/packages/de/dd/525ed198a0bb674a323e93e4d928443a680860802c44fa7922d39436b48b/aiohttp-3.12.14-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:077b4488411a9724cecc436cbc8c133e0d61e694995b8de51aaf351c7578949d", size = 1704252 }, - { url = "https://files.pythonhosted.org/packages/d8/b1/01e542aed560a968f692ab4fc4323286e8bc4daae83348cd63588e4f33e3/aiohttp-3.12.14-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d8c35632575653f297dcbc9546305b2c1133391089ab925a6a3706dfa775ccab", size = 1685514 }, - { url = "https://files.pythonhosted.org/packages/b3/06/93669694dc5fdabdc01338791e70452d60ce21ea0946a878715688d5a191/aiohttp-3.12.14-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b8ce87963f0035c6834b28f061df90cf525ff7c9b6283a8ac23acee6502afd4", size = 1737586 }, - { url = "https://files.pythonhosted.org/packages/a5/3a/18991048ffc1407ca51efb49ba8bcc1645961f97f563a6c480cdf0286310/aiohttp-3.12.14-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0a2cf66e32a2563bb0766eb24eae7e9a269ac0dc48db0aae90b575dc9583026", size = 1786958 }, - { url = "https://files.pythonhosted.org/packages/30/a8/81e237f89a32029f9b4a805af6dffc378f8459c7b9942712c809ff9e76e5/aiohttp-3.12.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdea089caf6d5cde975084a884c72d901e36ef9c2fd972c9f51efbbc64e96fbd", size = 1709287 }, - { url = "https://files.pythonhosted.org/packages/8c/e3/bd67a11b0fe7fc12c6030473afd9e44223d456f500f7cf526dbaa259ae46/aiohttp-3.12.14-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a7865f27db67d49e81d463da64a59365ebd6b826e0e4847aa111056dcb9dc88", size = 1622990 }, - { url = "https://files.pythonhosted.org/packages/83/ba/e0cc8e0f0d9ce0904e3cf2d6fa41904e379e718a013c721b781d53dcbcca/aiohttp-3.12.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0ab5b38a6a39781d77713ad930cb5e7feea6f253de656a5f9f281a8f5931b086", size = 1676015 }, - { url = "https://files.pythonhosted.org/packages/d8/b3/1e6c960520bda094c48b56de29a3d978254637ace7168dd97ddc273d0d6c/aiohttp-3.12.14-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:9b3b15acee5c17e8848d90a4ebc27853f37077ba6aec4d8cb4dbbea56d156933", size = 1707678 }, - { url = "https://files.pythonhosted.org/packages/0a/19/929a3eb8c35b7f9f076a462eaa9830b32c7f27d3395397665caa5e975614/aiohttp-3.12.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e4c972b0bdaac167c1e53e16a16101b17c6d0ed7eac178e653a07b9f7fad7151", size = 1650274 }, - { url = "https://files.pythonhosted.org/packages/22/e5/81682a6f20dd1b18ce3d747de8eba11cbef9b270f567426ff7880b096b48/aiohttp-3.12.14-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7442488b0039257a3bdbc55f7209587911f143fca11df9869578db6c26feeeb8", size = 1726408 }, - { url = "https://files.pythonhosted.org/packages/8c/17/884938dffaa4048302985483f77dfce5ac18339aad9b04ad4aaa5e32b028/aiohttp-3.12.14-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f68d3067eecb64c5e9bab4a26aa11bd676f4c70eea9ef6536b0a4e490639add3", size = 1759879 }, - { url = "https://files.pythonhosted.org/packages/95/78/53b081980f50b5cf874359bde707a6eacd6c4be3f5f5c93937e48c9d0025/aiohttp-3.12.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f88d3704c8b3d598a08ad17d06006cb1ca52a1182291f04979e305c8be6c9758", size = 1708770 }, - { url = "https://files.pythonhosted.org/packages/ed/91/228eeddb008ecbe3ffa6c77b440597fdf640307162f0c6488e72c5a2d112/aiohttp-3.12.14-cp313-cp313-win32.whl", hash = "sha256:a3c99ab19c7bf375c4ae3debd91ca5d394b98b6089a03231d4c580ef3c2ae4c5", size = 421688 }, - { url = "https://files.pythonhosted.org/packages/66/5f/8427618903343402fdafe2850738f735fd1d9409d2a8f9bcaae5e630d3ba/aiohttp-3.12.14-cp313-cp313-win_amd64.whl", hash = "sha256:3f8aad695e12edc9d571f878c62bedc91adf30c760c8632f09663e5f564f4baa", size = 448098 }, +sdist = { url = "https://files.pythonhosted.org/packages/9b/e7/d92a237d8802ca88483906c388f7c201bbe96cd80a165ffd0ac2f6a8d59f/aiohttp-3.12.15.tar.gz", hash = "sha256:4fc61385e9c98d72fcdf47e6dd81833f47b2f77c114c29cd64a361be57a763a2", size = 7823716, upload-time = "2025-07-29T05:52:32.215Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/19/9e86722ec8e835959bd97ce8c1efa78cf361fa4531fca372551abcc9cdd6/aiohttp-3.12.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d3ce17ce0220383a0f9ea07175eeaa6aa13ae5a41f30bc61d84df17f0e9b1117", size = 711246, upload-time = "2025-07-29T05:50:15.937Z" }, + { url = "https://files.pythonhosted.org/packages/71/f9/0a31fcb1a7d4629ac9d8f01f1cb9242e2f9943f47f5d03215af91c3c1a26/aiohttp-3.12.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:010cc9bbd06db80fe234d9003f67e97a10fe003bfbedb40da7d71c1008eda0fe", size = 483515, upload-time = "2025-07-29T05:50:17.442Z" }, + { url = "https://files.pythonhosted.org/packages/62/6c/94846f576f1d11df0c2e41d3001000527c0fdf63fce7e69b3927a731325d/aiohttp-3.12.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3f9d7c55b41ed687b9d7165b17672340187f87a773c98236c987f08c858145a9", size = 471776, upload-time = "2025-07-29T05:50:19.568Z" }, + { url = "https://files.pythonhosted.org/packages/f8/6c/f766d0aaafcee0447fad0328da780d344489c042e25cd58fde566bf40aed/aiohttp-3.12.15-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc4fbc61bb3548d3b482f9ac7ddd0f18c67e4225aaa4e8552b9f1ac7e6bda9e5", size = 1741977, upload-time = "2025-07-29T05:50:21.665Z" }, + { url = "https://files.pythonhosted.org/packages/17/e5/fb779a05ba6ff44d7bc1e9d24c644e876bfff5abe5454f7b854cace1b9cc/aiohttp-3.12.15-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7fbc8a7c410bb3ad5d595bb7118147dfbb6449d862cc1125cf8867cb337e8728", size = 1690645, upload-time = "2025-07-29T05:50:23.333Z" }, + { url = "https://files.pythonhosted.org/packages/37/4e/a22e799c2035f5d6a4ad2cf8e7c1d1bd0923192871dd6e367dafb158b14c/aiohttp-3.12.15-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74dad41b3458dbb0511e760fb355bb0b6689e0630de8a22b1b62a98777136e16", size = 1789437, upload-time = "2025-07-29T05:50:25.007Z" }, + { url = "https://files.pythonhosted.org/packages/28/e5/55a33b991f6433569babb56018b2fb8fb9146424f8b3a0c8ecca80556762/aiohttp-3.12.15-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b6f0af863cf17e6222b1735a756d664159e58855da99cfe965134a3ff63b0b0", size = 1828482, upload-time = "2025-07-29T05:50:26.693Z" }, + { url = "https://files.pythonhosted.org/packages/c6/82/1ddf0ea4f2f3afe79dffed5e8a246737cff6cbe781887a6a170299e33204/aiohttp-3.12.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5b7fe4972d48a4da367043b8e023fb70a04d1490aa7d68800e465d1b97e493b", size = 1730944, upload-time = "2025-07-29T05:50:28.382Z" }, + { url = "https://files.pythonhosted.org/packages/1b/96/784c785674117b4cb3877522a177ba1b5e4db9ce0fd519430b5de76eec90/aiohttp-3.12.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6443cca89553b7a5485331bc9bedb2342b08d073fa10b8c7d1c60579c4a7b9bd", size = 1668020, upload-time = "2025-07-29T05:50:30.032Z" }, + { url = "https://files.pythonhosted.org/packages/12/8a/8b75f203ea7e5c21c0920d84dd24a5c0e971fe1e9b9ebbf29ae7e8e39790/aiohttp-3.12.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6c5f40ec615e5264f44b4282ee27628cea221fcad52f27405b80abb346d9f3f8", size = 1716292, upload-time = "2025-07-29T05:50:31.983Z" }, + { url = "https://files.pythonhosted.org/packages/47/0b/a1451543475bb6b86a5cfc27861e52b14085ae232896a2654ff1231c0992/aiohttp-3.12.15-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:2abbb216a1d3a2fe86dbd2edce20cdc5e9ad0be6378455b05ec7f77361b3ab50", size = 1711451, upload-time = "2025-07-29T05:50:33.989Z" }, + { url = "https://files.pythonhosted.org/packages/55/fd/793a23a197cc2f0d29188805cfc93aa613407f07e5f9da5cd1366afd9d7c/aiohttp-3.12.15-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:db71ce547012a5420a39c1b744d485cfb823564d01d5d20805977f5ea1345676", size = 1691634, upload-time = "2025-07-29T05:50:35.846Z" }, + { url = "https://files.pythonhosted.org/packages/ca/bf/23a335a6670b5f5dfc6d268328e55a22651b440fca341a64fccf1eada0c6/aiohttp-3.12.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ced339d7c9b5030abad5854aa5413a77565e5b6e6248ff927d3e174baf3badf7", size = 1785238, upload-time = "2025-07-29T05:50:37.597Z" }, + { url = "https://files.pythonhosted.org/packages/57/4f/ed60a591839a9d85d40694aba5cef86dde9ee51ce6cca0bb30d6eb1581e7/aiohttp-3.12.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:7c7dd29c7b5bda137464dc9bfc738d7ceea46ff70309859ffde8c022e9b08ba7", size = 1805701, upload-time = "2025-07-29T05:50:39.591Z" }, + { url = "https://files.pythonhosted.org/packages/85/e0/444747a9455c5de188c0f4a0173ee701e2e325d4b2550e9af84abb20cdba/aiohttp-3.12.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:421da6fd326460517873274875c6c5a18ff225b40da2616083c5a34a7570b685", size = 1718758, upload-time = "2025-07-29T05:50:41.292Z" }, + { url = "https://files.pythonhosted.org/packages/36/ab/1006278d1ffd13a698e5dd4bfa01e5878f6bddefc296c8b62649753ff249/aiohttp-3.12.15-cp311-cp311-win32.whl", hash = "sha256:4420cf9d179ec8dfe4be10e7d0fe47d6d606485512ea2265b0d8c5113372771b", size = 428868, upload-time = "2025-07-29T05:50:43.063Z" }, + { url = "https://files.pythonhosted.org/packages/10/97/ad2b18700708452400278039272032170246a1bf8ec5d832772372c71f1a/aiohttp-3.12.15-cp311-cp311-win_amd64.whl", hash = "sha256:edd533a07da85baa4b423ee8839e3e91681c7bfa19b04260a469ee94b778bf6d", size = 453273, upload-time = "2025-07-29T05:50:44.613Z" }, + { url = "https://files.pythonhosted.org/packages/63/97/77cb2450d9b35f517d6cf506256bf4f5bda3f93a66b4ad64ba7fc917899c/aiohttp-3.12.15-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:802d3868f5776e28f7bf69d349c26fc0efadb81676d0afa88ed00d98a26340b7", size = 702333, upload-time = "2025-07-29T05:50:46.507Z" }, + { url = "https://files.pythonhosted.org/packages/83/6d/0544e6b08b748682c30b9f65640d006e51f90763b41d7c546693bc22900d/aiohttp-3.12.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2800614cd560287be05e33a679638e586a2d7401f4ddf99e304d98878c29444", size = 476948, upload-time = "2025-07-29T05:50:48.067Z" }, + { url = "https://files.pythonhosted.org/packages/3a/1d/c8c40e611e5094330284b1aea8a4b02ca0858f8458614fa35754cab42b9c/aiohttp-3.12.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8466151554b593909d30a0a125d638b4e5f3836e5aecde85b66b80ded1cb5b0d", size = 469787, upload-time = "2025-07-29T05:50:49.669Z" }, + { url = "https://files.pythonhosted.org/packages/38/7d/b76438e70319796bfff717f325d97ce2e9310f752a267bfdf5192ac6082b/aiohttp-3.12.15-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e5a495cb1be69dae4b08f35a6c4579c539e9b5706f606632102c0f855bcba7c", size = 1716590, upload-time = "2025-07-29T05:50:51.368Z" }, + { url = "https://files.pythonhosted.org/packages/79/b1/60370d70cdf8b269ee1444b390cbd72ce514f0d1cd1a715821c784d272c9/aiohttp-3.12.15-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6404dfc8cdde35c69aaa489bb3542fb86ef215fc70277c892be8af540e5e21c0", size = 1699241, upload-time = "2025-07-29T05:50:53.628Z" }, + { url = "https://files.pythonhosted.org/packages/a3/2b/4968a7b8792437ebc12186db31523f541943e99bda8f30335c482bea6879/aiohttp-3.12.15-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3ead1c00f8521a5c9070fcb88f02967b1d8a0544e6d85c253f6968b785e1a2ab", size = 1754335, upload-time = "2025-07-29T05:50:55.394Z" }, + { url = "https://files.pythonhosted.org/packages/fb/c1/49524ed553f9a0bec1a11fac09e790f49ff669bcd14164f9fab608831c4d/aiohttp-3.12.15-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6990ef617f14450bc6b34941dba4f12d5613cbf4e33805932f853fbd1cf18bfb", size = 1800491, upload-time = "2025-07-29T05:50:57.202Z" }, + { url = "https://files.pythonhosted.org/packages/de/5e/3bf5acea47a96a28c121b167f5ef659cf71208b19e52a88cdfa5c37f1fcc/aiohttp-3.12.15-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd736ed420f4db2b8148b52b46b88ed038d0354255f9a73196b7bbce3ea97545", size = 1719929, upload-time = "2025-07-29T05:50:59.192Z" }, + { url = "https://files.pythonhosted.org/packages/39/94/8ae30b806835bcd1cba799ba35347dee6961a11bd507db634516210e91d8/aiohttp-3.12.15-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c5092ce14361a73086b90c6efb3948ffa5be2f5b6fbcf52e8d8c8b8848bb97c", size = 1635733, upload-time = "2025-07-29T05:51:01.394Z" }, + { url = "https://files.pythonhosted.org/packages/7a/46/06cdef71dd03acd9da7f51ab3a9107318aee12ad38d273f654e4f981583a/aiohttp-3.12.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:aaa2234bb60c4dbf82893e934d8ee8dea30446f0647e024074237a56a08c01bd", size = 1696790, upload-time = "2025-07-29T05:51:03.657Z" }, + { url = "https://files.pythonhosted.org/packages/02/90/6b4cfaaf92ed98d0ec4d173e78b99b4b1a7551250be8937d9d67ecb356b4/aiohttp-3.12.15-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6d86a2fbdd14192e2f234a92d3b494dd4457e683ba07e5905a0b3ee25389ac9f", size = 1718245, upload-time = "2025-07-29T05:51:05.911Z" }, + { url = "https://files.pythonhosted.org/packages/2e/e6/2593751670fa06f080a846f37f112cbe6f873ba510d070136a6ed46117c6/aiohttp-3.12.15-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a041e7e2612041a6ddf1c6a33b883be6a421247c7afd47e885969ee4cc58bd8d", size = 1658899, upload-time = "2025-07-29T05:51:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/8f/28/c15bacbdb8b8eb5bf39b10680d129ea7410b859e379b03190f02fa104ffd/aiohttp-3.12.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5015082477abeafad7203757ae44299a610e89ee82a1503e3d4184e6bafdd519", size = 1738459, upload-time = "2025-07-29T05:51:09.56Z" }, + { url = "https://files.pythonhosted.org/packages/00/de/c269cbc4faa01fb10f143b1670633a8ddd5b2e1ffd0548f7aa49cb5c70e2/aiohttp-3.12.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:56822ff5ddfd1b745534e658faba944012346184fbfe732e0d6134b744516eea", size = 1766434, upload-time = "2025-07-29T05:51:11.423Z" }, + { url = "https://files.pythonhosted.org/packages/52/b0/4ff3abd81aa7d929b27d2e1403722a65fc87b763e3a97b3a2a494bfc63bc/aiohttp-3.12.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b2acbbfff69019d9014508c4ba0401822e8bae5a5fdc3b6814285b71231b60f3", size = 1726045, upload-time = "2025-07-29T05:51:13.689Z" }, + { url = "https://files.pythonhosted.org/packages/71/16/949225a6a2dd6efcbd855fbd90cf476052e648fb011aa538e3b15b89a57a/aiohttp-3.12.15-cp312-cp312-win32.whl", hash = "sha256:d849b0901b50f2185874b9a232f38e26b9b3d4810095a7572eacea939132d4e1", size = 423591, upload-time = "2025-07-29T05:51:15.452Z" }, + { url = "https://files.pythonhosted.org/packages/2b/d8/fa65d2a349fe938b76d309db1a56a75c4fb8cc7b17a398b698488a939903/aiohttp-3.12.15-cp312-cp312-win_amd64.whl", hash = "sha256:b390ef5f62bb508a9d67cb3bba9b8356e23b3996da7062f1a57ce1a79d2b3d34", size = 450266, upload-time = "2025-07-29T05:51:17.239Z" }, + { url = "https://files.pythonhosted.org/packages/f2/33/918091abcf102e39d15aba2476ad9e7bd35ddb190dcdd43a854000d3da0d/aiohttp-3.12.15-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9f922ffd05034d439dde1c77a20461cf4a1b0831e6caa26151fe7aa8aaebc315", size = 696741, upload-time = "2025-07-29T05:51:19.021Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2a/7495a81e39a998e400f3ecdd44a62107254803d1681d9189be5c2e4530cd/aiohttp-3.12.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ee8a8ac39ce45f3e55663891d4b1d15598c157b4d494a4613e704c8b43112cd", size = 474407, upload-time = "2025-07-29T05:51:21.165Z" }, + { url = "https://files.pythonhosted.org/packages/49/fc/a9576ab4be2dcbd0f73ee8675d16c707cfc12d5ee80ccf4015ba543480c9/aiohttp-3.12.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3eae49032c29d356b94eee45a3f39fdf4b0814b397638c2f718e96cfadf4c4e4", size = 466703, upload-time = "2025-07-29T05:51:22.948Z" }, + { url = "https://files.pythonhosted.org/packages/09/2f/d4bcc8448cf536b2b54eed48f19682031ad182faa3a3fee54ebe5b156387/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97752ff12cc12f46a9b20327104448042fce5c33a624f88c18f66f9368091c7", size = 1705532, upload-time = "2025-07-29T05:51:25.211Z" }, + { url = "https://files.pythonhosted.org/packages/f1/f3/59406396083f8b489261e3c011aa8aee9df360a96ac8fa5c2e7e1b8f0466/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:894261472691d6fe76ebb7fcf2e5870a2ac284c7406ddc95823c8598a1390f0d", size = 1686794, upload-time = "2025-07-29T05:51:27.145Z" }, + { url = "https://files.pythonhosted.org/packages/dc/71/164d194993a8d114ee5656c3b7ae9c12ceee7040d076bf7b32fb98a8c5c6/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5fa5d9eb82ce98959fc1031c28198b431b4d9396894f385cb63f1e2f3f20ca6b", size = 1738865, upload-time = "2025-07-29T05:51:29.366Z" }, + { url = "https://files.pythonhosted.org/packages/1c/00/d198461b699188a93ead39cb458554d9f0f69879b95078dce416d3209b54/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0fa751efb11a541f57db59c1dd821bec09031e01452b2b6217319b3a1f34f3d", size = 1788238, upload-time = "2025-07-29T05:51:31.285Z" }, + { url = "https://files.pythonhosted.org/packages/85/b8/9e7175e1fa0ac8e56baa83bf3c214823ce250d0028955dfb23f43d5e61fd/aiohttp-3.12.15-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5346b93e62ab51ee2a9d68e8f73c7cf96ffb73568a23e683f931e52450e4148d", size = 1710566, upload-time = "2025-07-29T05:51:33.219Z" }, + { url = "https://files.pythonhosted.org/packages/59/e4/16a8eac9df39b48ae102ec030fa9f726d3570732e46ba0c592aeeb507b93/aiohttp-3.12.15-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:049ec0360f939cd164ecbfd2873eaa432613d5e77d6b04535e3d1fbae5a9e645", size = 1624270, upload-time = "2025-07-29T05:51:35.195Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f8/cd84dee7b6ace0740908fd0af170f9fab50c2a41ccbc3806aabcb1050141/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b52dcf013b57464b6d1e51b627adfd69a8053e84b7103a7cd49c030f9ca44461", size = 1677294, upload-time = "2025-07-29T05:51:37.215Z" }, + { url = "https://files.pythonhosted.org/packages/ce/42/d0f1f85e50d401eccd12bf85c46ba84f947a84839c8a1c2c5f6e8ab1eb50/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:9b2af240143dd2765e0fb661fd0361a1b469cab235039ea57663cda087250ea9", size = 1708958, upload-time = "2025-07-29T05:51:39.328Z" }, + { url = "https://files.pythonhosted.org/packages/d5/6b/f6fa6c5790fb602538483aa5a1b86fcbad66244997e5230d88f9412ef24c/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ac77f709a2cde2cc71257ab2d8c74dd157c67a0558a0d2799d5d571b4c63d44d", size = 1651553, upload-time = "2025-07-29T05:51:41.356Z" }, + { url = "https://files.pythonhosted.org/packages/04/36/a6d36ad545fa12e61d11d1932eef273928b0495e6a576eb2af04297fdd3c/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:47f6b962246f0a774fbd3b6b7be25d59b06fdb2f164cf2513097998fc6a29693", size = 1727688, upload-time = "2025-07-29T05:51:43.452Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c8/f195e5e06608a97a4e52c5d41c7927301bf757a8e8bb5bbf8cef6c314961/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:760fb7db442f284996e39cf9915a94492e1896baac44f06ae551974907922b64", size = 1761157, upload-time = "2025-07-29T05:51:45.643Z" }, + { url = "https://files.pythonhosted.org/packages/05/6a/ea199e61b67f25ba688d3ce93f63b49b0a4e3b3d380f03971b4646412fc6/aiohttp-3.12.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad702e57dc385cae679c39d318def49aef754455f237499d5b99bea4ef582e51", size = 1710050, upload-time = "2025-07-29T05:51:48.203Z" }, + { url = "https://files.pythonhosted.org/packages/b4/2e/ffeb7f6256b33635c29dbed29a22a723ff2dd7401fff42ea60cf2060abfb/aiohttp-3.12.15-cp313-cp313-win32.whl", hash = "sha256:f813c3e9032331024de2eb2e32a88d86afb69291fbc37a3a3ae81cc9917fb3d0", size = 422647, upload-time = "2025-07-29T05:51:50.718Z" }, + { url = "https://files.pythonhosted.org/packages/1b/8e/78ee35774201f38d5e1ba079c9958f7629b1fd079459aea9467441dbfbf5/aiohttp-3.12.15-cp313-cp313-win_amd64.whl", hash = "sha256:1a649001580bdb37c6fdb1bebbd7e3bc688e8ec2b5c6f52edbb664662b17dc84", size = 449067, upload-time = "2025-07-29T05:51:52.549Z" }, ] [[package]] name = "aioitertools" version = "0.12.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/06/de/38491a84ab323b47c7f86e94d2830e748780525f7a10c8600b67ead7e9ea/aioitertools-0.12.0.tar.gz", hash = "sha256:c2a9055b4fbb7705f561b9d86053e8af5d10cc845d22c32008c43490b2d8dd6b", size = 19369 } +sdist = { url = "https://files.pythonhosted.org/packages/06/de/38491a84ab323b47c7f86e94d2830e748780525f7a10c8600b67ead7e9ea/aioitertools-0.12.0.tar.gz", hash = "sha256:c2a9055b4fbb7705f561b9d86053e8af5d10cc845d22c32008c43490b2d8dd6b", size = 19369, upload-time = "2024-09-02T03:33:40.349Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/85/13/58b70a580de00893223d61de8fea167877a3aed97d4a5e1405c9159ef925/aioitertools-0.12.0-py3-none-any.whl", hash = "sha256:fc1f5fac3d737354de8831cbba3eb04f79dd649d8f3afb4c5b114925e662a796", size = 24345 }, + { url = "https://files.pythonhosted.org/packages/85/13/58b70a580de00893223d61de8fea167877a3aed97d4a5e1405c9159ef925/aioitertools-0.12.0-py3-none-any.whl", hash = "sha256:fc1f5fac3d737354de8831cbba3eb04f79dd649d8f3afb4c5b114925e662a796", size = 24345, upload-time = "2024-09-02T03:34:59.454Z" }, ] [[package]] @@ -136,68 +148,68 @@ dependencies = [ { name = "frozenlist" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007 } +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490 }, + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, ] [[package]] name = "alabaster" version = "1.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210 } +sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload-time = "2024-07-26T18:15:03.762Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929 }, + { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } 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://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, ] [[package]] name = "anyio" -version = "4.9.0" +version = "4.10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "sniffio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/7d/4c1bd541d4dffa1b52bd83fb8527089e097a106fc90b467a7313b105f840/anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028", size = 190949 } +sdist = { url = "https://files.pythonhosted.org/packages/f1/b4/636b3b65173d3ce9a38ef5f0522789614e590dab6a8d505340a4efe4c567/anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6", size = 213252, upload-time = "2025-08-04T08:54:26.451Z" } 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://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] [[package]] name = "appnope" version = "0.1.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170 } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321 }, + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, ] [[package]] name = "asttokens" version = "3.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978 } +sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978, upload-time = "2024-11-30T04:30:14.439Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918 }, + { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918, upload-time = "2024-11-30T04:30:10.946Z" }, ] [[package]] name = "attrs" version = "25.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032 } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815 }, + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, ] [[package]] @@ -209,9 +221,9 @@ dependencies = [ { name = "six" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ce/89/f53968635b1b2e53e4aad2dd641488929fef4ca9dfb0b97927fa7697ddf3/azure_core-1.35.0.tar.gz", hash = "sha256:c0be528489485e9ede59b6971eb63c1eaacf83ef53001bfe3904e475e972be5c", size = 339689 } +sdist = { url = "https://files.pythonhosted.org/packages/ce/89/f53968635b1b2e53e4aad2dd641488929fef4ca9dfb0b97927fa7697ddf3/azure_core-1.35.0.tar.gz", hash = "sha256:c0be528489485e9ede59b6971eb63c1eaacf83ef53001bfe3904e475e972be5c", size = 339689, upload-time = "2025-07-03T00:55:23.496Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/78/bf94897361fdd650850f0f2e405b2293e2f12808239046232bdedf554301/azure_core-1.35.0-py3-none-any.whl", hash = "sha256:8db78c72868a58f3de8991eb4d22c4d368fae226dac1002998d6c50437e7dad1", size = 210708 }, + { url = "https://files.pythonhosted.org/packages/d4/78/bf94897361fdd650850f0f2e405b2293e2f12808239046232bdedf554301/azure_core-1.35.0-py3-none-any.whl", hash = "sha256:8db78c72868a58f3de8991eb4d22c4d368fae226dac1002998d6c50437e7dad1", size = 210708, upload-time = "2025-07-03T00:55:25.238Z" }, ] [[package]] @@ -223,9 +235,9 @@ dependencies = [ { name = "msal" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/22/ff/61369d06422b5ac48067215ff404841342651b14a89b46c8d8e1507c8f17/azure-datalake-store-0.0.53.tar.gz", hash = "sha256:05b6de62ee3f2a0a6e6941e6933b792b800c3e7f6ffce2fc324bc19875757393", size = 71430 } +sdist = { url = "https://files.pythonhosted.org/packages/22/ff/61369d06422b5ac48067215ff404841342651b14a89b46c8d8e1507c8f17/azure-datalake-store-0.0.53.tar.gz", hash = "sha256:05b6de62ee3f2a0a6e6941e6933b792b800c3e7f6ffce2fc324bc19875757393", size = 71430, upload-time = "2023-05-10T21:17:05.665Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/2a/75f56b14f115189155cf12e46b366ad1fe3357af5a1a7c09f7446662d617/azure_datalake_store-0.0.53-py2.py3-none-any.whl", hash = "sha256:a30c902a6e360aa47d7f69f086b426729784e71c536f330b691647a51dc42b2b", size = 55308 }, + { url = "https://files.pythonhosted.org/packages/88/2a/75f56b14f115189155cf12e46b366ad1fe3357af5a1a7c09f7446662d617/azure_datalake_store-0.0.53-py2.py3-none-any.whl", hash = "sha256:a30c902a6e360aa47d7f69f086b426729784e71c536f330b691647a51dc42b2b", size = 55308, upload-time = "2023-05-10T21:17:02.629Z" }, ] [[package]] @@ -239,9 +251,9 @@ dependencies = [ { name = "msal-extensions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b5/29/1201ffbb6a57a16524dd91f3e741b4c828a70aaba436578bdcb3fbcb438c/azure_identity-1.23.1.tar.gz", hash = "sha256:226c1ef982a9f8d5dcf6e0f9ed35eaef2a4d971e7dd86317e9b9d52e70a035e4", size = 266185 } +sdist = { url = "https://files.pythonhosted.org/packages/b5/29/1201ffbb6a57a16524dd91f3e741b4c828a70aaba436578bdcb3fbcb438c/azure_identity-1.23.1.tar.gz", hash = "sha256:226c1ef982a9f8d5dcf6e0f9ed35eaef2a4d971e7dd86317e9b9d52e70a035e4", size = 266185, upload-time = "2025-07-15T19:16:38.077Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/99/b3/e2d7ab810eb68575a5c7569b03c0228b8f4ce927ffa6211471b526f270c9/azure_identity-1.23.1-py3-none-any.whl", hash = "sha256:7eed28baa0097a47e3fb53bd35a63b769e6b085bb3cb616dfce2b67f28a004a1", size = 186810 }, + { url = "https://files.pythonhosted.org/packages/99/b3/e2d7ab810eb68575a5c7569b03c0228b8f4ce927ffa6211471b526f270c9/azure_identity-1.23.1-py3-none-any.whl", hash = "sha256:7eed28baa0097a47e3fb53bd35a63b769e6b085bb3cb616dfce2b67f28a004a1", size = 186810, upload-time = "2025-07-15T19:16:40.184Z" }, ] [[package]] @@ -254,18 +266,18 @@ dependencies = [ { name = "isodate" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/95/3e3414491ce45025a1cde107b6ae72bf72049e6021597c201cd6a3029b9a/azure_storage_blob-12.26.0.tar.gz", hash = "sha256:5dd7d7824224f7de00bfeb032753601c982655173061e242f13be6e26d78d71f", size = 583332 } +sdist = { url = "https://files.pythonhosted.org/packages/96/95/3e3414491ce45025a1cde107b6ae72bf72049e6021597c201cd6a3029b9a/azure_storage_blob-12.26.0.tar.gz", hash = "sha256:5dd7d7824224f7de00bfeb032753601c982655173061e242f13be6e26d78d71f", size = 583332, upload-time = "2025-07-16T21:34:07.644Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5b/64/63dbfdd83b31200ac58820a7951ddfdeed1fbee9285b0f3eae12d1357155/azure_storage_blob-12.26.0-py3-none-any.whl", hash = "sha256:8c5631b8b22b4f53ec5fff2f3bededf34cfef111e2af613ad42c9e6de00a77fe", size = 412907 }, + { url = "https://files.pythonhosted.org/packages/5b/64/63dbfdd83b31200ac58820a7951ddfdeed1fbee9285b0f3eae12d1357155/azure_storage_blob-12.26.0-py3-none-any.whl", hash = "sha256:8c5631b8b22b4f53ec5fff2f3bededf34cfef111e2af613ad42c9e6de00a77fe", size = 412907, upload-time = "2025-07-16T21:34:09.367Z" }, ] [[package]] name = "babel" version = "2.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852 } +sdist = { url = "https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d", size = 9951852, upload-time = "2025-02-01T15:17:41.026Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537 }, + { url = "https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2", size = 10182537, upload-time = "2025-02-01T15:17:37.39Z" }, ] [[package]] @@ -276,9 +288,9 @@ dependencies = [ { name = "soupsieve" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067 } +sdist = { url = "https://files.pythonhosted.org/packages/d8/e4/0c4c39e18fd76d6a628d4dd8da40543d136ce2d1752bd6eeeab0791f4d6b/beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195", size = 621067, upload-time = "2025-04-15T17:05:13.836Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285 }, + { url = "https://files.pythonhosted.org/packages/50/cd/30110dc0ffcf3b131156077b90e9f60ed75711223f306da4db08eff8403b/beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", size = 187285, upload-time = "2025-04-15T17:05:12.221Z" }, ] [[package]] @@ -297,41 +309,41 @@ dependencies = [ { name = "tornado", marker = "sys_platform != 'emscripten'" }, { name = "xyzservices" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/75/18/12d0d6024177ad18ba65deffc363046d0cbafe116f8b964a9efa85d2800f/bokeh-3.7.3.tar.gz", hash = "sha256:70a89a9f797b103d5ee6ad15fb7944adda115cf0da996ed0b75cfba61cb12f2b", size = 6366610 } +sdist = { url = "https://files.pythonhosted.org/packages/75/18/12d0d6024177ad18ba65deffc363046d0cbafe116f8b964a9efa85d2800f/bokeh-3.7.3.tar.gz", hash = "sha256:70a89a9f797b103d5ee6ad15fb7944adda115cf0da996ed0b75cfba61cb12f2b", size = 6366610, upload-time = "2025-05-12T12:13:29.318Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/91/48/08b2382e739236aa3360b7976360ba3e0c043b6234e25951c18c1eb6fa06/bokeh-3.7.3-py3-none-any.whl", hash = "sha256:b0e79dd737f088865212e4fdcb0f3b95d087f0f088bf8ca186a300ab1641e2c7", size = 7031447 }, + { url = "https://files.pythonhosted.org/packages/91/48/08b2382e739236aa3360b7976360ba3e0c043b6234e25951c18c1eb6fa06/bokeh-3.7.3-py3-none-any.whl", hash = "sha256:b0e79dd737f088865212e4fdcb0f3b95d087f0f088bf8ca186a300ab1641e2c7", size = 7031447, upload-time = "2025-05-12T12:13:27.47Z" }, ] [[package]] name = "botocore" -version = "1.38.27" +version = "1.39.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jmespath" }, { name = "python-dateutil" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/5e/67899214ad57f7f26af5bd776ac5eb583dc4ecf5c1e52e2cbfdc200e487a/botocore-1.38.27.tar.gz", hash = "sha256:9788f7efe974328a38cbade64cc0b1e67d27944b899f88cb786ae362973133b6", size = 13919963 } +sdist = { url = "https://files.pythonhosted.org/packages/32/57/16d3d21963975b9be180e96695abfb146695ae7db57f9a2d47e92d33ce9d/botocore-1.39.8.tar.gz", hash = "sha256:3848bd9057ea8dbc059e7764eda63bda575727ad1101dbd03636ab4a6f283fa5", size = 14205898, upload-time = "2025-07-17T19:19:03.832Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/83/a753562020b69fa90cebc39e8af2c753b24dcdc74bee8355ee3f6cefdf34/botocore-1.38.27-py3-none-any.whl", hash = "sha256:a785d5e9a5eda88ad6ab9ed8b87d1f2ac409d0226bba6ff801c55359e94d91a8", size = 13580545 }, + { url = "https://files.pythonhosted.org/packages/11/ac/51462dd35fc60d11cdce93ba82ccf1635a161ceadc646d89f67d666fff31/botocore-1.39.8-py3-none-any.whl", hash = "sha256:ab43f79c6893271934faba7ae1987a313d59576361c544c70a5391ade560891d", size = 13866818, upload-time = "2025-07-17T19:18:58.521Z" }, ] [[package]] name = "cachetools" version = "5.5.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380 } +sdist = { url = "https://files.pythonhosted.org/packages/6c/81/3747dad6b14fa2cf53fcf10548cf5aea6913e96fab41a3c198676f8948a5/cachetools-5.5.2.tar.gz", hash = "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", size = 28380, upload-time = "2025-02-20T21:01:19.524Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080 }, + { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080, upload-time = "2025-02-20T21:01:16.647Z" }, ] [[package]] name = "certifi" -version = "2025.7.14" +version = "2025.8.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b3/76/52c535bcebe74590f296d6c77c86dabf761c41980e1347a2422e4aa2ae41/certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995", size = 163981 } +sdist = { url = "https://files.pythonhosted.org/packages/dc/67/960ebe6bf230a96cda2e0abcf73af550ec4f090005363542f0765df162e0/certifi-2025.8.3.tar.gz", hash = "sha256:e564105f78ded564e3ae7c923924435e1daa7463faeab5bb932bc53ffae63407", size = 162386, upload-time = "2025-08-03T03:07:47.08Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/52/34c6cf5bb9285074dc3531c437b3919e825d976fde097a7a73f79e726d03/certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2", size = 162722 }, + { url = "https://files.pythonhosted.org/packages/e5/48/1549795ba7742c948d2ad169c1c8cdbae65bc450d6cd753d124b17c8cd32/certifi-2025.8.3-py3-none-any.whl", hash = "sha256:f6c12493cfb1b06ba2ff328595af9350c65d6644968e5d3a2ffd78699af217a5", size = 161216, upload-time = "2025-08-03T03:07:45.777Z" }, ] [[package]] @@ -341,99 +353,99 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pycparser" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264 }, - { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651 }, - { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259 }, - { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200 }, - { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235 }, - { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721 }, - { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242 }, - { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999 }, - { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242 }, - { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604 }, - { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727 }, - { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400 }, - { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178 }, - { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840 }, - { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803 }, - { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850 }, - { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729 }, - { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256 }, - { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424 }, - { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568 }, - { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736 }, - { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448 }, - { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976 }, - { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989 }, - { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802 }, - { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792 }, - { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893 }, - { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810 }, - { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200 }, - { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447 }, - { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358 }, - { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469 }, - { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475 }, - { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009 }, +sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621, upload-time = "2024-09-04T20:45:21.852Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/f4/927e3a8899e52a27fa57a48607ff7dc91a9ebe97399b357b85a0c7892e00/cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", size = 182264, upload-time = "2024-09-04T20:43:51.124Z" }, + { url = "https://files.pythonhosted.org/packages/6c/f5/6c3a8efe5f503175aaddcbea6ad0d2c96dad6f5abb205750d1b3df44ef29/cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", size = 178651, upload-time = "2024-09-04T20:43:52.872Z" }, + { url = "https://files.pythonhosted.org/packages/94/dd/a3f0118e688d1b1a57553da23b16bdade96d2f9bcda4d32e7d2838047ff7/cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", size = 445259, upload-time = "2024-09-04T20:43:56.123Z" }, + { url = "https://files.pythonhosted.org/packages/2e/ea/70ce63780f096e16ce8588efe039d3c4f91deb1dc01e9c73a287939c79a6/cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", size = 469200, upload-time = "2024-09-04T20:43:57.891Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a0/a4fa9f4f781bda074c3ddd57a572b060fa0df7655d2a4247bbe277200146/cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", size = 477235, upload-time = "2024-09-04T20:44:00.18Z" }, + { url = "https://files.pythonhosted.org/packages/62/12/ce8710b5b8affbcdd5c6e367217c242524ad17a02fe5beec3ee339f69f85/cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", size = 459721, upload-time = "2024-09-04T20:44:01.585Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6b/d45873c5e0242196f042d555526f92aa9e0c32355a1be1ff8c27f077fd37/cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", size = 467242, upload-time = "2024-09-04T20:44:03.467Z" }, + { url = "https://files.pythonhosted.org/packages/1a/52/d9a0e523a572fbccf2955f5abe883cfa8bcc570d7faeee06336fbd50c9fc/cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", size = 477999, upload-time = "2024-09-04T20:44:05.023Z" }, + { url = "https://files.pythonhosted.org/packages/44/74/f2a2460684a1a2d00ca799ad880d54652841a780c4c97b87754f660c7603/cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", size = 454242, upload-time = "2024-09-04T20:44:06.444Z" }, + { url = "https://files.pythonhosted.org/packages/f8/4a/34599cac7dfcd888ff54e801afe06a19c17787dfd94495ab0c8d35fe99fb/cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b", size = 478604, upload-time = "2024-09-04T20:44:08.206Z" }, + { url = "https://files.pythonhosted.org/packages/34/33/e1b8a1ba29025adbdcda5fb3a36f94c03d771c1b7b12f726ff7fef2ebe36/cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", size = 171727, upload-time = "2024-09-04T20:44:09.481Z" }, + { url = "https://files.pythonhosted.org/packages/3d/97/50228be003bb2802627d28ec0627837ac0bf35c90cf769812056f235b2d1/cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", size = 181400, upload-time = "2024-09-04T20:44:10.873Z" }, + { url = "https://files.pythonhosted.org/packages/5a/84/e94227139ee5fb4d600a7a4927f322e1d4aea6fdc50bd3fca8493caba23f/cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", size = 183178, upload-time = "2024-09-04T20:44:12.232Z" }, + { url = "https://files.pythonhosted.org/packages/da/ee/fb72c2b48656111c4ef27f0f91da355e130a923473bf5ee75c5643d00cca/cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", size = 178840, upload-time = "2024-09-04T20:44:13.739Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b6/db007700f67d151abadf508cbfd6a1884f57eab90b1bb985c4c8c02b0f28/cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", size = 454803, upload-time = "2024-09-04T20:44:15.231Z" }, + { url = "https://files.pythonhosted.org/packages/1a/df/f8d151540d8c200eb1c6fba8cd0dfd40904f1b0682ea705c36e6c2e97ab3/cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", size = 478850, upload-time = "2024-09-04T20:44:17.188Z" }, + { url = "https://files.pythonhosted.org/packages/28/c0/b31116332a547fd2677ae5b78a2ef662dfc8023d67f41b2a83f7c2aa78b1/cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", size = 485729, upload-time = "2024-09-04T20:44:18.688Z" }, + { url = "https://files.pythonhosted.org/packages/91/2b/9a1ddfa5c7f13cab007a2c9cc295b70fbbda7cb10a286aa6810338e60ea1/cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", size = 471256, upload-time = "2024-09-04T20:44:20.248Z" }, + { url = "https://files.pythonhosted.org/packages/b2/d5/da47df7004cb17e4955df6a43d14b3b4ae77737dff8bf7f8f333196717bf/cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", size = 479424, upload-time = "2024-09-04T20:44:21.673Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ac/2a28bcf513e93a219c8a4e8e125534f4f6db03e3179ba1c45e949b76212c/cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", size = 484568, upload-time = "2024-09-04T20:44:23.245Z" }, + { url = "https://files.pythonhosted.org/packages/d4/38/ca8a4f639065f14ae0f1d9751e70447a261f1a30fa7547a828ae08142465/cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", size = 488736, upload-time = "2024-09-04T20:44:24.757Z" }, + { url = "https://files.pythonhosted.org/packages/86/c5/28b2d6f799ec0bdecf44dced2ec5ed43e0eb63097b0f58c293583b406582/cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", size = 172448, upload-time = "2024-09-04T20:44:26.208Z" }, + { url = "https://files.pythonhosted.org/packages/50/b9/db34c4755a7bd1cb2d1603ac3863f22bcecbd1ba29e5ee841a4bc510b294/cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", size = 181976, upload-time = "2024-09-04T20:44:27.578Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f8/dd6c246b148639254dad4d6803eb6a54e8c85c6e11ec9df2cffa87571dbe/cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", size = 182989, upload-time = "2024-09-04T20:44:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f1/672d303ddf17c24fc83afd712316fda78dc6fce1cd53011b839483e1ecc8/cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", size = 178802, upload-time = "2024-09-04T20:44:30.289Z" }, + { url = "https://files.pythonhosted.org/packages/0e/2d/eab2e858a91fdff70533cab61dcff4a1f55ec60425832ddfdc9cd36bc8af/cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", size = 454792, upload-time = "2024-09-04T20:44:32.01Z" }, + { url = "https://files.pythonhosted.org/packages/75/b2/fbaec7c4455c604e29388d55599b99ebcc250a60050610fadde58932b7ee/cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", size = 478893, upload-time = "2024-09-04T20:44:33.606Z" }, + { url = "https://files.pythonhosted.org/packages/4f/b7/6e4a2162178bf1935c336d4da8a9352cccab4d3a5d7914065490f08c0690/cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", size = 485810, upload-time = "2024-09-04T20:44:35.191Z" }, + { url = "https://files.pythonhosted.org/packages/c7/8a/1d0e4a9c26e54746dc08c2c6c037889124d4f59dffd853a659fa545f1b40/cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", size = 471200, upload-time = "2024-09-04T20:44:36.743Z" }, + { url = "https://files.pythonhosted.org/packages/26/9f/1aab65a6c0db35f43c4d1b4f580e8df53914310afc10ae0397d29d697af4/cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", size = 479447, upload-time = "2024-09-04T20:44:38.492Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e4/fb8b3dd8dc0e98edf1135ff067ae070bb32ef9d509d6cb0f538cd6f7483f/cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", size = 484358, upload-time = "2024-09-04T20:44:40.046Z" }, + { url = "https://files.pythonhosted.org/packages/f1/47/d7145bf2dc04684935d57d67dff9d6d795b2ba2796806bb109864be3a151/cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", size = 488469, upload-time = "2024-09-04T20:44:41.616Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ee/f94057fa6426481d663b88637a9a10e859e492c73d0384514a17d78ee205/cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", size = 172475, upload-time = "2024-09-04T20:44:43.733Z" }, + { url = "https://files.pythonhosted.org/packages/7c/fc/6a8cb64e5f0324877d503c854da15d76c1e50eb722e320b15345c4d0c6de/cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", size = 182009, upload-time = "2024-09-04T20:44:45.309Z" }, ] [[package]] name = "cfgv" version = "3.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114 } +sdist = { url = "https://files.pythonhosted.org/packages/11/74/539e56497d9bd1d484fd863dd69cbbfa653cd2aa27abfe35653494d85e94/cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560", size = 7114, upload-time = "2023-08-12T20:38:17.776Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249 }, + { url = "https://files.pythonhosted.org/packages/c5/55/51844dd50c4fc7a33b653bfaba4c2456f06955289ca770a5dbd5fd267374/cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", size = 7249, upload-time = "2023-08-12T20:38:16.269Z" }, ] [[package]] name = "charset-normalizer" version = "3.4.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794 }, - { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846 }, - { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350 }, - { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657 }, - { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260 }, - { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164 }, - { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571 }, - { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952 }, - { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959 }, - { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030 }, - { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015 }, - { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106 }, - { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402 }, - { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936 }, - { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790 }, - { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924 }, - { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626 }, - { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567 }, - { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957 }, - { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408 }, - { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399 }, - { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815 }, - { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537 }, - { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565 }, - { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357 }, - { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776 }, - { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622 }, - { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435 }, - { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653 }, - { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231 }, - { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243 }, - { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442 }, - { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147 }, - { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057 }, - { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454 }, - { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174 }, - { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166 }, - { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064 }, - { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641 }, - { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626 }, +sdist = { url = "https://files.pythonhosted.org/packages/e4/33/89c2ced2b67d1c2a61c19c6751aa8902d46ce3dacb23600a283619f5a12d/charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", size = 126367, upload-time = "2025-05-02T08:34:42.01Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/85/4c40d00dcc6284a1c1ad5de5e0996b06f39d8232f1031cd23c2f5c07ee86/charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", size = 198794, upload-time = "2025-05-02T08:32:11.945Z" }, + { url = "https://files.pythonhosted.org/packages/41/d9/7a6c0b9db952598e97e93cbdfcb91bacd89b9b88c7c983250a77c008703c/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", size = 142846, upload-time = "2025-05-02T08:32:13.946Z" }, + { url = "https://files.pythonhosted.org/packages/66/82/a37989cda2ace7e37f36c1a8ed16c58cf48965a79c2142713244bf945c89/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", size = 153350, upload-time = "2025-05-02T08:32:15.873Z" }, + { url = "https://files.pythonhosted.org/packages/df/68/a576b31b694d07b53807269d05ec3f6f1093e9545e8607121995ba7a8313/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", size = 145657, upload-time = "2025-05-02T08:32:17.283Z" }, + { url = "https://files.pythonhosted.org/packages/92/9b/ad67f03d74554bed3aefd56fe836e1623a50780f7c998d00ca128924a499/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f", size = 147260, upload-time = "2025-05-02T08:32:18.807Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e6/8aebae25e328160b20e31a7e9929b1578bbdc7f42e66f46595a432f8539e/charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", size = 149164, upload-time = "2025-05-02T08:32:20.333Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f2/b3c2f07dbcc248805f10e67a0262c93308cfa149a4cd3d1fe01f593e5fd2/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", size = 144571, upload-time = "2025-05-02T08:32:21.86Z" }, + { url = "https://files.pythonhosted.org/packages/60/5b/c3f3a94bc345bc211622ea59b4bed9ae63c00920e2e8f11824aa5708e8b7/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", size = 151952, upload-time = "2025-05-02T08:32:23.434Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4d/ff460c8b474122334c2fa394a3f99a04cf11c646da895f81402ae54f5c42/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", size = 155959, upload-time = "2025-05-02T08:32:24.993Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2b/b964c6a2fda88611a1fe3d4c400d39c66a42d6c169c924818c848f922415/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", size = 153030, upload-time = "2025-05-02T08:32:26.435Z" }, + { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload-time = "2025-05-02T08:32:28.376Z" }, + { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload-time = "2025-05-02T08:32:30.281Z" }, + { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload-time = "2025-05-02T08:32:32.191Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload-time = "2025-05-02T08:32:33.712Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload-time = "2025-05-02T08:32:35.768Z" }, + { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload-time = "2025-05-02T08:32:37.284Z" }, + { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload-time = "2025-05-02T08:32:38.803Z" }, + { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload-time = "2025-05-02T08:32:40.251Z" }, + { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload-time = "2025-05-02T08:32:41.705Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload-time = "2025-05-02T08:32:43.709Z" }, + { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload-time = "2025-05-02T08:32:46.197Z" }, + { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload-time = "2025-05-02T08:32:48.105Z" }, + { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload-time = "2025-05-02T08:32:49.719Z" }, + { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload-time = "2025-05-02T08:32:51.404Z" }, + { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload-time = "2025-05-02T08:32:53.079Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload-time = "2025-05-02T08:32:54.573Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/a93df3366ed32db1d907d7593a94f1fe6293903e3e92967bebd6950ed12c/charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", size = 199622, upload-time = "2025-05-02T08:32:56.363Z" }, + { url = "https://files.pythonhosted.org/packages/04/93/bf204e6f344c39d9937d3c13c8cd5bbfc266472e51fc8c07cb7f64fcd2de/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", size = 143435, upload-time = "2025-05-02T08:32:58.551Z" }, + { url = "https://files.pythonhosted.org/packages/22/2a/ea8a2095b0bafa6c5b5a55ffdc2f924455233ee7b91c69b7edfcc9e02284/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", size = 153653, upload-time = "2025-05-02T08:33:00.342Z" }, + { url = "https://files.pythonhosted.org/packages/b6/57/1b090ff183d13cef485dfbe272e2fe57622a76694061353c59da52c9a659/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", size = 146231, upload-time = "2025-05-02T08:33:02.081Z" }, + { url = "https://files.pythonhosted.org/packages/e2/28/ffc026b26f441fc67bd21ab7f03b313ab3fe46714a14b516f931abe1a2d8/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", size = 148243, upload-time = "2025-05-02T08:33:04.063Z" }, + { url = "https://files.pythonhosted.org/packages/c0/0f/9abe9bd191629c33e69e47c6ef45ef99773320e9ad8e9cb08b8ab4a8d4cb/charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", size = 150442, upload-time = "2025-05-02T08:33:06.418Z" }, + { url = "https://files.pythonhosted.org/packages/67/7c/a123bbcedca91d5916c056407f89a7f5e8fdfce12ba825d7d6b9954a1a3c/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", size = 145147, upload-time = "2025-05-02T08:33:08.183Z" }, + { url = "https://files.pythonhosted.org/packages/ec/fe/1ac556fa4899d967b83e9893788e86b6af4d83e4726511eaaad035e36595/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", size = 153057, upload-time = "2025-05-02T08:33:09.986Z" }, + { url = "https://files.pythonhosted.org/packages/2b/ff/acfc0b0a70b19e3e54febdd5301a98b72fa07635e56f24f60502e954c461/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", size = 156454, upload-time = "2025-05-02T08:33:11.814Z" }, + { url = "https://files.pythonhosted.org/packages/92/08/95b458ce9c740d0645feb0e96cea1f5ec946ea9c580a94adfe0b617f3573/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", size = 154174, upload-time = "2025-05-02T08:33:13.707Z" }, + { url = "https://files.pythonhosted.org/packages/78/be/8392efc43487ac051eee6c36d5fbd63032d78f7728cb37aebcc98191f1ff/charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", size = 149166, upload-time = "2025-05-02T08:33:15.458Z" }, + { url = "https://files.pythonhosted.org/packages/44/96/392abd49b094d30b91d9fbda6a69519e95802250b777841cf3bda8fe136c/charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", size = 98064, upload-time = "2025-05-02T08:33:17.06Z" }, + { url = "https://files.pythonhosted.org/packages/e9/b0/0200da600134e001d91851ddc797809e2fe0ea72de90e09bec5a2fbdaccb/charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", size = 105641, upload-time = "2025-05-02T08:33:18.753Z" }, + { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" }, ] [[package]] @@ -443,9 +455,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342 } +sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215 }, + { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, ] [[package]] @@ -457,147 +469,149 @@ dependencies = [ { name = "deprecated" }, { name = "validators" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0c/49/57e60d9e1b78fd21fbaeda0725ac311595c35d8682dace6b71b274a43b90/click_params-0.5.0.tar.gz", hash = "sha256:5fe97b9459781a3b43b84fe4ec0065193e1b0d5cf6dc77897fe20c31f478d7ff", size = 11097 } +sdist = { url = "https://files.pythonhosted.org/packages/0c/49/57e60d9e1b78fd21fbaeda0725ac311595c35d8682dace6b71b274a43b90/click_params-0.5.0.tar.gz", hash = "sha256:5fe97b9459781a3b43b84fe4ec0065193e1b0d5cf6dc77897fe20c31f478d7ff", size = 11097, upload-time = "2023-11-23T11:54:31.315Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/c7/a04832e84f1c613194231a657612aee2e377d63a44a5847386c83c38bbd6/click_params-0.5.0-py3-none-any.whl", hash = "sha256:bbb2efe44197ab896bffcb50f42f22240fb077e6756b568fbdab3e1700b859d6", size = 13152 }, + { url = "https://files.pythonhosted.org/packages/ca/c7/a04832e84f1c613194231a657612aee2e377d63a44a5847386c83c38bbd6/click_params-0.5.0-py3-none-any.whl", hash = "sha256:bbb2efe44197ab896bffcb50f42f22240fb077e6756b568fbdab3e1700b859d6", size = 13152, upload-time = "2023-11-23T11:54:29.599Z" }, ] [[package]] name = "cloudpickle" version = "3.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/39/069100b84d7418bc358d81669d5748efb14b9cceacd2f9c75f550424132f/cloudpickle-3.1.1.tar.gz", hash = "sha256:b216fa8ae4019d5482a8ac3c95d8f6346115d8835911fd4aefd1a445e4242c64", size = 22113 } +sdist = { url = "https://files.pythonhosted.org/packages/52/39/069100b84d7418bc358d81669d5748efb14b9cceacd2f9c75f550424132f/cloudpickle-3.1.1.tar.gz", hash = "sha256:b216fa8ae4019d5482a8ac3c95d8f6346115d8835911fd4aefd1a445e4242c64", size = 22113, upload-time = "2025-01-14T17:02:05.085Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/e8/64c37fadfc2816a7701fa8a6ed8d87327c7d54eacfbfb6edab14a2f2be75/cloudpickle-3.1.1-py3-none-any.whl", hash = "sha256:c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e", size = 20992 }, + { url = "https://files.pythonhosted.org/packages/7e/e8/64c37fadfc2816a7701fa8a6ed8d87327c7d54eacfbfb6edab14a2f2be75/cloudpickle-3.1.1-py3-none-any.whl", hash = "sha256:c8c5a44295039331ee9dad40ba100a9c7297b6f988e50e87ccdf3765a668350e", size = 20992, upload-time = "2025-01-14T17:02:02.417Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } 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://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] [[package]] name = "comm" -version = "0.2.2" +version = "0.2.3" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/e9/a8/fb783cb0abe2b5fded9f55e5703015cdf1c9c85b3669087c538dd15a6a86/comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", size = 6210 } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/75/49e5bfe642f71f272236b5b2d2691cf915a7283cc0ceda56357b61daa538/comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3", size = 7180 }, + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, ] [[package]] name = "contourpy" -version = "1.3.2" +version = "1.3.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636 }, - { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636 }, - { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053 }, - { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985 }, - { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750 }, - { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246 }, - { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728 }, - { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762 }, - { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196 }, - { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017 }, - { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580 }, - { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530 }, - { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688 }, - { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331 }, - { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963 }, - { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681 }, - { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674 }, - { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480 }, - { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489 }, - { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042 }, - { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630 }, - { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670 }, - { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694 }, - { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986 }, - { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060 }, - { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747 }, - { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895 }, - { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098 }, - { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535 }, - { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096 }, - { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090 }, - { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643 }, - { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443 }, - { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865 }, - { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162 }, - { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355 }, - { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935 }, - { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168 }, - { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550 }, - { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214 }, - { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807 }, - { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729 }, - { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791 }, +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", size = 288773, upload-time = "2025-07-26T12:01:02.277Z" }, + { url = "https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", size = 270149, upload-time = "2025-07-26T12:01:04.072Z" }, + { url = "https://files.pythonhosted.org/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", size = 329222, upload-time = "2025-07-26T12:01:05.688Z" }, + { url = "https://files.pythonhosted.org/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", size = 377234, upload-time = "2025-07-26T12:01:07.054Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", size = 380555, upload-time = "2025-07-26T12:01:08.801Z" }, + { url = "https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", size = 355238, upload-time = "2025-07-26T12:01:10.319Z" }, + { url = "https://files.pythonhosted.org/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", size = 1326218, upload-time = "2025-07-26T12:01:12.659Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", size = 1392867, upload-time = "2025-07-26T12:01:15.533Z" }, + { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677, upload-time = "2025-07-26T12:01:17.088Z" }, + { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234, upload-time = "2025-07-26T12:01:18.256Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123, upload-time = "2025-07-26T12:01:19.848Z" }, + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, + { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, + { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, + { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, + { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, + { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, + { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, + { url = "https://files.pythonhosted.org/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", size = 278809, upload-time = "2025-07-26T12:02:52.74Z" }, + { url = "https://files.pythonhosted.org/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", size = 261593, upload-time = "2025-07-26T12:02:54.037Z" }, + { url = "https://files.pythonhosted.org/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", size = 302202, upload-time = "2025-07-26T12:02:55.947Z" }, + { url = "https://files.pythonhosted.org/packages/3c/37/21972a15834d90bfbfb009b9d004779bd5a07a0ec0234e5ba8f64d5736f4/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", size = 329207, upload-time = "2025-07-26T12:02:57.468Z" }, + { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315, upload-time = "2025-07-26T12:02:58.801Z" }, ] [[package]] name = "coverage" -version = "7.9.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/04/b7/c0465ca253df10a9e8dae0692a4ae6e9726d245390aaef92360e1d6d3832/coverage-7.9.2.tar.gz", hash = "sha256:997024fa51e3290264ffd7492ec97d0690293ccd2b45a6cd7d82d945a4a80c8b", size = 813556 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/39/40/916786453bcfafa4c788abee4ccd6f592b5b5eca0cd61a32a4e5a7ef6e02/coverage-7.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a7a56a2964a9687b6aba5b5ced6971af308ef6f79a91043c05dd4ee3ebc3e9ba", size = 212152 }, - { url = "https://files.pythonhosted.org/packages/9f/66/cc13bae303284b546a030762957322bbbff1ee6b6cb8dc70a40f8a78512f/coverage-7.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123d589f32c11d9be7fe2e66d823a236fe759b0096f5db3fb1b75b2fa414a4fa", size = 212540 }, - { url = "https://files.pythonhosted.org/packages/0f/3c/d56a764b2e5a3d43257c36af4a62c379df44636817bb5f89265de4bf8bd7/coverage-7.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:333b2e0ca576a7dbd66e85ab402e35c03b0b22f525eed82681c4b866e2e2653a", size = 245097 }, - { url = "https://files.pythonhosted.org/packages/b1/46/bd064ea8b3c94eb4ca5d90e34d15b806cba091ffb2b8e89a0d7066c45791/coverage-7.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:326802760da234baf9f2f85a39e4a4b5861b94f6c8d95251f699e4f73b1835dc", size = 242812 }, - { url = "https://files.pythonhosted.org/packages/43/02/d91992c2b29bc7afb729463bc918ebe5f361be7f1daae93375a5759d1e28/coverage-7.9.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19e7be4cfec248df38ce40968c95d3952fbffd57b400d4b9bb580f28179556d2", size = 244617 }, - { url = "https://files.pythonhosted.org/packages/b7/4f/8fadff6bf56595a16d2d6e33415841b0163ac660873ed9a4e9046194f779/coverage-7.9.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0b4a4cb73b9f2b891c1788711408ef9707666501ba23684387277ededab1097c", size = 244263 }, - { url = "https://files.pythonhosted.org/packages/9b/d2/e0be7446a2bba11739edb9f9ba4eff30b30d8257370e237418eb44a14d11/coverage-7.9.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2c8937fa16c8c9fbbd9f118588756e7bcdc7e16a470766a9aef912dd3f117dbd", size = 242314 }, - { url = "https://files.pythonhosted.org/packages/9d/7d/dcbac9345000121b8b57a3094c2dfcf1ccc52d8a14a40c1d4bc89f936f80/coverage-7.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:42da2280c4d30c57a9b578bafd1d4494fa6c056d4c419d9689e66d775539be74", size = 242904 }, - { url = "https://files.pythonhosted.org/packages/41/58/11e8db0a0c0510cf31bbbdc8caf5d74a358b696302a45948d7c768dfd1cf/coverage-7.9.2-cp311-cp311-win32.whl", hash = "sha256:14fa8d3da147f5fdf9d298cacc18791818f3f1a9f542c8958b80c228320e90c6", size = 214553 }, - { url = "https://files.pythonhosted.org/packages/3a/7d/751794ec8907a15e257136e48dc1021b1f671220ecccfd6c4eaf30802714/coverage-7.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:549cab4892fc82004f9739963163fd3aac7a7b0df430669b75b86d293d2df2a7", size = 215441 }, - { url = "https://files.pythonhosted.org/packages/62/5b/34abcedf7b946c1c9e15b44f326cb5b0da852885312b30e916f674913428/coverage-7.9.2-cp311-cp311-win_arm64.whl", hash = "sha256:c2667a2b913e307f06aa4e5677f01a9746cd08e4b35e14ebcde6420a9ebb4c62", size = 213873 }, - { url = "https://files.pythonhosted.org/packages/53/d7/7deefc6fd4f0f1d4c58051f4004e366afc9e7ab60217ac393f247a1de70a/coverage-7.9.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ae9eb07f1cfacd9cfe8eaee6f4ff4b8a289a668c39c165cd0c8548484920ffc0", size = 212344 }, - { url = "https://files.pythonhosted.org/packages/95/0c/ee03c95d32be4d519e6a02e601267769ce2e9a91fc8faa1b540e3626c680/coverage-7.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9ce85551f9a1119f02adc46d3014b5ee3f765deac166acf20dbb851ceb79b6f3", size = 212580 }, - { url = "https://files.pythonhosted.org/packages/8b/9f/826fa4b544b27620086211b87a52ca67592622e1f3af9e0a62c87aea153a/coverage-7.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8f6389ac977c5fb322e0e38885fbbf901743f79d47f50db706e7644dcdcb6e1", size = 246383 }, - { url = "https://files.pythonhosted.org/packages/7f/b3/4477aafe2a546427b58b9c540665feff874f4db651f4d3cb21b308b3a6d2/coverage-7.9.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff0d9eae8cdfcd58fe7893b88993723583a6ce4dfbfd9f29e001922544f95615", size = 243400 }, - { url = "https://files.pythonhosted.org/packages/f8/c2/efffa43778490c226d9d434827702f2dfbc8041d79101a795f11cbb2cf1e/coverage-7.9.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fae939811e14e53ed8a9818dad51d434a41ee09df9305663735f2e2d2d7d959b", size = 245591 }, - { url = "https://files.pythonhosted.org/packages/c6/e7/a59888e882c9a5f0192d8627a30ae57910d5d449c80229b55e7643c078c4/coverage-7.9.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:31991156251ec202c798501e0a42bbdf2169dcb0f137b1f5c0f4267f3fc68ef9", size = 245402 }, - { url = "https://files.pythonhosted.org/packages/92/a5/72fcd653ae3d214927edc100ce67440ed8a0a1e3576b8d5e6d066ed239db/coverage-7.9.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d0d67963f9cbfc7c7f96d4ac74ed60ecbebd2ea6eeb51887af0f8dce205e545f", size = 243583 }, - { url = "https://files.pythonhosted.org/packages/5c/f5/84e70e4df28f4a131d580d7d510aa1ffd95037293da66fd20d446090a13b/coverage-7.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:49b752a2858b10580969ec6af6f090a9a440a64a301ac1528d7ca5f7ed497f4d", size = 244815 }, - { url = "https://files.pythonhosted.org/packages/39/e7/d73d7cbdbd09fdcf4642655ae843ad403d9cbda55d725721965f3580a314/coverage-7.9.2-cp312-cp312-win32.whl", hash = "sha256:88d7598b8ee130f32f8a43198ee02edd16d7f77692fa056cb779616bbea1b355", size = 214719 }, - { url = "https://files.pythonhosted.org/packages/9f/d6/7486dcc3474e2e6ad26a2af2db7e7c162ccd889c4c68fa14ea8ec189c9e9/coverage-7.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:9dfb070f830739ee49d7c83e4941cc767e503e4394fdecb3b54bfdac1d7662c0", size = 215509 }, - { url = "https://files.pythonhosted.org/packages/b7/34/0439f1ae2593b0346164d907cdf96a529b40b7721a45fdcf8b03c95fcd90/coverage-7.9.2-cp312-cp312-win_arm64.whl", hash = "sha256:4e2c058aef613e79df00e86b6d42a641c877211384ce5bd07585ed7ba71ab31b", size = 213910 }, - { url = "https://files.pythonhosted.org/packages/94/9d/7a8edf7acbcaa5e5c489a646226bed9591ee1c5e6a84733c0140e9ce1ae1/coverage-7.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:985abe7f242e0d7bba228ab01070fde1d6c8fa12f142e43debe9ed1dde686038", size = 212367 }, - { url = "https://files.pythonhosted.org/packages/e8/9e/5cd6f130150712301f7e40fb5865c1bc27b97689ec57297e568d972eec3c/coverage-7.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82c3939264a76d44fde7f213924021ed31f55ef28111a19649fec90c0f109e6d", size = 212632 }, - { url = "https://files.pythonhosted.org/packages/a8/de/6287a2c2036f9fd991c61cefa8c64e57390e30c894ad3aa52fac4c1e14a8/coverage-7.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae5d563e970dbe04382f736ec214ef48103d1b875967c89d83c6e3f21706d5b3", size = 245793 }, - { url = "https://files.pythonhosted.org/packages/06/cc/9b5a9961d8160e3cb0b558c71f8051fe08aa2dd4b502ee937225da564ed1/coverage-7.9.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdd612e59baed2a93c8843c9a7cb902260f181370f1d772f4842987535071d14", size = 243006 }, - { url = "https://files.pythonhosted.org/packages/49/d9/4616b787d9f597d6443f5588619c1c9f659e1f5fc9eebf63699eb6d34b78/coverage-7.9.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:256ea87cb2a1ed992bcdfc349d8042dcea1b80436f4ddf6e246d6bee4b5d73b6", size = 244990 }, - { url = "https://files.pythonhosted.org/packages/48/83/801cdc10f137b2d02b005a761661649ffa60eb173dcdaeb77f571e4dc192/coverage-7.9.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f44ae036b63c8ea432f610534a2668b0c3aee810e7037ab9d8ff6883de480f5b", size = 245157 }, - { url = "https://files.pythonhosted.org/packages/c8/a4/41911ed7e9d3ceb0ffb019e7635468df7499f5cc3edca5f7dfc078e9c5ec/coverage-7.9.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:82d76ad87c932935417a19b10cfe7abb15fd3f923cfe47dbdaa74ef4e503752d", size = 243128 }, - { url = "https://files.pythonhosted.org/packages/10/41/344543b71d31ac9cb00a664d5d0c9ef134a0fe87cb7d8430003b20fa0b7d/coverage-7.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:619317bb86de4193debc712b9e59d5cffd91dc1d178627ab2a77b9870deb2868", size = 244511 }, - { url = "https://files.pythonhosted.org/packages/d5/81/3b68c77e4812105e2a060f6946ba9e6f898ddcdc0d2bfc8b4b152a9ae522/coverage-7.9.2-cp313-cp313-win32.whl", hash = "sha256:0a07757de9feb1dfafd16ab651e0f628fd7ce551604d1bf23e47e1ddca93f08a", size = 214765 }, - { url = "https://files.pythonhosted.org/packages/06/a2/7fac400f6a346bb1a4004eb2a76fbff0e242cd48926a2ce37a22a6a1d917/coverage-7.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:115db3d1f4d3f35f5bb021e270edd85011934ff97c8797216b62f461dd69374b", size = 215536 }, - { url = "https://files.pythonhosted.org/packages/08/47/2c6c215452b4f90d87017e61ea0fd9e0486bb734cb515e3de56e2c32075f/coverage-7.9.2-cp313-cp313-win_arm64.whl", hash = "sha256:48f82f889c80af8b2a7bb6e158d95a3fbec6a3453a1004d04e4f3b5945a02694", size = 213943 }, - { url = "https://files.pythonhosted.org/packages/a3/46/e211e942b22d6af5e0f323faa8a9bc7c447a1cf1923b64c47523f36ed488/coverage-7.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:55a28954545f9d2f96870b40f6c3386a59ba8ed50caf2d949676dac3ecab99f5", size = 213088 }, - { url = "https://files.pythonhosted.org/packages/d2/2f/762551f97e124442eccd907bf8b0de54348635b8866a73567eb4e6417acf/coverage-7.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cdef6504637731a63c133bb2e6f0f0214e2748495ec15fe42d1e219d1b133f0b", size = 213298 }, - { url = "https://files.pythonhosted.org/packages/7a/b7/76d2d132b7baf7360ed69be0bcab968f151fa31abe6d067f0384439d9edb/coverage-7.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd5ebe66c7a97273d5d2ddd4ad0ed2e706b39630ed4b53e713d360626c3dbb3", size = 256541 }, - { url = "https://files.pythonhosted.org/packages/a0/17/392b219837d7ad47d8e5974ce5f8dc3deb9f99a53b3bd4d123602f960c81/coverage-7.9.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9303aed20872d7a3c9cb39c5d2b9bdbe44e3a9a1aecb52920f7e7495410dfab8", size = 252761 }, - { url = "https://files.pythonhosted.org/packages/d5/77/4256d3577fe1b0daa8d3836a1ebe68eaa07dd2cbaf20cf5ab1115d6949d4/coverage-7.9.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc18ea9e417a04d1920a9a76fe9ebd2f43ca505b81994598482f938d5c315f46", size = 254917 }, - { url = "https://files.pythonhosted.org/packages/53/99/fc1a008eef1805e1ddb123cf17af864743354479ea5129a8f838c433cc2c/coverage-7.9.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6406cff19880aaaadc932152242523e892faff224da29e241ce2fca329866584", size = 256147 }, - { url = "https://files.pythonhosted.org/packages/92/c0/f63bf667e18b7f88c2bdb3160870e277c4874ced87e21426128d70aa741f/coverage-7.9.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d0d4f6ecdf37fcc19c88fec3e2277d5dee740fb51ffdd69b9579b8c31e4232e", size = 254261 }, - { url = "https://files.pythonhosted.org/packages/8c/32/37dd1c42ce3016ff8ec9e4b607650d2e34845c0585d3518b2a93b4830c1a/coverage-7.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c33624f50cf8de418ab2b4d6ca9eda96dc45b2c4231336bac91454520e8d1fac", size = 255099 }, - { url = "https://files.pythonhosted.org/packages/da/2e/af6b86f7c95441ce82f035b3affe1cd147f727bbd92f563be35e2d585683/coverage-7.9.2-cp313-cp313t-win32.whl", hash = "sha256:1df6b76e737c6a92210eebcb2390af59a141f9e9430210595251fbaf02d46926", size = 215440 }, - { url = "https://files.pythonhosted.org/packages/4d/bb/8a785d91b308867f6b2e36e41c569b367c00b70c17f54b13ac29bcd2d8c8/coverage-7.9.2-cp313-cp313t-win_amd64.whl", hash = "sha256:f5fd54310b92741ebe00d9c0d1d7b2b27463952c022da6d47c175d246a98d1bd", size = 216537 }, - { url = "https://files.pythonhosted.org/packages/1d/a0/a6bffb5e0f41a47279fd45a8f3155bf193f77990ae1c30f9c224b61cacb0/coverage-7.9.2-cp313-cp313t-win_arm64.whl", hash = "sha256:c48c2375287108c887ee87d13b4070a381c6537d30e8487b24ec721bf2a781cb", size = 214398 }, - { url = "https://files.pythonhosted.org/packages/d7/85/f8bbefac27d286386961c25515431482a425967e23d3698b75a250872924/coverage-7.9.2-pp39.pp310.pp311-none-any.whl", hash = "sha256:8a1166db2fb62473285bcb092f586e081e92656c7dfa8e9f62b4d39d7e6b5050", size = 204013 }, - { url = "https://files.pythonhosted.org/packages/3c/38/bbe2e63902847cf79036ecc75550d0698af31c91c7575352eb25190d0fb3/coverage-7.9.2-py3-none-any.whl", hash = "sha256:e425cd5b00f6fc0ed7cdbd766c70be8baab4b7839e4d4fe5fac48581dd968ea4", size = 204005 }, +version = "7.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/76/17780846fc7aade1e66712e1e27dd28faa0a5d987a1f433610974959eaa8/coverage-7.10.2.tar.gz", hash = "sha256:5d6e6d84e6dd31a8ded64759626627247d676a23c1b892e1326f7c55c8d61055", size = 820754, upload-time = "2025-08-04T00:35:17.511Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/53/0125a6fc0af4f2687b4e08b0fb332cd0d5e60f3ca849e7456f995d022656/coverage-7.10.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c3b210d79925a476dfc8d74c7d53224888421edebf3a611f3adae923e212b27", size = 215119, upload-time = "2025-08-04T00:33:19.101Z" }, + { url = "https://files.pythonhosted.org/packages/0e/2e/960d9871de9152dbc9ff950913c6a6e9cf2eb4cc80d5bc8f93029f9f2f9f/coverage-7.10.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf67d1787cd317c3f8b2e4c6ed1ae93497be7e30605a0d32237ac37a37a8a322", size = 215511, upload-time = "2025-08-04T00:33:20.32Z" }, + { url = "https://files.pythonhosted.org/packages/3f/34/68509e44995b9cad806d81b76c22bc5181f3535bca7cd9c15791bfd8951e/coverage-7.10.2-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:069b779d03d458602bc0e27189876e7d8bdf6b24ac0f12900de22dd2154e6ad7", size = 245513, upload-time = "2025-08-04T00:33:21.896Z" }, + { url = "https://files.pythonhosted.org/packages/ef/d4/9b12f357413248ce40804b0f58030b55a25b28a5c02db95fb0aa50c5d62c/coverage-7.10.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4c2de4cb80b9990e71c62c2d3e9f3ec71b804b1f9ca4784ec7e74127e0f42468", size = 247350, upload-time = "2025-08-04T00:33:23.917Z" }, + { url = "https://files.pythonhosted.org/packages/b6/40/257945eda1f72098e4a3c350b1d68fdc5d7d032684a0aeb6c2391153ecf4/coverage-7.10.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75bf7ab2374a7eb107602f1e07310cda164016cd60968abf817b7a0b5703e288", size = 249516, upload-time = "2025-08-04T00:33:25.5Z" }, + { url = "https://files.pythonhosted.org/packages/ff/55/8987f852ece378cecbf39a367f3f7ec53351e39a9151b130af3a3045b83f/coverage-7.10.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3f37516458ec1550815134937f73d6d15b434059cd10f64678a2068f65c62406", size = 247241, upload-time = "2025-08-04T00:33:26.767Z" }, + { url = "https://files.pythonhosted.org/packages/df/ae/da397de7a42a18cea6062ed9c3b72c50b39e0b9e7b2893d7172d3333a9a1/coverage-7.10.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:de3c6271c482c250d3303fb5c6bdb8ca025fff20a67245e1425df04dc990ece9", size = 245274, upload-time = "2025-08-04T00:33:28.494Z" }, + { url = "https://files.pythonhosted.org/packages/4e/64/7baa895eb55ec0e1ec35b988687ecd5d4475ababb0d7ae5ca3874dd90ee7/coverage-7.10.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:98a838101321ac3089c9bb1d4bfa967e8afed58021fda72d7880dc1997f20ae1", size = 245882, upload-time = "2025-08-04T00:33:30.048Z" }, + { url = "https://files.pythonhosted.org/packages/24/6c/1fd76a0bd09ae75220ae9775a8290416d726f0e5ba26ea72346747161240/coverage-7.10.2-cp311-cp311-win32.whl", hash = "sha256:f2a79145a531a0e42df32d37be5af069b4a914845b6f686590739b786f2f7bce", size = 217541, upload-time = "2025-08-04T00:33:31.376Z" }, + { url = "https://files.pythonhosted.org/packages/5f/2d/8c18fb7a6e74c79fd4661e82535bc8c68aee12f46c204eabf910b097ccc9/coverage-7.10.2-cp311-cp311-win_amd64.whl", hash = "sha256:e4f5f1320f8ee0d7cfa421ceb257bef9d39fd614dd3ddcfcacd284d4824ed2c2", size = 218426, upload-time = "2025-08-04T00:33:32.976Z" }, + { url = "https://files.pythonhosted.org/packages/da/40/425bb35e4ff7c7af177edf5dffd4154bc2a677b27696afe6526d75c77fec/coverage-7.10.2-cp311-cp311-win_arm64.whl", hash = "sha256:d8f2d83118f25328552c728b8e91babf93217db259ca5c2cd4dd4220b8926293", size = 217116, upload-time = "2025-08-04T00:33:34.302Z" }, + { url = "https://files.pythonhosted.org/packages/4e/1e/2c752bdbbf6f1199c59b1a10557fbb6fb3dc96b3c0077b30bd41a5922c1f/coverage-7.10.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:890ad3a26da9ec7bf69255b9371800e2a8da9bc223ae5d86daeb940b42247c83", size = 215311, upload-time = "2025-08-04T00:33:35.524Z" }, + { url = "https://files.pythonhosted.org/packages/68/6a/84277d73a2cafb96e24be81b7169372ba7ff28768ebbf98e55c85a491b0f/coverage-7.10.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:38fd1ccfca7838c031d7a7874d4353e2f1b98eb5d2a80a2fe5732d542ae25e9c", size = 215550, upload-time = "2025-08-04T00:33:37.109Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e7/5358b73b46ac76f56cc2de921eeabd44fabd0b7ff82ea4f6b8c159c4d5dc/coverage-7.10.2-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:76c1ffaaf4f6f0f6e8e9ca06f24bb6454a7a5d4ced97a1bc466f0d6baf4bd518", size = 246564, upload-time = "2025-08-04T00:33:38.33Z" }, + { url = "https://files.pythonhosted.org/packages/7c/0e/b0c901dd411cb7fc0cfcb28ef0dc6f3049030f616bfe9fc4143aecd95901/coverage-7.10.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:86da8a3a84b79ead5c7d0e960c34f580bc3b231bb546627773a3f53c532c2f21", size = 248993, upload-time = "2025-08-04T00:33:39.555Z" }, + { url = "https://files.pythonhosted.org/packages/0e/4e/a876db272072a9e0df93f311e187ccdd5f39a190c6d1c1f0b6e255a0d08e/coverage-7.10.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99cef9731c8a39801830a604cc53c93c9e57ea8b44953d26589499eded9576e0", size = 250454, upload-time = "2025-08-04T00:33:41.023Z" }, + { url = "https://files.pythonhosted.org/packages/64/d6/1222dc69f8dd1be208d55708a9f4a450ad582bf4fa05320617fea1eaa6d8/coverage-7.10.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ea58b112f2966a8b91eb13f5d3b1f8bb43c180d624cd3283fb33b1cedcc2dd75", size = 248365, upload-time = "2025-08-04T00:33:42.376Z" }, + { url = "https://files.pythonhosted.org/packages/62/e3/40fd71151064fc315c922dd9a35e15b30616f00146db1d6a0b590553a75a/coverage-7.10.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:20f405188d28da9522b7232e51154e1b884fc18d0b3a10f382d54784715bbe01", size = 246562, upload-time = "2025-08-04T00:33:43.663Z" }, + { url = "https://files.pythonhosted.org/packages/fc/14/8aa93ddcd6623ddaef5d8966268ac9545b145bce4fe7b1738fd1c3f0d957/coverage-7.10.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:64586ce42bbe0da4d9f76f97235c545d1abb9b25985a8791857690f96e23dc3b", size = 247772, upload-time = "2025-08-04T00:33:45.068Z" }, + { url = "https://files.pythonhosted.org/packages/07/4e/dcb1c01490623c61e2f2ea85cb185fa6a524265bb70eeb897d3c193efeb9/coverage-7.10.2-cp312-cp312-win32.whl", hash = "sha256:bc2e69b795d97ee6d126e7e22e78a509438b46be6ff44f4dccbb5230f550d340", size = 217710, upload-time = "2025-08-04T00:33:46.378Z" }, + { url = "https://files.pythonhosted.org/packages/79/16/e8aab4162b5f80ad2e5e1f54b1826e2053aa2f4db508b864af647f00c239/coverage-7.10.2-cp312-cp312-win_amd64.whl", hash = "sha256:adda2268b8cf0d11f160fad3743b4dfe9813cd6ecf02c1d6397eceaa5b45b388", size = 218499, upload-time = "2025-08-04T00:33:48.048Z" }, + { url = "https://files.pythonhosted.org/packages/06/7f/c112ec766e8f1131ce8ce26254be028772757b2d1e63e4f6a4b0ad9a526c/coverage-7.10.2-cp312-cp312-win_arm64.whl", hash = "sha256:164429decd0d6b39a0582eaa30c67bf482612c0330572343042d0ed9e7f15c20", size = 217154, upload-time = "2025-08-04T00:33:49.299Z" }, + { url = "https://files.pythonhosted.org/packages/8d/04/9b7a741557f93c0ed791b854d27aa8d9fe0b0ce7bb7c52ca1b0f2619cb74/coverage-7.10.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:aca7b5645afa688de6d4f8e89d30c577f62956fefb1bad021490d63173874186", size = 215337, upload-time = "2025-08-04T00:33:50.61Z" }, + { url = "https://files.pythonhosted.org/packages/02/a4/8d1088cd644750c94bc305d3cf56082b4cdf7fb854a25abb23359e74892f/coverage-7.10.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:96e5921342574a14303dfdb73de0019e1ac041c863743c8fe1aa6c2b4a257226", size = 215596, upload-time = "2025-08-04T00:33:52.33Z" }, + { url = "https://files.pythonhosted.org/packages/01/2f/643a8d73343f70e162d8177a3972b76e306b96239026bc0c12cfde4f7c7a/coverage-7.10.2-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:11333094c1bff621aa811b67ed794865cbcaa99984dedea4bd9cf780ad64ecba", size = 246145, upload-time = "2025-08-04T00:33:53.641Z" }, + { url = "https://files.pythonhosted.org/packages/1f/4a/722098d1848db4072cda71b69ede1e55730d9063bf868375264d0d302bc9/coverage-7.10.2-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6eb586fa7d2aee8d65d5ae1dd71414020b2f447435c57ee8de8abea0a77d5074", size = 248492, upload-time = "2025-08-04T00:33:55.366Z" }, + { url = "https://files.pythonhosted.org/packages/3f/b0/8a6d7f326f6e3e6ed398cde27f9055e860a1e858317001835c521673fb60/coverage-7.10.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d358f259d8019d4ef25d8c5b78aca4c7af25e28bd4231312911c22a0e824a57", size = 249927, upload-time = "2025-08-04T00:33:57.042Z" }, + { url = "https://files.pythonhosted.org/packages/bb/21/1aaadd3197b54d1e61794475379ecd0f68d8fc5c2ebd352964dc6f698a3d/coverage-7.10.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5250bda76e30382e0a2dcd68d961afcab92c3a7613606e6269855c6979a1b0bb", size = 248138, upload-time = "2025-08-04T00:33:58.329Z" }, + { url = "https://files.pythonhosted.org/packages/48/65/be75bafb2bdd22fd8bf9bf63cd5873b91bb26ec0d68f02d4b8b09c02decb/coverage-7.10.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a91e027d66eff214d88d9afbe528e21c9ef1ecdf4956c46e366c50f3094696d0", size = 246111, upload-time = "2025-08-04T00:33:59.899Z" }, + { url = "https://files.pythonhosted.org/packages/5e/30/a4f0c5e249c3cc60e6c6f30d8368e372f2d380eda40e0434c192ac27ccf5/coverage-7.10.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:228946da741558904e2c03ce870ba5efd9cd6e48cbc004d9a27abee08100a15a", size = 247493, upload-time = "2025-08-04T00:34:01.619Z" }, + { url = "https://files.pythonhosted.org/packages/85/99/f09b9493e44a75cf99ca834394c12f8cb70da6c1711ee296534f97b52729/coverage-7.10.2-cp313-cp313-win32.whl", hash = "sha256:95e23987b52d02e7c413bf2d6dc6288bd5721beb518052109a13bfdc62c8033b", size = 217756, upload-time = "2025-08-04T00:34:03.277Z" }, + { url = "https://files.pythonhosted.org/packages/2d/bb/cbcb09103be330c7d26ff0ab05c4a8861dd2e254656fdbd3eb7600af4336/coverage-7.10.2-cp313-cp313-win_amd64.whl", hash = "sha256:f35481d42c6d146d48ec92d4e239c23f97b53a3f1fbd2302e7c64336f28641fe", size = 218526, upload-time = "2025-08-04T00:34:04.635Z" }, + { url = "https://files.pythonhosted.org/packages/37/8f/8bfb4e0bca52c00ab680767c0dd8cfd928a2a72d69897d9b2d5d8b5f63f5/coverage-7.10.2-cp313-cp313-win_arm64.whl", hash = "sha256:65b451949cb789c346f9f9002441fc934d8ccedcc9ec09daabc2139ad13853f7", size = 217176, upload-time = "2025-08-04T00:34:05.973Z" }, + { url = "https://files.pythonhosted.org/packages/1e/25/d458ba0bf16a8204a88d74dbb7ec5520f29937ffcbbc12371f931c11efd2/coverage-7.10.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:e8415918856a3e7d57a4e0ad94651b761317de459eb74d34cc1bb51aad80f07e", size = 216058, upload-time = "2025-08-04T00:34:07.368Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1c/af4dfd2d7244dc7610fed6d59d57a23ea165681cd764445dc58d71ed01a6/coverage-7.10.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f287a25a8ca53901c613498e4a40885b19361a2fe8fbfdbb7f8ef2cad2a23f03", size = 216273, upload-time = "2025-08-04T00:34:09.073Z" }, + { url = "https://files.pythonhosted.org/packages/8e/67/ec5095d4035c6e16368226fa9cb15f77f891194c7e3725aeefd08e7a3e5a/coverage-7.10.2-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:75cc1a3f8c88c69bf16a871dab1fe5a7303fdb1e9f285f204b60f1ee539b8fc0", size = 257513, upload-time = "2025-08-04T00:34:10.403Z" }, + { url = "https://files.pythonhosted.org/packages/1c/47/be5550b57a3a8ba797de4236b0fd31031f88397b2afc84ab3c2d4cf265f6/coverage-7.10.2-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ca07fa78cc9d26bc8c4740de1abd3489cf9c47cc06d9a8ab3d552ff5101af4c0", size = 259377, upload-time = "2025-08-04T00:34:12.138Z" }, + { url = "https://files.pythonhosted.org/packages/37/50/b12a4da1382e672305c2d17cd3029dc16b8a0470de2191dbf26b91431378/coverage-7.10.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2e117e64c26300032755d4520cd769f2623cde1a1d1c3515b05a3b8add0ade1", size = 261516, upload-time = "2025-08-04T00:34:13.608Z" }, + { url = "https://files.pythonhosted.org/packages/db/41/4d3296dbd33dd8da178171540ca3391af7c0184c0870fd4d4574ac290290/coverage-7.10.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:daaf98009977f577b71f8800208f4d40d4dcf5c2db53d4d822787cdc198d76e1", size = 259110, upload-time = "2025-08-04T00:34:15.089Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f1/b409959ecbc0cec0e61e65683b22bacaa4a3b11512f834e16dd8ffbc37db/coverage-7.10.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:ea8d8fe546c528535c761ba424410bbeb36ba8a0f24be653e94b70c93fd8a8ca", size = 257248, upload-time = "2025-08-04T00:34:16.501Z" }, + { url = "https://files.pythonhosted.org/packages/48/ab/7076dc1c240412e9267d36ec93e9e299d7659f6a5c1e958f87e998b0fb6d/coverage-7.10.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:fe024d40ac31eb8d5aae70215b41dafa264676caa4404ae155f77d2fa95c37bb", size = 258063, upload-time = "2025-08-04T00:34:18.338Z" }, + { url = "https://files.pythonhosted.org/packages/1e/77/f6b51a0288f8f5f7dcc7c89abdd22cf514f3bc5151284f5cd628917f8e10/coverage-7.10.2-cp313-cp313t-win32.whl", hash = "sha256:8f34b09f68bdadec122ffad312154eda965ade433559cc1eadd96cca3de5c824", size = 218433, upload-time = "2025-08-04T00:34:19.71Z" }, + { url = "https://files.pythonhosted.org/packages/7b/6d/547a86493e25270ce8481543e77f3a0aa3aa872c1374246b7b76273d66eb/coverage-7.10.2-cp313-cp313t-win_amd64.whl", hash = "sha256:71d40b3ac0f26fa9ffa6ee16219a714fed5c6ec197cdcd2018904ab5e75bcfa3", size = 219523, upload-time = "2025-08-04T00:34:21.171Z" }, + { url = "https://files.pythonhosted.org/packages/ff/d5/3c711e38eaf9ab587edc9bed232c0298aed84e751a9f54aaa556ceaf7da6/coverage-7.10.2-cp313-cp313t-win_arm64.whl", hash = "sha256:abb57fdd38bf6f7dcc66b38dafb7af7c5fdc31ac6029ce373a6f7f5331d6f60f", size = 217739, upload-time = "2025-08-04T00:34:22.514Z" }, + { url = "https://files.pythonhosted.org/packages/18/d8/9b768ac73a8ac2d10c080af23937212434a958c8d2a1c84e89b450237942/coverage-7.10.2-py3-none-any.whl", hash = "sha256:95db3750dd2e6e93d99fa2498f3a1580581e49c494bddccc6f85c5c21604921f", size = 206973, upload-time = "2025-08-04T00:35:15.918Z" }, ] [package.optional-dependencies] @@ -609,93 +623,93 @@ toml = [ name = "crc32c" version = "2.7.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7f/4c/4e40cc26347ac8254d3f25b9f94710b8e8df24ee4dddc1ba41907a88a94d/crc32c-2.7.1.tar.gz", hash = "sha256:f91b144a21eef834d64178e01982bb9179c354b3e9e5f4c803b0e5096384968c", size = 45712 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/45/8e/2f37f46368bbfd50edfc11b96f0aa135699034b1b020966c70ebaff3463b/crc32c-2.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:19e03a50545a3ef400bd41667d5525f71030488629c57d819e2dd45064f16192", size = 49672 }, - { url = "https://files.pythonhosted.org/packages/ed/b8/e52f7c4b045b871c2984d70f37c31d4861b533a8082912dfd107a96cf7c1/crc32c-2.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c03286b1e5ce9bed7090084f206aacd87c5146b4b10de56fe9e86cbbbf851cf", size = 37155 }, - { url = "https://files.pythonhosted.org/packages/25/ee/0cfa82a68736697f3c7e435ba658c2ef8c997f42b89f6ab4545efe1b2649/crc32c-2.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:80ebbf144a1a56a532b353e81fa0f3edca4f4baa1bf92b1dde2c663a32bb6a15", size = 35372 }, - { url = "https://files.pythonhosted.org/packages/aa/92/c878aaba81c431fcd93a059e9f6c90db397c585742793f0bf6e0c531cc67/crc32c-2.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96b794fd11945298fdd5eb1290a812efb497c14bc42592c5c992ca077458eeba", size = 54879 }, - { url = "https://files.pythonhosted.org/packages/5b/f5/ab828ab3907095e06b18918408748950a9f726ee2b37be1b0839fb925ee1/crc32c-2.7.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9df7194dd3c0efb5a21f5d70595b7a8b4fd9921fbbd597d6d8e7a11eca3e2d27", size = 52588 }, - { url = "https://files.pythonhosted.org/packages/6a/2b/9e29e9ac4c4213d60491db09487125db358cd9263490fbadbd55e48fbe03/crc32c-2.7.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d698eec444b18e296a104d0b9bb6c596c38bdcb79d24eba49604636e9d747305", size = 53674 }, - { url = "https://files.pythonhosted.org/packages/79/ed/df3c4c14bf1b29f5c9b52d51fb6793e39efcffd80b2941d994e8f7f5f688/crc32c-2.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e07cf10ef852d219d179333fd706d1c415626f1f05e60bd75acf0143a4d8b225", size = 54691 }, - { url = "https://files.pythonhosted.org/packages/0c/47/4917af3c9c1df2fff28bbfa6492673c9adeae5599dcc207bbe209847489c/crc32c-2.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d2a051f296e6e92e13efee3b41db388931cdb4a2800656cd1ed1d9fe4f13a086", size = 52896 }, - { url = "https://files.pythonhosted.org/packages/1b/6f/26fc3dda5835cda8f6cd9d856afe62bdeae428de4c34fea200b0888e8835/crc32c-2.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1738259802978cdf428f74156175da6a5fdfb7256f647fdc0c9de1bc6cd7173", size = 53554 }, - { url = "https://files.pythonhosted.org/packages/56/3e/6f39127f7027c75d130c0ba348d86a6150dff23761fbc6a5f71659f4521e/crc32c-2.7.1-cp311-cp311-win32.whl", hash = "sha256:f7786d219a1a1bf27d0aa1869821d11a6f8e90415cfffc1e37791690d4a848a1", size = 38370 }, - { url = "https://files.pythonhosted.org/packages/c9/fb/1587c2705a3a47a3d0067eecf9a6fec510761c96dec45c7b038fb5c8ff46/crc32c-2.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:887f6844bb3ad35f0778cd10793ad217f7123a5422e40041231b8c4c7329649d", size = 39795 }, - { url = "https://files.pythonhosted.org/packages/1d/02/998dc21333413ce63fe4c1ca70eafe61ca26afc7eb353f20cecdb77d614e/crc32c-2.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f7d1c4e761fe42bf856130daf8b2658df33fe0ced3c43dadafdfeaa42b57b950", size = 49568 }, - { url = "https://files.pythonhosted.org/packages/9c/3e/e3656bfa76e50ef87b7136fef2dbf3c46e225629432fc9184fdd7fd187ff/crc32c-2.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:73361c79a6e4605204457f19fda18b042a94508a52e53d10a4239da5fb0f6a34", size = 37019 }, - { url = "https://files.pythonhosted.org/packages/0b/7d/5ff9904046ad15a08772515db19df43107bf5e3901a89c36a577b5f40ba0/crc32c-2.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:afd778fc8ac0ed2ffbfb122a9aa6a0e409a8019b894a1799cda12c01534493e0", size = 35373 }, - { url = "https://files.pythonhosted.org/packages/4d/41/4aedc961893f26858ab89fc772d0eaba91f9870f19eaa933999dcacb94ec/crc32c-2.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56ef661b34e9f25991fface7f9ad85e81bbc1b3fe3b916fd58c893eabe2fa0b8", size = 54675 }, - { url = "https://files.pythonhosted.org/packages/d6/63/8cabf09b7e39b9fec8f7010646c8b33057fc8d67e6093b3cc15563d23533/crc32c-2.7.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:571aa4429444b5d7f588e4377663592145d2d25eb1635abb530f1281794fc7c9", size = 52386 }, - { url = "https://files.pythonhosted.org/packages/79/13/13576941bf7cf95026abae43d8427c812c0054408212bf8ed490eda846b0/crc32c-2.7.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c02a3bd67dea95cdb25844aaf44ca2e1b0c1fd70b287ad08c874a95ef4bb38db", size = 53495 }, - { url = "https://files.pythonhosted.org/packages/3d/b6/55ffb26d0517d2d6c6f430ce2ad36ae7647c995c5bfd7abce7f32bb2bad1/crc32c-2.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99d17637c4867672cb8adeea007294e3c3df9d43964369516cfe2c1f47ce500a", size = 54456 }, - { url = "https://files.pythonhosted.org/packages/c2/1a/5562e54cb629ecc5543d3604dba86ddfc7c7b7bf31d64005b38a00d31d31/crc32c-2.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f4a400ac3c69a32e180d8753fd7ec7bccb80ade7ab0812855dce8a208e72495f", size = 52647 }, - { url = "https://files.pythonhosted.org/packages/48/ec/ce4138eaf356cd9aae60bbe931755e5e0151b3eca5f491fce6c01b97fd59/crc32c-2.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:588587772e55624dd9c7a906ec9e8773ae0b6ac5e270fc0bc84ee2758eba90d5", size = 53332 }, - { url = "https://files.pythonhosted.org/packages/5e/b5/144b42cd838a901175a916078781cb2c3c9f977151c9ba085aebd6d15b22/crc32c-2.7.1-cp312-cp312-win32.whl", hash = "sha256:9f14b60e5a14206e8173dd617fa0c4df35e098a305594082f930dae5488da428", size = 38371 }, - { url = "https://files.pythonhosted.org/packages/ae/c4/7929dcd5d9b57db0cce4fe6f6c191049380fc6d8c9b9f5581967f4ec018e/crc32c-2.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:7c810a246660a24dc818047dc5f89c7ce7b2814e1e08a8e99993f4103f7219e8", size = 39805 }, - { url = "https://files.pythonhosted.org/packages/bf/98/1a6d60d5b3b5edc8382777b64100343cb4aa6a7e172fae4a6cfcb8ebbbd9/crc32c-2.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:24949bffb06fc411cc18188d33357923cb935273642164d0bb37a5f375654169", size = 49567 }, - { url = "https://files.pythonhosted.org/packages/4f/56/0dd652d4e950e6348bbf16b964b3325e4ad8220470774128fc0b0dd069cb/crc32c-2.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2d5d326e7e118d4fa60187770d86b66af2fdfc63ce9eeb265f0d3e7d49bebe0b", size = 37018 }, - { url = "https://files.pythonhosted.org/packages/47/02/2bd65fdef10139b6a802d83a7f966b7750fe5ffb1042f7cbe5dbb6403869/crc32c-2.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ba110df60c64c8e2d77a9425b982a520ccdb7abe42f06604f4d98a45bb1fff62", size = 35374 }, - { url = "https://files.pythonhosted.org/packages/a9/0d/3e797d1ed92d357a6a4c5b41cea15a538b27a8fdf18c7863747eb50b73ad/crc32c-2.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c277f9d16a3283e064d54854af0976b72abaa89824955579b2b3f37444f89aae", size = 54641 }, - { url = "https://files.pythonhosted.org/packages/a7/d3/4ddeef755caaa75680c559562b6c71f5910fee4c4f3a2eb5ea8b57f0e48c/crc32c-2.7.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:881af0478a01331244e27197356929edbdeaef6a9f81b5c6bacfea18d2139289", size = 52338 }, - { url = "https://files.pythonhosted.org/packages/01/cf/32f019be5de9f6e180926a50ee5f08648e686c7d9a59f2c5d0806a77b1c7/crc32c-2.7.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:724d5ff4d29ff093a983ae656be3307093706d850ea2a233bf29fcacc335d945", size = 53447 }, - { url = "https://files.pythonhosted.org/packages/b2/8b/92f3f62f3bafe8f7ab4af7bfb7246dc683fd11ec0d6dfb73f91e09079f69/crc32c-2.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b2416c4d88696ac322632555c0f81ab35e15f154bc96055da6cf110d642dbc10", size = 54484 }, - { url = "https://files.pythonhosted.org/packages/98/b2/113a50f8781f76af5ac65ffdb907e72bddbe974de8e02247f0d58bc48040/crc32c-2.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:60254251b88ec9b9795215f0f9ec015a6b5eef8b2c5fba1267c672d83c78fc02", size = 52703 }, - { url = "https://files.pythonhosted.org/packages/b4/6c/309229e9acda8cf36a8ff4061d70b54d905f79b7037e16883ce6590a24ab/crc32c-2.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:edefc0e46f3c37372183f70338e5bdee42f6789b62fcd36ec53aa933e9dfbeaf", size = 53367 }, - { url = "https://files.pythonhosted.org/packages/b5/2a/6c6324d920396e1bd9f3efbe8753da071be0ca52bd22d6c82d446b8d6975/crc32c-2.7.1-cp313-cp313-win32.whl", hash = "sha256:813af8111218970fe2adb833c5e5239f091b9c9e76f03b4dd91aaba86e99b499", size = 38377 }, - { url = "https://files.pythonhosted.org/packages/db/a0/f01ccfab538db07ef3f6b4ede46357ff147a81dd4f3c59ca6a34c791a549/crc32c-2.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:7d9ede7be8e4ec1c9e90aaf6884decbeef10e3473e6ddac032706d710cab5888", size = 39803 }, - { url = "https://files.pythonhosted.org/packages/1b/80/61dcae7568b33acfde70c9d651c7d891c0c578c39cc049107c1cf61f1367/crc32c-2.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db9ac92294284b22521356715784b91cc9094eee42a5282ab281b872510d1831", size = 49386 }, - { url = "https://files.pythonhosted.org/packages/1e/f1/80f17c089799ab2b4c247443bdd101d6ceda30c46d7f193e16b5ca29c5a0/crc32c-2.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8fcd7f2f29a30dc92af64a9ee3d38bde0c82bd20ad939999427aac94bbd87373", size = 36937 }, - { url = "https://files.pythonhosted.org/packages/63/42/5fcfc71a3de493d920fd2590843762a2749981ea56b802b380e5df82309d/crc32c-2.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5c056ef043393085523e149276a7ce0cb534b872e04f3e20d74d9a94a75c0ad7", size = 35292 }, - { url = "https://files.pythonhosted.org/packages/03/de/fef962e898a953558fe1c55141644553e84ef4190693a31244c59a0856c7/crc32c-2.7.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03a92551a343702629af91f78d205801219692b6909f8fa126b830e332bfb0e0", size = 54223 }, - { url = "https://files.pythonhosted.org/packages/21/14/fceca1a6f45c0a1814fe8602a65657b75c27425162445925ba87438cad6b/crc32c-2.7.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb9424ec1a8ca54763155a703e763bcede82e6569fe94762614bb2de1412d4e1", size = 51588 }, - { url = "https://files.pythonhosted.org/packages/13/3b/13d40a7dfbf9ef05c84a0da45544ee72080dca4ce090679e5105689984bd/crc32c-2.7.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88732070f6175530db04e0bb36880ac45c33d49f8ac43fa0e50cfb1830049d23", size = 52678 }, - { url = "https://files.pythonhosted.org/packages/36/09/65ffc4fb9fa60ff6714eeb50a92284a4525e5943f0b040b572c0c76368c1/crc32c-2.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:57a20dfc27995f568f64775eea2bbb58ae269f1a1144561df5e4a4955f79db32", size = 53847 }, - { url = "https://files.pythonhosted.org/packages/24/71/938e926085b7288da052db7c84416f3ce25e71baf7ab5b63824c7bcb6f22/crc32c-2.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f7186d098bfd2cff25eac6880b7c7ad80431b90610036131c1c7dd0eab42a332", size = 51860 }, - { url = "https://files.pythonhosted.org/packages/3c/d8/4526d5380189d6f2fa27256c204100f30214fe402f47cf6e9fb9a91ab890/crc32c-2.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:55a77e29a265418fa34bef15bd0f2c60afae5348988aaf35ed163b4bbf93cf37", size = 52508 }, - { url = "https://files.pythonhosted.org/packages/19/30/15f7e35176488b77e5b88751947d321d603fccac273099ace27c7b2d50a6/crc32c-2.7.1-cp313-cp313t-win32.whl", hash = "sha256:ae38a4b6aa361595d81cab441405fbee905c72273e80a1c010fb878ae77ac769", size = 38319 }, - { url = "https://files.pythonhosted.org/packages/19/c4/0b3eee04dac195f4730d102d7a9fbea894ae7a32ce075f84336df96a385d/crc32c-2.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:eee2a43b663feb6c79a6c1c6e5eae339c2b72cfac31ee54ec0209fa736cf7ee5", size = 39781 }, +sdist = { url = "https://files.pythonhosted.org/packages/7f/4c/4e40cc26347ac8254d3f25b9f94710b8e8df24ee4dddc1ba41907a88a94d/crc32c-2.7.1.tar.gz", hash = "sha256:f91b144a21eef834d64178e01982bb9179c354b3e9e5f4c803b0e5096384968c", size = 45712, upload-time = "2024-09-24T06:20:17.553Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/45/8e/2f37f46368bbfd50edfc11b96f0aa135699034b1b020966c70ebaff3463b/crc32c-2.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:19e03a50545a3ef400bd41667d5525f71030488629c57d819e2dd45064f16192", size = 49672, upload-time = "2024-09-24T06:18:18.032Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b8/e52f7c4b045b871c2984d70f37c31d4861b533a8082912dfd107a96cf7c1/crc32c-2.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8c03286b1e5ce9bed7090084f206aacd87c5146b4b10de56fe9e86cbbbf851cf", size = 37155, upload-time = "2024-09-24T06:18:19.373Z" }, + { url = "https://files.pythonhosted.org/packages/25/ee/0cfa82a68736697f3c7e435ba658c2ef8c997f42b89f6ab4545efe1b2649/crc32c-2.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:80ebbf144a1a56a532b353e81fa0f3edca4f4baa1bf92b1dde2c663a32bb6a15", size = 35372, upload-time = "2024-09-24T06:18:20.983Z" }, + { url = "https://files.pythonhosted.org/packages/aa/92/c878aaba81c431fcd93a059e9f6c90db397c585742793f0bf6e0c531cc67/crc32c-2.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96b794fd11945298fdd5eb1290a812efb497c14bc42592c5c992ca077458eeba", size = 54879, upload-time = "2024-09-24T06:18:23.085Z" }, + { url = "https://files.pythonhosted.org/packages/5b/f5/ab828ab3907095e06b18918408748950a9f726ee2b37be1b0839fb925ee1/crc32c-2.7.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9df7194dd3c0efb5a21f5d70595b7a8b4fd9921fbbd597d6d8e7a11eca3e2d27", size = 52588, upload-time = "2024-09-24T06:18:24.463Z" }, + { url = "https://files.pythonhosted.org/packages/6a/2b/9e29e9ac4c4213d60491db09487125db358cd9263490fbadbd55e48fbe03/crc32c-2.7.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d698eec444b18e296a104d0b9bb6c596c38bdcb79d24eba49604636e9d747305", size = 53674, upload-time = "2024-09-24T06:18:25.624Z" }, + { url = "https://files.pythonhosted.org/packages/79/ed/df3c4c14bf1b29f5c9b52d51fb6793e39efcffd80b2941d994e8f7f5f688/crc32c-2.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e07cf10ef852d219d179333fd706d1c415626f1f05e60bd75acf0143a4d8b225", size = 54691, upload-time = "2024-09-24T06:18:26.578Z" }, + { url = "https://files.pythonhosted.org/packages/0c/47/4917af3c9c1df2fff28bbfa6492673c9adeae5599dcc207bbe209847489c/crc32c-2.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d2a051f296e6e92e13efee3b41db388931cdb4a2800656cd1ed1d9fe4f13a086", size = 52896, upload-time = "2024-09-24T06:18:28.174Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6f/26fc3dda5835cda8f6cd9d856afe62bdeae428de4c34fea200b0888e8835/crc32c-2.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1738259802978cdf428f74156175da6a5fdfb7256f647fdc0c9de1bc6cd7173", size = 53554, upload-time = "2024-09-24T06:18:29.104Z" }, + { url = "https://files.pythonhosted.org/packages/56/3e/6f39127f7027c75d130c0ba348d86a6150dff23761fbc6a5f71659f4521e/crc32c-2.7.1-cp311-cp311-win32.whl", hash = "sha256:f7786d219a1a1bf27d0aa1869821d11a6f8e90415cfffc1e37791690d4a848a1", size = 38370, upload-time = "2024-09-24T06:18:30.013Z" }, + { url = "https://files.pythonhosted.org/packages/c9/fb/1587c2705a3a47a3d0067eecf9a6fec510761c96dec45c7b038fb5c8ff46/crc32c-2.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:887f6844bb3ad35f0778cd10793ad217f7123a5422e40041231b8c4c7329649d", size = 39795, upload-time = "2024-09-24T06:18:31.324Z" }, + { url = "https://files.pythonhosted.org/packages/1d/02/998dc21333413ce63fe4c1ca70eafe61ca26afc7eb353f20cecdb77d614e/crc32c-2.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f7d1c4e761fe42bf856130daf8b2658df33fe0ced3c43dadafdfeaa42b57b950", size = 49568, upload-time = "2024-09-24T06:18:32.425Z" }, + { url = "https://files.pythonhosted.org/packages/9c/3e/e3656bfa76e50ef87b7136fef2dbf3c46e225629432fc9184fdd7fd187ff/crc32c-2.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:73361c79a6e4605204457f19fda18b042a94508a52e53d10a4239da5fb0f6a34", size = 37019, upload-time = "2024-09-24T06:18:34.097Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7d/5ff9904046ad15a08772515db19df43107bf5e3901a89c36a577b5f40ba0/crc32c-2.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:afd778fc8ac0ed2ffbfb122a9aa6a0e409a8019b894a1799cda12c01534493e0", size = 35373, upload-time = "2024-09-24T06:18:35.02Z" }, + { url = "https://files.pythonhosted.org/packages/4d/41/4aedc961893f26858ab89fc772d0eaba91f9870f19eaa933999dcacb94ec/crc32c-2.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56ef661b34e9f25991fface7f9ad85e81bbc1b3fe3b916fd58c893eabe2fa0b8", size = 54675, upload-time = "2024-09-24T06:18:35.954Z" }, + { url = "https://files.pythonhosted.org/packages/d6/63/8cabf09b7e39b9fec8f7010646c8b33057fc8d67e6093b3cc15563d23533/crc32c-2.7.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:571aa4429444b5d7f588e4377663592145d2d25eb1635abb530f1281794fc7c9", size = 52386, upload-time = "2024-09-24T06:18:36.896Z" }, + { url = "https://files.pythonhosted.org/packages/79/13/13576941bf7cf95026abae43d8427c812c0054408212bf8ed490eda846b0/crc32c-2.7.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c02a3bd67dea95cdb25844aaf44ca2e1b0c1fd70b287ad08c874a95ef4bb38db", size = 53495, upload-time = "2024-09-24T06:18:38.099Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b6/55ffb26d0517d2d6c6f430ce2ad36ae7647c995c5bfd7abce7f32bb2bad1/crc32c-2.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99d17637c4867672cb8adeea007294e3c3df9d43964369516cfe2c1f47ce500a", size = 54456, upload-time = "2024-09-24T06:18:39.051Z" }, + { url = "https://files.pythonhosted.org/packages/c2/1a/5562e54cb629ecc5543d3604dba86ddfc7c7b7bf31d64005b38a00d31d31/crc32c-2.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f4a400ac3c69a32e180d8753fd7ec7bccb80ade7ab0812855dce8a208e72495f", size = 52647, upload-time = "2024-09-24T06:18:40.021Z" }, + { url = "https://files.pythonhosted.org/packages/48/ec/ce4138eaf356cd9aae60bbe931755e5e0151b3eca5f491fce6c01b97fd59/crc32c-2.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:588587772e55624dd9c7a906ec9e8773ae0b6ac5e270fc0bc84ee2758eba90d5", size = 53332, upload-time = "2024-09-24T06:18:40.925Z" }, + { url = "https://files.pythonhosted.org/packages/5e/b5/144b42cd838a901175a916078781cb2c3c9f977151c9ba085aebd6d15b22/crc32c-2.7.1-cp312-cp312-win32.whl", hash = "sha256:9f14b60e5a14206e8173dd617fa0c4df35e098a305594082f930dae5488da428", size = 38371, upload-time = "2024-09-24T06:18:42.711Z" }, + { url = "https://files.pythonhosted.org/packages/ae/c4/7929dcd5d9b57db0cce4fe6f6c191049380fc6d8c9b9f5581967f4ec018e/crc32c-2.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:7c810a246660a24dc818047dc5f89c7ce7b2814e1e08a8e99993f4103f7219e8", size = 39805, upload-time = "2024-09-24T06:18:43.6Z" }, + { url = "https://files.pythonhosted.org/packages/bf/98/1a6d60d5b3b5edc8382777b64100343cb4aa6a7e172fae4a6cfcb8ebbbd9/crc32c-2.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:24949bffb06fc411cc18188d33357923cb935273642164d0bb37a5f375654169", size = 49567, upload-time = "2024-09-24T06:18:44.485Z" }, + { url = "https://files.pythonhosted.org/packages/4f/56/0dd652d4e950e6348bbf16b964b3325e4ad8220470774128fc0b0dd069cb/crc32c-2.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2d5d326e7e118d4fa60187770d86b66af2fdfc63ce9eeb265f0d3e7d49bebe0b", size = 37018, upload-time = "2024-09-24T06:18:45.434Z" }, + { url = "https://files.pythonhosted.org/packages/47/02/2bd65fdef10139b6a802d83a7f966b7750fe5ffb1042f7cbe5dbb6403869/crc32c-2.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ba110df60c64c8e2d77a9425b982a520ccdb7abe42f06604f4d98a45bb1fff62", size = 35374, upload-time = "2024-09-24T06:18:46.304Z" }, + { url = "https://files.pythonhosted.org/packages/a9/0d/3e797d1ed92d357a6a4c5b41cea15a538b27a8fdf18c7863747eb50b73ad/crc32c-2.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c277f9d16a3283e064d54854af0976b72abaa89824955579b2b3f37444f89aae", size = 54641, upload-time = "2024-09-24T06:18:47.207Z" }, + { url = "https://files.pythonhosted.org/packages/a7/d3/4ddeef755caaa75680c559562b6c71f5910fee4c4f3a2eb5ea8b57f0e48c/crc32c-2.7.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:881af0478a01331244e27197356929edbdeaef6a9f81b5c6bacfea18d2139289", size = 52338, upload-time = "2024-09-24T06:18:49.31Z" }, + { url = "https://files.pythonhosted.org/packages/01/cf/32f019be5de9f6e180926a50ee5f08648e686c7d9a59f2c5d0806a77b1c7/crc32c-2.7.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:724d5ff4d29ff093a983ae656be3307093706d850ea2a233bf29fcacc335d945", size = 53447, upload-time = "2024-09-24T06:18:50.296Z" }, + { url = "https://files.pythonhosted.org/packages/b2/8b/92f3f62f3bafe8f7ab4af7bfb7246dc683fd11ec0d6dfb73f91e09079f69/crc32c-2.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b2416c4d88696ac322632555c0f81ab35e15f154bc96055da6cf110d642dbc10", size = 54484, upload-time = "2024-09-24T06:18:51.311Z" }, + { url = "https://files.pythonhosted.org/packages/98/b2/113a50f8781f76af5ac65ffdb907e72bddbe974de8e02247f0d58bc48040/crc32c-2.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:60254251b88ec9b9795215f0f9ec015a6b5eef8b2c5fba1267c672d83c78fc02", size = 52703, upload-time = "2024-09-24T06:18:52.488Z" }, + { url = "https://files.pythonhosted.org/packages/b4/6c/309229e9acda8cf36a8ff4061d70b54d905f79b7037e16883ce6590a24ab/crc32c-2.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:edefc0e46f3c37372183f70338e5bdee42f6789b62fcd36ec53aa933e9dfbeaf", size = 53367, upload-time = "2024-09-24T06:18:53.49Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2a/6c6324d920396e1bd9f3efbe8753da071be0ca52bd22d6c82d446b8d6975/crc32c-2.7.1-cp313-cp313-win32.whl", hash = "sha256:813af8111218970fe2adb833c5e5239f091b9c9e76f03b4dd91aaba86e99b499", size = 38377, upload-time = "2024-09-24T06:18:54.487Z" }, + { url = "https://files.pythonhosted.org/packages/db/a0/f01ccfab538db07ef3f6b4ede46357ff147a81dd4f3c59ca6a34c791a549/crc32c-2.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:7d9ede7be8e4ec1c9e90aaf6884decbeef10e3473e6ddac032706d710cab5888", size = 39803, upload-time = "2024-09-24T06:18:55.419Z" }, + { url = "https://files.pythonhosted.org/packages/1b/80/61dcae7568b33acfde70c9d651c7d891c0c578c39cc049107c1cf61f1367/crc32c-2.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db9ac92294284b22521356715784b91cc9094eee42a5282ab281b872510d1831", size = 49386, upload-time = "2024-09-24T06:18:56.813Z" }, + { url = "https://files.pythonhosted.org/packages/1e/f1/80f17c089799ab2b4c247443bdd101d6ceda30c46d7f193e16b5ca29c5a0/crc32c-2.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8fcd7f2f29a30dc92af64a9ee3d38bde0c82bd20ad939999427aac94bbd87373", size = 36937, upload-time = "2024-09-24T06:18:57.77Z" }, + { url = "https://files.pythonhosted.org/packages/63/42/5fcfc71a3de493d920fd2590843762a2749981ea56b802b380e5df82309d/crc32c-2.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5c056ef043393085523e149276a7ce0cb534b872e04f3e20d74d9a94a75c0ad7", size = 35292, upload-time = "2024-09-24T06:18:58.676Z" }, + { url = "https://files.pythonhosted.org/packages/03/de/fef962e898a953558fe1c55141644553e84ef4190693a31244c59a0856c7/crc32c-2.7.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:03a92551a343702629af91f78d205801219692b6909f8fa126b830e332bfb0e0", size = 54223, upload-time = "2024-09-24T06:18:59.675Z" }, + { url = "https://files.pythonhosted.org/packages/21/14/fceca1a6f45c0a1814fe8602a65657b75c27425162445925ba87438cad6b/crc32c-2.7.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fb9424ec1a8ca54763155a703e763bcede82e6569fe94762614bb2de1412d4e1", size = 51588, upload-time = "2024-09-24T06:19:00.938Z" }, + { url = "https://files.pythonhosted.org/packages/13/3b/13d40a7dfbf9ef05c84a0da45544ee72080dca4ce090679e5105689984bd/crc32c-2.7.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88732070f6175530db04e0bb36880ac45c33d49f8ac43fa0e50cfb1830049d23", size = 52678, upload-time = "2024-09-24T06:19:02.661Z" }, + { url = "https://files.pythonhosted.org/packages/36/09/65ffc4fb9fa60ff6714eeb50a92284a4525e5943f0b040b572c0c76368c1/crc32c-2.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:57a20dfc27995f568f64775eea2bbb58ae269f1a1144561df5e4a4955f79db32", size = 53847, upload-time = "2024-09-24T06:19:03.705Z" }, + { url = "https://files.pythonhosted.org/packages/24/71/938e926085b7288da052db7c84416f3ce25e71baf7ab5b63824c7bcb6f22/crc32c-2.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:f7186d098bfd2cff25eac6880b7c7ad80431b90610036131c1c7dd0eab42a332", size = 51860, upload-time = "2024-09-24T06:19:04.726Z" }, + { url = "https://files.pythonhosted.org/packages/3c/d8/4526d5380189d6f2fa27256c204100f30214fe402f47cf6e9fb9a91ab890/crc32c-2.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:55a77e29a265418fa34bef15bd0f2c60afae5348988aaf35ed163b4bbf93cf37", size = 52508, upload-time = "2024-09-24T06:19:05.731Z" }, + { url = "https://files.pythonhosted.org/packages/19/30/15f7e35176488b77e5b88751947d321d603fccac273099ace27c7b2d50a6/crc32c-2.7.1-cp313-cp313t-win32.whl", hash = "sha256:ae38a4b6aa361595d81cab441405fbee905c72273e80a1c010fb878ae77ac769", size = 38319, upload-time = "2024-09-24T06:19:07.233Z" }, + { url = "https://files.pythonhosted.org/packages/19/c4/0b3eee04dac195f4730d102d7a9fbea894ae7a32ce075f84336df96a385d/crc32c-2.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:eee2a43b663feb6c79a6c1c6e5eae339c2b72cfac31ee54ec0209fa736cf7ee5", size = 39781, upload-time = "2024-09-24T06:19:08.182Z" }, ] [[package]] name = "cryptography" -version = "45.0.5" +version = "45.0.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/95/1e/49527ac611af559665f71cbb8f92b332b5ec9c6fbc4e88b0f8e92f5e85df/cryptography-45.0.5.tar.gz", hash = "sha256:72e76caa004ab63accdf26023fccd1d087f6d90ec6048ff33ad0445abf7f605a", size = 744903 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f0/fb/09e28bc0c46d2c547085e60897fea96310574c70fb21cd58a730a45f3403/cryptography-45.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:101ee65078f6dd3e5a028d4f19c07ffa4dd22cce6a20eaa160f8b5219911e7d8", size = 7043092 }, - { url = "https://files.pythonhosted.org/packages/b1/05/2194432935e29b91fb649f6149c1a4f9e6d3d9fc880919f4ad1bcc22641e/cryptography-45.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3a264aae5f7fbb089dbc01e0242d3b67dffe3e6292e1f5182122bdf58e65215d", size = 4205926 }, - { url = "https://files.pythonhosted.org/packages/07/8b/9ef5da82350175e32de245646b1884fc01124f53eb31164c77f95a08d682/cryptography-45.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e74d30ec9c7cb2f404af331d5b4099a9b322a8a6b25c4632755c8757345baac5", size = 4429235 }, - { url = "https://files.pythonhosted.org/packages/7c/e1/c809f398adde1994ee53438912192d92a1d0fc0f2d7582659d9ef4c28b0c/cryptography-45.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3af26738f2db354aafe492fb3869e955b12b2ef2e16908c8b9cb928128d42c57", size = 4209785 }, - { url = "https://files.pythonhosted.org/packages/d0/8b/07eb6bd5acff58406c5e806eff34a124936f41a4fb52909ffa4d00815f8c/cryptography-45.0.5-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e6c00130ed423201c5bc5544c23359141660b07999ad82e34e7bb8f882bb78e0", size = 3893050 }, - { url = "https://files.pythonhosted.org/packages/ec/ef/3333295ed58d900a13c92806b67e62f27876845a9a908c939f040887cca9/cryptography-45.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:dd420e577921c8c2d31289536c386aaa30140b473835e97f83bc71ea9d2baf2d", size = 4457379 }, - { url = "https://files.pythonhosted.org/packages/d9/9d/44080674dee514dbb82b21d6fa5d1055368f208304e2ab1828d85c9de8f4/cryptography-45.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d05a38884db2ba215218745f0781775806bde4f32e07b135348355fe8e4991d9", size = 4209355 }, - { url = "https://files.pythonhosted.org/packages/c9/d8/0749f7d39f53f8258e5c18a93131919ac465ee1f9dccaf1b3f420235e0b5/cryptography-45.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:ad0caded895a00261a5b4aa9af828baede54638754b51955a0ac75576b831b27", size = 4456087 }, - { url = "https://files.pythonhosted.org/packages/09/d7/92acac187387bf08902b0bf0699816f08553927bdd6ba3654da0010289b4/cryptography-45.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9024beb59aca9d31d36fcdc1604dd9bbeed0a55bface9f1908df19178e2f116e", size = 4332873 }, - { url = "https://files.pythonhosted.org/packages/03/c2/840e0710da5106a7c3d4153c7215b2736151bba60bf4491bdb421df5056d/cryptography-45.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:91098f02ca81579c85f66df8a588c78f331ca19089763d733e34ad359f474174", size = 4564651 }, - { url = "https://files.pythonhosted.org/packages/2e/92/cc723dd6d71e9747a887b94eb3827825c6c24b9e6ce2bb33b847d31d5eaa/cryptography-45.0.5-cp311-abi3-win32.whl", hash = "sha256:926c3ea71a6043921050eaa639137e13dbe7b4ab25800932a8498364fc1abec9", size = 2929050 }, - { url = "https://files.pythonhosted.org/packages/1f/10/197da38a5911a48dd5389c043de4aec4b3c94cb836299b01253940788d78/cryptography-45.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:b85980d1e345fe769cfc57c57db2b59cff5464ee0c045d52c0df087e926fbe63", size = 3403224 }, - { url = "https://files.pythonhosted.org/packages/fe/2b/160ce8c2765e7a481ce57d55eba1546148583e7b6f85514472b1d151711d/cryptography-45.0.5-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:f3562c2f23c612f2e4a6964a61d942f891d29ee320edb62ff48ffb99f3de9ae8", size = 7017143 }, - { url = "https://files.pythonhosted.org/packages/c2/e7/2187be2f871c0221a81f55ee3105d3cf3e273c0a0853651d7011eada0d7e/cryptography-45.0.5-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3fcfbefc4a7f332dece7272a88e410f611e79458fab97b5efe14e54fe476f4fd", size = 4197780 }, - { url = "https://files.pythonhosted.org/packages/b9/cf/84210c447c06104e6be9122661159ad4ce7a8190011669afceeaea150524/cryptography-45.0.5-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:460f8c39ba66af7db0545a8c6f2eabcbc5a5528fc1cf6c3fa9a1e44cec33385e", size = 4420091 }, - { url = "https://files.pythonhosted.org/packages/3e/6a/cb8b5c8bb82fafffa23aeff8d3a39822593cee6e2f16c5ca5c2ecca344f7/cryptography-45.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9b4cf6318915dccfe218e69bbec417fdd7c7185aa7aab139a2c0beb7468c89f0", size = 4198711 }, - { url = "https://files.pythonhosted.org/packages/04/f7/36d2d69df69c94cbb2473871926daf0f01ad8e00fe3986ac3c1e8c4ca4b3/cryptography-45.0.5-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2089cc8f70a6e454601525e5bf2779e665d7865af002a5dec8d14e561002e135", size = 3883299 }, - { url = "https://files.pythonhosted.org/packages/82/c7/f0ea40f016de72f81288e9fe8d1f6748036cb5ba6118774317a3ffc6022d/cryptography-45.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0027d566d65a38497bc37e0dd7c2f8ceda73597d2ac9ba93810204f56f52ebc7", size = 4450558 }, - { url = "https://files.pythonhosted.org/packages/06/ae/94b504dc1a3cdf642d710407c62e86296f7da9e66f27ab12a1ee6fdf005b/cryptography-45.0.5-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:be97d3a19c16a9be00edf79dca949c8fa7eff621763666a145f9f9535a5d7f42", size = 4198020 }, - { url = "https://files.pythonhosted.org/packages/05/2b/aaf0adb845d5dabb43480f18f7ca72e94f92c280aa983ddbd0bcd6ecd037/cryptography-45.0.5-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:7760c1c2e1a7084153a0f68fab76e754083b126a47d0117c9ed15e69e2103492", size = 4449759 }, - { url = "https://files.pythonhosted.org/packages/91/e4/f17e02066de63e0100a3a01b56f8f1016973a1d67551beaf585157a86b3f/cryptography-45.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6ff8728d8d890b3dda5765276d1bc6fb099252915a2cd3aff960c4c195745dd0", size = 4319991 }, - { url = "https://files.pythonhosted.org/packages/f2/2e/e2dbd629481b499b14516eed933f3276eb3239f7cee2dcfa4ee6b44d4711/cryptography-45.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:7259038202a47fdecee7e62e0fd0b0738b6daa335354396c6ddebdbe1206af2a", size = 4554189 }, - { url = "https://files.pythonhosted.org/packages/f8/ea/a78a0c38f4c8736287b71c2ea3799d173d5ce778c7d6e3c163a95a05ad2a/cryptography-45.0.5-cp37-abi3-win32.whl", hash = "sha256:1e1da5accc0c750056c556a93c3e9cb828970206c68867712ca5805e46dc806f", size = 2911769 }, - { url = "https://files.pythonhosted.org/packages/79/b3/28ac139109d9005ad3f6b6f8976ffede6706a6478e21c889ce36c840918e/cryptography-45.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:90cb0a7bb35959f37e23303b7eed0a32280510030daba3f7fdfbb65defde6a97", size = 3390016 }, - { url = "https://files.pythonhosted.org/packages/c0/71/9bdbcfd58d6ff5084687fe722c58ac718ebedbc98b9f8f93781354e6d286/cryptography-45.0.5-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8c4a6ff8a30e9e3d38ac0539e9a9e02540ab3f827a3394f8852432f6b0ea152e", size = 3587878 }, - { url = "https://files.pythonhosted.org/packages/f0/63/83516cfb87f4a8756eaa4203f93b283fda23d210fc14e1e594bd5f20edb6/cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bd4c45986472694e5121084c6ebbd112aa919a25e783b87eb95953c9573906d6", size = 4152447 }, - { url = "https://files.pythonhosted.org/packages/22/11/d2823d2a5a0bd5802b3565437add16f5c8ce1f0778bf3822f89ad2740a38/cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:982518cd64c54fcada9d7e5cf28eabd3ee76bd03ab18e08a48cad7e8b6f31b18", size = 4386778 }, - { url = "https://files.pythonhosted.org/packages/5f/38/6bf177ca6bce4fe14704ab3e93627c5b0ca05242261a2e43ef3168472540/cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:12e55281d993a793b0e883066f590c1ae1e802e3acb67f8b442e721e475e6463", size = 4151627 }, - { url = "https://files.pythonhosted.org/packages/38/6a/69fc67e5266bff68a91bcb81dff8fb0aba4d79a78521a08812048913e16f/cryptography-45.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:5aa1e32983d4443e310f726ee4b071ab7569f58eedfdd65e9675484a4eb67bd1", size = 4385593 }, - { url = "https://files.pythonhosted.org/packages/f6/34/31a1604c9a9ade0fdab61eb48570e09a796f4d9836121266447b0eaf7feb/cryptography-45.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:e357286c1b76403dd384d938f93c46b2b058ed4dfcdce64a770f0537ed3feb6f", size = 3331106 }, +sdist = { url = "https://files.pythonhosted.org/packages/d6/0d/d13399c94234ee8f3df384819dc67e0c5ce215fb751d567a55a1f4b028c7/cryptography-45.0.6.tar.gz", hash = "sha256:5c966c732cf6e4a276ce83b6e4c729edda2df6929083a952cc7da973c539c719", size = 744949, upload-time = "2025-08-05T23:59:27.93Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8c/29/2793d178d0eda1ca4a09a7c4e09a5185e75738cc6d526433e8663b460ea6/cryptography-45.0.6-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:048e7ad9e08cf4c0ab07ff7f36cc3115924e22e2266e034450a890d9e312dd74", size = 7042702, upload-time = "2025-08-05T23:58:23.464Z" }, + { url = "https://files.pythonhosted.org/packages/b3/b6/cabd07410f222f32c8d55486c464f432808abaa1f12af9afcbe8f2f19030/cryptography-45.0.6-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:44647c5d796f5fc042bbc6d61307d04bf29bccb74d188f18051b635f20a9c75f", size = 4206483, upload-time = "2025-08-05T23:58:27.132Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9e/f9c7d36a38b1cfeb1cc74849aabe9bf817990f7603ff6eb485e0d70e0b27/cryptography-45.0.6-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e40b80ecf35ec265c452eea0ba94c9587ca763e739b8e559c128d23bff7ebbbf", size = 4429679, upload-time = "2025-08-05T23:58:29.152Z" }, + { url = "https://files.pythonhosted.org/packages/9c/2a/4434c17eb32ef30b254b9e8b9830cee4e516f08b47fdd291c5b1255b8101/cryptography-45.0.6-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:00e8724bdad672d75e6f069b27970883179bd472cd24a63f6e620ca7e41cc0c5", size = 4210553, upload-time = "2025-08-05T23:58:30.596Z" }, + { url = "https://files.pythonhosted.org/packages/ef/1d/09a5df8e0c4b7970f5d1f3aff1b640df6d4be28a64cae970d56c6cf1c772/cryptography-45.0.6-cp311-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7a3085d1b319d35296176af31c90338eeb2ddac8104661df79f80e1d9787b8b2", size = 3894499, upload-time = "2025-08-05T23:58:32.03Z" }, + { url = "https://files.pythonhosted.org/packages/79/62/120842ab20d9150a9d3a6bdc07fe2870384e82f5266d41c53b08a3a96b34/cryptography-45.0.6-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1b7fa6a1c1188c7ee32e47590d16a5a0646270921f8020efc9a511648e1b2e08", size = 4458484, upload-time = "2025-08-05T23:58:33.526Z" }, + { url = "https://files.pythonhosted.org/packages/fd/80/1bc3634d45ddfed0871bfba52cf8f1ad724761662a0c792b97a951fb1b30/cryptography-45.0.6-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:275ba5cc0d9e320cd70f8e7b96d9e59903c815ca579ab96c1e37278d231fc402", size = 4210281, upload-time = "2025-08-05T23:58:35.445Z" }, + { url = "https://files.pythonhosted.org/packages/7d/fe/ffb12c2d83d0ee625f124880a1f023b5878f79da92e64c37962bbbe35f3f/cryptography-45.0.6-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f4028f29a9f38a2025abedb2e409973709c660d44319c61762202206ed577c42", size = 4456890, upload-time = "2025-08-05T23:58:36.923Z" }, + { url = "https://files.pythonhosted.org/packages/8c/8e/b3f3fe0dc82c77a0deb5f493b23311e09193f2268b77196ec0f7a36e3f3e/cryptography-45.0.6-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:ee411a1b977f40bd075392c80c10b58025ee5c6b47a822a33c1198598a7a5f05", size = 4333247, upload-time = "2025-08-05T23:58:38.781Z" }, + { url = "https://files.pythonhosted.org/packages/b3/a6/c3ef2ab9e334da27a1d7b56af4a2417d77e7806b2e0f90d6267ce120d2e4/cryptography-45.0.6-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e2a21a8eda2d86bb604934b6b37691585bd095c1f788530c1fcefc53a82b3453", size = 4565045, upload-time = "2025-08-05T23:58:40.415Z" }, + { url = "https://files.pythonhosted.org/packages/31/c3/77722446b13fa71dddd820a5faab4ce6db49e7e0bf8312ef4192a3f78e2f/cryptography-45.0.6-cp311-abi3-win32.whl", hash = "sha256:d063341378d7ee9c91f9d23b431a3502fc8bfacd54ef0a27baa72a0843b29159", size = 2928923, upload-time = "2025-08-05T23:58:41.919Z" }, + { url = "https://files.pythonhosted.org/packages/38/63/a025c3225188a811b82932a4dcc8457a26c3729d81578ccecbcce2cb784e/cryptography-45.0.6-cp311-abi3-win_amd64.whl", hash = "sha256:833dc32dfc1e39b7376a87b9a6a4288a10aae234631268486558920029b086ec", size = 3403805, upload-time = "2025-08-05T23:58:43.792Z" }, + { url = "https://files.pythonhosted.org/packages/5b/af/bcfbea93a30809f126d51c074ee0fac5bd9d57d068edf56c2a73abedbea4/cryptography-45.0.6-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:3436128a60a5e5490603ab2adbabc8763613f638513ffa7d311c900a8349a2a0", size = 7020111, upload-time = "2025-08-05T23:58:45.316Z" }, + { url = "https://files.pythonhosted.org/packages/98/c6/ea5173689e014f1a8470899cd5beeb358e22bb3cf5a876060f9d1ca78af4/cryptography-45.0.6-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0d9ef57b6768d9fa58e92f4947cea96ade1233c0e236db22ba44748ffedca394", size = 4198169, upload-time = "2025-08-05T23:58:47.121Z" }, + { url = "https://files.pythonhosted.org/packages/ba/73/b12995edc0c7e2311ffb57ebd3b351f6b268fed37d93bfc6f9856e01c473/cryptography-45.0.6-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea3c42f2016a5bbf71825537c2ad753f2870191134933196bee408aac397b3d9", size = 4421273, upload-time = "2025-08-05T23:58:48.557Z" }, + { url = "https://files.pythonhosted.org/packages/f7/6e/286894f6f71926bc0da67408c853dd9ba953f662dcb70993a59fd499f111/cryptography-45.0.6-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:20ae4906a13716139d6d762ceb3e0e7e110f7955f3bc3876e3a07f5daadec5f3", size = 4199211, upload-time = "2025-08-05T23:58:50.139Z" }, + { url = "https://files.pythonhosted.org/packages/de/34/a7f55e39b9623c5cb571d77a6a90387fe557908ffc44f6872f26ca8ae270/cryptography-45.0.6-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dac5ec199038b8e131365e2324c03d20e97fe214af051d20c49db129844e8b3", size = 3883732, upload-time = "2025-08-05T23:58:52.253Z" }, + { url = "https://files.pythonhosted.org/packages/f9/b9/c6d32edbcba0cd9f5df90f29ed46a65c4631c4fbe11187feb9169c6ff506/cryptography-45.0.6-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:18f878a34b90d688982e43f4b700408b478102dd58b3e39de21b5ebf6509c301", size = 4450655, upload-time = "2025-08-05T23:58:53.848Z" }, + { url = "https://files.pythonhosted.org/packages/77/2d/09b097adfdee0227cfd4c699b3375a842080f065bab9014248933497c3f9/cryptography-45.0.6-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5bd6020c80c5b2b2242d6c48487d7b85700f5e0038e67b29d706f98440d66eb5", size = 4198956, upload-time = "2025-08-05T23:58:55.209Z" }, + { url = "https://files.pythonhosted.org/packages/55/66/061ec6689207d54effdff535bbdf85cc380d32dd5377173085812565cf38/cryptography-45.0.6-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:eccddbd986e43014263eda489abbddfbc287af5cddfd690477993dbb31e31016", size = 4449859, upload-time = "2025-08-05T23:58:56.639Z" }, + { url = "https://files.pythonhosted.org/packages/41/ff/e7d5a2ad2d035e5a2af116e1a3adb4d8fcd0be92a18032917a089c6e5028/cryptography-45.0.6-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:550ae02148206beb722cfe4ef0933f9352bab26b087af00e48fdfb9ade35c5b3", size = 4320254, upload-time = "2025-08-05T23:58:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/82/27/092d311af22095d288f4db89fcaebadfb2f28944f3d790a4cf51fe5ddaeb/cryptography-45.0.6-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5b64e668fc3528e77efa51ca70fadcd6610e8ab231e3e06ae2bab3b31c2b8ed9", size = 4554815, upload-time = "2025-08-05T23:59:00.283Z" }, + { url = "https://files.pythonhosted.org/packages/7e/01/aa2f4940262d588a8fdf4edabe4cda45854d00ebc6eaac12568b3a491a16/cryptography-45.0.6-cp37-abi3-win32.whl", hash = "sha256:780c40fb751c7d2b0c6786ceee6b6f871e86e8718a8ff4bc35073ac353c7cd02", size = 2912147, upload-time = "2025-08-05T23:59:01.716Z" }, + { url = "https://files.pythonhosted.org/packages/0a/bc/16e0276078c2de3ceef6b5a34b965f4436215efac45313df90d55f0ba2d2/cryptography-45.0.6-cp37-abi3-win_amd64.whl", hash = "sha256:20d15aed3ee522faac1a39fbfdfee25d17b1284bafd808e1640a74846d7c4d1b", size = 3390459, upload-time = "2025-08-05T23:59:03.358Z" }, + { url = "https://files.pythonhosted.org/packages/61/69/c252de4ec047ba2f567ecb53149410219577d408c2aea9c989acae7eafce/cryptography-45.0.6-pp311-pypy311_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fc022c1fa5acff6def2fc6d7819bbbd31ccddfe67d075331a65d9cfb28a20983", size = 3584669, upload-time = "2025-08-05T23:59:15.431Z" }, + { url = "https://files.pythonhosted.org/packages/e3/fe/deea71e9f310a31fe0a6bfee670955152128d309ea2d1c79e2a5ae0f0401/cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3de77e4df42ac8d4e4d6cdb342d989803ad37707cf8f3fbf7b088c9cbdd46427", size = 4153022, upload-time = "2025-08-05T23:59:16.954Z" }, + { url = "https://files.pythonhosted.org/packages/60/45/a77452f5e49cb580feedba6606d66ae7b82c128947aa754533b3d1bd44b0/cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:599c8d7df950aa68baa7e98f7b73f4f414c9f02d0e8104a30c0182a07732638b", size = 4386802, upload-time = "2025-08-05T23:59:18.55Z" }, + { url = "https://files.pythonhosted.org/packages/a3/b9/a2f747d2acd5e3075fdf5c145c7c3568895daaa38b3b0c960ef830db6cdc/cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:31a2b9a10530a1cb04ffd6aa1cd4d3be9ed49f7d77a4dafe198f3b382f41545c", size = 4152706, upload-time = "2025-08-05T23:59:20.044Z" }, + { url = "https://files.pythonhosted.org/packages/81/ec/381b3e8d0685a3f3f304a382aa3dfce36af2d76467da0fd4bb21ddccc7b2/cryptography-45.0.6-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:e5b3dda1b00fb41da3af4c5ef3f922a200e33ee5ba0f0bc9ecf0b0c173958385", size = 4386740, upload-time = "2025-08-05T23:59:21.525Z" }, + { url = "https://files.pythonhosted.org/packages/0a/76/cf8d69da8d0b5ecb0db406f24a63a3f69ba5e791a11b782aeeefef27ccbb/cryptography-45.0.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:629127cfdcdc6806dfe234734d7cb8ac54edaf572148274fa377a7d3405b0043", size = 3331874, upload-time = "2025-08-05T23:59:23.017Z" }, ] [[package]] @@ -712,39 +726,39 @@ dependencies = [ { name = "pyyaml" }, { name = "toolz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/00/cbb7cb07742955dfe77368aa40725d7000414a8a49f415ba40c5a4379ba9/dask-2025.7.0.tar.gz", hash = "sha256:c3a0d4e78882e85ea81dbc71e6459713e45676e2d17e776c2f3f19848039e4cf", size = 10972242 } +sdist = { url = "https://files.pythonhosted.org/packages/08/00/cbb7cb07742955dfe77368aa40725d7000414a8a49f415ba40c5a4379ba9/dask-2025.7.0.tar.gz", hash = "sha256:c3a0d4e78882e85ea81dbc71e6459713e45676e2d17e776c2f3f19848039e4cf", size = 10972242, upload-time = "2025-07-14T20:03:42.701Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/f9/3e04725358c17329652da8c1b2dbd88de723f3dc78bf52ca6d28d52c9279/dask-2025.7.0-py3-none-any.whl", hash = "sha256:073c29c4e99c2400a39a8a67874f35c1d15bf7af9ae3d0c30af3c7c1199f24ae", size = 1475117 }, + { url = "https://files.pythonhosted.org/packages/b3/f9/3e04725358c17329652da8c1b2dbd88de723f3dc78bf52ca6d28d52c9279/dask-2025.7.0-py3-none-any.whl", hash = "sha256:073c29c4e99c2400a39a8a67874f35c1d15bf7af9ae3d0c30af3c7c1199f24ae", size = 1475117, upload-time = "2025-07-14T20:03:33.095Z" }, ] [[package]] name = "debugpy" version = "1.8.15" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/3a9a28ddb750a76eaec445c7f4d3147ea2c579a97dbd9e25d39001b92b21/debugpy-1.8.15.tar.gz", hash = "sha256:58d7a20b7773ab5ee6bdfb2e6cf622fdf1e40c9d5aef2857d85391526719ac00", size = 1643279 } +sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/3a9a28ddb750a76eaec445c7f4d3147ea2c579a97dbd9e25d39001b92b21/debugpy-1.8.15.tar.gz", hash = "sha256:58d7a20b7773ab5ee6bdfb2e6cf622fdf1e40c9d5aef2857d85391526719ac00", size = 1643279, upload-time = "2025-07-15T16:43:29.135Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/b3/1c44a2ed311199ab11c2299c9474a6c7cd80d19278defd333aeb7c287995/debugpy-1.8.15-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:babc4fb1962dd6a37e94d611280e3d0d11a1f5e6c72ac9b3d87a08212c4b6dd3", size = 2183442 }, - { url = "https://files.pythonhosted.org/packages/f6/69/e2dcb721491e1c294d348681227c9b44fb95218f379aa88e12a19d85528d/debugpy-1.8.15-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f778e68f2986a58479d0ac4f643e0b8c82fdd97c2e200d4d61e7c2d13838eb53", size = 3134215 }, - { url = "https://files.pythonhosted.org/packages/17/76/4ce63b95d8294dcf2fd1820860b300a420d077df4e93afcaa25a984c2ca7/debugpy-1.8.15-cp311-cp311-win32.whl", hash = "sha256:f9d1b5abd75cd965e2deabb1a06b0e93a1546f31f9f621d2705e78104377c702", size = 5154037 }, - { url = "https://files.pythonhosted.org/packages/c2/a7/e5a7c784465eb9c976d84408873d597dc7ce74a0fc69ed009548a1a94813/debugpy-1.8.15-cp311-cp311-win_amd64.whl", hash = "sha256:62954fb904bec463e2b5a415777f6d1926c97febb08ef1694da0e5d1463c5c3b", size = 5178133 }, - { url = "https://files.pythonhosted.org/packages/ab/4a/4508d256e52897f5cdfee6a6d7580974811e911c6d01321df3264508a5ac/debugpy-1.8.15-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:3dcc7225cb317469721ab5136cda9ff9c8b6e6fb43e87c9e15d5b108b99d01ba", size = 2511197 }, - { url = "https://files.pythonhosted.org/packages/99/8d/7f6ef1097e7fecf26b4ef72338d08e41644a41b7ee958a19f494ffcffc29/debugpy-1.8.15-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:047a493ca93c85ccede1dbbaf4e66816794bdc214213dde41a9a61e42d27f8fc", size = 4229517 }, - { url = "https://files.pythonhosted.org/packages/3f/e8/e8c6a9aa33a9c9c6dacbf31747384f6ed2adde4de2e9693c766bdf323aa3/debugpy-1.8.15-cp312-cp312-win32.whl", hash = "sha256:b08e9b0bc260cf324c890626961dad4ffd973f7568fbf57feb3c3a65ab6b6327", size = 5276132 }, - { url = "https://files.pythonhosted.org/packages/e9/ad/231050c6177b3476b85fcea01e565dac83607b5233d003ff067e2ee44d8f/debugpy-1.8.15-cp312-cp312-win_amd64.whl", hash = "sha256:e2a4fe357c92334272eb2845fcfcdbec3ef9f22c16cf613c388ac0887aed15fa", size = 5317645 }, - { url = "https://files.pythonhosted.org/packages/28/70/2928aad2310726d5920b18ed9f54b9f06df5aa4c10cf9b45fa18ff0ab7e8/debugpy-1.8.15-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:f5e01291ad7d6649aed5773256c5bba7a1a556196300232de1474c3c372592bf", size = 2495538 }, - { url = "https://files.pythonhosted.org/packages/9e/c6/9b8ffb4ca91fac8b2877eef63c9cc0e87dd2570b1120054c272815ec4cd0/debugpy-1.8.15-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94dc0f0d00e528d915e0ce1c78e771475b2335b376c49afcc7382ee0b146bab6", size = 4221874 }, - { url = "https://files.pythonhosted.org/packages/55/8a/9b8d59674b4bf489318c7c46a1aab58e606e583651438084b7e029bf3c43/debugpy-1.8.15-cp313-cp313-win32.whl", hash = "sha256:fcf0748d4f6e25f89dc5e013d1129ca6f26ad4da405e0723a4f704583896a709", size = 5275949 }, - { url = "https://files.pythonhosted.org/packages/72/83/9e58e6fdfa8710a5e6ec06c2401241b9ad48b71c0a7eb99570a1f1edb1d3/debugpy-1.8.15-cp313-cp313-win_amd64.whl", hash = "sha256:73c943776cb83e36baf95e8f7f8da765896fd94b05991e7bc162456d25500683", size = 5317720 }, - { url = "https://files.pythonhosted.org/packages/07/d5/98748d9860e767a1248b5e31ffa7ce8cb7006e97bf8abbf3d891d0a8ba4e/debugpy-1.8.15-py2.py3-none-any.whl", hash = "sha256:bce2e6c5ff4f2e00b98d45e7e01a49c7b489ff6df5f12d881c67d2f1ac635f3d", size = 5282697 }, + { url = "https://files.pythonhosted.org/packages/d2/b3/1c44a2ed311199ab11c2299c9474a6c7cd80d19278defd333aeb7c287995/debugpy-1.8.15-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:babc4fb1962dd6a37e94d611280e3d0d11a1f5e6c72ac9b3d87a08212c4b6dd3", size = 2183442, upload-time = "2025-07-15T16:43:36.733Z" }, + { url = "https://files.pythonhosted.org/packages/f6/69/e2dcb721491e1c294d348681227c9b44fb95218f379aa88e12a19d85528d/debugpy-1.8.15-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f778e68f2986a58479d0ac4f643e0b8c82fdd97c2e200d4d61e7c2d13838eb53", size = 3134215, upload-time = "2025-07-15T16:43:38.116Z" }, + { url = "https://files.pythonhosted.org/packages/17/76/4ce63b95d8294dcf2fd1820860b300a420d077df4e93afcaa25a984c2ca7/debugpy-1.8.15-cp311-cp311-win32.whl", hash = "sha256:f9d1b5abd75cd965e2deabb1a06b0e93a1546f31f9f621d2705e78104377c702", size = 5154037, upload-time = "2025-07-15T16:43:39.471Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a7/e5a7c784465eb9c976d84408873d597dc7ce74a0fc69ed009548a1a94813/debugpy-1.8.15-cp311-cp311-win_amd64.whl", hash = "sha256:62954fb904bec463e2b5a415777f6d1926c97febb08ef1694da0e5d1463c5c3b", size = 5178133, upload-time = "2025-07-15T16:43:40.969Z" }, + { url = "https://files.pythonhosted.org/packages/ab/4a/4508d256e52897f5cdfee6a6d7580974811e911c6d01321df3264508a5ac/debugpy-1.8.15-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:3dcc7225cb317469721ab5136cda9ff9c8b6e6fb43e87c9e15d5b108b99d01ba", size = 2511197, upload-time = "2025-07-15T16:43:42.343Z" }, + { url = "https://files.pythonhosted.org/packages/99/8d/7f6ef1097e7fecf26b4ef72338d08e41644a41b7ee958a19f494ffcffc29/debugpy-1.8.15-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:047a493ca93c85ccede1dbbaf4e66816794bdc214213dde41a9a61e42d27f8fc", size = 4229517, upload-time = "2025-07-15T16:43:44.14Z" }, + { url = "https://files.pythonhosted.org/packages/3f/e8/e8c6a9aa33a9c9c6dacbf31747384f6ed2adde4de2e9693c766bdf323aa3/debugpy-1.8.15-cp312-cp312-win32.whl", hash = "sha256:b08e9b0bc260cf324c890626961dad4ffd973f7568fbf57feb3c3a65ab6b6327", size = 5276132, upload-time = "2025-07-15T16:43:45.529Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ad/231050c6177b3476b85fcea01e565dac83607b5233d003ff067e2ee44d8f/debugpy-1.8.15-cp312-cp312-win_amd64.whl", hash = "sha256:e2a4fe357c92334272eb2845fcfcdbec3ef9f22c16cf613c388ac0887aed15fa", size = 5317645, upload-time = "2025-07-15T16:43:46.968Z" }, + { url = "https://files.pythonhosted.org/packages/28/70/2928aad2310726d5920b18ed9f54b9f06df5aa4c10cf9b45fa18ff0ab7e8/debugpy-1.8.15-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:f5e01291ad7d6649aed5773256c5bba7a1a556196300232de1474c3c372592bf", size = 2495538, upload-time = "2025-07-15T16:43:48.927Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c6/9b8ffb4ca91fac8b2877eef63c9cc0e87dd2570b1120054c272815ec4cd0/debugpy-1.8.15-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94dc0f0d00e528d915e0ce1c78e771475b2335b376c49afcc7382ee0b146bab6", size = 4221874, upload-time = "2025-07-15T16:43:50.282Z" }, + { url = "https://files.pythonhosted.org/packages/55/8a/9b8d59674b4bf489318c7c46a1aab58e606e583651438084b7e029bf3c43/debugpy-1.8.15-cp313-cp313-win32.whl", hash = "sha256:fcf0748d4f6e25f89dc5e013d1129ca6f26ad4da405e0723a4f704583896a709", size = 5275949, upload-time = "2025-07-15T16:43:52.079Z" }, + { url = "https://files.pythonhosted.org/packages/72/83/9e58e6fdfa8710a5e6ec06c2401241b9ad48b71c0a7eb99570a1f1edb1d3/debugpy-1.8.15-cp313-cp313-win_amd64.whl", hash = "sha256:73c943776cb83e36baf95e8f7f8da765896fd94b05991e7bc162456d25500683", size = 5317720, upload-time = "2025-07-15T16:43:53.703Z" }, + { url = "https://files.pythonhosted.org/packages/07/d5/98748d9860e767a1248b5e31ffa7ce8cb7006e97bf8abbf3d891d0a8ba4e/debugpy-1.8.15-py2.py3-none-any.whl", hash = "sha256:bce2e6c5ff4f2e00b98d45e7e01a49c7b489ff6df5f12d881c67d2f1ac635f3d", size = 5282697, upload-time = "2025-07-15T16:44:07.996Z" }, ] [[package]] name = "decorator" version = "5.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711 } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190 }, + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, ] [[package]] @@ -754,18 +768,18 @@ source = { registry = "https://pypi.org/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://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", size = 2928744, upload-time = "2025-01-27T10:46:25.7Z" } 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://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998, upload-time = "2025-01-27T10:46:09.186Z" }, ] [[package]] name = "distlib" version = "0.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605 } +sdist = { url = "https://files.pythonhosted.org/packages/96/8e/709914eb2b5749865801041647dc7f4e6d00b549cfe88b65ca192995f07c/distlib-0.4.0.tar.gz", hash = "sha256:feec40075be03a04501a973d81f633735b4b69f98b05450592310c0f401a4e0d", size = 614605, upload-time = "2025-07-17T16:52:00.465Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047 }, + { url = "https://files.pythonhosted.org/packages/33/6b/e0547afaf41bf2c42e52430072fa5658766e3d65bd4b03a563d1b6336f57/distlib-0.4.0-py2.py3-none-any.whl", hash = "sha256:9659f7d87e46584a30b5780e43ac7a2143098441670ff0a49d5f9034c54a6c16", size = 469047, upload-time = "2025-07-17T16:51:58.613Z" }, ] [[package]] @@ -789,18 +803,18 @@ dependencies = [ { name = "urllib3" }, { name = "zict" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d4/df/4974e669d5c166fddc5e39c8e2dcde41fd90c7568e205f7bf861dc49b66c/distributed-2025.7.0.tar.gz", hash = "sha256:5f8ec20d3cdfb286452831c6f9ebee84527e9323256c20dd2938d9c6e62c5c18", size = 1108454 } +sdist = { url = "https://files.pythonhosted.org/packages/d4/df/4974e669d5c166fddc5e39c8e2dcde41fd90c7568e205f7bf861dc49b66c/distributed-2025.7.0.tar.gz", hash = "sha256:5f8ec20d3cdfb286452831c6f9ebee84527e9323256c20dd2938d9c6e62c5c18", size = 1108454, upload-time = "2025-07-14T20:03:33.842Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/dc/9f033526ed98b65cda8adbd10b6eeeca0659203f67bd3e065ce172008887/distributed-2025.7.0-py3-none-any.whl", hash = "sha256:51b74526c2bee409ca968ee5532c79de1c1a1713664f5ccf90bdd81f17cfdc73", size = 1015142 }, + { url = "https://files.pythonhosted.org/packages/9e/dc/9f033526ed98b65cda8adbd10b6eeeca0659203f67bd3e065ce172008887/distributed-2025.7.0-py3-none-any.whl", hash = "sha256:51b74526c2bee409ca968ee5532c79de1c1a1713664f5ccf90bdd81f17cfdc73", size = 1015142, upload-time = "2025-07-14T20:03:30.834Z" }, ] [[package]] name = "docutils" version = "0.21.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444 } +sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload-time = "2024-04-23T18:57:18.24Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408 }, + { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, ] [[package]] @@ -810,36 +824,36 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/25/71/80cc718ff6d7abfbabacb1f57aaa42e9c1552bfdd01e64ddd704e4a03638/donfig-0.8.1.post1.tar.gz", hash = "sha256:3bef3413a4c1c601b585e8d297256d0c1470ea012afa6e8461dc28bfb7c23f52", size = 19506 } +sdist = { url = "https://files.pythonhosted.org/packages/25/71/80cc718ff6d7abfbabacb1f57aaa42e9c1552bfdd01e64ddd704e4a03638/donfig-0.8.1.post1.tar.gz", hash = "sha256:3bef3413a4c1c601b585e8d297256d0c1470ea012afa6e8461dc28bfb7c23f52", size = 19506, upload-time = "2024-05-23T14:14:31.513Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/d5/c5db1ea3394c6e1732fb3286b3bd878b59507a8f77d32a2cebda7d7b7cd4/donfig-0.8.1.post1-py3-none-any.whl", hash = "sha256:2a3175ce74a06109ff9307d90a230f81215cbac9a751f4d1c6194644b8204f9d", size = 21592 }, + { url = "https://files.pythonhosted.org/packages/0c/d5/c5db1ea3394c6e1732fb3286b3bd878b59507a8f77d32a2cebda7d7b7cd4/donfig-0.8.1.post1-py3-none-any.whl", hash = "sha256:2a3175ce74a06109ff9307d90a230f81215cbac9a751f4d1c6194644b8204f9d", size = 21592, upload-time = "2024-05-23T14:13:55.283Z" }, ] [[package]] name = "executing" version = "2.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693 } +sdist = { url = "https://files.pythonhosted.org/packages/91/50/a9d80c47ff289c611ff12e63f7c5d13942c65d68125160cefd768c73e6e4/executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755", size = 978693, upload-time = "2025-01-22T15:41:29.403Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702 }, + { url = "https://files.pythonhosted.org/packages/7b/8f/c4d9bafc34ad7ad5d8dc16dd1347ee0e507a52c3adb6bfa8887e1c6a26ba/executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa", size = 26702, upload-time = "2025-01-22T15:41:25.929Z" }, ] [[package]] name = "fastjsonschema" version = "2.21.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8b/50/4b769ce1ac4071a1ef6d86b1a3fb56cdc3a37615e8c5519e1af96cdac366/fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", size = 373939 } +sdist = { url = "https://files.pythonhosted.org/packages/8b/50/4b769ce1ac4071a1ef6d86b1a3fb56cdc3a37615e8c5519e1af96cdac366/fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4", size = 373939, upload-time = "2024-12-02T10:55:15.133Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667", size = 23924 }, + { url = "https://files.pythonhosted.org/packages/90/2b/0817a2b257fe88725c25589d89aec060581aabf668707a8d03b2e9e0cb2a/fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667", size = 23924, upload-time = "2024-12-02T10:55:07.599Z" }, ] [[package]] name = "filelock" version = "3.18.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075 } +sdist = { url = "https://files.pythonhosted.org/packages/0a/10/c23352565a6544bdc5353e0b15fc1c563352101f30e24bf500207a54df9a/filelock-3.18.0.tar.gz", hash = "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", size = 18075, upload-time = "2025-03-14T07:11:40.47Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215 }, + { url = "https://files.pythonhosted.org/packages/4d/36/2a115987e2d8c300a974597416d9de88f2444426de9571f4b59b2cca3acc/filelock-3.18.0-py3-none-any.whl", hash = "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de", size = 16215, upload-time = "2025-03-14T07:11:39.145Z" }, ] [[package]] @@ -849,9 +863,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/b0/8a21e330561c65653d010ef112bf38f60890051d244ede197ddaa08e50c1/flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656", size = 15816 } +sdist = { url = "https://files.pythonhosted.org/packages/55/b0/8a21e330561c65653d010ef112bf38f60890051d244ede197ddaa08e50c1/flexcache-0.3.tar.gz", hash = "sha256:18743bd5a0621bfe2cf8d519e4c3bfdf57a269c15d1ced3fb4b64e0ff4600656", size = 15816, upload-time = "2024-03-09T03:21:07.555Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32", size = 13263 }, + { url = "https://files.pythonhosted.org/packages/27/cd/c883e1a7c447479d6e13985565080e3fea88ab5a107c21684c813dba1875/flexcache-0.3-py3-none-any.whl", hash = "sha256:d43c9fea82336af6e0115e308d9d33a185390b8346a017564611f1466dcd2e32", size = 13263, upload-time = "2024-03-09T03:21:05.635Z" }, ] [[package]] @@ -861,115 +875,116 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/99/b4de7e39e8eaf8207ba1a8fa2241dd98b2ba72ae6e16960d8351736d8702/flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2", size = 31799 } +sdist = { url = "https://files.pythonhosted.org/packages/82/99/b4de7e39e8eaf8207ba1a8fa2241dd98b2ba72ae6e16960d8351736d8702/flexparser-0.4.tar.gz", hash = "sha256:266d98905595be2ccc5da964fe0a2c3526fbbffdc45b65b3146d75db992ef6b2", size = 31799, upload-time = "2024-11-07T02:00:56.249Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846", size = 27625 }, + { url = "https://files.pythonhosted.org/packages/fe/5e/3be305568fe5f34448807976dc82fc151d76c3e0e03958f34770286278c1/flexparser-0.4-py3-none-any.whl", hash = "sha256:3738b456192dcb3e15620f324c447721023c0293f6af9955b481e91d00179846", size = 27625, upload-time = "2024-11-07T02:00:54.523Z" }, ] [[package]] name = "frozenlist" version = "1.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/79/b1/b64018016eeb087db503b038296fd782586432b9c077fc5c7839e9cb6ef6/frozenlist-1.7.0.tar.gz", hash = "sha256:2e310d81923c2437ea8670467121cc3e9b0f76d3043cc1d2331d56c7fb7a3a8f", size = 45078 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/34/7e/803dde33760128acd393a27eb002f2020ddb8d99d30a44bfbaab31c5f08a/frozenlist-1.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:aa51e147a66b2d74de1e6e2cf5921890de6b0f4820b257465101d7f37b49fb5a", size = 82251 }, - { url = "https://files.pythonhosted.org/packages/75/a9/9c2c5760b6ba45eae11334db454c189d43d34a4c0b489feb2175e5e64277/frozenlist-1.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9b35db7ce1cd71d36ba24f80f0c9e7cff73a28d7a74e91fe83e23d27c7828750", size = 48183 }, - { url = "https://files.pythonhosted.org/packages/47/be/4038e2d869f8a2da165f35a6befb9158c259819be22eeaf9c9a8f6a87771/frozenlist-1.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34a69a85e34ff37791e94542065c8416c1afbf820b68f720452f636d5fb990cd", size = 47107 }, - { url = "https://files.pythonhosted.org/packages/79/26/85314b8a83187c76a37183ceed886381a5f992975786f883472fcb6dc5f2/frozenlist-1.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a646531fa8d82c87fe4bb2e596f23173caec9185bfbca5d583b4ccfb95183e2", size = 237333 }, - { url = "https://files.pythonhosted.org/packages/1f/fd/e5b64f7d2c92a41639ffb2ad44a6a82f347787abc0c7df5f49057cf11770/frozenlist-1.7.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:79b2ffbba483f4ed36a0f236ccb85fbb16e670c9238313709638167670ba235f", size = 231724 }, - { url = "https://files.pythonhosted.org/packages/20/fb/03395c0a43a5976af4bf7534759d214405fbbb4c114683f434dfdd3128ef/frozenlist-1.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a26f205c9ca5829cbf82bb2a84b5c36f7184c4316617d7ef1b271a56720d6b30", size = 245842 }, - { url = "https://files.pythonhosted.org/packages/d0/15/c01c8e1dffdac5d9803507d824f27aed2ba76b6ed0026fab4d9866e82f1f/frozenlist-1.7.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bcacfad3185a623fa11ea0e0634aac7b691aa925d50a440f39b458e41c561d98", size = 239767 }, - { url = "https://files.pythonhosted.org/packages/14/99/3f4c6fe882c1f5514b6848aa0a69b20cb5e5d8e8f51a339d48c0e9305ed0/frozenlist-1.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72c1b0fe8fe451b34f12dce46445ddf14bd2a5bcad7e324987194dc8e3a74c86", size = 224130 }, - { url = "https://files.pythonhosted.org/packages/4d/83/220a374bd7b2aeba9d0725130665afe11de347d95c3620b9b82cc2fcab97/frozenlist-1.7.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61d1a5baeaac6c0798ff6edfaeaa00e0e412d49946c53fae8d4b8e8b3566c4ae", size = 235301 }, - { url = "https://files.pythonhosted.org/packages/03/3c/3e3390d75334a063181625343e8daab61b77e1b8214802cc4e8a1bb678fc/frozenlist-1.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7edf5c043c062462f09b6820de9854bf28cc6cc5b6714b383149745e287181a8", size = 234606 }, - { url = "https://files.pythonhosted.org/packages/23/1e/58232c19608b7a549d72d9903005e2d82488f12554a32de2d5fb59b9b1ba/frozenlist-1.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:d50ac7627b3a1bd2dcef6f9da89a772694ec04d9a61b66cf87f7d9446b4a0c31", size = 248372 }, - { url = "https://files.pythonhosted.org/packages/c0/a4/e4a567e01702a88a74ce8a324691e62a629bf47d4f8607f24bf1c7216e7f/frozenlist-1.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce48b2fece5aeb45265bb7a58259f45027db0abff478e3077e12b05b17fb9da7", size = 229860 }, - { url = "https://files.pythonhosted.org/packages/73/a6/63b3374f7d22268b41a9db73d68a8233afa30ed164c46107b33c4d18ecdd/frozenlist-1.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:fe2365ae915a1fafd982c146754e1de6ab3478def8a59c86e1f7242d794f97d5", size = 245893 }, - { url = "https://files.pythonhosted.org/packages/6d/eb/d18b3f6e64799a79673c4ba0b45e4cfbe49c240edfd03a68be20002eaeaa/frozenlist-1.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:45a6f2fdbd10e074e8814eb98b05292f27bad7d1883afbe009d96abdcf3bc898", size = 246323 }, - { url = "https://files.pythonhosted.org/packages/5a/f5/720f3812e3d06cd89a1d5db9ff6450088b8f5c449dae8ffb2971a44da506/frozenlist-1.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:21884e23cffabb157a9dd7e353779077bf5b8f9a58e9b262c6caad2ef5f80a56", size = 233149 }, - { url = "https://files.pythonhosted.org/packages/69/68/03efbf545e217d5db8446acfd4c447c15b7c8cf4dbd4a58403111df9322d/frozenlist-1.7.0-cp311-cp311-win32.whl", hash = "sha256:284d233a8953d7b24f9159b8a3496fc1ddc00f4db99c324bd5fb5f22d8698ea7", size = 39565 }, - { url = "https://files.pythonhosted.org/packages/58/17/fe61124c5c333ae87f09bb67186d65038834a47d974fc10a5fadb4cc5ae1/frozenlist-1.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:387cbfdcde2f2353f19c2f66bbb52406d06ed77519ac7ee21be0232147c2592d", size = 44019 }, - { url = "https://files.pythonhosted.org/packages/ef/a2/c8131383f1e66adad5f6ecfcce383d584ca94055a34d683bbb24ac5f2f1c/frozenlist-1.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3dbf9952c4bb0e90e98aec1bd992b3318685005702656bc6f67c1a32b76787f2", size = 81424 }, - { url = "https://files.pythonhosted.org/packages/4c/9d/02754159955088cb52567337d1113f945b9e444c4960771ea90eb73de8db/frozenlist-1.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1f5906d3359300b8a9bb194239491122e6cf1444c2efb88865426f170c262cdb", size = 47952 }, - { url = "https://files.pythonhosted.org/packages/01/7a/0046ef1bd6699b40acd2067ed6d6670b4db2f425c56980fa21c982c2a9db/frozenlist-1.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3dabd5a8f84573c8d10d8859a50ea2dec01eea372031929871368c09fa103478", size = 46688 }, - { url = "https://files.pythonhosted.org/packages/d6/a2/a910bafe29c86997363fb4c02069df4ff0b5bc39d33c5198b4e9dd42d8f8/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa57daa5917f1738064f302bf2626281a1cb01920c32f711fbc7bc36111058a8", size = 243084 }, - { url = "https://files.pythonhosted.org/packages/64/3e/5036af9d5031374c64c387469bfcc3af537fc0f5b1187d83a1cf6fab1639/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c193dda2b6d49f4c4398962810fa7d7c78f032bf45572b3e04dd5249dff27e08", size = 233524 }, - { url = "https://files.pythonhosted.org/packages/06/39/6a17b7c107a2887e781a48ecf20ad20f1c39d94b2a548c83615b5b879f28/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe2b675cf0aaa6d61bf8fbffd3c274b3c9b7b1623beb3809df8a81399a4a9c4", size = 248493 }, - { url = "https://files.pythonhosted.org/packages/be/00/711d1337c7327d88c44d91dd0f556a1c47fb99afc060ae0ef66b4d24793d/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8fc5d5cda37f62b262405cf9652cf0856839c4be8ee41be0afe8858f17f4c94b", size = 244116 }, - { url = "https://files.pythonhosted.org/packages/24/fe/74e6ec0639c115df13d5850e75722750adabdc7de24e37e05a40527ca539/frozenlist-1.7.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d5ce521d1dd7d620198829b87ea002956e4319002ef0bc8d3e6d045cb4646e", size = 224557 }, - { url = "https://files.pythonhosted.org/packages/8d/db/48421f62a6f77c553575201e89048e97198046b793f4a089c79a6e3268bd/frozenlist-1.7.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:488d0a7d6a0008ca0db273c542098a0fa9e7dfaa7e57f70acef43f32b3f69dca", size = 241820 }, - { url = "https://files.pythonhosted.org/packages/1d/fa/cb4a76bea23047c8462976ea7b7a2bf53997a0ca171302deae9d6dd12096/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:15a7eaba63983d22c54d255b854e8108e7e5f3e89f647fc854bd77a237e767df", size = 236542 }, - { url = "https://files.pythonhosted.org/packages/5d/32/476a4b5cfaa0ec94d3f808f193301debff2ea42288a099afe60757ef6282/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1eaa7e9c6d15df825bf255649e05bd8a74b04a4d2baa1ae46d9c2d00b2ca2cb5", size = 249350 }, - { url = "https://files.pythonhosted.org/packages/8d/ba/9a28042f84a6bf8ea5dbc81cfff8eaef18d78b2a1ad9d51c7bc5b029ad16/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4389e06714cfa9d47ab87f784a7c5be91d3934cd6e9a7b85beef808297cc025", size = 225093 }, - { url = "https://files.pythonhosted.org/packages/bc/29/3a32959e68f9cf000b04e79ba574527c17e8842e38c91d68214a37455786/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:73bd45e1488c40b63fe5a7df892baf9e2a4d4bb6409a2b3b78ac1c6236178e01", size = 245482 }, - { url = "https://files.pythonhosted.org/packages/80/e8/edf2f9e00da553f07f5fa165325cfc302dead715cab6ac8336a5f3d0adc2/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99886d98e1643269760e5fe0df31e5ae7050788dd288947f7f007209b8c33f08", size = 249590 }, - { url = "https://files.pythonhosted.org/packages/1c/80/9a0eb48b944050f94cc51ee1c413eb14a39543cc4f760ed12657a5a3c45a/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:290a172aae5a4c278c6da8a96222e6337744cd9c77313efe33d5670b9f65fc43", size = 237785 }, - { url = "https://files.pythonhosted.org/packages/f3/74/87601e0fb0369b7a2baf404ea921769c53b7ae00dee7dcfe5162c8c6dbf0/frozenlist-1.7.0-cp312-cp312-win32.whl", hash = "sha256:426c7bc70e07cfebc178bc4c2bf2d861d720c4fff172181eeb4a4c41d4ca2ad3", size = 39487 }, - { url = "https://files.pythonhosted.org/packages/0b/15/c026e9a9fc17585a9d461f65d8593d281fedf55fbf7eb53f16c6df2392f9/frozenlist-1.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:563b72efe5da92e02eb68c59cb37205457c977aa7a449ed1b37e6939e5c47c6a", size = 43874 }, - { url = "https://files.pythonhosted.org/packages/24/90/6b2cebdabdbd50367273c20ff6b57a3dfa89bd0762de02c3a1eb42cb6462/frozenlist-1.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee80eeda5e2a4e660651370ebffd1286542b67e268aa1ac8d6dbe973120ef7ee", size = 79791 }, - { url = "https://files.pythonhosted.org/packages/83/2e/5b70b6a3325363293fe5fc3ae74cdcbc3e996c2a11dde2fd9f1fb0776d19/frozenlist-1.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d1a81c85417b914139e3a9b995d4a1c84559afc839a93cf2cb7f15e6e5f6ed2d", size = 47165 }, - { url = "https://files.pythonhosted.org/packages/f4/25/a0895c99270ca6966110f4ad98e87e5662eab416a17e7fd53c364bf8b954/frozenlist-1.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cbb65198a9132ebc334f237d7b0df163e4de83fb4f2bdfe46c1e654bdb0c5d43", size = 45881 }, - { url = "https://files.pythonhosted.org/packages/19/7c/71bb0bbe0832793c601fff68cd0cf6143753d0c667f9aec93d3c323f4b55/frozenlist-1.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dab46c723eeb2c255a64f9dc05b8dd601fde66d6b19cdb82b2e09cc6ff8d8b5d", size = 232409 }, - { url = "https://files.pythonhosted.org/packages/c0/45/ed2798718910fe6eb3ba574082aaceff4528e6323f9a8570be0f7028d8e9/frozenlist-1.7.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6aeac207a759d0dedd2e40745575ae32ab30926ff4fa49b1635def65806fddee", size = 225132 }, - { url = "https://files.pythonhosted.org/packages/ba/e2/8417ae0f8eacb1d071d4950f32f229aa6bf68ab69aab797b72a07ea68d4f/frozenlist-1.7.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bd8c4e58ad14b4fa7802b8be49d47993182fdd4023393899632c88fd8cd994eb", size = 237638 }, - { url = "https://files.pythonhosted.org/packages/f8/b7/2ace5450ce85f2af05a871b8c8719b341294775a0a6c5585d5e6170f2ce7/frozenlist-1.7.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04fb24d104f425da3540ed83cbfc31388a586a7696142004c577fa61c6298c3f", size = 233539 }, - { url = "https://files.pythonhosted.org/packages/46/b9/6989292c5539553dba63f3c83dc4598186ab2888f67c0dc1d917e6887db6/frozenlist-1.7.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a5c505156368e4ea6b53b5ac23c92d7edc864537ff911d2fb24c140bb175e60", size = 215646 }, - { url = "https://files.pythonhosted.org/packages/72/31/bc8c5c99c7818293458fe745dab4fd5730ff49697ccc82b554eb69f16a24/frozenlist-1.7.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bd7eb96a675f18aa5c553eb7ddc24a43c8c18f22e1f9925528128c052cdbe00", size = 232233 }, - { url = "https://files.pythonhosted.org/packages/59/52/460db4d7ba0811b9ccb85af996019f5d70831f2f5f255f7cc61f86199795/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:05579bf020096fe05a764f1f84cd104a12f78eaab68842d036772dc6d4870b4b", size = 227996 }, - { url = "https://files.pythonhosted.org/packages/ba/c9/f4b39e904c03927b7ecf891804fd3b4df3db29b9e487c6418e37988d6e9d/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:376b6222d114e97eeec13d46c486facd41d4f43bab626b7c3f6a8b4e81a5192c", size = 242280 }, - { url = "https://files.pythonhosted.org/packages/b8/33/3f8d6ced42f162d743e3517781566b8481322be321b486d9d262adf70bfb/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0aa7e176ebe115379b5b1c95b4096fb1c17cce0847402e227e712c27bdb5a949", size = 217717 }, - { url = "https://files.pythonhosted.org/packages/3e/e8/ad683e75da6ccef50d0ab0c2b2324b32f84fc88ceee778ed79b8e2d2fe2e/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3fbba20e662b9c2130dc771e332a99eff5da078b2b2648153a40669a6d0e36ca", size = 236644 }, - { url = "https://files.pythonhosted.org/packages/b2/14/8d19ccdd3799310722195a72ac94ddc677541fb4bef4091d8e7775752360/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f3f4410a0a601d349dd406b5713fec59b4cee7e71678d5b17edda7f4655a940b", size = 238879 }, - { url = "https://files.pythonhosted.org/packages/ce/13/c12bf657494c2fd1079a48b2db49fa4196325909249a52d8f09bc9123fd7/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e2cdfaaec6a2f9327bf43c933c0319a7c429058e8537c508964a133dffee412e", size = 232502 }, - { url = "https://files.pythonhosted.org/packages/d7/8b/e7f9dfde869825489382bc0d512c15e96d3964180c9499efcec72e85db7e/frozenlist-1.7.0-cp313-cp313-win32.whl", hash = "sha256:5fc4df05a6591c7768459caba1b342d9ec23fa16195e744939ba5914596ae3e1", size = 39169 }, - { url = "https://files.pythonhosted.org/packages/35/89/a487a98d94205d85745080a37860ff5744b9820a2c9acbcdd9440bfddf98/frozenlist-1.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:52109052b9791a3e6b5d1b65f4b909703984b770694d3eb64fad124c835d7cba", size = 43219 }, - { url = "https://files.pythonhosted.org/packages/56/d5/5c4cf2319a49eddd9dd7145e66c4866bdc6f3dbc67ca3d59685149c11e0d/frozenlist-1.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a6f86e4193bb0e235ef6ce3dde5cbabed887e0b11f516ce8a0f4d3b33078ec2d", size = 84345 }, - { url = "https://files.pythonhosted.org/packages/a4/7d/ec2c1e1dc16b85bc9d526009961953df9cec8481b6886debb36ec9107799/frozenlist-1.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:82d664628865abeb32d90ae497fb93df398a69bb3434463d172b80fc25b0dd7d", size = 48880 }, - { url = "https://files.pythonhosted.org/packages/69/86/f9596807b03de126e11e7d42ac91e3d0b19a6599c714a1989a4e85eeefc4/frozenlist-1.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:912a7e8375a1c9a68325a902f3953191b7b292aa3c3fb0d71a216221deca460b", size = 48498 }, - { url = "https://files.pythonhosted.org/packages/5e/cb/df6de220f5036001005f2d726b789b2c0b65f2363b104bbc16f5be8084f8/frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9537c2777167488d539bc5de2ad262efc44388230e5118868e172dd4a552b146", size = 292296 }, - { url = "https://files.pythonhosted.org/packages/83/1f/de84c642f17c8f851a2905cee2dae401e5e0daca9b5ef121e120e19aa825/frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f34560fb1b4c3e30ba35fa9a13894ba39e5acfc5f60f57d8accde65f46cc5e74", size = 273103 }, - { url = "https://files.pythonhosted.org/packages/88/3c/c840bfa474ba3fa13c772b93070893c6e9d5c0350885760376cbe3b6c1b3/frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:acd03d224b0175f5a850edc104ac19040d35419eddad04e7cf2d5986d98427f1", size = 292869 }, - { url = "https://files.pythonhosted.org/packages/a6/1c/3efa6e7d5a39a1d5ef0abeb51c48fb657765794a46cf124e5aca2c7a592c/frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2038310bc582f3d6a09b3816ab01737d60bf7b1ec70f5356b09e84fb7408ab1", size = 291467 }, - { url = "https://files.pythonhosted.org/packages/4f/00/d5c5e09d4922c395e2f2f6b79b9a20dab4b67daaf78ab92e7729341f61f6/frozenlist-1.7.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8c05e4c8e5f36e5e088caa1bf78a687528f83c043706640a92cb76cd6999384", size = 266028 }, - { url = "https://files.pythonhosted.org/packages/4e/27/72765be905619dfde25a7f33813ac0341eb6b076abede17a2e3fbfade0cb/frozenlist-1.7.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:765bb588c86e47d0b68f23c1bee323d4b703218037765dcf3f25c838c6fecceb", size = 284294 }, - { url = "https://files.pythonhosted.org/packages/88/67/c94103a23001b17808eb7dd1200c156bb69fb68e63fcf0693dde4cd6228c/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:32dc2e08c67d86d0969714dd484fd60ff08ff81d1a1e40a77dd34a387e6ebc0c", size = 281898 }, - { url = "https://files.pythonhosted.org/packages/42/34/a3e2c00c00f9e2a9db5653bca3fec306349e71aff14ae45ecc6d0951dd24/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:c0303e597eb5a5321b4de9c68e9845ac8f290d2ab3f3e2c864437d3c5a30cd65", size = 290465 }, - { url = "https://files.pythonhosted.org/packages/bb/73/f89b7fbce8b0b0c095d82b008afd0590f71ccb3dee6eee41791cf8cd25fd/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:a47f2abb4e29b3a8d0b530f7c3598badc6b134562b1a5caee867f7c62fee51e3", size = 266385 }, - { url = "https://files.pythonhosted.org/packages/cd/45/e365fdb554159462ca12df54bc59bfa7a9a273ecc21e99e72e597564d1ae/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:3d688126c242a6fabbd92e02633414d40f50bb6002fa4cf995a1d18051525657", size = 288771 }, - { url = "https://files.pythonhosted.org/packages/00/11/47b6117002a0e904f004d70ec5194fe9144f117c33c851e3d51c765962d0/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:4e7e9652b3d367c7bd449a727dc79d5043f48b88d0cbfd4f9f1060cf2b414104", size = 288206 }, - { url = "https://files.pythonhosted.org/packages/40/37/5f9f3c3fd7f7746082ec67bcdc204db72dad081f4f83a503d33220a92973/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1a85e345b4c43db8b842cab1feb41be5cc0b10a1830e6295b69d7310f99becaf", size = 282620 }, - { url = "https://files.pythonhosted.org/packages/0b/31/8fbc5af2d183bff20f21aa743b4088eac4445d2bb1cdece449ae80e4e2d1/frozenlist-1.7.0-cp313-cp313t-win32.whl", hash = "sha256:3a14027124ddb70dfcee5148979998066897e79f89f64b13328595c4bdf77c81", size = 43059 }, - { url = "https://files.pythonhosted.org/packages/bb/ed/41956f52105b8dbc26e457c5705340c67c8cc2b79f394b79bffc09d0e938/frozenlist-1.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3bf8010d71d4507775f658e9823210b7427be36625b387221642725b515dcf3e", size = 47516 }, - { url = "https://files.pythonhosted.org/packages/ee/45/b82e3c16be2182bff01179db177fe144d58b5dc787a7d4492c6ed8b9317f/frozenlist-1.7.0-py3-none-any.whl", hash = "sha256:9a5af342e34f7e97caf8c995864c7a396418ae2859cc6fdf1b1073020d516a7e", size = 13106 }, +sdist = { url = "https://files.pythonhosted.org/packages/79/b1/b64018016eeb087db503b038296fd782586432b9c077fc5c7839e9cb6ef6/frozenlist-1.7.0.tar.gz", hash = "sha256:2e310d81923c2437ea8670467121cc3e9b0f76d3043cc1d2331d56c7fb7a3a8f", size = 45078, upload-time = "2025-06-09T23:02:35.538Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/7e/803dde33760128acd393a27eb002f2020ddb8d99d30a44bfbaab31c5f08a/frozenlist-1.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:aa51e147a66b2d74de1e6e2cf5921890de6b0f4820b257465101d7f37b49fb5a", size = 82251, upload-time = "2025-06-09T23:00:16.279Z" }, + { url = "https://files.pythonhosted.org/packages/75/a9/9c2c5760b6ba45eae11334db454c189d43d34a4c0b489feb2175e5e64277/frozenlist-1.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9b35db7ce1cd71d36ba24f80f0c9e7cff73a28d7a74e91fe83e23d27c7828750", size = 48183, upload-time = "2025-06-09T23:00:17.698Z" }, + { url = "https://files.pythonhosted.org/packages/47/be/4038e2d869f8a2da165f35a6befb9158c259819be22eeaf9c9a8f6a87771/frozenlist-1.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:34a69a85e34ff37791e94542065c8416c1afbf820b68f720452f636d5fb990cd", size = 47107, upload-time = "2025-06-09T23:00:18.952Z" }, + { url = "https://files.pythonhosted.org/packages/79/26/85314b8a83187c76a37183ceed886381a5f992975786f883472fcb6dc5f2/frozenlist-1.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a646531fa8d82c87fe4bb2e596f23173caec9185bfbca5d583b4ccfb95183e2", size = 237333, upload-time = "2025-06-09T23:00:20.275Z" }, + { url = "https://files.pythonhosted.org/packages/1f/fd/e5b64f7d2c92a41639ffb2ad44a6a82f347787abc0c7df5f49057cf11770/frozenlist-1.7.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:79b2ffbba483f4ed36a0f236ccb85fbb16e670c9238313709638167670ba235f", size = 231724, upload-time = "2025-06-09T23:00:21.705Z" }, + { url = "https://files.pythonhosted.org/packages/20/fb/03395c0a43a5976af4bf7534759d214405fbbb4c114683f434dfdd3128ef/frozenlist-1.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a26f205c9ca5829cbf82bb2a84b5c36f7184c4316617d7ef1b271a56720d6b30", size = 245842, upload-time = "2025-06-09T23:00:23.148Z" }, + { url = "https://files.pythonhosted.org/packages/d0/15/c01c8e1dffdac5d9803507d824f27aed2ba76b6ed0026fab4d9866e82f1f/frozenlist-1.7.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bcacfad3185a623fa11ea0e0634aac7b691aa925d50a440f39b458e41c561d98", size = 239767, upload-time = "2025-06-09T23:00:25.103Z" }, + { url = "https://files.pythonhosted.org/packages/14/99/3f4c6fe882c1f5514b6848aa0a69b20cb5e5d8e8f51a339d48c0e9305ed0/frozenlist-1.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72c1b0fe8fe451b34f12dce46445ddf14bd2a5bcad7e324987194dc8e3a74c86", size = 224130, upload-time = "2025-06-09T23:00:27.061Z" }, + { url = "https://files.pythonhosted.org/packages/4d/83/220a374bd7b2aeba9d0725130665afe11de347d95c3620b9b82cc2fcab97/frozenlist-1.7.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61d1a5baeaac6c0798ff6edfaeaa00e0e412d49946c53fae8d4b8e8b3566c4ae", size = 235301, upload-time = "2025-06-09T23:00:29.02Z" }, + { url = "https://files.pythonhosted.org/packages/03/3c/3e3390d75334a063181625343e8daab61b77e1b8214802cc4e8a1bb678fc/frozenlist-1.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7edf5c043c062462f09b6820de9854bf28cc6cc5b6714b383149745e287181a8", size = 234606, upload-time = "2025-06-09T23:00:30.514Z" }, + { url = "https://files.pythonhosted.org/packages/23/1e/58232c19608b7a549d72d9903005e2d82488f12554a32de2d5fb59b9b1ba/frozenlist-1.7.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:d50ac7627b3a1bd2dcef6f9da89a772694ec04d9a61b66cf87f7d9446b4a0c31", size = 248372, upload-time = "2025-06-09T23:00:31.966Z" }, + { url = "https://files.pythonhosted.org/packages/c0/a4/e4a567e01702a88a74ce8a324691e62a629bf47d4f8607f24bf1c7216e7f/frozenlist-1.7.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ce48b2fece5aeb45265bb7a58259f45027db0abff478e3077e12b05b17fb9da7", size = 229860, upload-time = "2025-06-09T23:00:33.375Z" }, + { url = "https://files.pythonhosted.org/packages/73/a6/63b3374f7d22268b41a9db73d68a8233afa30ed164c46107b33c4d18ecdd/frozenlist-1.7.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:fe2365ae915a1fafd982c146754e1de6ab3478def8a59c86e1f7242d794f97d5", size = 245893, upload-time = "2025-06-09T23:00:35.002Z" }, + { url = "https://files.pythonhosted.org/packages/6d/eb/d18b3f6e64799a79673c4ba0b45e4cfbe49c240edfd03a68be20002eaeaa/frozenlist-1.7.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:45a6f2fdbd10e074e8814eb98b05292f27bad7d1883afbe009d96abdcf3bc898", size = 246323, upload-time = "2025-06-09T23:00:36.468Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f5/720f3812e3d06cd89a1d5db9ff6450088b8f5c449dae8ffb2971a44da506/frozenlist-1.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:21884e23cffabb157a9dd7e353779077bf5b8f9a58e9b262c6caad2ef5f80a56", size = 233149, upload-time = "2025-06-09T23:00:37.963Z" }, + { url = "https://files.pythonhosted.org/packages/69/68/03efbf545e217d5db8446acfd4c447c15b7c8cf4dbd4a58403111df9322d/frozenlist-1.7.0-cp311-cp311-win32.whl", hash = "sha256:284d233a8953d7b24f9159b8a3496fc1ddc00f4db99c324bd5fb5f22d8698ea7", size = 39565, upload-time = "2025-06-09T23:00:39.753Z" }, + { url = "https://files.pythonhosted.org/packages/58/17/fe61124c5c333ae87f09bb67186d65038834a47d974fc10a5fadb4cc5ae1/frozenlist-1.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:387cbfdcde2f2353f19c2f66bbb52406d06ed77519ac7ee21be0232147c2592d", size = 44019, upload-time = "2025-06-09T23:00:40.988Z" }, + { url = "https://files.pythonhosted.org/packages/ef/a2/c8131383f1e66adad5f6ecfcce383d584ca94055a34d683bbb24ac5f2f1c/frozenlist-1.7.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3dbf9952c4bb0e90e98aec1bd992b3318685005702656bc6f67c1a32b76787f2", size = 81424, upload-time = "2025-06-09T23:00:42.24Z" }, + { url = "https://files.pythonhosted.org/packages/4c/9d/02754159955088cb52567337d1113f945b9e444c4960771ea90eb73de8db/frozenlist-1.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1f5906d3359300b8a9bb194239491122e6cf1444c2efb88865426f170c262cdb", size = 47952, upload-time = "2025-06-09T23:00:43.481Z" }, + { url = "https://files.pythonhosted.org/packages/01/7a/0046ef1bd6699b40acd2067ed6d6670b4db2f425c56980fa21c982c2a9db/frozenlist-1.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3dabd5a8f84573c8d10d8859a50ea2dec01eea372031929871368c09fa103478", size = 46688, upload-time = "2025-06-09T23:00:44.793Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a2/a910bafe29c86997363fb4c02069df4ff0b5bc39d33c5198b4e9dd42d8f8/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa57daa5917f1738064f302bf2626281a1cb01920c32f711fbc7bc36111058a8", size = 243084, upload-time = "2025-06-09T23:00:46.125Z" }, + { url = "https://files.pythonhosted.org/packages/64/3e/5036af9d5031374c64c387469bfcc3af537fc0f5b1187d83a1cf6fab1639/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c193dda2b6d49f4c4398962810fa7d7c78f032bf45572b3e04dd5249dff27e08", size = 233524, upload-time = "2025-06-09T23:00:47.73Z" }, + { url = "https://files.pythonhosted.org/packages/06/39/6a17b7c107a2887e781a48ecf20ad20f1c39d94b2a548c83615b5b879f28/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe2b675cf0aaa6d61bf8fbffd3c274b3c9b7b1623beb3809df8a81399a4a9c4", size = 248493, upload-time = "2025-06-09T23:00:49.742Z" }, + { url = "https://files.pythonhosted.org/packages/be/00/711d1337c7327d88c44d91dd0f556a1c47fb99afc060ae0ef66b4d24793d/frozenlist-1.7.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8fc5d5cda37f62b262405cf9652cf0856839c4be8ee41be0afe8858f17f4c94b", size = 244116, upload-time = "2025-06-09T23:00:51.352Z" }, + { url = "https://files.pythonhosted.org/packages/24/fe/74e6ec0639c115df13d5850e75722750adabdc7de24e37e05a40527ca539/frozenlist-1.7.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0d5ce521d1dd7d620198829b87ea002956e4319002ef0bc8d3e6d045cb4646e", size = 224557, upload-time = "2025-06-09T23:00:52.855Z" }, + { url = "https://files.pythonhosted.org/packages/8d/db/48421f62a6f77c553575201e89048e97198046b793f4a089c79a6e3268bd/frozenlist-1.7.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:488d0a7d6a0008ca0db273c542098a0fa9e7dfaa7e57f70acef43f32b3f69dca", size = 241820, upload-time = "2025-06-09T23:00:54.43Z" }, + { url = "https://files.pythonhosted.org/packages/1d/fa/cb4a76bea23047c8462976ea7b7a2bf53997a0ca171302deae9d6dd12096/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:15a7eaba63983d22c54d255b854e8108e7e5f3e89f647fc854bd77a237e767df", size = 236542, upload-time = "2025-06-09T23:00:56.409Z" }, + { url = "https://files.pythonhosted.org/packages/5d/32/476a4b5cfaa0ec94d3f808f193301debff2ea42288a099afe60757ef6282/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1eaa7e9c6d15df825bf255649e05bd8a74b04a4d2baa1ae46d9c2d00b2ca2cb5", size = 249350, upload-time = "2025-06-09T23:00:58.468Z" }, + { url = "https://files.pythonhosted.org/packages/8d/ba/9a28042f84a6bf8ea5dbc81cfff8eaef18d78b2a1ad9d51c7bc5b029ad16/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4389e06714cfa9d47ab87f784a7c5be91d3934cd6e9a7b85beef808297cc025", size = 225093, upload-time = "2025-06-09T23:01:00.015Z" }, + { url = "https://files.pythonhosted.org/packages/bc/29/3a32959e68f9cf000b04e79ba574527c17e8842e38c91d68214a37455786/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:73bd45e1488c40b63fe5a7df892baf9e2a4d4bb6409a2b3b78ac1c6236178e01", size = 245482, upload-time = "2025-06-09T23:01:01.474Z" }, + { url = "https://files.pythonhosted.org/packages/80/e8/edf2f9e00da553f07f5fa165325cfc302dead715cab6ac8336a5f3d0adc2/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99886d98e1643269760e5fe0df31e5ae7050788dd288947f7f007209b8c33f08", size = 249590, upload-time = "2025-06-09T23:01:02.961Z" }, + { url = "https://files.pythonhosted.org/packages/1c/80/9a0eb48b944050f94cc51ee1c413eb14a39543cc4f760ed12657a5a3c45a/frozenlist-1.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:290a172aae5a4c278c6da8a96222e6337744cd9c77313efe33d5670b9f65fc43", size = 237785, upload-time = "2025-06-09T23:01:05.095Z" }, + { url = "https://files.pythonhosted.org/packages/f3/74/87601e0fb0369b7a2baf404ea921769c53b7ae00dee7dcfe5162c8c6dbf0/frozenlist-1.7.0-cp312-cp312-win32.whl", hash = "sha256:426c7bc70e07cfebc178bc4c2bf2d861d720c4fff172181eeb4a4c41d4ca2ad3", size = 39487, upload-time = "2025-06-09T23:01:06.54Z" }, + { url = "https://files.pythonhosted.org/packages/0b/15/c026e9a9fc17585a9d461f65d8593d281fedf55fbf7eb53f16c6df2392f9/frozenlist-1.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:563b72efe5da92e02eb68c59cb37205457c977aa7a449ed1b37e6939e5c47c6a", size = 43874, upload-time = "2025-06-09T23:01:07.752Z" }, + { url = "https://files.pythonhosted.org/packages/24/90/6b2cebdabdbd50367273c20ff6b57a3dfa89bd0762de02c3a1eb42cb6462/frozenlist-1.7.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee80eeda5e2a4e660651370ebffd1286542b67e268aa1ac8d6dbe973120ef7ee", size = 79791, upload-time = "2025-06-09T23:01:09.368Z" }, + { url = "https://files.pythonhosted.org/packages/83/2e/5b70b6a3325363293fe5fc3ae74cdcbc3e996c2a11dde2fd9f1fb0776d19/frozenlist-1.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d1a81c85417b914139e3a9b995d4a1c84559afc839a93cf2cb7f15e6e5f6ed2d", size = 47165, upload-time = "2025-06-09T23:01:10.653Z" }, + { url = "https://files.pythonhosted.org/packages/f4/25/a0895c99270ca6966110f4ad98e87e5662eab416a17e7fd53c364bf8b954/frozenlist-1.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cbb65198a9132ebc334f237d7b0df163e4de83fb4f2bdfe46c1e654bdb0c5d43", size = 45881, upload-time = "2025-06-09T23:01:12.296Z" }, + { url = "https://files.pythonhosted.org/packages/19/7c/71bb0bbe0832793c601fff68cd0cf6143753d0c667f9aec93d3c323f4b55/frozenlist-1.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dab46c723eeb2c255a64f9dc05b8dd601fde66d6b19cdb82b2e09cc6ff8d8b5d", size = 232409, upload-time = "2025-06-09T23:01:13.641Z" }, + { url = "https://files.pythonhosted.org/packages/c0/45/ed2798718910fe6eb3ba574082aaceff4528e6323f9a8570be0f7028d8e9/frozenlist-1.7.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6aeac207a759d0dedd2e40745575ae32ab30926ff4fa49b1635def65806fddee", size = 225132, upload-time = "2025-06-09T23:01:15.264Z" }, + { url = "https://files.pythonhosted.org/packages/ba/e2/8417ae0f8eacb1d071d4950f32f229aa6bf68ab69aab797b72a07ea68d4f/frozenlist-1.7.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bd8c4e58ad14b4fa7802b8be49d47993182fdd4023393899632c88fd8cd994eb", size = 237638, upload-time = "2025-06-09T23:01:16.752Z" }, + { url = "https://files.pythonhosted.org/packages/f8/b7/2ace5450ce85f2af05a871b8c8719b341294775a0a6c5585d5e6170f2ce7/frozenlist-1.7.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04fb24d104f425da3540ed83cbfc31388a586a7696142004c577fa61c6298c3f", size = 233539, upload-time = "2025-06-09T23:01:18.202Z" }, + { url = "https://files.pythonhosted.org/packages/46/b9/6989292c5539553dba63f3c83dc4598186ab2888f67c0dc1d917e6887db6/frozenlist-1.7.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a5c505156368e4ea6b53b5ac23c92d7edc864537ff911d2fb24c140bb175e60", size = 215646, upload-time = "2025-06-09T23:01:19.649Z" }, + { url = "https://files.pythonhosted.org/packages/72/31/bc8c5c99c7818293458fe745dab4fd5730ff49697ccc82b554eb69f16a24/frozenlist-1.7.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bd7eb96a675f18aa5c553eb7ddc24a43c8c18f22e1f9925528128c052cdbe00", size = 232233, upload-time = "2025-06-09T23:01:21.175Z" }, + { url = "https://files.pythonhosted.org/packages/59/52/460db4d7ba0811b9ccb85af996019f5d70831f2f5f255f7cc61f86199795/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:05579bf020096fe05a764f1f84cd104a12f78eaab68842d036772dc6d4870b4b", size = 227996, upload-time = "2025-06-09T23:01:23.098Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c9/f4b39e904c03927b7ecf891804fd3b4df3db29b9e487c6418e37988d6e9d/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:376b6222d114e97eeec13d46c486facd41d4f43bab626b7c3f6a8b4e81a5192c", size = 242280, upload-time = "2025-06-09T23:01:24.808Z" }, + { url = "https://files.pythonhosted.org/packages/b8/33/3f8d6ced42f162d743e3517781566b8481322be321b486d9d262adf70bfb/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:0aa7e176ebe115379b5b1c95b4096fb1c17cce0847402e227e712c27bdb5a949", size = 217717, upload-time = "2025-06-09T23:01:26.28Z" }, + { url = "https://files.pythonhosted.org/packages/3e/e8/ad683e75da6ccef50d0ab0c2b2324b32f84fc88ceee778ed79b8e2d2fe2e/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3fbba20e662b9c2130dc771e332a99eff5da078b2b2648153a40669a6d0e36ca", size = 236644, upload-time = "2025-06-09T23:01:27.887Z" }, + { url = "https://files.pythonhosted.org/packages/b2/14/8d19ccdd3799310722195a72ac94ddc677541fb4bef4091d8e7775752360/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f3f4410a0a601d349dd406b5713fec59b4cee7e71678d5b17edda7f4655a940b", size = 238879, upload-time = "2025-06-09T23:01:29.524Z" }, + { url = "https://files.pythonhosted.org/packages/ce/13/c12bf657494c2fd1079a48b2db49fa4196325909249a52d8f09bc9123fd7/frozenlist-1.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e2cdfaaec6a2f9327bf43c933c0319a7c429058e8537c508964a133dffee412e", size = 232502, upload-time = "2025-06-09T23:01:31.287Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8b/e7f9dfde869825489382bc0d512c15e96d3964180c9499efcec72e85db7e/frozenlist-1.7.0-cp313-cp313-win32.whl", hash = "sha256:5fc4df05a6591c7768459caba1b342d9ec23fa16195e744939ba5914596ae3e1", size = 39169, upload-time = "2025-06-09T23:01:35.503Z" }, + { url = "https://files.pythonhosted.org/packages/35/89/a487a98d94205d85745080a37860ff5744b9820a2c9acbcdd9440bfddf98/frozenlist-1.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:52109052b9791a3e6b5d1b65f4b909703984b770694d3eb64fad124c835d7cba", size = 43219, upload-time = "2025-06-09T23:01:36.784Z" }, + { url = "https://files.pythonhosted.org/packages/56/d5/5c4cf2319a49eddd9dd7145e66c4866bdc6f3dbc67ca3d59685149c11e0d/frozenlist-1.7.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a6f86e4193bb0e235ef6ce3dde5cbabed887e0b11f516ce8a0f4d3b33078ec2d", size = 84345, upload-time = "2025-06-09T23:01:38.295Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/ec2c1e1dc16b85bc9d526009961953df9cec8481b6886debb36ec9107799/frozenlist-1.7.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:82d664628865abeb32d90ae497fb93df398a69bb3434463d172b80fc25b0dd7d", size = 48880, upload-time = "2025-06-09T23:01:39.887Z" }, + { url = "https://files.pythonhosted.org/packages/69/86/f9596807b03de126e11e7d42ac91e3d0b19a6599c714a1989a4e85eeefc4/frozenlist-1.7.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:912a7e8375a1c9a68325a902f3953191b7b292aa3c3fb0d71a216221deca460b", size = 48498, upload-time = "2025-06-09T23:01:41.318Z" }, + { url = "https://files.pythonhosted.org/packages/5e/cb/df6de220f5036001005f2d726b789b2c0b65f2363b104bbc16f5be8084f8/frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9537c2777167488d539bc5de2ad262efc44388230e5118868e172dd4a552b146", size = 292296, upload-time = "2025-06-09T23:01:42.685Z" }, + { url = "https://files.pythonhosted.org/packages/83/1f/de84c642f17c8f851a2905cee2dae401e5e0daca9b5ef121e120e19aa825/frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f34560fb1b4c3e30ba35fa9a13894ba39e5acfc5f60f57d8accde65f46cc5e74", size = 273103, upload-time = "2025-06-09T23:01:44.166Z" }, + { url = "https://files.pythonhosted.org/packages/88/3c/c840bfa474ba3fa13c772b93070893c6e9d5c0350885760376cbe3b6c1b3/frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:acd03d224b0175f5a850edc104ac19040d35419eddad04e7cf2d5986d98427f1", size = 292869, upload-time = "2025-06-09T23:01:45.681Z" }, + { url = "https://files.pythonhosted.org/packages/a6/1c/3efa6e7d5a39a1d5ef0abeb51c48fb657765794a46cf124e5aca2c7a592c/frozenlist-1.7.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f2038310bc582f3d6a09b3816ab01737d60bf7b1ec70f5356b09e84fb7408ab1", size = 291467, upload-time = "2025-06-09T23:01:47.234Z" }, + { url = "https://files.pythonhosted.org/packages/4f/00/d5c5e09d4922c395e2f2f6b79b9a20dab4b67daaf78ab92e7729341f61f6/frozenlist-1.7.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b8c05e4c8e5f36e5e088caa1bf78a687528f83c043706640a92cb76cd6999384", size = 266028, upload-time = "2025-06-09T23:01:48.819Z" }, + { url = "https://files.pythonhosted.org/packages/4e/27/72765be905619dfde25a7f33813ac0341eb6b076abede17a2e3fbfade0cb/frozenlist-1.7.0-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:765bb588c86e47d0b68f23c1bee323d4b703218037765dcf3f25c838c6fecceb", size = 284294, upload-time = "2025-06-09T23:01:50.394Z" }, + { url = "https://files.pythonhosted.org/packages/88/67/c94103a23001b17808eb7dd1200c156bb69fb68e63fcf0693dde4cd6228c/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:32dc2e08c67d86d0969714dd484fd60ff08ff81d1a1e40a77dd34a387e6ebc0c", size = 281898, upload-time = "2025-06-09T23:01:52.234Z" }, + { url = "https://files.pythonhosted.org/packages/42/34/a3e2c00c00f9e2a9db5653bca3fec306349e71aff14ae45ecc6d0951dd24/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:c0303e597eb5a5321b4de9c68e9845ac8f290d2ab3f3e2c864437d3c5a30cd65", size = 290465, upload-time = "2025-06-09T23:01:53.788Z" }, + { url = "https://files.pythonhosted.org/packages/bb/73/f89b7fbce8b0b0c095d82b008afd0590f71ccb3dee6eee41791cf8cd25fd/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:a47f2abb4e29b3a8d0b530f7c3598badc6b134562b1a5caee867f7c62fee51e3", size = 266385, upload-time = "2025-06-09T23:01:55.769Z" }, + { url = "https://files.pythonhosted.org/packages/cd/45/e365fdb554159462ca12df54bc59bfa7a9a273ecc21e99e72e597564d1ae/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:3d688126c242a6fabbd92e02633414d40f50bb6002fa4cf995a1d18051525657", size = 288771, upload-time = "2025-06-09T23:01:57.4Z" }, + { url = "https://files.pythonhosted.org/packages/00/11/47b6117002a0e904f004d70ec5194fe9144f117c33c851e3d51c765962d0/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:4e7e9652b3d367c7bd449a727dc79d5043f48b88d0cbfd4f9f1060cf2b414104", size = 288206, upload-time = "2025-06-09T23:01:58.936Z" }, + { url = "https://files.pythonhosted.org/packages/40/37/5f9f3c3fd7f7746082ec67bcdc204db72dad081f4f83a503d33220a92973/frozenlist-1.7.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1a85e345b4c43db8b842cab1feb41be5cc0b10a1830e6295b69d7310f99becaf", size = 282620, upload-time = "2025-06-09T23:02:00.493Z" }, + { url = "https://files.pythonhosted.org/packages/0b/31/8fbc5af2d183bff20f21aa743b4088eac4445d2bb1cdece449ae80e4e2d1/frozenlist-1.7.0-cp313-cp313t-win32.whl", hash = "sha256:3a14027124ddb70dfcee5148979998066897e79f89f64b13328595c4bdf77c81", size = 43059, upload-time = "2025-06-09T23:02:02.072Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ed/41956f52105b8dbc26e457c5705340c67c8cc2b79f394b79bffc09d0e938/frozenlist-1.7.0-cp313-cp313t-win_amd64.whl", hash = "sha256:3bf8010d71d4507775f658e9823210b7427be36625b387221642725b515dcf3e", size = 47516, upload-time = "2025-06-09T23:02:03.779Z" }, + { url = "https://files.pythonhosted.org/packages/ee/45/b82e3c16be2182bff01179db177fe144d58b5dc787a7d4492c6ed8b9317f/frozenlist-1.7.0-py3-none-any.whl", hash = "sha256:9a5af342e34f7e97caf8c995864c7a396418ae2859cc6fdf1b1073020d516a7e", size = 13106, upload-time = "2025-06-09T23:02:34.204Z" }, ] [[package]] name = "fsspec" -version = "2025.5.1" +version = "2025.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/00/f7/27f15d41f0ed38e8fcc488584b57e902b331da7f7c6dcda53721b15838fc/fsspec-2025.5.1.tar.gz", hash = "sha256:2e55e47a540b91843b755e83ded97c6e897fa0942b11490113f09e9c443c2475", size = 303033 } +sdist = { url = "https://files.pythonhosted.org/packages/8b/02/0835e6ab9cfc03916fe3f78c0956cfcdb6ff2669ffa6651065d5ebf7fc98/fsspec-2025.7.0.tar.gz", hash = "sha256:786120687ffa54b8283d942929540d8bc5ccfa820deb555a2b5d0ed2b737bf58", size = 304432, upload-time = "2025-07-15T16:05:21.19Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/61/78c7b3851add1481b048b5fdc29067397a1784e2910592bc81bb3f608635/fsspec-2025.5.1-py3-none-any.whl", hash = "sha256:24d3a2e663d5fc735ab256263c4075f374a174c3410c0b25e5bd1970bceaa462", size = 199052 }, + { url = "https://files.pythonhosted.org/packages/2f/e0/014d5d9d7a4564cf1c40b5039bc882db69fd881111e03ab3657ac0b218e2/fsspec-2025.7.0-py3-none-any.whl", hash = "sha256:8b012e39f63c7d5f10474de957f3ab793b47b45ae7d39f2fb735f8bbe25c0e21", size = 199597, upload-time = "2025-07-15T16:05:19.529Z" }, ] [[package]] name = "furo" -version = "2024.8.6" +version = "2025.7.19" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "accessible-pygments" }, { name = "beautifulsoup4" }, { name = "pygments" }, { name = "sphinx" }, { name = "sphinx-basic-ng" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a0/e2/d351d69a9a9e4badb4a5be062c2d0e87bd9e6c23b5e57337fef14bef34c8/furo-2024.8.6.tar.gz", hash = "sha256:b63e4cee8abfc3136d3bc03a3d45a76a850bada4d6374d24c1716b0e01394a01", size = 1661506 } +sdist = { url = "https://files.pythonhosted.org/packages/d0/69/312cd100fa45ddaea5a588334d2defa331ff427bcb61f5fe2ae61bdc3762/furo-2025.7.19.tar.gz", hash = "sha256:4164b2cafcf4023a59bb3c594e935e2516f6b9d35e9a5ea83d8f6b43808fe91f", size = 1662054, upload-time = "2025-07-19T10:52:09.754Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/48/e791a7ed487dbb9729ef32bb5d1af16693d8925f4366befef54119b2e576/furo-2024.8.6-py3-none-any.whl", hash = "sha256:6cd97c58b47813d3619e63e9081169880fbe331f0ca883c871ff1f3f11814f5c", size = 341333 }, + { url = "https://files.pythonhosted.org/packages/3a/34/2b07b72bee02a63241d654f5d8af87a2de977c59638eec41ca356ab915cd/furo-2025.7.19-py3-none-any.whl", hash = "sha256:bdea869822dfd2b494ea84c0973937e35d1575af088b6721a29c7f7878adc9e3", size = 342175, upload-time = "2025-07-19T10:52:02.399Z" }, ] [[package]] name = "gcsfs" -version = "2025.5.1" +version = "2025.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -980,9 +995,9 @@ dependencies = [ { name = "google-cloud-storage" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/4a/47ad326cc74ccfd97e125c0087a36d516ed74c61f53e458067737378d0f2/gcsfs-2025.5.1.tar.gz", hash = "sha256:ba945530cf4857cd9d599ccb3ae729c65c39088880b11c4df1fecac30df5f3e3", size = 82173 } +sdist = { url = "https://files.pythonhosted.org/packages/5b/d7/5eafe9f09f1bb09433a473cef7984cd52c398592c8fd09974e0ad87cfea4/gcsfs-2025.7.0.tar.gz", hash = "sha256:ad3ff66cf189ae8fc375ac8a2af409003dbca02357621cb94a66e457e02ba420", size = 82659, upload-time = "2025-07-15T16:49:21.647Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/eb/9182e875592c48d282c5eab602000f0618817b9011b2b2925165e4b4b7f3/gcsfs-2025.5.1-py2.py3-none-any.whl", hash = "sha256:48712471ff71ac83d3e2152ba4dc232874698466e344d5e700feba06b0a0de7b", size = 36581 }, + { url = "https://files.pythonhosted.org/packages/21/f5/54bccbee01efbc25581db6aafefb6f6c277d880930f7a083b10052382463/gcsfs-2025.7.0-py2.py3-none-any.whl", hash = "sha256:653503331d58cb02bb34e725d4595d166e93f7f2f3ff88e4c66ef535ae66eae5", size = 36815, upload-time = "2025-07-15T16:49:20.333Z" }, ] [[package]] @@ -996,9 +1011,9 @@ dependencies = [ { name = "protobuf" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/dc/21/e9d043e88222317afdbdb567165fdbc3b0aad90064c7e0c9eb0ad9955ad8/google_api_core-2.25.1.tar.gz", hash = "sha256:d2aaa0b13c78c61cb3f4282c464c046e45fbd75755683c9c525e6e8f7ed0a5e8", size = 165443 } +sdist = { url = "https://files.pythonhosted.org/packages/dc/21/e9d043e88222317afdbdb567165fdbc3b0aad90064c7e0c9eb0ad9955ad8/google_api_core-2.25.1.tar.gz", hash = "sha256:d2aaa0b13c78c61cb3f4282c464c046e45fbd75755683c9c525e6e8f7ed0a5e8", size = 165443, upload-time = "2025-06-12T20:52:20.439Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/14/4b/ead00905132820b623732b175d66354e9d3e69fcf2a5dcdab780664e7896/google_api_core-2.25.1-py3-none-any.whl", hash = "sha256:8a2a56c1fef82987a524371f99f3bd0143702fecc670c72e600c1cda6bf8dbb7", size = 160807 }, + { url = "https://files.pythonhosted.org/packages/14/4b/ead00905132820b623732b175d66354e9d3e69fcf2a5dcdab780664e7896/google_api_core-2.25.1-py3-none-any.whl", hash = "sha256:8a2a56c1fef82987a524371f99f3bd0143702fecc670c72e600c1cda6bf8dbb7", size = 160807, upload-time = "2025-06-12T20:52:19.334Z" }, ] [[package]] @@ -1010,9 +1025,9 @@ dependencies = [ { name = "pyasn1-modules" }, { name = "rsa" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/9e/9b/e92ef23b84fa10a64ce4831390b7a4c2e53c0132568d99d4ae61d04c8855/google_auth-2.40.3.tar.gz", hash = "sha256:500c3a29adedeb36ea9cf24b8d10858e152f2412e3ca37829b3fa18e33d63b77", size = 281029 } +sdist = { url = "https://files.pythonhosted.org/packages/9e/9b/e92ef23b84fa10a64ce4831390b7a4c2e53c0132568d99d4ae61d04c8855/google_auth-2.40.3.tar.gz", hash = "sha256:500c3a29adedeb36ea9cf24b8d10858e152f2412e3ca37829b3fa18e33d63b77", size = 281029, upload-time = "2025-06-04T18:04:57.577Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/63/b19553b658a1692443c62bd07e5868adaa0ad746a0751ba62c59568cd45b/google_auth-2.40.3-py2.py3-none-any.whl", hash = "sha256:1370d4593e86213563547f97a92752fc658456fe4514c809544f330fed45a7ca", size = 216137 }, + { url = "https://files.pythonhosted.org/packages/17/63/b19553b658a1692443c62bd07e5868adaa0ad746a0751ba62c59568cd45b/google_auth-2.40.3-py2.py3-none-any.whl", hash = "sha256:1370d4593e86213563547f97a92752fc658456fe4514c809544f330fed45a7ca", size = 216137, upload-time = "2025-06-04T18:04:55.573Z" }, ] [[package]] @@ -1023,9 +1038,9 @@ dependencies = [ { name = "google-auth" }, { name = "requests-oauthlib" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fb/87/e10bf24f7bcffc1421b84d6f9c3377c30ec305d082cd737ddaa6d8f77f7c/google_auth_oauthlib-1.2.2.tar.gz", hash = "sha256:11046fb8d3348b296302dd939ace8af0a724042e8029c1b872d87fabc9f41684", size = 20955 } +sdist = { url = "https://files.pythonhosted.org/packages/fb/87/e10bf24f7bcffc1421b84d6f9c3377c30ec305d082cd737ddaa6d8f77f7c/google_auth_oauthlib-1.2.2.tar.gz", hash = "sha256:11046fb8d3348b296302dd939ace8af0a724042e8029c1b872d87fabc9f41684", size = 20955, upload-time = "2025-04-22T16:40:29.172Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ac/84/40ee070be95771acd2f4418981edb834979424565c3eec3cd88b6aa09d24/google_auth_oauthlib-1.2.2-py3-none-any.whl", hash = "sha256:fd619506f4b3908b5df17b65f39ca8d66ea56986e5472eb5978fd8f3786f00a2", size = 19072 }, + { url = "https://files.pythonhosted.org/packages/ac/84/40ee070be95771acd2f4418981edb834979424565c3eec3cd88b6aa09d24/google_auth_oauthlib-1.2.2-py3-none-any.whl", hash = "sha256:fd619506f4b3908b5df17b65f39ca8d66ea56986e5472eb5978fd8f3786f00a2", size = 19072, upload-time = "2025-04-22T16:40:28.174Z" }, ] [[package]] @@ -1036,9 +1051,9 @@ dependencies = [ { name = "google-api-core" }, { name = "google-auth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d6/b8/2b53838d2acd6ec6168fd284a990c76695e84c65deee79c9f3a4276f6b4f/google_cloud_core-2.4.3.tar.gz", hash = "sha256:1fab62d7102844b278fe6dead3af32408b1df3eb06f5c7e8634cbd40edc4da53", size = 35861 } +sdist = { url = "https://files.pythonhosted.org/packages/d6/b8/2b53838d2acd6ec6168fd284a990c76695e84c65deee79c9f3a4276f6b4f/google_cloud_core-2.4.3.tar.gz", hash = "sha256:1fab62d7102844b278fe6dead3af32408b1df3eb06f5c7e8634cbd40edc4da53", size = 35861, upload-time = "2025-03-10T21:05:38.948Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/86/bda7241a8da2d28a754aad2ba0f6776e35b67e37c36ae0c45d49370f1014/google_cloud_core-2.4.3-py2.py3-none-any.whl", hash = "sha256:5130f9f4c14b4fafdff75c79448f9495cfade0d8775facf1b09c3bf67e027f6e", size = 29348 }, + { url = "https://files.pythonhosted.org/packages/40/86/bda7241a8da2d28a754aad2ba0f6776e35b67e37c36ae0c45d49370f1014/google_cloud_core-2.4.3-py2.py3-none-any.whl", hash = "sha256:5130f9f4c14b4fafdff75c79448f9495cfade0d8775facf1b09c3bf67e027f6e", size = 29348, upload-time = "2025-03-10T21:05:37.785Z" }, ] [[package]] @@ -1053,36 +1068,36 @@ dependencies = [ { name = "google-resumable-media" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/52/5b/6d4627484248e018a926dde114c4034656570da9c1c438e3db061fa42de5/google_cloud_storage-3.2.0.tar.gz", hash = "sha256:decca843076036f45633198c125d1861ffbf47ebf5c0e3b98dcb9b2db155896c", size = 7669611 } +sdist = { url = "https://files.pythonhosted.org/packages/52/5b/6d4627484248e018a926dde114c4034656570da9c1c438e3db061fa42de5/google_cloud_storage-3.2.0.tar.gz", hash = "sha256:decca843076036f45633198c125d1861ffbf47ebf5c0e3b98dcb9b2db155896c", size = 7669611, upload-time = "2025-07-07T05:14:06.764Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/48/823ce62cf29d04db6508971a0db13a72c1c9faf67cea2c206b1c9c9f1f02/google_cloud_storage-3.2.0-py3-none-any.whl", hash = "sha256:ff7a9a49666954a7c3d1598291220c72d3b9e49d9dfcf9dfaecb301fc4fb0b24", size = 176133 }, + { url = "https://files.pythonhosted.org/packages/be/48/823ce62cf29d04db6508971a0db13a72c1c9faf67cea2c206b1c9c9f1f02/google_cloud_storage-3.2.0-py3-none-any.whl", hash = "sha256:ff7a9a49666954a7c3d1598291220c72d3b9e49d9dfcf9dfaecb301fc4fb0b24", size = 176133, upload-time = "2025-07-07T05:14:05.059Z" }, ] [[package]] name = "google-crc32c" version = "1.7.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/19/ae/87802e6d9f9d69adfaedfcfd599266bf386a54d0be058b532d04c794f76d/google_crc32c-1.7.1.tar.gz", hash = "sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472", size = 14495 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/94/220139ea87822b6fdfdab4fb9ba81b3fff7ea2c82e2af34adc726085bffc/google_crc32c-1.7.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06", size = 30468 }, - { url = "https://files.pythonhosted.org/packages/94/97/789b23bdeeb9d15dc2904660463ad539d0318286d7633fe2760c10ed0c1c/google_crc32c-1.7.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9", size = 30313 }, - { url = "https://files.pythonhosted.org/packages/81/b8/976a2b843610c211e7ccb3e248996a61e87dbb2c09b1499847e295080aec/google_crc32c-1.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77", size = 33048 }, - { url = "https://files.pythonhosted.org/packages/c9/16/a3842c2cf591093b111d4a5e2bfb478ac6692d02f1b386d2a33283a19dc9/google_crc32c-1.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53", size = 32669 }, - { url = "https://files.pythonhosted.org/packages/04/17/ed9aba495916fcf5fe4ecb2267ceb851fc5f273c4e4625ae453350cfd564/google_crc32c-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d", size = 33476 }, - { url = "https://files.pythonhosted.org/packages/dd/b7/787e2453cf8639c94b3d06c9d61f512234a82e1d12d13d18584bd3049904/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194", size = 30470 }, - { url = "https://files.pythonhosted.org/packages/ed/b4/6042c2b0cbac3ec3a69bb4c49b28d2f517b7a0f4a0232603c42c58e22b44/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e", size = 30315 }, - { url = "https://files.pythonhosted.org/packages/29/ad/01e7a61a5d059bc57b702d9ff6a18b2585ad97f720bd0a0dbe215df1ab0e/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337", size = 33180 }, - { url = "https://files.pythonhosted.org/packages/3b/a5/7279055cf004561894ed3a7bfdf5bf90a53f28fadd01af7cd166e88ddf16/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65", size = 32794 }, - { url = "https://files.pythonhosted.org/packages/0f/d6/77060dbd140c624e42ae3ece3df53b9d811000729a5c821b9fd671ceaac6/google_crc32c-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6", size = 33477 }, - { url = "https://files.pythonhosted.org/packages/8b/72/b8d785e9184ba6297a8620c8a37cf6e39b81a8ca01bb0796d7cbb28b3386/google_crc32c-1.7.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35", size = 30467 }, - { url = "https://files.pythonhosted.org/packages/34/25/5f18076968212067c4e8ea95bf3b69669f9fc698476e5f5eb97d5b37999f/google_crc32c-1.7.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638", size = 30309 }, - { url = "https://files.pythonhosted.org/packages/92/83/9228fe65bf70e93e419f38bdf6c5ca5083fc6d32886ee79b450ceefd1dbd/google_crc32c-1.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb", size = 33133 }, - { url = "https://files.pythonhosted.org/packages/c3/ca/1ea2fd13ff9f8955b85e7956872fdb7050c4ace8a2306a6d177edb9cf7fe/google_crc32c-1.7.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6", size = 32773 }, - { url = "https://files.pythonhosted.org/packages/89/32/a22a281806e3ef21b72db16f948cad22ec68e4bdd384139291e00ff82fe2/google_crc32c-1.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db", size = 33475 }, - { url = "https://files.pythonhosted.org/packages/b8/c5/002975aff514e57fc084ba155697a049b3f9b52225ec3bc0f542871dd524/google_crc32c-1.7.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3", size = 33243 }, - { url = "https://files.pythonhosted.org/packages/61/cb/c585282a03a0cea70fcaa1bf55d5d702d0f2351094d663ec3be1c6c67c52/google_crc32c-1.7.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9", size = 32870 }, - { url = "https://files.pythonhosted.org/packages/16/1b/1693372bf423ada422f80fd88260dbfd140754adb15cbc4d7e9a68b1cb8e/google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48", size = 28241 }, - { url = "https://files.pythonhosted.org/packages/fd/3c/2a19a60a473de48717b4efb19398c3f914795b64a96cf3fbe82588044f78/google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82", size = 28048 }, +sdist = { url = "https://files.pythonhosted.org/packages/19/ae/87802e6d9f9d69adfaedfcfd599266bf386a54d0be058b532d04c794f76d/google_crc32c-1.7.1.tar.gz", hash = "sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472", size = 14495, upload-time = "2025-03-26T14:29:13.32Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/94/220139ea87822b6fdfdab4fb9ba81b3fff7ea2c82e2af34adc726085bffc/google_crc32c-1.7.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06", size = 30468, upload-time = "2025-03-26T14:32:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/94/97/789b23bdeeb9d15dc2904660463ad539d0318286d7633fe2760c10ed0c1c/google_crc32c-1.7.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9", size = 30313, upload-time = "2025-03-26T14:57:38.758Z" }, + { url = "https://files.pythonhosted.org/packages/81/b8/976a2b843610c211e7ccb3e248996a61e87dbb2c09b1499847e295080aec/google_crc32c-1.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77", size = 33048, upload-time = "2025-03-26T14:41:30.679Z" }, + { url = "https://files.pythonhosted.org/packages/c9/16/a3842c2cf591093b111d4a5e2bfb478ac6692d02f1b386d2a33283a19dc9/google_crc32c-1.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53", size = 32669, upload-time = "2025-03-26T14:41:31.432Z" }, + { url = "https://files.pythonhosted.org/packages/04/17/ed9aba495916fcf5fe4ecb2267ceb851fc5f273c4e4625ae453350cfd564/google_crc32c-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d", size = 33476, upload-time = "2025-03-26T14:29:10.211Z" }, + { url = "https://files.pythonhosted.org/packages/dd/b7/787e2453cf8639c94b3d06c9d61f512234a82e1d12d13d18584bd3049904/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194", size = 30470, upload-time = "2025-03-26T14:34:31.655Z" }, + { url = "https://files.pythonhosted.org/packages/ed/b4/6042c2b0cbac3ec3a69bb4c49b28d2f517b7a0f4a0232603c42c58e22b44/google_crc32c-1.7.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e", size = 30315, upload-time = "2025-03-26T15:01:54.634Z" }, + { url = "https://files.pythonhosted.org/packages/29/ad/01e7a61a5d059bc57b702d9ff6a18b2585ad97f720bd0a0dbe215df1ab0e/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337", size = 33180, upload-time = "2025-03-26T14:41:32.168Z" }, + { url = "https://files.pythonhosted.org/packages/3b/a5/7279055cf004561894ed3a7bfdf5bf90a53f28fadd01af7cd166e88ddf16/google_crc32c-1.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65", size = 32794, upload-time = "2025-03-26T14:41:33.264Z" }, + { url = "https://files.pythonhosted.org/packages/0f/d6/77060dbd140c624e42ae3ece3df53b9d811000729a5c821b9fd671ceaac6/google_crc32c-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6", size = 33477, upload-time = "2025-03-26T14:29:10.94Z" }, + { url = "https://files.pythonhosted.org/packages/8b/72/b8d785e9184ba6297a8620c8a37cf6e39b81a8ca01bb0796d7cbb28b3386/google_crc32c-1.7.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35", size = 30467, upload-time = "2025-03-26T14:36:06.909Z" }, + { url = "https://files.pythonhosted.org/packages/34/25/5f18076968212067c4e8ea95bf3b69669f9fc698476e5f5eb97d5b37999f/google_crc32c-1.7.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638", size = 30309, upload-time = "2025-03-26T15:06:15.318Z" }, + { url = "https://files.pythonhosted.org/packages/92/83/9228fe65bf70e93e419f38bdf6c5ca5083fc6d32886ee79b450ceefd1dbd/google_crc32c-1.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb", size = 33133, upload-time = "2025-03-26T14:41:34.388Z" }, + { url = "https://files.pythonhosted.org/packages/c3/ca/1ea2fd13ff9f8955b85e7956872fdb7050c4ace8a2306a6d177edb9cf7fe/google_crc32c-1.7.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6", size = 32773, upload-time = "2025-03-26T14:41:35.19Z" }, + { url = "https://files.pythonhosted.org/packages/89/32/a22a281806e3ef21b72db16f948cad22ec68e4bdd384139291e00ff82fe2/google_crc32c-1.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db", size = 33475, upload-time = "2025-03-26T14:29:11.771Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c5/002975aff514e57fc084ba155697a049b3f9b52225ec3bc0f542871dd524/google_crc32c-1.7.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3", size = 33243, upload-time = "2025-03-26T14:41:35.975Z" }, + { url = "https://files.pythonhosted.org/packages/61/cb/c585282a03a0cea70fcaa1bf55d5d702d0f2351094d663ec3be1c6c67c52/google_crc32c-1.7.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9", size = 32870, upload-time = "2025-03-26T14:41:37.08Z" }, + { url = "https://files.pythonhosted.org/packages/16/1b/1693372bf423ada422f80fd88260dbfd140754adb15cbc4d7e9a68b1cb8e/google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48", size = 28241, upload-time = "2025-03-26T14:41:45.898Z" }, + { url = "https://files.pythonhosted.org/packages/fd/3c/2a19a60a473de48717b4efb19398c3f914795b64a96cf3fbe82588044f78/google_crc32c-1.7.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82", size = 28048, upload-time = "2025-03-26T14:41:46.696Z" }, ] [[package]] @@ -1092,9 +1107,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "google-crc32c" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/58/5a/0efdc02665dca14e0837b62c8a1a93132c264bd02054a15abb2218afe0ae/google_resumable_media-2.7.2.tar.gz", hash = "sha256:5280aed4629f2b60b847b0d42f9857fd4935c11af266744df33d8074cae92fe0", size = 2163099 } +sdist = { url = "https://files.pythonhosted.org/packages/58/5a/0efdc02665dca14e0837b62c8a1a93132c264bd02054a15abb2218afe0ae/google_resumable_media-2.7.2.tar.gz", hash = "sha256:5280aed4629f2b60b847b0d42f9857fd4935c11af266744df33d8074cae92fe0", size = 2163099, upload-time = "2024-08-07T22:20:38.555Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/82/35/b8d3baf8c46695858cb9d8835a53baa1eeb9906ddaf2f728a5f5b640fd1e/google_resumable_media-2.7.2-py2.py3-none-any.whl", hash = "sha256:3ce7551e9fe6d99e9a126101d2536612bb73486721951e9562fee0f90c6ababa", size = 81251 }, + { url = "https://files.pythonhosted.org/packages/82/35/b8d3baf8c46695858cb9d8835a53baa1eeb9906ddaf2f728a5f5b640fd1e/google_resumable_media-2.7.2-py2.py3-none-any.whl", hash = "sha256:3ce7551e9fe6d99e9a126101d2536612bb73486721951e9562fee0f90c6ababa", size = 81251, upload-time = "2024-08-07T22:20:36.409Z" }, ] [[package]] @@ -1104,80 +1119,80 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/39/24/33db22342cf4a2ea27c9955e6713140fedd51e8b141b5ce5260897020f1a/googleapis_common_protos-1.70.0.tar.gz", hash = "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257", size = 145903 } +sdist = { url = "https://files.pythonhosted.org/packages/39/24/33db22342cf4a2ea27c9955e6713140fedd51e8b141b5ce5260897020f1a/googleapis_common_protos-1.70.0.tar.gz", hash = "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257", size = 145903, upload-time = "2025-04-14T10:17:02.924Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/86/f1/62a193f0227cf15a920390abe675f386dec35f7ae3ffe6da582d3ade42c7/googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8", size = 294530 }, + { url = "https://files.pythonhosted.org/packages/86/f1/62a193f0227cf15a920390abe675f386dec35f7ae3ffe6da582d3ade42c7/googleapis_common_protos-1.70.0-py3-none-any.whl", hash = "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8", size = 294530, upload-time = "2025-04-14T10:17:01.271Z" }, ] [[package]] name = "greenlet" version = "3.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c9/92/bb85bd6e80148a4d2e0c59f7c0c2891029f8fd510183afc7d8d2feeed9b6/greenlet-3.2.3.tar.gz", hash = "sha256:8b0dd8ae4c0d6f5e54ee55ba935eeb3d735a9b58a8a1e5b5cbab64e01a39f365", size = 185752 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/2e/d4fcb2978f826358b673f779f78fa8a32ee37df11920dc2bb5589cbeecef/greenlet-3.2.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:784ae58bba89fa1fa5733d170d42486580cab9decda3484779f4759345b29822", size = 270219 }, - { url = "https://files.pythonhosted.org/packages/16/24/929f853e0202130e4fe163bc1d05a671ce8dcd604f790e14896adac43a52/greenlet-3.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0921ac4ea42a5315d3446120ad48f90c3a6b9bb93dd9b3cf4e4d84a66e42de83", size = 630383 }, - { url = "https://files.pythonhosted.org/packages/d1/b2/0320715eb61ae70c25ceca2f1d5ae620477d246692d9cc284c13242ec31c/greenlet-3.2.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d2971d93bb99e05f8c2c0c2f4aa9484a18d98c4c3bd3c62b65b7e6ae33dfcfaf", size = 642422 }, - { url = "https://files.pythonhosted.org/packages/bd/49/445fd1a210f4747fedf77615d941444349c6a3a4a1135bba9701337cd966/greenlet-3.2.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c667c0bf9d406b77a15c924ef3285e1e05250948001220368e039b6aa5b5034b", size = 638375 }, - { url = "https://files.pythonhosted.org/packages/7e/c8/ca19760cf6eae75fa8dc32b487e963d863b3ee04a7637da77b616703bc37/greenlet-3.2.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:592c12fb1165be74592f5de0d70f82bc5ba552ac44800d632214b76089945147", size = 637627 }, - { url = "https://files.pythonhosted.org/packages/65/89/77acf9e3da38e9bcfca881e43b02ed467c1dedc387021fc4d9bd9928afb8/greenlet-3.2.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29e184536ba333003540790ba29829ac14bb645514fbd7e32af331e8202a62a5", size = 585502 }, - { url = "https://files.pythonhosted.org/packages/97/c6/ae244d7c95b23b7130136e07a9cc5aadd60d59b5951180dc7dc7e8edaba7/greenlet-3.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:93c0bb79844a367782ec4f429d07589417052e621aa39a5ac1fb99c5aa308edc", size = 1114498 }, - { url = "https://files.pythonhosted.org/packages/89/5f/b16dec0cbfd3070658e0d744487919740c6d45eb90946f6787689a7efbce/greenlet-3.2.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:751261fc5ad7b6705f5f76726567375bb2104a059454e0226e1eef6c756748ba", size = 1139977 }, - { url = "https://files.pythonhosted.org/packages/66/77/d48fb441b5a71125bcac042fc5b1494c806ccb9a1432ecaa421e72157f77/greenlet-3.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:83a8761c75312361aa2b5b903b79da97f13f556164a7dd2d5448655425bd4c34", size = 297017 }, - { url = "https://files.pythonhosted.org/packages/f3/94/ad0d435f7c48debe960c53b8f60fb41c2026b1d0fa4a99a1cb17c3461e09/greenlet-3.2.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:25ad29caed5783d4bd7a85c9251c651696164622494c00802a139c00d639242d", size = 271992 }, - { url = "https://files.pythonhosted.org/packages/93/5d/7c27cf4d003d6e77749d299c7c8f5fd50b4f251647b5c2e97e1f20da0ab5/greenlet-3.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88cd97bf37fe24a6710ec6a3a7799f3f81d9cd33317dcf565ff9950c83f55e0b", size = 638820 }, - { url = "https://files.pythonhosted.org/packages/c6/7e/807e1e9be07a125bb4c169144937910bf59b9d2f6d931578e57f0bce0ae2/greenlet-3.2.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:baeedccca94880d2f5666b4fa16fc20ef50ba1ee353ee2d7092b383a243b0b0d", size = 653046 }, - { url = "https://files.pythonhosted.org/packages/9d/ab/158c1a4ea1068bdbc78dba5a3de57e4c7aeb4e7fa034320ea94c688bfb61/greenlet-3.2.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:be52af4b6292baecfa0f397f3edb3c6092ce071b499dd6fe292c9ac9f2c8f264", size = 647701 }, - { url = "https://files.pythonhosted.org/packages/cc/0d/93729068259b550d6a0288da4ff72b86ed05626eaf1eb7c0d3466a2571de/greenlet-3.2.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0cc73378150b8b78b0c9fe2ce56e166695e67478550769536a6742dca3651688", size = 649747 }, - { url = "https://files.pythonhosted.org/packages/f6/f6/c82ac1851c60851302d8581680573245c8fc300253fc1ff741ae74a6c24d/greenlet-3.2.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:706d016a03e78df129f68c4c9b4c4f963f7d73534e48a24f5f5a7101ed13dbbb", size = 605461 }, - { url = "https://files.pythonhosted.org/packages/98/82/d022cf25ca39cf1200650fc58c52af32c90f80479c25d1cbf57980ec3065/greenlet-3.2.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:419e60f80709510c343c57b4bb5a339d8767bf9aef9b8ce43f4f143240f88b7c", size = 1121190 }, - { url = "https://files.pythonhosted.org/packages/f5/e1/25297f70717abe8104c20ecf7af0a5b82d2f5a980eb1ac79f65654799f9f/greenlet-3.2.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:93d48533fade144203816783373f27a97e4193177ebaaf0fc396db19e5d61163", size = 1149055 }, - { url = "https://files.pythonhosted.org/packages/1f/8f/8f9e56c5e82eb2c26e8cde787962e66494312dc8cb261c460e1f3a9c88bc/greenlet-3.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:7454d37c740bb27bdeddfc3f358f26956a07d5220818ceb467a483197d84f849", size = 297817 }, - { url = "https://files.pythonhosted.org/packages/b1/cf/f5c0b23309070ae93de75c90d29300751a5aacefc0a3ed1b1d8edb28f08b/greenlet-3.2.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:500b8689aa9dd1ab26872a34084503aeddefcb438e2e7317b89b11eaea1901ad", size = 270732 }, - { url = "https://files.pythonhosted.org/packages/48/ae/91a957ba60482d3fecf9be49bc3948f341d706b52ddb9d83a70d42abd498/greenlet-3.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a07d3472c2a93117af3b0136f246b2833fdc0b542d4a9799ae5f41c28323faef", size = 639033 }, - { url = "https://files.pythonhosted.org/packages/6f/df/20ffa66dd5a7a7beffa6451bdb7400d66251374ab40b99981478c69a67a8/greenlet-3.2.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8704b3768d2f51150626962f4b9a9e4a17d2e37c8a8d9867bbd9fa4eb938d3b3", size = 652999 }, - { url = "https://files.pythonhosted.org/packages/51/b4/ebb2c8cb41e521f1d72bf0465f2f9a2fd803f674a88db228887e6847077e/greenlet-3.2.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5035d77a27b7c62db6cf41cf786cfe2242644a7a337a0e155c80960598baab95", size = 647368 }, - { url = "https://files.pythonhosted.org/packages/8e/6a/1e1b5aa10dced4ae876a322155705257748108b7fd2e4fae3f2a091fe81a/greenlet-3.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2d8aa5423cd4a396792f6d4580f88bdc6efcb9205891c9d40d20f6e670992efb", size = 650037 }, - { url = "https://files.pythonhosted.org/packages/26/f2/ad51331a157c7015c675702e2d5230c243695c788f8f75feba1af32b3617/greenlet-3.2.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c724620a101f8170065d7dded3f962a2aea7a7dae133a009cada42847e04a7b", size = 608402 }, - { url = "https://files.pythonhosted.org/packages/26/bc/862bd2083e6b3aff23300900a956f4ea9a4059de337f5c8734346b9b34fc/greenlet-3.2.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:873abe55f134c48e1f2a6f53f7d1419192a3d1a4e873bace00499a4e45ea6af0", size = 1119577 }, - { url = "https://files.pythonhosted.org/packages/86/94/1fc0cc068cfde885170e01de40a619b00eaa8f2916bf3541744730ffb4c3/greenlet-3.2.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:024571bbce5f2c1cfff08bf3fbaa43bbc7444f580ae13b0099e95d0e6e67ed36", size = 1147121 }, - { url = "https://files.pythonhosted.org/packages/27/1a/199f9587e8cb08a0658f9c30f3799244307614148ffe8b1e3aa22f324dea/greenlet-3.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5195fb1e75e592dd04ce79881c8a22becdfa3e6f500e7feb059b1e6fdd54d3e3", size = 297603 }, +sdist = { url = "https://files.pythonhosted.org/packages/c9/92/bb85bd6e80148a4d2e0c59f7c0c2891029f8fd510183afc7d8d2feeed9b6/greenlet-3.2.3.tar.gz", hash = "sha256:8b0dd8ae4c0d6f5e54ee55ba935eeb3d735a9b58a8a1e5b5cbab64e01a39f365", size = 185752, upload-time = "2025-06-05T16:16:09.955Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/2e/d4fcb2978f826358b673f779f78fa8a32ee37df11920dc2bb5589cbeecef/greenlet-3.2.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:784ae58bba89fa1fa5733d170d42486580cab9decda3484779f4759345b29822", size = 270219, upload-time = "2025-06-05T16:10:10.414Z" }, + { url = "https://files.pythonhosted.org/packages/16/24/929f853e0202130e4fe163bc1d05a671ce8dcd604f790e14896adac43a52/greenlet-3.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0921ac4ea42a5315d3446120ad48f90c3a6b9bb93dd9b3cf4e4d84a66e42de83", size = 630383, upload-time = "2025-06-05T16:38:51.785Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b2/0320715eb61ae70c25ceca2f1d5ae620477d246692d9cc284c13242ec31c/greenlet-3.2.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d2971d93bb99e05f8c2c0c2f4aa9484a18d98c4c3bd3c62b65b7e6ae33dfcfaf", size = 642422, upload-time = "2025-06-05T16:41:35.259Z" }, + { url = "https://files.pythonhosted.org/packages/bd/49/445fd1a210f4747fedf77615d941444349c6a3a4a1135bba9701337cd966/greenlet-3.2.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c667c0bf9d406b77a15c924ef3285e1e05250948001220368e039b6aa5b5034b", size = 638375, upload-time = "2025-06-05T16:48:18.235Z" }, + { url = "https://files.pythonhosted.org/packages/7e/c8/ca19760cf6eae75fa8dc32b487e963d863b3ee04a7637da77b616703bc37/greenlet-3.2.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:592c12fb1165be74592f5de0d70f82bc5ba552ac44800d632214b76089945147", size = 637627, upload-time = "2025-06-05T16:13:02.858Z" }, + { url = "https://files.pythonhosted.org/packages/65/89/77acf9e3da38e9bcfca881e43b02ed467c1dedc387021fc4d9bd9928afb8/greenlet-3.2.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29e184536ba333003540790ba29829ac14bb645514fbd7e32af331e8202a62a5", size = 585502, upload-time = "2025-06-05T16:12:49.642Z" }, + { url = "https://files.pythonhosted.org/packages/97/c6/ae244d7c95b23b7130136e07a9cc5aadd60d59b5951180dc7dc7e8edaba7/greenlet-3.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:93c0bb79844a367782ec4f429d07589417052e621aa39a5ac1fb99c5aa308edc", size = 1114498, upload-time = "2025-06-05T16:36:46.598Z" }, + { url = "https://files.pythonhosted.org/packages/89/5f/b16dec0cbfd3070658e0d744487919740c6d45eb90946f6787689a7efbce/greenlet-3.2.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:751261fc5ad7b6705f5f76726567375bb2104a059454e0226e1eef6c756748ba", size = 1139977, upload-time = "2025-06-05T16:12:38.262Z" }, + { url = "https://files.pythonhosted.org/packages/66/77/d48fb441b5a71125bcac042fc5b1494c806ccb9a1432ecaa421e72157f77/greenlet-3.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:83a8761c75312361aa2b5b903b79da97f13f556164a7dd2d5448655425bd4c34", size = 297017, upload-time = "2025-06-05T16:25:05.225Z" }, + { url = "https://files.pythonhosted.org/packages/f3/94/ad0d435f7c48debe960c53b8f60fb41c2026b1d0fa4a99a1cb17c3461e09/greenlet-3.2.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:25ad29caed5783d4bd7a85c9251c651696164622494c00802a139c00d639242d", size = 271992, upload-time = "2025-06-05T16:11:23.467Z" }, + { url = "https://files.pythonhosted.org/packages/93/5d/7c27cf4d003d6e77749d299c7c8f5fd50b4f251647b5c2e97e1f20da0ab5/greenlet-3.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88cd97bf37fe24a6710ec6a3a7799f3f81d9cd33317dcf565ff9950c83f55e0b", size = 638820, upload-time = "2025-06-05T16:38:52.882Z" }, + { url = "https://files.pythonhosted.org/packages/c6/7e/807e1e9be07a125bb4c169144937910bf59b9d2f6d931578e57f0bce0ae2/greenlet-3.2.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:baeedccca94880d2f5666b4fa16fc20ef50ba1ee353ee2d7092b383a243b0b0d", size = 653046, upload-time = "2025-06-05T16:41:36.343Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ab/158c1a4ea1068bdbc78dba5a3de57e4c7aeb4e7fa034320ea94c688bfb61/greenlet-3.2.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:be52af4b6292baecfa0f397f3edb3c6092ce071b499dd6fe292c9ac9f2c8f264", size = 647701, upload-time = "2025-06-05T16:48:19.604Z" }, + { url = "https://files.pythonhosted.org/packages/cc/0d/93729068259b550d6a0288da4ff72b86ed05626eaf1eb7c0d3466a2571de/greenlet-3.2.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0cc73378150b8b78b0c9fe2ce56e166695e67478550769536a6742dca3651688", size = 649747, upload-time = "2025-06-05T16:13:04.628Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f6/c82ac1851c60851302d8581680573245c8fc300253fc1ff741ae74a6c24d/greenlet-3.2.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:706d016a03e78df129f68c4c9b4c4f963f7d73534e48a24f5f5a7101ed13dbbb", size = 605461, upload-time = "2025-06-05T16:12:50.792Z" }, + { url = "https://files.pythonhosted.org/packages/98/82/d022cf25ca39cf1200650fc58c52af32c90f80479c25d1cbf57980ec3065/greenlet-3.2.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:419e60f80709510c343c57b4bb5a339d8767bf9aef9b8ce43f4f143240f88b7c", size = 1121190, upload-time = "2025-06-05T16:36:48.59Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e1/25297f70717abe8104c20ecf7af0a5b82d2f5a980eb1ac79f65654799f9f/greenlet-3.2.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:93d48533fade144203816783373f27a97e4193177ebaaf0fc396db19e5d61163", size = 1149055, upload-time = "2025-06-05T16:12:40.457Z" }, + { url = "https://files.pythonhosted.org/packages/1f/8f/8f9e56c5e82eb2c26e8cde787962e66494312dc8cb261c460e1f3a9c88bc/greenlet-3.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:7454d37c740bb27bdeddfc3f358f26956a07d5220818ceb467a483197d84f849", size = 297817, upload-time = "2025-06-05T16:29:49.244Z" }, + { url = "https://files.pythonhosted.org/packages/b1/cf/f5c0b23309070ae93de75c90d29300751a5aacefc0a3ed1b1d8edb28f08b/greenlet-3.2.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:500b8689aa9dd1ab26872a34084503aeddefcb438e2e7317b89b11eaea1901ad", size = 270732, upload-time = "2025-06-05T16:10:08.26Z" }, + { url = "https://files.pythonhosted.org/packages/48/ae/91a957ba60482d3fecf9be49bc3948f341d706b52ddb9d83a70d42abd498/greenlet-3.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a07d3472c2a93117af3b0136f246b2833fdc0b542d4a9799ae5f41c28323faef", size = 639033, upload-time = "2025-06-05T16:38:53.983Z" }, + { url = "https://files.pythonhosted.org/packages/6f/df/20ffa66dd5a7a7beffa6451bdb7400d66251374ab40b99981478c69a67a8/greenlet-3.2.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8704b3768d2f51150626962f4b9a9e4a17d2e37c8a8d9867bbd9fa4eb938d3b3", size = 652999, upload-time = "2025-06-05T16:41:37.89Z" }, + { url = "https://files.pythonhosted.org/packages/51/b4/ebb2c8cb41e521f1d72bf0465f2f9a2fd803f674a88db228887e6847077e/greenlet-3.2.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5035d77a27b7c62db6cf41cf786cfe2242644a7a337a0e155c80960598baab95", size = 647368, upload-time = "2025-06-05T16:48:21.467Z" }, + { url = "https://files.pythonhosted.org/packages/8e/6a/1e1b5aa10dced4ae876a322155705257748108b7fd2e4fae3f2a091fe81a/greenlet-3.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2d8aa5423cd4a396792f6d4580f88bdc6efcb9205891c9d40d20f6e670992efb", size = 650037, upload-time = "2025-06-05T16:13:06.402Z" }, + { url = "https://files.pythonhosted.org/packages/26/f2/ad51331a157c7015c675702e2d5230c243695c788f8f75feba1af32b3617/greenlet-3.2.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c724620a101f8170065d7dded3f962a2aea7a7dae133a009cada42847e04a7b", size = 608402, upload-time = "2025-06-05T16:12:51.91Z" }, + { url = "https://files.pythonhosted.org/packages/26/bc/862bd2083e6b3aff23300900a956f4ea9a4059de337f5c8734346b9b34fc/greenlet-3.2.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:873abe55f134c48e1f2a6f53f7d1419192a3d1a4e873bace00499a4e45ea6af0", size = 1119577, upload-time = "2025-06-05T16:36:49.787Z" }, + { url = "https://files.pythonhosted.org/packages/86/94/1fc0cc068cfde885170e01de40a619b00eaa8f2916bf3541744730ffb4c3/greenlet-3.2.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:024571bbce5f2c1cfff08bf3fbaa43bbc7444f580ae13b0099e95d0e6e67ed36", size = 1147121, upload-time = "2025-06-05T16:12:42.527Z" }, + { url = "https://files.pythonhosted.org/packages/27/1a/199f9587e8cb08a0658f9c30f3799244307614148ffe8b1e3aa22f324dea/greenlet-3.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5195fb1e75e592dd04ce79881c8a22becdfa3e6f500e7feb059b1e6fdd54d3e3", size = 297603, upload-time = "2025-06-05T16:20:12.651Z" }, ] [[package]] name = "h11" version = "0.16.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250 } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515 }, + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, ] [[package]] name = "identify" version = "2.6.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/88/d193a27416618628a5eea64e3223acd800b40749a96ffb322a9b55a49ed1/identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6", size = 99254 } +sdist = { url = "https://files.pythonhosted.org/packages/a2/88/d193a27416618628a5eea64e3223acd800b40749a96ffb322a9b55a49ed1/identify-2.6.12.tar.gz", hash = "sha256:d8de45749f1efb108badef65ee8386f0f7bb19a7f26185f74de6367bffbaf0e6", size = 99254, upload-time = "2025-05-23T20:37:53.3Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/cd/18f8da995b658420625f7ef13f037be53ae04ec5ad33f9b718240dcfd48c/identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2", size = 99145 }, + { url = "https://files.pythonhosted.org/packages/7a/cd/18f8da995b658420625f7ef13f037be53ae04ec5ad33f9b718240dcfd48c/identify-2.6.12-py2.py3-none-any.whl", hash = "sha256:ad9672d5a72e0d2ff7c5c8809b62dfa60458626352fb0eb7b55e69bdc45334a2", size = 99145, upload-time = "2025-05-23T20:37:51.495Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, ] [[package]] name = "imagesize" version = "1.4.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026 } +sdist = { url = "https://files.pythonhosted.org/packages/a7/84/62473fb57d61e31fef6e36d64a179c8781605429fd927b5dd608c997be31/imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a", size = 1280026, upload-time = "2022-07-01T12:21:05.687Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769 }, + { url = "https://files.pythonhosted.org/packages/ff/62/85c4c919272577931d407be5ba5d71c20f0b616d31a0befe0ae45bb79abd/imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", size = 8769, upload-time = "2022-07-01T12:21:02.467Z" }, ] [[package]] @@ -1187,23 +1202,23 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "zipp" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641 } +sdist = { url = "https://files.pythonhosted.org/packages/76/66/650a33bd90f786193e4de4b3ad86ea60b53c89b669a5c7be931fac31cdb0/importlib_metadata-8.7.0.tar.gz", hash = "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", size = 56641, upload-time = "2025-04-27T15:29:01.736Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656 }, + { url = "https://files.pythonhosted.org/packages/20/b0/36bd937216ec521246249be3bf9855081de4c5e06a0c9b4219dbeda50373/importlib_metadata-8.7.0-py3-none-any.whl", hash = "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd", size = 27656, upload-time = "2025-04-27T15:29:00.214Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050 }, + { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, ] [[package]] name = "ipykernel" -version = "6.29.5" +version = "6.30.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "appnope", marker = "sys_platform == 'darwin'" }, @@ -1220,9 +1235,9 @@ dependencies = [ { name = "tornado" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/5c/67594cb0c7055dc50814b21731c22a601101ea3b1b50a9a1b090e11f5d0f/ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215", size = 163367 } +sdist = { url = "https://files.pythonhosted.org/packages/bb/76/11082e338e0daadc89c8ff866185de11daf67d181901038f9e139d109761/ipykernel-6.30.1.tar.gz", hash = "sha256:6abb270161896402e76b91394fcdce5d1be5d45f456671e5080572f8505be39b", size = 166260, upload-time = "2025-08-04T15:47:35.018Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/5c/368ae6c01c7628438358e6d337c19b05425727fbb221d2a3c4303c372f42/ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", size = 117173 }, + { url = "https://files.pythonhosted.org/packages/fc/c7/b445faca8deb954fe536abebff4ece5b097b923de482b26e78448c89d1dd/ipykernel-6.30.1-py3-none-any.whl", hash = "sha256:aa6b9fb93dca949069d8b85b6c79b2518e32ac583ae9c7d37c51d119e18b3fb4", size = 117484, upload-time = "2025-08-04T15:47:32.622Z" }, ] [[package]] @@ -1242,9 +1257,9 @@ dependencies = [ { name = "traitlets" }, { name = "typing-extensions", marker = "python_full_version < '3.12'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/54/80/406f9e3bde1c1fd9bf5a0be9d090f8ae623e401b7670d8f6fdf2ab679891/ipython-9.4.0.tar.gz", hash = "sha256:c033c6d4e7914c3d9768aabe76bbe87ba1dc66a92a05db6bfa1125d81f2ee270", size = 4385338 } +sdist = { url = "https://files.pythonhosted.org/packages/54/80/406f9e3bde1c1fd9bf5a0be9d090f8ae623e401b7670d8f6fdf2ab679891/ipython-9.4.0.tar.gz", hash = "sha256:c033c6d4e7914c3d9768aabe76bbe87ba1dc66a92a05db6bfa1125d81f2ee270", size = 4385338, upload-time = "2025-07-01T11:11:30.606Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/63/f8/0031ee2b906a15a33d6bfc12dd09c3dfa966b3cb5b284ecfb7549e6ac3c4/ipython-9.4.0-py3-none-any.whl", hash = "sha256:25850f025a446d9b359e8d296ba175a36aedd32e83ca9b5060430fe16801f066", size = 611021 }, + { url = "https://files.pythonhosted.org/packages/63/f8/0031ee2b906a15a33d6bfc12dd09c3dfa966b3cb5b284ecfb7549e6ac3c4/ipython-9.4.0-py3-none-any.whl", hash = "sha256:25850f025a446d9b359e8d296ba175a36aedd32e83ca9b5060430fe16801f066", size = 611021, upload-time = "2025-07-01T11:11:27.85Z" }, ] [[package]] @@ -1254,18 +1269,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393 } +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074 }, + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, ] [[package]] name = "isodate" version = "0.7.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705 } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload-time = "2024-10-08T23:04:11.5Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320 }, + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload-time = "2024-10-08T23:04:09.501Z" }, ] [[package]] @@ -1275,9 +1290,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "parso" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 } +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 }, + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, ] [[package]] @@ -1287,23 +1302,23 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] [[package]] name = "jmespath" version = "1.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/00/2a/e867e8531cf3e36b41201936b7fa7ba7b5702dbef42922193f05c8976cd6/jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe", size = 25843 } +sdist = { url = "https://files.pythonhosted.org/packages/00/2a/e867e8531cf3e36b41201936b7fa7ba7b5702dbef42922193f05c8976cd6/jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe", size = 25843, upload-time = "2022-06-17T18:00:12.224Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256 }, + { url = "https://files.pythonhosted.org/packages/31/b4/b9b800c45527aadd64d5b442f9b932b00648617eb5d63d2c7a6587b7cafc/jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", size = 20256, upload-time = "2022-06-17T18:00:10.251Z" }, ] [[package]] name = "jsonschema" -version = "4.24.1" +version = "4.25.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, @@ -1311,9 +1326,9 @@ dependencies = [ { name = "referencing" }, { name = "rpds-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f1/6e/35174c1d3f30560848c82d3c233c01420e047d70925c897a4d6e932b4898/jsonschema-4.24.1.tar.gz", hash = "sha256:fe45a130cc7f67cd0d67640b4e7e3e2e666919462ae355eda238296eafeb4b5d", size = 356635 } +sdist = { url = "https://files.pythonhosted.org/packages/d5/00/a297a868e9d0784450faa7365c2172a7d6110c763e30ba861867c32ae6a9/jsonschema-4.25.0.tar.gz", hash = "sha256:e63acf5c11762c0e6672ffb61482bdf57f0876684d8d249c0fe2d730d48bc55f", size = 356830, upload-time = "2025-07-18T15:39:45.11Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/85/7f/ea48ffb58f9791f9d97ccb35e42fea1ebc81c67ce36dc4b8b2eee60e8661/jsonschema-4.24.1-py3-none-any.whl", hash = "sha256:6b916866aa0b61437785f1277aa2cbd63512e8d4b47151072ef13292049b4627", size = 89060 }, + { url = "https://files.pythonhosted.org/packages/fe/54/c86cd8e011fe98803d7e382fd67c0df5ceab8d2b7ad8c5a81524f791551c/jsonschema-4.25.0-py3-none-any.whl", hash = "sha256:24c2e8da302de79c8b9382fee3e76b355e44d2a4364bb207159ce10b517bd716", size = 89184, upload-time = "2025-07-18T15:39:42.956Z" }, ] [[package]] @@ -1323,9 +1338,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "referencing" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513 } +sdist = { url = "https://files.pythonhosted.org/packages/bf/ce/46fbd9c8119cfc3581ee5643ea49464d168028cfb5caff5fc0596d0cf914/jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608", size = 15513, upload-time = "2025-04-23T12:34:07.418Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437 }, + { url = "https://files.pythonhosted.org/packages/01/0e/b27cdbaccf30b890c40ed1da9fd4a3593a5cf94dae54fb34f8a4b74fcd3f/jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", size = 18437, upload-time = "2025-04-23T12:34:05.422Z" }, ] [[package]] @@ -1342,9 +1357,9 @@ dependencies = [ { name = "sqlalchemy" }, { name = "tabulate" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/f7/3627358075f183956e8c4974603232b03afd4ddc7baf72c2bc9fff522291/jupyter_cache-1.0.1.tar.gz", hash = "sha256:16e808eb19e3fb67a223db906e131ea6e01f03aa27f49a7214ce6a5fec186fb9", size = 32048 } +sdist = { url = "https://files.pythonhosted.org/packages/bb/f7/3627358075f183956e8c4974603232b03afd4ddc7baf72c2bc9fff522291/jupyter_cache-1.0.1.tar.gz", hash = "sha256:16e808eb19e3fb67a223db906e131ea6e01f03aa27f49a7214ce6a5fec186fb9", size = 32048, upload-time = "2024-11-15T16:03:55.322Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/64/6b/67b87da9d36bff9df7d0efbd1a325fa372a43be7158effaf43ed7b22341d/jupyter_cache-1.0.1-py3-none-any.whl", hash = "sha256:9c3cafd825ba7da8b5830485343091143dff903e4d8c69db9349b728b140abf6", size = 33907 }, + { url = "https://files.pythonhosted.org/packages/64/6b/67b87da9d36bff9df7d0efbd1a325fa372a43be7158effaf43ed7b22341d/jupyter_cache-1.0.1-py3-none-any.whl", hash = "sha256:9c3cafd825ba7da8b5830485343091143dff903e4d8c69db9349b728b140abf6", size = 33907, upload-time = "2024-11-15T16:03:54.021Z" }, ] [[package]] @@ -1358,9 +1373,9 @@ dependencies = [ { name = "tornado" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019 } +sdist = { url = "https://files.pythonhosted.org/packages/71/22/bf9f12fdaeae18019a468b68952a60fe6dbab5d67cd2a103cac7659b41ca/jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419", size = 342019, upload-time = "2024-09-17T10:44:17.613Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105 }, + { url = "https://files.pythonhosted.org/packages/11/85/b0394e0b6fcccd2c1eeefc230978a6f8cb0c5df1e4cd3e7625735a0d7d1e/jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f", size = 106105, upload-time = "2024-09-17T10:44:15.218Z" }, ] [[package]] @@ -1372,9 +1387,9 @@ dependencies = [ { name = "pywin32", marker = "platform_python_implementation != 'PyPy' and sys_platform == 'win32'" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923 } +sdist = { url = "https://files.pythonhosted.org/packages/99/1b/72906d554acfeb588332eaaa6f61577705e9ec752ddb486f302dafa292d9/jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941", size = 88923, upload-time = "2025-05-27T07:38:16.655Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880 }, + { url = "https://files.pythonhosted.org/packages/2f/57/6bffd4b20b88da3800c5d691e0337761576ee688eb01299eae865689d2df/jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0", size = 28880, upload-time = "2025-05-27T07:38:15.137Z" }, ] [[package]] @@ -1384,41 +1399,41 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "uc-micro-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2a/ae/bb56c6828e4797ba5a4821eec7c43b8bf40f69cda4d4f5f8c8a2810ec96a/linkify-it-py-2.0.3.tar.gz", hash = "sha256:68cda27e162e9215c17d786649d1da0021a451bdc436ef9e0fa0ba5234b9b048", size = 27946 } +sdist = { url = "https://files.pythonhosted.org/packages/2a/ae/bb56c6828e4797ba5a4821eec7c43b8bf40f69cda4d4f5f8c8a2810ec96a/linkify-it-py-2.0.3.tar.gz", hash = "sha256:68cda27e162e9215c17d786649d1da0021a451bdc436ef9e0fa0ba5234b9b048", size = 27946, upload-time = "2024-02-04T14:48:04.179Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/1e/b832de447dee8b582cac175871d2f6c3d5077cc56d5575cadba1fd1cccfa/linkify_it_py-2.0.3-py3-none-any.whl", hash = "sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79", size = 19820 }, + { url = "https://files.pythonhosted.org/packages/04/1e/b832de447dee8b582cac175871d2f6c3d5077cc56d5575cadba1fd1cccfa/linkify_it_py-2.0.3-py3-none-any.whl", hash = "sha256:6bcbc417b0ac14323382aef5c5192c0075bf8a9d6b41820a2b66371eac6b6d79", size = 19820, upload-time = "2024-02-04T14:48:02.496Z" }, ] [[package]] name = "llvmlite" version = "0.44.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/89/6a/95a3d3610d5c75293d5dbbb2a76480d5d4eeba641557b69fe90af6c5b84e/llvmlite-0.44.0.tar.gz", hash = "sha256:07667d66a5d150abed9157ab6c0b9393c9356f229784a4385c02f99e94fc94d4", size = 171880 } +sdist = { url = "https://files.pythonhosted.org/packages/89/6a/95a3d3610d5c75293d5dbbb2a76480d5d4eeba641557b69fe90af6c5b84e/llvmlite-0.44.0.tar.gz", hash = "sha256:07667d66a5d150abed9157ab6c0b9393c9356f229784a4385c02f99e94fc94d4", size = 171880, upload-time = "2025-01-20T11:14:41.342Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/e2/86b245397052386595ad726f9742e5223d7aea999b18c518a50e96c3aca4/llvmlite-0.44.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:eed7d5f29136bda63b6d7804c279e2b72e08c952b7c5df61f45db408e0ee52f3", size = 28132305 }, - { url = "https://files.pythonhosted.org/packages/ff/ec/506902dc6870249fbe2466d9cf66d531265d0f3a1157213c8f986250c033/llvmlite-0.44.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ace564d9fa44bb91eb6e6d8e7754977783c68e90a471ea7ce913bff30bd62427", size = 26201090 }, - { url = "https://files.pythonhosted.org/packages/99/fe/d030f1849ebb1f394bb3f7adad5e729b634fb100515594aca25c354ffc62/llvmlite-0.44.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5d22c3bfc842668168a786af4205ec8e3ad29fb1bc03fd11fd48460d0df64c1", size = 42361858 }, - { url = "https://files.pythonhosted.org/packages/d7/7a/ce6174664b9077fc673d172e4c888cb0b128e707e306bc33fff8c2035f0d/llvmlite-0.44.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f01a394e9c9b7b1d4e63c327b096d10f6f0ed149ef53d38a09b3749dcf8c9610", size = 41184200 }, - { url = "https://files.pythonhosted.org/packages/5f/c6/258801143975a6d09a373f2641237992496e15567b907a4d401839d671b8/llvmlite-0.44.0-cp311-cp311-win_amd64.whl", hash = "sha256:d8489634d43c20cd0ad71330dde1d5bc7b9966937a263ff1ec1cebb90dc50955", size = 30331193 }, - { url = "https://files.pythonhosted.org/packages/15/86/e3c3195b92e6e492458f16d233e58a1a812aa2bfbef9bdd0fbafcec85c60/llvmlite-0.44.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:1d671a56acf725bf1b531d5ef76b86660a5ab8ef19bb6a46064a705c6ca80aad", size = 28132297 }, - { url = "https://files.pythonhosted.org/packages/d6/53/373b6b8be67b9221d12b24125fd0ec56b1078b660eeae266ec388a6ac9a0/llvmlite-0.44.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f79a728e0435493611c9f405168682bb75ffd1fbe6fc360733b850c80a026db", size = 26201105 }, - { url = "https://files.pythonhosted.org/packages/cb/da/8341fd3056419441286c8e26bf436923021005ece0bff5f41906476ae514/llvmlite-0.44.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0143a5ef336da14deaa8ec26c5449ad5b6a2b564df82fcef4be040b9cacfea9", size = 42361901 }, - { url = "https://files.pythonhosted.org/packages/53/ad/d79349dc07b8a395a99153d7ce8b01d6fcdc9f8231355a5df55ded649b61/llvmlite-0.44.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d752f89e31b66db6f8da06df8b39f9b91e78c5feea1bf9e8c1fba1d1c24c065d", size = 41184247 }, - { url = "https://files.pythonhosted.org/packages/e2/3b/a9a17366af80127bd09decbe2a54d8974b6d8b274b39bf47fbaedeec6307/llvmlite-0.44.0-cp312-cp312-win_amd64.whl", hash = "sha256:eae7e2d4ca8f88f89d315b48c6b741dcb925d6a1042da694aa16ab3dd4cbd3a1", size = 30332380 }, - { url = "https://files.pythonhosted.org/packages/89/24/4c0ca705a717514c2092b18476e7a12c74d34d875e05e4d742618ebbf449/llvmlite-0.44.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:319bddd44e5f71ae2689859b7203080716448a3cd1128fb144fe5c055219d516", size = 28132306 }, - { url = "https://files.pythonhosted.org/packages/01/cf/1dd5a60ba6aee7122ab9243fd614abcf22f36b0437cbbe1ccf1e3391461c/llvmlite-0.44.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c58867118bad04a0bb22a2e0068c693719658105e40009ffe95c7000fcde88e", size = 26201090 }, - { url = "https://files.pythonhosted.org/packages/d2/1b/656f5a357de7135a3777bd735cc7c9b8f23b4d37465505bd0eaf4be9befe/llvmlite-0.44.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46224058b13c96af1365290bdfebe9a6264ae62fb79b2b55693deed11657a8bf", size = 42361904 }, - { url = "https://files.pythonhosted.org/packages/d8/e1/12c5f20cb9168fb3464a34310411d5ad86e4163c8ff2d14a2b57e5cc6bac/llvmlite-0.44.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0097052c32bf721a4efc03bd109d335dfa57d9bffb3d4c24cc680711b8b4fc", size = 41184245 }, - { url = "https://files.pythonhosted.org/packages/d0/81/e66fc86539293282fd9cb7c9417438e897f369e79ffb62e1ae5e5154d4dd/llvmlite-0.44.0-cp313-cp313-win_amd64.whl", hash = "sha256:2fb7c4f2fb86cbae6dca3db9ab203eeea0e22d73b99bc2341cdf9de93612e930", size = 30331193 }, + { url = "https://files.pythonhosted.org/packages/b5/e2/86b245397052386595ad726f9742e5223d7aea999b18c518a50e96c3aca4/llvmlite-0.44.0-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:eed7d5f29136bda63b6d7804c279e2b72e08c952b7c5df61f45db408e0ee52f3", size = 28132305, upload-time = "2025-01-20T11:12:53.936Z" }, + { url = "https://files.pythonhosted.org/packages/ff/ec/506902dc6870249fbe2466d9cf66d531265d0f3a1157213c8f986250c033/llvmlite-0.44.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ace564d9fa44bb91eb6e6d8e7754977783c68e90a471ea7ce913bff30bd62427", size = 26201090, upload-time = "2025-01-20T11:12:59.847Z" }, + { url = "https://files.pythonhosted.org/packages/99/fe/d030f1849ebb1f394bb3f7adad5e729b634fb100515594aca25c354ffc62/llvmlite-0.44.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5d22c3bfc842668168a786af4205ec8e3ad29fb1bc03fd11fd48460d0df64c1", size = 42361858, upload-time = "2025-01-20T11:13:07.623Z" }, + { url = "https://files.pythonhosted.org/packages/d7/7a/ce6174664b9077fc673d172e4c888cb0b128e707e306bc33fff8c2035f0d/llvmlite-0.44.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f01a394e9c9b7b1d4e63c327b096d10f6f0ed149ef53d38a09b3749dcf8c9610", size = 41184200, upload-time = "2025-01-20T11:13:20.058Z" }, + { url = "https://files.pythonhosted.org/packages/5f/c6/258801143975a6d09a373f2641237992496e15567b907a4d401839d671b8/llvmlite-0.44.0-cp311-cp311-win_amd64.whl", hash = "sha256:d8489634d43c20cd0ad71330dde1d5bc7b9966937a263ff1ec1cebb90dc50955", size = 30331193, upload-time = "2025-01-20T11:13:26.976Z" }, + { url = "https://files.pythonhosted.org/packages/15/86/e3c3195b92e6e492458f16d233e58a1a812aa2bfbef9bdd0fbafcec85c60/llvmlite-0.44.0-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:1d671a56acf725bf1b531d5ef76b86660a5ab8ef19bb6a46064a705c6ca80aad", size = 28132297, upload-time = "2025-01-20T11:13:32.57Z" }, + { url = "https://files.pythonhosted.org/packages/d6/53/373b6b8be67b9221d12b24125fd0ec56b1078b660eeae266ec388a6ac9a0/llvmlite-0.44.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f79a728e0435493611c9f405168682bb75ffd1fbe6fc360733b850c80a026db", size = 26201105, upload-time = "2025-01-20T11:13:38.744Z" }, + { url = "https://files.pythonhosted.org/packages/cb/da/8341fd3056419441286c8e26bf436923021005ece0bff5f41906476ae514/llvmlite-0.44.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0143a5ef336da14deaa8ec26c5449ad5b6a2b564df82fcef4be040b9cacfea9", size = 42361901, upload-time = "2025-01-20T11:13:46.711Z" }, + { url = "https://files.pythonhosted.org/packages/53/ad/d79349dc07b8a395a99153d7ce8b01d6fcdc9f8231355a5df55ded649b61/llvmlite-0.44.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d752f89e31b66db6f8da06df8b39f9b91e78c5feea1bf9e8c1fba1d1c24c065d", size = 41184247, upload-time = "2025-01-20T11:13:56.159Z" }, + { url = "https://files.pythonhosted.org/packages/e2/3b/a9a17366af80127bd09decbe2a54d8974b6d8b274b39bf47fbaedeec6307/llvmlite-0.44.0-cp312-cp312-win_amd64.whl", hash = "sha256:eae7e2d4ca8f88f89d315b48c6b741dcb925d6a1042da694aa16ab3dd4cbd3a1", size = 30332380, upload-time = "2025-01-20T11:14:02.442Z" }, + { url = "https://files.pythonhosted.org/packages/89/24/4c0ca705a717514c2092b18476e7a12c74d34d875e05e4d742618ebbf449/llvmlite-0.44.0-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:319bddd44e5f71ae2689859b7203080716448a3cd1128fb144fe5c055219d516", size = 28132306, upload-time = "2025-01-20T11:14:09.035Z" }, + { url = "https://files.pythonhosted.org/packages/01/cf/1dd5a60ba6aee7122ab9243fd614abcf22f36b0437cbbe1ccf1e3391461c/llvmlite-0.44.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9c58867118bad04a0bb22a2e0068c693719658105e40009ffe95c7000fcde88e", size = 26201090, upload-time = "2025-01-20T11:14:15.401Z" }, + { url = "https://files.pythonhosted.org/packages/d2/1b/656f5a357de7135a3777bd735cc7c9b8f23b4d37465505bd0eaf4be9befe/llvmlite-0.44.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46224058b13c96af1365290bdfebe9a6264ae62fb79b2b55693deed11657a8bf", size = 42361904, upload-time = "2025-01-20T11:14:22.949Z" }, + { url = "https://files.pythonhosted.org/packages/d8/e1/12c5f20cb9168fb3464a34310411d5ad86e4163c8ff2d14a2b57e5cc6bac/llvmlite-0.44.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0097052c32bf721a4efc03bd109d335dfa57d9bffb3d4c24cc680711b8b4fc", size = 41184245, upload-time = "2025-01-20T11:14:31.731Z" }, + { url = "https://files.pythonhosted.org/packages/d0/81/e66fc86539293282fd9cb7c9417438e897f369e79ffb62e1ae5e5154d4dd/llvmlite-0.44.0-cp313-cp313-win_amd64.whl", hash = "sha256:2fb7c4f2fb86cbae6dca3db9ab203eeea0e22d73b99bc2341cdf9de93612e930", size = 30331193, upload-time = "2025-01-20T11:14:38.578Z" }, ] [[package]] name = "locket" version = "1.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2f/83/97b29fe05cb6ae28d2dbd30b81e2e402a3eed5f460c26e9eaa5895ceacf5/locket-1.0.0.tar.gz", hash = "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632", size = 4350 } +sdist = { url = "https://files.pythonhosted.org/packages/2f/83/97b29fe05cb6ae28d2dbd30b81e2e402a3eed5f460c26e9eaa5895ceacf5/locket-1.0.0.tar.gz", hash = "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632", size = 4350, upload-time = "2022-04-20T22:04:44.312Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl", hash = "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3", size = 4398 }, + { url = "https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl", hash = "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3", size = 4398, upload-time = "2022-04-20T22:04:42.23Z" }, ] [[package]] @@ -1428,57 +1443,57 @@ source = { registry = "https://pypi.org/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://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } 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://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, ] [[package]] name = "markupsafe" version = "3.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353 }, - { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392 }, - { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984 }, - { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120 }, - { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032 }, - { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057 }, - { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359 }, - { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306 }, - { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094 }, - { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521 }, - { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274 }, - { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348 }, - { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149 }, - { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118 }, - { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993 }, - { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178 }, - { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319 }, - { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352 }, - { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097 }, - { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601 }, - { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274 }, - { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352 }, - { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122 }, - { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085 }, - { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978 }, - { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208 }, - { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357 }, - { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344 }, - { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101 }, - { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603 }, - { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510 }, - { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486 }, - { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480 }, - { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914 }, - { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796 }, - { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473 }, - { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114 }, - { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098 }, - { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208 }, - { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739 }, +sdist = { url = "https://files.pythonhosted.org/packages/b2/97/5d42485e71dfc078108a86d6de8fa46db44a1a9295e89c5d6d4a06e23a62/markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", size = 20537, upload-time = "2024-10-18T15:21:54.129Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/28/bbf83e3f76936960b850435576dd5e67034e200469571be53f69174a2dfd/MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", size = 14353, upload-time = "2024-10-18T15:21:02.187Z" }, + { url = "https://files.pythonhosted.org/packages/6c/30/316d194b093cde57d448a4c3209f22e3046c5bb2fb0820b118292b334be7/MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", size = 12392, upload-time = "2024-10-18T15:21:02.941Z" }, + { url = "https://files.pythonhosted.org/packages/f2/96/9cdafba8445d3a53cae530aaf83c38ec64c4d5427d975c974084af5bc5d2/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", size = 23984, upload-time = "2024-10-18T15:21:03.953Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a4/aefb044a2cd8d7334c8a47d3fb2c9f328ac48cb349468cc31c20b539305f/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", size = 23120, upload-time = "2024-10-18T15:21:06.495Z" }, + { url = "https://files.pythonhosted.org/packages/8d/21/5e4851379f88f3fad1de30361db501300d4f07bcad047d3cb0449fc51f8c/MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", size = 23032, upload-time = "2024-10-18T15:21:07.295Z" }, + { url = "https://files.pythonhosted.org/packages/00/7b/e92c64e079b2d0d7ddf69899c98842f3f9a60a1ae72657c89ce2655c999d/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", size = 24057, upload-time = "2024-10-18T15:21:08.073Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ac/46f960ca323037caa0a10662ef97d0a4728e890334fc156b9f9e52bcc4ca/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", size = 23359, upload-time = "2024-10-18T15:21:09.318Z" }, + { url = "https://files.pythonhosted.org/packages/69/84/83439e16197337b8b14b6a5b9c2105fff81d42c2a7c5b58ac7b62ee2c3b1/MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", size = 23306, upload-time = "2024-10-18T15:21:10.185Z" }, + { url = "https://files.pythonhosted.org/packages/9a/34/a15aa69f01e2181ed8d2b685c0d2f6655d5cca2c4db0ddea775e631918cd/MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", size = 15094, upload-time = "2024-10-18T15:21:11.005Z" }, + { url = "https://files.pythonhosted.org/packages/da/b8/3a3bd761922d416f3dc5d00bfbed11f66b1ab89a0c2b6e887240a30b0f6b/MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", size = 15521, upload-time = "2024-10-18T15:21:12.911Z" }, + { url = "https://files.pythonhosted.org/packages/22/09/d1f21434c97fc42f09d290cbb6350d44eb12f09cc62c9476effdb33a18aa/MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", size = 14274, upload-time = "2024-10-18T15:21:13.777Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b0/18f76bba336fa5aecf79d45dcd6c806c280ec44538b3c13671d49099fdd0/MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", size = 12348, upload-time = "2024-10-18T15:21:14.822Z" }, + { url = "https://files.pythonhosted.org/packages/e0/25/dd5c0f6ac1311e9b40f4af06c78efde0f3b5cbf02502f8ef9501294c425b/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", size = 24149, upload-time = "2024-10-18T15:21:15.642Z" }, + { url = "https://files.pythonhosted.org/packages/f3/f0/89e7aadfb3749d0f52234a0c8c7867877876e0a20b60e2188e9850794c17/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", size = 23118, upload-time = "2024-10-18T15:21:17.133Z" }, + { url = "https://files.pythonhosted.org/packages/d5/da/f2eeb64c723f5e3777bc081da884b414671982008c47dcc1873d81f625b6/MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", size = 22993, upload-time = "2024-10-18T15:21:18.064Z" }, + { url = "https://files.pythonhosted.org/packages/da/0e/1f32af846df486dce7c227fe0f2398dc7e2e51d4a370508281f3c1c5cddc/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", size = 24178, upload-time = "2024-10-18T15:21:18.859Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f6/bb3ca0532de8086cbff5f06d137064c8410d10779c4c127e0e47d17c0b71/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", size = 23319, upload-time = "2024-10-18T15:21:19.671Z" }, + { url = "https://files.pythonhosted.org/packages/a2/82/8be4c96ffee03c5b4a034e60a31294daf481e12c7c43ab8e34a1453ee48b/MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", size = 23352, upload-time = "2024-10-18T15:21:20.971Z" }, + { url = "https://files.pythonhosted.org/packages/51/ae/97827349d3fcffee7e184bdf7f41cd6b88d9919c80f0263ba7acd1bbcb18/MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", size = 15097, upload-time = "2024-10-18T15:21:22.646Z" }, + { url = "https://files.pythonhosted.org/packages/c1/80/a61f99dc3a936413c3ee4e1eecac96c0da5ed07ad56fd975f1a9da5bc630/MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", size = 15601, upload-time = "2024-10-18T15:21:23.499Z" }, + { url = "https://files.pythonhosted.org/packages/83/0e/67eb10a7ecc77a0c2bbe2b0235765b98d164d81600746914bebada795e97/MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", size = 14274, upload-time = "2024-10-18T15:21:24.577Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6d/9409f3684d3335375d04e5f05744dfe7e9f120062c9857df4ab490a1031a/MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", size = 12352, upload-time = "2024-10-18T15:21:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f5/6eadfcd3885ea85fe2a7c128315cc1bb7241e1987443d78c8fe712d03091/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", size = 24122, upload-time = "2024-10-18T15:21:26.199Z" }, + { url = "https://files.pythonhosted.org/packages/0c/91/96cf928db8236f1bfab6ce15ad070dfdd02ed88261c2afafd4b43575e9e9/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", size = 23085, upload-time = "2024-10-18T15:21:27.029Z" }, + { url = "https://files.pythonhosted.org/packages/c2/cf/c9d56af24d56ea04daae7ac0940232d31d5a8354f2b457c6d856b2057d69/MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", size = 22978, upload-time = "2024-10-18T15:21:27.846Z" }, + { url = "https://files.pythonhosted.org/packages/2a/9f/8619835cd6a711d6272d62abb78c033bda638fdc54c4e7f4272cf1c0962b/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", size = 24208, upload-time = "2024-10-18T15:21:28.744Z" }, + { url = "https://files.pythonhosted.org/packages/f9/bf/176950a1792b2cd2102b8ffeb5133e1ed984547b75db47c25a67d3359f77/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", size = 23357, upload-time = "2024-10-18T15:21:29.545Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4f/9a02c1d335caabe5c4efb90e1b6e8ee944aa245c1aaaab8e8a618987d816/MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", size = 23344, upload-time = "2024-10-18T15:21:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/c271b57db36f748f0e04a759ace9f8f759ccf22b4960c270c78a394f58be/MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", size = 15101, upload-time = "2024-10-18T15:21:31.207Z" }, + { url = "https://files.pythonhosted.org/packages/29/88/07df22d2dd4df40aba9f3e402e6dc1b8ee86297dddbad4872bd5e7b0094f/MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", size = 15603, upload-time = "2024-10-18T15:21:32.032Z" }, + { url = "https://files.pythonhosted.org/packages/62/6a/8b89d24db2d32d433dffcd6a8779159da109842434f1dd2f6e71f32f738c/MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", size = 14510, upload-time = "2024-10-18T15:21:33.625Z" }, + { url = "https://files.pythonhosted.org/packages/7a/06/a10f955f70a2e5a9bf78d11a161029d278eeacbd35ef806c3fd17b13060d/MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", size = 12486, upload-time = "2024-10-18T15:21:34.611Z" }, + { url = "https://files.pythonhosted.org/packages/34/cf/65d4a571869a1a9078198ca28f39fba5fbb910f952f9dbc5220afff9f5e6/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", size = 25480, upload-time = "2024-10-18T15:21:35.398Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e3/90e9651924c430b885468b56b3d597cabf6d72be4b24a0acd1fa0e12af67/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", size = 23914, upload-time = "2024-10-18T15:21:36.231Z" }, + { url = "https://files.pythonhosted.org/packages/66/8c/6c7cf61f95d63bb866db39085150df1f2a5bd3335298f14a66b48e92659c/MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", size = 23796, upload-time = "2024-10-18T15:21:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/bb/35/cbe9238ec3f47ac9a7c8b3df7a808e7cb50fe149dc7039f5f454b3fba218/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", size = 25473, upload-time = "2024-10-18T15:21:37.932Z" }, + { url = "https://files.pythonhosted.org/packages/e6/32/7621a4382488aa283cc05e8984a9c219abad3bca087be9ec77e89939ded9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", size = 24114, upload-time = "2024-10-18T15:21:39.799Z" }, + { url = "https://files.pythonhosted.org/packages/0d/80/0985960e4b89922cb5a0bac0ed39c5b96cbc1a536a99f30e8c220a996ed9/MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", size = 24098, upload-time = "2024-10-18T15:21:40.813Z" }, + { url = "https://files.pythonhosted.org/packages/82/78/fedb03c7d5380df2427038ec8d973587e90561b2d90cd472ce9254cf348b/MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", size = 15208, upload-time = "2024-10-18T15:21:41.814Z" }, + { url = "https://files.pythonhosted.org/packages/4f/65/6079a46068dfceaeabb5dcad6d674f5f5c61a6fa5673746f42a9f4c233b3/MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", size = 15739, upload-time = "2024-10-18T15:21:42.784Z" }, ] [[package]] @@ -1488,9 +1503,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159 } +sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159, upload-time = "2024-04-15T13:44:44.803Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899 }, + { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899, upload-time = "2024-04-15T13:44:43.265Z" }, ] [[package]] @@ -1500,32 +1515,32 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542 } +sdist = { url = "https://files.pythonhosted.org/packages/19/03/a2ecab526543b152300717cf232bb4bb8605b6edb946c845016fa9c9c9fd/mdit_py_plugins-0.4.2.tar.gz", hash = "sha256:5f2cd1fdb606ddf152d37ec30e46101a60512bc0e5fa1a7002c36647b09e26b5", size = 43542, upload-time = "2024-09-09T20:27:49.564Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316 }, + { url = "https://files.pythonhosted.org/packages/a7/f7/7782a043553ee469c1ff49cfa1cdace2d6bf99a1f333cf38676b3ddf30da/mdit_py_plugins-0.4.2-py3-none-any.whl", hash = "sha256:0c673c3f889399a33b95e88d2f0d111b4447bdfea7f237dab2d488f459835636", size = 55316, upload-time = "2024-09-09T20:27:48.397Z" }, ] [[package]] name = "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 } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } 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://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] [[package]] name = "msal" -version = "1.32.3" +version = "1.33.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "pyjwt", extra = ["crypto"] }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3f/90/81dcc50f0be11a8c4dcbae1a9f761a26e5f905231330a7cacc9f04ec4c61/msal-1.32.3.tar.gz", hash = "sha256:5eea038689c78a5a70ca8ecbe1245458b55a857bd096efb6989c69ba15985d35", size = 151449 } +sdist = { url = "https://files.pythonhosted.org/packages/d5/da/81acbe0c1fd7e9e4ec35f55dadeba9833a847b9a6ba2e2d1e4432da901dd/msal-1.33.0.tar.gz", hash = "sha256:836ad80faa3e25a7d71015c990ce61f704a87328b1e73bcbb0623a18cbf17510", size = 153801, upload-time = "2025-07-22T19:36:33.693Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/bf/81516b9aac7fd867709984d08eb4db1d2e3fe1df795c8e442cde9b568962/msal-1.32.3-py3-none-any.whl", hash = "sha256:b2798db57760b1961b142f027ffb7c8169536bf77316e99a0df5c4aaebb11569", size = 115358 }, + { url = "https://files.pythonhosted.org/packages/86/5b/fbc73e91f7727ae1e79b21ed833308e99dc11cc1cd3d4717f579775de5e9/msal-1.33.0-py3-none-any.whl", hash = "sha256:c0cd41cecf8eaed733ee7e3be9e040291eba53b0f262d3ae9c58f38b04244273", size = 116853, upload-time = "2025-07-22T19:36:32.403Z" }, ] [[package]] @@ -1535,128 +1550,128 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "msal" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/01/99/5d239b6156eddf761a636bded1118414d161bd6b7b37a9335549ed159396/msal_extensions-1.3.1.tar.gz", hash = "sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4", size = 23315 } +sdist = { url = "https://files.pythonhosted.org/packages/01/99/5d239b6156eddf761a636bded1118414d161bd6b7b37a9335549ed159396/msal_extensions-1.3.1.tar.gz", hash = "sha256:c5b0fd10f65ef62b5f1d62f4251d51cbcaf003fcedae8c91b040a488614be1a4", size = 23315, upload-time = "2025-03-14T23:51:03.902Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5e/75/bd9b7bb966668920f06b200e84454c8f3566b102183bc55c5473d96cb2b9/msal_extensions-1.3.1-py3-none-any.whl", hash = "sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca", size = 20583 }, + { url = "https://files.pythonhosted.org/packages/5e/75/bd9b7bb966668920f06b200e84454c8f3566b102183bc55c5473d96cb2b9/msal_extensions-1.3.1-py3-none-any.whl", hash = "sha256:96d3de4d034504e969ac5e85bae8106c8373b5c6568e4c8fa7af2eca9dbe6bca", size = 20583, upload-time = "2025-03-14T23:51:03.016Z" }, ] [[package]] name = "msgpack" version = "1.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/45/b1/ea4f68038a18c77c9467400d166d74c4ffa536f34761f7983a104357e614/msgpack-1.1.1.tar.gz", hash = "sha256:77b79ce34a2bdab2594f490c8e80dd62a02d650b91a75159a63ec413b8d104cd", size = 173555 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/83/97f24bf9848af23fe2ba04380388216defc49a8af6da0c28cc636d722502/msgpack-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:71ef05c1726884e44f8b1d1773604ab5d4d17729d8491403a705e649116c9558", size = 82728 }, - { url = "https://files.pythonhosted.org/packages/aa/7f/2eaa388267a78401f6e182662b08a588ef4f3de6f0eab1ec09736a7aaa2b/msgpack-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:36043272c6aede309d29d56851f8841ba907a1a3d04435e43e8a19928e243c1d", size = 79279 }, - { url = "https://files.pythonhosted.org/packages/f8/46/31eb60f4452c96161e4dfd26dbca562b4ec68c72e4ad07d9566d7ea35e8a/msgpack-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a32747b1b39c3ac27d0670122b57e6e57f28eefb725e0b625618d1b59bf9d1e0", size = 423859 }, - { url = "https://files.pythonhosted.org/packages/45/16/a20fa8c32825cc7ae8457fab45670c7a8996d7746ce80ce41cc51e3b2bd7/msgpack-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a8b10fdb84a43e50d38057b06901ec9da52baac6983d3f709d8507f3889d43f", size = 429975 }, - { url = "https://files.pythonhosted.org/packages/86/ea/6c958e07692367feeb1a1594d35e22b62f7f476f3c568b002a5ea09d443d/msgpack-1.1.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0c325c3f485dc54ec298d8b024e134acf07c10d494ffa24373bea729acf704", size = 413528 }, - { url = "https://files.pythonhosted.org/packages/75/05/ac84063c5dae79722bda9f68b878dc31fc3059adb8633c79f1e82c2cd946/msgpack-1.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:88daaf7d146e48ec71212ce21109b66e06a98e5e44dca47d853cbfe171d6c8d2", size = 413338 }, - { url = "https://files.pythonhosted.org/packages/69/e8/fe86b082c781d3e1c09ca0f4dacd457ede60a13119b6ce939efe2ea77b76/msgpack-1.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8b55ea20dc59b181d3f47103f113e6f28a5e1c89fd5b67b9140edb442ab67f2", size = 422658 }, - { url = "https://files.pythonhosted.org/packages/3b/2b/bafc9924df52d8f3bb7c00d24e57be477f4d0f967c0a31ef5e2225e035c7/msgpack-1.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a28e8072ae9779f20427af07f53bbb8b4aa81151054e882aee333b158da8752", size = 427124 }, - { url = "https://files.pythonhosted.org/packages/a2/3b/1f717e17e53e0ed0b68fa59e9188f3f610c79d7151f0e52ff3cd8eb6b2dc/msgpack-1.1.1-cp311-cp311-win32.whl", hash = "sha256:7da8831f9a0fdb526621ba09a281fadc58ea12701bc709e7b8cbc362feabc295", size = 65016 }, - { url = "https://files.pythonhosted.org/packages/48/45/9d1780768d3b249accecc5a38c725eb1e203d44a191f7b7ff1941f7df60c/msgpack-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:5fd1b58e1431008a57247d6e7cc4faa41c3607e8e7d4aaf81f7c29ea013cb458", size = 72267 }, - { url = "https://files.pythonhosted.org/packages/e3/26/389b9c593eda2b8551b2e7126ad3a06af6f9b44274eb3a4f054d48ff7e47/msgpack-1.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ae497b11f4c21558d95de9f64fff7053544f4d1a17731c866143ed6bb4591238", size = 82359 }, - { url = "https://files.pythonhosted.org/packages/ab/65/7d1de38c8a22cf8b1551469159d4b6cf49be2126adc2482de50976084d78/msgpack-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:33be9ab121df9b6b461ff91baac6f2731f83d9b27ed948c5b9d1978ae28bf157", size = 79172 }, - { url = "https://files.pythonhosted.org/packages/0f/bd/cacf208b64d9577a62c74b677e1ada005caa9b69a05a599889d6fc2ab20a/msgpack-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f64ae8fe7ffba251fecb8408540c34ee9df1c26674c50c4544d72dbf792e5ce", size = 425013 }, - { url = "https://files.pythonhosted.org/packages/4d/ec/fd869e2567cc9c01278a736cfd1697941ba0d4b81a43e0aa2e8d71dab208/msgpack-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a494554874691720ba5891c9b0b39474ba43ffb1aaf32a5dac874effb1619e1a", size = 426905 }, - { url = "https://files.pythonhosted.org/packages/55/2a/35860f33229075bce803a5593d046d8b489d7ba2fc85701e714fc1aaf898/msgpack-1.1.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb643284ab0ed26f6957d969fe0dd8bb17beb567beb8998140b5e38a90974f6c", size = 407336 }, - { url = "https://files.pythonhosted.org/packages/8c/16/69ed8f3ada150bf92745fb4921bd621fd2cdf5a42e25eb50bcc57a5328f0/msgpack-1.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d275a9e3c81b1093c060c3837e580c37f47c51eca031f7b5fb76f7b8470f5f9b", size = 409485 }, - { url = "https://files.pythonhosted.org/packages/c6/b6/0c398039e4c6d0b2e37c61d7e0e9d13439f91f780686deb8ee64ecf1ae71/msgpack-1.1.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4fd6b577e4541676e0cc9ddc1709d25014d3ad9a66caa19962c4f5de30fc09ef", size = 412182 }, - { url = "https://files.pythonhosted.org/packages/b8/d0/0cf4a6ecb9bc960d624c93effaeaae75cbf00b3bc4a54f35c8507273cda1/msgpack-1.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb29aaa613c0a1c40d1af111abf025f1732cab333f96f285d6a93b934738a68a", size = 419883 }, - { url = "https://files.pythonhosted.org/packages/62/83/9697c211720fa71a2dfb632cad6196a8af3abea56eece220fde4674dc44b/msgpack-1.1.1-cp312-cp312-win32.whl", hash = "sha256:870b9a626280c86cff9c576ec0d9cbcc54a1e5ebda9cd26dab12baf41fee218c", size = 65406 }, - { url = "https://files.pythonhosted.org/packages/c0/23/0abb886e80eab08f5e8c485d6f13924028602829f63b8f5fa25a06636628/msgpack-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:5692095123007180dca3e788bb4c399cc26626da51629a31d40207cb262e67f4", size = 72558 }, - { url = "https://files.pythonhosted.org/packages/a1/38/561f01cf3577430b59b340b51329803d3a5bf6a45864a55f4ef308ac11e3/msgpack-1.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3765afa6bd4832fc11c3749be4ba4b69a0e8d7b728f78e68120a157a4c5d41f0", size = 81677 }, - { url = "https://files.pythonhosted.org/packages/09/48/54a89579ea36b6ae0ee001cba8c61f776451fad3c9306cd80f5b5c55be87/msgpack-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8ddb2bcfd1a8b9e431c8d6f4f7db0773084e107730ecf3472f1dfe9ad583f3d9", size = 78603 }, - { url = "https://files.pythonhosted.org/packages/a0/60/daba2699b308e95ae792cdc2ef092a38eb5ee422f9d2fbd4101526d8a210/msgpack-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:196a736f0526a03653d829d7d4c5500a97eea3648aebfd4b6743875f28aa2af8", size = 420504 }, - { url = "https://files.pythonhosted.org/packages/20/22/2ebae7ae43cd8f2debc35c631172ddf14e2a87ffcc04cf43ff9df9fff0d3/msgpack-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d592d06e3cc2f537ceeeb23d38799c6ad83255289bb84c2e5792e5a8dea268a", size = 423749 }, - { url = "https://files.pythonhosted.org/packages/40/1b/54c08dd5452427e1179a40b4b607e37e2664bca1c790c60c442c8e972e47/msgpack-1.1.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4df2311b0ce24f06ba253fda361f938dfecd7b961576f9be3f3fbd60e87130ac", size = 404458 }, - { url = "https://files.pythonhosted.org/packages/2e/60/6bb17e9ffb080616a51f09928fdd5cac1353c9becc6c4a8abd4e57269a16/msgpack-1.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e4141c5a32b5e37905b5940aacbc59739f036930367d7acce7a64e4dec1f5e0b", size = 405976 }, - { url = "https://files.pythonhosted.org/packages/ee/97/88983e266572e8707c1f4b99c8fd04f9eb97b43f2db40e3172d87d8642db/msgpack-1.1.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b1ce7f41670c5a69e1389420436f41385b1aa2504c3b0c30620764b15dded2e7", size = 408607 }, - { url = "https://files.pythonhosted.org/packages/bc/66/36c78af2efaffcc15a5a61ae0df53a1d025f2680122e2a9eb8442fed3ae4/msgpack-1.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4147151acabb9caed4e474c3344181e91ff7a388b888f1e19ea04f7e73dc7ad5", size = 424172 }, - { url = "https://files.pythonhosted.org/packages/8c/87/a75eb622b555708fe0427fab96056d39d4c9892b0c784b3a721088c7ee37/msgpack-1.1.1-cp313-cp313-win32.whl", hash = "sha256:500e85823a27d6d9bba1d057c871b4210c1dd6fb01fbb764e37e4e8847376323", size = 65347 }, - { url = "https://files.pythonhosted.org/packages/ca/91/7dc28d5e2a11a5ad804cf2b7f7a5fcb1eb5a4966d66a5d2b41aee6376543/msgpack-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:6d489fba546295983abd142812bda76b57e33d0b9f5d5b71c09a583285506f69", size = 72341 }, +sdist = { url = "https://files.pythonhosted.org/packages/45/b1/ea4f68038a18c77c9467400d166d74c4ffa536f34761f7983a104357e614/msgpack-1.1.1.tar.gz", hash = "sha256:77b79ce34a2bdab2594f490c8e80dd62a02d650b91a75159a63ec413b8d104cd", size = 173555, upload-time = "2025-06-13T06:52:51.324Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/83/97f24bf9848af23fe2ba04380388216defc49a8af6da0c28cc636d722502/msgpack-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:71ef05c1726884e44f8b1d1773604ab5d4d17729d8491403a705e649116c9558", size = 82728, upload-time = "2025-06-13T06:51:50.68Z" }, + { url = "https://files.pythonhosted.org/packages/aa/7f/2eaa388267a78401f6e182662b08a588ef4f3de6f0eab1ec09736a7aaa2b/msgpack-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:36043272c6aede309d29d56851f8841ba907a1a3d04435e43e8a19928e243c1d", size = 79279, upload-time = "2025-06-13T06:51:51.72Z" }, + { url = "https://files.pythonhosted.org/packages/f8/46/31eb60f4452c96161e4dfd26dbca562b4ec68c72e4ad07d9566d7ea35e8a/msgpack-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a32747b1b39c3ac27d0670122b57e6e57f28eefb725e0b625618d1b59bf9d1e0", size = 423859, upload-time = "2025-06-13T06:51:52.749Z" }, + { url = "https://files.pythonhosted.org/packages/45/16/a20fa8c32825cc7ae8457fab45670c7a8996d7746ce80ce41cc51e3b2bd7/msgpack-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a8b10fdb84a43e50d38057b06901ec9da52baac6983d3f709d8507f3889d43f", size = 429975, upload-time = "2025-06-13T06:51:53.97Z" }, + { url = "https://files.pythonhosted.org/packages/86/ea/6c958e07692367feeb1a1594d35e22b62f7f476f3c568b002a5ea09d443d/msgpack-1.1.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0c325c3f485dc54ec298d8b024e134acf07c10d494ffa24373bea729acf704", size = 413528, upload-time = "2025-06-13T06:51:55.507Z" }, + { url = "https://files.pythonhosted.org/packages/75/05/ac84063c5dae79722bda9f68b878dc31fc3059adb8633c79f1e82c2cd946/msgpack-1.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:88daaf7d146e48ec71212ce21109b66e06a98e5e44dca47d853cbfe171d6c8d2", size = 413338, upload-time = "2025-06-13T06:51:57.023Z" }, + { url = "https://files.pythonhosted.org/packages/69/e8/fe86b082c781d3e1c09ca0f4dacd457ede60a13119b6ce939efe2ea77b76/msgpack-1.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8b55ea20dc59b181d3f47103f113e6f28a5e1c89fd5b67b9140edb442ab67f2", size = 422658, upload-time = "2025-06-13T06:51:58.419Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2b/bafc9924df52d8f3bb7c00d24e57be477f4d0f967c0a31ef5e2225e035c7/msgpack-1.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a28e8072ae9779f20427af07f53bbb8b4aa81151054e882aee333b158da8752", size = 427124, upload-time = "2025-06-13T06:51:59.969Z" }, + { url = "https://files.pythonhosted.org/packages/a2/3b/1f717e17e53e0ed0b68fa59e9188f3f610c79d7151f0e52ff3cd8eb6b2dc/msgpack-1.1.1-cp311-cp311-win32.whl", hash = "sha256:7da8831f9a0fdb526621ba09a281fadc58ea12701bc709e7b8cbc362feabc295", size = 65016, upload-time = "2025-06-13T06:52:01.294Z" }, + { url = "https://files.pythonhosted.org/packages/48/45/9d1780768d3b249accecc5a38c725eb1e203d44a191f7b7ff1941f7df60c/msgpack-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:5fd1b58e1431008a57247d6e7cc4faa41c3607e8e7d4aaf81f7c29ea013cb458", size = 72267, upload-time = "2025-06-13T06:52:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/e3/26/389b9c593eda2b8551b2e7126ad3a06af6f9b44274eb3a4f054d48ff7e47/msgpack-1.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ae497b11f4c21558d95de9f64fff7053544f4d1a17731c866143ed6bb4591238", size = 82359, upload-time = "2025-06-13T06:52:03.909Z" }, + { url = "https://files.pythonhosted.org/packages/ab/65/7d1de38c8a22cf8b1551469159d4b6cf49be2126adc2482de50976084d78/msgpack-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:33be9ab121df9b6b461ff91baac6f2731f83d9b27ed948c5b9d1978ae28bf157", size = 79172, upload-time = "2025-06-13T06:52:05.246Z" }, + { url = "https://files.pythonhosted.org/packages/0f/bd/cacf208b64d9577a62c74b677e1ada005caa9b69a05a599889d6fc2ab20a/msgpack-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f64ae8fe7ffba251fecb8408540c34ee9df1c26674c50c4544d72dbf792e5ce", size = 425013, upload-time = "2025-06-13T06:52:06.341Z" }, + { url = "https://files.pythonhosted.org/packages/4d/ec/fd869e2567cc9c01278a736cfd1697941ba0d4b81a43e0aa2e8d71dab208/msgpack-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a494554874691720ba5891c9b0b39474ba43ffb1aaf32a5dac874effb1619e1a", size = 426905, upload-time = "2025-06-13T06:52:07.501Z" }, + { url = "https://files.pythonhosted.org/packages/55/2a/35860f33229075bce803a5593d046d8b489d7ba2fc85701e714fc1aaf898/msgpack-1.1.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb643284ab0ed26f6957d969fe0dd8bb17beb567beb8998140b5e38a90974f6c", size = 407336, upload-time = "2025-06-13T06:52:09.047Z" }, + { url = "https://files.pythonhosted.org/packages/8c/16/69ed8f3ada150bf92745fb4921bd621fd2cdf5a42e25eb50bcc57a5328f0/msgpack-1.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d275a9e3c81b1093c060c3837e580c37f47c51eca031f7b5fb76f7b8470f5f9b", size = 409485, upload-time = "2025-06-13T06:52:10.382Z" }, + { url = "https://files.pythonhosted.org/packages/c6/b6/0c398039e4c6d0b2e37c61d7e0e9d13439f91f780686deb8ee64ecf1ae71/msgpack-1.1.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4fd6b577e4541676e0cc9ddc1709d25014d3ad9a66caa19962c4f5de30fc09ef", size = 412182, upload-time = "2025-06-13T06:52:11.644Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d0/0cf4a6ecb9bc960d624c93effaeaae75cbf00b3bc4a54f35c8507273cda1/msgpack-1.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb29aaa613c0a1c40d1af111abf025f1732cab333f96f285d6a93b934738a68a", size = 419883, upload-time = "2025-06-13T06:52:12.806Z" }, + { url = "https://files.pythonhosted.org/packages/62/83/9697c211720fa71a2dfb632cad6196a8af3abea56eece220fde4674dc44b/msgpack-1.1.1-cp312-cp312-win32.whl", hash = "sha256:870b9a626280c86cff9c576ec0d9cbcc54a1e5ebda9cd26dab12baf41fee218c", size = 65406, upload-time = "2025-06-13T06:52:14.271Z" }, + { url = "https://files.pythonhosted.org/packages/c0/23/0abb886e80eab08f5e8c485d6f13924028602829f63b8f5fa25a06636628/msgpack-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:5692095123007180dca3e788bb4c399cc26626da51629a31d40207cb262e67f4", size = 72558, upload-time = "2025-06-13T06:52:15.252Z" }, + { url = "https://files.pythonhosted.org/packages/a1/38/561f01cf3577430b59b340b51329803d3a5bf6a45864a55f4ef308ac11e3/msgpack-1.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3765afa6bd4832fc11c3749be4ba4b69a0e8d7b728f78e68120a157a4c5d41f0", size = 81677, upload-time = "2025-06-13T06:52:16.64Z" }, + { url = "https://files.pythonhosted.org/packages/09/48/54a89579ea36b6ae0ee001cba8c61f776451fad3c9306cd80f5b5c55be87/msgpack-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8ddb2bcfd1a8b9e431c8d6f4f7db0773084e107730ecf3472f1dfe9ad583f3d9", size = 78603, upload-time = "2025-06-13T06:52:17.843Z" }, + { url = "https://files.pythonhosted.org/packages/a0/60/daba2699b308e95ae792cdc2ef092a38eb5ee422f9d2fbd4101526d8a210/msgpack-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:196a736f0526a03653d829d7d4c5500a97eea3648aebfd4b6743875f28aa2af8", size = 420504, upload-time = "2025-06-13T06:52:18.982Z" }, + { url = "https://files.pythonhosted.org/packages/20/22/2ebae7ae43cd8f2debc35c631172ddf14e2a87ffcc04cf43ff9df9fff0d3/msgpack-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d592d06e3cc2f537ceeeb23d38799c6ad83255289bb84c2e5792e5a8dea268a", size = 423749, upload-time = "2025-06-13T06:52:20.211Z" }, + { url = "https://files.pythonhosted.org/packages/40/1b/54c08dd5452427e1179a40b4b607e37e2664bca1c790c60c442c8e972e47/msgpack-1.1.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4df2311b0ce24f06ba253fda361f938dfecd7b961576f9be3f3fbd60e87130ac", size = 404458, upload-time = "2025-06-13T06:52:21.429Z" }, + { url = "https://files.pythonhosted.org/packages/2e/60/6bb17e9ffb080616a51f09928fdd5cac1353c9becc6c4a8abd4e57269a16/msgpack-1.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e4141c5a32b5e37905b5940aacbc59739f036930367d7acce7a64e4dec1f5e0b", size = 405976, upload-time = "2025-06-13T06:52:22.995Z" }, + { url = "https://files.pythonhosted.org/packages/ee/97/88983e266572e8707c1f4b99c8fd04f9eb97b43f2db40e3172d87d8642db/msgpack-1.1.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b1ce7f41670c5a69e1389420436f41385b1aa2504c3b0c30620764b15dded2e7", size = 408607, upload-time = "2025-06-13T06:52:24.152Z" }, + { url = "https://files.pythonhosted.org/packages/bc/66/36c78af2efaffcc15a5a61ae0df53a1d025f2680122e2a9eb8442fed3ae4/msgpack-1.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4147151acabb9caed4e474c3344181e91ff7a388b888f1e19ea04f7e73dc7ad5", size = 424172, upload-time = "2025-06-13T06:52:25.704Z" }, + { url = "https://files.pythonhosted.org/packages/8c/87/a75eb622b555708fe0427fab96056d39d4c9892b0c784b3a721088c7ee37/msgpack-1.1.1-cp313-cp313-win32.whl", hash = "sha256:500e85823a27d6d9bba1d057c871b4210c1dd6fb01fbb764e37e4e8847376323", size = 65347, upload-time = "2025-06-13T06:52:26.846Z" }, + { url = "https://files.pythonhosted.org/packages/ca/91/7dc28d5e2a11a5ad804cf2b7f7a5fcb1eb5a4966d66a5d2b41aee6376543/msgpack-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:6d489fba546295983abd142812bda76b57e33d0b9f5d5b71c09a583285506f69", size = 72341, upload-time = "2025-06-13T06:52:27.835Z" }, ] [[package]] name = "multidict" version = "6.6.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3d/2c/5dad12e82fbdf7470f29bff2171484bf07cb3b16ada60a6589af8f376440/multidict-6.6.3.tar.gz", hash = "sha256:798a9eb12dab0a6c2e29c1de6f3468af5cb2da6053a20dfa3344907eed0937cc", size = 101006 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/08/f0/1a39863ced51f639c81a5463fbfa9eb4df59c20d1a8769ab9ef4ca57ae04/multidict-6.6.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:18f4eba0cbac3546b8ae31e0bbc55b02c801ae3cbaf80c247fcdd89b456ff58c", size = 76445 }, - { url = "https://files.pythonhosted.org/packages/c9/0e/a7cfa451c7b0365cd844e90b41e21fab32edaa1e42fc0c9f68461ce44ed7/multidict-6.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef43b5dd842382329e4797c46f10748d8c2b6e0614f46b4afe4aee9ac33159df", size = 44610 }, - { url = "https://files.pythonhosted.org/packages/c6/bb/a14a4efc5ee748cc1904b0748be278c31b9295ce5f4d2ef66526f410b94d/multidict-6.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf9bd1fd5eec01494e0f2e8e446a74a85d5e49afb63d75a9934e4a5423dba21d", size = 44267 }, - { url = "https://files.pythonhosted.org/packages/c2/f8/410677d563c2d55e063ef74fe578f9d53fe6b0a51649597a5861f83ffa15/multidict-6.6.3-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:5bd8d6f793a787153956cd35e24f60485bf0651c238e207b9a54f7458b16d539", size = 230004 }, - { url = "https://files.pythonhosted.org/packages/fd/df/2b787f80059314a98e1ec6a4cc7576244986df3e56b3c755e6fc7c99e038/multidict-6.6.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bf99b4daf908c73856bd87ee0a2499c3c9a3d19bb04b9c6025e66af3fd07462", size = 247196 }, - { url = "https://files.pythonhosted.org/packages/05/f2/f9117089151b9a8ab39f9019620d10d9718eec2ac89e7ca9d30f3ec78e96/multidict-6.6.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b9e59946b49dafaf990fd9c17ceafa62976e8471a14952163d10a7a630413a9", size = 225337 }, - { url = "https://files.pythonhosted.org/packages/93/2d/7115300ec5b699faa152c56799b089a53ed69e399c3c2d528251f0aeda1a/multidict-6.6.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e2db616467070d0533832d204c54eea6836a5e628f2cb1e6dfd8cd6ba7277cb7", size = 257079 }, - { url = "https://files.pythonhosted.org/packages/15/ea/ff4bab367623e39c20d3b07637225c7688d79e4f3cc1f3b9f89867677f9a/multidict-6.6.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7394888236621f61dcdd25189b2768ae5cc280f041029a5bcf1122ac63df79f9", size = 255461 }, - { url = "https://files.pythonhosted.org/packages/74/07/2c9246cda322dfe08be85f1b8739646f2c4c5113a1422d7a407763422ec4/multidict-6.6.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f114d8478733ca7388e7c7e0ab34b72547476b97009d643644ac33d4d3fe1821", size = 246611 }, - { url = "https://files.pythonhosted.org/packages/a8/62/279c13d584207d5697a752a66ffc9bb19355a95f7659140cb1b3cf82180e/multidict-6.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cdf22e4db76d323bcdc733514bf732e9fb349707c98d341d40ebcc6e9318ef3d", size = 243102 }, - { url = "https://files.pythonhosted.org/packages/69/cc/e06636f48c6d51e724a8bc8d9e1db5f136fe1df066d7cafe37ef4000f86a/multidict-6.6.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e995a34c3d44ab511bfc11aa26869b9d66c2d8c799fa0e74b28a473a692532d6", size = 238693 }, - { url = "https://files.pythonhosted.org/packages/89/a4/66c9d8fb9acf3b226cdd468ed009537ac65b520aebdc1703dd6908b19d33/multidict-6.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:766a4a5996f54361d8d5a9050140aa5362fe48ce51c755a50c0bc3706460c430", size = 246582 }, - { url = "https://files.pythonhosted.org/packages/cf/01/c69e0317be556e46257826d5449feb4e6aa0d18573e567a48a2c14156f1f/multidict-6.6.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3893a0d7d28a7fe6ca7a1f760593bc13038d1d35daf52199d431b61d2660602b", size = 253355 }, - { url = "https://files.pythonhosted.org/packages/c0/da/9cc1da0299762d20e626fe0042e71b5694f9f72d7d3f9678397cbaa71b2b/multidict-6.6.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:934796c81ea996e61914ba58064920d6cad5d99140ac3167901eb932150e2e56", size = 247774 }, - { url = "https://files.pythonhosted.org/packages/e6/91/b22756afec99cc31105ddd4a52f95ab32b1a4a58f4d417979c570c4a922e/multidict-6.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9ed948328aec2072bc00f05d961ceadfd3e9bfc2966c1319aeaf7b7c21219183", size = 242275 }, - { url = "https://files.pythonhosted.org/packages/be/f1/adcc185b878036a20399d5be5228f3cbe7f823d78985d101d425af35c800/multidict-6.6.3-cp311-cp311-win32.whl", hash = "sha256:9f5b28c074c76afc3e4c610c488e3493976fe0e596dd3db6c8ddfbb0134dcac5", size = 41290 }, - { url = "https://files.pythonhosted.org/packages/e0/d4/27652c1c6526ea6b4f5ddd397e93f4232ff5de42bea71d339bc6a6cc497f/multidict-6.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc7f6fbc61b1c16050a389c630da0b32fc6d4a3d191394ab78972bf5edc568c2", size = 45942 }, - { url = "https://files.pythonhosted.org/packages/16/18/23f4932019804e56d3c2413e237f866444b774b0263bcb81df2fdecaf593/multidict-6.6.3-cp311-cp311-win_arm64.whl", hash = "sha256:d4e47d8faffaae822fb5cba20937c048d4f734f43572e7079298a6c39fb172cb", size = 42880 }, - { url = "https://files.pythonhosted.org/packages/0e/a0/6b57988ea102da0623ea814160ed78d45a2645e4bbb499c2896d12833a70/multidict-6.6.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:056bebbeda16b2e38642d75e9e5310c484b7c24e3841dc0fb943206a72ec89d6", size = 76514 }, - { url = "https://files.pythonhosted.org/packages/07/7a/d1e92665b0850c6c0508f101f9cf0410c1afa24973e1115fe9c6a185ebf7/multidict-6.6.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e5f481cccb3c5c5e5de5d00b5141dc589c1047e60d07e85bbd7dea3d4580d63f", size = 45394 }, - { url = "https://files.pythonhosted.org/packages/52/6f/dd104490e01be6ef8bf9573705d8572f8c2d2c561f06e3826b081d9e6591/multidict-6.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:10bea2ee839a759ee368b5a6e47787f399b41e70cf0c20d90dfaf4158dfb4e55", size = 43590 }, - { url = "https://files.pythonhosted.org/packages/44/fe/06e0e01b1b0611e6581b7fd5a85b43dacc08b6cea3034f902f383b0873e5/multidict-6.6.3-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:2334cfb0fa9549d6ce2c21af2bfbcd3ac4ec3646b1b1581c88e3e2b1779ec92b", size = 237292 }, - { url = "https://files.pythonhosted.org/packages/ce/71/4f0e558fb77696b89c233c1ee2d92f3e1d5459070a0e89153c9e9e804186/multidict-6.6.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8fee016722550a2276ca2cb5bb624480e0ed2bd49125b2b73b7010b9090e888", size = 258385 }, - { url = "https://files.pythonhosted.org/packages/e3/25/cca0e68228addad24903801ed1ab42e21307a1b4b6dd2cf63da5d3ae082a/multidict-6.6.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5511cb35f5c50a2db21047c875eb42f308c5583edf96bd8ebf7d770a9d68f6d", size = 242328 }, - { url = "https://files.pythonhosted.org/packages/6e/a3/46f2d420d86bbcb8fe660b26a10a219871a0fbf4d43cb846a4031533f3e0/multidict-6.6.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:712b348f7f449948e0a6c4564a21c7db965af900973a67db432d724619b3c680", size = 268057 }, - { url = "https://files.pythonhosted.org/packages/9e/73/1c743542fe00794a2ec7466abd3f312ccb8fad8dff9f36d42e18fb1ec33e/multidict-6.6.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e4e15d2138ee2694e038e33b7c3da70e6b0ad8868b9f8094a72e1414aeda9c1a", size = 269341 }, - { url = "https://files.pythonhosted.org/packages/a4/11/6ec9dcbe2264b92778eeb85407d1df18812248bf3506a5a1754bc035db0c/multidict-6.6.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8df25594989aebff8a130f7899fa03cbfcc5d2b5f4a461cf2518236fe6f15961", size = 256081 }, - { url = "https://files.pythonhosted.org/packages/9b/2b/631b1e2afeb5f1696846d747d36cda075bfdc0bc7245d6ba5c319278d6c4/multidict-6.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:159ca68bfd284a8860f8d8112cf0521113bffd9c17568579e4d13d1f1dc76b65", size = 253581 }, - { url = "https://files.pythonhosted.org/packages/bf/0e/7e3b93f79efeb6111d3bf9a1a69e555ba1d07ad1c11bceb56b7310d0d7ee/multidict-6.6.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e098c17856a8c9ade81b4810888c5ad1914099657226283cab3062c0540b0643", size = 250750 }, - { url = "https://files.pythonhosted.org/packages/ad/9e/086846c1d6601948e7de556ee464a2d4c85e33883e749f46b9547d7b0704/multidict-6.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:67c92ed673049dec52d7ed39f8cf9ebbadf5032c774058b4406d18c8f8fe7063", size = 251548 }, - { url = "https://files.pythonhosted.org/packages/8c/7b/86ec260118e522f1a31550e87b23542294880c97cfbf6fb18cc67b044c66/multidict-6.6.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:bd0578596e3a835ef451784053cfd327d607fc39ea1a14812139339a18a0dbc3", size = 262718 }, - { url = "https://files.pythonhosted.org/packages/8c/bd/22ce8f47abb0be04692c9fc4638508b8340987b18691aa7775d927b73f72/multidict-6.6.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:346055630a2df2115cd23ae271910b4cae40f4e336773550dca4889b12916e75", size = 259603 }, - { url = "https://files.pythonhosted.org/packages/07/9c/91b7ac1691be95cd1f4a26e36a74b97cda6aa9820632d31aab4410f46ebd/multidict-6.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:555ff55a359302b79de97e0468e9ee80637b0de1fce77721639f7cd9440b3a10", size = 251351 }, - { url = "https://files.pythonhosted.org/packages/6f/5c/4d7adc739884f7a9fbe00d1eac8c034023ef8bad71f2ebe12823ca2e3649/multidict-6.6.3-cp312-cp312-win32.whl", hash = "sha256:73ab034fb8d58ff85c2bcbadc470efc3fafeea8affcf8722855fb94557f14cc5", size = 41860 }, - { url = "https://files.pythonhosted.org/packages/6a/a3/0fbc7afdf7cb1aa12a086b02959307848eb6bcc8f66fcb66c0cb57e2a2c1/multidict-6.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:04cbcce84f63b9af41bad04a54d4cc4e60e90c35b9e6ccb130be2d75b71f8c17", size = 45982 }, - { url = "https://files.pythonhosted.org/packages/b8/95/8c825bd70ff9b02462dc18d1295dd08d3e9e4eb66856d292ffa62cfe1920/multidict-6.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:0f1130b896ecb52d2a1e615260f3ea2af55fa7dc3d7c3003ba0c3121a759b18b", size = 43210 }, - { url = "https://files.pythonhosted.org/packages/52/1d/0bebcbbb4f000751fbd09957257903d6e002943fc668d841a4cf2fb7f872/multidict-6.6.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:540d3c06d48507357a7d57721e5094b4f7093399a0106c211f33540fdc374d55", size = 75843 }, - { url = "https://files.pythonhosted.org/packages/07/8f/cbe241b0434cfe257f65c2b1bcf9e8d5fb52bc708c5061fb29b0fed22bdf/multidict-6.6.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9c19cea2a690f04247d43f366d03e4eb110a0dc4cd1bbeee4d445435428ed35b", size = 45053 }, - { url = "https://files.pythonhosted.org/packages/32/d2/0b3b23f9dbad5b270b22a3ac3ea73ed0a50ef2d9a390447061178ed6bdb8/multidict-6.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7af039820cfd00effec86bda5d8debef711a3e86a1d3772e85bea0f243a4bd65", size = 43273 }, - { url = "https://files.pythonhosted.org/packages/fd/fe/6eb68927e823999e3683bc49678eb20374ba9615097d085298fd5b386564/multidict-6.6.3-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:500b84f51654fdc3944e936f2922114349bf8fdcac77c3092b03449f0e5bc2b3", size = 237124 }, - { url = "https://files.pythonhosted.org/packages/e7/ab/320d8507e7726c460cb77117848b3834ea0d59e769f36fdae495f7669929/multidict-6.6.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3fc723ab8a5c5ed6c50418e9bfcd8e6dceba6c271cee6728a10a4ed8561520c", size = 256892 }, - { url = "https://files.pythonhosted.org/packages/76/60/38ee422db515ac69834e60142a1a69111ac96026e76e8e9aa347fd2e4591/multidict-6.6.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:94c47ea3ade005b5976789baaed66d4de4480d0a0bf31cef6edaa41c1e7b56a6", size = 240547 }, - { url = "https://files.pythonhosted.org/packages/27/fb/905224fde2dff042b030c27ad95a7ae744325cf54b890b443d30a789b80e/multidict-6.6.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dbc7cf464cc6d67e83e136c9f55726da3a30176f020a36ead246eceed87f1cd8", size = 266223 }, - { url = "https://files.pythonhosted.org/packages/76/35/dc38ab361051beae08d1a53965e3e1a418752fc5be4d3fb983c5582d8784/multidict-6.6.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:900eb9f9da25ada070f8ee4a23f884e0ee66fe4e1a38c3af644256a508ad81ca", size = 267262 }, - { url = "https://files.pythonhosted.org/packages/1f/a3/0a485b7f36e422421b17e2bbb5a81c1af10eac1d4476f2ff92927c730479/multidict-6.6.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c6df517cf177da5d47ab15407143a89cd1a23f8b335f3a28d57e8b0a3dbb884", size = 254345 }, - { url = "https://files.pythonhosted.org/packages/b4/59/bcdd52c1dab7c0e0d75ff19cac751fbd5f850d1fc39172ce809a74aa9ea4/multidict-6.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ef421045f13879e21c994b36e728d8e7d126c91a64b9185810ab51d474f27e7", size = 252248 }, - { url = "https://files.pythonhosted.org/packages/bb/a4/2d96aaa6eae8067ce108d4acee6f45ced5728beda55c0f02ae1072c730d1/multidict-6.6.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:6c1e61bb4f80895c081790b6b09fa49e13566df8fbff817da3f85b3a8192e36b", size = 250115 }, - { url = "https://files.pythonhosted.org/packages/25/d2/ed9f847fa5c7d0677d4f02ea2c163d5e48573de3f57bacf5670e43a5ffaa/multidict-6.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e5e8523bb12d7623cd8300dbd91b9e439a46a028cd078ca695eb66ba31adee3c", size = 249649 }, - { url = "https://files.pythonhosted.org/packages/1f/af/9155850372563fc550803d3f25373308aa70f59b52cff25854086ecb4a79/multidict-6.6.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ef58340cc896219e4e653dade08fea5c55c6df41bcc68122e3be3e9d873d9a7b", size = 261203 }, - { url = "https://files.pythonhosted.org/packages/36/2f/c6a728f699896252cf309769089568a33c6439626648843f78743660709d/multidict-6.6.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc9dc435ec8699e7b602b94fe0cd4703e69273a01cbc34409af29e7820f777f1", size = 258051 }, - { url = "https://files.pythonhosted.org/packages/d0/60/689880776d6b18fa2b70f6cc74ff87dd6c6b9b47bd9cf74c16fecfaa6ad9/multidict-6.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9e864486ef4ab07db5e9cb997bad2b681514158d6954dd1958dfb163b83d53e6", size = 249601 }, - { url = "https://files.pythonhosted.org/packages/75/5e/325b11f2222a549019cf2ef879c1f81f94a0d40ace3ef55cf529915ba6cc/multidict-6.6.3-cp313-cp313-win32.whl", hash = "sha256:5633a82fba8e841bc5c5c06b16e21529573cd654f67fd833650a215520a6210e", size = 41683 }, - { url = "https://files.pythonhosted.org/packages/b1/ad/cf46e73f5d6e3c775cabd2a05976547f3f18b39bee06260369a42501f053/multidict-6.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:e93089c1570a4ad54c3714a12c2cef549dc9d58e97bcded193d928649cab78e9", size = 45811 }, - { url = "https://files.pythonhosted.org/packages/c5/c9/2e3fe950db28fb7c62e1a5f46e1e38759b072e2089209bc033c2798bb5ec/multidict-6.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:c60b401f192e79caec61f166da9c924e9f8bc65548d4246842df91651e83d600", size = 43056 }, - { url = "https://files.pythonhosted.org/packages/3a/58/aaf8114cf34966e084a8cc9517771288adb53465188843d5a19862cb6dc3/multidict-6.6.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:02fd8f32d403a6ff13864b0851f1f523d4c988051eea0471d4f1fd8010f11134", size = 82811 }, - { url = "https://files.pythonhosted.org/packages/71/af/5402e7b58a1f5b987a07ad98f2501fdba2a4f4b4c30cf114e3ce8db64c87/multidict-6.6.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f3aa090106b1543f3f87b2041eef3c156c8da2aed90c63a2fbed62d875c49c37", size = 48304 }, - { url = "https://files.pythonhosted.org/packages/39/65/ab3c8cafe21adb45b24a50266fd747147dec7847425bc2a0f6934b3ae9ce/multidict-6.6.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e924fb978615a5e33ff644cc42e6aa241effcf4f3322c09d4f8cebde95aff5f8", size = 46775 }, - { url = "https://files.pythonhosted.org/packages/49/ba/9fcc1b332f67cc0c0c8079e263bfab6660f87fe4e28a35921771ff3eea0d/multidict-6.6.3-cp313-cp313t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:b9fe5a0e57c6dbd0e2ce81ca66272282c32cd11d31658ee9553849d91289e1c1", size = 229773 }, - { url = "https://files.pythonhosted.org/packages/a4/14/0145a251f555f7c754ce2dcbcd012939bbd1f34f066fa5d28a50e722a054/multidict-6.6.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b24576f208793ebae00280c59927c3b7c2a3b1655e443a25f753c4611bc1c373", size = 250083 }, - { url = "https://files.pythonhosted.org/packages/9e/d4/d5c0bd2bbb173b586c249a151a26d2fb3ec7d53c96e42091c9fef4e1f10c/multidict-6.6.3-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:135631cb6c58eac37d7ac0df380294fecdc026b28837fa07c02e459c7fb9c54e", size = 228980 }, - { url = "https://files.pythonhosted.org/packages/21/32/c9a2d8444a50ec48c4733ccc67254100c10e1c8ae8e40c7a2d2183b59b97/multidict-6.6.3-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:274d416b0df887aef98f19f21578653982cfb8a05b4e187d4a17103322eeaf8f", size = 257776 }, - { url = "https://files.pythonhosted.org/packages/68/d0/14fa1699f4ef629eae08ad6201c6b476098f5efb051b296f4c26be7a9fdf/multidict-6.6.3-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e252017a817fad7ce05cafbe5711ed40faeb580e63b16755a3a24e66fa1d87c0", size = 256882 }, - { url = "https://files.pythonhosted.org/packages/da/88/84a27570fbe303c65607d517a5f147cd2fc046c2d1da02b84b17b9bdc2aa/multidict-6.6.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e4cc8d848cd4fe1cdee28c13ea79ab0ed37fc2e89dd77bac86a2e7959a8c3bc", size = 247816 }, - { url = "https://files.pythonhosted.org/packages/1c/60/dca352a0c999ce96a5d8b8ee0b2b9f729dcad2e0b0c195f8286269a2074c/multidict-6.6.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9e236a7094b9c4c1b7585f6b9cca34b9d833cf079f7e4c49e6a4a6ec9bfdc68f", size = 245341 }, - { url = "https://files.pythonhosted.org/packages/50/ef/433fa3ed06028f03946f3993223dada70fb700f763f70c00079533c34578/multidict-6.6.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e0cb0ab69915c55627c933f0b555a943d98ba71b4d1c57bc0d0a66e2567c7471", size = 235854 }, - { url = "https://files.pythonhosted.org/packages/1b/1f/487612ab56fbe35715320905215a57fede20de7db40a261759690dc80471/multidict-6.6.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:81ef2f64593aba09c5212a3d0f8c906a0d38d710a011f2f42759704d4557d3f2", size = 243432 }, - { url = "https://files.pythonhosted.org/packages/da/6f/ce8b79de16cd885c6f9052c96a3671373d00c59b3ee635ea93e6e81b8ccf/multidict-6.6.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:b9cbc60010de3562545fa198bfc6d3825df430ea96d2cc509c39bd71e2e7d648", size = 252731 }, - { url = "https://files.pythonhosted.org/packages/bb/fe/a2514a6aba78e5abefa1624ca85ae18f542d95ac5cde2e3815a9fbf369aa/multidict-6.6.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:70d974eaaa37211390cd02ef93b7e938de564bbffa866f0b08d07e5e65da783d", size = 247086 }, - { url = "https://files.pythonhosted.org/packages/8c/22/b788718d63bb3cce752d107a57c85fcd1a212c6c778628567c9713f9345a/multidict-6.6.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3713303e4a6663c6d01d648a68f2848701001f3390a030edaaf3fc949c90bf7c", size = 243338 }, - { url = "https://files.pythonhosted.org/packages/22/d6/fdb3d0670819f2228f3f7d9af613d5e652c15d170c83e5f1c94fbc55a25b/multidict-6.6.3-cp313-cp313t-win32.whl", hash = "sha256:639ecc9fe7cd73f2495f62c213e964843826f44505a3e5d82805aa85cac6f89e", size = 47812 }, - { url = "https://files.pythonhosted.org/packages/b6/d6/a9d2c808f2c489ad199723197419207ecbfbc1776f6e155e1ecea9c883aa/multidict-6.6.3-cp313-cp313t-win_amd64.whl", hash = "sha256:9f97e181f344a0ef3881b573d31de8542cc0dbc559ec68c8f8b5ce2c2e91646d", size = 53011 }, - { url = "https://files.pythonhosted.org/packages/f2/40/b68001cba8188dd267590a111f9661b6256debc327137667e832bf5d66e8/multidict-6.6.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ce8b7693da41a3c4fde5871c738a81490cea5496c671d74374c8ab889e1834fb", size = 45254 }, - { url = "https://files.pythonhosted.org/packages/d8/30/9aec301e9772b098c1f5c0ca0279237c9766d94b97802e9888010c64b0ed/multidict-6.6.3-py3-none-any.whl", hash = "sha256:8db10f29c7541fc5da4defd8cd697e1ca429db743fa716325f236079b96f775a", size = 12313 }, +sdist = { url = "https://files.pythonhosted.org/packages/3d/2c/5dad12e82fbdf7470f29bff2171484bf07cb3b16ada60a6589af8f376440/multidict-6.6.3.tar.gz", hash = "sha256:798a9eb12dab0a6c2e29c1de6f3468af5cb2da6053a20dfa3344907eed0937cc", size = 101006, upload-time = "2025-06-30T15:53:46.929Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/f0/1a39863ced51f639c81a5463fbfa9eb4df59c20d1a8769ab9ef4ca57ae04/multidict-6.6.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:18f4eba0cbac3546b8ae31e0bbc55b02c801ae3cbaf80c247fcdd89b456ff58c", size = 76445, upload-time = "2025-06-30T15:51:24.01Z" }, + { url = "https://files.pythonhosted.org/packages/c9/0e/a7cfa451c7b0365cd844e90b41e21fab32edaa1e42fc0c9f68461ce44ed7/multidict-6.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef43b5dd842382329e4797c46f10748d8c2b6e0614f46b4afe4aee9ac33159df", size = 44610, upload-time = "2025-06-30T15:51:25.158Z" }, + { url = "https://files.pythonhosted.org/packages/c6/bb/a14a4efc5ee748cc1904b0748be278c31b9295ce5f4d2ef66526f410b94d/multidict-6.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf9bd1fd5eec01494e0f2e8e446a74a85d5e49afb63d75a9934e4a5423dba21d", size = 44267, upload-time = "2025-06-30T15:51:26.326Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f8/410677d563c2d55e063ef74fe578f9d53fe6b0a51649597a5861f83ffa15/multidict-6.6.3-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:5bd8d6f793a787153956cd35e24f60485bf0651c238e207b9a54f7458b16d539", size = 230004, upload-time = "2025-06-30T15:51:27.491Z" }, + { url = "https://files.pythonhosted.org/packages/fd/df/2b787f80059314a98e1ec6a4cc7576244986df3e56b3c755e6fc7c99e038/multidict-6.6.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bf99b4daf908c73856bd87ee0a2499c3c9a3d19bb04b9c6025e66af3fd07462", size = 247196, upload-time = "2025-06-30T15:51:28.762Z" }, + { url = "https://files.pythonhosted.org/packages/05/f2/f9117089151b9a8ab39f9019620d10d9718eec2ac89e7ca9d30f3ec78e96/multidict-6.6.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b9e59946b49dafaf990fd9c17ceafa62976e8471a14952163d10a7a630413a9", size = 225337, upload-time = "2025-06-30T15:51:30.025Z" }, + { url = "https://files.pythonhosted.org/packages/93/2d/7115300ec5b699faa152c56799b089a53ed69e399c3c2d528251f0aeda1a/multidict-6.6.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e2db616467070d0533832d204c54eea6836a5e628f2cb1e6dfd8cd6ba7277cb7", size = 257079, upload-time = "2025-06-30T15:51:31.716Z" }, + { url = "https://files.pythonhosted.org/packages/15/ea/ff4bab367623e39c20d3b07637225c7688d79e4f3cc1f3b9f89867677f9a/multidict-6.6.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7394888236621f61dcdd25189b2768ae5cc280f041029a5bcf1122ac63df79f9", size = 255461, upload-time = "2025-06-30T15:51:33.029Z" }, + { url = "https://files.pythonhosted.org/packages/74/07/2c9246cda322dfe08be85f1b8739646f2c4c5113a1422d7a407763422ec4/multidict-6.6.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f114d8478733ca7388e7c7e0ab34b72547476b97009d643644ac33d4d3fe1821", size = 246611, upload-time = "2025-06-30T15:51:34.47Z" }, + { url = "https://files.pythonhosted.org/packages/a8/62/279c13d584207d5697a752a66ffc9bb19355a95f7659140cb1b3cf82180e/multidict-6.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cdf22e4db76d323bcdc733514bf732e9fb349707c98d341d40ebcc6e9318ef3d", size = 243102, upload-time = "2025-06-30T15:51:36.525Z" }, + { url = "https://files.pythonhosted.org/packages/69/cc/e06636f48c6d51e724a8bc8d9e1db5f136fe1df066d7cafe37ef4000f86a/multidict-6.6.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e995a34c3d44ab511bfc11aa26869b9d66c2d8c799fa0e74b28a473a692532d6", size = 238693, upload-time = "2025-06-30T15:51:38.278Z" }, + { url = "https://files.pythonhosted.org/packages/89/a4/66c9d8fb9acf3b226cdd468ed009537ac65b520aebdc1703dd6908b19d33/multidict-6.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:766a4a5996f54361d8d5a9050140aa5362fe48ce51c755a50c0bc3706460c430", size = 246582, upload-time = "2025-06-30T15:51:39.709Z" }, + { url = "https://files.pythonhosted.org/packages/cf/01/c69e0317be556e46257826d5449feb4e6aa0d18573e567a48a2c14156f1f/multidict-6.6.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3893a0d7d28a7fe6ca7a1f760593bc13038d1d35daf52199d431b61d2660602b", size = 253355, upload-time = "2025-06-30T15:51:41.013Z" }, + { url = "https://files.pythonhosted.org/packages/c0/da/9cc1da0299762d20e626fe0042e71b5694f9f72d7d3f9678397cbaa71b2b/multidict-6.6.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:934796c81ea996e61914ba58064920d6cad5d99140ac3167901eb932150e2e56", size = 247774, upload-time = "2025-06-30T15:51:42.291Z" }, + { url = "https://files.pythonhosted.org/packages/e6/91/b22756afec99cc31105ddd4a52f95ab32b1a4a58f4d417979c570c4a922e/multidict-6.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9ed948328aec2072bc00f05d961ceadfd3e9bfc2966c1319aeaf7b7c21219183", size = 242275, upload-time = "2025-06-30T15:51:43.642Z" }, + { url = "https://files.pythonhosted.org/packages/be/f1/adcc185b878036a20399d5be5228f3cbe7f823d78985d101d425af35c800/multidict-6.6.3-cp311-cp311-win32.whl", hash = "sha256:9f5b28c074c76afc3e4c610c488e3493976fe0e596dd3db6c8ddfbb0134dcac5", size = 41290, upload-time = "2025-06-30T15:51:45.264Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d4/27652c1c6526ea6b4f5ddd397e93f4232ff5de42bea71d339bc6a6cc497f/multidict-6.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc7f6fbc61b1c16050a389c630da0b32fc6d4a3d191394ab78972bf5edc568c2", size = 45942, upload-time = "2025-06-30T15:51:46.377Z" }, + { url = "https://files.pythonhosted.org/packages/16/18/23f4932019804e56d3c2413e237f866444b774b0263bcb81df2fdecaf593/multidict-6.6.3-cp311-cp311-win_arm64.whl", hash = "sha256:d4e47d8faffaae822fb5cba20937c048d4f734f43572e7079298a6c39fb172cb", size = 42880, upload-time = "2025-06-30T15:51:47.561Z" }, + { url = "https://files.pythonhosted.org/packages/0e/a0/6b57988ea102da0623ea814160ed78d45a2645e4bbb499c2896d12833a70/multidict-6.6.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:056bebbeda16b2e38642d75e9e5310c484b7c24e3841dc0fb943206a72ec89d6", size = 76514, upload-time = "2025-06-30T15:51:48.728Z" }, + { url = "https://files.pythonhosted.org/packages/07/7a/d1e92665b0850c6c0508f101f9cf0410c1afa24973e1115fe9c6a185ebf7/multidict-6.6.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e5f481cccb3c5c5e5de5d00b5141dc589c1047e60d07e85bbd7dea3d4580d63f", size = 45394, upload-time = "2025-06-30T15:51:49.986Z" }, + { url = "https://files.pythonhosted.org/packages/52/6f/dd104490e01be6ef8bf9573705d8572f8c2d2c561f06e3826b081d9e6591/multidict-6.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:10bea2ee839a759ee368b5a6e47787f399b41e70cf0c20d90dfaf4158dfb4e55", size = 43590, upload-time = "2025-06-30T15:51:51.331Z" }, + { url = "https://files.pythonhosted.org/packages/44/fe/06e0e01b1b0611e6581b7fd5a85b43dacc08b6cea3034f902f383b0873e5/multidict-6.6.3-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:2334cfb0fa9549d6ce2c21af2bfbcd3ac4ec3646b1b1581c88e3e2b1779ec92b", size = 237292, upload-time = "2025-06-30T15:51:52.584Z" }, + { url = "https://files.pythonhosted.org/packages/ce/71/4f0e558fb77696b89c233c1ee2d92f3e1d5459070a0e89153c9e9e804186/multidict-6.6.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8fee016722550a2276ca2cb5bb624480e0ed2bd49125b2b73b7010b9090e888", size = 258385, upload-time = "2025-06-30T15:51:53.913Z" }, + { url = "https://files.pythonhosted.org/packages/e3/25/cca0e68228addad24903801ed1ab42e21307a1b4b6dd2cf63da5d3ae082a/multidict-6.6.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5511cb35f5c50a2db21047c875eb42f308c5583edf96bd8ebf7d770a9d68f6d", size = 242328, upload-time = "2025-06-30T15:51:55.672Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a3/46f2d420d86bbcb8fe660b26a10a219871a0fbf4d43cb846a4031533f3e0/multidict-6.6.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:712b348f7f449948e0a6c4564a21c7db965af900973a67db432d724619b3c680", size = 268057, upload-time = "2025-06-30T15:51:57.037Z" }, + { url = "https://files.pythonhosted.org/packages/9e/73/1c743542fe00794a2ec7466abd3f312ccb8fad8dff9f36d42e18fb1ec33e/multidict-6.6.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e4e15d2138ee2694e038e33b7c3da70e6b0ad8868b9f8094a72e1414aeda9c1a", size = 269341, upload-time = "2025-06-30T15:51:59.111Z" }, + { url = "https://files.pythonhosted.org/packages/a4/11/6ec9dcbe2264b92778eeb85407d1df18812248bf3506a5a1754bc035db0c/multidict-6.6.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8df25594989aebff8a130f7899fa03cbfcc5d2b5f4a461cf2518236fe6f15961", size = 256081, upload-time = "2025-06-30T15:52:00.533Z" }, + { url = "https://files.pythonhosted.org/packages/9b/2b/631b1e2afeb5f1696846d747d36cda075bfdc0bc7245d6ba5c319278d6c4/multidict-6.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:159ca68bfd284a8860f8d8112cf0521113bffd9c17568579e4d13d1f1dc76b65", size = 253581, upload-time = "2025-06-30T15:52:02.43Z" }, + { url = "https://files.pythonhosted.org/packages/bf/0e/7e3b93f79efeb6111d3bf9a1a69e555ba1d07ad1c11bceb56b7310d0d7ee/multidict-6.6.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:e098c17856a8c9ade81b4810888c5ad1914099657226283cab3062c0540b0643", size = 250750, upload-time = "2025-06-30T15:52:04.26Z" }, + { url = "https://files.pythonhosted.org/packages/ad/9e/086846c1d6601948e7de556ee464a2d4c85e33883e749f46b9547d7b0704/multidict-6.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:67c92ed673049dec52d7ed39f8cf9ebbadf5032c774058b4406d18c8f8fe7063", size = 251548, upload-time = "2025-06-30T15:52:06.002Z" }, + { url = "https://files.pythonhosted.org/packages/8c/7b/86ec260118e522f1a31550e87b23542294880c97cfbf6fb18cc67b044c66/multidict-6.6.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:bd0578596e3a835ef451784053cfd327d607fc39ea1a14812139339a18a0dbc3", size = 262718, upload-time = "2025-06-30T15:52:07.707Z" }, + { url = "https://files.pythonhosted.org/packages/8c/bd/22ce8f47abb0be04692c9fc4638508b8340987b18691aa7775d927b73f72/multidict-6.6.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:346055630a2df2115cd23ae271910b4cae40f4e336773550dca4889b12916e75", size = 259603, upload-time = "2025-06-30T15:52:09.58Z" }, + { url = "https://files.pythonhosted.org/packages/07/9c/91b7ac1691be95cd1f4a26e36a74b97cda6aa9820632d31aab4410f46ebd/multidict-6.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:555ff55a359302b79de97e0468e9ee80637b0de1fce77721639f7cd9440b3a10", size = 251351, upload-time = "2025-06-30T15:52:10.947Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5c/4d7adc739884f7a9fbe00d1eac8c034023ef8bad71f2ebe12823ca2e3649/multidict-6.6.3-cp312-cp312-win32.whl", hash = "sha256:73ab034fb8d58ff85c2bcbadc470efc3fafeea8affcf8722855fb94557f14cc5", size = 41860, upload-time = "2025-06-30T15:52:12.334Z" }, + { url = "https://files.pythonhosted.org/packages/6a/a3/0fbc7afdf7cb1aa12a086b02959307848eb6bcc8f66fcb66c0cb57e2a2c1/multidict-6.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:04cbcce84f63b9af41bad04a54d4cc4e60e90c35b9e6ccb130be2d75b71f8c17", size = 45982, upload-time = "2025-06-30T15:52:13.6Z" }, + { url = "https://files.pythonhosted.org/packages/b8/95/8c825bd70ff9b02462dc18d1295dd08d3e9e4eb66856d292ffa62cfe1920/multidict-6.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:0f1130b896ecb52d2a1e615260f3ea2af55fa7dc3d7c3003ba0c3121a759b18b", size = 43210, upload-time = "2025-06-30T15:52:14.893Z" }, + { url = "https://files.pythonhosted.org/packages/52/1d/0bebcbbb4f000751fbd09957257903d6e002943fc668d841a4cf2fb7f872/multidict-6.6.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:540d3c06d48507357a7d57721e5094b4f7093399a0106c211f33540fdc374d55", size = 75843, upload-time = "2025-06-30T15:52:16.155Z" }, + { url = "https://files.pythonhosted.org/packages/07/8f/cbe241b0434cfe257f65c2b1bcf9e8d5fb52bc708c5061fb29b0fed22bdf/multidict-6.6.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9c19cea2a690f04247d43f366d03e4eb110a0dc4cd1bbeee4d445435428ed35b", size = 45053, upload-time = "2025-06-30T15:52:17.429Z" }, + { url = "https://files.pythonhosted.org/packages/32/d2/0b3b23f9dbad5b270b22a3ac3ea73ed0a50ef2d9a390447061178ed6bdb8/multidict-6.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7af039820cfd00effec86bda5d8debef711a3e86a1d3772e85bea0f243a4bd65", size = 43273, upload-time = "2025-06-30T15:52:19.346Z" }, + { url = "https://files.pythonhosted.org/packages/fd/fe/6eb68927e823999e3683bc49678eb20374ba9615097d085298fd5b386564/multidict-6.6.3-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:500b84f51654fdc3944e936f2922114349bf8fdcac77c3092b03449f0e5bc2b3", size = 237124, upload-time = "2025-06-30T15:52:20.773Z" }, + { url = "https://files.pythonhosted.org/packages/e7/ab/320d8507e7726c460cb77117848b3834ea0d59e769f36fdae495f7669929/multidict-6.6.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3fc723ab8a5c5ed6c50418e9bfcd8e6dceba6c271cee6728a10a4ed8561520c", size = 256892, upload-time = "2025-06-30T15:52:22.242Z" }, + { url = "https://files.pythonhosted.org/packages/76/60/38ee422db515ac69834e60142a1a69111ac96026e76e8e9aa347fd2e4591/multidict-6.6.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:94c47ea3ade005b5976789baaed66d4de4480d0a0bf31cef6edaa41c1e7b56a6", size = 240547, upload-time = "2025-06-30T15:52:23.736Z" }, + { url = "https://files.pythonhosted.org/packages/27/fb/905224fde2dff042b030c27ad95a7ae744325cf54b890b443d30a789b80e/multidict-6.6.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dbc7cf464cc6d67e83e136c9f55726da3a30176f020a36ead246eceed87f1cd8", size = 266223, upload-time = "2025-06-30T15:52:25.185Z" }, + { url = "https://files.pythonhosted.org/packages/76/35/dc38ab361051beae08d1a53965e3e1a418752fc5be4d3fb983c5582d8784/multidict-6.6.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:900eb9f9da25ada070f8ee4a23f884e0ee66fe4e1a38c3af644256a508ad81ca", size = 267262, upload-time = "2025-06-30T15:52:26.969Z" }, + { url = "https://files.pythonhosted.org/packages/1f/a3/0a485b7f36e422421b17e2bbb5a81c1af10eac1d4476f2ff92927c730479/multidict-6.6.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c6df517cf177da5d47ab15407143a89cd1a23f8b335f3a28d57e8b0a3dbb884", size = 254345, upload-time = "2025-06-30T15:52:28.467Z" }, + { url = "https://files.pythonhosted.org/packages/b4/59/bcdd52c1dab7c0e0d75ff19cac751fbd5f850d1fc39172ce809a74aa9ea4/multidict-6.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ef421045f13879e21c994b36e728d8e7d126c91a64b9185810ab51d474f27e7", size = 252248, upload-time = "2025-06-30T15:52:29.938Z" }, + { url = "https://files.pythonhosted.org/packages/bb/a4/2d96aaa6eae8067ce108d4acee6f45ced5728beda55c0f02ae1072c730d1/multidict-6.6.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:6c1e61bb4f80895c081790b6b09fa49e13566df8fbff817da3f85b3a8192e36b", size = 250115, upload-time = "2025-06-30T15:52:31.416Z" }, + { url = "https://files.pythonhosted.org/packages/25/d2/ed9f847fa5c7d0677d4f02ea2c163d5e48573de3f57bacf5670e43a5ffaa/multidict-6.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e5e8523bb12d7623cd8300dbd91b9e439a46a028cd078ca695eb66ba31adee3c", size = 249649, upload-time = "2025-06-30T15:52:32.996Z" }, + { url = "https://files.pythonhosted.org/packages/1f/af/9155850372563fc550803d3f25373308aa70f59b52cff25854086ecb4a79/multidict-6.6.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:ef58340cc896219e4e653dade08fea5c55c6df41bcc68122e3be3e9d873d9a7b", size = 261203, upload-time = "2025-06-30T15:52:34.521Z" }, + { url = "https://files.pythonhosted.org/packages/36/2f/c6a728f699896252cf309769089568a33c6439626648843f78743660709d/multidict-6.6.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc9dc435ec8699e7b602b94fe0cd4703e69273a01cbc34409af29e7820f777f1", size = 258051, upload-time = "2025-06-30T15:52:35.999Z" }, + { url = "https://files.pythonhosted.org/packages/d0/60/689880776d6b18fa2b70f6cc74ff87dd6c6b9b47bd9cf74c16fecfaa6ad9/multidict-6.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9e864486ef4ab07db5e9cb997bad2b681514158d6954dd1958dfb163b83d53e6", size = 249601, upload-time = "2025-06-30T15:52:37.473Z" }, + { url = "https://files.pythonhosted.org/packages/75/5e/325b11f2222a549019cf2ef879c1f81f94a0d40ace3ef55cf529915ba6cc/multidict-6.6.3-cp313-cp313-win32.whl", hash = "sha256:5633a82fba8e841bc5c5c06b16e21529573cd654f67fd833650a215520a6210e", size = 41683, upload-time = "2025-06-30T15:52:38.927Z" }, + { url = "https://files.pythonhosted.org/packages/b1/ad/cf46e73f5d6e3c775cabd2a05976547f3f18b39bee06260369a42501f053/multidict-6.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:e93089c1570a4ad54c3714a12c2cef549dc9d58e97bcded193d928649cab78e9", size = 45811, upload-time = "2025-06-30T15:52:40.207Z" }, + { url = "https://files.pythonhosted.org/packages/c5/c9/2e3fe950db28fb7c62e1a5f46e1e38759b072e2089209bc033c2798bb5ec/multidict-6.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:c60b401f192e79caec61f166da9c924e9f8bc65548d4246842df91651e83d600", size = 43056, upload-time = "2025-06-30T15:52:41.575Z" }, + { url = "https://files.pythonhosted.org/packages/3a/58/aaf8114cf34966e084a8cc9517771288adb53465188843d5a19862cb6dc3/multidict-6.6.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:02fd8f32d403a6ff13864b0851f1f523d4c988051eea0471d4f1fd8010f11134", size = 82811, upload-time = "2025-06-30T15:52:43.281Z" }, + { url = "https://files.pythonhosted.org/packages/71/af/5402e7b58a1f5b987a07ad98f2501fdba2a4f4b4c30cf114e3ce8db64c87/multidict-6.6.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:f3aa090106b1543f3f87b2041eef3c156c8da2aed90c63a2fbed62d875c49c37", size = 48304, upload-time = "2025-06-30T15:52:45.026Z" }, + { url = "https://files.pythonhosted.org/packages/39/65/ab3c8cafe21adb45b24a50266fd747147dec7847425bc2a0f6934b3ae9ce/multidict-6.6.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e924fb978615a5e33ff644cc42e6aa241effcf4f3322c09d4f8cebde95aff5f8", size = 46775, upload-time = "2025-06-30T15:52:46.459Z" }, + { url = "https://files.pythonhosted.org/packages/49/ba/9fcc1b332f67cc0c0c8079e263bfab6660f87fe4e28a35921771ff3eea0d/multidict-6.6.3-cp313-cp313t-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:b9fe5a0e57c6dbd0e2ce81ca66272282c32cd11d31658ee9553849d91289e1c1", size = 229773, upload-time = "2025-06-30T15:52:47.88Z" }, + { url = "https://files.pythonhosted.org/packages/a4/14/0145a251f555f7c754ce2dcbcd012939bbd1f34f066fa5d28a50e722a054/multidict-6.6.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b24576f208793ebae00280c59927c3b7c2a3b1655e443a25f753c4611bc1c373", size = 250083, upload-time = "2025-06-30T15:52:49.366Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d4/d5c0bd2bbb173b586c249a151a26d2fb3ec7d53c96e42091c9fef4e1f10c/multidict-6.6.3-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:135631cb6c58eac37d7ac0df380294fecdc026b28837fa07c02e459c7fb9c54e", size = 228980, upload-time = "2025-06-30T15:52:50.903Z" }, + { url = "https://files.pythonhosted.org/packages/21/32/c9a2d8444a50ec48c4733ccc67254100c10e1c8ae8e40c7a2d2183b59b97/multidict-6.6.3-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:274d416b0df887aef98f19f21578653982cfb8a05b4e187d4a17103322eeaf8f", size = 257776, upload-time = "2025-06-30T15:52:52.764Z" }, + { url = "https://files.pythonhosted.org/packages/68/d0/14fa1699f4ef629eae08ad6201c6b476098f5efb051b296f4c26be7a9fdf/multidict-6.6.3-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e252017a817fad7ce05cafbe5711ed40faeb580e63b16755a3a24e66fa1d87c0", size = 256882, upload-time = "2025-06-30T15:52:54.596Z" }, + { url = "https://files.pythonhosted.org/packages/da/88/84a27570fbe303c65607d517a5f147cd2fc046c2d1da02b84b17b9bdc2aa/multidict-6.6.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e4cc8d848cd4fe1cdee28c13ea79ab0ed37fc2e89dd77bac86a2e7959a8c3bc", size = 247816, upload-time = "2025-06-30T15:52:56.175Z" }, + { url = "https://files.pythonhosted.org/packages/1c/60/dca352a0c999ce96a5d8b8ee0b2b9f729dcad2e0b0c195f8286269a2074c/multidict-6.6.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9e236a7094b9c4c1b7585f6b9cca34b9d833cf079f7e4c49e6a4a6ec9bfdc68f", size = 245341, upload-time = "2025-06-30T15:52:57.752Z" }, + { url = "https://files.pythonhosted.org/packages/50/ef/433fa3ed06028f03946f3993223dada70fb700f763f70c00079533c34578/multidict-6.6.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:e0cb0ab69915c55627c933f0b555a943d98ba71b4d1c57bc0d0a66e2567c7471", size = 235854, upload-time = "2025-06-30T15:52:59.74Z" }, + { url = "https://files.pythonhosted.org/packages/1b/1f/487612ab56fbe35715320905215a57fede20de7db40a261759690dc80471/multidict-6.6.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:81ef2f64593aba09c5212a3d0f8c906a0d38d710a011f2f42759704d4557d3f2", size = 243432, upload-time = "2025-06-30T15:53:01.602Z" }, + { url = "https://files.pythonhosted.org/packages/da/6f/ce8b79de16cd885c6f9052c96a3671373d00c59b3ee635ea93e6e81b8ccf/multidict-6.6.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:b9cbc60010de3562545fa198bfc6d3825df430ea96d2cc509c39bd71e2e7d648", size = 252731, upload-time = "2025-06-30T15:53:03.517Z" }, + { url = "https://files.pythonhosted.org/packages/bb/fe/a2514a6aba78e5abefa1624ca85ae18f542d95ac5cde2e3815a9fbf369aa/multidict-6.6.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:70d974eaaa37211390cd02ef93b7e938de564bbffa866f0b08d07e5e65da783d", size = 247086, upload-time = "2025-06-30T15:53:05.48Z" }, + { url = "https://files.pythonhosted.org/packages/8c/22/b788718d63bb3cce752d107a57c85fcd1a212c6c778628567c9713f9345a/multidict-6.6.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3713303e4a6663c6d01d648a68f2848701001f3390a030edaaf3fc949c90bf7c", size = 243338, upload-time = "2025-06-30T15:53:07.522Z" }, + { url = "https://files.pythonhosted.org/packages/22/d6/fdb3d0670819f2228f3f7d9af613d5e652c15d170c83e5f1c94fbc55a25b/multidict-6.6.3-cp313-cp313t-win32.whl", hash = "sha256:639ecc9fe7cd73f2495f62c213e964843826f44505a3e5d82805aa85cac6f89e", size = 47812, upload-time = "2025-06-30T15:53:09.263Z" }, + { url = "https://files.pythonhosted.org/packages/b6/d6/a9d2c808f2c489ad199723197419207ecbfbc1776f6e155e1ecea9c883aa/multidict-6.6.3-cp313-cp313t-win_amd64.whl", hash = "sha256:9f97e181f344a0ef3881b573d31de8542cc0dbc559ec68c8f8b5ce2c2e91646d", size = 53011, upload-time = "2025-06-30T15:53:11.038Z" }, + { url = "https://files.pythonhosted.org/packages/f2/40/b68001cba8188dd267590a111f9661b6256debc327137667e832bf5d66e8/multidict-6.6.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ce8b7693da41a3c4fde5871c738a81490cea5496c671d74374c8ab889e1834fb", size = 45254, upload-time = "2025-06-30T15:53:12.421Z" }, + { url = "https://files.pythonhosted.org/packages/d8/30/9aec301e9772b098c1f5c0ca0279237c9766d94b97802e9888010c64b0ed/multidict-6.6.3-py3-none-any.whl", hash = "sha256:8db10f29c7541fc5da4defd8cd697e1ca429db743fa716325f236079b96f775a", size = 12313, upload-time = "2025-06-30T15:53:45.437Z" }, ] [[package]] @@ -1723,20 +1738,20 @@ requires-dist = [ { name = "bokeh", marker = "extra == 'distributed'", specifier = ">=3.7.3,<4.0.0" }, { name = "click", specifier = ">=8.2.1,<9.0.0" }, { name = "click-params", specifier = ">=0.5.0,<0.6.0" }, - { name = "dask", specifier = ">=2025.5.1" }, - { name = "distributed", marker = "extra == 'distributed'", specifier = ">=2025.5.1" }, - { name = "fsspec", specifier = ">=2025.5.1" }, - { name = "gcsfs", marker = "extra == 'cloud'", specifier = ">=2025.5.1" }, + { name = "dask", specifier = ">=2025.7.0" }, + { name = "distributed", marker = "extra == 'distributed'", specifier = ">=2025.7.0" }, + { name = "fsspec", specifier = ">=2025.7.0" }, + { name = "gcsfs", marker = "extra == 'cloud'", specifier = ">=2025.7.0" }, { name = "pint", specifier = ">=0.24.4,<0.25" }, { name = "psutil", specifier = ">=7.0.0,<8.0.0" }, { name = "pydantic", specifier = ">=2.11.7,<3.0.0" }, { name = "pydantic-settings", specifier = ">=2.10.1,<3.0.0" }, - { name = "rich", specifier = ">=14.0.0,<15.0.0" }, - { name = "s3fs", marker = "extra == 'cloud'", specifier = "==2025.5.1" }, - { name = "segy", specifier = ">=0.4.1.post2,<0.5.0" }, + { name = "rich", specifier = ">=14.1.0,<15.0.0" }, + { name = "s3fs", marker = "extra == 'cloud'", specifier = ">=2025.7.0" }, + { name = "segy", specifier = ">=0.4.2,<0.5.0" }, { name = "tqdm", specifier = ">=4.67.1,<5.0.0" }, - { name = "xarray", specifier = ">=2025.6.1" }, - { name = "zarr", specifier = ">=3.1.0,<4.0.0" }, + { name = "xarray", specifier = ">=2025.7.1" }, + { name = "zarr", specifier = ">=3.1.1,<4.0.0" }, { name = "zfpy", marker = "extra == 'lossy'", specifier = ">=1.0.1,<2.0.0" }, ] provides-extras = ["cloud", "distributed", "lossy"] @@ -1767,43 +1782,43 @@ docs = [ [[package]] name = "mypy" -version = "1.17.0" +version = "1.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mypy-extensions" }, { name = "pathspec" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1e/e3/034322d5a779685218ed69286c32faa505247f1f096251ef66c8fd203b08/mypy-1.17.0.tar.gz", hash = "sha256:e5d7ccc08ba089c06e2f5629c660388ef1fee708444f1dee0b9203fa031dee03", size = 3352114 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/24/82efb502b0b0f661c49aa21cfe3e1999ddf64bf5500fc03b5a1536a39d39/mypy-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d4fe5c72fd262d9c2c91c1117d16aac555e05f5beb2bae6a755274c6eec42be", size = 10914150 }, - { url = "https://files.pythonhosted.org/packages/03/96/8ef9a6ff8cedadff4400e2254689ca1dc4b420b92c55255b44573de10c54/mypy-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d96b196e5c16f41b4f7736840e8455958e832871990c7ba26bf58175e357ed61", size = 10039845 }, - { url = "https://files.pythonhosted.org/packages/df/32/7ce359a56be779d38021d07941cfbb099b41411d72d827230a36203dbb81/mypy-1.17.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73a0ff2dd10337ceb521c080d4147755ee302dcde6e1a913babd59473904615f", size = 11837246 }, - { url = "https://files.pythonhosted.org/packages/82/16/b775047054de4d8dbd668df9137707e54b07fe18c7923839cd1e524bf756/mypy-1.17.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24cfcc1179c4447854e9e406d3af0f77736d631ec87d31c6281ecd5025df625d", size = 12571106 }, - { url = "https://files.pythonhosted.org/packages/a1/cf/fa33eaf29a606102c8d9ffa45a386a04c2203d9ad18bf4eef3e20c43ebc8/mypy-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c56f180ff6430e6373db7a1d569317675b0a451caf5fef6ce4ab365f5f2f6c3", size = 12759960 }, - { url = "https://files.pythonhosted.org/packages/94/75/3f5a29209f27e739ca57e6350bc6b783a38c7621bdf9cac3ab8a08665801/mypy-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:eafaf8b9252734400f9b77df98b4eee3d2eecab16104680d51341c75702cad70", size = 9503888 }, - { url = "https://files.pythonhosted.org/packages/12/e9/e6824ed620bbf51d3bf4d6cbbe4953e83eaf31a448d1b3cfb3620ccb641c/mypy-1.17.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f986f1cab8dbec39ba6e0eaa42d4d3ac6686516a5d3dccd64be095db05ebc6bb", size = 11086395 }, - { url = "https://files.pythonhosted.org/packages/ba/51/a4afd1ae279707953be175d303f04a5a7bd7e28dc62463ad29c1c857927e/mypy-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:51e455a54d199dd6e931cd7ea987d061c2afbaf0960f7f66deef47c90d1b304d", size = 10120052 }, - { url = "https://files.pythonhosted.org/packages/8a/71/19adfeac926ba8205f1d1466d0d360d07b46486bf64360c54cb5a2bd86a8/mypy-1.17.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3204d773bab5ff4ebbd1f8efa11b498027cd57017c003ae970f310e5b96be8d8", size = 11861806 }, - { url = "https://files.pythonhosted.org/packages/0b/64/d6120eca3835baf7179e6797a0b61d6c47e0bc2324b1f6819d8428d5b9ba/mypy-1.17.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1051df7ec0886fa246a530ae917c473491e9a0ba6938cfd0ec2abc1076495c3e", size = 12744371 }, - { url = "https://files.pythonhosted.org/packages/1f/dc/56f53b5255a166f5bd0f137eed960e5065f2744509dfe69474ff0ba772a5/mypy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f773c6d14dcc108a5b141b4456b0871df638eb411a89cd1c0c001fc4a9d08fc8", size = 12914558 }, - { url = "https://files.pythonhosted.org/packages/69/ac/070bad311171badc9add2910e7f89271695a25c136de24bbafc7eded56d5/mypy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:1619a485fd0e9c959b943c7b519ed26b712de3002d7de43154a489a2d0fd817d", size = 9585447 }, - { url = "https://files.pythonhosted.org/packages/be/7b/5f8ab461369b9e62157072156935cec9d272196556bdc7c2ff5f4c7c0f9b/mypy-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c41aa59211e49d717d92b3bb1238c06d387c9325d3122085113c79118bebb06", size = 11070019 }, - { url = "https://files.pythonhosted.org/packages/9c/f8/c49c9e5a2ac0badcc54beb24e774d2499748302c9568f7f09e8730e953fa/mypy-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e69db1fb65b3114f98c753e3930a00514f5b68794ba80590eb02090d54a5d4a", size = 10114457 }, - { url = "https://files.pythonhosted.org/packages/89/0c/fb3f9c939ad9beed3e328008b3fb90b20fda2cddc0f7e4c20dbefefc3b33/mypy-1.17.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:03ba330b76710f83d6ac500053f7727270b6b8553b0423348ffb3af6f2f7b889", size = 11857838 }, - { url = "https://files.pythonhosted.org/packages/4c/66/85607ab5137d65e4f54d9797b77d5a038ef34f714929cf8ad30b03f628df/mypy-1.17.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:037bc0f0b124ce46bfde955c647f3e395c6174476a968c0f22c95a8d2f589bba", size = 12731358 }, - { url = "https://files.pythonhosted.org/packages/73/d0/341dbbfb35ce53d01f8f2969facbb66486cee9804048bf6c01b048127501/mypy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c38876106cb6132259683632b287238858bd58de267d80defb6f418e9ee50658", size = 12917480 }, - { url = "https://files.pythonhosted.org/packages/64/63/70c8b7dbfc520089ac48d01367a97e8acd734f65bd07813081f508a8c94c/mypy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:d30ba01c0f151998f367506fab31c2ac4527e6a7b2690107c7a7f9e3cb419a9c", size = 9589666 }, - { url = "https://files.pythonhosted.org/packages/e3/fc/ee058cc4316f219078464555873e99d170bde1d9569abd833300dbeb484a/mypy-1.17.0-py3-none-any.whl", hash = "sha256:15d9d0018237ab058e5de3d8fce61b6fa72cc59cc78fd91f1b474bce12abf496", size = 2283195 }, +sdist = { url = "https://files.pythonhosted.org/packages/8e/22/ea637422dedf0bf36f3ef238eab4e455e2a0dcc3082b5cc067615347ab8e/mypy-1.17.1.tar.gz", hash = "sha256:25e01ec741ab5bb3eec8ba9cdb0f769230368a22c959c4937360efb89b7e9f01", size = 3352570, upload-time = "2025-07-31T07:54:19.204Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/cf/eadc80c4e0a70db1c08921dcc220357ba8ab2faecb4392e3cebeb10edbfa/mypy-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad37544be07c5d7fba814eb370e006df58fed8ad1ef33ed1649cb1889ba6ff58", size = 10921009, upload-time = "2025-07-31T07:53:23.037Z" }, + { url = "https://files.pythonhosted.org/packages/5d/c1/c869d8c067829ad30d9bdae051046561552516cfb3a14f7f0347b7d973ee/mypy-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:064e2ff508e5464b4bd807a7c1625bc5047c5022b85c70f030680e18f37273a5", size = 10047482, upload-time = "2025-07-31T07:53:26.151Z" }, + { url = "https://files.pythonhosted.org/packages/98/b9/803672bab3fe03cee2e14786ca056efda4bb511ea02dadcedde6176d06d0/mypy-1.17.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70401bbabd2fa1aa7c43bb358f54037baf0586f41e83b0ae67dd0534fc64edfd", size = 11832883, upload-time = "2025-07-31T07:53:47.948Z" }, + { url = "https://files.pythonhosted.org/packages/88/fb/fcdac695beca66800918c18697b48833a9a6701de288452b6715a98cfee1/mypy-1.17.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e92bdc656b7757c438660f775f872a669b8ff374edc4d18277d86b63edba6b8b", size = 12566215, upload-time = "2025-07-31T07:54:04.031Z" }, + { url = "https://files.pythonhosted.org/packages/7f/37/a932da3d3dace99ee8eb2043b6ab03b6768c36eb29a02f98f46c18c0da0e/mypy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c1fdf4abb29ed1cb091cf432979e162c208a5ac676ce35010373ff29247bcad5", size = 12751956, upload-time = "2025-07-31T07:53:36.263Z" }, + { url = "https://files.pythonhosted.org/packages/8c/cf/6438a429e0f2f5cab8bc83e53dbebfa666476f40ee322e13cac5e64b79e7/mypy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:ff2933428516ab63f961644bc49bc4cbe42bbffb2cd3b71cc7277c07d16b1a8b", size = 9507307, upload-time = "2025-07-31T07:53:59.734Z" }, + { url = "https://files.pythonhosted.org/packages/17/a2/7034d0d61af8098ec47902108553122baa0f438df8a713be860f7407c9e6/mypy-1.17.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:69e83ea6553a3ba79c08c6e15dbd9bfa912ec1e493bf75489ef93beb65209aeb", size = 11086295, upload-time = "2025-07-31T07:53:28.124Z" }, + { url = "https://files.pythonhosted.org/packages/14/1f/19e7e44b594d4b12f6ba8064dbe136505cec813549ca3e5191e40b1d3cc2/mypy-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b16708a66d38abb1e6b5702f5c2c87e133289da36f6a1d15f6a5221085c6403", size = 10112355, upload-time = "2025-07-31T07:53:21.121Z" }, + { url = "https://files.pythonhosted.org/packages/5b/69/baa33927e29e6b4c55d798a9d44db5d394072eef2bdc18c3e2048c9ed1e9/mypy-1.17.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:89e972c0035e9e05823907ad5398c5a73b9f47a002b22359b177d40bdaee7056", size = 11875285, upload-time = "2025-07-31T07:53:55.293Z" }, + { url = "https://files.pythonhosted.org/packages/90/13/f3a89c76b0a41e19490b01e7069713a30949d9a6c147289ee1521bcea245/mypy-1.17.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03b6d0ed2b188e35ee6d5c36b5580cffd6da23319991c49ab5556c023ccf1341", size = 12737895, upload-time = "2025-07-31T07:53:43.623Z" }, + { url = "https://files.pythonhosted.org/packages/23/a1/c4ee79ac484241301564072e6476c5a5be2590bc2e7bfd28220033d2ef8f/mypy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c837b896b37cd103570d776bda106eabb8737aa6dd4f248451aecf53030cdbeb", size = 12931025, upload-time = "2025-07-31T07:54:17.125Z" }, + { url = "https://files.pythonhosted.org/packages/89/b8/7409477be7919a0608900e6320b155c72caab4fef46427c5cc75f85edadd/mypy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:665afab0963a4b39dff7c1fa563cc8b11ecff7910206db4b2e64dd1ba25aed19", size = 9584664, upload-time = "2025-07-31T07:54:12.842Z" }, + { url = "https://files.pythonhosted.org/packages/5b/82/aec2fc9b9b149f372850291827537a508d6c4d3664b1750a324b91f71355/mypy-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93378d3203a5c0800c6b6d850ad2f19f7a3cdf1a3701d3416dbf128805c6a6a7", size = 11075338, upload-time = "2025-07-31T07:53:38.873Z" }, + { url = "https://files.pythonhosted.org/packages/07/ac/ee93fbde9d2242657128af8c86f5d917cd2887584cf948a8e3663d0cd737/mypy-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:15d54056f7fe7a826d897789f53dd6377ec2ea8ba6f776dc83c2902b899fee81", size = 10113066, upload-time = "2025-07-31T07:54:14.707Z" }, + { url = "https://files.pythonhosted.org/packages/5a/68/946a1e0be93f17f7caa56c45844ec691ca153ee8b62f21eddda336a2d203/mypy-1.17.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:209a58fed9987eccc20f2ca94afe7257a8f46eb5df1fb69958650973230f91e6", size = 11875473, upload-time = "2025-07-31T07:53:14.504Z" }, + { url = "https://files.pythonhosted.org/packages/9f/0f/478b4dce1cb4f43cf0f0d00fba3030b21ca04a01b74d1cd272a528cf446f/mypy-1.17.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:099b9a5da47de9e2cb5165e581f158e854d9e19d2e96b6698c0d64de911dd849", size = 12744296, upload-time = "2025-07-31T07:53:03.896Z" }, + { url = "https://files.pythonhosted.org/packages/ca/70/afa5850176379d1b303f992a828de95fc14487429a7139a4e0bdd17a8279/mypy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ffadfbe6994d724c5a1bb6123a7d27dd68fc9c059561cd33b664a79578e14", size = 12914657, upload-time = "2025-07-31T07:54:08.576Z" }, + { url = "https://files.pythonhosted.org/packages/53/f9/4a83e1c856a3d9c8f6edaa4749a4864ee98486e9b9dbfbc93842891029c2/mypy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:9a2b7d9180aed171f033c9f2fc6c204c1245cf60b0cb61cf2e7acc24eea78e0a", size = 9593320, upload-time = "2025-07-31T07:53:01.341Z" }, + { url = "https://files.pythonhosted.org/packages/1d/f3/8fcd2af0f5b806f6cf463efaffd3c9548a28f84220493ecd38d127b6b66d/mypy-1.17.1-py3-none-any.whl", hash = "sha256:a9f52c0351c21fe24c21d8c0eb1f62967b262d6729393397b6f443c3b773c3b9", size = 2283411, upload-time = "2025-07-31T07:53:24.664Z" }, ] [[package]] name = "mypy-extensions" version = "1.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343 } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963 }, + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, ] [[package]] @@ -1822,9 +1837,9 @@ dependencies = [ { name = "sphinx" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/21/83/a894bd8dea7a6e9f053502ee8413484dcbf75a219013d6a72e971c0fecfd/myst_nb-1.3.0.tar.gz", hash = "sha256:df3cd4680f51a5af673fd46b38b562be3559aef1475e906ed0f2e66e4587ce4b", size = 81963 } +sdist = { url = "https://files.pythonhosted.org/packages/21/83/a894bd8dea7a6e9f053502ee8413484dcbf75a219013d6a72e971c0fecfd/myst_nb-1.3.0.tar.gz", hash = "sha256:df3cd4680f51a5af673fd46b38b562be3559aef1475e906ed0f2e66e4587ce4b", size = 81963, upload-time = "2025-07-13T22:49:38.493Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/a6/03d410c114b8c4856579b3d294dafc27626a7690a552625eec42b16dfa41/myst_nb-1.3.0-py3-none-any.whl", hash = "sha256:1f36af3c19964960ec4e51ac30949b6ed6df220356ffa8d60dd410885e132d7d", size = 82396 }, + { url = "https://files.pythonhosted.org/packages/69/a6/03d410c114b8c4856579b3d294dafc27626a7690a552625eec42b16dfa41/myst_nb-1.3.0-py3-none-any.whl", hash = "sha256:1f36af3c19964960ec4e51ac30949b6ed6df220356ffa8d60dd410885e132d7d", size = 82396, upload-time = "2025-07-13T22:49:37.019Z" }, ] [[package]] @@ -1839,18 +1854,18 @@ dependencies = [ { name = "pyyaml" }, { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985 } +sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985, upload-time = "2025-02-12T10:53:03.833Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579 }, + { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579, upload-time = "2025-02-12T10:53:02.078Z" }, ] [[package]] name = "narwhals" -version = "1.47.1" +version = "2.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fa/97/f9072f2dd368e52a37c0f5578f5910c689d5ac9c1108f8d2ed6c84c1c8fc/narwhals-1.47.1.tar.gz", hash = "sha256:3e477a54984a141b500ebd65d0b946b7a991080939b4a3321a6b01ea97258c9a", size = 516244 } +sdist = { url = "https://files.pythonhosted.org/packages/e2/8f/51d14e402c4f9d281a2e153a6a805cad5460088027a999faf264b54e7641/narwhals-2.0.1.tar.gz", hash = "sha256:235e61ca807bc21110ca36a4d53888ecc22c42dcdf50a7c886e10dde3fd7f38c", size = 525541, upload-time = "2025-07-29T08:39:04.81Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/15/278693412221859a0159719878e51a79812a189edceef2fe325160a8e661/narwhals-1.47.1-py3-none-any.whl", hash = "sha256:b9f2b2557aba054231361a00f6fcabc5017e338575e810e82155eb34e38ace93", size = 375506 }, + { url = "https://files.pythonhosted.org/packages/7f/26/43caf834e47c63883a5eddc02893b7fdbe6a0a4508ff6dc401907f3cc085/narwhals-2.0.1-py3-none-any.whl", hash = "sha256:837457e36a2ba1710c881fb69e1f79ce44fb81728c92ac378f70892a53af8ddb", size = 385436, upload-time = "2025-07-29T08:39:03.163Z" }, ] [[package]] @@ -1863,9 +1878,9 @@ dependencies = [ { name = "nbformat" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424 } +sdist = { url = "https://files.pythonhosted.org/packages/87/66/7ffd18d58eae90d5721f9f39212327695b749e23ad44b3881744eaf4d9e8/nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193", size = 62424, upload-time = "2024-12-19T10:32:27.164Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434 }, + { url = "https://files.pythonhosted.org/packages/34/6d/e7fa07f03a4a7b221d94b4d586edb754a9b0dc3c9e2c93353e9fa4e0d117/nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d", size = 25434, upload-time = "2024-12-19T10:32:24.139Z" }, ] [[package]] @@ -1878,27 +1893,27 @@ dependencies = [ { name = "jupyter-core" }, { name = "traitlets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749 } +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454 }, + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" }, ] [[package]] name = "nest-asyncio" version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418 } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195 }, + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, ] [[package]] name = "nodeenv" version = "1.9.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437 } +sdist = { url = "https://files.pythonhosted.org/packages/43/16/fc88b08840de0e0a72a2f9d8c6bae36be573e475a6326ae854bcc549fc45/nodeenv-1.9.1.tar.gz", hash = "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", size = 47437, upload-time = "2024-06-04T18:44:11.171Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314 }, + { url = "https://files.pythonhosted.org/packages/d2/1d/1b658dbd2b9fa9c4c9f32accbfc0205d532c8c6194dc0f2a4c0428e7128a/nodeenv-1.9.1-py2.py3-none-any.whl", hash = "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9", size = 22314, upload-time = "2024-06-04T18:44:08.352Z" }, ] [[package]] @@ -1909,23 +1924,23 @@ dependencies = [ { name = "llvmlite" }, { name = "numpy" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1c/a0/e21f57604304aa03ebb8e098429222722ad99176a4f979d34af1d1ee80da/numba-0.61.2.tar.gz", hash = "sha256:8750ee147940a6637b80ecf7f95062185ad8726c8c28a2295b8ec1160a196f7d", size = 2820615 } +sdist = { url = "https://files.pythonhosted.org/packages/1c/a0/e21f57604304aa03ebb8e098429222722ad99176a4f979d34af1d1ee80da/numba-0.61.2.tar.gz", hash = "sha256:8750ee147940a6637b80ecf7f95062185ad8726c8c28a2295b8ec1160a196f7d", size = 2820615, upload-time = "2025-04-09T02:58:07.659Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/97/c99d1056aed767503c228f7099dc11c402906b42a4757fec2819329abb98/numba-0.61.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:efd3db391df53aaa5cfbee189b6c910a5b471488749fd6606c3f33fc984c2ae2", size = 2775825 }, - { url = "https://files.pythonhosted.org/packages/95/9e/63c549f37136e892f006260c3e2613d09d5120672378191f2dc387ba65a2/numba-0.61.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:49c980e4171948ffebf6b9a2520ea81feed113c1f4890747ba7f59e74be84b1b", size = 2778695 }, - { url = "https://files.pythonhosted.org/packages/97/c8/8740616c8436c86c1b9a62e72cb891177d2c34c2d24ddcde4c390371bf4c/numba-0.61.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3945615cd73c2c7eba2a85ccc9c1730c21cd3958bfcf5a44302abae0fb07bb60", size = 3829227 }, - { url = "https://files.pythonhosted.org/packages/fc/06/66e99ae06507c31d15ff3ecd1f108f2f59e18b6e08662cd5f8a5853fbd18/numba-0.61.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbfdf4eca202cebade0b7d43896978e146f39398909a42941c9303f82f403a18", size = 3523422 }, - { url = "https://files.pythonhosted.org/packages/0f/a4/2b309a6a9f6d4d8cfba583401c7c2f9ff887adb5d54d8e2e130274c0973f/numba-0.61.2-cp311-cp311-win_amd64.whl", hash = "sha256:76bcec9f46259cedf888041b9886e257ae101c6268261b19fda8cfbc52bec9d1", size = 2831505 }, - { url = "https://files.pythonhosted.org/packages/b4/a0/c6b7b9c615cfa3b98c4c63f4316e3f6b3bbe2387740277006551784218cd/numba-0.61.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:34fba9406078bac7ab052efbf0d13939426c753ad72946baaa5bf9ae0ebb8dd2", size = 2776626 }, - { url = "https://files.pythonhosted.org/packages/92/4a/fe4e3c2ecad72d88f5f8cd04e7f7cff49e718398a2fac02d2947480a00ca/numba-0.61.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ddce10009bc097b080fc96876d14c051cc0c7679e99de3e0af59014dab7dfe8", size = 2779287 }, - { url = "https://files.pythonhosted.org/packages/9a/2d/e518df036feab381c23a624dac47f8445ac55686ec7f11083655eb707da3/numba-0.61.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b1bb509d01f23d70325d3a5a0e237cbc9544dd50e50588bc581ba860c213546", size = 3885928 }, - { url = "https://files.pythonhosted.org/packages/10/0f/23cced68ead67b75d77cfcca3df4991d1855c897ee0ff3fe25a56ed82108/numba-0.61.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48a53a3de8f8793526cbe330f2a39fe9a6638efcbf11bd63f3d2f9757ae345cd", size = 3577115 }, - { url = "https://files.pythonhosted.org/packages/68/1d/ddb3e704c5a8fb90142bf9dc195c27db02a08a99f037395503bfbc1d14b3/numba-0.61.2-cp312-cp312-win_amd64.whl", hash = "sha256:97cf4f12c728cf77c9c1d7c23707e4d8fb4632b46275f8f3397de33e5877af18", size = 2831929 }, - { url = "https://files.pythonhosted.org/packages/0b/f3/0fe4c1b1f2569e8a18ad90c159298d862f96c3964392a20d74fc628aee44/numba-0.61.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:3a10a8fc9afac40b1eac55717cece1b8b1ac0b946f5065c89e00bde646b5b154", size = 2771785 }, - { url = "https://files.pythonhosted.org/packages/e9/71/91b277d712e46bd5059f8a5866862ed1116091a7cb03bd2704ba8ebe015f/numba-0.61.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d3bcada3c9afba3bed413fba45845f2fb9cd0d2b27dd58a1be90257e293d140", size = 2773289 }, - { url = "https://files.pythonhosted.org/packages/0d/e0/5ea04e7ad2c39288c0f0f9e8d47638ad70f28e275d092733b5817cf243c9/numba-0.61.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bdbca73ad81fa196bd53dc12e3aaf1564ae036e0c125f237c7644fe64a4928ab", size = 3893918 }, - { url = "https://files.pythonhosted.org/packages/17/58/064f4dcb7d7e9412f16ecf80ed753f92297e39f399c905389688cf950b81/numba-0.61.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5f154aaea625fb32cfbe3b80c5456d514d416fcdf79733dd69c0df3a11348e9e", size = 3584056 }, - { url = "https://files.pythonhosted.org/packages/af/a4/6d3a0f2d3989e62a18749e1e9913d5fa4910bbb3e3311a035baea6caf26d/numba-0.61.2-cp313-cp313-win_amd64.whl", hash = "sha256:59321215e2e0ac5fa928a8020ab00b8e57cda8a97384963ac0dfa4d4e6aa54e7", size = 2831846 }, + { url = "https://files.pythonhosted.org/packages/3f/97/c99d1056aed767503c228f7099dc11c402906b42a4757fec2819329abb98/numba-0.61.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:efd3db391df53aaa5cfbee189b6c910a5b471488749fd6606c3f33fc984c2ae2", size = 2775825, upload-time = "2025-04-09T02:57:43.442Z" }, + { url = "https://files.pythonhosted.org/packages/95/9e/63c549f37136e892f006260c3e2613d09d5120672378191f2dc387ba65a2/numba-0.61.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:49c980e4171948ffebf6b9a2520ea81feed113c1f4890747ba7f59e74be84b1b", size = 2778695, upload-time = "2025-04-09T02:57:44.968Z" }, + { url = "https://files.pythonhosted.org/packages/97/c8/8740616c8436c86c1b9a62e72cb891177d2c34c2d24ddcde4c390371bf4c/numba-0.61.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3945615cd73c2c7eba2a85ccc9c1730c21cd3958bfcf5a44302abae0fb07bb60", size = 3829227, upload-time = "2025-04-09T02:57:46.63Z" }, + { url = "https://files.pythonhosted.org/packages/fc/06/66e99ae06507c31d15ff3ecd1f108f2f59e18b6e08662cd5f8a5853fbd18/numba-0.61.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbfdf4eca202cebade0b7d43896978e146f39398909a42941c9303f82f403a18", size = 3523422, upload-time = "2025-04-09T02:57:48.222Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a4/2b309a6a9f6d4d8cfba583401c7c2f9ff887adb5d54d8e2e130274c0973f/numba-0.61.2-cp311-cp311-win_amd64.whl", hash = "sha256:76bcec9f46259cedf888041b9886e257ae101c6268261b19fda8cfbc52bec9d1", size = 2831505, upload-time = "2025-04-09T02:57:50.108Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a0/c6b7b9c615cfa3b98c4c63f4316e3f6b3bbe2387740277006551784218cd/numba-0.61.2-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:34fba9406078bac7ab052efbf0d13939426c753ad72946baaa5bf9ae0ebb8dd2", size = 2776626, upload-time = "2025-04-09T02:57:51.857Z" }, + { url = "https://files.pythonhosted.org/packages/92/4a/fe4e3c2ecad72d88f5f8cd04e7f7cff49e718398a2fac02d2947480a00ca/numba-0.61.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ddce10009bc097b080fc96876d14c051cc0c7679e99de3e0af59014dab7dfe8", size = 2779287, upload-time = "2025-04-09T02:57:53.658Z" }, + { url = "https://files.pythonhosted.org/packages/9a/2d/e518df036feab381c23a624dac47f8445ac55686ec7f11083655eb707da3/numba-0.61.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b1bb509d01f23d70325d3a5a0e237cbc9544dd50e50588bc581ba860c213546", size = 3885928, upload-time = "2025-04-09T02:57:55.206Z" }, + { url = "https://files.pythonhosted.org/packages/10/0f/23cced68ead67b75d77cfcca3df4991d1855c897ee0ff3fe25a56ed82108/numba-0.61.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48a53a3de8f8793526cbe330f2a39fe9a6638efcbf11bd63f3d2f9757ae345cd", size = 3577115, upload-time = "2025-04-09T02:57:56.818Z" }, + { url = "https://files.pythonhosted.org/packages/68/1d/ddb3e704c5a8fb90142bf9dc195c27db02a08a99f037395503bfbc1d14b3/numba-0.61.2-cp312-cp312-win_amd64.whl", hash = "sha256:97cf4f12c728cf77c9c1d7c23707e4d8fb4632b46275f8f3397de33e5877af18", size = 2831929, upload-time = "2025-04-09T02:57:58.45Z" }, + { url = "https://files.pythonhosted.org/packages/0b/f3/0fe4c1b1f2569e8a18ad90c159298d862f96c3964392a20d74fc628aee44/numba-0.61.2-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:3a10a8fc9afac40b1eac55717cece1b8b1ac0b946f5065c89e00bde646b5b154", size = 2771785, upload-time = "2025-04-09T02:57:59.96Z" }, + { url = "https://files.pythonhosted.org/packages/e9/71/91b277d712e46bd5059f8a5866862ed1116091a7cb03bd2704ba8ebe015f/numba-0.61.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d3bcada3c9afba3bed413fba45845f2fb9cd0d2b27dd58a1be90257e293d140", size = 2773289, upload-time = "2025-04-09T02:58:01.435Z" }, + { url = "https://files.pythonhosted.org/packages/0d/e0/5ea04e7ad2c39288c0f0f9e8d47638ad70f28e275d092733b5817cf243c9/numba-0.61.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bdbca73ad81fa196bd53dc12e3aaf1564ae036e0c125f237c7644fe64a4928ab", size = 3893918, upload-time = "2025-04-09T02:58:02.933Z" }, + { url = "https://files.pythonhosted.org/packages/17/58/064f4dcb7d7e9412f16ecf80ed753f92297e39f399c905389688cf950b81/numba-0.61.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5f154aaea625fb32cfbe3b80c5456d514d416fcdf79733dd69c0df3a11348e9e", size = 3584056, upload-time = "2025-04-09T02:58:04.538Z" }, + { url = "https://files.pythonhosted.org/packages/af/a4/6d3a0f2d3989e62a18749e1e9913d5fa4910bbb3e3311a035baea6caf26d/numba-0.61.2-cp313-cp313-win_amd64.whl", hash = "sha256:59321215e2e0ac5fa928a8020ab00b8e57cda8a97384963ac0dfa4d4e6aa54e7", size = 2831846, upload-time = "2025-04-09T02:58:06.125Z" }, ] [[package]] @@ -1936,23 +1951,23 @@ dependencies = [ { name = "numpy" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/00/35/49da850ce5371da3930d099da364a73ce9ae4fc64075e521674b48f4804d/numcodecs-0.16.1.tar.gz", hash = "sha256:c47f20d656454568c6b4697ce02081e6bbb512f198738c6a56fafe8029c97fb1", size = 6268134 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6c/82/8d6ca1166dc9b020f383073c1c604e004f0495d243647a83e5d5fff2b7ad/numcodecs-0.16.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:5348a25aefbce37ea7c00c3363d36176155233c95597e5905a932e9620df960d", size = 1623980 }, - { url = "https://files.pythonhosted.org/packages/aa/4e/11258b7945c6cd3579f16228c803a13291d16ef7ef46f9551008090b6763/numcodecs-0.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2058b0a985470809c720d2457758b61e6c9495a49d5f20dfac9b5ebabd8848eb", size = 1153826 }, - { url = "https://files.pythonhosted.org/packages/a1/24/4099ccb29754fc1d2e55dbd9b540f58a24cab6e844dc996e37812c3fb79d/numcodecs-0.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b216b6d7bc207b85d41fddbc25b09fd00d76e265454db6e3fb09d5da0216397", size = 8263684 }, - { url = "https://files.pythonhosted.org/packages/04/e3/816a82b984dd7fb7a0afadd16842260ccfee23cc5edbda48a92649ee161b/numcodecs-0.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2308d56c4f84a5b942f8668b4adedd3d9cdd6a22e6e6e20768ec356c77050f38", size = 8788927 }, - { url = "https://files.pythonhosted.org/packages/6f/54/dbea8b17928670412db0efb20efc087b30c2a67b84b1605fa8a136e482af/numcodecs-0.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:acd8d68b4b815e62cb91e6064a53dac51ee99849350784ee16dd52cdbb4bc70f", size = 790259 }, - { url = "https://files.pythonhosted.org/packages/b7/ee/e2a903c88fed347dc74c70bbd7a8dab9aa22bb0dac68c5bc6393c2e9373b/numcodecs-0.16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1abe0651ecb6f207656ebfc802effa55c4ae3136cf172c295a067749a2699122", size = 1663434 }, - { url = "https://files.pythonhosted.org/packages/f2/f0/37819d4f6896b1ac43a164ffd3ab99d7cbf63bf63cb375fef97aedaef4f0/numcodecs-0.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:abb39b7102d0816c8563669cdddca40392d34d0cbf31e3e996706b244586a458", size = 1150402 }, - { url = "https://files.pythonhosted.org/packages/60/3c/5059a29750305b80b7428b1e6695878dea9ea3b537d7fba57875e4bbc2c7/numcodecs-0.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3359a951f8b23317f12736a7ad1e7375ec3d735465f92049c76d032ebca4c40", size = 8237455 }, - { url = "https://files.pythonhosted.org/packages/1b/f5/515f98d659ab0cbe3738da153eddae22186fd38f05a808511e10f04cf679/numcodecs-0.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82cc70592ec18060786b1bfa0da23afd2a7807d7975d766e626954d6628ec609", size = 8770711 }, - { url = "https://files.pythonhosted.org/packages/a2/3a/9fc6104f888af11bad804ebd32dffe0bcb83337f4525b4fe5b379942fefd/numcodecs-0.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:4b48ddc8a7d132b7808bc53eb2705342de5c1e39289d725f988bd143c0fd86df", size = 788701 }, - { url = "https://files.pythonhosted.org/packages/5e/1e/73ffb1074f03d52cb1c4f4deaba26a2008ca45262f3622ed26dbec7a7362/numcodecs-0.16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ad8ee940315f59188accfc3f2d39726a4ca0d76b49bf8d0018e121f01c49028", size = 1659453 }, - { url = "https://files.pythonhosted.org/packages/42/72/5affb1ce92b7a6becee17921de7c6b521a48fa61fc3d36d9f1eea2cf83f5/numcodecs-0.16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:179ca7bf3525a0f7379df7767d87dd495253de44597cb7e511198b28b09da633", size = 1143932 }, - { url = "https://files.pythonhosted.org/packages/e3/f1/b092679d84c67c6ed62e4df5781d89bbb089f24a0df4187cbab9db51cf6b/numcodecs-0.16.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e2babbb50bf348ae982818d5560af330eab0dcd925fb0e49509785ad57d11db", size = 8187716 }, - { url = "https://files.pythonhosted.org/packages/a8/e8/86e7741adb43261aff409b53c53c8bac2797bfca055d64dd65dc731d5141/numcodecs-0.16.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4b29d8d3284b72bfad4fb83d672a17f497ae86ee1ef8087bac7222b620d3d91", size = 8728650 }, - { url = "https://files.pythonhosted.org/packages/21/03/87c5c217232aa3515d350728c6dcefca252fa582246100ef68a51fbda456/numcodecs-0.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:06489635f43e1a959aea73cb830d78cf3adb07ac5f34daccb92091e4d9ac6b07", size = 785553 }, +sdist = { url = "https://files.pythonhosted.org/packages/00/35/49da850ce5371da3930d099da364a73ce9ae4fc64075e521674b48f4804d/numcodecs-0.16.1.tar.gz", hash = "sha256:c47f20d656454568c6b4697ce02081e6bbb512f198738c6a56fafe8029c97fb1", size = 6268134, upload-time = "2025-05-22T13:33:04.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6c/82/8d6ca1166dc9b020f383073c1c604e004f0495d243647a83e5d5fff2b7ad/numcodecs-0.16.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:5348a25aefbce37ea7c00c3363d36176155233c95597e5905a932e9620df960d", size = 1623980, upload-time = "2025-05-22T13:32:37.718Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4e/11258b7945c6cd3579f16228c803a13291d16ef7ef46f9551008090b6763/numcodecs-0.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2058b0a985470809c720d2457758b61e6c9495a49d5f20dfac9b5ebabd8848eb", size = 1153826, upload-time = "2025-05-22T13:32:39.737Z" }, + { url = "https://files.pythonhosted.org/packages/a1/24/4099ccb29754fc1d2e55dbd9b540f58a24cab6e844dc996e37812c3fb79d/numcodecs-0.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b216b6d7bc207b85d41fddbc25b09fd00d76e265454db6e3fb09d5da0216397", size = 8263684, upload-time = "2025-05-22T13:32:41.252Z" }, + { url = "https://files.pythonhosted.org/packages/04/e3/816a82b984dd7fb7a0afadd16842260ccfee23cc5edbda48a92649ee161b/numcodecs-0.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2308d56c4f84a5b942f8668b4adedd3d9cdd6a22e6e6e20768ec356c77050f38", size = 8788927, upload-time = "2025-05-22T13:32:42.905Z" }, + { url = "https://files.pythonhosted.org/packages/6f/54/dbea8b17928670412db0efb20efc087b30c2a67b84b1605fa8a136e482af/numcodecs-0.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:acd8d68b4b815e62cb91e6064a53dac51ee99849350784ee16dd52cdbb4bc70f", size = 790259, upload-time = "2025-05-22T13:32:45.398Z" }, + { url = "https://files.pythonhosted.org/packages/b7/ee/e2a903c88fed347dc74c70bbd7a8dab9aa22bb0dac68c5bc6393c2e9373b/numcodecs-0.16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1abe0651ecb6f207656ebfc802effa55c4ae3136cf172c295a067749a2699122", size = 1663434, upload-time = "2025-05-22T13:32:47.26Z" }, + { url = "https://files.pythonhosted.org/packages/f2/f0/37819d4f6896b1ac43a164ffd3ab99d7cbf63bf63cb375fef97aedaef4f0/numcodecs-0.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:abb39b7102d0816c8563669cdddca40392d34d0cbf31e3e996706b244586a458", size = 1150402, upload-time = "2025-05-22T13:32:48.574Z" }, + { url = "https://files.pythonhosted.org/packages/60/3c/5059a29750305b80b7428b1e6695878dea9ea3b537d7fba57875e4bbc2c7/numcodecs-0.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3359a951f8b23317f12736a7ad1e7375ec3d735465f92049c76d032ebca4c40", size = 8237455, upload-time = "2025-05-22T13:32:50.052Z" }, + { url = "https://files.pythonhosted.org/packages/1b/f5/515f98d659ab0cbe3738da153eddae22186fd38f05a808511e10f04cf679/numcodecs-0.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82cc70592ec18060786b1bfa0da23afd2a7807d7975d766e626954d6628ec609", size = 8770711, upload-time = "2025-05-22T13:32:52.198Z" }, + { url = "https://files.pythonhosted.org/packages/a2/3a/9fc6104f888af11bad804ebd32dffe0bcb83337f4525b4fe5b379942fefd/numcodecs-0.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:4b48ddc8a7d132b7808bc53eb2705342de5c1e39289d725f988bd143c0fd86df", size = 788701, upload-time = "2025-05-22T13:32:54.28Z" }, + { url = "https://files.pythonhosted.org/packages/5e/1e/73ffb1074f03d52cb1c4f4deaba26a2008ca45262f3622ed26dbec7a7362/numcodecs-0.16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2ad8ee940315f59188accfc3f2d39726a4ca0d76b49bf8d0018e121f01c49028", size = 1659453, upload-time = "2025-05-22T13:32:55.558Z" }, + { url = "https://files.pythonhosted.org/packages/42/72/5affb1ce92b7a6becee17921de7c6b521a48fa61fc3d36d9f1eea2cf83f5/numcodecs-0.16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:179ca7bf3525a0f7379df7767d87dd495253de44597cb7e511198b28b09da633", size = 1143932, upload-time = "2025-05-22T13:32:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/e3/f1/b092679d84c67c6ed62e4df5781d89bbb089f24a0df4187cbab9db51cf6b/numcodecs-0.16.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e2babbb50bf348ae982818d5560af330eab0dcd925fb0e49509785ad57d11db", size = 8187716, upload-time = "2025-05-22T13:32:58.421Z" }, + { url = "https://files.pythonhosted.org/packages/a8/e8/86e7741adb43261aff409b53c53c8bac2797bfca055d64dd65dc731d5141/numcodecs-0.16.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4b29d8d3284b72bfad4fb83d672a17f497ae86ee1ef8087bac7222b620d3d91", size = 8728650, upload-time = "2025-05-22T13:33:00.337Z" }, + { url = "https://files.pythonhosted.org/packages/21/03/87c5c217232aa3515d350728c6dcefca252fa582246100ef68a51fbda456/numcodecs-0.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:06489635f43e1a959aea73cb830d78cf3adb07ac5f34daccb92091e4d9ac6b07", size = 785553, upload-time = "2025-05-22T13:33:02.587Z" }, ] [package.optional-dependencies] @@ -1964,66 +1979,66 @@ crc32c = [ name = "numpy" version = "2.2.6" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963 }, - { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743 }, - { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616 }, - { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579 }, - { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005 }, - { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570 }, - { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548 }, - { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521 }, - { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866 }, - { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455 }, - { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348 }, - { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362 }, - { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103 }, - { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382 }, - { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462 }, - { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618 }, - { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511 }, - { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783 }, - { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506 }, - { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190 }, - { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828 }, - { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006 }, - { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765 }, - { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736 }, - { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719 }, - { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072 }, - { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213 }, - { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632 }, - { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532 }, - { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885 }, - { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467 }, - { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144 }, - { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217 }, - { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014 }, - { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935 }, - { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122 }, - { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143 }, - { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260 }, - { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225 }, - { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374 }, +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, + { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, + { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, + { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, + { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, + { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, + { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, ] [[package]] name = "oauthlib" version = "3.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918 } +sdist = { url = "https://files.pythonhosted.org/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918, upload-time = "2025-06-19T22:48:08.269Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065 }, + { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" }, ] [[package]] name = "packaging" version = "25.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727 } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 }, + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] [[package]] @@ -2036,44 +2051,44 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d1/6f/75aa71f8a14267117adeeed5d21b204770189c0a0025acbdc03c337b28fc/pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2", size = 4487493 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/1c/ccf70029e927e473a4476c00e0d5b32e623bff27f0402d0a92b7fc29bb9f/pandas-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2b0540963d83431f5ce8870ea02a7430adca100cec8a050f0811f8e31035541b", size = 11566608 }, - { url = "https://files.pythonhosted.org/packages/ec/d3/3c37cb724d76a841f14b8f5fe57e5e3645207cc67370e4f84717e8bb7657/pandas-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fe7317f578c6a153912bd2292f02e40c1d8f253e93c599e82620c7f69755c74f", size = 10823181 }, - { url = "https://files.pythonhosted.org/packages/8a/4c/367c98854a1251940edf54a4df0826dcacfb987f9068abf3e3064081a382/pandas-2.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6723a27ad7b244c0c79d8e7007092d7c8f0f11305770e2f4cd778b3ad5f9f85", size = 11793570 }, - { url = "https://files.pythonhosted.org/packages/07/5f/63760ff107bcf5146eee41b38b3985f9055e710a72fdd637b791dea3495c/pandas-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3462c3735fe19f2638f2c3a40bd94ec2dc5ba13abbb032dd2fa1f540a075509d", size = 12378887 }, - { url = "https://files.pythonhosted.org/packages/15/53/f31a9b4dfe73fe4711c3a609bd8e60238022f48eacedc257cd13ae9327a7/pandas-2.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:98bcc8b5bf7afed22cc753a28bc4d9e26e078e777066bc53fac7904ddef9a678", size = 13230957 }, - { url = "https://files.pythonhosted.org/packages/e0/94/6fce6bf85b5056d065e0a7933cba2616dcb48596f7ba3c6341ec4bcc529d/pandas-2.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d544806b485ddf29e52d75b1f559142514e60ef58a832f74fb38e48d757b299", size = 13883883 }, - { url = "https://files.pythonhosted.org/packages/c8/7b/bdcb1ed8fccb63d04bdb7635161d0ec26596d92c9d7a6cce964e7876b6c1/pandas-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b3cd4273d3cb3707b6fffd217204c52ed92859533e31dc03b7c5008aa933aaab", size = 11340212 }, - { url = "https://files.pythonhosted.org/packages/46/de/b8445e0f5d217a99fe0eeb2f4988070908979bec3587c0633e5428ab596c/pandas-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3", size = 11588172 }, - { url = "https://files.pythonhosted.org/packages/1e/e0/801cdb3564e65a5ac041ab99ea6f1d802a6c325bb6e58c79c06a3f1cd010/pandas-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232", size = 10717365 }, - { url = "https://files.pythonhosted.org/packages/51/a5/c76a8311833c24ae61a376dbf360eb1b1c9247a5d9c1e8b356563b31b80c/pandas-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e", size = 11280411 }, - { url = "https://files.pythonhosted.org/packages/da/01/e383018feba0a1ead6cf5fe8728e5d767fee02f06a3d800e82c489e5daaf/pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4", size = 11988013 }, - { url = "https://files.pythonhosted.org/packages/5b/14/cec7760d7c9507f11c97d64f29022e12a6cc4fc03ac694535e89f88ad2ec/pandas-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8", size = 12767210 }, - { url = "https://files.pythonhosted.org/packages/50/b9/6e2d2c6728ed29fb3d4d4d302504fb66f1a543e37eb2e43f352a86365cdf/pandas-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679", size = 13440571 }, - { url = "https://files.pythonhosted.org/packages/80/a5/3a92893e7399a691bad7664d977cb5e7c81cf666c81f89ea76ba2bff483d/pandas-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8", size = 10987601 }, - { url = "https://files.pythonhosted.org/packages/32/ed/ff0a67a2c5505e1854e6715586ac6693dd860fbf52ef9f81edee200266e7/pandas-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22", size = 11531393 }, - { url = "https://files.pythonhosted.org/packages/c7/db/d8f24a7cc9fb0972adab0cc80b6817e8bef888cfd0024eeb5a21c0bb5c4a/pandas-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a", size = 10668750 }, - { url = "https://files.pythonhosted.org/packages/0f/b0/80f6ec783313f1e2356b28b4fd8d2148c378370045da918c73145e6aab50/pandas-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928", size = 11342004 }, - { url = "https://files.pythonhosted.org/packages/e9/e2/20a317688435470872885e7fc8f95109ae9683dec7c50be29b56911515a5/pandas-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9", size = 12050869 }, - { url = "https://files.pythonhosted.org/packages/55/79/20d746b0a96c67203a5bee5fb4e00ac49c3e8009a39e1f78de264ecc5729/pandas-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12", size = 12750218 }, - { url = "https://files.pythonhosted.org/packages/7c/0f/145c8b41e48dbf03dd18fdd7f24f8ba95b8254a97a3379048378f33e7838/pandas-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb", size = 13416763 }, - { url = "https://files.pythonhosted.org/packages/b2/c0/54415af59db5cdd86a3d3bf79863e8cc3fa9ed265f0745254061ac09d5f2/pandas-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956", size = 10987482 }, - { url = "https://files.pythonhosted.org/packages/48/64/2fd2e400073a1230e13b8cd604c9bc95d9e3b962e5d44088ead2e8f0cfec/pandas-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a", size = 12029159 }, - { url = "https://files.pythonhosted.org/packages/d8/0a/d84fd79b0293b7ef88c760d7dca69828d867c89b6d9bc52d6a27e4d87316/pandas-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9", size = 11393287 }, - { url = "https://files.pythonhosted.org/packages/50/ae/ff885d2b6e88f3c7520bb74ba319268b42f05d7e583b5dded9837da2723f/pandas-2.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275", size = 11309381 }, - { url = "https://files.pythonhosted.org/packages/85/86/1fa345fc17caf5d7780d2699985c03dbe186c68fee00b526813939062bb0/pandas-2.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab", size = 11883998 }, - { url = "https://files.pythonhosted.org/packages/81/aa/e58541a49b5e6310d89474333e994ee57fea97c8aaa8fc7f00b873059bbf/pandas-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96", size = 12704705 }, - { url = "https://files.pythonhosted.org/packages/d5/f9/07086f5b0f2a19872554abeea7658200824f5835c58a106fa8f2ae96a46c/pandas-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444", size = 13189044 }, +sdist = { url = "https://files.pythonhosted.org/packages/d1/6f/75aa71f8a14267117adeeed5d21b204770189c0a0025acbdc03c337b28fc/pandas-2.3.1.tar.gz", hash = "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2", size = 4487493, upload-time = "2025-07-07T19:20:04.079Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/1c/ccf70029e927e473a4476c00e0d5b32e623bff27f0402d0a92b7fc29bb9f/pandas-2.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2b0540963d83431f5ce8870ea02a7430adca100cec8a050f0811f8e31035541b", size = 11566608, upload-time = "2025-07-07T19:18:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d3/3c37cb724d76a841f14b8f5fe57e5e3645207cc67370e4f84717e8bb7657/pandas-2.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fe7317f578c6a153912bd2292f02e40c1d8f253e93c599e82620c7f69755c74f", size = 10823181, upload-time = "2025-07-07T19:18:36.151Z" }, + { url = "https://files.pythonhosted.org/packages/8a/4c/367c98854a1251940edf54a4df0826dcacfb987f9068abf3e3064081a382/pandas-2.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6723a27ad7b244c0c79d8e7007092d7c8f0f11305770e2f4cd778b3ad5f9f85", size = 11793570, upload-time = "2025-07-07T19:18:38.385Z" }, + { url = "https://files.pythonhosted.org/packages/07/5f/63760ff107bcf5146eee41b38b3985f9055e710a72fdd637b791dea3495c/pandas-2.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3462c3735fe19f2638f2c3a40bd94ec2dc5ba13abbb032dd2fa1f540a075509d", size = 12378887, upload-time = "2025-07-07T19:18:41.284Z" }, + { url = "https://files.pythonhosted.org/packages/15/53/f31a9b4dfe73fe4711c3a609bd8e60238022f48eacedc257cd13ae9327a7/pandas-2.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:98bcc8b5bf7afed22cc753a28bc4d9e26e078e777066bc53fac7904ddef9a678", size = 13230957, upload-time = "2025-07-07T19:18:44.187Z" }, + { url = "https://files.pythonhosted.org/packages/e0/94/6fce6bf85b5056d065e0a7933cba2616dcb48596f7ba3c6341ec4bcc529d/pandas-2.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d544806b485ddf29e52d75b1f559142514e60ef58a832f74fb38e48d757b299", size = 13883883, upload-time = "2025-07-07T19:18:46.498Z" }, + { url = "https://files.pythonhosted.org/packages/c8/7b/bdcb1ed8fccb63d04bdb7635161d0ec26596d92c9d7a6cce964e7876b6c1/pandas-2.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:b3cd4273d3cb3707b6fffd217204c52ed92859533e31dc03b7c5008aa933aaab", size = 11340212, upload-time = "2025-07-07T19:18:49.293Z" }, + { url = "https://files.pythonhosted.org/packages/46/de/b8445e0f5d217a99fe0eeb2f4988070908979bec3587c0633e5428ab596c/pandas-2.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3", size = 11588172, upload-time = "2025-07-07T19:18:52.054Z" }, + { url = "https://files.pythonhosted.org/packages/1e/e0/801cdb3564e65a5ac041ab99ea6f1d802a6c325bb6e58c79c06a3f1cd010/pandas-2.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232", size = 10717365, upload-time = "2025-07-07T19:18:54.785Z" }, + { url = "https://files.pythonhosted.org/packages/51/a5/c76a8311833c24ae61a376dbf360eb1b1c9247a5d9c1e8b356563b31b80c/pandas-2.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e", size = 11280411, upload-time = "2025-07-07T19:18:57.045Z" }, + { url = "https://files.pythonhosted.org/packages/da/01/e383018feba0a1ead6cf5fe8728e5d767fee02f06a3d800e82c489e5daaf/pandas-2.3.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4", size = 11988013, upload-time = "2025-07-07T19:18:59.771Z" }, + { url = "https://files.pythonhosted.org/packages/5b/14/cec7760d7c9507f11c97d64f29022e12a6cc4fc03ac694535e89f88ad2ec/pandas-2.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8", size = 12767210, upload-time = "2025-07-07T19:19:02.944Z" }, + { url = "https://files.pythonhosted.org/packages/50/b9/6e2d2c6728ed29fb3d4d4d302504fb66f1a543e37eb2e43f352a86365cdf/pandas-2.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679", size = 13440571, upload-time = "2025-07-07T19:19:06.82Z" }, + { url = "https://files.pythonhosted.org/packages/80/a5/3a92893e7399a691bad7664d977cb5e7c81cf666c81f89ea76ba2bff483d/pandas-2.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8", size = 10987601, upload-time = "2025-07-07T19:19:09.589Z" }, + { url = "https://files.pythonhosted.org/packages/32/ed/ff0a67a2c5505e1854e6715586ac6693dd860fbf52ef9f81edee200266e7/pandas-2.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22", size = 11531393, upload-time = "2025-07-07T19:19:12.245Z" }, + { url = "https://files.pythonhosted.org/packages/c7/db/d8f24a7cc9fb0972adab0cc80b6817e8bef888cfd0024eeb5a21c0bb5c4a/pandas-2.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a", size = 10668750, upload-time = "2025-07-07T19:19:14.612Z" }, + { url = "https://files.pythonhosted.org/packages/0f/b0/80f6ec783313f1e2356b28b4fd8d2148c378370045da918c73145e6aab50/pandas-2.3.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928", size = 11342004, upload-time = "2025-07-07T19:19:16.857Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e2/20a317688435470872885e7fc8f95109ae9683dec7c50be29b56911515a5/pandas-2.3.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9", size = 12050869, upload-time = "2025-07-07T19:19:19.265Z" }, + { url = "https://files.pythonhosted.org/packages/55/79/20d746b0a96c67203a5bee5fb4e00ac49c3e8009a39e1f78de264ecc5729/pandas-2.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12", size = 12750218, upload-time = "2025-07-07T19:19:21.547Z" }, + { url = "https://files.pythonhosted.org/packages/7c/0f/145c8b41e48dbf03dd18fdd7f24f8ba95b8254a97a3379048378f33e7838/pandas-2.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb", size = 13416763, upload-time = "2025-07-07T19:19:23.939Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c0/54415af59db5cdd86a3d3bf79863e8cc3fa9ed265f0745254061ac09d5f2/pandas-2.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956", size = 10987482, upload-time = "2025-07-07T19:19:42.699Z" }, + { url = "https://files.pythonhosted.org/packages/48/64/2fd2e400073a1230e13b8cd604c9bc95d9e3b962e5d44088ead2e8f0cfec/pandas-2.3.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a", size = 12029159, upload-time = "2025-07-07T19:19:26.362Z" }, + { url = "https://files.pythonhosted.org/packages/d8/0a/d84fd79b0293b7ef88c760d7dca69828d867c89b6d9bc52d6a27e4d87316/pandas-2.3.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9", size = 11393287, upload-time = "2025-07-07T19:19:29.157Z" }, + { url = "https://files.pythonhosted.org/packages/50/ae/ff885d2b6e88f3c7520bb74ba319268b42f05d7e583b5dded9837da2723f/pandas-2.3.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275", size = 11309381, upload-time = "2025-07-07T19:19:31.436Z" }, + { url = "https://files.pythonhosted.org/packages/85/86/1fa345fc17caf5d7780d2699985c03dbe186c68fee00b526813939062bb0/pandas-2.3.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab", size = 11883998, upload-time = "2025-07-07T19:19:34.267Z" }, + { url = "https://files.pythonhosted.org/packages/81/aa/e58541a49b5e6310d89474333e994ee57fea97c8aaa8fc7f00b873059bbf/pandas-2.3.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96", size = 12704705, upload-time = "2025-07-07T19:19:36.856Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f9/07086f5b0f2a19872554abeea7658200824f5835c58a106fa8f2ae96a46c/pandas-2.3.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444", size = 13189044, upload-time = "2025-07-07T19:19:39.999Z" }, ] [[package]] name = "parso" version = "0.8.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609 } +sdist = { url = "https://files.pythonhosted.org/packages/66/94/68e2e17afaa9169cf6412ab0f28623903be73d1b32e208d9e8e541bb086d/parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d", size = 400609, upload-time = "2024-04-05T09:43:55.897Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650 }, + { url = "https://files.pythonhosted.org/packages/c6/ac/dac4a63f978e4dcb3c6d3a78c4d8e0192a113d288502a1216950c41b1027/parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", size = 103650, upload-time = "2024-04-05T09:43:53.299Z" }, ] [[package]] @@ -2084,18 +2099,18 @@ dependencies = [ { name = "locket" }, { name = "toolz" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b2/3a/3f06f34820a31257ddcabdfafc2672c5816be79c7e353b02c1f318daa7d4/partd-1.4.2.tar.gz", hash = "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c", size = 21029 } +sdist = { url = "https://files.pythonhosted.org/packages/b2/3a/3f06f34820a31257ddcabdfafc2672c5816be79c7e353b02c1f318daa7d4/partd-1.4.2.tar.gz", hash = "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c", size = 21029, upload-time = "2024-05-06T19:51:41.945Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl", hash = "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", size = 18905 }, + { url = "https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl", hash = "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", size = 18905, upload-time = "2024-05-06T19:51:39.271Z" }, ] [[package]] name = "pathspec" version = "0.12.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043 } +sdist = { url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712", size = 51043, upload-time = "2023-12-10T22:30:45Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191 }, + { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, ] [[package]] @@ -2105,71 +2120,71 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ptyprocess" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 } +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 }, + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, ] [[package]] name = "pillow" version = "11.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/db/26/77f8ed17ca4ffd60e1dcd220a6ec6d71210ba398cfa33a13a1cd614c5613/pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", size = 5316531 }, - { url = "https://files.pythonhosted.org/packages/cb/39/ee475903197ce709322a17a866892efb560f57900d9af2e55f86db51b0a5/pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", size = 4686560 }, - { url = "https://files.pythonhosted.org/packages/d5/90/442068a160fd179938ba55ec8c97050a612426fae5ec0a764e345839f76d/pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d", size = 5870978 }, - { url = "https://files.pythonhosted.org/packages/13/92/dcdd147ab02daf405387f0218dcf792dc6dd5b14d2573d40b4caeef01059/pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494", size = 7641168 }, - { url = "https://files.pythonhosted.org/packages/6e/db/839d6ba7fd38b51af641aa904e2960e7a5644d60ec754c046b7d2aee00e5/pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", size = 5973053 }, - { url = "https://files.pythonhosted.org/packages/f2/2f/d7675ecae6c43e9f12aa8d58b6012683b20b6edfbdac7abcb4e6af7a3784/pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", size = 6640273 }, - { url = "https://files.pythonhosted.org/packages/45/ad/931694675ede172e15b2ff03c8144a0ddaea1d87adb72bb07655eaffb654/pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", size = 6082043 }, - { url = "https://files.pythonhosted.org/packages/3a/04/ba8f2b11fc80d2dd462d7abec16351b45ec99cbbaea4387648a44190351a/pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94", size = 6715516 }, - { url = "https://files.pythonhosted.org/packages/48/59/8cd06d7f3944cc7d892e8533c56b0acb68399f640786313275faec1e3b6f/pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0", size = 6274768 }, - { url = "https://files.pythonhosted.org/packages/f1/cc/29c0f5d64ab8eae20f3232da8f8571660aa0ab4b8f1331da5c2f5f9a938e/pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac", size = 6986055 }, - { url = "https://files.pythonhosted.org/packages/c6/df/90bd886fabd544c25addd63e5ca6932c86f2b701d5da6c7839387a076b4a/pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd", size = 2423079 }, - { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800 }, - { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296 }, - { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726 }, - { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652 }, - { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787 }, - { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236 }, - { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950 }, - { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358 }, - { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079 }, - { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324 }, - { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067 }, - { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328 }, - { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652 }, - { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443 }, - { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474 }, - { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038 }, - { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407 }, - { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094 }, - { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503 }, - { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574 }, - { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060 }, - { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407 }, - { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841 }, - { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450 }, - { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055 }, - { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110 }, - { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547 }, - { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554 }, - { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132 }, - { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001 }, - { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814 }, - { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124 }, - { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186 }, - { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546 }, - { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102 }, - { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803 }, - { url = "https://files.pythonhosted.org/packages/9e/e3/6fa84033758276fb31da12e5fb66ad747ae83b93c67af17f8c6ff4cc8f34/pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", size = 5270566 }, - { url = "https://files.pythonhosted.org/packages/5b/ee/e8d2e1ab4892970b561e1ba96cbd59c0d28cf66737fc44abb2aec3795a4e/pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", size = 4654618 }, - { url = "https://files.pythonhosted.org/packages/f2/6d/17f80f4e1f0761f02160fc433abd4109fa1548dcfdca46cfdadaf9efa565/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3", size = 4874248 }, - { url = "https://files.pythonhosted.org/packages/de/5f/c22340acd61cef960130585bbe2120e2fd8434c214802f07e8c03596b17e/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c", size = 6583963 }, - { url = "https://files.pythonhosted.org/packages/31/5e/03966aedfbfcbb4d5f8aa042452d3361f325b963ebbadddac05b122e47dd/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", size = 4957170 }, - { url = "https://files.pythonhosted.org/packages/cc/2d/e082982aacc927fc2cab48e1e731bdb1643a1406acace8bed0900a61464e/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", size = 5581505 }, - { url = "https://files.pythonhosted.org/packages/34/e7/ae39f538fd6844e982063c3a5e4598b8ced43b9633baa3a85ef33af8c05c/pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", size = 6984598 }, +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload-time = "2025-07-01T09:16:30.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/26/77f8ed17ca4ffd60e1dcd220a6ec6d71210ba398cfa33a13a1cd614c5613/pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", size = 5316531, upload-time = "2025-07-01T09:13:59.203Z" }, + { url = "https://files.pythonhosted.org/packages/cb/39/ee475903197ce709322a17a866892efb560f57900d9af2e55f86db51b0a5/pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", size = 4686560, upload-time = "2025-07-01T09:14:01.101Z" }, + { url = "https://files.pythonhosted.org/packages/d5/90/442068a160fd179938ba55ec8c97050a612426fae5ec0a764e345839f76d/pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d", size = 5870978, upload-time = "2025-07-03T13:09:55.638Z" }, + { url = "https://files.pythonhosted.org/packages/13/92/dcdd147ab02daf405387f0218dcf792dc6dd5b14d2573d40b4caeef01059/pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494", size = 7641168, upload-time = "2025-07-03T13:10:00.37Z" }, + { url = "https://files.pythonhosted.org/packages/6e/db/839d6ba7fd38b51af641aa904e2960e7a5644d60ec754c046b7d2aee00e5/pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", size = 5973053, upload-time = "2025-07-01T09:14:04.491Z" }, + { url = "https://files.pythonhosted.org/packages/f2/2f/d7675ecae6c43e9f12aa8d58b6012683b20b6edfbdac7abcb4e6af7a3784/pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", size = 6640273, upload-time = "2025-07-01T09:14:06.235Z" }, + { url = "https://files.pythonhosted.org/packages/45/ad/931694675ede172e15b2ff03c8144a0ddaea1d87adb72bb07655eaffb654/pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", size = 6082043, upload-time = "2025-07-01T09:14:07.978Z" }, + { url = "https://files.pythonhosted.org/packages/3a/04/ba8f2b11fc80d2dd462d7abec16351b45ec99cbbaea4387648a44190351a/pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94", size = 6715516, upload-time = "2025-07-01T09:14:10.233Z" }, + { url = "https://files.pythonhosted.org/packages/48/59/8cd06d7f3944cc7d892e8533c56b0acb68399f640786313275faec1e3b6f/pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0", size = 6274768, upload-time = "2025-07-01T09:14:11.921Z" }, + { url = "https://files.pythonhosted.org/packages/f1/cc/29c0f5d64ab8eae20f3232da8f8571660aa0ab4b8f1331da5c2f5f9a938e/pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac", size = 6986055, upload-time = "2025-07-01T09:14:13.623Z" }, + { url = "https://files.pythonhosted.org/packages/c6/df/90bd886fabd544c25addd63e5ca6932c86f2b701d5da6c7839387a076b4a/pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd", size = 2423079, upload-time = "2025-07-01T09:14:15.268Z" }, + { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload-time = "2025-07-01T09:14:17.648Z" }, + { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload-time = "2025-07-01T09:14:19.828Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload-time = "2025-07-03T13:10:04.448Z" }, + { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload-time = "2025-07-03T13:10:10.391Z" }, + { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload-time = "2025-07-01T09:14:21.63Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload-time = "2025-07-01T09:14:23.321Z" }, + { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload-time = "2025-07-01T09:14:25.237Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload-time = "2025-07-01T09:14:27.053Z" }, + { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079, upload-time = "2025-07-01T09:14:30.104Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324, upload-time = "2025-07-01T09:14:31.899Z" }, + { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067, upload-time = "2025-07-01T09:14:33.709Z" }, + { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload-time = "2025-07-01T09:14:35.276Z" }, + { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload-time = "2025-07-01T09:14:37.203Z" }, + { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload-time = "2025-07-01T09:14:39.344Z" }, + { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload-time = "2025-07-01T09:14:41.843Z" }, + { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload-time = "2025-07-01T09:14:44.008Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload-time = "2025-07-03T13:10:15.628Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload-time = "2025-07-03T13:10:21.857Z" }, + { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload-time = "2025-07-01T09:14:45.698Z" }, + { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload-time = "2025-07-01T09:14:47.415Z" }, + { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload-time = "2025-07-01T09:14:49.636Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload-time = "2025-07-01T09:14:51.962Z" }, + { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload-time = "2025-07-01T09:14:54.142Z" }, + { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload-time = "2025-07-01T09:14:56.436Z" }, + { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload-time = "2025-07-01T09:14:58.072Z" }, + { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload-time = "2025-07-01T09:14:59.79Z" }, + { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload-time = "2025-07-01T09:15:01.648Z" }, + { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload-time = "2025-07-03T13:10:27.018Z" }, + { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload-time = "2025-07-03T13:10:33.01Z" }, + { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload-time = "2025-07-01T09:15:03.365Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload-time = "2025-07-01T09:15:05.655Z" }, + { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload-time = "2025-07-01T09:15:07.358Z" }, + { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload-time = "2025-07-01T09:15:09.317Z" }, + { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload-time = "2025-07-01T09:15:11.311Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload-time = "2025-07-01T09:15:13.164Z" }, + { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload-time = "2025-07-01T09:15:15.695Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e3/6fa84033758276fb31da12e5fb66ad747ae83b93c67af17f8c6ff4cc8f34/pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", size = 5270566, upload-time = "2025-07-01T09:16:19.801Z" }, + { url = "https://files.pythonhosted.org/packages/5b/ee/e8d2e1ab4892970b561e1ba96cbd59c0d28cf66737fc44abb2aec3795a4e/pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", size = 4654618, upload-time = "2025-07-01T09:16:21.818Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6d/17f80f4e1f0761f02160fc433abd4109fa1548dcfdca46cfdadaf9efa565/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3", size = 4874248, upload-time = "2025-07-03T13:11:20.738Z" }, + { url = "https://files.pythonhosted.org/packages/de/5f/c22340acd61cef960130585bbe2120e2fd8434c214802f07e8c03596b17e/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c", size = 6583963, upload-time = "2025-07-03T13:11:26.283Z" }, + { url = "https://files.pythonhosted.org/packages/31/5e/03966aedfbfcbb4d5f8aa042452d3361f325b963ebbadddac05b122e47dd/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", size = 4957170, upload-time = "2025-07-01T09:16:23.762Z" }, + { url = "https://files.pythonhosted.org/packages/cc/2d/e082982aacc927fc2cab48e1e731bdb1643a1406acace8bed0900a61464e/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", size = 5581505, upload-time = "2025-07-01T09:16:25.593Z" }, + { url = "https://files.pythonhosted.org/packages/34/e7/ae39f538fd6844e982063c3a5e4598b8ced43b9633baa3a85ef33af8c05c/pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", size = 6984598, upload-time = "2025-07-01T09:16:27.732Z" }, ] [[package]] @@ -2182,27 +2197,27 @@ dependencies = [ { name = "platformdirs" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/20/bb/52b15ddf7b7706ed591134a895dbf6e41c8348171fb635e655e0a4bbb0ea/pint-0.24.4.tar.gz", hash = "sha256:35275439b574837a6cd3020a5a4a73645eb125ce4152a73a2f126bf164b91b80", size = 342225 } +sdist = { url = "https://files.pythonhosted.org/packages/20/bb/52b15ddf7b7706ed591134a895dbf6e41c8348171fb635e655e0a4bbb0ea/pint-0.24.4.tar.gz", hash = "sha256:35275439b574837a6cd3020a5a4a73645eb125ce4152a73a2f126bf164b91b80", size = 342225, upload-time = "2024-11-07T16:29:46.061Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/16/bd2f5904557265882108dc2e04f18abc05ab0c2b7082ae9430091daf1d5c/Pint-0.24.4-py3-none-any.whl", hash = "sha256:aa54926c8772159fcf65f82cc0d34de6768c151b32ad1deb0331291c38fe7659", size = 302029 }, + { url = "https://files.pythonhosted.org/packages/b7/16/bd2f5904557265882108dc2e04f18abc05ab0c2b7082ae9430091daf1d5c/Pint-0.24.4-py3-none-any.whl", hash = "sha256:aa54926c8772159fcf65f82cc0d34de6768c151b32ad1deb0331291c38fe7659", size = 302029, upload-time = "2024-11-07T16:29:43.976Z" }, ] [[package]] name = "platformdirs" version = "4.3.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362 } +sdist = { url = "https://files.pythonhosted.org/packages/fe/8b/3c73abc9c759ecd3f1f7ceff6685840859e8070c4d947c93fae71f6a0bf2/platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc", size = 21362, upload-time = "2025-05-07T22:47:42.121Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567 }, + { url = "https://files.pythonhosted.org/packages/fe/39/979e8e21520d4e47a0bbe349e2713c0aac6f3d853d0e5b34d76206c439aa/platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4", size = 18567, upload-time = "2025-05-07T22:47:40.376Z" }, ] [[package]] name = "pluggy" version = "1.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412 } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538 }, + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] [[package]] @@ -2216,9 +2231,9 @@ dependencies = [ { name = "pyyaml" }, { name = "virtualenv" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424 } +sdist = { url = "https://files.pythonhosted.org/packages/08/39/679ca9b26c7bb2999ff122d50faa301e49af82ca9c066ec061cfbc0c6784/pre_commit-4.2.0.tar.gz", hash = "sha256:601283b9757afd87d40c4c4a9b2b5de9637a8ea02eaff7adc2d0fb4e04841146", size = 193424, upload-time = "2025-03-18T21:35:20.987Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707 }, + { url = "https://files.pythonhosted.org/packages/88/74/a88bf1b1efeae488a0c0b7bdf71429c313722d1fc0f377537fbe554e6180/pre_commit-4.2.0-py2.py3-none-any.whl", hash = "sha256:a009ca7205f1eb497d10b845e52c838a98b6cdd2102a6c8e4540e94ee75c58bd", size = 220707, upload-time = "2025-03-18T21:35:19.343Z" }, ] [[package]] @@ -2228,9 +2243,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ruamel-yaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ac/7d/3299241a753c738d114600c360d754550b28c285281dc6a5132c4ccfae65/pre_commit_hooks-5.0.0.tar.gz", hash = "sha256:10626959a9eaf602fbfc22bc61b6e75801436f82326bfcee82bb1f2fc4bc646e", size = 29747 } +sdist = { url = "https://files.pythonhosted.org/packages/ac/7d/3299241a753c738d114600c360d754550b28c285281dc6a5132c4ccfae65/pre_commit_hooks-5.0.0.tar.gz", hash = "sha256:10626959a9eaf602fbfc22bc61b6e75801436f82326bfcee82bb1f2fc4bc646e", size = 29747, upload-time = "2024-10-05T18:43:11.225Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/29/db1d855a661c02dbde5cab3057969133fcc62e7a0c6393e48fe9d0e81679/pre_commit_hooks-5.0.0-py2.py3-none-any.whl", hash = "sha256:8d71cfb582c5c314a5498d94e0104b6567a8b93fb35903ea845c491f4e290a7a", size = 41245 }, + { url = "https://files.pythonhosted.org/packages/1e/29/db1d855a661c02dbde5cab3057969133fcc62e7a0c6393e48fe9d0e81679/pre_commit_hooks-5.0.0-py2.py3-none-any.whl", hash = "sha256:8d71cfb582c5c314a5498d94e0104b6567a8b93fb35903ea845c491f4e290a7a", size = 41245, upload-time = "2024-10-05T18:43:09.901Z" }, ] [[package]] @@ -2240,82 +2255,82 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "wcwidth" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940 } +sdist = { url = "https://files.pythonhosted.org/packages/bb/6e/9d084c929dfe9e3bfe0c6a47e31f78a25c54627d64a66e884a8bf5474f1c/prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed", size = 428940, upload-time = "2025-04-15T09:18:47.731Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810 }, + { url = "https://files.pythonhosted.org/packages/ce/4f/5249960887b1fbe561d9ff265496d170b55a735b76724f10ef19f9e40716/prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07", size = 387810, upload-time = "2025-04-15T09:18:44.753Z" }, ] [[package]] name = "propcache" version = "0.3.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a6/16/43264e4a779dd8588c21a70f0709665ee8f611211bdd2c87d952cfa7c776/propcache-0.3.2.tar.gz", hash = "sha256:20d7d62e4e7ef05f221e0db2856b979540686342e7dd9973b815599c7057e168", size = 44139 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/80/8d/e8b436717ab9c2cfc23b116d2c297305aa4cd8339172a456d61ebf5669b8/propcache-0.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0b8d2f607bd8f80ddc04088bc2a037fdd17884a6fcadc47a96e334d72f3717be", size = 74207 }, - { url = "https://files.pythonhosted.org/packages/d6/29/1e34000e9766d112171764b9fa3226fa0153ab565d0c242c70e9945318a7/propcache-0.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06766d8f34733416e2e34f46fea488ad5d60726bb9481d3cddf89a6fa2d9603f", size = 43648 }, - { url = "https://files.pythonhosted.org/packages/46/92/1ad5af0df781e76988897da39b5f086c2bf0f028b7f9bd1f409bb05b6874/propcache-0.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2dc1f4a1df4fecf4e6f68013575ff4af84ef6f478fe5344317a65d38a8e6dc9", size = 43496 }, - { url = "https://files.pythonhosted.org/packages/b3/ce/e96392460f9fb68461fabab3e095cb00c8ddf901205be4eae5ce246e5b7e/propcache-0.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be29c4f4810c5789cf10ddf6af80b041c724e629fa51e308a7a0fb19ed1ef7bf", size = 217288 }, - { url = "https://files.pythonhosted.org/packages/c5/2a/866726ea345299f7ceefc861a5e782b045545ae6940851930a6adaf1fca6/propcache-0.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59d61f6970ecbd8ff2e9360304d5c8876a6abd4530cb752c06586849ac8a9dc9", size = 227456 }, - { url = "https://files.pythonhosted.org/packages/de/03/07d992ccb6d930398689187e1b3c718339a1c06b8b145a8d9650e4726166/propcache-0.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62180e0b8dbb6b004baec00a7983e4cc52f5ada9cd11f48c3528d8cfa7b96a66", size = 225429 }, - { url = "https://files.pythonhosted.org/packages/5d/e6/116ba39448753b1330f48ab8ba927dcd6cf0baea8a0ccbc512dfb49ba670/propcache-0.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c144ca294a204c470f18cf4c9d78887810d04a3e2fbb30eea903575a779159df", size = 213472 }, - { url = "https://files.pythonhosted.org/packages/a6/85/f01f5d97e54e428885a5497ccf7f54404cbb4f906688a1690cd51bf597dc/propcache-0.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5c2a784234c28854878d68978265617aa6dc0780e53d44b4d67f3651a17a9a2", size = 204480 }, - { url = "https://files.pythonhosted.org/packages/e3/79/7bf5ab9033b8b8194cc3f7cf1aaa0e9c3256320726f64a3e1f113a812dce/propcache-0.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5745bc7acdafa978ca1642891b82c19238eadc78ba2aaa293c6863b304e552d7", size = 214530 }, - { url = "https://files.pythonhosted.org/packages/31/0b/bd3e0c00509b609317df4a18e6b05a450ef2d9a963e1d8bc9c9415d86f30/propcache-0.3.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:c0075bf773d66fa8c9d41f66cc132ecc75e5bb9dd7cce3cfd14adc5ca184cb95", size = 205230 }, - { url = "https://files.pythonhosted.org/packages/7a/23/fae0ff9b54b0de4e819bbe559508da132d5683c32d84d0dc2ccce3563ed4/propcache-0.3.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5f57aa0847730daceff0497f417c9de353c575d8da3579162cc74ac294c5369e", size = 206754 }, - { url = "https://files.pythonhosted.org/packages/b7/7f/ad6a3c22630aaa5f618b4dc3c3598974a72abb4c18e45a50b3cdd091eb2f/propcache-0.3.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:eef914c014bf72d18efb55619447e0aecd5fb7c2e3fa7441e2e5d6099bddff7e", size = 218430 }, - { url = "https://files.pythonhosted.org/packages/5b/2c/ba4f1c0e8a4b4c75910742f0d333759d441f65a1c7f34683b4a74c0ee015/propcache-0.3.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2a4092e8549031e82facf3decdbc0883755d5bbcc62d3aea9d9e185549936dcf", size = 223884 }, - { url = "https://files.pythonhosted.org/packages/88/e4/ebe30fc399e98572019eee82ad0caf512401661985cbd3da5e3140ffa1b0/propcache-0.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:85871b050f174bc0bfb437efbdb68aaf860611953ed12418e4361bc9c392749e", size = 211480 }, - { url = "https://files.pythonhosted.org/packages/96/0a/7d5260b914e01d1d0906f7f38af101f8d8ed0dc47426219eeaf05e8ea7c2/propcache-0.3.2-cp311-cp311-win32.whl", hash = "sha256:36c8d9b673ec57900c3554264e630d45980fd302458e4ac801802a7fd2ef7897", size = 37757 }, - { url = "https://files.pythonhosted.org/packages/e1/2d/89fe4489a884bc0da0c3278c552bd4ffe06a1ace559db5ef02ef24ab446b/propcache-0.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53af8cb6a781b02d2ea079b5b853ba9430fcbe18a8e3ce647d5982a3ff69f39", size = 41500 }, - { url = "https://files.pythonhosted.org/packages/a8/42/9ca01b0a6f48e81615dca4765a8f1dd2c057e0540f6116a27dc5ee01dfb6/propcache-0.3.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8de106b6c84506b31c27168582cd3cb3000a6412c16df14a8628e5871ff83c10", size = 73674 }, - { url = "https://files.pythonhosted.org/packages/af/6e/21293133beb550f9c901bbece755d582bfaf2176bee4774000bd4dd41884/propcache-0.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:28710b0d3975117239c76600ea351934ac7b5ff56e60953474342608dbbb6154", size = 43570 }, - { url = "https://files.pythonhosted.org/packages/0c/c8/0393a0a3a2b8760eb3bde3c147f62b20044f0ddac81e9d6ed7318ec0d852/propcache-0.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce26862344bdf836650ed2487c3d724b00fbfec4233a1013f597b78c1cb73615", size = 43094 }, - { url = "https://files.pythonhosted.org/packages/37/2c/489afe311a690399d04a3e03b069225670c1d489eb7b044a566511c1c498/propcache-0.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bca54bd347a253af2cf4544bbec232ab982f4868de0dd684246b67a51bc6b1db", size = 226958 }, - { url = "https://files.pythonhosted.org/packages/9d/ca/63b520d2f3d418c968bf596839ae26cf7f87bead026b6192d4da6a08c467/propcache-0.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55780d5e9a2ddc59711d727226bb1ba83a22dd32f64ee15594b9392b1f544eb1", size = 234894 }, - { url = "https://files.pythonhosted.org/packages/11/60/1d0ed6fff455a028d678df30cc28dcee7af77fa2b0e6962ce1df95c9a2a9/propcache-0.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:035e631be25d6975ed87ab23153db6a73426a48db688070d925aa27e996fe93c", size = 233672 }, - { url = "https://files.pythonhosted.org/packages/37/7c/54fd5301ef38505ab235d98827207176a5c9b2aa61939b10a460ca53e123/propcache-0.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee6f22b6eaa39297c751d0e80c0d3a454f112f5c6481214fcf4c092074cecd67", size = 224395 }, - { url = "https://files.pythonhosted.org/packages/ee/1a/89a40e0846f5de05fdc6779883bf46ba980e6df4d2ff8fb02643de126592/propcache-0.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ca3aee1aa955438c4dba34fc20a9f390e4c79967257d830f137bd5a8a32ed3b", size = 212510 }, - { url = "https://files.pythonhosted.org/packages/5e/33/ca98368586c9566a6b8d5ef66e30484f8da84c0aac3f2d9aec6d31a11bd5/propcache-0.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4f30862869fa2b68380d677cc1c5fcf1e0f2b9ea0cf665812895c75d0ca3b8", size = 222949 }, - { url = "https://files.pythonhosted.org/packages/ba/11/ace870d0aafe443b33b2f0b7efdb872b7c3abd505bfb4890716ad7865e9d/propcache-0.3.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b77ec3c257d7816d9f3700013639db7491a434644c906a2578a11daf13176251", size = 217258 }, - { url = "https://files.pythonhosted.org/packages/5b/d2/86fd6f7adffcfc74b42c10a6b7db721d1d9ca1055c45d39a1a8f2a740a21/propcache-0.3.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cab90ac9d3f14b2d5050928483d3d3b8fb6b4018893fc75710e6aa361ecb2474", size = 213036 }, - { url = "https://files.pythonhosted.org/packages/07/94/2d7d1e328f45ff34a0a284cf5a2847013701e24c2a53117e7c280a4316b3/propcache-0.3.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0b504d29f3c47cf6b9e936c1852246c83d450e8e063d50562115a6be6d3a2535", size = 227684 }, - { url = "https://files.pythonhosted.org/packages/b7/05/37ae63a0087677e90b1d14710e532ff104d44bc1efa3b3970fff99b891dc/propcache-0.3.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:ce2ac2675a6aa41ddb2a0c9cbff53780a617ac3d43e620f8fd77ba1c84dcfc06", size = 234562 }, - { url = "https://files.pythonhosted.org/packages/a4/7c/3f539fcae630408d0bd8bf3208b9a647ccad10976eda62402a80adf8fc34/propcache-0.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:62b4239611205294cc433845b914131b2a1f03500ff3c1ed093ed216b82621e1", size = 222142 }, - { url = "https://files.pythonhosted.org/packages/7c/d2/34b9eac8c35f79f8a962546b3e97e9d4b990c420ee66ac8255d5d9611648/propcache-0.3.2-cp312-cp312-win32.whl", hash = "sha256:df4a81b9b53449ebc90cc4deefb052c1dd934ba85012aa912c7ea7b7e38b60c1", size = 37711 }, - { url = "https://files.pythonhosted.org/packages/19/61/d582be5d226cf79071681d1b46b848d6cb03d7b70af7063e33a2787eaa03/propcache-0.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7046e79b989d7fe457bb755844019e10f693752d169076138abf17f31380800c", size = 41479 }, - { url = "https://files.pythonhosted.org/packages/dc/d1/8c747fafa558c603c4ca19d8e20b288aa0c7cda74e9402f50f31eb65267e/propcache-0.3.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ca592ed634a73ca002967458187109265e980422116c0a107cf93d81f95af945", size = 71286 }, - { url = "https://files.pythonhosted.org/packages/61/99/d606cb7986b60d89c36de8a85d58764323b3a5ff07770a99d8e993b3fa73/propcache-0.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9ecb0aad4020e275652ba3975740f241bd12a61f1a784df044cf7477a02bc252", size = 42425 }, - { url = "https://files.pythonhosted.org/packages/8c/96/ef98f91bbb42b79e9bb82bdd348b255eb9d65f14dbbe3b1594644c4073f7/propcache-0.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7f08f1cc28bd2eade7a8a3d2954ccc673bb02062e3e7da09bc75d843386b342f", size = 41846 }, - { url = "https://files.pythonhosted.org/packages/5b/ad/3f0f9a705fb630d175146cd7b1d2bf5555c9beaed54e94132b21aac098a6/propcache-0.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a342c834734edb4be5ecb1e9fb48cb64b1e2320fccbd8c54bf8da8f2a84c33", size = 208871 }, - { url = "https://files.pythonhosted.org/packages/3a/38/2085cda93d2c8b6ec3e92af2c89489a36a5886b712a34ab25de9fbca7992/propcache-0.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a544caaae1ac73f1fecfae70ded3e93728831affebd017d53449e3ac052ac1e", size = 215720 }, - { url = "https://files.pythonhosted.org/packages/61/c1/d72ea2dc83ac7f2c8e182786ab0fc2c7bd123a1ff9b7975bee671866fe5f/propcache-0.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:310d11aa44635298397db47a3ebce7db99a4cc4b9bbdfcf6c98a60c8d5261cf1", size = 215203 }, - { url = "https://files.pythonhosted.org/packages/af/81/b324c44ae60c56ef12007105f1460d5c304b0626ab0cc6b07c8f2a9aa0b8/propcache-0.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c1396592321ac83157ac03a2023aa6cc4a3cc3cfdecb71090054c09e5a7cce3", size = 206365 }, - { url = "https://files.pythonhosted.org/packages/09/73/88549128bb89e66d2aff242488f62869014ae092db63ccea53c1cc75a81d/propcache-0.3.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cabf5b5902272565e78197edb682017d21cf3b550ba0460ee473753f28d23c1", size = 196016 }, - { url = "https://files.pythonhosted.org/packages/b9/3f/3bdd14e737d145114a5eb83cb172903afba7242f67c5877f9909a20d948d/propcache-0.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0a2f2235ac46a7aa25bdeb03a9e7060f6ecbd213b1f9101c43b3090ffb971ef6", size = 205596 }, - { url = "https://files.pythonhosted.org/packages/0f/ca/2f4aa819c357d3107c3763d7ef42c03980f9ed5c48c82e01e25945d437c1/propcache-0.3.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:92b69e12e34869a6970fd2f3da91669899994b47c98f5d430b781c26f1d9f387", size = 200977 }, - { url = "https://files.pythonhosted.org/packages/cd/4a/e65276c7477533c59085251ae88505caf6831c0e85ff8b2e31ebcbb949b1/propcache-0.3.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:54e02207c79968ebbdffc169591009f4474dde3b4679e16634d34c9363ff56b4", size = 197220 }, - { url = "https://files.pythonhosted.org/packages/7c/54/fc7152e517cf5578278b242396ce4d4b36795423988ef39bb8cd5bf274c8/propcache-0.3.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4adfb44cb588001f68c5466579d3f1157ca07f7504fc91ec87862e2b8e556b88", size = 210642 }, - { url = "https://files.pythonhosted.org/packages/b9/80/abeb4a896d2767bf5f1ea7b92eb7be6a5330645bd7fb844049c0e4045d9d/propcache-0.3.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fd3e6019dc1261cd0291ee8919dd91fbab7b169bb76aeef6c716833a3f65d206", size = 212789 }, - { url = "https://files.pythonhosted.org/packages/b3/db/ea12a49aa7b2b6d68a5da8293dcf50068d48d088100ac016ad92a6a780e6/propcache-0.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4c181cad81158d71c41a2bce88edce078458e2dd5ffee7eddd6b05da85079f43", size = 205880 }, - { url = "https://files.pythonhosted.org/packages/d1/e5/9076a0bbbfb65d1198007059c65639dfd56266cf8e477a9707e4b1999ff4/propcache-0.3.2-cp313-cp313-win32.whl", hash = "sha256:8a08154613f2249519e549de2330cf8e2071c2887309a7b07fb56098f5170a02", size = 37220 }, - { url = "https://files.pythonhosted.org/packages/d3/f5/b369e026b09a26cd77aa88d8fffd69141d2ae00a2abaaf5380d2603f4b7f/propcache-0.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e41671f1594fc4ab0a6dec1351864713cb3a279910ae8b58f884a88a0a632c05", size = 40678 }, - { url = "https://files.pythonhosted.org/packages/a4/3a/6ece377b55544941a08d03581c7bc400a3c8cd3c2865900a68d5de79e21f/propcache-0.3.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:9a3cf035bbaf035f109987d9d55dc90e4b0e36e04bbbb95af3055ef17194057b", size = 76560 }, - { url = "https://files.pythonhosted.org/packages/0c/da/64a2bb16418740fa634b0e9c3d29edff1db07f56d3546ca2d86ddf0305e1/propcache-0.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:156c03d07dc1323d8dacaa221fbe028c5c70d16709cdd63502778e6c3ccca1b0", size = 44676 }, - { url = "https://files.pythonhosted.org/packages/36/7b/f025e06ea51cb72c52fb87e9b395cced02786610b60a3ed51da8af017170/propcache-0.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74413c0ba02ba86f55cf60d18daab219f7e531620c15f1e23d95563f505efe7e", size = 44701 }, - { url = "https://files.pythonhosted.org/packages/a4/00/faa1b1b7c3b74fc277f8642f32a4c72ba1d7b2de36d7cdfb676db7f4303e/propcache-0.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f066b437bb3fa39c58ff97ab2ca351db465157d68ed0440abecb21715eb24b28", size = 276934 }, - { url = "https://files.pythonhosted.org/packages/74/ab/935beb6f1756e0476a4d5938ff44bf0d13a055fed880caf93859b4f1baf4/propcache-0.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1304b085c83067914721e7e9d9917d41ad87696bf70f0bc7dee450e9c71ad0a", size = 278316 }, - { url = "https://files.pythonhosted.org/packages/f8/9d/994a5c1ce4389610838d1caec74bdf0e98b306c70314d46dbe4fcf21a3e2/propcache-0.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab50cef01b372763a13333b4e54021bdcb291fc9a8e2ccb9c2df98be51bcde6c", size = 282619 }, - { url = "https://files.pythonhosted.org/packages/2b/00/a10afce3d1ed0287cef2e09506d3be9822513f2c1e96457ee369adb9a6cd/propcache-0.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fad3b2a085ec259ad2c2842666b2a0a49dea8463579c606426128925af1ed725", size = 265896 }, - { url = "https://files.pythonhosted.org/packages/2e/a8/2aa6716ffa566ca57c749edb909ad27884680887d68517e4be41b02299f3/propcache-0.3.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:261fa020c1c14deafd54c76b014956e2f86991af198c51139faf41c4d5e83892", size = 252111 }, - { url = "https://files.pythonhosted.org/packages/36/4f/345ca9183b85ac29c8694b0941f7484bf419c7f0fea2d1e386b4f7893eed/propcache-0.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:46d7f8aa79c927e5f987ee3a80205c987717d3659f035c85cf0c3680526bdb44", size = 268334 }, - { url = "https://files.pythonhosted.org/packages/3e/ca/fcd54f78b59e3f97b3b9715501e3147f5340167733d27db423aa321e7148/propcache-0.3.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:6d8f3f0eebf73e3c0ff0e7853f68be638b4043c65a70517bb575eff54edd8dbe", size = 255026 }, - { url = "https://files.pythonhosted.org/packages/8b/95/8e6a6bbbd78ac89c30c225210a5c687790e532ba4088afb8c0445b77ef37/propcache-0.3.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:03c89c1b14a5452cf15403e291c0ccd7751d5b9736ecb2c5bab977ad6c5bcd81", size = 250724 }, - { url = "https://files.pythonhosted.org/packages/ee/b0/0dd03616142baba28e8b2d14ce5df6631b4673850a3d4f9c0f9dd714a404/propcache-0.3.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:0cc17efde71e12bbaad086d679ce575268d70bc123a5a71ea7ad76f70ba30bba", size = 268868 }, - { url = "https://files.pythonhosted.org/packages/c5/98/2c12407a7e4fbacd94ddd32f3b1e3d5231e77c30ef7162b12a60e2dd5ce3/propcache-0.3.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:acdf05d00696bc0447e278bb53cb04ca72354e562cf88ea6f9107df8e7fd9770", size = 271322 }, - { url = "https://files.pythonhosted.org/packages/35/91/9cb56efbb428b006bb85db28591e40b7736847b8331d43fe335acf95f6c8/propcache-0.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4445542398bd0b5d32df908031cb1b30d43ac848e20470a878b770ec2dcc6330", size = 265778 }, - { url = "https://files.pythonhosted.org/packages/9a/4c/b0fe775a2bdd01e176b14b574be679d84fc83958335790f7c9a686c1f468/propcache-0.3.2-cp313-cp313t-win32.whl", hash = "sha256:f86e5d7cd03afb3a1db8e9f9f6eff15794e79e791350ac48a8c924e6f439f394", size = 41175 }, - { url = "https://files.pythonhosted.org/packages/a4/ff/47f08595e3d9b5e149c150f88d9714574f1a7cbd89fe2817158a952674bf/propcache-0.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9704bedf6e7cbe3c65eca4379a9b53ee6a83749f047808cbb5044d40d7d72198", size = 44857 }, - { url = "https://files.pythonhosted.org/packages/cc/35/cc0aaecf278bb4575b8555f2b137de5ab821595ddae9da9d3cd1da4072c7/propcache-0.3.2-py3-none-any.whl", hash = "sha256:98f1ec44fb675f5052cccc8e609c46ed23a35a1cfd18545ad4e29002d858a43f", size = 12663 }, +sdist = { url = "https://files.pythonhosted.org/packages/a6/16/43264e4a779dd8588c21a70f0709665ee8f611211bdd2c87d952cfa7c776/propcache-0.3.2.tar.gz", hash = "sha256:20d7d62e4e7ef05f221e0db2856b979540686342e7dd9973b815599c7057e168", size = 44139, upload-time = "2025-06-09T22:56:06.081Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/8d/e8b436717ab9c2cfc23b116d2c297305aa4cd8339172a456d61ebf5669b8/propcache-0.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0b8d2f607bd8f80ddc04088bc2a037fdd17884a6fcadc47a96e334d72f3717be", size = 74207, upload-time = "2025-06-09T22:54:05.399Z" }, + { url = "https://files.pythonhosted.org/packages/d6/29/1e34000e9766d112171764b9fa3226fa0153ab565d0c242c70e9945318a7/propcache-0.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06766d8f34733416e2e34f46fea488ad5d60726bb9481d3cddf89a6fa2d9603f", size = 43648, upload-time = "2025-06-09T22:54:08.023Z" }, + { url = "https://files.pythonhosted.org/packages/46/92/1ad5af0df781e76988897da39b5f086c2bf0f028b7f9bd1f409bb05b6874/propcache-0.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2dc1f4a1df4fecf4e6f68013575ff4af84ef6f478fe5344317a65d38a8e6dc9", size = 43496, upload-time = "2025-06-09T22:54:09.228Z" }, + { url = "https://files.pythonhosted.org/packages/b3/ce/e96392460f9fb68461fabab3e095cb00c8ddf901205be4eae5ce246e5b7e/propcache-0.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be29c4f4810c5789cf10ddf6af80b041c724e629fa51e308a7a0fb19ed1ef7bf", size = 217288, upload-time = "2025-06-09T22:54:10.466Z" }, + { url = "https://files.pythonhosted.org/packages/c5/2a/866726ea345299f7ceefc861a5e782b045545ae6940851930a6adaf1fca6/propcache-0.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59d61f6970ecbd8ff2e9360304d5c8876a6abd4530cb752c06586849ac8a9dc9", size = 227456, upload-time = "2025-06-09T22:54:11.828Z" }, + { url = "https://files.pythonhosted.org/packages/de/03/07d992ccb6d930398689187e1b3c718339a1c06b8b145a8d9650e4726166/propcache-0.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:62180e0b8dbb6b004baec00a7983e4cc52f5ada9cd11f48c3528d8cfa7b96a66", size = 225429, upload-time = "2025-06-09T22:54:13.823Z" }, + { url = "https://files.pythonhosted.org/packages/5d/e6/116ba39448753b1330f48ab8ba927dcd6cf0baea8a0ccbc512dfb49ba670/propcache-0.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c144ca294a204c470f18cf4c9d78887810d04a3e2fbb30eea903575a779159df", size = 213472, upload-time = "2025-06-09T22:54:15.232Z" }, + { url = "https://files.pythonhosted.org/packages/a6/85/f01f5d97e54e428885a5497ccf7f54404cbb4f906688a1690cd51bf597dc/propcache-0.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5c2a784234c28854878d68978265617aa6dc0780e53d44b4d67f3651a17a9a2", size = 204480, upload-time = "2025-06-09T22:54:17.104Z" }, + { url = "https://files.pythonhosted.org/packages/e3/79/7bf5ab9033b8b8194cc3f7cf1aaa0e9c3256320726f64a3e1f113a812dce/propcache-0.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5745bc7acdafa978ca1642891b82c19238eadc78ba2aaa293c6863b304e552d7", size = 214530, upload-time = "2025-06-09T22:54:18.512Z" }, + { url = "https://files.pythonhosted.org/packages/31/0b/bd3e0c00509b609317df4a18e6b05a450ef2d9a963e1d8bc9c9415d86f30/propcache-0.3.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:c0075bf773d66fa8c9d41f66cc132ecc75e5bb9dd7cce3cfd14adc5ca184cb95", size = 205230, upload-time = "2025-06-09T22:54:19.947Z" }, + { url = "https://files.pythonhosted.org/packages/7a/23/fae0ff9b54b0de4e819bbe559508da132d5683c32d84d0dc2ccce3563ed4/propcache-0.3.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5f57aa0847730daceff0497f417c9de353c575d8da3579162cc74ac294c5369e", size = 206754, upload-time = "2025-06-09T22:54:21.716Z" }, + { url = "https://files.pythonhosted.org/packages/b7/7f/ad6a3c22630aaa5f618b4dc3c3598974a72abb4c18e45a50b3cdd091eb2f/propcache-0.3.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:eef914c014bf72d18efb55619447e0aecd5fb7c2e3fa7441e2e5d6099bddff7e", size = 218430, upload-time = "2025-06-09T22:54:23.17Z" }, + { url = "https://files.pythonhosted.org/packages/5b/2c/ba4f1c0e8a4b4c75910742f0d333759d441f65a1c7f34683b4a74c0ee015/propcache-0.3.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2a4092e8549031e82facf3decdbc0883755d5bbcc62d3aea9d9e185549936dcf", size = 223884, upload-time = "2025-06-09T22:54:25.539Z" }, + { url = "https://files.pythonhosted.org/packages/88/e4/ebe30fc399e98572019eee82ad0caf512401661985cbd3da5e3140ffa1b0/propcache-0.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:85871b050f174bc0bfb437efbdb68aaf860611953ed12418e4361bc9c392749e", size = 211480, upload-time = "2025-06-09T22:54:26.892Z" }, + { url = "https://files.pythonhosted.org/packages/96/0a/7d5260b914e01d1d0906f7f38af101f8d8ed0dc47426219eeaf05e8ea7c2/propcache-0.3.2-cp311-cp311-win32.whl", hash = "sha256:36c8d9b673ec57900c3554264e630d45980fd302458e4ac801802a7fd2ef7897", size = 37757, upload-time = "2025-06-09T22:54:28.241Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2d/89fe4489a884bc0da0c3278c552bd4ffe06a1ace559db5ef02ef24ab446b/propcache-0.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53af8cb6a781b02d2ea079b5b853ba9430fcbe18a8e3ce647d5982a3ff69f39", size = 41500, upload-time = "2025-06-09T22:54:29.4Z" }, + { url = "https://files.pythonhosted.org/packages/a8/42/9ca01b0a6f48e81615dca4765a8f1dd2c057e0540f6116a27dc5ee01dfb6/propcache-0.3.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8de106b6c84506b31c27168582cd3cb3000a6412c16df14a8628e5871ff83c10", size = 73674, upload-time = "2025-06-09T22:54:30.551Z" }, + { url = "https://files.pythonhosted.org/packages/af/6e/21293133beb550f9c901bbece755d582bfaf2176bee4774000bd4dd41884/propcache-0.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:28710b0d3975117239c76600ea351934ac7b5ff56e60953474342608dbbb6154", size = 43570, upload-time = "2025-06-09T22:54:32.296Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c8/0393a0a3a2b8760eb3bde3c147f62b20044f0ddac81e9d6ed7318ec0d852/propcache-0.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce26862344bdf836650ed2487c3d724b00fbfec4233a1013f597b78c1cb73615", size = 43094, upload-time = "2025-06-09T22:54:33.929Z" }, + { url = "https://files.pythonhosted.org/packages/37/2c/489afe311a690399d04a3e03b069225670c1d489eb7b044a566511c1c498/propcache-0.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bca54bd347a253af2cf4544bbec232ab982f4868de0dd684246b67a51bc6b1db", size = 226958, upload-time = "2025-06-09T22:54:35.186Z" }, + { url = "https://files.pythonhosted.org/packages/9d/ca/63b520d2f3d418c968bf596839ae26cf7f87bead026b6192d4da6a08c467/propcache-0.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55780d5e9a2ddc59711d727226bb1ba83a22dd32f64ee15594b9392b1f544eb1", size = 234894, upload-time = "2025-06-09T22:54:36.708Z" }, + { url = "https://files.pythonhosted.org/packages/11/60/1d0ed6fff455a028d678df30cc28dcee7af77fa2b0e6962ce1df95c9a2a9/propcache-0.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:035e631be25d6975ed87ab23153db6a73426a48db688070d925aa27e996fe93c", size = 233672, upload-time = "2025-06-09T22:54:38.062Z" }, + { url = "https://files.pythonhosted.org/packages/37/7c/54fd5301ef38505ab235d98827207176a5c9b2aa61939b10a460ca53e123/propcache-0.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee6f22b6eaa39297c751d0e80c0d3a454f112f5c6481214fcf4c092074cecd67", size = 224395, upload-time = "2025-06-09T22:54:39.634Z" }, + { url = "https://files.pythonhosted.org/packages/ee/1a/89a40e0846f5de05fdc6779883bf46ba980e6df4d2ff8fb02643de126592/propcache-0.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ca3aee1aa955438c4dba34fc20a9f390e4c79967257d830f137bd5a8a32ed3b", size = 212510, upload-time = "2025-06-09T22:54:41.565Z" }, + { url = "https://files.pythonhosted.org/packages/5e/33/ca98368586c9566a6b8d5ef66e30484f8da84c0aac3f2d9aec6d31a11bd5/propcache-0.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7a4f30862869fa2b68380d677cc1c5fcf1e0f2b9ea0cf665812895c75d0ca3b8", size = 222949, upload-time = "2025-06-09T22:54:43.038Z" }, + { url = "https://files.pythonhosted.org/packages/ba/11/ace870d0aafe443b33b2f0b7efdb872b7c3abd505bfb4890716ad7865e9d/propcache-0.3.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b77ec3c257d7816d9f3700013639db7491a434644c906a2578a11daf13176251", size = 217258, upload-time = "2025-06-09T22:54:44.376Z" }, + { url = "https://files.pythonhosted.org/packages/5b/d2/86fd6f7adffcfc74b42c10a6b7db721d1d9ca1055c45d39a1a8f2a740a21/propcache-0.3.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cab90ac9d3f14b2d5050928483d3d3b8fb6b4018893fc75710e6aa361ecb2474", size = 213036, upload-time = "2025-06-09T22:54:46.243Z" }, + { url = "https://files.pythonhosted.org/packages/07/94/2d7d1e328f45ff34a0a284cf5a2847013701e24c2a53117e7c280a4316b3/propcache-0.3.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:0b504d29f3c47cf6b9e936c1852246c83d450e8e063d50562115a6be6d3a2535", size = 227684, upload-time = "2025-06-09T22:54:47.63Z" }, + { url = "https://files.pythonhosted.org/packages/b7/05/37ae63a0087677e90b1d14710e532ff104d44bc1efa3b3970fff99b891dc/propcache-0.3.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:ce2ac2675a6aa41ddb2a0c9cbff53780a617ac3d43e620f8fd77ba1c84dcfc06", size = 234562, upload-time = "2025-06-09T22:54:48.982Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7c/3f539fcae630408d0bd8bf3208b9a647ccad10976eda62402a80adf8fc34/propcache-0.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:62b4239611205294cc433845b914131b2a1f03500ff3c1ed093ed216b82621e1", size = 222142, upload-time = "2025-06-09T22:54:50.424Z" }, + { url = "https://files.pythonhosted.org/packages/7c/d2/34b9eac8c35f79f8a962546b3e97e9d4b990c420ee66ac8255d5d9611648/propcache-0.3.2-cp312-cp312-win32.whl", hash = "sha256:df4a81b9b53449ebc90cc4deefb052c1dd934ba85012aa912c7ea7b7e38b60c1", size = 37711, upload-time = "2025-06-09T22:54:52.072Z" }, + { url = "https://files.pythonhosted.org/packages/19/61/d582be5d226cf79071681d1b46b848d6cb03d7b70af7063e33a2787eaa03/propcache-0.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7046e79b989d7fe457bb755844019e10f693752d169076138abf17f31380800c", size = 41479, upload-time = "2025-06-09T22:54:53.234Z" }, + { url = "https://files.pythonhosted.org/packages/dc/d1/8c747fafa558c603c4ca19d8e20b288aa0c7cda74e9402f50f31eb65267e/propcache-0.3.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ca592ed634a73ca002967458187109265e980422116c0a107cf93d81f95af945", size = 71286, upload-time = "2025-06-09T22:54:54.369Z" }, + { url = "https://files.pythonhosted.org/packages/61/99/d606cb7986b60d89c36de8a85d58764323b3a5ff07770a99d8e993b3fa73/propcache-0.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9ecb0aad4020e275652ba3975740f241bd12a61f1a784df044cf7477a02bc252", size = 42425, upload-time = "2025-06-09T22:54:55.642Z" }, + { url = "https://files.pythonhosted.org/packages/8c/96/ef98f91bbb42b79e9bb82bdd348b255eb9d65f14dbbe3b1594644c4073f7/propcache-0.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7f08f1cc28bd2eade7a8a3d2954ccc673bb02062e3e7da09bc75d843386b342f", size = 41846, upload-time = "2025-06-09T22:54:57.246Z" }, + { url = "https://files.pythonhosted.org/packages/5b/ad/3f0f9a705fb630d175146cd7b1d2bf5555c9beaed54e94132b21aac098a6/propcache-0.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1a342c834734edb4be5ecb1e9fb48cb64b1e2320fccbd8c54bf8da8f2a84c33", size = 208871, upload-time = "2025-06-09T22:54:58.975Z" }, + { url = "https://files.pythonhosted.org/packages/3a/38/2085cda93d2c8b6ec3e92af2c89489a36a5886b712a34ab25de9fbca7992/propcache-0.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a544caaae1ac73f1fecfae70ded3e93728831affebd017d53449e3ac052ac1e", size = 215720, upload-time = "2025-06-09T22:55:00.471Z" }, + { url = "https://files.pythonhosted.org/packages/61/c1/d72ea2dc83ac7f2c8e182786ab0fc2c7bd123a1ff9b7975bee671866fe5f/propcache-0.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:310d11aa44635298397db47a3ebce7db99a4cc4b9bbdfcf6c98a60c8d5261cf1", size = 215203, upload-time = "2025-06-09T22:55:01.834Z" }, + { url = "https://files.pythonhosted.org/packages/af/81/b324c44ae60c56ef12007105f1460d5c304b0626ab0cc6b07c8f2a9aa0b8/propcache-0.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c1396592321ac83157ac03a2023aa6cc4a3cc3cfdecb71090054c09e5a7cce3", size = 206365, upload-time = "2025-06-09T22:55:03.199Z" }, + { url = "https://files.pythonhosted.org/packages/09/73/88549128bb89e66d2aff242488f62869014ae092db63ccea53c1cc75a81d/propcache-0.3.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cabf5b5902272565e78197edb682017d21cf3b550ba0460ee473753f28d23c1", size = 196016, upload-time = "2025-06-09T22:55:04.518Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3f/3bdd14e737d145114a5eb83cb172903afba7242f67c5877f9909a20d948d/propcache-0.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0a2f2235ac46a7aa25bdeb03a9e7060f6ecbd213b1f9101c43b3090ffb971ef6", size = 205596, upload-time = "2025-06-09T22:55:05.942Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ca/2f4aa819c357d3107c3763d7ef42c03980f9ed5c48c82e01e25945d437c1/propcache-0.3.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:92b69e12e34869a6970fd2f3da91669899994b47c98f5d430b781c26f1d9f387", size = 200977, upload-time = "2025-06-09T22:55:07.792Z" }, + { url = "https://files.pythonhosted.org/packages/cd/4a/e65276c7477533c59085251ae88505caf6831c0e85ff8b2e31ebcbb949b1/propcache-0.3.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:54e02207c79968ebbdffc169591009f4474dde3b4679e16634d34c9363ff56b4", size = 197220, upload-time = "2025-06-09T22:55:09.173Z" }, + { url = "https://files.pythonhosted.org/packages/7c/54/fc7152e517cf5578278b242396ce4d4b36795423988ef39bb8cd5bf274c8/propcache-0.3.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4adfb44cb588001f68c5466579d3f1157ca07f7504fc91ec87862e2b8e556b88", size = 210642, upload-time = "2025-06-09T22:55:10.62Z" }, + { url = "https://files.pythonhosted.org/packages/b9/80/abeb4a896d2767bf5f1ea7b92eb7be6a5330645bd7fb844049c0e4045d9d/propcache-0.3.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fd3e6019dc1261cd0291ee8919dd91fbab7b169bb76aeef6c716833a3f65d206", size = 212789, upload-time = "2025-06-09T22:55:12.029Z" }, + { url = "https://files.pythonhosted.org/packages/b3/db/ea12a49aa7b2b6d68a5da8293dcf50068d48d088100ac016ad92a6a780e6/propcache-0.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4c181cad81158d71c41a2bce88edce078458e2dd5ffee7eddd6b05da85079f43", size = 205880, upload-time = "2025-06-09T22:55:13.45Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e5/9076a0bbbfb65d1198007059c65639dfd56266cf8e477a9707e4b1999ff4/propcache-0.3.2-cp313-cp313-win32.whl", hash = "sha256:8a08154613f2249519e549de2330cf8e2071c2887309a7b07fb56098f5170a02", size = 37220, upload-time = "2025-06-09T22:55:15.284Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f5/b369e026b09a26cd77aa88d8fffd69141d2ae00a2abaaf5380d2603f4b7f/propcache-0.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e41671f1594fc4ab0a6dec1351864713cb3a279910ae8b58f884a88a0a632c05", size = 40678, upload-time = "2025-06-09T22:55:16.445Z" }, + { url = "https://files.pythonhosted.org/packages/a4/3a/6ece377b55544941a08d03581c7bc400a3c8cd3c2865900a68d5de79e21f/propcache-0.3.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:9a3cf035bbaf035f109987d9d55dc90e4b0e36e04bbbb95af3055ef17194057b", size = 76560, upload-time = "2025-06-09T22:55:17.598Z" }, + { url = "https://files.pythonhosted.org/packages/0c/da/64a2bb16418740fa634b0e9c3d29edff1db07f56d3546ca2d86ddf0305e1/propcache-0.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:156c03d07dc1323d8dacaa221fbe028c5c70d16709cdd63502778e6c3ccca1b0", size = 44676, upload-time = "2025-06-09T22:55:18.922Z" }, + { url = "https://files.pythonhosted.org/packages/36/7b/f025e06ea51cb72c52fb87e9b395cced02786610b60a3ed51da8af017170/propcache-0.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74413c0ba02ba86f55cf60d18daab219f7e531620c15f1e23d95563f505efe7e", size = 44701, upload-time = "2025-06-09T22:55:20.106Z" }, + { url = "https://files.pythonhosted.org/packages/a4/00/faa1b1b7c3b74fc277f8642f32a4c72ba1d7b2de36d7cdfb676db7f4303e/propcache-0.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f066b437bb3fa39c58ff97ab2ca351db465157d68ed0440abecb21715eb24b28", size = 276934, upload-time = "2025-06-09T22:55:21.5Z" }, + { url = "https://files.pythonhosted.org/packages/74/ab/935beb6f1756e0476a4d5938ff44bf0d13a055fed880caf93859b4f1baf4/propcache-0.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1304b085c83067914721e7e9d9917d41ad87696bf70f0bc7dee450e9c71ad0a", size = 278316, upload-time = "2025-06-09T22:55:22.918Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9d/994a5c1ce4389610838d1caec74bdf0e98b306c70314d46dbe4fcf21a3e2/propcache-0.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab50cef01b372763a13333b4e54021bdcb291fc9a8e2ccb9c2df98be51bcde6c", size = 282619, upload-time = "2025-06-09T22:55:24.651Z" }, + { url = "https://files.pythonhosted.org/packages/2b/00/a10afce3d1ed0287cef2e09506d3be9822513f2c1e96457ee369adb9a6cd/propcache-0.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fad3b2a085ec259ad2c2842666b2a0a49dea8463579c606426128925af1ed725", size = 265896, upload-time = "2025-06-09T22:55:26.049Z" }, + { url = "https://files.pythonhosted.org/packages/2e/a8/2aa6716ffa566ca57c749edb909ad27884680887d68517e4be41b02299f3/propcache-0.3.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:261fa020c1c14deafd54c76b014956e2f86991af198c51139faf41c4d5e83892", size = 252111, upload-time = "2025-06-09T22:55:27.381Z" }, + { url = "https://files.pythonhosted.org/packages/36/4f/345ca9183b85ac29c8694b0941f7484bf419c7f0fea2d1e386b4f7893eed/propcache-0.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:46d7f8aa79c927e5f987ee3a80205c987717d3659f035c85cf0c3680526bdb44", size = 268334, upload-time = "2025-06-09T22:55:28.747Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ca/fcd54f78b59e3f97b3b9715501e3147f5340167733d27db423aa321e7148/propcache-0.3.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:6d8f3f0eebf73e3c0ff0e7853f68be638b4043c65a70517bb575eff54edd8dbe", size = 255026, upload-time = "2025-06-09T22:55:30.184Z" }, + { url = "https://files.pythonhosted.org/packages/8b/95/8e6a6bbbd78ac89c30c225210a5c687790e532ba4088afb8c0445b77ef37/propcache-0.3.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:03c89c1b14a5452cf15403e291c0ccd7751d5b9736ecb2c5bab977ad6c5bcd81", size = 250724, upload-time = "2025-06-09T22:55:31.646Z" }, + { url = "https://files.pythonhosted.org/packages/ee/b0/0dd03616142baba28e8b2d14ce5df6631b4673850a3d4f9c0f9dd714a404/propcache-0.3.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:0cc17efde71e12bbaad086d679ce575268d70bc123a5a71ea7ad76f70ba30bba", size = 268868, upload-time = "2025-06-09T22:55:33.209Z" }, + { url = "https://files.pythonhosted.org/packages/c5/98/2c12407a7e4fbacd94ddd32f3b1e3d5231e77c30ef7162b12a60e2dd5ce3/propcache-0.3.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:acdf05d00696bc0447e278bb53cb04ca72354e562cf88ea6f9107df8e7fd9770", size = 271322, upload-time = "2025-06-09T22:55:35.065Z" }, + { url = "https://files.pythonhosted.org/packages/35/91/9cb56efbb428b006bb85db28591e40b7736847b8331d43fe335acf95f6c8/propcache-0.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4445542398bd0b5d32df908031cb1b30d43ac848e20470a878b770ec2dcc6330", size = 265778, upload-time = "2025-06-09T22:55:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/9a/4c/b0fe775a2bdd01e176b14b574be679d84fc83958335790f7c9a686c1f468/propcache-0.3.2-cp313-cp313t-win32.whl", hash = "sha256:f86e5d7cd03afb3a1db8e9f9f6eff15794e79e791350ac48a8c924e6f439f394", size = 41175, upload-time = "2025-06-09T22:55:38.436Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ff/47f08595e3d9b5e149c150f88d9714574f1a7cbd89fe2817158a952674bf/propcache-0.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9704bedf6e7cbe3c65eca4379a9b53ee6a83749f047808cbb5044d40d7d72198", size = 44857, upload-time = "2025-06-09T22:55:39.687Z" }, + { url = "https://files.pythonhosted.org/packages/cc/35/cc0aaecf278bb4575b8555f2b137de5ab821595ddae9da9d3cd1da4072c7/propcache-0.3.2-py3-none-any.whl", hash = "sha256:98f1ec44fb675f5052cccc8e609c46ed23a35a1cfd18545ad4e29002d858a43f", size = 12663, upload-time = "2025-06-09T22:56:04.484Z" }, ] [[package]] @@ -2325,65 +2340,65 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f4/ac/87285f15f7cce6d4a008f33f1757fb5a13611ea8914eb58c3d0d26243468/proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012", size = 56142 } +sdist = { url = "https://files.pythonhosted.org/packages/f4/ac/87285f15f7cce6d4a008f33f1757fb5a13611ea8914eb58c3d0d26243468/proto_plus-1.26.1.tar.gz", hash = "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012", size = 56142, upload-time = "2025-03-10T15:54:38.843Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/6d/280c4c2ce28b1593a19ad5239c8b826871fc6ec275c21afc8e1820108039/proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66", size = 50163 }, + { url = "https://files.pythonhosted.org/packages/4e/6d/280c4c2ce28b1593a19ad5239c8b826871fc6ec275c21afc8e1820108039/proto_plus-1.26.1-py3-none-any.whl", hash = "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66", size = 50163, upload-time = "2025-03-10T15:54:37.335Z" }, ] [[package]] name = "protobuf" version = "6.31.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/f3/b9655a711b32c19720253f6f06326faf90580834e2e83f840472d752bc8b/protobuf-6.31.1.tar.gz", hash = "sha256:d8cac4c982f0b957a4dc73a80e2ea24fab08e679c0de9deb835f4a12d69aca9a", size = 441797 } +sdist = { url = "https://files.pythonhosted.org/packages/52/f3/b9655a711b32c19720253f6f06326faf90580834e2e83f840472d752bc8b/protobuf-6.31.1.tar.gz", hash = "sha256:d8cac4c982f0b957a4dc73a80e2ea24fab08e679c0de9deb835f4a12d69aca9a", size = 441797, upload-time = "2025-05-28T19:25:54.947Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/6f/6ab8e4bf962fd5570d3deaa2d5c38f0a363f57b4501047b5ebeb83ab1125/protobuf-6.31.1-cp310-abi3-win32.whl", hash = "sha256:7fa17d5a29c2e04b7d90e5e32388b8bfd0e7107cd8e616feef7ed3fa6bdab5c9", size = 423603 }, - { url = "https://files.pythonhosted.org/packages/44/3a/b15c4347dd4bf3a1b0ee882f384623e2063bb5cf9fa9d57990a4f7df2fb6/protobuf-6.31.1-cp310-abi3-win_amd64.whl", hash = "sha256:426f59d2964864a1a366254fa703b8632dcec0790d8862d30034d8245e1cd447", size = 435283 }, - { url = "https://files.pythonhosted.org/packages/6a/c9/b9689a2a250264a84e66c46d8862ba788ee7a641cdca39bccf64f59284b7/protobuf-6.31.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:6f1227473dc43d44ed644425268eb7c2e488ae245d51c6866d19fe158e207402", size = 425604 }, - { url = "https://files.pythonhosted.org/packages/76/a1/7a5a94032c83375e4fe7e7f56e3976ea6ac90c5e85fac8576409e25c39c3/protobuf-6.31.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:a40fc12b84c154884d7d4c4ebd675d5b3b5283e155f324049ae396b95ddebc39", size = 322115 }, - { url = "https://files.pythonhosted.org/packages/fa/b1/b59d405d64d31999244643d88c45c8241c58f17cc887e73bcb90602327f8/protobuf-6.31.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:4ee898bf66f7a8b0bd21bce523814e6fbd8c6add948045ce958b73af7e8878c6", size = 321070 }, - { url = "https://files.pythonhosted.org/packages/f7/af/ab3c51ab7507a7325e98ffe691d9495ee3d3aa5f589afad65ec920d39821/protobuf-6.31.1-py3-none-any.whl", hash = "sha256:720a6c7e6b77288b85063569baae8536671b39f15cc22037ec7045658d80489e", size = 168724 }, + { url = "https://files.pythonhosted.org/packages/f3/6f/6ab8e4bf962fd5570d3deaa2d5c38f0a363f57b4501047b5ebeb83ab1125/protobuf-6.31.1-cp310-abi3-win32.whl", hash = "sha256:7fa17d5a29c2e04b7d90e5e32388b8bfd0e7107cd8e616feef7ed3fa6bdab5c9", size = 423603, upload-time = "2025-05-28T19:25:41.198Z" }, + { url = "https://files.pythonhosted.org/packages/44/3a/b15c4347dd4bf3a1b0ee882f384623e2063bb5cf9fa9d57990a4f7df2fb6/protobuf-6.31.1-cp310-abi3-win_amd64.whl", hash = "sha256:426f59d2964864a1a366254fa703b8632dcec0790d8862d30034d8245e1cd447", size = 435283, upload-time = "2025-05-28T19:25:44.275Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c9/b9689a2a250264a84e66c46d8862ba788ee7a641cdca39bccf64f59284b7/protobuf-6.31.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:6f1227473dc43d44ed644425268eb7c2e488ae245d51c6866d19fe158e207402", size = 425604, upload-time = "2025-05-28T19:25:45.702Z" }, + { url = "https://files.pythonhosted.org/packages/76/a1/7a5a94032c83375e4fe7e7f56e3976ea6ac90c5e85fac8576409e25c39c3/protobuf-6.31.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:a40fc12b84c154884d7d4c4ebd675d5b3b5283e155f324049ae396b95ddebc39", size = 322115, upload-time = "2025-05-28T19:25:47.128Z" }, + { url = "https://files.pythonhosted.org/packages/fa/b1/b59d405d64d31999244643d88c45c8241c58f17cc887e73bcb90602327f8/protobuf-6.31.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:4ee898bf66f7a8b0bd21bce523814e6fbd8c6add948045ce958b73af7e8878c6", size = 321070, upload-time = "2025-05-28T19:25:50.036Z" }, + { url = "https://files.pythonhosted.org/packages/f7/af/ab3c51ab7507a7325e98ffe691d9495ee3d3aa5f589afad65ec920d39821/protobuf-6.31.1-py3-none-any.whl", hash = "sha256:720a6c7e6b77288b85063569baae8536671b39f15cc22037ec7045658d80489e", size = 168724, upload-time = "2025-05-28T19:25:53.926Z" }, ] [[package]] name = "psutil" version = "7.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003 } +sdist = { url = "https://files.pythonhosted.org/packages/2a/80/336820c1ad9286a4ded7e845b2eccfcb27851ab8ac6abece774a6ff4d3de/psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", size = 497003, upload-time = "2025-02-13T21:54:07.946Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051 }, - { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535 }, - { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004 }, - { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986 }, - { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544 }, - { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053 }, - { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885 }, + { url = "https://files.pythonhosted.org/packages/ed/e6/2d26234410f8b8abdbf891c9da62bee396583f713fb9f3325a4760875d22/psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", size = 238051, upload-time = "2025-02-13T21:54:12.36Z" }, + { url = "https://files.pythonhosted.org/packages/04/8b/30f930733afe425e3cbfc0e1468a30a18942350c1a8816acfade80c005c4/psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", size = 239535, upload-time = "2025-02-13T21:54:16.07Z" }, + { url = "https://files.pythonhosted.org/packages/2a/ed/d362e84620dd22876b55389248e522338ed1bf134a5edd3b8231d7207f6d/psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", size = 275004, upload-time = "2025-02-13T21:54:18.662Z" }, + { url = "https://files.pythonhosted.org/packages/bf/b9/b0eb3f3cbcb734d930fdf839431606844a825b23eaf9a6ab371edac8162c/psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", size = 277986, upload-time = "2025-02-13T21:54:21.811Z" }, + { url = "https://files.pythonhosted.org/packages/eb/a2/709e0fe2f093556c17fbafda93ac032257242cabcc7ff3369e2cb76a97aa/psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", size = 279544, upload-time = "2025-02-13T21:54:24.68Z" }, + { url = "https://files.pythonhosted.org/packages/50/e6/eecf58810b9d12e6427369784efe814a1eec0f492084ce8eb8f4d89d6d61/psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99", size = 241053, upload-time = "2025-02-13T21:54:34.31Z" }, + { url = "https://files.pythonhosted.org/packages/50/1b/6921afe68c74868b4c9fa424dad3be35b095e16687989ebbb50ce4fceb7c/psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", size = 244885, upload-time = "2025-02-13T21:54:37.486Z" }, ] [[package]] name = "ptyprocess" version = "0.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 }, + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, ] [[package]] name = "pure-eval" version = "0.2.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752 } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842 }, + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, ] [[package]] name = "pyasn1" version = "0.6.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322 } +sdist = { url = "https://files.pythonhosted.org/packages/ba/e9/01f1a64245b89f039897cb0130016d79f77d52669aae6ee7b159a6c4c018/pyasn1-0.6.1.tar.gz", hash = "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034", size = 145322, upload-time = "2024-09-10T22:41:42.55Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135 }, + { url = "https://files.pythonhosted.org/packages/c8/f1/d6a797abb14f6283c0ddff96bbdd46937f64122b8c925cab503dd37f8214/pyasn1-0.6.1-py3-none-any.whl", hash = "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", size = 83135, upload-time = "2024-09-11T16:00:36.122Z" }, ] [[package]] @@ -2393,18 +2408,18 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyasn1" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892 } +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259 }, + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, ] [[package]] name = "pycparser" version = "2.22" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736 } +sdist = { url = "https://files.pythonhosted.org/packages/1d/b2/31537cf4b1ca988837256c910a668b553fceb8f069bedc4b1c826024b52c/pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", size = 172736, upload-time = "2024-03-30T13:22:22.564Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552 }, + { url = "https://files.pythonhosted.org/packages/13/a3/a812df4e2dd5696d1f351d58b8fe16a405b234ad2886a0dab9183fb78109/pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc", size = 117552, upload-time = "2024-03-30T13:22:20.476Z" }, ] [[package]] @@ -2417,9 +2432,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350 } +sdist = { url = "https://files.pythonhosted.org/packages/00/dd/4325abf92c39ba8623b5af936ddb36ffcfe0beae70405d456ab1fb2f5b8c/pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db", size = 788350, upload-time = "2025-06-14T08:33:17.137Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782 }, + { url = "https://files.pythonhosted.org/packages/6a/c0/ec2b1c8712ca690e5d61979dee872603e92b8a32f94cc1b72d53beab008a/pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b", size = 444782, upload-time = "2025-06-14T08:33:14.905Z" }, ] [[package]] @@ -2429,62 +2444,62 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/8d/71db63483d518cbbf290261a1fc2839d17ff89fce7089e08cad07ccfce67/pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", size = 2028584 }, - { url = "https://files.pythonhosted.org/packages/24/2f/3cfa7244ae292dd850989f328722d2aef313f74ffc471184dc509e1e4e5a/pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", size = 1855071 }, - { url = "https://files.pythonhosted.org/packages/b3/d3/4ae42d33f5e3f50dd467761304be2fa0a9417fbf09735bc2cce003480f2a/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", size = 1897823 }, - { url = "https://files.pythonhosted.org/packages/f4/f3/aa5976e8352b7695ff808599794b1fba2a9ae2ee954a3426855935799488/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", size = 1983792 }, - { url = "https://files.pythonhosted.org/packages/d5/7a/cda9b5a23c552037717f2b2a5257e9b2bfe45e687386df9591eff7b46d28/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", size = 2136338 }, - { url = "https://files.pythonhosted.org/packages/2b/9f/b8f9ec8dd1417eb9da784e91e1667d58a2a4a7b7b34cf4af765ef663a7e5/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", size = 2730998 }, - { url = "https://files.pythonhosted.org/packages/47/bc/cd720e078576bdb8255d5032c5d63ee5c0bf4b7173dd955185a1d658c456/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", size = 2003200 }, - { url = "https://files.pythonhosted.org/packages/ca/22/3602b895ee2cd29d11a2b349372446ae9727c32e78a94b3d588a40fdf187/pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", size = 2113890 }, - { url = "https://files.pythonhosted.org/packages/ff/e6/e3c5908c03cf00d629eb38393a98fccc38ee0ce8ecce32f69fc7d7b558a7/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d", size = 2073359 }, - { url = "https://files.pythonhosted.org/packages/12/e7/6a36a07c59ebefc8777d1ffdaf5ae71b06b21952582e4b07eba88a421c79/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", size = 2245883 }, - { url = "https://files.pythonhosted.org/packages/16/3f/59b3187aaa6cc0c1e6616e8045b284de2b6a87b027cce2ffcea073adf1d2/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", size = 2241074 }, - { url = "https://files.pythonhosted.org/packages/e0/ed/55532bb88f674d5d8f67ab121a2a13c385df382de2a1677f30ad385f7438/pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", size = 1910538 }, - { url = "https://files.pythonhosted.org/packages/fe/1b/25b7cccd4519c0b23c2dd636ad39d381abf113085ce4f7bec2b0dc755eb1/pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", size = 1952909 }, - { url = "https://files.pythonhosted.org/packages/49/a9/d809358e49126438055884c4366a1f6227f0f84f635a9014e2deb9b9de54/pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", size = 1897786 }, - { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000 }, - { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996 }, - { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957 }, - { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199 }, - { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296 }, - { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109 }, - { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028 }, - { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044 }, - { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881 }, - { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034 }, - { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187 }, - { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628 }, - { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866 }, - { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894 }, - { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688 }, - { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808 }, - { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580 }, - { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859 }, - { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810 }, - { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498 }, - { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611 }, - { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924 }, - { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196 }, - { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389 }, - { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223 }, - { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473 }, - { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269 }, - { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921 }, - { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162 }, - { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560 }, - { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777 }, - { url = "https://files.pythonhosted.org/packages/7b/27/d4ae6487d73948d6f20dddcd94be4ea43e74349b56eba82e9bdee2d7494c/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", size = 2025200 }, - { url = "https://files.pythonhosted.org/packages/f1/b8/b3cb95375f05d33801024079b9392a5ab45267a63400bf1866e7ce0f0de4/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", size = 1859123 }, - { url = "https://files.pythonhosted.org/packages/05/bc/0d0b5adeda59a261cd30a1235a445bf55c7e46ae44aea28f7bd6ed46e091/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", size = 1892852 }, - { url = "https://files.pythonhosted.org/packages/3e/11/d37bdebbda2e449cb3f519f6ce950927b56d62f0b84fd9cb9e372a26a3d5/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", size = 2067484 }, - { url = "https://files.pythonhosted.org/packages/8c/55/1f95f0a05ce72ecb02a8a8a1c3be0579bbc29b1d5ab68f1378b7bebc5057/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", size = 2108896 }, - { url = "https://files.pythonhosted.org/packages/53/89/2b2de6c81fa131f423246a9109d7b2a375e83968ad0800d6e57d0574629b/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", size = 2069475 }, - { url = "https://files.pythonhosted.org/packages/b8/e9/1f7efbe20d0b2b10f6718944b5d8ece9152390904f29a78e68d4e7961159/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", size = 2239013 }, - { url = "https://files.pythonhosted.org/packages/3c/b2/5309c905a93811524a49b4e031e9851a6b00ff0fb668794472ea7746b448/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", size = 2238715 }, - { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757 }, +sdist = { url = "https://files.pythonhosted.org/packages/ad/88/5f2260bdfae97aabf98f1778d43f69574390ad787afb646292a638c923d4/pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", size = 435195, upload-time = "2025-04-23T18:33:52.104Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/8d/71db63483d518cbbf290261a1fc2839d17ff89fce7089e08cad07ccfce67/pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", size = 2028584, upload-time = "2025-04-23T18:31:03.106Z" }, + { url = "https://files.pythonhosted.org/packages/24/2f/3cfa7244ae292dd850989f328722d2aef313f74ffc471184dc509e1e4e5a/pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", size = 1855071, upload-time = "2025-04-23T18:31:04.621Z" }, + { url = "https://files.pythonhosted.org/packages/b3/d3/4ae42d33f5e3f50dd467761304be2fa0a9417fbf09735bc2cce003480f2a/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", size = 1897823, upload-time = "2025-04-23T18:31:06.377Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f3/aa5976e8352b7695ff808599794b1fba2a9ae2ee954a3426855935799488/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", size = 1983792, upload-time = "2025-04-23T18:31:07.93Z" }, + { url = "https://files.pythonhosted.org/packages/d5/7a/cda9b5a23c552037717f2b2a5257e9b2bfe45e687386df9591eff7b46d28/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", size = 2136338, upload-time = "2025-04-23T18:31:09.283Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/b8f9ec8dd1417eb9da784e91e1667d58a2a4a7b7b34cf4af765ef663a7e5/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", size = 2730998, upload-time = "2025-04-23T18:31:11.7Z" }, + { url = "https://files.pythonhosted.org/packages/47/bc/cd720e078576bdb8255d5032c5d63ee5c0bf4b7173dd955185a1d658c456/pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", size = 2003200, upload-time = "2025-04-23T18:31:13.536Z" }, + { url = "https://files.pythonhosted.org/packages/ca/22/3602b895ee2cd29d11a2b349372446ae9727c32e78a94b3d588a40fdf187/pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", size = 2113890, upload-time = "2025-04-23T18:31:15.011Z" }, + { url = "https://files.pythonhosted.org/packages/ff/e6/e3c5908c03cf00d629eb38393a98fccc38ee0ce8ecce32f69fc7d7b558a7/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d", size = 2073359, upload-time = "2025-04-23T18:31:16.393Z" }, + { url = "https://files.pythonhosted.org/packages/12/e7/6a36a07c59ebefc8777d1ffdaf5ae71b06b21952582e4b07eba88a421c79/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", size = 2245883, upload-time = "2025-04-23T18:31:17.892Z" }, + { url = "https://files.pythonhosted.org/packages/16/3f/59b3187aaa6cc0c1e6616e8045b284de2b6a87b027cce2ffcea073adf1d2/pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", size = 2241074, upload-time = "2025-04-23T18:31:19.205Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ed/55532bb88f674d5d8f67ab121a2a13c385df382de2a1677f30ad385f7438/pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", size = 1910538, upload-time = "2025-04-23T18:31:20.541Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1b/25b7cccd4519c0b23c2dd636ad39d381abf113085ce4f7bec2b0dc755eb1/pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", size = 1952909, upload-time = "2025-04-23T18:31:22.371Z" }, + { url = "https://files.pythonhosted.org/packages/49/a9/d809358e49126438055884c4366a1f6227f0f84f635a9014e2deb9b9de54/pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", size = 1897786, upload-time = "2025-04-23T18:31:24.161Z" }, + { url = "https://files.pythonhosted.org/packages/18/8a/2b41c97f554ec8c71f2a8a5f85cb56a8b0956addfe8b0efb5b3d77e8bdc3/pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", size = 2009000, upload-time = "2025-04-23T18:31:25.863Z" }, + { url = "https://files.pythonhosted.org/packages/a1/02/6224312aacb3c8ecbaa959897af57181fb6cf3a3d7917fd44d0f2917e6f2/pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", size = 1847996, upload-time = "2025-04-23T18:31:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/d6/46/6dcdf084a523dbe0a0be59d054734b86a981726f221f4562aed313dbcb49/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", size = 1880957, upload-time = "2025-04-23T18:31:28.956Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6b/1ec2c03837ac00886ba8160ce041ce4e325b41d06a034adbef11339ae422/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", size = 1964199, upload-time = "2025-04-23T18:31:31.025Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1d/6bf34d6adb9debd9136bd197ca72642203ce9aaaa85cfcbfcf20f9696e83/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", size = 2120296, upload-time = "2025-04-23T18:31:32.514Z" }, + { url = "https://files.pythonhosted.org/packages/e0/94/2bd0aaf5a591e974b32a9f7123f16637776c304471a0ab33cf263cf5591a/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", size = 2676109, upload-time = "2025-04-23T18:31:33.958Z" }, + { url = "https://files.pythonhosted.org/packages/f9/41/4b043778cf9c4285d59742281a769eac371b9e47e35f98ad321349cc5d61/pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", size = 2002028, upload-time = "2025-04-23T18:31:39.095Z" }, + { url = "https://files.pythonhosted.org/packages/cb/d5/7bb781bf2748ce3d03af04d5c969fa1308880e1dca35a9bd94e1a96a922e/pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", size = 2100044, upload-time = "2025-04-23T18:31:41.034Z" }, + { url = "https://files.pythonhosted.org/packages/fe/36/def5e53e1eb0ad896785702a5bbfd25eed546cdcf4087ad285021a90ed53/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", size = 2058881, upload-time = "2025-04-23T18:31:42.757Z" }, + { url = "https://files.pythonhosted.org/packages/01/6c/57f8d70b2ee57fc3dc8b9610315949837fa8c11d86927b9bb044f8705419/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", size = 2227034, upload-time = "2025-04-23T18:31:44.304Z" }, + { url = "https://files.pythonhosted.org/packages/27/b9/9c17f0396a82b3d5cbea4c24d742083422639e7bb1d5bf600e12cb176a13/pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", size = 2234187, upload-time = "2025-04-23T18:31:45.891Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6a/adf5734ffd52bf86d865093ad70b2ce543415e0e356f6cacabbc0d9ad910/pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", size = 1892628, upload-time = "2025-04-23T18:31:47.819Z" }, + { url = "https://files.pythonhosted.org/packages/43/e4/5479fecb3606c1368d496a825d8411e126133c41224c1e7238be58b87d7e/pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", size = 1955866, upload-time = "2025-04-23T18:31:49.635Z" }, + { url = "https://files.pythonhosted.org/packages/0d/24/8b11e8b3e2be9dd82df4b11408a67c61bb4dc4f8e11b5b0fc888b38118b5/pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", size = 1888894, upload-time = "2025-04-23T18:31:51.609Z" }, + { url = "https://files.pythonhosted.org/packages/46/8c/99040727b41f56616573a28771b1bfa08a3d3fe74d3d513f01251f79f172/pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", size = 2015688, upload-time = "2025-04-23T18:31:53.175Z" }, + { url = "https://files.pythonhosted.org/packages/3a/cc/5999d1eb705a6cefc31f0b4a90e9f7fc400539b1a1030529700cc1b51838/pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", size = 1844808, upload-time = "2025-04-23T18:31:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/6f/5e/a0a7b8885c98889a18b6e376f344da1ef323d270b44edf8174d6bce4d622/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", size = 1885580, upload-time = "2025-04-23T18:31:57.393Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2a/953581f343c7d11a304581156618c3f592435523dd9d79865903272c256a/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", size = 1973859, upload-time = "2025-04-23T18:31:59.065Z" }, + { url = "https://files.pythonhosted.org/packages/e6/55/f1a813904771c03a3f97f676c62cca0c0a4138654107c1b61f19c644868b/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", size = 2120810, upload-time = "2025-04-23T18:32:00.78Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/053389835a996e18853ba107a63caae0b9deb4a276c6b472931ea9ae6e48/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", size = 2676498, upload-time = "2025-04-23T18:32:02.418Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3c/f4abd740877a35abade05e437245b192f9d0ffb48bbbbd708df33d3cda37/pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", size = 2000611, upload-time = "2025-04-23T18:32:04.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/a7/63ef2fed1837d1121a894d0ce88439fe3e3b3e48c7543b2a4479eb99c2bd/pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", size = 2107924, upload-time = "2025-04-23T18:32:06.129Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/2551964ef045669801675f1cfc3b0d74147f4901c3ffa42be2ddb1f0efc4/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", size = 2063196, upload-time = "2025-04-23T18:32:08.178Z" }, + { url = "https://files.pythonhosted.org/packages/26/bd/d9602777e77fc6dbb0c7db9ad356e9a985825547dce5ad1d30ee04903918/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", size = 2236389, upload-time = "2025-04-23T18:32:10.242Z" }, + { url = "https://files.pythonhosted.org/packages/42/db/0e950daa7e2230423ab342ae918a794964b053bec24ba8af013fc7c94846/pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", size = 2239223, upload-time = "2025-04-23T18:32:12.382Z" }, + { url = "https://files.pythonhosted.org/packages/58/4d/4f937099c545a8a17eb52cb67fe0447fd9a373b348ccfa9a87f141eeb00f/pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", size = 1900473, upload-time = "2025-04-23T18:32:14.034Z" }, + { url = "https://files.pythonhosted.org/packages/a0/75/4a0a9bac998d78d889def5e4ef2b065acba8cae8c93696906c3a91f310ca/pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", size = 1955269, upload-time = "2025-04-23T18:32:15.783Z" }, + { url = "https://files.pythonhosted.org/packages/f9/86/1beda0576969592f1497b4ce8e7bc8cbdf614c352426271b1b10d5f0aa64/pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", size = 1893921, upload-time = "2025-04-23T18:32:18.473Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7d/e09391c2eebeab681df2b74bfe6c43422fffede8dc74187b2b0bf6fd7571/pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", size = 1806162, upload-time = "2025-04-23T18:32:20.188Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3d/847b6b1fed9f8ed3bb95a9ad04fbd0b212e832d4f0f50ff4d9ee5a9f15cf/pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", size = 1981560, upload-time = "2025-04-23T18:32:22.354Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9a/e73262f6c6656262b5fdd723ad90f518f579b7bc8622e43a942eec53c938/pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", size = 1935777, upload-time = "2025-04-23T18:32:25.088Z" }, + { url = "https://files.pythonhosted.org/packages/7b/27/d4ae6487d73948d6f20dddcd94be4ea43e74349b56eba82e9bdee2d7494c/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", size = 2025200, upload-time = "2025-04-23T18:33:14.199Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b8/b3cb95375f05d33801024079b9392a5ab45267a63400bf1866e7ce0f0de4/pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", size = 1859123, upload-time = "2025-04-23T18:33:16.555Z" }, + { url = "https://files.pythonhosted.org/packages/05/bc/0d0b5adeda59a261cd30a1235a445bf55c7e46ae44aea28f7bd6ed46e091/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", size = 1892852, upload-time = "2025-04-23T18:33:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/3e/11/d37bdebbda2e449cb3f519f6ce950927b56d62f0b84fd9cb9e372a26a3d5/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", size = 2067484, upload-time = "2025-04-23T18:33:20.475Z" }, + { url = "https://files.pythonhosted.org/packages/8c/55/1f95f0a05ce72ecb02a8a8a1c3be0579bbc29b1d5ab68f1378b7bebc5057/pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", size = 2108896, upload-time = "2025-04-23T18:33:22.501Z" }, + { url = "https://files.pythonhosted.org/packages/53/89/2b2de6c81fa131f423246a9109d7b2a375e83968ad0800d6e57d0574629b/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", size = 2069475, upload-time = "2025-04-23T18:33:24.528Z" }, + { url = "https://files.pythonhosted.org/packages/b8/e9/1f7efbe20d0b2b10f6718944b5d8ece9152390904f29a78e68d4e7961159/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", size = 2239013, upload-time = "2025-04-23T18:33:26.621Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/5309c905a93811524a49b4e031e9851a6b00ff0fb668794472ea7746b448/pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", size = 2238715, upload-time = "2025-04-23T18:33:28.656Z" }, + { url = "https://files.pythonhosted.org/packages/32/56/8a7ca5d2cd2cda1d245d34b1c9a942920a718082ae8e54e5f3e5a58b7add/pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", size = 2066757, upload-time = "2025-04-23T18:33:30.645Z" }, ] [[package]] @@ -2496,27 +2511,27 @@ dependencies = [ { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/68/85/1ea668bbab3c50071ca613c6ab30047fb36ab0da1b92fa8f17bbc38fd36c/pydantic_settings-2.10.1.tar.gz", hash = "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee", size = 172583 } +sdist = { url = "https://files.pythonhosted.org/packages/68/85/1ea668bbab3c50071ca613c6ab30047fb36ab0da1b92fa8f17bbc38fd36c/pydantic_settings-2.10.1.tar.gz", hash = "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee", size = 172583, upload-time = "2025-06-24T13:26:46.841Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/f0/427018098906416f580e3cf1366d3b1abfb408a0652e9f31600c24a1903c/pydantic_settings-2.10.1-py3-none-any.whl", hash = "sha256:a60952460b99cf661dc25c29c0ef171721f98bfcb52ef8d9ea4c943d7c8cc796", size = 45235 }, + { url = "https://files.pythonhosted.org/packages/58/f0/427018098906416f580e3cf1366d3b1abfb408a0652e9f31600c24a1903c/pydantic_settings-2.10.1-py3-none-any.whl", hash = "sha256:a60952460b99cf661dc25c29c0ef171721f98bfcb52ef8d9ea4c943d7c8cc796", size = 45235, upload-time = "2025-06-24T13:26:45.485Z" }, ] [[package]] name = "pygments" version = "2.19.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631 } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217 }, + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] [[package]] name = "pyjwt" version = "2.10.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785 } +sdist = { url = "https://files.pythonhosted.org/packages/e7/46/bd74733ff231675599650d3e47f361794b22ef3e3770998dda30d3b63726/pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953", size = 87785, upload-time = "2024-11-28T03:43:29.933Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997 }, + { url = "https://files.pythonhosted.org/packages/61/ad/689f02752eeec26aed679477e80e632ef1b682313be70793d798c1d5fc8f/PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb", size = 22997, upload-time = "2024-11-28T03:43:27.893Z" }, ] [package.optional-dependencies] @@ -2535,9 +2550,9 @@ dependencies = [ { name = "pluggy" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714 } +sdist = { url = "https://files.pythonhosted.org/packages/08/ba/45911d754e8eba3d5a841a5ce61a65a685ff1798421ac054f85aa8747dfb/pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c", size = 1517714, upload-time = "2025-06-18T05:48:06.109Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474 }, + { url = "https://files.pythonhosted.org/packages/29/16/c8a903f4c4dffe7a12843191437d7cd8e32751d5de349d45d3fe69544e87/pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7", size = 365474, upload-time = "2025-06-18T05:48:03.955Z" }, ] [[package]] @@ -2548,7 +2563,7 @@ dependencies = [ { name = "pytest" }, { name = "setuptools" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7e/3b/317cc04e77d707d338540ca67b619df8f247f3f4c9f40e67bf5ea503ad94/pytest-dependency-0.6.0.tar.gz", hash = "sha256:934b0e6a39d95995062c193f7eaeed8a8ffa06ff1bcef4b62b0dc74a708bacc1", size = 19499 } +sdist = { url = "https://files.pythonhosted.org/packages/7e/3b/317cc04e77d707d338540ca67b619df8f247f3f4c9f40e67bf5ea503ad94/pytest-dependency-0.6.0.tar.gz", hash = "sha256:934b0e6a39d95995062c193f7eaeed8a8ffa06ff1bcef4b62b0dc74a708bacc1", size = 19499, upload-time = "2023-12-31T20:38:54.991Z" } [[package]] name = "python-dateutil" @@ -2557,27 +2572,27 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] [[package]] name = "python-dotenv" version = "1.1.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978 } +sdist = { url = "https://files.pythonhosted.org/packages/f6/b0/4bc07ccd3572a2f9df7e6782f52b0c6c90dcbb803ac4a167702d7d0dfe1e/python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab", size = 41978, upload-time = "2025-06-24T04:21:07.341Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556 }, + { url = "https://files.pythonhosted.org/packages/5f/ed/539768cf28c661b5b068d66d96a2f155c4971a5d55684a514c1a0e0dec2f/python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc", size = 20556, upload-time = "2025-06-24T04:21:06.073Z" }, ] [[package]] name = "pytz" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884 } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, ] [[package]] @@ -2585,154 +2600,157 @@ name = "pywin32" version = "311" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031 }, - { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308 }, - { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930 }, - { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543 }, - { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040 }, - { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102 }, - { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700 }, - { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700 }, - { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318 }, + { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031, upload-time = "2025-07-14T20:13:13.266Z" }, + { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308, upload-time = "2025-07-14T20:13:15.147Z" }, + { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930, upload-time = "2025-07-14T20:13:16.945Z" }, + { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" }, + { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" }, + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, ] [[package]] name = "pyyaml" version = "6.0.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612 }, - { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040 }, - { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829 }, - { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167 }, - { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952 }, - { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301 }, - { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638 }, - { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850 }, - { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980 }, - { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873 }, - { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302 }, - { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154 }, - { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223 }, - { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542 }, - { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164 }, - { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611 }, - { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591 }, - { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338 }, - { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309 }, - { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679 }, - { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428 }, - { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361 }, - { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523 }, - { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660 }, - { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597 }, - { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527 }, - { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446 }, +sdist = { url = "https://files.pythonhosted.org/packages/54/ed/79a089b6be93607fa5cdaedf301d7dfb23af5f25c398d5ead2525b063e17/pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", size = 130631, upload-time = "2024-08-06T20:33:50.674Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/aa/7af4e81f7acba21a4c6be026da38fd2b872ca46226673c89a758ebdc4fd2/PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", size = 184612, upload-time = "2024-08-06T20:32:03.408Z" }, + { url = "https://files.pythonhosted.org/packages/8b/62/b9faa998fd185f65c1371643678e4d58254add437edb764a08c5a98fb986/PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", size = 172040, upload-time = "2024-08-06T20:32:04.926Z" }, + { url = "https://files.pythonhosted.org/packages/ad/0c/c804f5f922a9a6563bab712d8dcc70251e8af811fce4524d57c2c0fd49a4/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", size = 736829, upload-time = "2024-08-06T20:32:06.459Z" }, + { url = "https://files.pythonhosted.org/packages/51/16/6af8d6a6b210c8e54f1406a6b9481febf9c64a3109c541567e35a49aa2e7/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", size = 764167, upload-time = "2024-08-06T20:32:08.338Z" }, + { url = "https://files.pythonhosted.org/packages/75/e4/2c27590dfc9992f73aabbeb9241ae20220bd9452df27483b6e56d3975cc5/PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", size = 762952, upload-time = "2024-08-06T20:32:14.124Z" }, + { url = "https://files.pythonhosted.org/packages/9b/97/ecc1abf4a823f5ac61941a9c00fe501b02ac3ab0e373c3857f7d4b83e2b6/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4", size = 735301, upload-time = "2024-08-06T20:32:16.17Z" }, + { url = "https://files.pythonhosted.org/packages/45/73/0f49dacd6e82c9430e46f4a027baa4ca205e8b0a9dce1397f44edc23559d/PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", size = 756638, upload-time = "2024-08-06T20:32:18.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/5f/956f0f9fc65223a58fbc14459bf34b4cc48dec52e00535c79b8db361aabd/PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", size = 143850, upload-time = "2024-08-06T20:32:19.889Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/8da0bbe2ab9dcdd11f4f4557ccaf95c10b9811b13ecced089d43ce59c3c8/PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", size = 161980, upload-time = "2024-08-06T20:32:21.273Z" }, + { url = "https://files.pythonhosted.org/packages/86/0c/c581167fc46d6d6d7ddcfb8c843a4de25bdd27e4466938109ca68492292c/PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", size = 183873, upload-time = "2024-08-06T20:32:25.131Z" }, + { url = "https://files.pythonhosted.org/packages/a8/0c/38374f5bb272c051e2a69281d71cba6fdb983413e6758b84482905e29a5d/PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", size = 173302, upload-time = "2024-08-06T20:32:26.511Z" }, + { url = "https://files.pythonhosted.org/packages/c3/93/9916574aa8c00aa06bbac729972eb1071d002b8e158bd0e83a3b9a20a1f7/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", size = 739154, upload-time = "2024-08-06T20:32:28.363Z" }, + { url = "https://files.pythonhosted.org/packages/95/0f/b8938f1cbd09739c6da569d172531567dbcc9789e0029aa070856f123984/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", size = 766223, upload-time = "2024-08-06T20:32:30.058Z" }, + { url = "https://files.pythonhosted.org/packages/b9/2b/614b4752f2e127db5cc206abc23a8c19678e92b23c3db30fc86ab731d3bd/PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", size = 767542, upload-time = "2024-08-06T20:32:31.881Z" }, + { url = "https://files.pythonhosted.org/packages/d4/00/dd137d5bcc7efea1836d6264f049359861cf548469d18da90cd8216cf05f/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", size = 731164, upload-time = "2024-08-06T20:32:37.083Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/4f998c900485e5c0ef43838363ba4a9723ac0ad73a9dc42068b12aaba4e4/PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", size = 756611, upload-time = "2024-08-06T20:32:38.898Z" }, + { url = "https://files.pythonhosted.org/packages/df/d1/f5a275fdb252768b7a11ec63585bc38d0e87c9e05668a139fea92b80634c/PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", size = 140591, upload-time = "2024-08-06T20:32:40.241Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e8/4f648c598b17c3d06e8753d7d13d57542b30d56e6c2dedf9c331ae56312e/PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", size = 156338, upload-time = "2024-08-06T20:32:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/ef/e3/3af305b830494fa85d95f6d95ef7fa73f2ee1cc8ef5b495c7c3269fb835f/PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", size = 181309, upload-time = "2024-08-06T20:32:43.4Z" }, + { url = "https://files.pythonhosted.org/packages/45/9f/3b1c20a0b7a3200524eb0076cc027a970d320bd3a6592873c85c92a08731/PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", size = 171679, upload-time = "2024-08-06T20:32:44.801Z" }, + { url = "https://files.pythonhosted.org/packages/7c/9a/337322f27005c33bcb656c655fa78325b730324c78620e8328ae28b64d0c/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", size = 733428, upload-time = "2024-08-06T20:32:46.432Z" }, + { url = "https://files.pythonhosted.org/packages/a3/69/864fbe19e6c18ea3cc196cbe5d392175b4cf3d5d0ac1403ec3f2d237ebb5/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", size = 763361, upload-time = "2024-08-06T20:32:51.188Z" }, + { url = "https://files.pythonhosted.org/packages/04/24/b7721e4845c2f162d26f50521b825fb061bc0a5afcf9a386840f23ea19fa/PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", size = 759523, upload-time = "2024-08-06T20:32:53.019Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b2/e3234f59ba06559c6ff63c4e10baea10e5e7df868092bf9ab40e5b9c56b6/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", size = 726660, upload-time = "2024-08-06T20:32:54.708Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0f/25911a9f080464c59fab9027482f822b86bf0608957a5fcc6eaac85aa515/PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", size = 751597, upload-time = "2024-08-06T20:32:56.985Z" }, + { url = "https://files.pythonhosted.org/packages/14/0d/e2c3b43bbce3cf6bd97c840b46088a3031085179e596d4929729d8d68270/PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", size = 140527, upload-time = "2024-08-06T20:33:03.001Z" }, + { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, ] [[package]] name = "pyzmq" -version = "27.0.0" +version = "27.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "implementation_name == 'pypy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f1/06/50a4e9648b3e8b992bef8eb632e457307553a89d294103213cfd47b3da69/pyzmq-27.0.0.tar.gz", hash = "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf", size = 280478 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/44/df/84c630654106d9bd9339cdb564aa941ed41b023a0264251d6743766bb50e/pyzmq-27.0.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:21457825249b2a53834fa969c69713f8b5a79583689387a5e7aed880963ac564", size = 1332718 }, - { url = "https://files.pythonhosted.org/packages/c1/8e/f6a5461a07654d9840d256476434ae0ff08340bba562a455f231969772cb/pyzmq-27.0.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1958947983fef513e6e98eff9cb487b60bf14f588dc0e6bf35fa13751d2c8251", size = 908248 }, - { url = "https://files.pythonhosted.org/packages/7c/93/82863e8d695a9a3ae424b63662733ae204a295a2627d52af2f62c2cd8af9/pyzmq-27.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0dc628b5493f9a8cd9844b8bee9732ef587ab00002157c9329e4fc0ef4d3afa", size = 668647 }, - { url = "https://files.pythonhosted.org/packages/f3/85/15278769b348121eacdbfcbd8c4d40f1102f32fa6af5be1ffc032ed684be/pyzmq-27.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7bbe9e1ed2c8d3da736a15694d87c12493e54cc9dc9790796f0321794bbc91f", size = 856600 }, - { url = "https://files.pythonhosted.org/packages/d4/af/1c469b3d479bd095edb28e27f12eee10b8f00b356acbefa6aeb14dd295d1/pyzmq-27.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dc1091f59143b471d19eb64f54bae4f54bcf2a466ffb66fe45d94d8d734eb495", size = 1657748 }, - { url = "https://files.pythonhosted.org/packages/8c/f4/17f965d0ee6380b1d6326da842a50e4b8b9699745161207945f3745e8cb5/pyzmq-27.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7011ade88c8e535cf140f8d1a59428676fbbce7c6e54fefce58bf117aefb6667", size = 2034311 }, - { url = "https://files.pythonhosted.org/packages/e0/6e/7c391d81fa3149fd759de45d298003de6cfab343fb03e92c099821c448db/pyzmq-27.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c386339d7e3f064213aede5d03d054b237937fbca6dd2197ac8cf3b25a6b14e", size = 1893630 }, - { url = "https://files.pythonhosted.org/packages/0e/e0/eaffe7a86f60e556399e224229e7769b717f72fec0706b70ab2c03aa04cb/pyzmq-27.0.0-cp311-cp311-win32.whl", hash = "sha256:0546a720c1f407b2172cb04b6b094a78773491497e3644863cf5c96c42df8cff", size = 567706 }, - { url = "https://files.pythonhosted.org/packages/c9/05/89354a8cffdcce6e547d48adaaf7be17007fc75572123ff4ca90a4ca04fc/pyzmq-27.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:15f39d50bd6c9091c67315ceb878a4f531957b121d2a05ebd077eb35ddc5efed", size = 630322 }, - { url = "https://files.pythonhosted.org/packages/fa/07/4ab976d5e1e63976719389cc4f3bfd248a7f5f2bb2ebe727542363c61b5f/pyzmq-27.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c5817641eebb391a2268c27fecd4162448e03538387093cdbd8bf3510c316b38", size = 558435 }, - { url = "https://files.pythonhosted.org/packages/93/a7/9ad68f55b8834ede477842214feba6a4c786d936c022a67625497aacf61d/pyzmq-27.0.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:cbabc59dcfaac66655c040dfcb8118f133fb5dde185e5fc152628354c1598e52", size = 1305438 }, - { url = "https://files.pythonhosted.org/packages/ba/ee/26aa0f98665a22bc90ebe12dced1de5f3eaca05363b717f6fb229b3421b3/pyzmq-27.0.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cb0ac5179cba4b2f94f1aa208fbb77b62c4c9bf24dd446278b8b602cf85fcda3", size = 895095 }, - { url = "https://files.pythonhosted.org/packages/cf/85/c57e7ab216ecd8aa4cc7e3b83b06cc4e9cf45c87b0afc095f10cd5ce87c1/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53a48f0228eab6cbf69fde3aa3c03cbe04e50e623ef92ae395fce47ef8a76152", size = 651826 }, - { url = "https://files.pythonhosted.org/packages/69/9a/9ea7e230feda9400fb0ae0d61d7d6ddda635e718d941c44eeab22a179d34/pyzmq-27.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:111db5f395e09f7e775f759d598f43cb815fc58e0147623c4816486e1a39dc22", size = 839750 }, - { url = "https://files.pythonhosted.org/packages/08/66/4cebfbe71f3dfbd417011daca267539f62ed0fbc68105357b68bbb1a25b7/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c8878011653dcdc27cc2c57e04ff96f0471e797f5c19ac3d7813a245bcb24371", size = 1641357 }, - { url = "https://files.pythonhosted.org/packages/ac/f6/b0f62578c08d2471c791287149cb8c2aaea414ae98c6e995c7dbe008adfb/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:c0ed2c1f335ba55b5fdc964622254917d6b782311c50e138863eda409fbb3b6d", size = 2020281 }, - { url = "https://files.pythonhosted.org/packages/37/b9/4f670b15c7498495da9159edc374ec09c88a86d9cd5a47d892f69df23450/pyzmq-27.0.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e918d70862d4cfd4b1c187310015646a14e1f5917922ab45b29f28f345eeb6be", size = 1877110 }, - { url = "https://files.pythonhosted.org/packages/66/31/9dee25c226295b740609f0d46db2fe972b23b6f5cf786360980524a3ba92/pyzmq-27.0.0-cp312-abi3-win32.whl", hash = "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4", size = 559297 }, - { url = "https://files.pythonhosted.org/packages/9b/12/52da5509800f7ff2d287b2f2b4e636e7ea0f001181cba6964ff6c1537778/pyzmq-27.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371", size = 619203 }, - { url = "https://files.pythonhosted.org/packages/93/6d/7f2e53b19d1edb1eb4f09ec7c3a1f945ca0aac272099eab757d15699202b/pyzmq-27.0.0-cp312-abi3-win_arm64.whl", hash = "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e", size = 551927 }, - { url = "https://files.pythonhosted.org/packages/19/62/876b27c4ff777db4ceba1c69ea90d3c825bb4f8d5e7cd987ce5802e33c55/pyzmq-27.0.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c36ad534c0c29b4afa088dc53543c525b23c0797e01b69fef59b1a9c0e38b688", size = 1340826 }, - { url = "https://files.pythonhosted.org/packages/43/69/58ef8f4f59d3bcd505260c73bee87b008850f45edca40ddaba54273c35f4/pyzmq-27.0.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:67855c14173aec36395d7777aaba3cc527b393821f30143fd20b98e1ff31fd38", size = 897283 }, - { url = "https://files.pythonhosted.org/packages/43/15/93a0d0396700a60475ad3c5d42c5f1c308d3570bc94626b86c71ef9953e0/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8617c7d43cd8ccdb62aebe984bfed77ca8f036e6c3e46dd3dddda64b10f0ab7a", size = 660567 }, - { url = "https://files.pythonhosted.org/packages/0e/b3/fe055513e498ca32f64509abae19b9c9eb4d7c829e02bd8997dd51b029eb/pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:67bfbcbd0a04c575e8103a6061d03e393d9f80ffdb9beb3189261e9e9bc5d5e9", size = 847681 }, - { url = "https://files.pythonhosted.org/packages/b6/4f/ff15300b00b5b602191f3df06bbc8dd4164e805fdd65bb77ffbb9c5facdc/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5cd11d46d7b7e5958121b3eaf4cd8638eff3a720ec527692132f05a57f14341d", size = 1650148 }, - { url = "https://files.pythonhosted.org/packages/c4/6f/84bdfff2a224a6f26a24249a342e5906993c50b0761e311e81b39aef52a7/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:b801c2e40c5aa6072c2f4876de8dccd100af6d9918d4d0d7aa54a1d982fd4f44", size = 2023768 }, - { url = "https://files.pythonhosted.org/packages/64/39/dc2db178c26a42228c5ac94a9cc595030458aa64c8d796a7727947afbf55/pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:20d5cb29e8c5f76a127c75b6e7a77e846bc4b655c373baa098c26a61b7ecd0ef", size = 1885199 }, - { url = "https://files.pythonhosted.org/packages/c7/21/dae7b06a1f8cdee5d8e7a63d99c5d129c401acc40410bef2cbf42025e26f/pyzmq-27.0.0-cp313-cp313t-win32.whl", hash = "sha256:a20528da85c7ac7a19b7384e8c3f8fa707841fd85afc4ed56eda59d93e3d98ad", size = 575439 }, - { url = "https://files.pythonhosted.org/packages/eb/bc/1709dc55f0970cf4cb8259e435e6773f9946f41a045c2cb90e870b7072da/pyzmq-27.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d8229f2efece6a660ee211d74d91dbc2a76b95544d46c74c615e491900dc107f", size = 639933 }, - { url = "https://files.pythonhosted.org/packages/98/a6/92394373b8dbc1edc9d53c951e8d3989d518185174ee54492ec27711779d/pyzmq-27.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd1dc59763effd1576f8368047c9c31468fce0af89d76b5067641137506792ae", size = 835948 }, - { url = "https://files.pythonhosted.org/packages/56/f3/4dc38d75d9995bfc18773df3e41f2a2ca9b740b06f1a15dbf404077e7588/pyzmq-27.0.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:60e8cc82d968174650c1860d7b716366caab9973787a1c060cf8043130f7d0f7", size = 799874 }, - { url = "https://files.pythonhosted.org/packages/ab/ba/64af397e0f421453dc68e31d5e0784d554bf39013a2de0872056e96e58af/pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14fe7aaac86e4e93ea779a821967360c781d7ac5115b3f1a171ced77065a0174", size = 567400 }, - { url = "https://files.pythonhosted.org/packages/63/87/ec956cbe98809270b59a22891d5758edae147a258e658bf3024a8254c855/pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6ad0562d4e6abb785be3e4dd68599c41be821b521da38c402bc9ab2a8e7ebc7e", size = 747031 }, - { url = "https://files.pythonhosted.org/packages/be/8a/4a3764a68abc02e2fbb0668d225b6fda5cd39586dd099cee8b2ed6ab0452/pyzmq-27.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:9df43a2459cd3a3563404c1456b2c4c69564daa7dbaf15724c09821a3329ce46", size = 544726 }, +sdist = { url = "https://files.pythonhosted.org/packages/30/5f/557d2032a2f471edbcc227da724c24a1c05887b5cda1e3ae53af98b9e0a5/pyzmq-27.0.1.tar.gz", hash = "sha256:45c549204bc20e7484ffd2555f6cf02e572440ecf2f3bdd60d4404b20fddf64b", size = 281158, upload-time = "2025-08-03T05:05:40.352Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/18/a8e0da6ababbe9326116fb1c890bf1920eea880e8da621afb6bc0f39a262/pyzmq-27.0.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:9729190bd770314f5fbba42476abf6abe79a746eeda11d1d68fd56dd70e5c296", size = 1332721, upload-time = "2025-08-03T05:03:15.237Z" }, + { url = "https://files.pythonhosted.org/packages/75/a4/9431ba598651d60ebd50dc25755402b770322cf8432adcc07d2906e53a54/pyzmq-27.0.1-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:696900ef6bc20bef6a242973943574f96c3f97d2183c1bd3da5eea4f559631b1", size = 908249, upload-time = "2025-08-03T05:03:16.933Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/e624e1793689e4e685d2ee21c40277dd4024d9d730af20446d88f69be838/pyzmq-27.0.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f96a63aecec22d3f7fdea3c6c98df9e42973f5856bb6812c3d8d78c262fee808", size = 668649, upload-time = "2025-08-03T05:03:18.49Z" }, + { url = "https://files.pythonhosted.org/packages/6c/29/0652a39d4e876e0d61379047ecf7752685414ad2e253434348246f7a2a39/pyzmq-27.0.1-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c512824360ea7490390566ce00bee880e19b526b312b25cc0bc30a0fe95cb67f", size = 856601, upload-time = "2025-08-03T05:03:20.194Z" }, + { url = "https://files.pythonhosted.org/packages/36/2d/8d5355d7fc55bb6e9c581dd74f58b64fa78c994079e3a0ea09b1b5627cde/pyzmq-27.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dfb2bb5e0f7198eaacfb6796fb0330afd28f36d985a770745fba554a5903595a", size = 1657750, upload-time = "2025-08-03T05:03:22.055Z" }, + { url = "https://files.pythonhosted.org/packages/ab/f4/cd032352d5d252dc6f5ee272a34b59718ba3af1639a8a4ef4654f9535cf5/pyzmq-27.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4f6886c59ba93ffde09b957d3e857e7950c8fe818bd5494d9b4287bc6d5bc7f1", size = 2034312, upload-time = "2025-08-03T05:03:23.578Z" }, + { url = "https://files.pythonhosted.org/packages/e4/1a/c050d8b6597200e97a4bd29b93c769d002fa0b03083858227e0376ad59bc/pyzmq-27.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b99ea9d330e86ce1ff7f2456b33f1bf81c43862a5590faf4ef4ed3a63504bdab", size = 1893632, upload-time = "2025-08-03T05:03:25.167Z" }, + { url = "https://files.pythonhosted.org/packages/6a/29/173ce21d5097e7fcf284a090e8beb64fc683c6582b1f00fa52b1b7e867ce/pyzmq-27.0.1-cp311-cp311-win32.whl", hash = "sha256:571f762aed89025ba8cdcbe355fea56889715ec06d0264fd8b6a3f3fa38154ed", size = 566587, upload-time = "2025-08-03T05:03:26.769Z" }, + { url = "https://files.pythonhosted.org/packages/53/ab/22bd33e7086f0a2cc03a5adabff4bde414288bb62a21a7820951ef86ec20/pyzmq-27.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:ee16906c8025fa464bea1e48128c048d02359fb40bebe5333103228528506530", size = 632873, upload-time = "2025-08-03T05:03:28.685Z" }, + { url = "https://files.pythonhosted.org/packages/90/14/3e59b4a28194285ceeff725eba9aa5ba8568d1cb78aed381dec1537c705a/pyzmq-27.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:ba068f28028849da725ff9185c24f832ccf9207a40f9b28ac46ab7c04994bd41", size = 558918, upload-time = "2025-08-03T05:03:30.085Z" }, + { url = "https://files.pythonhosted.org/packages/0e/9b/c0957041067c7724b310f22c398be46399297c12ed834c3bc42200a2756f/pyzmq-27.0.1-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:af7ebce2a1e7caf30c0bb64a845f63a69e76a2fadbc1cac47178f7bb6e657bdd", size = 1305432, upload-time = "2025-08-03T05:03:32.177Z" }, + { url = "https://files.pythonhosted.org/packages/8e/55/bd3a312790858f16b7def3897a0c3eb1804e974711bf7b9dcb5f47e7f82c/pyzmq-27.0.1-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8f617f60a8b609a13099b313e7e525e67f84ef4524b6acad396d9ff153f6e4cd", size = 895095, upload-time = "2025-08-03T05:03:33.918Z" }, + { url = "https://files.pythonhosted.org/packages/20/50/fc384631d8282809fb1029a4460d2fe90fa0370a0e866a8318ed75c8d3bb/pyzmq-27.0.1-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d59dad4173dc2a111f03e59315c7bd6e73da1a9d20a84a25cf08325b0582b1a", size = 651826, upload-time = "2025-08-03T05:03:35.818Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0a/2356305c423a975000867de56888b79e44ec2192c690ff93c3109fd78081/pyzmq-27.0.1-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f5b6133c8d313bde8bd0d123c169d22525300ff164c2189f849de495e1344577", size = 839751, upload-time = "2025-08-03T05:03:37.265Z" }, + { url = "https://files.pythonhosted.org/packages/d7/1b/81e95ad256ca7e7ccd47f5294c1c6da6e2b64fbace65b84fe8a41470342e/pyzmq-27.0.1-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:58cca552567423f04d06a075f4b473e78ab5bdb906febe56bf4797633f54aa4e", size = 1641359, upload-time = "2025-08-03T05:03:38.799Z" }, + { url = "https://files.pythonhosted.org/packages/50/63/9f50ec965285f4e92c265c8f18344e46b12803666d8b73b65d254d441435/pyzmq-27.0.1-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:4b9d8e26fb600d0d69cc9933e20af08552e97cc868a183d38a5c0d661e40dfbb", size = 2020281, upload-time = "2025-08-03T05:03:40.338Z" }, + { url = "https://files.pythonhosted.org/packages/02/4a/19e3398d0dc66ad2b463e4afa1fc541d697d7bc090305f9dfb948d3dfa29/pyzmq-27.0.1-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2329f0c87f0466dce45bba32b63f47018dda5ca40a0085cc5c8558fea7d9fc55", size = 1877112, upload-time = "2025-08-03T05:03:42.012Z" }, + { url = "https://files.pythonhosted.org/packages/bf/42/c562e9151aa90ed1d70aac381ea22a929d6b3a2ce4e1d6e2e135d34fd9c6/pyzmq-27.0.1-cp312-abi3-win32.whl", hash = "sha256:57bb92abdb48467b89c2d21da1ab01a07d0745e536d62afd2e30d5acbd0092eb", size = 558177, upload-time = "2025-08-03T05:03:43.979Z" }, + { url = "https://files.pythonhosted.org/packages/40/96/5c50a7d2d2b05b19994bf7336b97db254299353dd9b49b565bb71b485f03/pyzmq-27.0.1-cp312-abi3-win_amd64.whl", hash = "sha256:ff3f8757570e45da7a5bedaa140489846510014f7a9d5ee9301c61f3f1b8a686", size = 618923, upload-time = "2025-08-03T05:03:45.438Z" }, + { url = "https://files.pythonhosted.org/packages/13/33/1ec89c8f21c89d21a2eaff7def3676e21d8248d2675705e72554fb5a6f3f/pyzmq-27.0.1-cp312-abi3-win_arm64.whl", hash = "sha256:df2c55c958d3766bdb3e9d858b911288acec09a9aab15883f384fc7180df5bed", size = 552358, upload-time = "2025-08-03T05:03:46.887Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a0/f26e276211ec8090a4d11e4ec70eb8a8b15781e591c1d44ce62f372963a0/pyzmq-27.0.1-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:497bd8af534ae55dc4ef67eebd1c149ff2a0b0f1e146db73c8b5a53d83c1a5f5", size = 1122287, upload-time = "2025-08-03T05:03:48.838Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d8/af4b507e4f7eeea478cc8ee873995a6fd55582bfb99140593ed460e1db3c/pyzmq-27.0.1-cp313-cp313-android_24_x86_64.whl", hash = "sha256:a066ea6ad6218b4c233906adf0ae67830f451ed238419c0db609310dd781fbe7", size = 1155756, upload-time = "2025-08-03T05:03:50.907Z" }, + { url = "https://files.pythonhosted.org/packages/ac/55/37fae0013e11f88681da42698e550b08a316d608242551f65095cc99232a/pyzmq-27.0.1-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:72d235d6365ca73d8ce92f7425065d70f5c1e19baa458eb3f0d570e425b73a96", size = 1340826, upload-time = "2025-08-03T05:03:52.568Z" }, + { url = "https://files.pythonhosted.org/packages/f2/e4/3a87854c64b26fcf63a9d1b6f4382bd727d4797c772ceb334a97b7489be9/pyzmq-27.0.1-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:313a7b374e3dc64848644ca348a51004b41726f768b02e17e689f1322366a4d9", size = 897283, upload-time = "2025-08-03T05:03:54.167Z" }, + { url = "https://files.pythonhosted.org/packages/17/3e/4296c6b0ad2d07be11ae1395dccf9cae48a0a655cf9be1c3733ad2b591d1/pyzmq-27.0.1-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:119ce8590409702394f959c159d048002cbed2f3c0645ec9d6a88087fc70f0f1", size = 660565, upload-time = "2025-08-03T05:03:56.152Z" }, + { url = "https://files.pythonhosted.org/packages/72/41/a33ba3aa48b45b23c4cd4ac49aafde46f3e0f81939f2bfb3b6171a437122/pyzmq-27.0.1-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:45c3e00ce16896ace2cd770ab9057a7cf97d4613ea5f2a13f815141d8b6894b9", size = 847680, upload-time = "2025-08-03T05:03:57.696Z" }, + { url = "https://files.pythonhosted.org/packages/3f/8c/bf2350bb25b3b58d2e5b5d2290ffab0e923f0cc6d02288d3fbf4baa6e4d1/pyzmq-27.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:678e50ec112bdc6df5a83ac259a55a4ba97a8b314c325ab26b3b5b071151bc61", size = 1650151, upload-time = "2025-08-03T05:03:59.387Z" }, + { url = "https://files.pythonhosted.org/packages/f7/1a/a5a07c54890891344a8ddc3d5ab320dd3c4e39febb6e4472546e456d5157/pyzmq-27.0.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:d0b96c30be9f9387b18b18b6133c75a7b1b0065da64e150fe1feb5ebf31ece1c", size = 2023766, upload-time = "2025-08-03T05:04:01.883Z" }, + { url = "https://files.pythonhosted.org/packages/62/5e/514dcff08f02c6c8a45a6e23621901139cf853be7ac5ccd0b9407c3aa3de/pyzmq-27.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:88dc92d9eb5ea4968123e74db146d770b0c8d48f0e2bfb1dbc6c50a8edb12d64", size = 1885195, upload-time = "2025-08-03T05:04:03.923Z" }, + { url = "https://files.pythonhosted.org/packages/c8/91/87f74f98a487fbef0b115f6025e4a295129fd56b2b633a03ba7d5816ecc2/pyzmq-27.0.1-cp313-cp313t-win32.whl", hash = "sha256:6dcbcb34f5c9b0cefdfc71ff745459241b7d3cda5b27c7ad69d45afc0821d1e1", size = 574213, upload-time = "2025-08-03T05:04:05.905Z" }, + { url = "https://files.pythonhosted.org/packages/e6/d7/07f7d0d7f4c81e08be7b60e52ff2591c557377c017f96204d33d5fca1b07/pyzmq-27.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9fd0fda730461f510cfd9a40fafa5355d65f5e3dbdd8d6dfa342b5b3f5d1949", size = 640202, upload-time = "2025-08-03T05:04:07.439Z" }, + { url = "https://files.pythonhosted.org/packages/ab/83/21d66bcef6fb803647a223cbde95111b099e2176277c0cbc8b099c485510/pyzmq-27.0.1-cp313-cp313t-win_arm64.whl", hash = "sha256:56a3b1853f3954ec1f0e91085f1350cc57d18f11205e4ab6e83e4b7c414120e0", size = 561514, upload-time = "2025-08-03T05:04:09.071Z" }, + { url = "https://files.pythonhosted.org/packages/b4/1a/49f66fe0bc2b2568dd4280f1f520ac8fafd73f8d762140e278d48aeaf7b9/pyzmq-27.0.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7fb0ee35845bef1e8c4a152d766242164e138c239e3182f558ae15cb4a891f94", size = 835949, upload-time = "2025-08-03T05:05:13.798Z" }, + { url = "https://files.pythonhosted.org/packages/49/94/443c1984b397eab59b14dd7ae8bc2ac7e8f32dbc646474453afcaa6508c4/pyzmq-27.0.1-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f379f11e138dfd56c3f24a04164f871a08281194dd9ddf656a278d7d080c8ad0", size = 799875, upload-time = "2025-08-03T05:05:15.632Z" }, + { url = "https://files.pythonhosted.org/packages/30/f1/fd96138a0f152786a2ba517e9c6a8b1b3516719e412a90bb5d8eea6b660c/pyzmq-27.0.1-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b978c0678cffbe8860ec9edc91200e895c29ae1ac8a7085f947f8e8864c489fb", size = 567403, upload-time = "2025-08-03T05:05:17.326Z" }, + { url = "https://files.pythonhosted.org/packages/16/57/34e53ef2b55b1428dac5aabe3a974a16c8bda3bf20549ba500e3ff6cb426/pyzmq-27.0.1-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ebccf0d760bc92a4a7c751aeb2fef6626144aace76ee8f5a63abeb100cae87f", size = 747032, upload-time = "2025-08-03T05:05:19.074Z" }, + { url = "https://files.pythonhosted.org/packages/81/b7/769598c5ae336fdb657946950465569cf18803140fe89ce466d7f0a57c11/pyzmq-27.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:77fed80e30fa65708546c4119840a46691290efc231f6bfb2ac2a39b52e15811", size = 544566, upload-time = "2025-08-03T05:05:20.798Z" }, ] [[package]] name = "rapidfuzz" version = "3.13.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/6895abc3a3d056b9698da3199b04c0e56226d530ae44a470edabf8b664f0/rapidfuzz-3.13.0.tar.gz", hash = "sha256:d2eaf3839e52cbcc0accbe9817a67b4b0fcf70aaeb229cfddc1c28061f9ce5d8", size = 57904226 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/87/17/9be9eff5a3c7dfc831c2511262082c6786dca2ce21aa8194eef1cb71d67a/rapidfuzz-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d395a5cad0c09c7f096433e5fd4224d83b53298d53499945a9b0e5a971a84f3a", size = 1999453 }, - { url = "https://files.pythonhosted.org/packages/75/67/62e57896ecbabe363f027d24cc769d55dd49019e576533ec10e492fcd8a2/rapidfuzz-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7b3eda607a019169f7187328a8d1648fb9a90265087f6903d7ee3a8eee01805", size = 1450881 }, - { url = "https://files.pythonhosted.org/packages/96/5c/691c5304857f3476a7b3df99e91efc32428cbe7d25d234e967cc08346c13/rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98e0bfa602e1942d542de077baf15d658bd9d5dcfe9b762aff791724c1c38b70", size = 1422990 }, - { url = "https://files.pythonhosted.org/packages/46/81/7a7e78f977496ee2d613154b86b203d373376bcaae5de7bde92f3ad5a192/rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bef86df6d59667d9655905b02770a0c776d2853971c0773767d5ef8077acd624", size = 5342309 }, - { url = "https://files.pythonhosted.org/packages/51/44/12fdd12a76b190fe94bf38d252bb28ddf0ab7a366b943e792803502901a2/rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fedd316c165beed6307bf754dee54d3faca2c47e1f3bcbd67595001dfa11e969", size = 1656881 }, - { url = "https://files.pythonhosted.org/packages/27/ae/0d933e660c06fcfb087a0d2492f98322f9348a28b2cc3791a5dbadf6e6fb/rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5158da7f2ec02a930be13bac53bb5903527c073c90ee37804090614cab83c29e", size = 1608494 }, - { url = "https://files.pythonhosted.org/packages/3d/2c/4b2f8aafdf9400e5599b6ed2f14bc26ca75f5a923571926ccbc998d4246a/rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b6f913ee4618ddb6d6f3e387b76e8ec2fc5efee313a128809fbd44e65c2bbb2", size = 3072160 }, - { url = "https://files.pythonhosted.org/packages/60/7d/030d68d9a653c301114101c3003b31ce01cf2c3224034cd26105224cd249/rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d25fdbce6459ccbbbf23b4b044f56fbd1158b97ac50994eaae2a1c0baae78301", size = 2491549 }, - { url = "https://files.pythonhosted.org/packages/8e/cd/7040ba538fc6a8ddc8816a05ecf46af9988b46c148ddd7f74fb0fb73d012/rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25343ccc589a4579fbde832e6a1e27258bfdd7f2eb0f28cb836d6694ab8591fc", size = 7584142 }, - { url = "https://files.pythonhosted.org/packages/c1/96/85f7536fbceb0aa92c04a1c37a3fc4fcd4e80649e9ed0fb585382df82edc/rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a9ad1f37894e3ffb76bbab76256e8a8b789657183870be11aa64e306bb5228fd", size = 2896234 }, - { url = "https://files.pythonhosted.org/packages/55/fd/460e78438e7019f2462fe9d4ecc880577ba340df7974c8a4cfe8d8d029df/rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5dc71ef23845bb6b62d194c39a97bb30ff171389c9812d83030c1199f319098c", size = 3437420 }, - { url = "https://files.pythonhosted.org/packages/cc/df/c3c308a106a0993befd140a414c5ea78789d201cf1dfffb8fd9749718d4f/rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b7f4c65facdb94f44be759bbd9b6dda1fa54d0d6169cdf1a209a5ab97d311a75", size = 4410860 }, - { url = "https://files.pythonhosted.org/packages/75/ee/9d4ece247f9b26936cdeaae600e494af587ce9bf8ddc47d88435f05cfd05/rapidfuzz-3.13.0-cp311-cp311-win32.whl", hash = "sha256:b5104b62711565e0ff6deab2a8f5dbf1fbe333c5155abe26d2cfd6f1849b6c87", size = 1843161 }, - { url = "https://files.pythonhosted.org/packages/c9/5a/d00e1f63564050a20279015acb29ecaf41646adfacc6ce2e1e450f7f2633/rapidfuzz-3.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:9093cdeb926deb32a4887ebe6910f57fbcdbc9fbfa52252c10b56ef2efb0289f", size = 1629962 }, - { url = "https://files.pythonhosted.org/packages/3b/74/0a3de18bc2576b794f41ccd07720b623e840fda219ab57091897f2320fdd/rapidfuzz-3.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:f70f646751b6aa9d05be1fb40372f006cc89d6aad54e9d79ae97bd1f5fce5203", size = 866631 }, - { url = "https://files.pythonhosted.org/packages/13/4b/a326f57a4efed8f5505b25102797a58e37ee11d94afd9d9422cb7c76117e/rapidfuzz-3.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a1a6a906ba62f2556372282b1ef37b26bca67e3d2ea957277cfcefc6275cca7", size = 1989501 }, - { url = "https://files.pythonhosted.org/packages/b7/53/1f7eb7ee83a06c400089ec7cb841cbd581c2edd7a4b21eb2f31030b88daa/rapidfuzz-3.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fd0975e015b05c79a97f38883a11236f5a24cca83aa992bd2558ceaa5652b26", size = 1445379 }, - { url = "https://files.pythonhosted.org/packages/07/09/de8069a4599cc8e6d194e5fa1782c561151dea7d5e2741767137e2a8c1f0/rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d4e13593d298c50c4f94ce453f757b4b398af3fa0fd2fde693c3e51195b7f69", size = 1405986 }, - { url = "https://files.pythonhosted.org/packages/5d/77/d9a90b39c16eca20d70fec4ca377fbe9ea4c0d358c6e4736ab0e0e78aaf6/rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed6f416bda1c9133000009d84d9409823eb2358df0950231cc936e4bf784eb97", size = 5310809 }, - { url = "https://files.pythonhosted.org/packages/1e/7d/14da291b0d0f22262d19522afaf63bccf39fc027c981233fb2137a57b71f/rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1dc82b6ed01acb536b94a43996a94471a218f4d89f3fdd9185ab496de4b2a981", size = 1629394 }, - { url = "https://files.pythonhosted.org/packages/b7/e4/79ed7e4fa58f37c0f8b7c0a62361f7089b221fe85738ae2dbcfb815e985a/rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9d824de871daa6e443b39ff495a884931970d567eb0dfa213d234337343835f", size = 1600544 }, - { url = "https://files.pythonhosted.org/packages/4e/20/e62b4d13ba851b0f36370060025de50a264d625f6b4c32899085ed51f980/rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d18228a2390375cf45726ce1af9d36ff3dc1f11dce9775eae1f1b13ac6ec50f", size = 3052796 }, - { url = "https://files.pythonhosted.org/packages/cd/8d/55fdf4387dec10aa177fe3df8dbb0d5022224d95f48664a21d6b62a5299d/rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f5fe634c9482ec5d4a6692afb8c45d370ae86755e5f57aa6c50bfe4ca2bdd87", size = 2464016 }, - { url = "https://files.pythonhosted.org/packages/9b/be/0872f6a56c0f473165d3b47d4170fa75263dc5f46985755aa9bf2bbcdea1/rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:694eb531889f71022b2be86f625a4209c4049e74be9ca836919b9e395d5e33b3", size = 7556725 }, - { url = "https://files.pythonhosted.org/packages/5d/f3/6c0750e484d885a14840c7a150926f425d524982aca989cdda0bb3bdfa57/rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:11b47b40650e06147dee5e51a9c9ad73bb7b86968b6f7d30e503b9f8dd1292db", size = 2859052 }, - { url = "https://files.pythonhosted.org/packages/6f/98/5a3a14701b5eb330f444f7883c9840b43fb29c575e292e09c90a270a6e07/rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:98b8107ff14f5af0243f27d236bcc6e1ef8e7e3b3c25df114e91e3a99572da73", size = 3390219 }, - { url = "https://files.pythonhosted.org/packages/e9/7d/f4642eaaeb474b19974332f2a58471803448be843033e5740965775760a5/rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b836f486dba0aceb2551e838ff3f514a38ee72b015364f739e526d720fdb823a", size = 4377924 }, - { url = "https://files.pythonhosted.org/packages/8e/83/fa33f61796731891c3e045d0cbca4436a5c436a170e7f04d42c2423652c3/rapidfuzz-3.13.0-cp312-cp312-win32.whl", hash = "sha256:4671ee300d1818d7bdfd8fa0608580d7778ba701817216f0c17fb29e6b972514", size = 1823915 }, - { url = "https://files.pythonhosted.org/packages/03/25/5ee7ab6841ca668567d0897905eebc79c76f6297b73bf05957be887e9c74/rapidfuzz-3.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e2065f68fb1d0bf65adc289c1bdc45ba7e464e406b319d67bb54441a1b9da9e", size = 1616985 }, - { url = "https://files.pythonhosted.org/packages/76/5e/3f0fb88db396cb692aefd631e4805854e02120a2382723b90dcae720bcc6/rapidfuzz-3.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:65cc97c2fc2c2fe23586599686f3b1ceeedeca8e598cfcc1b7e56dc8ca7e2aa7", size = 860116 }, - { url = "https://files.pythonhosted.org/packages/0a/76/606e71e4227790750f1646f3c5c873e18d6cfeb6f9a77b2b8c4dec8f0f66/rapidfuzz-3.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:09e908064d3684c541d312bd4c7b05acb99a2c764f6231bd507d4b4b65226c23", size = 1982282 }, - { url = "https://files.pythonhosted.org/packages/0a/f5/d0b48c6b902607a59fd5932a54e3518dae8223814db8349b0176e6e9444b/rapidfuzz-3.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:57c390336cb50d5d3bfb0cfe1467478a15733703af61f6dffb14b1cd312a6fae", size = 1439274 }, - { url = "https://files.pythonhosted.org/packages/59/cf/c3ac8c80d8ced6c1f99b5d9674d397ce5d0e9d0939d788d67c010e19c65f/rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0da54aa8547b3c2c188db3d1c7eb4d1bb6dd80baa8cdaeaec3d1da3346ec9caa", size = 1399854 }, - { url = "https://files.pythonhosted.org/packages/09/5d/ca8698e452b349c8313faf07bfa84e7d1c2d2edf7ccc67bcfc49bee1259a/rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df8e8c21e67afb9d7fbe18f42c6111fe155e801ab103c81109a61312927cc611", size = 5308962 }, - { url = "https://files.pythonhosted.org/packages/66/0a/bebada332854e78e68f3d6c05226b23faca79d71362509dbcf7b002e33b7/rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:461fd13250a2adf8e90ca9a0e1e166515cbcaa5e9c3b1f37545cbbeff9e77f6b", size = 1625016 }, - { url = "https://files.pythonhosted.org/packages/de/0c/9e58d4887b86d7121d1c519f7050d1be5eb189d8a8075f5417df6492b4f5/rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2b3dd5d206a12deca16870acc0d6e5036abeb70e3cad6549c294eff15591527", size = 1600414 }, - { url = "https://files.pythonhosted.org/packages/9b/df/6096bc669c1311568840bdcbb5a893edc972d1c8d2b4b4325c21d54da5b1/rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1343d745fbf4688e412d8f398c6e6d6f269db99a54456873f232ba2e7aeb4939", size = 3053179 }, - { url = "https://files.pythonhosted.org/packages/f9/46/5179c583b75fce3e65a5cd79a3561bd19abd54518cb7c483a89b284bf2b9/rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b1b065f370d54551dcc785c6f9eeb5bd517ae14c983d2784c064b3aa525896df", size = 2456856 }, - { url = "https://files.pythonhosted.org/packages/6b/64/e9804212e3286d027ac35bbb66603c9456c2bce23f823b67d2f5cabc05c1/rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:11b125d8edd67e767b2295eac6eb9afe0b1cdc82ea3d4b9257da4b8e06077798", size = 7567107 }, - { url = "https://files.pythonhosted.org/packages/8a/f2/7d69e7bf4daec62769b11757ffc31f69afb3ce248947aadbb109fefd9f65/rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c33f9c841630b2bb7e69a3fb5c84a854075bb812c47620978bddc591f764da3d", size = 2854192 }, - { url = "https://files.pythonhosted.org/packages/05/21/ab4ad7d7d0f653e6fe2e4ccf11d0245092bef94cdff587a21e534e57bda8/rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ae4574cb66cf1e85d32bb7e9ec45af5409c5b3970b7ceb8dea90168024127566", size = 3398876 }, - { url = "https://files.pythonhosted.org/packages/0f/a8/45bba94c2489cb1ee0130dcb46e1df4fa2c2b25269e21ffd15240a80322b/rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e05752418b24bbd411841b256344c26f57da1148c5509e34ea39c7eb5099ab72", size = 4377077 }, - { url = "https://files.pythonhosted.org/packages/0c/f3/5e0c6ae452cbb74e5436d3445467447e8c32f3021f48f93f15934b8cffc2/rapidfuzz-3.13.0-cp313-cp313-win32.whl", hash = "sha256:0e1d08cb884805a543f2de1f6744069495ef527e279e05370dd7c83416af83f8", size = 1822066 }, - { url = "https://files.pythonhosted.org/packages/96/e3/a98c25c4f74051df4dcf2f393176b8663bfd93c7afc6692c84e96de147a2/rapidfuzz-3.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9a7c6232be5f809cd39da30ee5d24e6cadd919831e6020ec6c2391f4c3bc9264", size = 1615100 }, - { url = "https://files.pythonhosted.org/packages/60/b1/05cd5e697c00cd46d7791915f571b38c8531f714832eff2c5e34537c49ee/rapidfuzz-3.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:3f32f15bacd1838c929b35c84b43618481e1b3d7a61b5ed2db0291b70ae88b53", size = 858976 }, - { url = "https://files.pythonhosted.org/packages/88/df/6060c5a9c879b302bd47a73fc012d0db37abf6544c57591bcbc3459673bd/rapidfuzz-3.13.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1ba007f4d35a45ee68656b2eb83b8715e11d0f90e5b9f02d615a8a321ff00c27", size = 1905935 }, - { url = "https://files.pythonhosted.org/packages/a2/6c/a0b819b829e20525ef1bd58fc776fb8d07a0c38d819e63ba2b7c311a2ed4/rapidfuzz-3.13.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d7a217310429b43be95b3b8ad7f8fc41aba341109dc91e978cd7c703f928c58f", size = 1383714 }, - { url = "https://files.pythonhosted.org/packages/6a/c1/3da3466cc8a9bfb9cd345ad221fac311143b6a9664b5af4adb95b5e6ce01/rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:558bf526bcd777de32b7885790a95a9548ffdcce68f704a81207be4a286c1095", size = 1367329 }, - { url = "https://files.pythonhosted.org/packages/da/f0/9f2a9043bfc4e66da256b15d728c5fc2d865edf0028824337f5edac36783/rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:202a87760f5145140d56153b193a797ae9338f7939eb16652dd7ff96f8faf64c", size = 5251057 }, - { url = "https://files.pythonhosted.org/packages/6a/ff/af2cb1d8acf9777d52487af5c6b34ce9d13381a753f991d95ecaca813407/rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcccc08f671646ccb1e413c773bb92e7bba789e3a1796fd49d23c12539fe2e4", size = 2992401 }, - { url = "https://files.pythonhosted.org/packages/c1/c5/c243b05a15a27b946180db0d1e4c999bef3f4221505dff9748f1f6c917be/rapidfuzz-3.13.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:1f219f1e3c3194d7a7de222f54450ce12bc907862ff9a8962d83061c1f923c86", size = 1553782 }, +sdist = { url = "https://files.pythonhosted.org/packages/ed/f6/6895abc3a3d056b9698da3199b04c0e56226d530ae44a470edabf8b664f0/rapidfuzz-3.13.0.tar.gz", hash = "sha256:d2eaf3839e52cbcc0accbe9817a67b4b0fcf70aaeb229cfddc1c28061f9ce5d8", size = 57904226, upload-time = "2025-04-03T20:38:51.226Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/17/9be9eff5a3c7dfc831c2511262082c6786dca2ce21aa8194eef1cb71d67a/rapidfuzz-3.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d395a5cad0c09c7f096433e5fd4224d83b53298d53499945a9b0e5a971a84f3a", size = 1999453, upload-time = "2025-04-03T20:35:40.804Z" }, + { url = "https://files.pythonhosted.org/packages/75/67/62e57896ecbabe363f027d24cc769d55dd49019e576533ec10e492fcd8a2/rapidfuzz-3.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7b3eda607a019169f7187328a8d1648fb9a90265087f6903d7ee3a8eee01805", size = 1450881, upload-time = "2025-04-03T20:35:42.734Z" }, + { url = "https://files.pythonhosted.org/packages/96/5c/691c5304857f3476a7b3df99e91efc32428cbe7d25d234e967cc08346c13/rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98e0bfa602e1942d542de077baf15d658bd9d5dcfe9b762aff791724c1c38b70", size = 1422990, upload-time = "2025-04-03T20:35:45.158Z" }, + { url = "https://files.pythonhosted.org/packages/46/81/7a7e78f977496ee2d613154b86b203d373376bcaae5de7bde92f3ad5a192/rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bef86df6d59667d9655905b02770a0c776d2853971c0773767d5ef8077acd624", size = 5342309, upload-time = "2025-04-03T20:35:46.952Z" }, + { url = "https://files.pythonhosted.org/packages/51/44/12fdd12a76b190fe94bf38d252bb28ddf0ab7a366b943e792803502901a2/rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fedd316c165beed6307bf754dee54d3faca2c47e1f3bcbd67595001dfa11e969", size = 1656881, upload-time = "2025-04-03T20:35:49.954Z" }, + { url = "https://files.pythonhosted.org/packages/27/ae/0d933e660c06fcfb087a0d2492f98322f9348a28b2cc3791a5dbadf6e6fb/rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5158da7f2ec02a930be13bac53bb5903527c073c90ee37804090614cab83c29e", size = 1608494, upload-time = "2025-04-03T20:35:51.646Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2c/4b2f8aafdf9400e5599b6ed2f14bc26ca75f5a923571926ccbc998d4246a/rapidfuzz-3.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b6f913ee4618ddb6d6f3e387b76e8ec2fc5efee313a128809fbd44e65c2bbb2", size = 3072160, upload-time = "2025-04-03T20:35:53.472Z" }, + { url = "https://files.pythonhosted.org/packages/60/7d/030d68d9a653c301114101c3003b31ce01cf2c3224034cd26105224cd249/rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d25fdbce6459ccbbbf23b4b044f56fbd1158b97ac50994eaae2a1c0baae78301", size = 2491549, upload-time = "2025-04-03T20:35:55.391Z" }, + { url = "https://files.pythonhosted.org/packages/8e/cd/7040ba538fc6a8ddc8816a05ecf46af9988b46c148ddd7f74fb0fb73d012/rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:25343ccc589a4579fbde832e6a1e27258bfdd7f2eb0f28cb836d6694ab8591fc", size = 7584142, upload-time = "2025-04-03T20:35:57.71Z" }, + { url = "https://files.pythonhosted.org/packages/c1/96/85f7536fbceb0aa92c04a1c37a3fc4fcd4e80649e9ed0fb585382df82edc/rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a9ad1f37894e3ffb76bbab76256e8a8b789657183870be11aa64e306bb5228fd", size = 2896234, upload-time = "2025-04-03T20:35:59.969Z" }, + { url = "https://files.pythonhosted.org/packages/55/fd/460e78438e7019f2462fe9d4ecc880577ba340df7974c8a4cfe8d8d029df/rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5dc71ef23845bb6b62d194c39a97bb30ff171389c9812d83030c1199f319098c", size = 3437420, upload-time = "2025-04-03T20:36:01.91Z" }, + { url = "https://files.pythonhosted.org/packages/cc/df/c3c308a106a0993befd140a414c5ea78789d201cf1dfffb8fd9749718d4f/rapidfuzz-3.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b7f4c65facdb94f44be759bbd9b6dda1fa54d0d6169cdf1a209a5ab97d311a75", size = 4410860, upload-time = "2025-04-03T20:36:04.352Z" }, + { url = "https://files.pythonhosted.org/packages/75/ee/9d4ece247f9b26936cdeaae600e494af587ce9bf8ddc47d88435f05cfd05/rapidfuzz-3.13.0-cp311-cp311-win32.whl", hash = "sha256:b5104b62711565e0ff6deab2a8f5dbf1fbe333c5155abe26d2cfd6f1849b6c87", size = 1843161, upload-time = "2025-04-03T20:36:06.802Z" }, + { url = "https://files.pythonhosted.org/packages/c9/5a/d00e1f63564050a20279015acb29ecaf41646adfacc6ce2e1e450f7f2633/rapidfuzz-3.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:9093cdeb926deb32a4887ebe6910f57fbcdbc9fbfa52252c10b56ef2efb0289f", size = 1629962, upload-time = "2025-04-03T20:36:09.133Z" }, + { url = "https://files.pythonhosted.org/packages/3b/74/0a3de18bc2576b794f41ccd07720b623e840fda219ab57091897f2320fdd/rapidfuzz-3.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:f70f646751b6aa9d05be1fb40372f006cc89d6aad54e9d79ae97bd1f5fce5203", size = 866631, upload-time = "2025-04-03T20:36:11.022Z" }, + { url = "https://files.pythonhosted.org/packages/13/4b/a326f57a4efed8f5505b25102797a58e37ee11d94afd9d9422cb7c76117e/rapidfuzz-3.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a1a6a906ba62f2556372282b1ef37b26bca67e3d2ea957277cfcefc6275cca7", size = 1989501, upload-time = "2025-04-03T20:36:13.43Z" }, + { url = "https://files.pythonhosted.org/packages/b7/53/1f7eb7ee83a06c400089ec7cb841cbd581c2edd7a4b21eb2f31030b88daa/rapidfuzz-3.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2fd0975e015b05c79a97f38883a11236f5a24cca83aa992bd2558ceaa5652b26", size = 1445379, upload-time = "2025-04-03T20:36:16.439Z" }, + { url = "https://files.pythonhosted.org/packages/07/09/de8069a4599cc8e6d194e5fa1782c561151dea7d5e2741767137e2a8c1f0/rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d4e13593d298c50c4f94ce453f757b4b398af3fa0fd2fde693c3e51195b7f69", size = 1405986, upload-time = "2025-04-03T20:36:18.447Z" }, + { url = "https://files.pythonhosted.org/packages/5d/77/d9a90b39c16eca20d70fec4ca377fbe9ea4c0d358c6e4736ab0e0e78aaf6/rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed6f416bda1c9133000009d84d9409823eb2358df0950231cc936e4bf784eb97", size = 5310809, upload-time = "2025-04-03T20:36:20.324Z" }, + { url = "https://files.pythonhosted.org/packages/1e/7d/14da291b0d0f22262d19522afaf63bccf39fc027c981233fb2137a57b71f/rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1dc82b6ed01acb536b94a43996a94471a218f4d89f3fdd9185ab496de4b2a981", size = 1629394, upload-time = "2025-04-03T20:36:22.256Z" }, + { url = "https://files.pythonhosted.org/packages/b7/e4/79ed7e4fa58f37c0f8b7c0a62361f7089b221fe85738ae2dbcfb815e985a/rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9d824de871daa6e443b39ff495a884931970d567eb0dfa213d234337343835f", size = 1600544, upload-time = "2025-04-03T20:36:24.207Z" }, + { url = "https://files.pythonhosted.org/packages/4e/20/e62b4d13ba851b0f36370060025de50a264d625f6b4c32899085ed51f980/rapidfuzz-3.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d18228a2390375cf45726ce1af9d36ff3dc1f11dce9775eae1f1b13ac6ec50f", size = 3052796, upload-time = "2025-04-03T20:36:26.279Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8d/55fdf4387dec10aa177fe3df8dbb0d5022224d95f48664a21d6b62a5299d/rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f5fe634c9482ec5d4a6692afb8c45d370ae86755e5f57aa6c50bfe4ca2bdd87", size = 2464016, upload-time = "2025-04-03T20:36:28.525Z" }, + { url = "https://files.pythonhosted.org/packages/9b/be/0872f6a56c0f473165d3b47d4170fa75263dc5f46985755aa9bf2bbcdea1/rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:694eb531889f71022b2be86f625a4209c4049e74be9ca836919b9e395d5e33b3", size = 7556725, upload-time = "2025-04-03T20:36:30.629Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f3/6c0750e484d885a14840c7a150926f425d524982aca989cdda0bb3bdfa57/rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:11b47b40650e06147dee5e51a9c9ad73bb7b86968b6f7d30e503b9f8dd1292db", size = 2859052, upload-time = "2025-04-03T20:36:32.836Z" }, + { url = "https://files.pythonhosted.org/packages/6f/98/5a3a14701b5eb330f444f7883c9840b43fb29c575e292e09c90a270a6e07/rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:98b8107ff14f5af0243f27d236bcc6e1ef8e7e3b3c25df114e91e3a99572da73", size = 3390219, upload-time = "2025-04-03T20:36:35.062Z" }, + { url = "https://files.pythonhosted.org/packages/e9/7d/f4642eaaeb474b19974332f2a58471803448be843033e5740965775760a5/rapidfuzz-3.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b836f486dba0aceb2551e838ff3f514a38ee72b015364f739e526d720fdb823a", size = 4377924, upload-time = "2025-04-03T20:36:37.363Z" }, + { url = "https://files.pythonhosted.org/packages/8e/83/fa33f61796731891c3e045d0cbca4436a5c436a170e7f04d42c2423652c3/rapidfuzz-3.13.0-cp312-cp312-win32.whl", hash = "sha256:4671ee300d1818d7bdfd8fa0608580d7778ba701817216f0c17fb29e6b972514", size = 1823915, upload-time = "2025-04-03T20:36:39.451Z" }, + { url = "https://files.pythonhosted.org/packages/03/25/5ee7ab6841ca668567d0897905eebc79c76f6297b73bf05957be887e9c74/rapidfuzz-3.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e2065f68fb1d0bf65adc289c1bdc45ba7e464e406b319d67bb54441a1b9da9e", size = 1616985, upload-time = "2025-04-03T20:36:41.631Z" }, + { url = "https://files.pythonhosted.org/packages/76/5e/3f0fb88db396cb692aefd631e4805854e02120a2382723b90dcae720bcc6/rapidfuzz-3.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:65cc97c2fc2c2fe23586599686f3b1ceeedeca8e598cfcc1b7e56dc8ca7e2aa7", size = 860116, upload-time = "2025-04-03T20:36:43.915Z" }, + { url = "https://files.pythonhosted.org/packages/0a/76/606e71e4227790750f1646f3c5c873e18d6cfeb6f9a77b2b8c4dec8f0f66/rapidfuzz-3.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:09e908064d3684c541d312bd4c7b05acb99a2c764f6231bd507d4b4b65226c23", size = 1982282, upload-time = "2025-04-03T20:36:46.149Z" }, + { url = "https://files.pythonhosted.org/packages/0a/f5/d0b48c6b902607a59fd5932a54e3518dae8223814db8349b0176e6e9444b/rapidfuzz-3.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:57c390336cb50d5d3bfb0cfe1467478a15733703af61f6dffb14b1cd312a6fae", size = 1439274, upload-time = "2025-04-03T20:36:48.323Z" }, + { url = "https://files.pythonhosted.org/packages/59/cf/c3ac8c80d8ced6c1f99b5d9674d397ce5d0e9d0939d788d67c010e19c65f/rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0da54aa8547b3c2c188db3d1c7eb4d1bb6dd80baa8cdaeaec3d1da3346ec9caa", size = 1399854, upload-time = "2025-04-03T20:36:50.294Z" }, + { url = "https://files.pythonhosted.org/packages/09/5d/ca8698e452b349c8313faf07bfa84e7d1c2d2edf7ccc67bcfc49bee1259a/rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df8e8c21e67afb9d7fbe18f42c6111fe155e801ab103c81109a61312927cc611", size = 5308962, upload-time = "2025-04-03T20:36:52.421Z" }, + { url = "https://files.pythonhosted.org/packages/66/0a/bebada332854e78e68f3d6c05226b23faca79d71362509dbcf7b002e33b7/rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:461fd13250a2adf8e90ca9a0e1e166515cbcaa5e9c3b1f37545cbbeff9e77f6b", size = 1625016, upload-time = "2025-04-03T20:36:54.639Z" }, + { url = "https://files.pythonhosted.org/packages/de/0c/9e58d4887b86d7121d1c519f7050d1be5eb189d8a8075f5417df6492b4f5/rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2b3dd5d206a12deca16870acc0d6e5036abeb70e3cad6549c294eff15591527", size = 1600414, upload-time = "2025-04-03T20:36:56.669Z" }, + { url = "https://files.pythonhosted.org/packages/9b/df/6096bc669c1311568840bdcbb5a893edc972d1c8d2b4b4325c21d54da5b1/rapidfuzz-3.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1343d745fbf4688e412d8f398c6e6d6f269db99a54456873f232ba2e7aeb4939", size = 3053179, upload-time = "2025-04-03T20:36:59.366Z" }, + { url = "https://files.pythonhosted.org/packages/f9/46/5179c583b75fce3e65a5cd79a3561bd19abd54518cb7c483a89b284bf2b9/rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b1b065f370d54551dcc785c6f9eeb5bd517ae14c983d2784c064b3aa525896df", size = 2456856, upload-time = "2025-04-03T20:37:01.708Z" }, + { url = "https://files.pythonhosted.org/packages/6b/64/e9804212e3286d027ac35bbb66603c9456c2bce23f823b67d2f5cabc05c1/rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:11b125d8edd67e767b2295eac6eb9afe0b1cdc82ea3d4b9257da4b8e06077798", size = 7567107, upload-time = "2025-04-03T20:37:04.521Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f2/7d69e7bf4daec62769b11757ffc31f69afb3ce248947aadbb109fefd9f65/rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c33f9c841630b2bb7e69a3fb5c84a854075bb812c47620978bddc591f764da3d", size = 2854192, upload-time = "2025-04-03T20:37:06.905Z" }, + { url = "https://files.pythonhosted.org/packages/05/21/ab4ad7d7d0f653e6fe2e4ccf11d0245092bef94cdff587a21e534e57bda8/rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ae4574cb66cf1e85d32bb7e9ec45af5409c5b3970b7ceb8dea90168024127566", size = 3398876, upload-time = "2025-04-03T20:37:09.692Z" }, + { url = "https://files.pythonhosted.org/packages/0f/a8/45bba94c2489cb1ee0130dcb46e1df4fa2c2b25269e21ffd15240a80322b/rapidfuzz-3.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e05752418b24bbd411841b256344c26f57da1148c5509e34ea39c7eb5099ab72", size = 4377077, upload-time = "2025-04-03T20:37:11.929Z" }, + { url = "https://files.pythonhosted.org/packages/0c/f3/5e0c6ae452cbb74e5436d3445467447e8c32f3021f48f93f15934b8cffc2/rapidfuzz-3.13.0-cp313-cp313-win32.whl", hash = "sha256:0e1d08cb884805a543f2de1f6744069495ef527e279e05370dd7c83416af83f8", size = 1822066, upload-time = "2025-04-03T20:37:14.425Z" }, + { url = "https://files.pythonhosted.org/packages/96/e3/a98c25c4f74051df4dcf2f393176b8663bfd93c7afc6692c84e96de147a2/rapidfuzz-3.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9a7c6232be5f809cd39da30ee5d24e6cadd919831e6020ec6c2391f4c3bc9264", size = 1615100, upload-time = "2025-04-03T20:37:16.611Z" }, + { url = "https://files.pythonhosted.org/packages/60/b1/05cd5e697c00cd46d7791915f571b38c8531f714832eff2c5e34537c49ee/rapidfuzz-3.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:3f32f15bacd1838c929b35c84b43618481e1b3d7a61b5ed2db0291b70ae88b53", size = 858976, upload-time = "2025-04-03T20:37:19.336Z" }, + { url = "https://files.pythonhosted.org/packages/88/df/6060c5a9c879b302bd47a73fc012d0db37abf6544c57591bcbc3459673bd/rapidfuzz-3.13.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1ba007f4d35a45ee68656b2eb83b8715e11d0f90e5b9f02d615a8a321ff00c27", size = 1905935, upload-time = "2025-04-03T20:38:18.07Z" }, + { url = "https://files.pythonhosted.org/packages/a2/6c/a0b819b829e20525ef1bd58fc776fb8d07a0c38d819e63ba2b7c311a2ed4/rapidfuzz-3.13.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d7a217310429b43be95b3b8ad7f8fc41aba341109dc91e978cd7c703f928c58f", size = 1383714, upload-time = "2025-04-03T20:38:20.628Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c1/3da3466cc8a9bfb9cd345ad221fac311143b6a9664b5af4adb95b5e6ce01/rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:558bf526bcd777de32b7885790a95a9548ffdcce68f704a81207be4a286c1095", size = 1367329, upload-time = "2025-04-03T20:38:23.01Z" }, + { url = "https://files.pythonhosted.org/packages/da/f0/9f2a9043bfc4e66da256b15d728c5fc2d865edf0028824337f5edac36783/rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:202a87760f5145140d56153b193a797ae9338f7939eb16652dd7ff96f8faf64c", size = 5251057, upload-time = "2025-04-03T20:38:25.52Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ff/af2cb1d8acf9777d52487af5c6b34ce9d13381a753f991d95ecaca813407/rapidfuzz-3.13.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcccc08f671646ccb1e413c773bb92e7bba789e3a1796fd49d23c12539fe2e4", size = 2992401, upload-time = "2025-04-03T20:38:28.196Z" }, + { url = "https://files.pythonhosted.org/packages/c1/c5/c243b05a15a27b946180db0d1e4c999bef3f4221505dff9748f1f6c917be/rapidfuzz-3.13.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:1f219f1e3c3194d7a7de222f54450ce12bc907862ff9a8962d83061c1f923c86", size = 1553782, upload-time = "2025-04-03T20:38:30.778Z" }, ] [[package]] @@ -2744,9 +2762,9 @@ dependencies = [ { name = "rpds-py" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744 } +sdist = { url = "https://files.pythonhosted.org/packages/2f/db/98b5c277be99dd18bfd91dd04e1b759cad18d1a338188c936e92f921c7e2/referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", size = 74744, upload-time = "2025-01-25T08:48:16.138Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775 }, + { url = "https://files.pythonhosted.org/packages/c1/b1/3baf80dc6d2b7bc27a95a67752d0208e410351e3feb4eb78de5f77454d8d/referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0", size = 26775, upload-time = "2025-01-25T08:48:14.241Z" }, ] [[package]] @@ -2759,9 +2777,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258 } +sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847 }, + { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" }, ] [[package]] @@ -2772,105 +2790,105 @@ dependencies = [ { name = "oauthlib" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650 } +sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650, upload-time = "2024-03-22T20:32:29.939Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179 }, + { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179, upload-time = "2024-03-22T20:32:28.055Z" }, ] [[package]] name = "rich" -version = "14.0.0" +version = "14.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/53/830aa4c3066a8ab0ae9a9955976fb770fe9c6102117c8ec4ab3ea62d89e8/rich-14.0.0.tar.gz", hash = "sha256:82f1bc23a6a21ebca4ae0c45af9bdbc492ed20231dcb63f297d6d1021a9d5725", size = 224078 } +sdist = { url = "https://files.pythonhosted.org/packages/fe/75/af448d8e52bf1d8fa6a9d089ca6c07ff4453d86c65c145d0a300bb073b9b/rich-14.1.0.tar.gz", hash = "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8", size = 224441, upload-time = "2025-07-25T07:32:58.125Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/9b/63f4c7ebc259242c89b3acafdb37b41d1185c07ff0011164674e9076b491/rich-14.0.0-py3-none-any.whl", hash = "sha256:1c9491e1951aac09caffd42f448ee3d04e58923ffe14993f6e83068dc395d7e0", size = 243229 }, + { url = "https://files.pythonhosted.org/packages/e3/30/3c4d035596d3cf444529e0b2953ad0466f6049528a879d27534700580395/rich-14.1.0-py3-none-any.whl", hash = "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f", size = 243368, upload-time = "2025-07-25T07:32:56.73Z" }, ] [[package]] name = "roman-numerals-py" version = "3.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/76/48fd56d17c5bdbdf65609abbc67288728a98ed4c02919428d4f52d23b24b/roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d", size = 9017 } +sdist = { url = "https://files.pythonhosted.org/packages/30/76/48fd56d17c5bdbdf65609abbc67288728a98ed4c02919428d4f52d23b24b/roman_numerals_py-3.1.0.tar.gz", hash = "sha256:be4bf804f083a4ce001b5eb7e3c0862479d10f94c936f6c4e5f250aa5ff5bd2d", size = 9017, upload-time = "2025-02-22T07:34:54.333Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", size = 7742 }, + { url = "https://files.pythonhosted.org/packages/53/97/d2cbbaa10c9b826af0e10fdf836e1bf344d9f0abb873ebc34d1f49642d3f/roman_numerals_py-3.1.0-py3-none-any.whl", hash = "sha256:9da2ad2fb670bcf24e81070ceb3be72f6c11c440d73bd579fbeca1e9f330954c", size = 7742, upload-time = "2025-02-22T07:34:52.422Z" }, ] [[package]] name = "rpds-py" version = "0.26.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/aa/4456d84bbb54adc6a916fb10c9b374f78ac840337644e4a5eda229c81275/rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0", size = 27385 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/09/4c/4ee8f7e512030ff79fda1df3243c88d70fc874634e2dbe5df13ba4210078/rpds_py-0.26.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9e8cb77286025bdb21be2941d64ac6ca016130bfdcd228739e8ab137eb4406ed", size = 372610 }, - { url = "https://files.pythonhosted.org/packages/fa/9d/3dc16be00f14fc1f03c71b1d67c8df98263ab2710a2fbd65a6193214a527/rpds_py-0.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e09330b21d98adc8ccb2dbb9fc6cb434e8908d4c119aeaa772cb1caab5440a0", size = 358032 }, - { url = "https://files.pythonhosted.org/packages/e7/5a/7f1bf8f045da2866324a08ae80af63e64e7bfaf83bd31f865a7b91a58601/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9c1b92b774b2e68d11193dc39620d62fd8ab33f0a3c77ecdabe19c179cdbc1", size = 381525 }, - { url = "https://files.pythonhosted.org/packages/45/8a/04479398c755a066ace10e3d158866beb600867cacae194c50ffa783abd0/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:824e6d3503ab990d7090768e4dfd9e840837bae057f212ff9f4f05ec6d1975e7", size = 397089 }, - { url = "https://files.pythonhosted.org/packages/72/88/9203f47268db488a1b6d469d69c12201ede776bb728b9d9f29dbfd7df406/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ad7fd2258228bf288f2331f0a6148ad0186b2e3643055ed0db30990e59817a6", size = 514255 }, - { url = "https://files.pythonhosted.org/packages/f5/b4/01ce5d1e853ddf81fbbd4311ab1eff0b3cf162d559288d10fd127e2588b5/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dc23bbb3e06ec1ea72d515fb572c1fea59695aefbffb106501138762e1e915e", size = 402283 }, - { url = "https://files.pythonhosted.org/packages/34/a2/004c99936997bfc644d590a9defd9e9c93f8286568f9c16cdaf3e14429a7/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d80bf832ac7b1920ee29a426cdca335f96a2b5caa839811803e999b41ba9030d", size = 383881 }, - { url = "https://files.pythonhosted.org/packages/05/1b/ef5fba4a8f81ce04c427bfd96223f92f05e6cd72291ce9d7523db3b03a6c/rpds_py-0.26.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0919f38f5542c0a87e7b4afcafab6fd2c15386632d249e9a087498571250abe3", size = 415822 }, - { url = "https://files.pythonhosted.org/packages/16/80/5c54195aec456b292f7bd8aa61741c8232964063fd8a75fdde9c1e982328/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d422b945683e409000c888e384546dbab9009bb92f7c0b456e217988cf316107", size = 558347 }, - { url = "https://files.pythonhosted.org/packages/f2/1c/1845c1b1fd6d827187c43afe1841d91678d7241cbdb5420a4c6de180a538/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a7711fa562ba2da1aa757e11024ad6d93bad6ad7ede5afb9af144623e5f76a", size = 587956 }, - { url = "https://files.pythonhosted.org/packages/2e/ff/9e979329dd131aa73a438c077252ddabd7df6d1a7ad7b9aacf6261f10faa/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238e8c8610cb7c29460e37184f6799547f7e09e6a9bdbdab4e8edb90986a2318", size = 554363 }, - { url = "https://files.pythonhosted.org/packages/00/8b/d78cfe034b71ffbe72873a136e71acc7a831a03e37771cfe59f33f6de8a2/rpds_py-0.26.0-cp311-cp311-win32.whl", hash = "sha256:893b022bfbdf26d7bedb083efeea624e8550ca6eb98bf7fea30211ce95b9201a", size = 220123 }, - { url = "https://files.pythonhosted.org/packages/94/c1/3c8c94c7dd3905dbfde768381ce98778500a80db9924731d87ddcdb117e9/rpds_py-0.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:87a5531de9f71aceb8af041d72fc4cab4943648d91875ed56d2e629bef6d4c03", size = 231732 }, - { url = "https://files.pythonhosted.org/packages/67/93/e936fbed1b734eabf36ccb5d93c6a2e9246fbb13c1da011624b7286fae3e/rpds_py-0.26.0-cp311-cp311-win_arm64.whl", hash = "sha256:de2713f48c1ad57f89ac25b3cb7daed2156d8e822cf0eca9b96a6f990718cc41", size = 221917 }, - { url = "https://files.pythonhosted.org/packages/ea/86/90eb87c6f87085868bd077c7a9938006eb1ce19ed4d06944a90d3560fce2/rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d", size = 363933 }, - { url = "https://files.pythonhosted.org/packages/63/78/4469f24d34636242c924626082b9586f064ada0b5dbb1e9d096ee7a8e0c6/rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136", size = 350447 }, - { url = "https://files.pythonhosted.org/packages/ad/91/c448ed45efdfdade82348d5e7995e15612754826ea640afc20915119734f/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582", size = 384711 }, - { url = "https://files.pythonhosted.org/packages/ec/43/e5c86fef4be7f49828bdd4ecc8931f0287b1152c0bb0163049b3218740e7/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e", size = 400865 }, - { url = "https://files.pythonhosted.org/packages/55/34/e00f726a4d44f22d5c5fe2e5ddd3ac3d7fd3f74a175607781fbdd06fe375/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15", size = 517763 }, - { url = "https://files.pythonhosted.org/packages/52/1c/52dc20c31b147af724b16104500fba13e60123ea0334beba7b40e33354b4/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8", size = 406651 }, - { url = "https://files.pythonhosted.org/packages/2e/77/87d7bfabfc4e821caa35481a2ff6ae0b73e6a391bb6b343db2c91c2b9844/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a", size = 386079 }, - { url = "https://files.pythonhosted.org/packages/e3/d4/7f2200c2d3ee145b65b3cddc4310d51f7da6a26634f3ac87125fd789152a/rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323", size = 421379 }, - { url = "https://files.pythonhosted.org/packages/ae/13/9fdd428b9c820869924ab62236b8688b122baa22d23efdd1c566938a39ba/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158", size = 562033 }, - { url = "https://files.pythonhosted.org/packages/f3/e1/b69686c3bcbe775abac3a4c1c30a164a2076d28df7926041f6c0eb5e8d28/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3", size = 591639 }, - { url = "https://files.pythonhosted.org/packages/5c/c9/1e3d8c8863c84a90197ac577bbc3d796a92502124c27092413426f670990/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2", size = 557105 }, - { url = "https://files.pythonhosted.org/packages/9f/c5/90c569649057622959f6dcc40f7b516539608a414dfd54b8d77e3b201ac0/rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44", size = 223272 }, - { url = "https://files.pythonhosted.org/packages/7d/16/19f5d9f2a556cfed454eebe4d354c38d51c20f3db69e7b4ce6cff904905d/rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c", size = 234995 }, - { url = "https://files.pythonhosted.org/packages/83/f0/7935e40b529c0e752dfaa7880224771b51175fce08b41ab4a92eb2fbdc7f/rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8", size = 223198 }, - { url = "https://files.pythonhosted.org/packages/6a/67/bb62d0109493b12b1c6ab00de7a5566aa84c0e44217c2d94bee1bd370da9/rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d", size = 363917 }, - { url = "https://files.pythonhosted.org/packages/4b/f3/34e6ae1925a5706c0f002a8d2d7f172373b855768149796af87bd65dcdb9/rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1", size = 350073 }, - { url = "https://files.pythonhosted.org/packages/75/83/1953a9d4f4e4de7fd0533733e041c28135f3c21485faaef56a8aadbd96b5/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e", size = 384214 }, - { url = "https://files.pythonhosted.org/packages/48/0e/983ed1b792b3322ea1d065e67f4b230f3b96025f5ce3878cc40af09b7533/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1", size = 400113 }, - { url = "https://files.pythonhosted.org/packages/69/7f/36c0925fff6f660a80be259c5b4f5e53a16851f946eb080351d057698528/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9", size = 515189 }, - { url = "https://files.pythonhosted.org/packages/13/45/cbf07fc03ba7a9b54662c9badb58294ecfb24f828b9732970bd1a431ed5c/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7", size = 406998 }, - { url = "https://files.pythonhosted.org/packages/6c/b0/8fa5e36e58657997873fd6a1cf621285ca822ca75b4b3434ead047daa307/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04", size = 385903 }, - { url = "https://files.pythonhosted.org/packages/4b/f7/b25437772f9f57d7a9fbd73ed86d0dcd76b4c7c6998348c070d90f23e315/rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1", size = 419785 }, - { url = "https://files.pythonhosted.org/packages/a7/6b/63ffa55743dfcb4baf2e9e77a0b11f7f97ed96a54558fcb5717a4b2cd732/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9", size = 561329 }, - { url = "https://files.pythonhosted.org/packages/2f/07/1f4f5e2886c480a2346b1e6759c00278b8a69e697ae952d82ae2e6ee5db0/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9", size = 590875 }, - { url = "https://files.pythonhosted.org/packages/cc/bc/e6639f1b91c3a55f8c41b47d73e6307051b6e246254a827ede730624c0f8/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba", size = 556636 }, - { url = "https://files.pythonhosted.org/packages/05/4c/b3917c45566f9f9a209d38d9b54a1833f2bb1032a3e04c66f75726f28876/rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b", size = 222663 }, - { url = "https://files.pythonhosted.org/packages/e0/0b/0851bdd6025775aaa2365bb8de0697ee2558184c800bfef8d7aef5ccde58/rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5", size = 234428 }, - { url = "https://files.pythonhosted.org/packages/ed/e8/a47c64ed53149c75fb581e14a237b7b7cd18217e969c30d474d335105622/rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256", size = 222571 }, - { url = "https://files.pythonhosted.org/packages/89/bf/3d970ba2e2bcd17d2912cb42874107390f72873e38e79267224110de5e61/rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618", size = 360475 }, - { url = "https://files.pythonhosted.org/packages/82/9f/283e7e2979fc4ec2d8ecee506d5a3675fce5ed9b4b7cb387ea5d37c2f18d/rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35", size = 346692 }, - { url = "https://files.pythonhosted.org/packages/e3/03/7e50423c04d78daf391da3cc4330bdb97042fc192a58b186f2d5deb7befd/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f", size = 379415 }, - { url = "https://files.pythonhosted.org/packages/57/00/d11ee60d4d3b16808432417951c63df803afb0e0fc672b5e8d07e9edaaae/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83", size = 391783 }, - { url = "https://files.pythonhosted.org/packages/08/b3/1069c394d9c0d6d23c5b522e1f6546b65793a22950f6e0210adcc6f97c3e/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1", size = 512844 }, - { url = "https://files.pythonhosted.org/packages/08/3b/c4fbf0926800ed70b2c245ceca99c49f066456755f5d6eb8863c2c51e6d0/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8", size = 402105 }, - { url = "https://files.pythonhosted.org/packages/1c/b0/db69b52ca07413e568dae9dc674627a22297abb144c4d6022c6d78f1e5cc/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f", size = 383440 }, - { url = "https://files.pythonhosted.org/packages/4c/e1/c65255ad5b63903e56b3bb3ff9dcc3f4f5c3badde5d08c741ee03903e951/rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed", size = 412759 }, - { url = "https://files.pythonhosted.org/packages/e4/22/bb731077872377a93c6e93b8a9487d0406c70208985831034ccdeed39c8e/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632", size = 556032 }, - { url = "https://files.pythonhosted.org/packages/e0/8b/393322ce7bac5c4530fb96fc79cc9ea2f83e968ff5f6e873f905c493e1c4/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c", size = 585416 }, - { url = "https://files.pythonhosted.org/packages/49/ae/769dc372211835bf759319a7aae70525c6eb523e3371842c65b7ef41c9c6/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0", size = 554049 }, - { url = "https://files.pythonhosted.org/packages/6b/f9/4c43f9cc203d6ba44ce3146246cdc38619d92c7bd7bad4946a3491bd5b70/rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9", size = 218428 }, - { url = "https://files.pythonhosted.org/packages/7e/8b/9286b7e822036a4a977f2f1e851c7345c20528dbd56b687bb67ed68a8ede/rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9", size = 231524 }, - { url = "https://files.pythonhosted.org/packages/51/f2/b5c85b758a00c513bb0389f8fc8e61eb5423050c91c958cdd21843faa3e6/rpds_py-0.26.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f61a9326f80ca59214d1cceb0a09bb2ece5b2563d4e0cd37bfd5515c28510674", size = 373505 }, - { url = "https://files.pythonhosted.org/packages/23/e0/25db45e391251118e915e541995bb5f5ac5691a3b98fb233020ba53afc9b/rpds_py-0.26.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:183f857a53bcf4b1b42ef0f57ca553ab56bdd170e49d8091e96c51c3d69ca696", size = 359468 }, - { url = "https://files.pythonhosted.org/packages/0b/73/dd5ee6075bb6491be3a646b301dfd814f9486d924137a5098e61f0487e16/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:941c1cfdf4799d623cf3aa1d326a6b4fdb7a5799ee2687f3516738216d2262fb", size = 382680 }, - { url = "https://files.pythonhosted.org/packages/2f/10/84b522ff58763a5c443f5bcedc1820240e454ce4e620e88520f04589e2ea/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72a8d9564a717ee291f554eeb4bfeafe2309d5ec0aa6c475170bdab0f9ee8e88", size = 397035 }, - { url = "https://files.pythonhosted.org/packages/06/ea/8667604229a10a520fcbf78b30ccc278977dcc0627beb7ea2c96b3becef0/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:511d15193cbe013619dd05414c35a7dedf2088fcee93c6bbb7c77859765bd4e8", size = 514922 }, - { url = "https://files.pythonhosted.org/packages/24/e6/9ed5b625c0661c4882fc8cdf302bf8e96c73c40de99c31e0b95ed37d508c/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aea1f9741b603a8d8fedb0ed5502c2bc0accbc51f43e2ad1337fe7259c2b77a5", size = 402822 }, - { url = "https://files.pythonhosted.org/packages/8a/58/212c7b6fd51946047fb45d3733da27e2fa8f7384a13457c874186af691b1/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4019a9d473c708cf2f16415688ef0b4639e07abaa569d72f74745bbeffafa2c7", size = 384336 }, - { url = "https://files.pythonhosted.org/packages/aa/f5/a40ba78748ae8ebf4934d4b88e77b98497378bc2c24ba55ebe87a4e87057/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:093d63b4b0f52d98ebae33b8c50900d3d67e0666094b1be7a12fffd7f65de74b", size = 416871 }, - { url = "https://files.pythonhosted.org/packages/d5/a6/33b1fc0c9f7dcfcfc4a4353daa6308b3ece22496ceece348b3e7a7559a09/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2abe21d8ba64cded53a2a677e149ceb76dcf44284202d737178afe7ba540c1eb", size = 559439 }, - { url = "https://files.pythonhosted.org/packages/71/2d/ceb3f9c12f8cfa56d34995097f6cd99da1325642c60d1b6680dd9df03ed8/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:4feb7511c29f8442cbbc28149a92093d32e815a28aa2c50d333826ad2a20fdf0", size = 588380 }, - { url = "https://files.pythonhosted.org/packages/c8/ed/9de62c2150ca8e2e5858acf3f4f4d0d180a38feef9fdab4078bea63d8dba/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e99685fc95d386da368013e7fb4269dd39c30d99f812a8372d62f244f662709c", size = 555334 }, +sdist = { url = "https://files.pythonhosted.org/packages/a5/aa/4456d84bbb54adc6a916fb10c9b374f78ac840337644e4a5eda229c81275/rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0", size = 27385, upload-time = "2025-07-01T15:57:13.958Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/09/4c/4ee8f7e512030ff79fda1df3243c88d70fc874634e2dbe5df13ba4210078/rpds_py-0.26.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9e8cb77286025bdb21be2941d64ac6ca016130bfdcd228739e8ab137eb4406ed", size = 372610, upload-time = "2025-07-01T15:53:58.844Z" }, + { url = "https://files.pythonhosted.org/packages/fa/9d/3dc16be00f14fc1f03c71b1d67c8df98263ab2710a2fbd65a6193214a527/rpds_py-0.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e09330b21d98adc8ccb2dbb9fc6cb434e8908d4c119aeaa772cb1caab5440a0", size = 358032, upload-time = "2025-07-01T15:53:59.985Z" }, + { url = "https://files.pythonhosted.org/packages/e7/5a/7f1bf8f045da2866324a08ae80af63e64e7bfaf83bd31f865a7b91a58601/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9c1b92b774b2e68d11193dc39620d62fd8ab33f0a3c77ecdabe19c179cdbc1", size = 381525, upload-time = "2025-07-01T15:54:01.162Z" }, + { url = "https://files.pythonhosted.org/packages/45/8a/04479398c755a066ace10e3d158866beb600867cacae194c50ffa783abd0/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:824e6d3503ab990d7090768e4dfd9e840837bae057f212ff9f4f05ec6d1975e7", size = 397089, upload-time = "2025-07-01T15:54:02.319Z" }, + { url = "https://files.pythonhosted.org/packages/72/88/9203f47268db488a1b6d469d69c12201ede776bb728b9d9f29dbfd7df406/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ad7fd2258228bf288f2331f0a6148ad0186b2e3643055ed0db30990e59817a6", size = 514255, upload-time = "2025-07-01T15:54:03.38Z" }, + { url = "https://files.pythonhosted.org/packages/f5/b4/01ce5d1e853ddf81fbbd4311ab1eff0b3cf162d559288d10fd127e2588b5/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dc23bbb3e06ec1ea72d515fb572c1fea59695aefbffb106501138762e1e915e", size = 402283, upload-time = "2025-07-01T15:54:04.923Z" }, + { url = "https://files.pythonhosted.org/packages/34/a2/004c99936997bfc644d590a9defd9e9c93f8286568f9c16cdaf3e14429a7/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d80bf832ac7b1920ee29a426cdca335f96a2b5caa839811803e999b41ba9030d", size = 383881, upload-time = "2025-07-01T15:54:06.482Z" }, + { url = "https://files.pythonhosted.org/packages/05/1b/ef5fba4a8f81ce04c427bfd96223f92f05e6cd72291ce9d7523db3b03a6c/rpds_py-0.26.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0919f38f5542c0a87e7b4afcafab6fd2c15386632d249e9a087498571250abe3", size = 415822, upload-time = "2025-07-01T15:54:07.605Z" }, + { url = "https://files.pythonhosted.org/packages/16/80/5c54195aec456b292f7bd8aa61741c8232964063fd8a75fdde9c1e982328/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d422b945683e409000c888e384546dbab9009bb92f7c0b456e217988cf316107", size = 558347, upload-time = "2025-07-01T15:54:08.591Z" }, + { url = "https://files.pythonhosted.org/packages/f2/1c/1845c1b1fd6d827187c43afe1841d91678d7241cbdb5420a4c6de180a538/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a7711fa562ba2da1aa757e11024ad6d93bad6ad7ede5afb9af144623e5f76a", size = 587956, upload-time = "2025-07-01T15:54:09.963Z" }, + { url = "https://files.pythonhosted.org/packages/2e/ff/9e979329dd131aa73a438c077252ddabd7df6d1a7ad7b9aacf6261f10faa/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238e8c8610cb7c29460e37184f6799547f7e09e6a9bdbdab4e8edb90986a2318", size = 554363, upload-time = "2025-07-01T15:54:11.073Z" }, + { url = "https://files.pythonhosted.org/packages/00/8b/d78cfe034b71ffbe72873a136e71acc7a831a03e37771cfe59f33f6de8a2/rpds_py-0.26.0-cp311-cp311-win32.whl", hash = "sha256:893b022bfbdf26d7bedb083efeea624e8550ca6eb98bf7fea30211ce95b9201a", size = 220123, upload-time = "2025-07-01T15:54:12.382Z" }, + { url = "https://files.pythonhosted.org/packages/94/c1/3c8c94c7dd3905dbfde768381ce98778500a80db9924731d87ddcdb117e9/rpds_py-0.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:87a5531de9f71aceb8af041d72fc4cab4943648d91875ed56d2e629bef6d4c03", size = 231732, upload-time = "2025-07-01T15:54:13.434Z" }, + { url = "https://files.pythonhosted.org/packages/67/93/e936fbed1b734eabf36ccb5d93c6a2e9246fbb13c1da011624b7286fae3e/rpds_py-0.26.0-cp311-cp311-win_arm64.whl", hash = "sha256:de2713f48c1ad57f89ac25b3cb7daed2156d8e822cf0eca9b96a6f990718cc41", size = 221917, upload-time = "2025-07-01T15:54:14.559Z" }, + { url = "https://files.pythonhosted.org/packages/ea/86/90eb87c6f87085868bd077c7a9938006eb1ce19ed4d06944a90d3560fce2/rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d", size = 363933, upload-time = "2025-07-01T15:54:15.734Z" }, + { url = "https://files.pythonhosted.org/packages/63/78/4469f24d34636242c924626082b9586f064ada0b5dbb1e9d096ee7a8e0c6/rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136", size = 350447, upload-time = "2025-07-01T15:54:16.922Z" }, + { url = "https://files.pythonhosted.org/packages/ad/91/c448ed45efdfdade82348d5e7995e15612754826ea640afc20915119734f/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582", size = 384711, upload-time = "2025-07-01T15:54:18.101Z" }, + { url = "https://files.pythonhosted.org/packages/ec/43/e5c86fef4be7f49828bdd4ecc8931f0287b1152c0bb0163049b3218740e7/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e", size = 400865, upload-time = "2025-07-01T15:54:19.295Z" }, + { url = "https://files.pythonhosted.org/packages/55/34/e00f726a4d44f22d5c5fe2e5ddd3ac3d7fd3f74a175607781fbdd06fe375/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15", size = 517763, upload-time = "2025-07-01T15:54:20.858Z" }, + { url = "https://files.pythonhosted.org/packages/52/1c/52dc20c31b147af724b16104500fba13e60123ea0334beba7b40e33354b4/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8", size = 406651, upload-time = "2025-07-01T15:54:22.508Z" }, + { url = "https://files.pythonhosted.org/packages/2e/77/87d7bfabfc4e821caa35481a2ff6ae0b73e6a391bb6b343db2c91c2b9844/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a", size = 386079, upload-time = "2025-07-01T15:54:23.987Z" }, + { url = "https://files.pythonhosted.org/packages/e3/d4/7f2200c2d3ee145b65b3cddc4310d51f7da6a26634f3ac87125fd789152a/rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323", size = 421379, upload-time = "2025-07-01T15:54:25.073Z" }, + { url = "https://files.pythonhosted.org/packages/ae/13/9fdd428b9c820869924ab62236b8688b122baa22d23efdd1c566938a39ba/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158", size = 562033, upload-time = "2025-07-01T15:54:26.225Z" }, + { url = "https://files.pythonhosted.org/packages/f3/e1/b69686c3bcbe775abac3a4c1c30a164a2076d28df7926041f6c0eb5e8d28/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3", size = 591639, upload-time = "2025-07-01T15:54:27.424Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c9/1e3d8c8863c84a90197ac577bbc3d796a92502124c27092413426f670990/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2", size = 557105, upload-time = "2025-07-01T15:54:29.93Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c5/90c569649057622959f6dcc40f7b516539608a414dfd54b8d77e3b201ac0/rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44", size = 223272, upload-time = "2025-07-01T15:54:31.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/16/19f5d9f2a556cfed454eebe4d354c38d51c20f3db69e7b4ce6cff904905d/rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c", size = 234995, upload-time = "2025-07-01T15:54:32.195Z" }, + { url = "https://files.pythonhosted.org/packages/83/f0/7935e40b529c0e752dfaa7880224771b51175fce08b41ab4a92eb2fbdc7f/rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8", size = 223198, upload-time = "2025-07-01T15:54:33.271Z" }, + { url = "https://files.pythonhosted.org/packages/6a/67/bb62d0109493b12b1c6ab00de7a5566aa84c0e44217c2d94bee1bd370da9/rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d", size = 363917, upload-time = "2025-07-01T15:54:34.755Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f3/34e6ae1925a5706c0f002a8d2d7f172373b855768149796af87bd65dcdb9/rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1", size = 350073, upload-time = "2025-07-01T15:54:36.292Z" }, + { url = "https://files.pythonhosted.org/packages/75/83/1953a9d4f4e4de7fd0533733e041c28135f3c21485faaef56a8aadbd96b5/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e", size = 384214, upload-time = "2025-07-01T15:54:37.469Z" }, + { url = "https://files.pythonhosted.org/packages/48/0e/983ed1b792b3322ea1d065e67f4b230f3b96025f5ce3878cc40af09b7533/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1", size = 400113, upload-time = "2025-07-01T15:54:38.954Z" }, + { url = "https://files.pythonhosted.org/packages/69/7f/36c0925fff6f660a80be259c5b4f5e53a16851f946eb080351d057698528/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9", size = 515189, upload-time = "2025-07-01T15:54:40.57Z" }, + { url = "https://files.pythonhosted.org/packages/13/45/cbf07fc03ba7a9b54662c9badb58294ecfb24f828b9732970bd1a431ed5c/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7", size = 406998, upload-time = "2025-07-01T15:54:43.025Z" }, + { url = "https://files.pythonhosted.org/packages/6c/b0/8fa5e36e58657997873fd6a1cf621285ca822ca75b4b3434ead047daa307/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04", size = 385903, upload-time = "2025-07-01T15:54:44.752Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f7/b25437772f9f57d7a9fbd73ed86d0dcd76b4c7c6998348c070d90f23e315/rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1", size = 419785, upload-time = "2025-07-01T15:54:46.043Z" }, + { url = "https://files.pythonhosted.org/packages/a7/6b/63ffa55743dfcb4baf2e9e77a0b11f7f97ed96a54558fcb5717a4b2cd732/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9", size = 561329, upload-time = "2025-07-01T15:54:47.64Z" }, + { url = "https://files.pythonhosted.org/packages/2f/07/1f4f5e2886c480a2346b1e6759c00278b8a69e697ae952d82ae2e6ee5db0/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9", size = 590875, upload-time = "2025-07-01T15:54:48.9Z" }, + { url = "https://files.pythonhosted.org/packages/cc/bc/e6639f1b91c3a55f8c41b47d73e6307051b6e246254a827ede730624c0f8/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba", size = 556636, upload-time = "2025-07-01T15:54:50.619Z" }, + { url = "https://files.pythonhosted.org/packages/05/4c/b3917c45566f9f9a209d38d9b54a1833f2bb1032a3e04c66f75726f28876/rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b", size = 222663, upload-time = "2025-07-01T15:54:52.023Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0b/0851bdd6025775aaa2365bb8de0697ee2558184c800bfef8d7aef5ccde58/rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5", size = 234428, upload-time = "2025-07-01T15:54:53.692Z" }, + { url = "https://files.pythonhosted.org/packages/ed/e8/a47c64ed53149c75fb581e14a237b7b7cd18217e969c30d474d335105622/rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256", size = 222571, upload-time = "2025-07-01T15:54:54.822Z" }, + { url = "https://files.pythonhosted.org/packages/89/bf/3d970ba2e2bcd17d2912cb42874107390f72873e38e79267224110de5e61/rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618", size = 360475, upload-time = "2025-07-01T15:54:56.228Z" }, + { url = "https://files.pythonhosted.org/packages/82/9f/283e7e2979fc4ec2d8ecee506d5a3675fce5ed9b4b7cb387ea5d37c2f18d/rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35", size = 346692, upload-time = "2025-07-01T15:54:58.561Z" }, + { url = "https://files.pythonhosted.org/packages/e3/03/7e50423c04d78daf391da3cc4330bdb97042fc192a58b186f2d5deb7befd/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f", size = 379415, upload-time = "2025-07-01T15:54:59.751Z" }, + { url = "https://files.pythonhosted.org/packages/57/00/d11ee60d4d3b16808432417951c63df803afb0e0fc672b5e8d07e9edaaae/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83", size = 391783, upload-time = "2025-07-01T15:55:00.898Z" }, + { url = "https://files.pythonhosted.org/packages/08/b3/1069c394d9c0d6d23c5b522e1f6546b65793a22950f6e0210adcc6f97c3e/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1", size = 512844, upload-time = "2025-07-01T15:55:02.201Z" }, + { url = "https://files.pythonhosted.org/packages/08/3b/c4fbf0926800ed70b2c245ceca99c49f066456755f5d6eb8863c2c51e6d0/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8", size = 402105, upload-time = "2025-07-01T15:55:03.698Z" }, + { url = "https://files.pythonhosted.org/packages/1c/b0/db69b52ca07413e568dae9dc674627a22297abb144c4d6022c6d78f1e5cc/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f", size = 383440, upload-time = "2025-07-01T15:55:05.398Z" }, + { url = "https://files.pythonhosted.org/packages/4c/e1/c65255ad5b63903e56b3bb3ff9dcc3f4f5c3badde5d08c741ee03903e951/rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed", size = 412759, upload-time = "2025-07-01T15:55:08.316Z" }, + { url = "https://files.pythonhosted.org/packages/e4/22/bb731077872377a93c6e93b8a9487d0406c70208985831034ccdeed39c8e/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632", size = 556032, upload-time = "2025-07-01T15:55:09.52Z" }, + { url = "https://files.pythonhosted.org/packages/e0/8b/393322ce7bac5c4530fb96fc79cc9ea2f83e968ff5f6e873f905c493e1c4/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c", size = 585416, upload-time = "2025-07-01T15:55:11.216Z" }, + { url = "https://files.pythonhosted.org/packages/49/ae/769dc372211835bf759319a7aae70525c6eb523e3371842c65b7ef41c9c6/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0", size = 554049, upload-time = "2025-07-01T15:55:13.004Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f9/4c43f9cc203d6ba44ce3146246cdc38619d92c7bd7bad4946a3491bd5b70/rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9", size = 218428, upload-time = "2025-07-01T15:55:14.486Z" }, + { url = "https://files.pythonhosted.org/packages/7e/8b/9286b7e822036a4a977f2f1e851c7345c20528dbd56b687bb67ed68a8ede/rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9", size = 231524, upload-time = "2025-07-01T15:55:15.745Z" }, + { url = "https://files.pythonhosted.org/packages/51/f2/b5c85b758a00c513bb0389f8fc8e61eb5423050c91c958cdd21843faa3e6/rpds_py-0.26.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f61a9326f80ca59214d1cceb0a09bb2ece5b2563d4e0cd37bfd5515c28510674", size = 373505, upload-time = "2025-07-01T15:56:34.716Z" }, + { url = "https://files.pythonhosted.org/packages/23/e0/25db45e391251118e915e541995bb5f5ac5691a3b98fb233020ba53afc9b/rpds_py-0.26.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:183f857a53bcf4b1b42ef0f57ca553ab56bdd170e49d8091e96c51c3d69ca696", size = 359468, upload-time = "2025-07-01T15:56:36.219Z" }, + { url = "https://files.pythonhosted.org/packages/0b/73/dd5ee6075bb6491be3a646b301dfd814f9486d924137a5098e61f0487e16/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:941c1cfdf4799d623cf3aa1d326a6b4fdb7a5799ee2687f3516738216d2262fb", size = 382680, upload-time = "2025-07-01T15:56:37.644Z" }, + { url = "https://files.pythonhosted.org/packages/2f/10/84b522ff58763a5c443f5bcedc1820240e454ce4e620e88520f04589e2ea/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72a8d9564a717ee291f554eeb4bfeafe2309d5ec0aa6c475170bdab0f9ee8e88", size = 397035, upload-time = "2025-07-01T15:56:39.241Z" }, + { url = "https://files.pythonhosted.org/packages/06/ea/8667604229a10a520fcbf78b30ccc278977dcc0627beb7ea2c96b3becef0/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:511d15193cbe013619dd05414c35a7dedf2088fcee93c6bbb7c77859765bd4e8", size = 514922, upload-time = "2025-07-01T15:56:40.645Z" }, + { url = "https://files.pythonhosted.org/packages/24/e6/9ed5b625c0661c4882fc8cdf302bf8e96c73c40de99c31e0b95ed37d508c/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aea1f9741b603a8d8fedb0ed5502c2bc0accbc51f43e2ad1337fe7259c2b77a5", size = 402822, upload-time = "2025-07-01T15:56:42.137Z" }, + { url = "https://files.pythonhosted.org/packages/8a/58/212c7b6fd51946047fb45d3733da27e2fa8f7384a13457c874186af691b1/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4019a9d473c708cf2f16415688ef0b4639e07abaa569d72f74745bbeffafa2c7", size = 384336, upload-time = "2025-07-01T15:56:44.239Z" }, + { url = "https://files.pythonhosted.org/packages/aa/f5/a40ba78748ae8ebf4934d4b88e77b98497378bc2c24ba55ebe87a4e87057/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:093d63b4b0f52d98ebae33b8c50900d3d67e0666094b1be7a12fffd7f65de74b", size = 416871, upload-time = "2025-07-01T15:56:46.284Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a6/33b1fc0c9f7dcfcfc4a4353daa6308b3ece22496ceece348b3e7a7559a09/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2abe21d8ba64cded53a2a677e149ceb76dcf44284202d737178afe7ba540c1eb", size = 559439, upload-time = "2025-07-01T15:56:48.549Z" }, + { url = "https://files.pythonhosted.org/packages/71/2d/ceb3f9c12f8cfa56d34995097f6cd99da1325642c60d1b6680dd9df03ed8/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:4feb7511c29f8442cbbc28149a92093d32e815a28aa2c50d333826ad2a20fdf0", size = 588380, upload-time = "2025-07-01T15:56:50.086Z" }, + { url = "https://files.pythonhosted.org/packages/c8/ed/9de62c2150ca8e2e5858acf3f4f4d0d180a38feef9fdab4078bea63d8dba/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e99685fc95d386da368013e7fb4269dd39c30d99f812a8372d62f244f662709c", size = 555334, upload-time = "2025-07-01T15:56:51.703Z" }, ] [[package]] @@ -2880,9 +2898,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyasn1" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034 } +sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload-time = "2025-04-16T09:51:18.218Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696 }, + { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" }, ] [[package]] @@ -2892,88 +2910,88 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "ruamel-yaml-clib", marker = "platform_python_implementation == 'CPython'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/39/87/6da0df742a4684263261c253f00edd5829e6aca970fff69e75028cccc547/ruamel.yaml-0.18.14.tar.gz", hash = "sha256:7227b76aaec364df15936730efbf7d72b30c0b79b1d578bbb8e3dcb2d81f52b7", size = 145511 } +sdist = { url = "https://files.pythonhosted.org/packages/39/87/6da0df742a4684263261c253f00edd5829e6aca970fff69e75028cccc547/ruamel.yaml-0.18.14.tar.gz", hash = "sha256:7227b76aaec364df15936730efbf7d72b30c0b79b1d578bbb8e3dcb2d81f52b7", size = 145511, upload-time = "2025-06-09T08:51:09.828Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/6d/6fe4805235e193aad4aaf979160dd1f3c487c57d48b810c816e6e842171b/ruamel.yaml-0.18.14-py3-none-any.whl", hash = "sha256:710ff198bb53da66718c7db27eec4fbcc9aa6ca7204e4c1df2f282b6fe5eb6b2", size = 118570 }, + { url = "https://files.pythonhosted.org/packages/af/6d/6fe4805235e193aad4aaf979160dd1f3c487c57d48b810c816e6e842171b/ruamel.yaml-0.18.14-py3-none-any.whl", hash = "sha256:710ff198bb53da66718c7db27eec4fbcc9aa6ca7204e4c1df2f282b6fe5eb6b2", size = 118570, upload-time = "2025-06-09T08:51:06.348Z" }, ] [[package]] name = "ruamel-yaml-clib" version = "0.2.12" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/8f/683c6ad562f558cbc4f7c029abcd9599148c51c54b5ef0f24f2638da9fbb/ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6", size = 132224 }, - { url = "https://files.pythonhosted.org/packages/3c/d2/b79b7d695e2f21da020bd44c782490578f300dd44f0a4c57a92575758a76/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e", size = 641480 }, - { url = "https://files.pythonhosted.org/packages/68/6e/264c50ce2a31473a9fdbf4fa66ca9b2b17c7455b31ef585462343818bd6c/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e", size = 739068 }, - { url = "https://files.pythonhosted.org/packages/86/29/88c2567bc893c84d88b4c48027367c3562ae69121d568e8a3f3a8d363f4d/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52", size = 703012 }, - { url = "https://files.pythonhosted.org/packages/11/46/879763c619b5470820f0cd6ca97d134771e502776bc2b844d2adb6e37753/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642", size = 704352 }, - { url = "https://files.pythonhosted.org/packages/02/80/ece7e6034256a4186bbe50dee28cd032d816974941a6abf6a9d65e4228a7/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2", size = 737344 }, - { url = "https://files.pythonhosted.org/packages/f0/ca/e4106ac7e80efbabdf4bf91d3d32fc424e41418458251712f5672eada9ce/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1492a6051dab8d912fc2adeef0e8c72216b24d57bd896ea607cb90bb0c4981d3", size = 714498 }, - { url = "https://files.pythonhosted.org/packages/67/58/b1f60a1d591b771298ffa0428237afb092c7f29ae23bad93420b1eb10703/ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4", size = 100205 }, - { url = "https://files.pythonhosted.org/packages/b4/4f/b52f634c9548a9291a70dfce26ca7ebce388235c93588a1068028ea23fcc/ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb", size = 118185 }, - { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433 }, - { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362 }, - { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118 }, - { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497 }, - { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042 }, - { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831 }, - { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692 }, - { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777 }, - { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523 }, - { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011 }, - { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488 }, - { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066 }, - { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785 }, - { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017 }, - { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270 }, - { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059 }, - { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583 }, - { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190 }, +sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315, upload-time = "2024-10-20T10:10:56.22Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/8f/683c6ad562f558cbc4f7c029abcd9599148c51c54b5ef0f24f2638da9fbb/ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6", size = 132224, upload-time = "2024-10-20T10:12:45.162Z" }, + { url = "https://files.pythonhosted.org/packages/3c/d2/b79b7d695e2f21da020bd44c782490578f300dd44f0a4c57a92575758a76/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e", size = 641480, upload-time = "2024-10-20T10:12:46.758Z" }, + { url = "https://files.pythonhosted.org/packages/68/6e/264c50ce2a31473a9fdbf4fa66ca9b2b17c7455b31ef585462343818bd6c/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e", size = 739068, upload-time = "2024-10-20T10:12:48.605Z" }, + { url = "https://files.pythonhosted.org/packages/86/29/88c2567bc893c84d88b4c48027367c3562ae69121d568e8a3f3a8d363f4d/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52", size = 703012, upload-time = "2024-10-20T10:12:51.124Z" }, + { url = "https://files.pythonhosted.org/packages/11/46/879763c619b5470820f0cd6ca97d134771e502776bc2b844d2adb6e37753/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642", size = 704352, upload-time = "2024-10-21T11:26:41.438Z" }, + { url = "https://files.pythonhosted.org/packages/02/80/ece7e6034256a4186bbe50dee28cd032d816974941a6abf6a9d65e4228a7/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2", size = 737344, upload-time = "2024-10-21T11:26:43.62Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ca/e4106ac7e80efbabdf4bf91d3d32fc424e41418458251712f5672eada9ce/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1492a6051dab8d912fc2adeef0e8c72216b24d57bd896ea607cb90bb0c4981d3", size = 714498, upload-time = "2024-12-11T19:58:15.592Z" }, + { url = "https://files.pythonhosted.org/packages/67/58/b1f60a1d591b771298ffa0428237afb092c7f29ae23bad93420b1eb10703/ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4", size = 100205, upload-time = "2024-10-20T10:12:52.865Z" }, + { url = "https://files.pythonhosted.org/packages/b4/4f/b52f634c9548a9291a70dfce26ca7ebce388235c93588a1068028ea23fcc/ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb", size = 118185, upload-time = "2024-10-20T10:12:54.652Z" }, + { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433, upload-time = "2024-10-20T10:12:55.657Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362, upload-time = "2024-10-20T10:12:57.155Z" }, + { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118, upload-time = "2024-10-20T10:12:58.501Z" }, + { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497, upload-time = "2024-10-20T10:13:00.211Z" }, + { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042, upload-time = "2024-10-21T11:26:46.038Z" }, + { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831, upload-time = "2024-10-21T11:26:47.487Z" }, + { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692, upload-time = "2024-12-11T19:58:17.252Z" }, + { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777, upload-time = "2024-10-20T10:13:01.395Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523, upload-time = "2024-10-20T10:13:02.768Z" }, + { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011, upload-time = "2024-10-20T10:13:04.377Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488, upload-time = "2024-10-20T10:13:05.906Z" }, + { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066, upload-time = "2024-10-20T10:13:07.26Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785, upload-time = "2024-10-20T10:13:08.504Z" }, + { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017, upload-time = "2024-10-21T11:26:48.866Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270, upload-time = "2024-10-21T11:26:50.213Z" }, + { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059, upload-time = "2024-12-11T19:58:18.846Z" }, + { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583, upload-time = "2024-10-20T10:13:09.658Z" }, + { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190, upload-time = "2024-10-20T10:13:10.66Z" }, ] [[package]] name = "ruff" -version = "0.12.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9b/ce/8d7dbedede481245b489b769d27e2934730791a9a82765cb94566c6e6abd/ruff-0.12.4.tar.gz", hash = "sha256:13efa16df6c6eeb7d0f091abae50f58e9522f3843edb40d56ad52a5a4a4b6873", size = 5131435 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/9f/517bc5f61bad205b7f36684ffa5415c013862dee02f55f38a217bdbe7aa4/ruff-0.12.4-py3-none-linux_armv6l.whl", hash = "sha256:cb0d261dac457ab939aeb247e804125a5d521b21adf27e721895b0d3f83a0d0a", size = 10188824 }, - { url = "https://files.pythonhosted.org/packages/28/83/691baae5a11fbbde91df01c565c650fd17b0eabed259e8b7563de17c6529/ruff-0.12.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:55c0f4ca9769408d9b9bac530c30d3e66490bd2beb2d3dae3e4128a1f05c7442", size = 10884521 }, - { url = "https://files.pythonhosted.org/packages/d6/8d/756d780ff4076e6dd035d058fa220345f8c458391f7edfb1c10731eedc75/ruff-0.12.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a8224cc3722c9ad9044da7f89c4c1ec452aef2cfe3904365025dd2f51daeae0e", size = 10277653 }, - { url = "https://files.pythonhosted.org/packages/8d/97/8eeee0f48ece153206dce730fc9e0e0ca54fd7f261bb3d99c0a4343a1892/ruff-0.12.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9949d01d64fa3672449a51ddb5d7548b33e130240ad418884ee6efa7a229586", size = 10485993 }, - { url = "https://files.pythonhosted.org/packages/49/b8/22a43d23a1f68df9b88f952616c8508ea6ce4ed4f15353b8168c48b2d7e7/ruff-0.12.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:be0593c69df9ad1465e8a2d10e3defd111fdb62dcd5be23ae2c06da77e8fcffb", size = 10022824 }, - { url = "https://files.pythonhosted.org/packages/cd/70/37c234c220366993e8cffcbd6cadbf332bfc848cbd6f45b02bade17e0149/ruff-0.12.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7dea966bcb55d4ecc4cc3270bccb6f87a337326c9dcd3c07d5b97000dbff41c", size = 11524414 }, - { url = "https://files.pythonhosted.org/packages/14/77/c30f9964f481b5e0e29dd6a1fae1f769ac3fd468eb76fdd5661936edd262/ruff-0.12.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:afcfa3ab5ab5dd0e1c39bf286d829e042a15e966b3726eea79528e2e24d8371a", size = 12419216 }, - { url = "https://files.pythonhosted.org/packages/6e/79/af7fe0a4202dce4ef62c5e33fecbed07f0178f5b4dd9c0d2fcff5ab4a47c/ruff-0.12.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c057ce464b1413c926cdb203a0f858cd52f3e73dcb3270a3318d1630f6395bb3", size = 11976756 }, - { url = "https://files.pythonhosted.org/packages/09/d1/33fb1fc00e20a939c305dbe2f80df7c28ba9193f7a85470b982815a2dc6a/ruff-0.12.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e64b90d1122dc2713330350626b10d60818930819623abbb56535c6466cce045", size = 11020019 }, - { url = "https://files.pythonhosted.org/packages/64/f4/e3cd7f7bda646526f09693e2e02bd83d85fff8a8222c52cf9681c0d30843/ruff-0.12.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2abc48f3d9667fdc74022380b5c745873499ff827393a636f7a59da1515e7c57", size = 11277890 }, - { url = "https://files.pythonhosted.org/packages/5e/d0/69a85fb8b94501ff1a4f95b7591505e8983f38823da6941eb5b6badb1e3a/ruff-0.12.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2b2449dc0c138d877d629bea151bee8c0ae3b8e9c43f5fcaafcd0c0d0726b184", size = 10348539 }, - { url = "https://files.pythonhosted.org/packages/16/a0/91372d1cb1678f7d42d4893b88c252b01ff1dffcad09ae0c51aa2542275f/ruff-0.12.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:56e45bb11f625db55f9b70477062e6a1a04d53628eda7784dce6e0f55fd549eb", size = 10009579 }, - { url = "https://files.pythonhosted.org/packages/23/1b/c4a833e3114d2cc0f677e58f1df6c3b20f62328dbfa710b87a1636a5e8eb/ruff-0.12.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:478fccdb82ca148a98a9ff43658944f7ab5ec41c3c49d77cd99d44da019371a1", size = 10942982 }, - { url = "https://files.pythonhosted.org/packages/ff/ce/ce85e445cf0a5dd8842f2f0c6f0018eedb164a92bdf3eda51984ffd4d989/ruff-0.12.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0fc426bec2e4e5f4c4f182b9d2ce6a75c85ba9bcdbe5c6f2a74fcb8df437df4b", size = 11343331 }, - { url = "https://files.pythonhosted.org/packages/35/cf/441b7fc58368455233cfb5b77206c849b6dfb48b23de532adcc2e50ccc06/ruff-0.12.4-py3-none-win32.whl", hash = "sha256:4de27977827893cdfb1211d42d84bc180fceb7b72471104671c59be37041cf93", size = 10267904 }, - { url = "https://files.pythonhosted.org/packages/ce/7e/20af4a0df5e1299e7368d5ea4350412226afb03d95507faae94c80f00afd/ruff-0.12.4-py3-none-win_amd64.whl", hash = "sha256:fe0b9e9eb23736b453143d72d2ceca5db323963330d5b7859d60d101147d461a", size = 11209038 }, - { url = "https://files.pythonhosted.org/packages/11/02/8857d0dfb8f44ef299a5dfd898f673edefb71e3b533b3b9d2db4c832dd13/ruff-0.12.4-py3-none-win_arm64.whl", hash = "sha256:0618ec4442a83ab545e5b71202a5c0ed7791e8471435b94e655b570a5031a98e", size = 10469336 }, +version = "0.12.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/81/0bd3594fa0f690466e41bd033bdcdf86cba8288345ac77ad4afbe5ec743a/ruff-0.12.7.tar.gz", hash = "sha256:1fc3193f238bc2d7968772c82831a4ff69252f673be371fb49663f0068b7ec71", size = 5197814, upload-time = "2025-07-29T22:32:35.877Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/d2/6cb35e9c85e7a91e8d22ab32ae07ac39cc34a71f1009a6f9e4a2a019e602/ruff-0.12.7-py3-none-linux_armv6l.whl", hash = "sha256:76e4f31529899b8c434c3c1dede98c4483b89590e15fb49f2d46183801565303", size = 11852189, upload-time = "2025-07-29T22:31:41.281Z" }, + { url = "https://files.pythonhosted.org/packages/63/5b/a4136b9921aa84638f1a6be7fb086f8cad0fde538ba76bda3682f2599a2f/ruff-0.12.7-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:789b7a03e72507c54fb3ba6209e4bb36517b90f1a3569ea17084e3fd295500fb", size = 12519389, upload-time = "2025-07-29T22:31:54.265Z" }, + { url = "https://files.pythonhosted.org/packages/a8/c9/3e24a8472484269b6b1821794141f879c54645a111ded4b6f58f9ab0705f/ruff-0.12.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:2e1c2a3b8626339bb6369116e7030a4cf194ea48f49b64bb505732a7fce4f4e3", size = 11743384, upload-time = "2025-07-29T22:31:59.575Z" }, + { url = "https://files.pythonhosted.org/packages/26/7c/458dd25deeb3452c43eaee853c0b17a1e84169f8021a26d500ead77964fd/ruff-0.12.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32dec41817623d388e645612ec70d5757a6d9c035f3744a52c7b195a57e03860", size = 11943759, upload-time = "2025-07-29T22:32:01.95Z" }, + { url = "https://files.pythonhosted.org/packages/7f/8b/658798472ef260ca050e400ab96ef7e85c366c39cf3dfbef4d0a46a528b6/ruff-0.12.7-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47ef751f722053a5df5fa48d412dbb54d41ab9b17875c6840a58ec63ff0c247c", size = 11654028, upload-time = "2025-07-29T22:32:04.367Z" }, + { url = "https://files.pythonhosted.org/packages/a8/86/9c2336f13b2a3326d06d39178fd3448dcc7025f82514d1b15816fe42bfe8/ruff-0.12.7-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a828a5fc25a3efd3e1ff7b241fd392686c9386f20e5ac90aa9234a5faa12c423", size = 13225209, upload-time = "2025-07-29T22:32:06.952Z" }, + { url = "https://files.pythonhosted.org/packages/76/69/df73f65f53d6c463b19b6b312fd2391dc36425d926ec237a7ed028a90fc1/ruff-0.12.7-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5726f59b171111fa6a69d82aef48f00b56598b03a22f0f4170664ff4d8298efb", size = 14182353, upload-time = "2025-07-29T22:32:10.053Z" }, + { url = "https://files.pythonhosted.org/packages/58/1e/de6cda406d99fea84b66811c189b5ea139814b98125b052424b55d28a41c/ruff-0.12.7-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:74e6f5c04c4dd4aba223f4fe6e7104f79e0eebf7d307e4f9b18c18362124bccd", size = 13631555, upload-time = "2025-07-29T22:32:12.644Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ae/625d46d5164a6cc9261945a5e89df24457dc8262539ace3ac36c40f0b51e/ruff-0.12.7-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d0bfe4e77fba61bf2ccadf8cf005d6133e3ce08793bbe870dd1c734f2699a3e", size = 12667556, upload-time = "2025-07-29T22:32:15.312Z" }, + { url = "https://files.pythonhosted.org/packages/55/bf/9cb1ea5e3066779e42ade8d0cd3d3b0582a5720a814ae1586f85014656b6/ruff-0.12.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06bfb01e1623bf7f59ea749a841da56f8f653d641bfd046edee32ede7ff6c606", size = 12939784, upload-time = "2025-07-29T22:32:17.69Z" }, + { url = "https://files.pythonhosted.org/packages/55/7f/7ead2663be5627c04be83754c4f3096603bf5e99ed856c7cd29618c691bd/ruff-0.12.7-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:e41df94a957d50083fd09b916d6e89e497246698c3f3d5c681c8b3e7b9bb4ac8", size = 11771356, upload-time = "2025-07-29T22:32:20.134Z" }, + { url = "https://files.pythonhosted.org/packages/17/40/a95352ea16edf78cd3a938085dccc55df692a4d8ba1b3af7accbe2c806b0/ruff-0.12.7-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4000623300563c709458d0ce170c3d0d788c23a058912f28bbadc6f905d67afa", size = 11612124, upload-time = "2025-07-29T22:32:22.645Z" }, + { url = "https://files.pythonhosted.org/packages/4d/74/633b04871c669e23b8917877e812376827c06df866e1677f15abfadc95cb/ruff-0.12.7-py3-none-musllinux_1_2_i686.whl", hash = "sha256:69ffe0e5f9b2cf2b8e289a3f8945b402a1b19eff24ec389f45f23c42a3dd6fb5", size = 12479945, upload-time = "2025-07-29T22:32:24.765Z" }, + { url = "https://files.pythonhosted.org/packages/be/34/c3ef2d7799c9778b835a76189c6f53c179d3bdebc8c65288c29032e03613/ruff-0.12.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a07a5c8ffa2611a52732bdc67bf88e243abd84fe2d7f6daef3826b59abbfeda4", size = 12998677, upload-time = "2025-07-29T22:32:27.022Z" }, + { url = "https://files.pythonhosted.org/packages/77/ab/aca2e756ad7b09b3d662a41773f3edcbd262872a4fc81f920dc1ffa44541/ruff-0.12.7-py3-none-win32.whl", hash = "sha256:c928f1b2ec59fb77dfdf70e0419408898b63998789cc98197e15f560b9e77f77", size = 11756687, upload-time = "2025-07-29T22:32:29.381Z" }, + { url = "https://files.pythonhosted.org/packages/b4/71/26d45a5042bc71db22ddd8252ca9d01e9ca454f230e2996bb04f16d72799/ruff-0.12.7-py3-none-win_amd64.whl", hash = "sha256:9c18f3d707ee9edf89da76131956aba1270c6348bfee8f6c647de841eac7194f", size = 12912365, upload-time = "2025-07-29T22:32:31.517Z" }, + { url = "https://files.pythonhosted.org/packages/4c/9b/0b8aa09817b63e78d94b4977f18b1fcaead3165a5ee49251c5d5c245bb2d/ruff-0.12.7-py3-none-win_arm64.whl", hash = "sha256:dfce05101dbd11833a0776716d5d1578641b7fddb537fe7fa956ab85d1769b69", size = 11982083, upload-time = "2025-07-29T22:32:33.881Z" }, ] [[package]] name = "s3fs" -version = "2025.5.1" +version = "2025.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiobotocore" }, { name = "aiohttp" }, { name = "fsspec" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7f/6f/d0ee452580d7d0643a1a776b95dfef2144023f3fc077038e07d651995d34/s3fs-2025.5.1.tar.gz", hash = "sha256:84beffa231b8ed94f8d667e93387b38351e1c4447aedea5c2c19dd88b7fcb658", size = 77276 } +sdist = { url = "https://files.pythonhosted.org/packages/bf/13/37438c4672ba1d23ec46df0e4b57e98469e5c5f4f98313cf6842b631652b/s3fs-2025.7.0.tar.gz", hash = "sha256:5e7f9ec0cad7745155e3eb86fae15b1481fa29946bf5b3a4ce3a60701ce6022d", size = 77795, upload-time = "2025-07-15T16:35:22.177Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d5/c0/f5cc95ec88694429fcb841a37456be0a27463bc39d43edbd36e3164120ed/s3fs-2025.5.1-py3-none-any.whl", hash = "sha256:7475e7c40a3a112f17144907ffae50782ab6c03487fe0b45a9c3942bb7a5c606", size = 30476 }, + { url = "https://files.pythonhosted.org/packages/ff/c7/30d13b7fd4f866ca3f30e9a6e7ae038f0c45226f6e26b3cc98d6d197f93b/s3fs-2025.7.0-py3-none-any.whl", hash = "sha256:b6b2d3f84b6aa1c2ba5e62e39dd9410cf54f10a2cce1ea6db1ba0d1a6bcce685", size = 30315, upload-time = "2025-07-15T16:35:20.734Z" }, ] [[package]] name = "segy" -version = "0.4.1.post2" +version = "0.4.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "fsspec" }, @@ -2985,72 +3003,72 @@ dependencies = [ { name = "rapidfuzz" }, { name = "typer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c7/99/b9a14e89212fac2895b1066fe4aae693e347c19497d229c477f9a37500a6/segy-0.4.1.post2.tar.gz", hash = "sha256:e45ab7d6008bd75e490638143329992a61af57916e064086ce559e77e62500e3", size = 60184 } +sdist = { url = "https://files.pythonhosted.org/packages/2c/c6/695be216dc8f9134495ca0a6567c9d60cd0e04aa62128a28822da9f6f7d2/segy-0.4.2.tar.gz", hash = "sha256:3782aed57b0507ac64094ad51284c42f691cf8c1f96c0c00b60ff594232b17d3", size = 59949, upload-time = "2025-07-19T03:01:48.766Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/b2/de392b38bc828b7fed331b329b41282a114eb55d8a54136726afe904effe/segy-0.4.1.post2-py3-none-any.whl", hash = "sha256:2269799ddfa57eb4adef278f0e14b7828c1fd8b192ee9ad4e355ec6fdbe6dd12", size = 54514 }, + { url = "https://files.pythonhosted.org/packages/13/7e/afcfc7fdde60eb4507023350144e3dd6fcb3279599f65a5ac2873d388d1d/segy-0.4.2-py3-none-any.whl", hash = "sha256:270ae0de0e9ad6bf5199d4da0e2097d5583923cfbd4811587dd0add35862db20", size = 54059, upload-time = "2025-07-19T03:01:47.486Z" }, ] [[package]] name = "setuptools" version = "80.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958 } +sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486 }, + { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" }, ] [[package]] name = "shellingham" version = "1.5.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, ] [[package]] name = "six" version = "1.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } 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://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, ] [[package]] name = "snowballstemmer" version = "3.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575 } +sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575, upload-time = "2025-05-09T16:34:51.843Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274 }, + { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload-time = "2025-05-09T16:34:50.371Z" }, ] [[package]] name = "sortedcontainers" version = "2.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594 } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575 }, + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, ] [[package]] name = "soupsieve" version = "2.7" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418 } +sdist = { url = "https://files.pythonhosted.org/packages/3f/f4/4a80cd6ef364b2e8b65b15816a843c0980f7a5a2b4dc701fc574952aa19f/soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a", size = 103418, upload-time = "2025-04-20T18:50:08.518Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677 }, + { url = "https://files.pythonhosted.org/packages/e7/9c/0e6afc12c269578be5c0c1c9f4b49a8d32770a080260c333ac04cc1c832d/soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", size = 36677, upload-time = "2025-04-20T18:50:07.196Z" }, ] [[package]] @@ -3076,9 +3094,9 @@ dependencies = [ { name = "sphinxcontrib-qthelp" }, { name = "sphinxcontrib-serializinghtml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876 } +sdist = { url = "https://files.pythonhosted.org/packages/38/ad/4360e50ed56cb483667b8e6dadf2d3fda62359593faabbe749a27c4eaca6/sphinx-8.2.3.tar.gz", hash = "sha256:398ad29dee7f63a75888314e9424d40f52ce5a6a87ae88e7071e80af296ec348", size = 8321876, upload-time = "2025-03-02T22:31:59.658Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741 }, + { url = "https://files.pythonhosted.org/packages/31/53/136e9eca6e0b9dc0e1962e2c908fbea2e5ac000c2a2fbd9a35797958c48b/sphinx-8.2.3-py3-none-any.whl", hash = "sha256:4405915165f13521d875a8c29c8970800a0141c14cc5416a38feca4ea5d9b9c3", size = 3589741, upload-time = "2025-03-02T22:31:56.836Z" }, ] [[package]] @@ -3093,9 +3111,9 @@ dependencies = [ { name = "watchfiles" }, { name = "websockets" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a5/2c/155e1de2c1ba96a72e5dba152c509a8b41e047ee5c2def9e9f0d812f8be7/sphinx_autobuild-2024.10.3.tar.gz", hash = "sha256:248150f8f333e825107b6d4b86113ab28fa51750e5f9ae63b59dc339be951fb1", size = 14023 } +sdist = { url = "https://files.pythonhosted.org/packages/a5/2c/155e1de2c1ba96a72e5dba152c509a8b41e047ee5c2def9e9f0d812f8be7/sphinx_autobuild-2024.10.3.tar.gz", hash = "sha256:248150f8f333e825107b6d4b86113ab28fa51750e5f9ae63b59dc339be951fb1", size = 14023, upload-time = "2024-10-02T23:15:30.172Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/c0/eba125db38c84d3c74717008fd3cb5000b68cd7e2cbafd1349c6a38c3d3b/sphinx_autobuild-2024.10.3-py3-none-any.whl", hash = "sha256:158e16c36f9d633e613c9aaf81c19b0fc458ca78b112533b20dafcda430d60fa", size = 11908 }, + { url = "https://files.pythonhosted.org/packages/18/c0/eba125db38c84d3c74717008fd3cb5000b68cd7e2cbafd1349c6a38c3d3b/sphinx_autobuild-2024.10.3-py3-none-any.whl", hash = "sha256:158e16c36f9d633e613c9aaf81c19b0fc458ca78b112533b20dafcda430d60fa", size = 11908, upload-time = "2024-10-02T23:15:28.739Z" }, ] [[package]] @@ -3105,9 +3123,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736 } +sdist = { url = "https://files.pythonhosted.org/packages/98/0b/a866924ded68efec7a1759587a4e478aec7559d8165fac8b2ad1c0e774d6/sphinx_basic_ng-1.0.0b2.tar.gz", hash = "sha256:9ec55a47c90c8c002b5960c57492ec3021f5193cb26cebc2dc4ea226848651c9", size = 20736, upload-time = "2023-07-08T18:40:54.166Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496 }, + { url = "https://files.pythonhosted.org/packages/3c/dd/018ce05c532a22007ac58d4f45232514cd9d6dd0ee1dc374e309db830983/sphinx_basic_ng-1.0.0b2-py3-none-any.whl", hash = "sha256:eb09aedbabfb650607e9b4b68c9d240b90b1e1be221d6ad71d61c52e29f7932b", size = 22496, upload-time = "2023-07-08T18:40:52.659Z" }, ] [[package]] @@ -3119,9 +3137,9 @@ dependencies = [ { name = "docutils" }, { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/db/0a/5b1e8d0579dbb4ca8114e456ca4a68020bfe8e15c7001f3856be4929ab83/sphinx_click-6.0.0.tar.gz", hash = "sha256:f5d664321dc0c6622ff019f1e1c84e58ce0cecfddeb510e004cf60c2a3ab465b", size = 29574 } +sdist = { url = "https://files.pythonhosted.org/packages/db/0a/5b1e8d0579dbb4ca8114e456ca4a68020bfe8e15c7001f3856be4929ab83/sphinx_click-6.0.0.tar.gz", hash = "sha256:f5d664321dc0c6622ff019f1e1c84e58ce0cecfddeb510e004cf60c2a3ab465b", size = 29574, upload-time = "2024-05-15T14:49:17.044Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/d7/8621c4726ad3f788a1db4c0c409044b16edc563f5c9542807b3724037555/sphinx_click-6.0.0-py3-none-any.whl", hash = "sha256:1e0a3c83bcb7c55497751b19d07ebe56b5d7b85eb76dd399cf9061b497adc317", size = 9922 }, + { url = "https://files.pythonhosted.org/packages/d0/d7/8621c4726ad3f788a1db4c0c409044b16edc563f5c9542807b3724037555/sphinx_click-6.0.0-py3-none-any.whl", hash = "sha256:1e0a3c83bcb7c55497751b19d07ebe56b5d7b85eb76dd399cf9061b497adc317", size = 9922, upload-time = "2024-05-15T14:49:15.768Z" }, ] [[package]] @@ -3131,9 +3149,9 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039 } +sdist = { url = "https://files.pythonhosted.org/packages/fc/2b/a964715e7f5295f77509e59309959f4125122d648f86b4fe7d70ca1d882c/sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd", size = 23039, upload-time = "2023-04-14T08:10:22.998Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e", size = 13343 }, + { url = "https://files.pythonhosted.org/packages/9e/48/1ea60e74949eecb12cdd6ac43987f9fd331156388dcc2319b45e2ebb81bf/sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e", size = 13343, upload-time = "2023-04-14T08:10:20.844Z" }, ] [[package]] @@ -3143,100 +3161,100 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "sphinx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2b/69/b34e0cb5336f09c6866d53b4a19d76c227cdec1bbc7ac4de63ca7d58c9c7/sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632", size = 2193689 } +sdist = { url = "https://files.pythonhosted.org/packages/2b/69/b34e0cb5336f09c6866d53b4a19d76c227cdec1bbc7ac4de63ca7d58c9c7/sphinx_design-0.6.1.tar.gz", hash = "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632", size = 2193689, upload-time = "2024-08-02T13:48:44.277Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c", size = 2215338 }, + { url = "https://files.pythonhosted.org/packages/c6/43/65c0acbd8cc6f50195a3a1fc195c404988b15c67090e73c7a41a9f57d6bd/sphinx_design-0.6.1-py3-none-any.whl", hash = "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c", size = 2215338, upload-time = "2024-08-02T13:48:42.106Z" }, ] [[package]] name = "sphinxcontrib-applehelp" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053 } +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload-time = "2024-07-29T01:09:00.465Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300 }, + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload-time = "2024-07-29T01:08:58.99Z" }, ] [[package]] name = "sphinxcontrib-devhelp" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967 } +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload-time = "2024-07-29T01:09:23.417Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530 }, + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload-time = "2024-07-29T01:09:21.945Z" }, ] [[package]] name = "sphinxcontrib-htmlhelp" version = "2.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617 } +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload-time = "2024-07-29T01:09:37.889Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705 }, + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload-time = "2024-07-29T01:09:36.407Z" }, ] [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787 } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload-time = "2019-01-21T16:10:16.347Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071 }, + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload-time = "2019-01-21T16:10:14.333Z" }, ] [[package]] name = "sphinxcontrib-qthelp" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165 } +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload-time = "2024-07-29T01:09:56.435Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743 }, + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload-time = "2024-07-29T01:09:54.885Z" }, ] [[package]] name = "sphinxcontrib-serializinghtml" version = "2.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080 } +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload-time = "2024-07-29T01:10:09.332Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072 }, + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" }, ] [[package]] name = "sqlalchemy" -version = "2.0.41" +version = "2.0.42" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/63/66/45b165c595ec89aa7dcc2c1cd222ab269bc753f1fc7a1e68f8481bd957bf/sqlalchemy-2.0.41.tar.gz", hash = "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9", size = 9689424 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/37/4e/b00e3ffae32b74b5180e15d2ab4040531ee1bef4c19755fe7926622dc958/sqlalchemy-2.0.41-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6375cd674fe82d7aa9816d1cb96ec592bac1726c11e0cafbf40eeee9a4516b5f", size = 2121232 }, - { url = "https://files.pythonhosted.org/packages/ef/30/6547ebb10875302074a37e1970a5dce7985240665778cfdee2323709f749/sqlalchemy-2.0.41-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f8c9fdd15a55d9465e590a402f42082705d66b05afc3ffd2d2eb3c6ba919560", size = 2110897 }, - { url = "https://files.pythonhosted.org/packages/9e/21/59df2b41b0f6c62da55cd64798232d7349a9378befa7f1bb18cf1dfd510a/sqlalchemy-2.0.41-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f9dc8c44acdee06c8fc6440db9eae8b4af8b01e4b1aee7bdd7241c22edff4f", size = 3273313 }, - { url = "https://files.pythonhosted.org/packages/62/e4/b9a7a0e5c6f79d49bcd6efb6e90d7536dc604dab64582a9dec220dab54b6/sqlalchemy-2.0.41-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c11ceb9a1f482c752a71f203a81858625d8df5746d787a4786bca4ffdf71c6", size = 3273807 }, - { url = "https://files.pythonhosted.org/packages/39/d8/79f2427251b44ddee18676c04eab038d043cff0e764d2d8bb08261d6135d/sqlalchemy-2.0.41-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:911cc493ebd60de5f285bcae0491a60b4f2a9f0f5c270edd1c4dbaef7a38fc04", size = 3209632 }, - { url = "https://files.pythonhosted.org/packages/d4/16/730a82dda30765f63e0454918c982fb7193f6b398b31d63c7c3bd3652ae5/sqlalchemy-2.0.41-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03968a349db483936c249f4d9cd14ff2c296adfa1290b660ba6516f973139582", size = 3233642 }, - { url = "https://files.pythonhosted.org/packages/04/61/c0d4607f7799efa8b8ea3c49b4621e861c8f5c41fd4b5b636c534fcb7d73/sqlalchemy-2.0.41-cp311-cp311-win32.whl", hash = "sha256:293cd444d82b18da48c9f71cd7005844dbbd06ca19be1ccf6779154439eec0b8", size = 2086475 }, - { url = "https://files.pythonhosted.org/packages/9d/8e/8344f8ae1cb6a479d0741c02cd4f666925b2bf02e2468ddaf5ce44111f30/sqlalchemy-2.0.41-cp311-cp311-win_amd64.whl", hash = "sha256:3d3549fc3e40667ec7199033a4e40a2f669898a00a7b18a931d3efb4c7900504", size = 2110903 }, - { url = "https://files.pythonhosted.org/packages/3e/2a/f1f4e068b371154740dd10fb81afb5240d5af4aa0087b88d8b308b5429c2/sqlalchemy-2.0.41-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:81f413674d85cfd0dfcd6512e10e0f33c19c21860342a4890c3a2b59479929f9", size = 2119645 }, - { url = "https://files.pythonhosted.org/packages/9b/e8/c664a7e73d36fbfc4730f8cf2bf930444ea87270f2825efbe17bf808b998/sqlalchemy-2.0.41-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:598d9ebc1e796431bbd068e41e4de4dc34312b7aa3292571bb3674a0cb415dd1", size = 2107399 }, - { url = "https://files.pythonhosted.org/packages/5c/78/8a9cf6c5e7135540cb682128d091d6afa1b9e48bd049b0d691bf54114f70/sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a104c5694dfd2d864a6f91b0956eb5d5883234119cb40010115fd45a16da5e70", size = 3293269 }, - { url = "https://files.pythonhosted.org/packages/3c/35/f74add3978c20de6323fb11cb5162702670cc7a9420033befb43d8d5b7a4/sqlalchemy-2.0.41-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6145afea51ff0af7f2564a05fa95eb46f542919e6523729663a5d285ecb3cf5e", size = 3303364 }, - { url = "https://files.pythonhosted.org/packages/6a/d4/c990f37f52c3f7748ebe98883e2a0f7d038108c2c5a82468d1ff3eec50b7/sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b46fa6eae1cd1c20e6e6f44e19984d438b6b2d8616d21d783d150df714f44078", size = 3229072 }, - { url = "https://files.pythonhosted.org/packages/15/69/cab11fecc7eb64bc561011be2bd03d065b762d87add52a4ca0aca2e12904/sqlalchemy-2.0.41-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41836fe661cc98abfae476e14ba1906220f92c4e528771a8a3ae6a151242d2ae", size = 3268074 }, - { url = "https://files.pythonhosted.org/packages/5c/ca/0c19ec16858585d37767b167fc9602593f98998a68a798450558239fb04a/sqlalchemy-2.0.41-cp312-cp312-win32.whl", hash = "sha256:a8808d5cf866c781150d36a3c8eb3adccfa41a8105d031bf27e92c251e3969d6", size = 2084514 }, - { url = "https://files.pythonhosted.org/packages/7f/23/4c2833d78ff3010a4e17f984c734f52b531a8c9060a50429c9d4b0211be6/sqlalchemy-2.0.41-cp312-cp312-win_amd64.whl", hash = "sha256:5b14e97886199c1f52c14629c11d90c11fbb09e9334fa7bb5f6d068d9ced0ce0", size = 2111557 }, - { url = "https://files.pythonhosted.org/packages/d3/ad/2e1c6d4f235a97eeef52d0200d8ddda16f6c4dd70ae5ad88c46963440480/sqlalchemy-2.0.41-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4eeb195cdedaf17aab6b247894ff2734dcead6c08f748e617bfe05bd5a218443", size = 2115491 }, - { url = "https://files.pythonhosted.org/packages/cf/8d/be490e5db8400dacc89056f78a52d44b04fbf75e8439569d5b879623a53b/sqlalchemy-2.0.41-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d4ae769b9c1c7757e4ccce94b0641bc203bbdf43ba7a2413ab2523d8d047d8dc", size = 2102827 }, - { url = "https://files.pythonhosted.org/packages/a0/72/c97ad430f0b0e78efaf2791342e13ffeafcbb3c06242f01a3bb8fe44f65d/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a62448526dd9ed3e3beedc93df9bb6b55a436ed1474db31a2af13b313a70a7e1", size = 3225224 }, - { url = "https://files.pythonhosted.org/packages/5e/51/5ba9ea3246ea068630acf35a6ba0d181e99f1af1afd17e159eac7e8bc2b8/sqlalchemy-2.0.41-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc56c9788617b8964ad02e8fcfeed4001c1f8ba91a9e1f31483c0dffb207002a", size = 3230045 }, - { url = "https://files.pythonhosted.org/packages/78/2f/8c14443b2acea700c62f9b4a8bad9e49fc1b65cfb260edead71fd38e9f19/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c153265408d18de4cc5ded1941dcd8315894572cddd3c58df5d5b5705b3fa28d", size = 3159357 }, - { url = "https://files.pythonhosted.org/packages/fc/b2/43eacbf6ccc5276d76cea18cb7c3d73e294d6fb21f9ff8b4eef9b42bbfd5/sqlalchemy-2.0.41-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f67766965996e63bb46cfbf2ce5355fc32d9dd3b8ad7e536a920ff9ee422e23", size = 3197511 }, - { url = "https://files.pythonhosted.org/packages/fa/2e/677c17c5d6a004c3c45334ab1dbe7b7deb834430b282b8a0f75ae220c8eb/sqlalchemy-2.0.41-cp313-cp313-win32.whl", hash = "sha256:bfc9064f6658a3d1cadeaa0ba07570b83ce6801a1314985bf98ec9b95d74e15f", size = 2082420 }, - { url = "https://files.pythonhosted.org/packages/e9/61/e8c1b9b6307c57157d328dd8b8348ddc4c47ffdf1279365a13b2b98b8049/sqlalchemy-2.0.41-cp313-cp313-win_amd64.whl", hash = "sha256:82ca366a844eb551daff9d2e6e7a9e5e76d2612c8564f58db6c19a726869c1df", size = 2108329 }, - { url = "https://files.pythonhosted.org/packages/1c/fc/9ba22f01b5cdacc8f5ed0d22304718d2c758fce3fd49a5372b886a86f37c/sqlalchemy-2.0.41-py3-none-any.whl", hash = "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576", size = 1911224 }, +sdist = { url = "https://files.pythonhosted.org/packages/5a/03/a0af991e3a43174d6b83fca4fb399745abceddd1171bdabae48ce877ff47/sqlalchemy-2.0.42.tar.gz", hash = "sha256:160bedd8a5c28765bd5be4dec2d881e109e33b34922e50a3b881a7681773ac5f", size = 9749972, upload-time = "2025-07-29T12:48:09.323Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/3c/7bfd65f3c2046e2fb4475b21fa0b9d7995f8c08bfa0948df7a4d2d0de869/sqlalchemy-2.0.42-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c34100c0b7ea31fbc113c124bcf93a53094f8951c7bf39c45f39d327bad6d1e7", size = 2133779, upload-time = "2025-07-29T13:25:18.446Z" }, + { url = "https://files.pythonhosted.org/packages/66/17/19be542fe9dd64a766090e90e789e86bdaa608affda6b3c1e118a25a2509/sqlalchemy-2.0.42-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ad59dbe4d1252448c19d171dfba14c74e7950b46dc49d015722a4a06bfdab2b0", size = 2123843, upload-time = "2025-07-29T13:25:19.749Z" }, + { url = "https://files.pythonhosted.org/packages/14/fc/83e45fc25f0acf1c26962ebff45b4c77e5570abb7c1a425a54b00bcfa9c7/sqlalchemy-2.0.42-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f9187498c2149919753a7fd51766ea9c8eecdec7da47c1b955fa8090bc642eaa", size = 3294824, upload-time = "2025-07-29T13:29:03.879Z" }, + { url = "https://files.pythonhosted.org/packages/b9/81/421efc09837104cd1a267d68b470e5b7b6792c2963b8096ca1e060ba0975/sqlalchemy-2.0.42-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f092cf83ebcafba23a247f5e03f99f5436e3ef026d01c8213b5eca48ad6efa9", size = 3294662, upload-time = "2025-07-29T13:24:53.715Z" }, + { url = "https://files.pythonhosted.org/packages/2f/ba/55406e09d32ed5e5f9e8aaec5ef70c4f20b4ae25b9fa9784f4afaa28e7c3/sqlalchemy-2.0.42-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc6afee7e66fdba4f5a68610b487c1f754fccdc53894a9567785932dbb6a265e", size = 3229413, upload-time = "2025-07-29T13:29:05.638Z" }, + { url = "https://files.pythonhosted.org/packages/d4/c4/df596777fce27bde2d1a4a2f5a7ddea997c0c6d4b5246aafba966b421cc0/sqlalchemy-2.0.42-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:260ca1d2e5910f1f1ad3fe0113f8fab28657cee2542cb48c2f342ed90046e8ec", size = 3255563, upload-time = "2025-07-29T13:24:55.17Z" }, + { url = "https://files.pythonhosted.org/packages/16/ed/b9c4a939b314400f43f972c9eb0091da59d8466ef9c51d0fd5b449edc495/sqlalchemy-2.0.42-cp311-cp311-win32.whl", hash = "sha256:2eb539fd83185a85e5fcd6b19214e1c734ab0351d81505b0f987705ba0a1e231", size = 2098513, upload-time = "2025-07-29T13:23:58.946Z" }, + { url = "https://files.pythonhosted.org/packages/91/72/55b0c34e39feb81991aa3c974d85074c356239ac1170dfb81a474b4c23b3/sqlalchemy-2.0.42-cp311-cp311-win_amd64.whl", hash = "sha256:9193fa484bf00dcc1804aecbb4f528f1123c04bad6a08d7710c909750fa76aeb", size = 2123380, upload-time = "2025-07-29T13:24:00.155Z" }, + { url = "https://files.pythonhosted.org/packages/61/66/ac31a9821fc70a7376321fb2c70fdd7eadbc06dadf66ee216a22a41d6058/sqlalchemy-2.0.42-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:09637a0872689d3eb71c41e249c6f422e3e18bbd05b4cd258193cfc7a9a50da2", size = 2132203, upload-time = "2025-07-29T13:29:19.291Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ba/fd943172e017f955d7a8b3a94695265b7114efe4854feaa01f057e8f5293/sqlalchemy-2.0.42-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a3cb3ec67cc08bea54e06b569398ae21623534a7b1b23c258883a7c696ae10df", size = 2120373, upload-time = "2025-07-29T13:29:21.049Z" }, + { url = "https://files.pythonhosted.org/packages/ea/a2/b5f7d233d063ffadf7e9fff3898b42657ba154a5bec95a96f44cba7f818b/sqlalchemy-2.0.42-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e87e6a5ef6f9d8daeb2ce5918bf5fddecc11cae6a7d7a671fcc4616c47635e01", size = 3317685, upload-time = "2025-07-29T13:26:40.837Z" }, + { url = "https://files.pythonhosted.org/packages/86/00/fcd8daab13a9119d41f3e485a101c29f5d2085bda459154ba354c616bf4e/sqlalchemy-2.0.42-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b718011a9d66c0d2f78e1997755cd965f3414563b31867475e9bc6efdc2281d", size = 3326967, upload-time = "2025-07-29T13:22:31.009Z" }, + { url = "https://files.pythonhosted.org/packages/a3/85/e622a273d648d39d6771157961956991a6d760e323e273d15e9704c30ccc/sqlalchemy-2.0.42-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:16d9b544873fe6486dddbb859501a07d89f77c61d29060bb87d0faf7519b6a4d", size = 3255331, upload-time = "2025-07-29T13:26:42.579Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a0/2c2338b592c7b0a61feffd005378c084b4c01fabaf1ed5f655ab7bd446f0/sqlalchemy-2.0.42-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21bfdf57abf72fa89b97dd74d3187caa3172a78c125f2144764a73970810c4ee", size = 3291791, upload-time = "2025-07-29T13:22:32.454Z" }, + { url = "https://files.pythonhosted.org/packages/41/19/b8a2907972a78285fdce4c880ecaab3c5067eb726882ca6347f7a4bf64f6/sqlalchemy-2.0.42-cp312-cp312-win32.whl", hash = "sha256:78b46555b730a24901ceb4cb901c6b45c9407f8875209ed3c5d6bcd0390a6ed1", size = 2096180, upload-time = "2025-07-29T13:16:08.952Z" }, + { url = "https://files.pythonhosted.org/packages/48/1f/67a78f3dfd08a2ed1c7be820fe7775944f5126080b5027cc859084f8e223/sqlalchemy-2.0.42-cp312-cp312-win_amd64.whl", hash = "sha256:4c94447a016f36c4da80072e6c6964713b0af3c8019e9c4daadf21f61b81ab53", size = 2123533, upload-time = "2025-07-29T13:16:11.705Z" }, + { url = "https://files.pythonhosted.org/packages/e9/7e/25d8c28b86730c9fb0e09156f601d7a96d1c634043bf8ba36513eb78887b/sqlalchemy-2.0.42-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:941804f55c7d507334da38133268e3f6e5b0340d584ba0f277dd884197f4ae8c", size = 2127905, upload-time = "2025-07-29T13:29:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/e5/a1/9d8c93434d1d983880d976400fcb7895a79576bd94dca61c3b7b90b1ed0d/sqlalchemy-2.0.42-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:95d3d06a968a760ce2aa6a5889fefcbdd53ca935735e0768e1db046ec08cbf01", size = 2115726, upload-time = "2025-07-29T13:29:23.496Z" }, + { url = "https://files.pythonhosted.org/packages/a2/cc/d33646fcc24c87cc4e30a03556b611a4e7bcfa69a4c935bffb923e3c89f4/sqlalchemy-2.0.42-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cf10396a8a700a0f38ccd220d940be529c8f64435c5d5b29375acab9267a6c9", size = 3246007, upload-time = "2025-07-29T13:26:44.166Z" }, + { url = "https://files.pythonhosted.org/packages/67/08/4e6c533d4c7f5e7c4cbb6fe8a2c4e813202a40f05700d4009a44ec6e236d/sqlalchemy-2.0.42-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9cae6c2b05326d7c2c7c0519f323f90e0fb9e8afa783c6a05bb9ee92a90d0f04", size = 3250919, upload-time = "2025-07-29T13:22:33.74Z" }, + { url = "https://files.pythonhosted.org/packages/5c/82/f680e9a636d217aece1b9a8030d18ad2b59b5e216e0c94e03ad86b344af3/sqlalchemy-2.0.42-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f50f7b20677b23cfb35b6afcd8372b2feb348a38e3033f6447ee0704540be894", size = 3180546, upload-time = "2025-07-29T13:26:45.648Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a2/8c8f6325f153894afa3775584c429cc936353fb1db26eddb60a549d0ff4b/sqlalchemy-2.0.42-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9d88a1c0d66d24e229e3938e1ef16ebdbd2bf4ced93af6eff55225f7465cf350", size = 3216683, upload-time = "2025-07-29T13:22:34.977Z" }, + { url = "https://files.pythonhosted.org/packages/39/44/3a451d7fa4482a8ffdf364e803ddc2cfcafc1c4635fb366f169ecc2c3b11/sqlalchemy-2.0.42-cp313-cp313-win32.whl", hash = "sha256:45c842c94c9ad546c72225a0c0d1ae8ef3f7c212484be3d429715a062970e87f", size = 2093990, upload-time = "2025-07-29T13:16:13.036Z" }, + { url = "https://files.pythonhosted.org/packages/4b/9e/9bce34f67aea0251c8ac104f7bdb2229d58fb2e86a4ad8807999c4bee34b/sqlalchemy-2.0.42-cp313-cp313-win_amd64.whl", hash = "sha256:eb9905f7f1e49fd57a7ed6269bc567fcbbdac9feadff20ad6bd7707266a91577", size = 2120473, upload-time = "2025-07-29T13:16:14.502Z" }, + { url = "https://files.pythonhosted.org/packages/ee/55/ba2546ab09a6adebc521bf3974440dc1d8c06ed342cceb30ed62a8858835/sqlalchemy-2.0.42-py3-none-any.whl", hash = "sha256:defcdff7e661f0043daa381832af65d616e060ddb54d3fe4476f51df7eaa1835", size = 1922072, upload-time = "2025-07-29T13:09:17.061Z" }, ] [[package]] @@ -3248,107 +3266,107 @@ dependencies = [ { name = "executing" }, { name = "pure-eval" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707 } +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521 }, + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, ] [[package]] name = "starlette" -version = "0.47.1" +version = "0.47.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0a/69/662169fdb92fb96ec3eaee218cf540a629d629c86d7993d9651226a6789b/starlette-0.47.1.tar.gz", hash = "sha256:aef012dd2b6be325ffa16698f9dc533614fb1cebd593a906b90dc1025529a79b", size = 2583072 } +sdist = { url = "https://files.pythonhosted.org/packages/04/57/d062573f391d062710d4088fa1369428c38d51460ab6fedff920efef932e/starlette-0.47.2.tar.gz", hash = "sha256:6ae9aa5db235e4846decc1e7b79c4f346adf41e9777aebeb49dfd09bbd7023d8", size = 2583948, upload-time = "2025-07-20T17:31:58.522Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/82/95/38ef0cd7fa11eaba6a99b3c4f5ac948d8bc6ff199aabd327a29cc000840c/starlette-0.47.1-py3-none-any.whl", hash = "sha256:5e11c9f5c7c3f24959edbf2dffdc01bba860228acf657129467d8a7468591527", size = 72747 }, + { url = "https://files.pythonhosted.org/packages/f7/1f/b876b1f83aef204198a42dc101613fefccb32258e5428b5f9259677864b4/starlette-0.47.2-py3-none-any.whl", hash = "sha256:c5847e96134e5c5371ee9fac6fdf1a67336d5815e09eb2a01fdb57a351ef915b", size = 72984, upload-time = "2025-07-20T17:31:56.738Z" }, ] [[package]] name = "tabulate" version = "0.9.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090 } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload-time = "2022-10-06T17:21:48.54Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252 }, + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload-time = "2022-10-06T17:21:44.262Z" }, ] [[package]] name = "tblib" version = "3.1.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/95/4b3044ec4bf248186769629bbfb495a458deb6e4c1f9eff7f298ae1e336e/tblib-3.1.0.tar.gz", hash = "sha256:06404c2c9f07f66fee2d7d6ad43accc46f9c3361714d9b8426e7f47e595cd652", size = 30766 } +sdist = { url = "https://files.pythonhosted.org/packages/54/95/4b3044ec4bf248186769629bbfb495a458deb6e4c1f9eff7f298ae1e336e/tblib-3.1.0.tar.gz", hash = "sha256:06404c2c9f07f66fee2d7d6ad43accc46f9c3361714d9b8426e7f47e595cd652", size = 30766, upload-time = "2025-03-31T12:58:27.473Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/27/44/aa5c8b10b2cce7a053018e0d132bd58e27527a0243c4985383d5b6fd93e9/tblib-3.1.0-py3-none-any.whl", hash = "sha256:670bb4582578134b3d81a84afa1b016128b429f3d48e6cbbaecc9d15675e984e", size = 12552 }, + { url = "https://files.pythonhosted.org/packages/27/44/aa5c8b10b2cce7a053018e0d132bd58e27527a0243c4985383d5b6fd93e9/tblib-3.1.0-py3-none-any.whl", hash = "sha256:670bb4582578134b3d81a84afa1b016128b429f3d48e6cbbaecc9d15675e984e", size = 12552, upload-time = "2025-03-31T12:58:26.142Z" }, ] [[package]] name = "tomli" version = "2.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077 }, - { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429 }, - { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067 }, - { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030 }, - { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898 }, - { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894 }, - { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319 }, - { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273 }, - { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310 }, - { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309 }, - { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762 }, - { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453 }, - { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486 }, - { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349 }, - { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159 }, - { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243 }, - { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645 }, - { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584 }, - { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875 }, - { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418 }, - { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708 }, - { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582 }, - { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543 }, - { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691 }, - { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170 }, - { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530 }, - { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666 }, - { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954 }, - { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724 }, - { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383 }, - { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257 }, +sdist = { url = "https://files.pythonhosted.org/packages/18/87/302344fed471e44a87289cf4967697d07e532f2421fdaf868a303cbae4ff/tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff", size = 17175, upload-time = "2024-11-27T22:38:36.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/ca/75707e6efa2b37c77dadb324ae7d9571cb424e61ea73fad7c56c2d14527f/tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249", size = 131077, upload-time = "2024-11-27T22:37:54.956Z" }, + { url = "https://files.pythonhosted.org/packages/c7/16/51ae563a8615d472fdbffc43a3f3d46588c264ac4f024f63f01283becfbb/tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6", size = 123429, upload-time = "2024-11-27T22:37:56.698Z" }, + { url = "https://files.pythonhosted.org/packages/f1/dd/4f6cd1e7b160041db83c694abc78e100473c15d54620083dbd5aae7b990e/tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a", size = 226067, upload-time = "2024-11-27T22:37:57.63Z" }, + { url = "https://files.pythonhosted.org/packages/a9/6b/c54ede5dc70d648cc6361eaf429304b02f2871a345bbdd51e993d6cdf550/tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee", size = 236030, upload-time = "2024-11-27T22:37:59.344Z" }, + { url = "https://files.pythonhosted.org/packages/1f/47/999514fa49cfaf7a92c805a86c3c43f4215621855d151b61c602abb38091/tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e", size = 240898, upload-time = "2024-11-27T22:38:00.429Z" }, + { url = "https://files.pythonhosted.org/packages/73/41/0a01279a7ae09ee1573b423318e7934674ce06eb33f50936655071d81a24/tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4", size = 229894, upload-time = "2024-11-27T22:38:02.094Z" }, + { url = "https://files.pythonhosted.org/packages/55/18/5d8bc5b0a0362311ce4d18830a5d28943667599a60d20118074ea1b01bb7/tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106", size = 245319, upload-time = "2024-11-27T22:38:03.206Z" }, + { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273, upload-time = "2024-11-27T22:38:04.217Z" }, + { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310, upload-time = "2024-11-27T22:38:05.908Z" }, + { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309, upload-time = "2024-11-27T22:38:06.812Z" }, + { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762, upload-time = "2024-11-27T22:38:07.731Z" }, + { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453, upload-time = "2024-11-27T22:38:09.384Z" }, + { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486, upload-time = "2024-11-27T22:38:10.329Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349, upload-time = "2024-11-27T22:38:11.443Z" }, + { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159, upload-time = "2024-11-27T22:38:13.099Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243, upload-time = "2024-11-27T22:38:14.766Z" }, + { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645, upload-time = "2024-11-27T22:38:15.843Z" }, + { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload-time = "2024-11-27T22:38:17.645Z" }, + { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875, upload-time = "2024-11-27T22:38:19.159Z" }, + { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418, upload-time = "2024-11-27T22:38:20.064Z" }, + { url = "https://files.pythonhosted.org/packages/04/90/2ee5f2e0362cb8a0b6499dc44f4d7d48f8fff06d28ba46e6f1eaa61a1388/tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7", size = 132708, upload-time = "2024-11-27T22:38:21.659Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ec/46b4108816de6b385141f082ba99e315501ccd0a2ea23db4a100dd3990ea/tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c", size = 123582, upload-time = "2024-11-27T22:38:22.693Z" }, + { url = "https://files.pythonhosted.org/packages/a0/bd/b470466d0137b37b68d24556c38a0cc819e8febe392d5b199dcd7f578365/tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13", size = 232543, upload-time = "2024-11-27T22:38:24.367Z" }, + { url = "https://files.pythonhosted.org/packages/d9/e5/82e80ff3b751373f7cead2815bcbe2d51c895b3c990686741a8e56ec42ab/tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281", size = 241691, upload-time = "2024-11-27T22:38:26.081Z" }, + { url = "https://files.pythonhosted.org/packages/05/7e/2a110bc2713557d6a1bfb06af23dd01e7dde52b6ee7dadc589868f9abfac/tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272", size = 251170, upload-time = "2024-11-27T22:38:27.921Z" }, + { url = "https://files.pythonhosted.org/packages/64/7b/22d713946efe00e0adbcdfd6d1aa119ae03fd0b60ebed51ebb3fa9f5a2e5/tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140", size = 236530, upload-time = "2024-11-27T22:38:29.591Z" }, + { url = "https://files.pythonhosted.org/packages/38/31/3a76f67da4b0cf37b742ca76beaf819dca0ebef26d78fc794a576e08accf/tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2", size = 258666, upload-time = "2024-11-27T22:38:30.639Z" }, + { url = "https://files.pythonhosted.org/packages/07/10/5af1293da642aded87e8a988753945d0cf7e00a9452d3911dd3bb354c9e2/tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744", size = 243954, upload-time = "2024-11-27T22:38:31.702Z" }, + { url = "https://files.pythonhosted.org/packages/5b/b9/1ed31d167be802da0fc95020d04cd27b7d7065cc6fbefdd2f9186f60d7bd/tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec", size = 98724, upload-time = "2024-11-27T22:38:32.837Z" }, + { url = "https://files.pythonhosted.org/packages/c7/32/b0963458706accd9afcfeb867c0f9175a741bf7b19cd424230714d722198/tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69", size = 109383, upload-time = "2024-11-27T22:38:34.455Z" }, + { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" }, ] [[package]] name = "toolz" version = "1.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/0b/d80dfa675bf592f636d1ea0b835eab4ec8df6e9415d8cfd766df54456123/toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02", size = 66790 } +sdist = { url = "https://files.pythonhosted.org/packages/8a/0b/d80dfa675bf592f636d1ea0b835eab4ec8df6e9415d8cfd766df54456123/toolz-1.0.0.tar.gz", hash = "sha256:2c86e3d9a04798ac556793bced838816296a2f085017664e4995cb40a1047a02", size = 66790, upload-time = "2024-10-04T16:17:04.001Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/03/98/eb27cc78ad3af8e302c9d8ff4977f5026676e130d28dd7578132a457170c/toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236", size = 56383 }, + { url = "https://files.pythonhosted.org/packages/03/98/eb27cc78ad3af8e302c9d8ff4977f5026676e130d28dd7578132a457170c/toolz-1.0.0-py3-none-any.whl", hash = "sha256:292c8f1c4e7516bf9086f8850935c799a874039c8bcf959d47b600e4c44a6236", size = 56383, upload-time = "2024-10-04T16:17:01.533Z" }, ] [[package]] name = "tornado" version = "6.5.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934 } +sdist = { url = "https://files.pythonhosted.org/packages/51/89/c72771c81d25d53fe33e3dca61c233b665b2780f21820ba6fd2c6793c12b/tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c", size = 509934, upload-time = "2025-05-22T18:15:38.788Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948 }, - { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112 }, - { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672 }, - { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019 }, - { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252 }, - { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930 }, - { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351 }, - { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328 }, - { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396 }, - { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840 }, - { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596 }, + { url = "https://files.pythonhosted.org/packages/77/89/f4532dee6843c9e0ebc4e28d4be04c67f54f60813e4bf73d595fe7567452/tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7", size = 441948, upload-time = "2025-05-22T18:15:20.862Z" }, + { url = "https://files.pythonhosted.org/packages/15/9a/557406b62cffa395d18772e0cdcf03bed2fff03b374677348eef9f6a3792/tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6", size = 440112, upload-time = "2025-05-22T18:15:22.591Z" }, + { url = "https://files.pythonhosted.org/packages/55/82/7721b7319013a3cf881f4dffa4f60ceff07b31b394e459984e7a36dc99ec/tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888", size = 443672, upload-time = "2025-05-22T18:15:24.027Z" }, + { url = "https://files.pythonhosted.org/packages/7d/42/d11c4376e7d101171b94e03cef0cbce43e823ed6567ceda571f54cf6e3ce/tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331", size = 443019, upload-time = "2025-05-22T18:15:25.735Z" }, + { url = "https://files.pythonhosted.org/packages/7d/f7/0c48ba992d875521ac761e6e04b0a1750f8150ae42ea26df1852d6a98942/tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e", size = 443252, upload-time = "2025-05-22T18:15:27.499Z" }, + { url = "https://files.pythonhosted.org/packages/89/46/d8d7413d11987e316df4ad42e16023cd62666a3c0dfa1518ffa30b8df06c/tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401", size = 443930, upload-time = "2025-05-22T18:15:29.299Z" }, + { url = "https://files.pythonhosted.org/packages/78/b2/f8049221c96a06df89bed68260e8ca94beca5ea532ffc63b1175ad31f9cc/tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692", size = 443351, upload-time = "2025-05-22T18:15:31.038Z" }, + { url = "https://files.pythonhosted.org/packages/76/ff/6a0079e65b326cc222a54720a748e04a4db246870c4da54ece4577bfa702/tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a", size = 443328, upload-time = "2025-05-22T18:15:32.426Z" }, + { url = "https://files.pythonhosted.org/packages/49/18/e3f902a1d21f14035b5bc6246a8c0f51e0eef562ace3a2cea403c1fb7021/tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365", size = 444396, upload-time = "2025-05-22T18:15:34.205Z" }, + { url = "https://files.pythonhosted.org/packages/7b/09/6526e32bf1049ee7de3bebba81572673b19a2a8541f795d887e92af1a8bc/tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b", size = 444840, upload-time = "2025-05-22T18:15:36.1Z" }, + { url = "https://files.pythonhosted.org/packages/55/a7/535c44c7bea4578e48281d83c615219f3ab19e6abc67625ef637c73987be/tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7", size = 443596, upload-time = "2025-05-22T18:15:37.433Z" }, ] [[package]] @@ -3358,18 +3376,18 @@ source = { registry = "https://pypi.org/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://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } 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://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, ] [[package]] name = "traitlets" version = "5.14.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621 } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359 }, + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, ] [[package]] @@ -3379,14 +3397,14 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c7/68/71c1a15b5f65f40e91b65da23b8224dad41349894535a97f63a52e462196/typeguard-4.4.4.tar.gz", hash = "sha256:3a7fd2dffb705d4d0efaed4306a704c89b9dee850b688f060a8b1615a79e5f74", size = 75203 } +sdist = { url = "https://files.pythonhosted.org/packages/c7/68/71c1a15b5f65f40e91b65da23b8224dad41349894535a97f63a52e462196/typeguard-4.4.4.tar.gz", hash = "sha256:3a7fd2dffb705d4d0efaed4306a704c89b9dee850b688f060a8b1615a79e5f74", size = 75203, upload-time = "2025-06-18T09:56:07.624Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/a9/e3aee762739c1d7528da1c3e06d518503f8b6c439c35549b53735ba52ead/typeguard-4.4.4-py3-none-any.whl", hash = "sha256:b5f562281b6bfa1f5492470464730ef001646128b180769880468bd84b68b09e", size = 34874 }, + { url = "https://files.pythonhosted.org/packages/1b/a9/e3aee762739c1d7528da1c3e06d518503f8b6c439c35549b53735ba52ead/typeguard-4.4.4-py3-none-any.whl", hash = "sha256:b5f562281b6bfa1f5492470464730ef001646128b180769880468bd84b68b09e", size = 34874, upload-time = "2025-06-18T09:56:05.999Z" }, ] [[package]] name = "typer" -version = "0.13.1" +version = "0.16.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -3394,18 +3412,18 @@ dependencies = [ { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/76/41/49ead3ad3310545e767bcb917c759b026ca9eada5d5c150c2fb6fc555568/typer-0.13.1.tar.gz", hash = "sha256:9d444cb96cc268ce6f8b94e13b4335084cef4c079998a9f4851a90229a3bd25c", size = 98631 } +sdist = { url = "https://files.pythonhosted.org/packages/c5/8c/7d682431efca5fd290017663ea4588bf6f2c6aad085c7f108c5dbc316e70/typer-0.16.0.tar.gz", hash = "sha256:af377ffaee1dbe37ae9440cb4e8f11686ea5ce4e9bae01b84ae7c63b87f1dd3b", size = 102625, upload-time = "2025-05-26T14:30:31.824Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/69/e90a0b4d0c16e095901679216c8ecdc728110c7c54e7b5f43a623bc4c789/typer-0.13.1-py3-none-any.whl", hash = "sha256:5b59580fd925e89463a29d363e0a43245ec02765bde9fb77d39e5d0f29dd7157", size = 44723 }, + { url = "https://files.pythonhosted.org/packages/76/42/3efaf858001d2c2913de7f354563e3a3a2f0decae3efe98427125a8f441e/typer-0.16.0-py3-none-any.whl", hash = "sha256:1f79bed11d4d02d4310e3c1b7ba594183bcedb0ac73b27a9e5f28f6fb5b98855", size = 46317, upload-time = "2025-05-26T14:30:30.523Z" }, ] [[package]] name = "typing-extensions" version = "4.14.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673 } +sdist = { url = "https://files.pythonhosted.org/packages/98/5a/da40306b885cc8c09109dc2e1abd358d5684b1425678151cdaed4731c822/typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", size = 107673, upload-time = "2025-07-04T13:28:34.16Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906 }, + { url = "https://files.pythonhosted.org/packages/b5/00/d631e67a838026495268c2f6884f3711a15a9a2a96cd244fdaea53b823fb/typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76", size = 43906, upload-time = "2025-07-04T13:28:32.743Z" }, ] [[package]] @@ -3415,36 +3433,36 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726 } +sdist = { url = "https://files.pythonhosted.org/packages/f8/b1/0c11f5058406b3af7609f121aaa6b609744687f1d158b3c3a5bf4cc94238/typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28", size = 75726, upload-time = "2025-05-21T18:55:23.885Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552 }, + { url = "https://files.pythonhosted.org/packages/17/69/cd203477f944c353c31bade965f880aa1061fd6bf05ded0726ca845b6ff7/typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", size = 14552, upload-time = "2025-05-21T18:55:22.152Z" }, ] [[package]] name = "tzdata" version = "2025.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380 } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380, upload-time = "2025-03-23T13:54:43.652Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839, upload-time = "2025-03-23T13:54:41.845Z" }, ] [[package]] name = "uc-micro-py" version = "1.0.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/91/7a/146a99696aee0609e3712f2b44c6274566bc368dfe8375191278045186b8/uc-micro-py-1.0.3.tar.gz", hash = "sha256:d321b92cff673ec58027c04015fcaa8bb1e005478643ff4a500882eaab88c48a", size = 6043 } +sdist = { url = "https://files.pythonhosted.org/packages/91/7a/146a99696aee0609e3712f2b44c6274566bc368dfe8375191278045186b8/uc-micro-py-1.0.3.tar.gz", hash = "sha256:d321b92cff673ec58027c04015fcaa8bb1e005478643ff4a500882eaab88c48a", size = 6043, upload-time = "2024-02-09T16:52:01.654Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/37/87/1f677586e8ac487e29672e4b17455758fce261de06a0d086167bb760361a/uc_micro_py-1.0.3-py3-none-any.whl", hash = "sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5", size = 6229 }, + { url = "https://files.pythonhosted.org/packages/37/87/1f677586e8ac487e29672e4b17455758fce261de06a0d086167bb760361a/uc_micro_py-1.0.3-py3-none-any.whl", hash = "sha256:db1dffff340817673d7b466ec86114a9dc0e9d4d9b5ba229d9d60e5c12600cd5", size = 6229, upload-time = "2024-02-09T16:52:00.371Z" }, ] [[package]] name = "urllib3" version = "2.5.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185 } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795 }, + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, ] [[package]] @@ -3455,32 +3473,32 @@ dependencies = [ { name = "click" }, { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5e/42/e0e305207bb88c6b8d3061399c6a961ffe5fbb7e2aa63c9234df7259e9cd/uvicorn-0.35.0.tar.gz", hash = "sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01", size = 78473 } +sdist = { url = "https://files.pythonhosted.org/packages/5e/42/e0e305207bb88c6b8d3061399c6a961ffe5fbb7e2aa63c9234df7259e9cd/uvicorn-0.35.0.tar.gz", hash = "sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01", size = 78473, upload-time = "2025-06-28T16:15:46.058Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/e2/dc81b1bd1dcfe91735810265e9d26bc8ec5da45b4c0f6237e286819194c3/uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a", size = 66406 }, + { url = "https://files.pythonhosted.org/packages/d2/e2/dc81b1bd1dcfe91735810265e9d26bc8ec5da45b4c0f6237e286819194c3/uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a", size = 66406, upload-time = "2025-06-28T16:15:44.816Z" }, ] [[package]] name = "validators" version = "0.22.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9b/21/40a249498eee5a244a017582c06c0af01851179e2617928063a3d628bc8f/validators-0.22.0.tar.gz", hash = "sha256:77b2689b172eeeb600d9605ab86194641670cdb73b60afd577142a9397873370", size = 41479 } +sdist = { url = "https://files.pythonhosted.org/packages/9b/21/40a249498eee5a244a017582c06c0af01851179e2617928063a3d628bc8f/validators-0.22.0.tar.gz", hash = "sha256:77b2689b172eeeb600d9605ab86194641670cdb73b60afd577142a9397873370", size = 41479, upload-time = "2023-09-02T09:17:59.054Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/0c/785d317eea99c3739821718f118c70537639aa43f96bfa1d83a71f68eaf6/validators-0.22.0-py3-none-any.whl", hash = "sha256:61cf7d4a62bbae559f2e54aed3b000cea9ff3e2fdbe463f51179b92c58c9585a", size = 26195 }, + { url = "https://files.pythonhosted.org/packages/3a/0c/785d317eea99c3739821718f118c70537639aa43f96bfa1d83a71f68eaf6/validators-0.22.0-py3-none-any.whl", hash = "sha256:61cf7d4a62bbae559f2e54aed3b000cea9ff3e2fdbe463f51179b92c58c9585a", size = 26195, upload-time = "2023-09-02T09:17:56.595Z" }, ] [[package]] name = "virtualenv" -version = "20.31.2" +version = "20.33.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "distlib" }, { name = "filelock" }, { name = "platformdirs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/56/2c/444f465fb2c65f40c3a104fd0c495184c4f2336d65baf398e3c75d72ea94/virtualenv-20.31.2.tar.gz", hash = "sha256:e10c0a9d02835e592521be48b332b6caee6887f332c111aa79a09b9e79efc2af", size = 6076316 } +sdist = { url = "https://files.pythonhosted.org/packages/8b/60/4f20960df6c7b363a18a55ab034c8f2bcd5d9770d1f94f9370ec104c1855/virtualenv-20.33.1.tar.gz", hash = "sha256:1b44478d9e261b3fb8baa5e74a0ca3bc0e05f21aa36167bf9cbf850e542765b8", size = 6082160, upload-time = "2025-08-05T16:10:55.605Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f3/40/b1c265d4b2b62b58576588510fc4d1fe60a86319c8de99fd8e9fec617d2c/virtualenv-20.31.2-py3-none-any.whl", hash = "sha256:36efd0d9650ee985f0cad72065001e66d49a6f24eb44d98980f630686243cf11", size = 6057982 }, + { url = "https://files.pythonhosted.org/packages/ca/ff/ded57ac5ff40a09e6e198550bab075d780941e0b0f83cbeabd087c59383a/virtualenv-20.33.1-py3-none-any.whl", hash = "sha256:07c19bc66c11acab6a5958b815cbcee30891cd1c2ccf53785a28651a0d8d8a67", size = 6060362, upload-time = "2025-08-05T16:10:52.81Z" }, ] [[package]] @@ -3490,165 +3508,165 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2a/9a/d451fcc97d029f5812e898fd30a53fd8c15c7bbd058fd75cfc6beb9bd761/watchfiles-1.1.0.tar.gz", hash = "sha256:693ed7ec72cbfcee399e92c895362b6e66d63dac6b91e2c11ae03d10d503e575", size = 94406 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8b/78/7401154b78ab484ccaaeef970dc2af0cb88b5ba8a1b415383da444cdd8d3/watchfiles-1.1.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c9649dfc57cc1f9835551deb17689e8d44666315f2e82d337b9f07bd76ae3aa2", size = 405751 }, - { url = "https://files.pythonhosted.org/packages/76/63/e6c3dbc1f78d001589b75e56a288c47723de28c580ad715eb116639152b5/watchfiles-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:406520216186b99374cdb58bc48e34bb74535adec160c8459894884c983a149c", size = 397313 }, - { url = "https://files.pythonhosted.org/packages/6c/a2/8afa359ff52e99af1632f90cbf359da46184207e893a5f179301b0c8d6df/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb45350fd1dc75cd68d3d72c47f5b513cb0578da716df5fba02fff31c69d5f2d", size = 450792 }, - { url = "https://files.pythonhosted.org/packages/1d/bf/7446b401667f5c64972a57a0233be1104157fc3abf72c4ef2666c1bd09b2/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:11ee4444250fcbeb47459a877e5e80ed994ce8e8d20283857fc128be1715dac7", size = 458196 }, - { url = "https://files.pythonhosted.org/packages/58/2f/501ddbdfa3fa874ea5597c77eeea3d413579c29af26c1091b08d0c792280/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bda8136e6a80bdea23e5e74e09df0362744d24ffb8cd59c4a95a6ce3d142f79c", size = 484788 }, - { url = "https://files.pythonhosted.org/packages/61/1e/9c18eb2eb5c953c96bc0e5f626f0e53cfef4bd19bd50d71d1a049c63a575/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b915daeb2d8c1f5cee4b970f2e2c988ce6514aace3c9296e58dd64dc9aa5d575", size = 597879 }, - { url = "https://files.pythonhosted.org/packages/8b/6c/1467402e5185d89388b4486745af1e0325007af0017c3384cc786fff0542/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed8fc66786de8d0376f9f913c09e963c66e90ced9aa11997f93bdb30f7c872a8", size = 477447 }, - { url = "https://files.pythonhosted.org/packages/2b/a1/ec0a606bde4853d6c4a578f9391eeb3684a9aea736a8eb217e3e00aa89a1/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe4371595edf78c41ef8ac8df20df3943e13defd0efcb732b2e393b5a8a7a71f", size = 453145 }, - { url = "https://files.pythonhosted.org/packages/90/b9/ef6f0c247a6a35d689fc970dc7f6734f9257451aefb30def5d100d6246a5/watchfiles-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b7c5f6fe273291f4d414d55b2c80d33c457b8a42677ad14b4b47ff025d0893e4", size = 626539 }, - { url = "https://files.pythonhosted.org/packages/34/44/6ffda5537085106ff5aaa762b0d130ac6c75a08015dd1621376f708c94de/watchfiles-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7738027989881e70e3723c75921f1efa45225084228788fc59ea8c6d732eb30d", size = 624472 }, - { url = "https://files.pythonhosted.org/packages/c3/e3/71170985c48028fa3f0a50946916a14055e741db11c2e7bc2f3b61f4d0e3/watchfiles-1.1.0-cp311-cp311-win32.whl", hash = "sha256:622d6b2c06be19f6e89b1d951485a232e3b59618def88dbeda575ed8f0d8dbf2", size = 279348 }, - { url = "https://files.pythonhosted.org/packages/89/1b/3e39c68b68a7a171070f81fc2561d23ce8d6859659406842a0e4bebf3bba/watchfiles-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:48aa25e5992b61debc908a61ab4d3f216b64f44fdaa71eb082d8b2de846b7d12", size = 292607 }, - { url = "https://files.pythonhosted.org/packages/61/9f/2973b7539f2bdb6ea86d2c87f70f615a71a1fc2dba2911795cea25968aea/watchfiles-1.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:00645eb79a3faa70d9cb15c8d4187bb72970b2470e938670240c7998dad9f13a", size = 285056 }, - { url = "https://files.pythonhosted.org/packages/f6/b8/858957045a38a4079203a33aaa7d23ea9269ca7761c8a074af3524fbb240/watchfiles-1.1.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9dc001c3e10de4725c749d4c2f2bdc6ae24de5a88a339c4bce32300a31ede179", size = 402339 }, - { url = "https://files.pythonhosted.org/packages/80/28/98b222cca751ba68e88521fabd79a4fab64005fc5976ea49b53fa205d1fa/watchfiles-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d9ba68ec283153dead62cbe81872d28e053745f12335d037de9cbd14bd1877f5", size = 394409 }, - { url = "https://files.pythonhosted.org/packages/86/50/dee79968566c03190677c26f7f47960aff738d32087087bdf63a5473e7df/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130fc497b8ee68dce163e4254d9b0356411d1490e868bd8790028bc46c5cc297", size = 450939 }, - { url = "https://files.pythonhosted.org/packages/40/45/a7b56fb129700f3cfe2594a01aa38d033b92a33dddce86c8dfdfc1247b72/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:50a51a90610d0845a5931a780d8e51d7bd7f309ebc25132ba975aca016b576a0", size = 457270 }, - { url = "https://files.pythonhosted.org/packages/b5/c8/fa5ef9476b1d02dc6b5e258f515fcaaecf559037edf8b6feffcbc097c4b8/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc44678a72ac0910bac46fa6a0de6af9ba1355669b3dfaf1ce5f05ca7a74364e", size = 483370 }, - { url = "https://files.pythonhosted.org/packages/98/68/42cfcdd6533ec94f0a7aab83f759ec11280f70b11bfba0b0f885e298f9bd/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a543492513a93b001975ae283a51f4b67973662a375a403ae82f420d2c7205ee", size = 598654 }, - { url = "https://files.pythonhosted.org/packages/d3/74/b2a1544224118cc28df7e59008a929e711f9c68ce7d554e171b2dc531352/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ac164e20d17cc285f2b94dc31c384bc3aa3dd5e7490473b3db043dd70fbccfd", size = 478667 }, - { url = "https://files.pythonhosted.org/packages/8c/77/e3362fe308358dc9f8588102481e599c83e1b91c2ae843780a7ded939a35/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7590d5a455321e53857892ab8879dce62d1f4b04748769f5adf2e707afb9d4f", size = 452213 }, - { url = "https://files.pythonhosted.org/packages/6e/17/c8f1a36540c9a1558d4faf08e909399e8133599fa359bf52ec8fcee5be6f/watchfiles-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:37d3d3f7defb13f62ece99e9be912afe9dd8a0077b7c45ee5a57c74811d581a4", size = 626718 }, - { url = "https://files.pythonhosted.org/packages/26/45/fb599be38b4bd38032643783d7496a26a6f9ae05dea1a42e58229a20ac13/watchfiles-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7080c4bb3efd70a07b1cc2df99a7aa51d98685be56be6038c3169199d0a1c69f", size = 623098 }, - { url = "https://files.pythonhosted.org/packages/a1/e7/fdf40e038475498e160cd167333c946e45d8563ae4dd65caf757e9ffe6b4/watchfiles-1.1.0-cp312-cp312-win32.whl", hash = "sha256:cbcf8630ef4afb05dc30107bfa17f16c0896bb30ee48fc24bf64c1f970f3b1fd", size = 279209 }, - { url = "https://files.pythonhosted.org/packages/3f/d3/3ae9d5124ec75143bdf088d436cba39812122edc47709cd2caafeac3266f/watchfiles-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:cbd949bdd87567b0ad183d7676feb98136cde5bb9025403794a4c0db28ed3a47", size = 292786 }, - { url = "https://files.pythonhosted.org/packages/26/2f/7dd4fc8b5f2b34b545e19629b4a018bfb1de23b3a496766a2c1165ca890d/watchfiles-1.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:0a7d40b77f07be87c6faa93d0951a0fcd8cbca1ddff60a1b65d741bac6f3a9f6", size = 284343 }, - { url = "https://files.pythonhosted.org/packages/d3/42/fae874df96595556a9089ade83be34a2e04f0f11eb53a8dbf8a8a5e562b4/watchfiles-1.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5007f860c7f1f8df471e4e04aaa8c43673429047d63205d1630880f7637bca30", size = 402004 }, - { url = "https://files.pythonhosted.org/packages/fa/55/a77e533e59c3003d9803c09c44c3651224067cbe7fb5d574ddbaa31e11ca/watchfiles-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:20ecc8abbd957046f1fe9562757903f5eaf57c3bce70929fda6c7711bb58074a", size = 393671 }, - { url = "https://files.pythonhosted.org/packages/05/68/b0afb3f79c8e832e6571022611adbdc36e35a44e14f129ba09709aa4bb7a/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2f0498b7d2a3c072766dba3274fe22a183dbea1f99d188f1c6c72209a1063dc", size = 449772 }, - { url = "https://files.pythonhosted.org/packages/ff/05/46dd1f6879bc40e1e74c6c39a1b9ab9e790bf1f5a2fe6c08b463d9a807f4/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:239736577e848678e13b201bba14e89718f5c2133dfd6b1f7846fa1b58a8532b", size = 456789 }, - { url = "https://files.pythonhosted.org/packages/8b/ca/0eeb2c06227ca7f12e50a47a3679df0cd1ba487ea19cf844a905920f8e95/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eff4b8d89f444f7e49136dc695599a591ff769300734446c0a86cba2eb2f9895", size = 482551 }, - { url = "https://files.pythonhosted.org/packages/31/47/2cecbd8694095647406645f822781008cc524320466ea393f55fe70eed3b/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12b0a02a91762c08f7264e2e79542f76870c3040bbc847fb67410ab81474932a", size = 597420 }, - { url = "https://files.pythonhosted.org/packages/d9/7e/82abc4240e0806846548559d70f0b1a6dfdca75c1b4f9fa62b504ae9b083/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29e7bc2eee15cbb339c68445959108803dc14ee0c7b4eea556400131a8de462b", size = 477950 }, - { url = "https://files.pythonhosted.org/packages/25/0d/4d564798a49bf5482a4fa9416dea6b6c0733a3b5700cb8a5a503c4b15853/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9481174d3ed982e269c090f780122fb59cee6c3796f74efe74e70f7780ed94c", size = 451706 }, - { url = "https://files.pythonhosted.org/packages/81/b5/5516cf46b033192d544102ea07c65b6f770f10ed1d0a6d388f5d3874f6e4/watchfiles-1.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:80f811146831c8c86ab17b640801c25dc0a88c630e855e2bef3568f30434d52b", size = 625814 }, - { url = "https://files.pythonhosted.org/packages/0c/dd/7c1331f902f30669ac3e754680b6edb9a0dd06dea5438e61128111fadd2c/watchfiles-1.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:60022527e71d1d1fda67a33150ee42869042bce3d0fcc9cc49be009a9cded3fb", size = 622820 }, - { url = "https://files.pythonhosted.org/packages/1b/14/36d7a8e27cd128d7b1009e7715a7c02f6c131be9d4ce1e5c3b73d0e342d8/watchfiles-1.1.0-cp313-cp313-win32.whl", hash = "sha256:32d6d4e583593cb8576e129879ea0991660b935177c0f93c6681359b3654bfa9", size = 279194 }, - { url = "https://files.pythonhosted.org/packages/25/41/2dd88054b849aa546dbeef5696019c58f8e0774f4d1c42123273304cdb2e/watchfiles-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:f21af781a4a6fbad54f03c598ab620e3a77032c5878f3d780448421a6e1818c7", size = 292349 }, - { url = "https://files.pythonhosted.org/packages/c8/cf/421d659de88285eb13941cf11a81f875c176f76a6d99342599be88e08d03/watchfiles-1.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:5366164391873ed76bfdf618818c82084c9db7fac82b64a20c44d335eec9ced5", size = 283836 }, - { url = "https://files.pythonhosted.org/packages/45/10/6faf6858d527e3599cc50ec9fcae73590fbddc1420bd4fdccfebffeedbc6/watchfiles-1.1.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:17ab167cca6339c2b830b744eaf10803d2a5b6683be4d79d8475d88b4a8a4be1", size = 400343 }, - { url = "https://files.pythonhosted.org/packages/03/20/5cb7d3966f5e8c718006d0e97dfe379a82f16fecd3caa7810f634412047a/watchfiles-1.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:328dbc9bff7205c215a7807da7c18dce37da7da718e798356212d22696404339", size = 392916 }, - { url = "https://files.pythonhosted.org/packages/8c/07/d8f1176328fa9e9581b6f120b017e286d2a2d22ae3f554efd9515c8e1b49/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7208ab6e009c627b7557ce55c465c98967e8caa8b11833531fdf95799372633", size = 449582 }, - { url = "https://files.pythonhosted.org/packages/66/e8/80a14a453cf6038e81d072a86c05276692a1826471fef91df7537dba8b46/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a8f6f72974a19efead54195bc9bed4d850fc047bb7aa971268fd9a8387c89011", size = 456752 }, - { url = "https://files.pythonhosted.org/packages/5a/25/0853b3fe0e3c2f5af9ea60eb2e781eade939760239a72c2d38fc4cc335f6/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d181ef50923c29cf0450c3cd47e2f0557b62218c50b2ab8ce2ecaa02bd97e670", size = 481436 }, - { url = "https://files.pythonhosted.org/packages/fe/9e/4af0056c258b861fbb29dcb36258de1e2b857be4a9509e6298abcf31e5c9/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adb4167043d3a78280d5d05ce0ba22055c266cf8655ce942f2fb881262ff3cdf", size = 596016 }, - { url = "https://files.pythonhosted.org/packages/c5/fa/95d604b58aa375e781daf350897aaaa089cff59d84147e9ccff2447c8294/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5701dc474b041e2934a26d31d39f90fac8a3dee2322b39f7729867f932b1d4", size = 476727 }, - { url = "https://files.pythonhosted.org/packages/65/95/fe479b2664f19be4cf5ceeb21be05afd491d95f142e72d26a42f41b7c4f8/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b067915e3c3936966a8607f6fe5487df0c9c4afb85226613b520890049deea20", size = 451864 }, - { url = "https://files.pythonhosted.org/packages/d3/8a/3c4af14b93a15ce55901cd7a92e1a4701910f1768c78fb30f61d2b79785b/watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:9c733cda03b6d636b4219625a4acb5c6ffb10803338e437fb614fef9516825ef", size = 625626 }, - { url = "https://files.pythonhosted.org/packages/da/f5/cf6aa047d4d9e128f4b7cde615236a915673775ef171ff85971d698f3c2c/watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:cc08ef8b90d78bfac66f0def80240b0197008e4852c9f285907377b2947ffdcb", size = 622744 }, - { url = "https://files.pythonhosted.org/packages/8c/6b/686dcf5d3525ad17b384fd94708e95193529b460a1b7bf40851f1328ec6e/watchfiles-1.1.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0ece16b563b17ab26eaa2d52230c9a7ae46cf01759621f4fbbca280e438267b3", size = 406910 }, - { url = "https://files.pythonhosted.org/packages/f3/d3/71c2dcf81dc1edcf8af9f4d8d63b1316fb0a2dd90cbfd427e8d9dd584a90/watchfiles-1.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:51b81e55d40c4b4aa8658427a3ee7ea847c591ae9e8b81ef94a90b668999353c", size = 398816 }, - { url = "https://files.pythonhosted.org/packages/b8/fa/12269467b2fc006f8fce4cd6c3acfa77491dd0777d2a747415f28ccc8c60/watchfiles-1.1.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2bcdc54ea267fe72bfc7d83c041e4eb58d7d8dc6f578dfddb52f037ce62f432", size = 451584 }, - { url = "https://files.pythonhosted.org/packages/bd/d3/254cea30f918f489db09d6a8435a7de7047f8cb68584477a515f160541d6/watchfiles-1.1.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:923fec6e5461c42bd7e3fd5ec37492c6f3468be0499bc0707b4bbbc16ac21792", size = 454009 }, +sdist = { url = "https://files.pythonhosted.org/packages/2a/9a/d451fcc97d029f5812e898fd30a53fd8c15c7bbd058fd75cfc6beb9bd761/watchfiles-1.1.0.tar.gz", hash = "sha256:693ed7ec72cbfcee399e92c895362b6e66d63dac6b91e2c11ae03d10d503e575", size = 94406, upload-time = "2025-06-15T19:06:59.42Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/78/7401154b78ab484ccaaeef970dc2af0cb88b5ba8a1b415383da444cdd8d3/watchfiles-1.1.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:c9649dfc57cc1f9835551deb17689e8d44666315f2e82d337b9f07bd76ae3aa2", size = 405751, upload-time = "2025-06-15T19:05:07.679Z" }, + { url = "https://files.pythonhosted.org/packages/76/63/e6c3dbc1f78d001589b75e56a288c47723de28c580ad715eb116639152b5/watchfiles-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:406520216186b99374cdb58bc48e34bb74535adec160c8459894884c983a149c", size = 397313, upload-time = "2025-06-15T19:05:08.764Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a2/8afa359ff52e99af1632f90cbf359da46184207e893a5f179301b0c8d6df/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb45350fd1dc75cd68d3d72c47f5b513cb0578da716df5fba02fff31c69d5f2d", size = 450792, upload-time = "2025-06-15T19:05:09.869Z" }, + { url = "https://files.pythonhosted.org/packages/1d/bf/7446b401667f5c64972a57a0233be1104157fc3abf72c4ef2666c1bd09b2/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:11ee4444250fcbeb47459a877e5e80ed994ce8e8d20283857fc128be1715dac7", size = 458196, upload-time = "2025-06-15T19:05:11.91Z" }, + { url = "https://files.pythonhosted.org/packages/58/2f/501ddbdfa3fa874ea5597c77eeea3d413579c29af26c1091b08d0c792280/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bda8136e6a80bdea23e5e74e09df0362744d24ffb8cd59c4a95a6ce3d142f79c", size = 484788, upload-time = "2025-06-15T19:05:13.373Z" }, + { url = "https://files.pythonhosted.org/packages/61/1e/9c18eb2eb5c953c96bc0e5f626f0e53cfef4bd19bd50d71d1a049c63a575/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b915daeb2d8c1f5cee4b970f2e2c988ce6514aace3c9296e58dd64dc9aa5d575", size = 597879, upload-time = "2025-06-15T19:05:14.725Z" }, + { url = "https://files.pythonhosted.org/packages/8b/6c/1467402e5185d89388b4486745af1e0325007af0017c3384cc786fff0542/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ed8fc66786de8d0376f9f913c09e963c66e90ced9aa11997f93bdb30f7c872a8", size = 477447, upload-time = "2025-06-15T19:05:15.775Z" }, + { url = "https://files.pythonhosted.org/packages/2b/a1/ec0a606bde4853d6c4a578f9391eeb3684a9aea736a8eb217e3e00aa89a1/watchfiles-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe4371595edf78c41ef8ac8df20df3943e13defd0efcb732b2e393b5a8a7a71f", size = 453145, upload-time = "2025-06-15T19:05:17.17Z" }, + { url = "https://files.pythonhosted.org/packages/90/b9/ef6f0c247a6a35d689fc970dc7f6734f9257451aefb30def5d100d6246a5/watchfiles-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b7c5f6fe273291f4d414d55b2c80d33c457b8a42677ad14b4b47ff025d0893e4", size = 626539, upload-time = "2025-06-15T19:05:18.557Z" }, + { url = "https://files.pythonhosted.org/packages/34/44/6ffda5537085106ff5aaa762b0d130ac6c75a08015dd1621376f708c94de/watchfiles-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7738027989881e70e3723c75921f1efa45225084228788fc59ea8c6d732eb30d", size = 624472, upload-time = "2025-06-15T19:05:19.588Z" }, + { url = "https://files.pythonhosted.org/packages/c3/e3/71170985c48028fa3f0a50946916a14055e741db11c2e7bc2f3b61f4d0e3/watchfiles-1.1.0-cp311-cp311-win32.whl", hash = "sha256:622d6b2c06be19f6e89b1d951485a232e3b59618def88dbeda575ed8f0d8dbf2", size = 279348, upload-time = "2025-06-15T19:05:20.856Z" }, + { url = "https://files.pythonhosted.org/packages/89/1b/3e39c68b68a7a171070f81fc2561d23ce8d6859659406842a0e4bebf3bba/watchfiles-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:48aa25e5992b61debc908a61ab4d3f216b64f44fdaa71eb082d8b2de846b7d12", size = 292607, upload-time = "2025-06-15T19:05:21.937Z" }, + { url = "https://files.pythonhosted.org/packages/61/9f/2973b7539f2bdb6ea86d2c87f70f615a71a1fc2dba2911795cea25968aea/watchfiles-1.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:00645eb79a3faa70d9cb15c8d4187bb72970b2470e938670240c7998dad9f13a", size = 285056, upload-time = "2025-06-15T19:05:23.12Z" }, + { url = "https://files.pythonhosted.org/packages/f6/b8/858957045a38a4079203a33aaa7d23ea9269ca7761c8a074af3524fbb240/watchfiles-1.1.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:9dc001c3e10de4725c749d4c2f2bdc6ae24de5a88a339c4bce32300a31ede179", size = 402339, upload-time = "2025-06-15T19:05:24.516Z" }, + { url = "https://files.pythonhosted.org/packages/80/28/98b222cca751ba68e88521fabd79a4fab64005fc5976ea49b53fa205d1fa/watchfiles-1.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d9ba68ec283153dead62cbe81872d28e053745f12335d037de9cbd14bd1877f5", size = 394409, upload-time = "2025-06-15T19:05:25.469Z" }, + { url = "https://files.pythonhosted.org/packages/86/50/dee79968566c03190677c26f7f47960aff738d32087087bdf63a5473e7df/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130fc497b8ee68dce163e4254d9b0356411d1490e868bd8790028bc46c5cc297", size = 450939, upload-time = "2025-06-15T19:05:26.494Z" }, + { url = "https://files.pythonhosted.org/packages/40/45/a7b56fb129700f3cfe2594a01aa38d033b92a33dddce86c8dfdfc1247b72/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:50a51a90610d0845a5931a780d8e51d7bd7f309ebc25132ba975aca016b576a0", size = 457270, upload-time = "2025-06-15T19:05:27.466Z" }, + { url = "https://files.pythonhosted.org/packages/b5/c8/fa5ef9476b1d02dc6b5e258f515fcaaecf559037edf8b6feffcbc097c4b8/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc44678a72ac0910bac46fa6a0de6af9ba1355669b3dfaf1ce5f05ca7a74364e", size = 483370, upload-time = "2025-06-15T19:05:28.548Z" }, + { url = "https://files.pythonhosted.org/packages/98/68/42cfcdd6533ec94f0a7aab83f759ec11280f70b11bfba0b0f885e298f9bd/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a543492513a93b001975ae283a51f4b67973662a375a403ae82f420d2c7205ee", size = 598654, upload-time = "2025-06-15T19:05:29.997Z" }, + { url = "https://files.pythonhosted.org/packages/d3/74/b2a1544224118cc28df7e59008a929e711f9c68ce7d554e171b2dc531352/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ac164e20d17cc285f2b94dc31c384bc3aa3dd5e7490473b3db043dd70fbccfd", size = 478667, upload-time = "2025-06-15T19:05:31.172Z" }, + { url = "https://files.pythonhosted.org/packages/8c/77/e3362fe308358dc9f8588102481e599c83e1b91c2ae843780a7ded939a35/watchfiles-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7590d5a455321e53857892ab8879dce62d1f4b04748769f5adf2e707afb9d4f", size = 452213, upload-time = "2025-06-15T19:05:32.299Z" }, + { url = "https://files.pythonhosted.org/packages/6e/17/c8f1a36540c9a1558d4faf08e909399e8133599fa359bf52ec8fcee5be6f/watchfiles-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:37d3d3f7defb13f62ece99e9be912afe9dd8a0077b7c45ee5a57c74811d581a4", size = 626718, upload-time = "2025-06-15T19:05:33.415Z" }, + { url = "https://files.pythonhosted.org/packages/26/45/fb599be38b4bd38032643783d7496a26a6f9ae05dea1a42e58229a20ac13/watchfiles-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7080c4bb3efd70a07b1cc2df99a7aa51d98685be56be6038c3169199d0a1c69f", size = 623098, upload-time = "2025-06-15T19:05:34.534Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e7/fdf40e038475498e160cd167333c946e45d8563ae4dd65caf757e9ffe6b4/watchfiles-1.1.0-cp312-cp312-win32.whl", hash = "sha256:cbcf8630ef4afb05dc30107bfa17f16c0896bb30ee48fc24bf64c1f970f3b1fd", size = 279209, upload-time = "2025-06-15T19:05:35.577Z" }, + { url = "https://files.pythonhosted.org/packages/3f/d3/3ae9d5124ec75143bdf088d436cba39812122edc47709cd2caafeac3266f/watchfiles-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:cbd949bdd87567b0ad183d7676feb98136cde5bb9025403794a4c0db28ed3a47", size = 292786, upload-time = "2025-06-15T19:05:36.559Z" }, + { url = "https://files.pythonhosted.org/packages/26/2f/7dd4fc8b5f2b34b545e19629b4a018bfb1de23b3a496766a2c1165ca890d/watchfiles-1.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:0a7d40b77f07be87c6faa93d0951a0fcd8cbca1ddff60a1b65d741bac6f3a9f6", size = 284343, upload-time = "2025-06-15T19:05:37.5Z" }, + { url = "https://files.pythonhosted.org/packages/d3/42/fae874df96595556a9089ade83be34a2e04f0f11eb53a8dbf8a8a5e562b4/watchfiles-1.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5007f860c7f1f8df471e4e04aaa8c43673429047d63205d1630880f7637bca30", size = 402004, upload-time = "2025-06-15T19:05:38.499Z" }, + { url = "https://files.pythonhosted.org/packages/fa/55/a77e533e59c3003d9803c09c44c3651224067cbe7fb5d574ddbaa31e11ca/watchfiles-1.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:20ecc8abbd957046f1fe9562757903f5eaf57c3bce70929fda6c7711bb58074a", size = 393671, upload-time = "2025-06-15T19:05:39.52Z" }, + { url = "https://files.pythonhosted.org/packages/05/68/b0afb3f79c8e832e6571022611adbdc36e35a44e14f129ba09709aa4bb7a/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2f0498b7d2a3c072766dba3274fe22a183dbea1f99d188f1c6c72209a1063dc", size = 449772, upload-time = "2025-06-15T19:05:40.897Z" }, + { url = "https://files.pythonhosted.org/packages/ff/05/46dd1f6879bc40e1e74c6c39a1b9ab9e790bf1f5a2fe6c08b463d9a807f4/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:239736577e848678e13b201bba14e89718f5c2133dfd6b1f7846fa1b58a8532b", size = 456789, upload-time = "2025-06-15T19:05:42.045Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ca/0eeb2c06227ca7f12e50a47a3679df0cd1ba487ea19cf844a905920f8e95/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eff4b8d89f444f7e49136dc695599a591ff769300734446c0a86cba2eb2f9895", size = 482551, upload-time = "2025-06-15T19:05:43.781Z" }, + { url = "https://files.pythonhosted.org/packages/31/47/2cecbd8694095647406645f822781008cc524320466ea393f55fe70eed3b/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12b0a02a91762c08f7264e2e79542f76870c3040bbc847fb67410ab81474932a", size = 597420, upload-time = "2025-06-15T19:05:45.244Z" }, + { url = "https://files.pythonhosted.org/packages/d9/7e/82abc4240e0806846548559d70f0b1a6dfdca75c1b4f9fa62b504ae9b083/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:29e7bc2eee15cbb339c68445959108803dc14ee0c7b4eea556400131a8de462b", size = 477950, upload-time = "2025-06-15T19:05:46.332Z" }, + { url = "https://files.pythonhosted.org/packages/25/0d/4d564798a49bf5482a4fa9416dea6b6c0733a3b5700cb8a5a503c4b15853/watchfiles-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9481174d3ed982e269c090f780122fb59cee6c3796f74efe74e70f7780ed94c", size = 451706, upload-time = "2025-06-15T19:05:47.459Z" }, + { url = "https://files.pythonhosted.org/packages/81/b5/5516cf46b033192d544102ea07c65b6f770f10ed1d0a6d388f5d3874f6e4/watchfiles-1.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:80f811146831c8c86ab17b640801c25dc0a88c630e855e2bef3568f30434d52b", size = 625814, upload-time = "2025-06-15T19:05:48.654Z" }, + { url = "https://files.pythonhosted.org/packages/0c/dd/7c1331f902f30669ac3e754680b6edb9a0dd06dea5438e61128111fadd2c/watchfiles-1.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:60022527e71d1d1fda67a33150ee42869042bce3d0fcc9cc49be009a9cded3fb", size = 622820, upload-time = "2025-06-15T19:05:50.088Z" }, + { url = "https://files.pythonhosted.org/packages/1b/14/36d7a8e27cd128d7b1009e7715a7c02f6c131be9d4ce1e5c3b73d0e342d8/watchfiles-1.1.0-cp313-cp313-win32.whl", hash = "sha256:32d6d4e583593cb8576e129879ea0991660b935177c0f93c6681359b3654bfa9", size = 279194, upload-time = "2025-06-15T19:05:51.186Z" }, + { url = "https://files.pythonhosted.org/packages/25/41/2dd88054b849aa546dbeef5696019c58f8e0774f4d1c42123273304cdb2e/watchfiles-1.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:f21af781a4a6fbad54f03c598ab620e3a77032c5878f3d780448421a6e1818c7", size = 292349, upload-time = "2025-06-15T19:05:52.201Z" }, + { url = "https://files.pythonhosted.org/packages/c8/cf/421d659de88285eb13941cf11a81f875c176f76a6d99342599be88e08d03/watchfiles-1.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:5366164391873ed76bfdf618818c82084c9db7fac82b64a20c44d335eec9ced5", size = 283836, upload-time = "2025-06-15T19:05:53.265Z" }, + { url = "https://files.pythonhosted.org/packages/45/10/6faf6858d527e3599cc50ec9fcae73590fbddc1420bd4fdccfebffeedbc6/watchfiles-1.1.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:17ab167cca6339c2b830b744eaf10803d2a5b6683be4d79d8475d88b4a8a4be1", size = 400343, upload-time = "2025-06-15T19:05:54.252Z" }, + { url = "https://files.pythonhosted.org/packages/03/20/5cb7d3966f5e8c718006d0e97dfe379a82f16fecd3caa7810f634412047a/watchfiles-1.1.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:328dbc9bff7205c215a7807da7c18dce37da7da718e798356212d22696404339", size = 392916, upload-time = "2025-06-15T19:05:55.264Z" }, + { url = "https://files.pythonhosted.org/packages/8c/07/d8f1176328fa9e9581b6f120b017e286d2a2d22ae3f554efd9515c8e1b49/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7208ab6e009c627b7557ce55c465c98967e8caa8b11833531fdf95799372633", size = 449582, upload-time = "2025-06-15T19:05:56.317Z" }, + { url = "https://files.pythonhosted.org/packages/66/e8/80a14a453cf6038e81d072a86c05276692a1826471fef91df7537dba8b46/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a8f6f72974a19efead54195bc9bed4d850fc047bb7aa971268fd9a8387c89011", size = 456752, upload-time = "2025-06-15T19:05:57.359Z" }, + { url = "https://files.pythonhosted.org/packages/5a/25/0853b3fe0e3c2f5af9ea60eb2e781eade939760239a72c2d38fc4cc335f6/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d181ef50923c29cf0450c3cd47e2f0557b62218c50b2ab8ce2ecaa02bd97e670", size = 481436, upload-time = "2025-06-15T19:05:58.447Z" }, + { url = "https://files.pythonhosted.org/packages/fe/9e/4af0056c258b861fbb29dcb36258de1e2b857be4a9509e6298abcf31e5c9/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adb4167043d3a78280d5d05ce0ba22055c266cf8655ce942f2fb881262ff3cdf", size = 596016, upload-time = "2025-06-15T19:05:59.59Z" }, + { url = "https://files.pythonhosted.org/packages/c5/fa/95d604b58aa375e781daf350897aaaa089cff59d84147e9ccff2447c8294/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5701dc474b041e2934a26d31d39f90fac8a3dee2322b39f7729867f932b1d4", size = 476727, upload-time = "2025-06-15T19:06:01.086Z" }, + { url = "https://files.pythonhosted.org/packages/65/95/fe479b2664f19be4cf5ceeb21be05afd491d95f142e72d26a42f41b7c4f8/watchfiles-1.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b067915e3c3936966a8607f6fe5487df0c9c4afb85226613b520890049deea20", size = 451864, upload-time = "2025-06-15T19:06:02.144Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8a/3c4af14b93a15ce55901cd7a92e1a4701910f1768c78fb30f61d2b79785b/watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:9c733cda03b6d636b4219625a4acb5c6ffb10803338e437fb614fef9516825ef", size = 625626, upload-time = "2025-06-15T19:06:03.578Z" }, + { url = "https://files.pythonhosted.org/packages/da/f5/cf6aa047d4d9e128f4b7cde615236a915673775ef171ff85971d698f3c2c/watchfiles-1.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:cc08ef8b90d78bfac66f0def80240b0197008e4852c9f285907377b2947ffdcb", size = 622744, upload-time = "2025-06-15T19:06:05.066Z" }, + { url = "https://files.pythonhosted.org/packages/8c/6b/686dcf5d3525ad17b384fd94708e95193529b460a1b7bf40851f1328ec6e/watchfiles-1.1.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0ece16b563b17ab26eaa2d52230c9a7ae46cf01759621f4fbbca280e438267b3", size = 406910, upload-time = "2025-06-15T19:06:49.335Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d3/71c2dcf81dc1edcf8af9f4d8d63b1316fb0a2dd90cbfd427e8d9dd584a90/watchfiles-1.1.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:51b81e55d40c4b4aa8658427a3ee7ea847c591ae9e8b81ef94a90b668999353c", size = 398816, upload-time = "2025-06-15T19:06:50.433Z" }, + { url = "https://files.pythonhosted.org/packages/b8/fa/12269467b2fc006f8fce4cd6c3acfa77491dd0777d2a747415f28ccc8c60/watchfiles-1.1.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2bcdc54ea267fe72bfc7d83c041e4eb58d7d8dc6f578dfddb52f037ce62f432", size = 451584, upload-time = "2025-06-15T19:06:51.834Z" }, + { url = "https://files.pythonhosted.org/packages/bd/d3/254cea30f918f489db09d6a8435a7de7047f8cb68584477a515f160541d6/watchfiles-1.1.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:923fec6e5461c42bd7e3fd5ec37492c6f3468be0499bc0707b4bbbc16ac21792", size = 454009, upload-time = "2025-06-15T19:06:52.896Z" }, ] [[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 } +sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301, upload-time = "2024-01-06T02:10:57.829Z" } 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://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166, upload-time = "2024-01-06T02:10:55.763Z" }, ] [[package]] name = "websockets" version = "15.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423 }, - { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082 }, - { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330 }, - { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878 }, - { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883 }, - { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252 }, - { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521 }, - { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958 }, - { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918 }, - { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388 }, - { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828 }, - { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437 }, - { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096 }, - { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332 }, - { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152 }, - { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096 }, - { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523 }, - { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790 }, - { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165 }, - { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160 }, - { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395 }, - { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841 }, - { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440 }, - { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098 }, - { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329 }, - { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111 }, - { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054 }, - { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496 }, - { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829 }, - { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217 }, - { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195 }, - { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393 }, - { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837 }, - { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743 }, +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016, upload-time = "2025-03-05T20:03:41.606Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/32/18fcd5919c293a398db67443acd33fde142f283853076049824fc58e6f75/websockets-15.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", size = 175423, upload-time = "2025-03-05T20:01:56.276Z" }, + { url = "https://files.pythonhosted.org/packages/76/70/ba1ad96b07869275ef42e2ce21f07a5b0148936688c2baf7e4a1f60d5058/websockets-15.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", size = 173082, upload-time = "2025-03-05T20:01:57.563Z" }, + { url = "https://files.pythonhosted.org/packages/86/f2/10b55821dd40eb696ce4704a87d57774696f9451108cff0d2824c97e0f97/websockets-15.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", size = 173330, upload-time = "2025-03-05T20:01:59.063Z" }, + { url = "https://files.pythonhosted.org/packages/a5/90/1c37ae8b8a113d3daf1065222b6af61cc44102da95388ac0018fcb7d93d9/websockets-15.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", size = 182878, upload-time = "2025-03-05T20:02:00.305Z" }, + { url = "https://files.pythonhosted.org/packages/8e/8d/96e8e288b2a41dffafb78e8904ea7367ee4f891dafc2ab8d87e2124cb3d3/websockets-15.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", size = 181883, upload-time = "2025-03-05T20:02:03.148Z" }, + { url = "https://files.pythonhosted.org/packages/93/1f/5d6dbf551766308f6f50f8baf8e9860be6182911e8106da7a7f73785f4c4/websockets-15.0.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", size = 182252, upload-time = "2025-03-05T20:02:05.29Z" }, + { url = "https://files.pythonhosted.org/packages/d4/78/2d4fed9123e6620cbf1706c0de8a1632e1a28e7774d94346d7de1bba2ca3/websockets-15.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", size = 182521, upload-time = "2025-03-05T20:02:07.458Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3b/66d4c1b444dd1a9823c4a81f50231b921bab54eee2f69e70319b4e21f1ca/websockets-15.0.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", size = 181958, upload-time = "2025-03-05T20:02:09.842Z" }, + { url = "https://files.pythonhosted.org/packages/08/ff/e9eed2ee5fed6f76fdd6032ca5cd38c57ca9661430bb3d5fb2872dc8703c/websockets-15.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", size = 181918, upload-time = "2025-03-05T20:02:11.968Z" }, + { url = "https://files.pythonhosted.org/packages/d8/75/994634a49b7e12532be6a42103597b71098fd25900f7437d6055ed39930a/websockets-15.0.1-cp311-cp311-win32.whl", hash = "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", size = 176388, upload-time = "2025-03-05T20:02:13.32Z" }, + { url = "https://files.pythonhosted.org/packages/98/93/e36c73f78400a65f5e236cd376713c34182e6663f6889cd45a4a04d8f203/websockets-15.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", size = 176828, upload-time = "2025-03-05T20:02:14.585Z" }, + { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437, upload-time = "2025-03-05T20:02:16.706Z" }, + { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096, upload-time = "2025-03-05T20:02:18.832Z" }, + { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332, upload-time = "2025-03-05T20:02:20.187Z" }, + { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152, upload-time = "2025-03-05T20:02:22.286Z" }, + { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096, upload-time = "2025-03-05T20:02:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523, upload-time = "2025-03-05T20:02:25.669Z" }, + { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790, upload-time = "2025-03-05T20:02:26.99Z" }, + { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165, upload-time = "2025-03-05T20:02:30.291Z" }, + { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160, upload-time = "2025-03-05T20:02:31.634Z" }, + { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395, upload-time = "2025-03-05T20:02:33.017Z" }, + { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841, upload-time = "2025-03-05T20:02:34.498Z" }, + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440, upload-time = "2025-03-05T20:02:36.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098, upload-time = "2025-03-05T20:02:37.985Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329, upload-time = "2025-03-05T20:02:39.298Z" }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111, upload-time = "2025-03-05T20:02:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054, upload-time = "2025-03-05T20:02:41.926Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496, upload-time = "2025-03-05T20:02:43.304Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829, upload-time = "2025-03-05T20:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217, upload-time = "2025-03-05T20:02:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195, upload-time = "2025-03-05T20:02:51.561Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393, upload-time = "2025-03-05T20:02:53.814Z" }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837, upload-time = "2025-03-05T20:02:55.237Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743, upload-time = "2025-03-05T20:03:39.41Z" }, ] [[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/cd/f7/a2aab2cbc7a665efab072344a8949a71081eed1d2f451f7f7d2b966594a2/wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58", size = 53308 }, - { url = "https://files.pythonhosted.org/packages/50/ff/149aba8365fdacef52b31a258c4dc1c57c79759c335eff0b3316a2664a64/wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda", size = 38488 }, - { url = "https://files.pythonhosted.org/packages/65/46/5a917ce85b5c3b490d35c02bf71aedaa9f2f63f2d15d9949cc4ba56e8ba9/wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438", size = 38776 }, - { url = "https://files.pythonhosted.org/packages/ca/74/336c918d2915a4943501c77566db41d1bd6e9f4dbc317f356b9a244dfe83/wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a", size = 83776 }, - { url = "https://files.pythonhosted.org/packages/09/99/c0c844a5ccde0fe5761d4305485297f91d67cf2a1a824c5f282e661ec7ff/wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000", size = 75420 }, - { url = "https://files.pythonhosted.org/packages/b4/b0/9fc566b0fe08b282c850063591a756057c3247b2362b9286429ec5bf1721/wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6", size = 83199 }, - { url = "https://files.pythonhosted.org/packages/9d/4b/71996e62d543b0a0bd95dda485219856def3347e3e9380cc0d6cf10cfb2f/wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b", size = 82307 }, - { url = "https://files.pythonhosted.org/packages/39/35/0282c0d8789c0dc9bcc738911776c762a701f95cfe113fb8f0b40e45c2b9/wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662", size = 75025 }, - { url = "https://files.pythonhosted.org/packages/4f/6d/90c9fd2c3c6fee181feecb620d95105370198b6b98a0770cba090441a828/wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72", size = 81879 }, - { url = "https://files.pythonhosted.org/packages/8f/fa/9fb6e594f2ce03ef03eddbdb5f4f90acb1452221a5351116c7c4708ac865/wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317", size = 36419 }, - { url = "https://files.pythonhosted.org/packages/47/f8/fb1773491a253cbc123c5d5dc15c86041f746ed30416535f2a8df1f4a392/wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3", size = 38773 }, - { url = "https://files.pythonhosted.org/packages/a1/bd/ab55f849fd1f9a58ed7ea47f5559ff09741b25f00c191231f9f059c83949/wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925", size = 53799 }, - { url = "https://files.pythonhosted.org/packages/53/18/75ddc64c3f63988f5a1d7e10fb204ffe5762bc663f8023f18ecaf31a332e/wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392", size = 38821 }, - { url = "https://files.pythonhosted.org/packages/48/2a/97928387d6ed1c1ebbfd4efc4133a0633546bec8481a2dd5ec961313a1c7/wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40", size = 38919 }, - { url = "https://files.pythonhosted.org/packages/73/54/3bfe5a1febbbccb7a2f77de47b989c0b85ed3a6a41614b104204a788c20e/wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d", size = 88721 }, - { url = "https://files.pythonhosted.org/packages/25/cb/7262bc1b0300b4b64af50c2720ef958c2c1917525238d661c3e9a2b71b7b/wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b", size = 80899 }, - { url = "https://files.pythonhosted.org/packages/2a/5a/04cde32b07a7431d4ed0553a76fdb7a61270e78c5fd5a603e190ac389f14/wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98", size = 89222 }, - { url = "https://files.pythonhosted.org/packages/09/28/2e45a4f4771fcfb109e244d5dbe54259e970362a311b67a965555ba65026/wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82", size = 86707 }, - { url = "https://files.pythonhosted.org/packages/c6/d2/dcb56bf5f32fcd4bd9aacc77b50a539abdd5b6536872413fd3f428b21bed/wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae", size = 79685 }, - { url = "https://files.pythonhosted.org/packages/80/4e/eb8b353e36711347893f502ce91c770b0b0929f8f0bed2670a6856e667a9/wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9", size = 87567 }, - { url = "https://files.pythonhosted.org/packages/17/27/4fe749a54e7fae6e7146f1c7d914d28ef599dacd4416566c055564080fe2/wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9", size = 36672 }, - { url = "https://files.pythonhosted.org/packages/15/06/1dbf478ea45c03e78a6a8c4be4fdc3c3bddea5c8de8a93bc971415e47f0f/wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991", size = 38865 }, - { 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 }, +sdist = { url = "https://files.pythonhosted.org/packages/c3/fc/e91cc220803d7bc4db93fb02facd8461c37364151b8494762cc88b0fbcef/wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", size = 55531, upload-time = "2025-01-14T10:35:45.465Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cd/f7/a2aab2cbc7a665efab072344a8949a71081eed1d2f451f7f7d2b966594a2/wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58", size = 53308, upload-time = "2025-01-14T10:33:33.992Z" }, + { url = "https://files.pythonhosted.org/packages/50/ff/149aba8365fdacef52b31a258c4dc1c57c79759c335eff0b3316a2664a64/wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda", size = 38488, upload-time = "2025-01-14T10:33:35.264Z" }, + { url = "https://files.pythonhosted.org/packages/65/46/5a917ce85b5c3b490d35c02bf71aedaa9f2f63f2d15d9949cc4ba56e8ba9/wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438", size = 38776, upload-time = "2025-01-14T10:33:38.28Z" }, + { url = "https://files.pythonhosted.org/packages/ca/74/336c918d2915a4943501c77566db41d1bd6e9f4dbc317f356b9a244dfe83/wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a", size = 83776, upload-time = "2025-01-14T10:33:40.678Z" }, + { url = "https://files.pythonhosted.org/packages/09/99/c0c844a5ccde0fe5761d4305485297f91d67cf2a1a824c5f282e661ec7ff/wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000", size = 75420, upload-time = "2025-01-14T10:33:41.868Z" }, + { url = "https://files.pythonhosted.org/packages/b4/b0/9fc566b0fe08b282c850063591a756057c3247b2362b9286429ec5bf1721/wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6", size = 83199, upload-time = "2025-01-14T10:33:43.598Z" }, + { url = "https://files.pythonhosted.org/packages/9d/4b/71996e62d543b0a0bd95dda485219856def3347e3e9380cc0d6cf10cfb2f/wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b", size = 82307, upload-time = "2025-01-14T10:33:48.499Z" }, + { url = "https://files.pythonhosted.org/packages/39/35/0282c0d8789c0dc9bcc738911776c762a701f95cfe113fb8f0b40e45c2b9/wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662", size = 75025, upload-time = "2025-01-14T10:33:51.191Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6d/90c9fd2c3c6fee181feecb620d95105370198b6b98a0770cba090441a828/wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72", size = 81879, upload-time = "2025-01-14T10:33:52.328Z" }, + { url = "https://files.pythonhosted.org/packages/8f/fa/9fb6e594f2ce03ef03eddbdb5f4f90acb1452221a5351116c7c4708ac865/wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317", size = 36419, upload-time = "2025-01-14T10:33:53.551Z" }, + { url = "https://files.pythonhosted.org/packages/47/f8/fb1773491a253cbc123c5d5dc15c86041f746ed30416535f2a8df1f4a392/wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3", size = 38773, upload-time = "2025-01-14T10:33:56.323Z" }, + { url = "https://files.pythonhosted.org/packages/a1/bd/ab55f849fd1f9a58ed7ea47f5559ff09741b25f00c191231f9f059c83949/wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925", size = 53799, upload-time = "2025-01-14T10:33:57.4Z" }, + { url = "https://files.pythonhosted.org/packages/53/18/75ddc64c3f63988f5a1d7e10fb204ffe5762bc663f8023f18ecaf31a332e/wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392", size = 38821, upload-time = "2025-01-14T10:33:59.334Z" }, + { url = "https://files.pythonhosted.org/packages/48/2a/97928387d6ed1c1ebbfd4efc4133a0633546bec8481a2dd5ec961313a1c7/wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40", size = 38919, upload-time = "2025-01-14T10:34:04.093Z" }, + { url = "https://files.pythonhosted.org/packages/73/54/3bfe5a1febbbccb7a2f77de47b989c0b85ed3a6a41614b104204a788c20e/wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d", size = 88721, upload-time = "2025-01-14T10:34:07.163Z" }, + { url = "https://files.pythonhosted.org/packages/25/cb/7262bc1b0300b4b64af50c2720ef958c2c1917525238d661c3e9a2b71b7b/wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b", size = 80899, upload-time = "2025-01-14T10:34:09.82Z" }, + { url = "https://files.pythonhosted.org/packages/2a/5a/04cde32b07a7431d4ed0553a76fdb7a61270e78c5fd5a603e190ac389f14/wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98", size = 89222, upload-time = "2025-01-14T10:34:11.258Z" }, + { url = "https://files.pythonhosted.org/packages/09/28/2e45a4f4771fcfb109e244d5dbe54259e970362a311b67a965555ba65026/wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82", size = 86707, upload-time = "2025-01-14T10:34:12.49Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d2/dcb56bf5f32fcd4bd9aacc77b50a539abdd5b6536872413fd3f428b21bed/wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae", size = 79685, upload-time = "2025-01-14T10:34:15.043Z" }, + { url = "https://files.pythonhosted.org/packages/80/4e/eb8b353e36711347893f502ce91c770b0b0929f8f0bed2670a6856e667a9/wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9", size = 87567, upload-time = "2025-01-14T10:34:16.563Z" }, + { url = "https://files.pythonhosted.org/packages/17/27/4fe749a54e7fae6e7146f1c7d914d28ef599dacd4416566c055564080fe2/wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9", size = 36672, upload-time = "2025-01-14T10:34:17.727Z" }, + { url = "https://files.pythonhosted.org/packages/15/06/1dbf478ea45c03e78a6a8c4be4fdc3c3bddea5c8de8a93bc971415e47f0f/wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991", size = 38865, upload-time = "2025-01-14T10:34:19.577Z" }, + { 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, upload-time = "2025-01-14T10:34:21.571Z" }, + { 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, upload-time = "2025-01-14T10:34:22.999Z" }, + { 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, upload-time = "2025-01-14T10:34:25.386Z" }, + { 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, upload-time = "2025-01-14T10:34:28.058Z" }, + { 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, upload-time = "2025-01-14T10:34:29.167Z" }, + { 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, upload-time = "2025-01-14T10:34:31.702Z" }, + { 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, upload-time = "2025-01-14T10:34:32.91Z" }, + { 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, upload-time = "2025-01-14T10:34:34.903Z" }, + { 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, upload-time = "2025-01-14T10:34:36.13Z" }, + { url = "https://files.pythonhosted.org/packages/f9/f0/13925f4bd6548013038cdeb11ee2cbd4e37c30f8bfd5db9e5a2a370d6e20/wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a", size = 36676, upload-time = "2025-01-14T10:34:37.962Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ae/743f16ef8c2e3628df3ddfd652b7d4c555d12c84b53f3d8218498f4ade9b/wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845", size = 38871, upload-time = "2025-01-14T10:34:39.13Z" }, + { 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, upload-time = "2025-01-14T10:34:40.604Z" }, + { 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, upload-time = "2025-01-14T10:34:45.011Z" }, + { 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, upload-time = "2025-01-14T10:34:47.25Z" }, + { 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, upload-time = "2025-01-14T10:34:50.934Z" }, + { 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, upload-time = "2025-01-14T10:34:52.297Z" }, + { 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, upload-time = "2025-01-14T10:34:53.489Z" }, + { 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, upload-time = "2025-01-14T10:34:55.327Z" }, + { 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, upload-time = "2025-01-14T10:34:58.055Z" }, + { 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, upload-time = "2025-01-14T10:34:59.3Z" }, + { url = "https://files.pythonhosted.org/packages/6a/e1/0122853035b40b3f333bbb25f1939fc1045e21dd518f7f0922b60c156f7c/wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555", size = 37986, upload-time = "2025-01-14T10:35:00.498Z" }, + { url = "https://files.pythonhosted.org/packages/09/5e/1655cf481e079c1f22d0cabdd4e51733679932718dc23bf2db175f329b76/wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", size = 40750, upload-time = "2025-01-14T10:35:03.378Z" }, + { url = "https://files.pythonhosted.org/packages/2d/82/f56956041adef78f849db6b289b282e72b55ab8045a75abad81898c28d19/wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", size = 23594, upload-time = "2025-01-14T10:35:44.018Z" }, ] [[package]] @@ -3660,18 +3678,18 @@ dependencies = [ { name = "packaging" }, { name = "pandas" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e8/c5/a31ba8605005ef080c3d35efc696ddd851aee0a7a22420f9afebec386281/xarray-2025.7.1.tar.gz", hash = "sha256:2884bf5672b540fcc6ff8c20a3196bda0d78fbfb4d67398d60526e97c2faceef", size = 3013717 } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c5/a31ba8605005ef080c3d35efc696ddd851aee0a7a22420f9afebec386281/xarray-2025.7.1.tar.gz", hash = "sha256:2884bf5672b540fcc6ff8c20a3196bda0d78fbfb4d67398d60526e97c2faceef", size = 3013717, upload-time = "2025-07-10T04:53:07.01Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b2/ea/9554e5fb78eda4dbc9e9ccaf23034166fe3e9ea9af82ea6204b9578434bc/xarray-2025.7.1-py3-none-any.whl", hash = "sha256:e8647b659e53bd350d7c5a91c34dd4122ad6a3ca0bc41399d424a7c0273c7635", size = 1324464 }, + { url = "https://files.pythonhosted.org/packages/b2/ea/9554e5fb78eda4dbc9e9ccaf23034166fe3e9ea9af82ea6204b9578434bc/xarray-2025.7.1-py3-none-any.whl", hash = "sha256:e8647b659e53bd350d7c5a91c34dd4122ad6a3ca0bc41399d424a7c0273c7635", size = 1324464, upload-time = "2025-07-10T04:53:05.104Z" }, ] [[package]] name = "xdoctest" version = "1.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e9/a5/7f6dfdaf3a221e16ff79281d2a3c3e4b58989c92de8964a317feb1e6cbb5/xdoctest-1.2.0.tar.gz", hash = "sha256:d8cfca6d8991e488d33f756e600d35b9fdf5efd5c3a249d644efcbbbd2ed5863", size = 204804 } +sdist = { url = "https://files.pythonhosted.org/packages/e9/a5/7f6dfdaf3a221e16ff79281d2a3c3e4b58989c92de8964a317feb1e6cbb5/xdoctest-1.2.0.tar.gz", hash = "sha256:d8cfca6d8991e488d33f756e600d35b9fdf5efd5c3a249d644efcbbbd2ed5863", size = 204804, upload-time = "2024-08-20T13:48:21.076Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/58/b8/e4722f5e5f592a665cc8e55a334ea721c359f09574e6b987dc551a1e1f4c/xdoctest-1.2.0-py3-none-any.whl", hash = "sha256:0f1ecf5939a687bd1fc8deefbff1743c65419cce26dff908f8b84c93fbe486bc", size = 151194 }, + { url = "https://files.pythonhosted.org/packages/58/b8/e4722f5e5f592a665cc8e55a334ea721c359f09574e6b987dc551a1e1f4c/xdoctest-1.2.0-py3-none-any.whl", hash = "sha256:0f1ecf5939a687bd1fc8deefbff1743c65419cce26dff908f8b84c93fbe486bc", size = 151194, upload-time = "2024-08-20T13:48:18.674Z" }, ] [package.optional-dependencies] @@ -3684,9 +3702,9 @@ colors = [ name = "xyzservices" version = "2025.4.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/00/af/c0f7f97bb320d14c089476f487b81f733238cc5603e0914f2e409f49d589/xyzservices-2025.4.0.tar.gz", hash = "sha256:6fe764713648fac53450fbc61a3c366cb6ae5335a1b2ae0c3796b495de3709d8", size = 1134722 } +sdist = { url = "https://files.pythonhosted.org/packages/00/af/c0f7f97bb320d14c089476f487b81f733238cc5603e0914f2e409f49d589/xyzservices-2025.4.0.tar.gz", hash = "sha256:6fe764713648fac53450fbc61a3c366cb6ae5335a1b2ae0c3796b495de3709d8", size = 1134722, upload-time = "2025-04-25T10:38:09.669Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/7d/b77455d7c7c51255b2992b429107fab811b2e36ceaf76da1e55a045dc568/xyzservices-2025.4.0-py3-none-any.whl", hash = "sha256:8d4db9a59213ccb4ce1cf70210584f30b10795bff47627cdfb862b39ff6e10c9", size = 90391 }, + { url = "https://files.pythonhosted.org/packages/d6/7d/b77455d7c7c51255b2992b429107fab811b2e36ceaf76da1e55a045dc568/xyzservices-2025.4.0-py3-none-any.whl", hash = "sha256:8d4db9a59213ccb4ce1cf70210584f30b10795bff47627cdfb862b39ff6e10c9", size = 90391, upload-time = "2025-04-25T10:38:08.468Z" }, ] [[package]] @@ -3698,82 +3716,82 @@ dependencies = [ { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3c/fb/efaa23fa4e45537b827620f04cf8f3cd658b76642205162e072703a5b963/yarl-1.20.1.tar.gz", hash = "sha256:d017a4997ee50c91fd5466cef416231bb82177b93b029906cefc542ce14c35ac", size = 186428 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b1/18/893b50efc2350e47a874c5c2d67e55a0ea5df91186b2a6f5ac52eff887cd/yarl-1.20.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47ee6188fea634bdfaeb2cc420f5b3b17332e6225ce88149a17c413c77ff269e", size = 133833 }, - { url = "https://files.pythonhosted.org/packages/89/ed/b8773448030e6fc47fa797f099ab9eab151a43a25717f9ac043844ad5ea3/yarl-1.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d0f6500f69e8402d513e5eedb77a4e1818691e8f45e6b687147963514d84b44b", size = 91070 }, - { url = "https://files.pythonhosted.org/packages/e3/e3/409bd17b1e42619bf69f60e4f031ce1ccb29bd7380117a55529e76933464/yarl-1.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a8900a42fcdaad568de58887c7b2f602962356908eedb7628eaf6021a6e435b", size = 89818 }, - { url = "https://files.pythonhosted.org/packages/f8/77/64d8431a4d77c856eb2d82aa3de2ad6741365245a29b3a9543cd598ed8c5/yarl-1.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bad6d131fda8ef508b36be3ece16d0902e80b88ea7200f030a0f6c11d9e508d4", size = 347003 }, - { url = "https://files.pythonhosted.org/packages/8d/d2/0c7e4def093dcef0bd9fa22d4d24b023788b0a33b8d0088b51aa51e21e99/yarl-1.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:df018d92fe22aaebb679a7f89fe0c0f368ec497e3dda6cb81a567610f04501f1", size = 336537 }, - { url = "https://files.pythonhosted.org/packages/f0/f3/fc514f4b2cf02cb59d10cbfe228691d25929ce8f72a38db07d3febc3f706/yarl-1.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f969afbb0a9b63c18d0feecf0db09d164b7a44a053e78a7d05f5df163e43833", size = 362358 }, - { url = "https://files.pythonhosted.org/packages/ea/6d/a313ac8d8391381ff9006ac05f1d4331cee3b1efaa833a53d12253733255/yarl-1.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:812303eb4aa98e302886ccda58d6b099e3576b1b9276161469c25803a8db277d", size = 357362 }, - { url = "https://files.pythonhosted.org/packages/00/70/8f78a95d6935a70263d46caa3dd18e1f223cf2f2ff2037baa01a22bc5b22/yarl-1.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98c4a7d166635147924aa0bf9bfe8d8abad6fffa6102de9c99ea04a1376f91e8", size = 348979 }, - { url = "https://files.pythonhosted.org/packages/cb/05/42773027968968f4f15143553970ee36ead27038d627f457cc44bbbeecf3/yarl-1.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12e768f966538e81e6e7550f9086a6236b16e26cd964cf4df35349970f3551cf", size = 337274 }, - { url = "https://files.pythonhosted.org/packages/05/be/665634aa196954156741ea591d2f946f1b78ceee8bb8f28488bf28c0dd62/yarl-1.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe41919b9d899661c5c28a8b4b0acf704510b88f27f0934ac7a7bebdd8938d5e", size = 363294 }, - { url = "https://files.pythonhosted.org/packages/eb/90/73448401d36fa4e210ece5579895731f190d5119c4b66b43b52182e88cd5/yarl-1.20.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:8601bc010d1d7780592f3fc1bdc6c72e2b6466ea34569778422943e1a1f3c389", size = 358169 }, - { url = "https://files.pythonhosted.org/packages/c3/b0/fce922d46dc1eb43c811f1889f7daa6001b27a4005587e94878570300881/yarl-1.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:daadbdc1f2a9033a2399c42646fbd46da7992e868a5fe9513860122d7fe7a73f", size = 362776 }, - { url = "https://files.pythonhosted.org/packages/f1/0d/b172628fce039dae8977fd22caeff3eeebffd52e86060413f5673767c427/yarl-1.20.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:03aa1e041727cb438ca762628109ef1333498b122e4c76dd858d186a37cec845", size = 381341 }, - { url = "https://files.pythonhosted.org/packages/6b/9b/5b886d7671f4580209e855974fe1cecec409aa4a89ea58b8f0560dc529b1/yarl-1.20.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:642980ef5e0fa1de5fa96d905c7e00cb2c47cb468bfcac5a18c58e27dbf8d8d1", size = 379988 }, - { url = "https://files.pythonhosted.org/packages/73/be/75ef5fd0fcd8f083a5d13f78fd3f009528132a1f2a1d7c925c39fa20aa79/yarl-1.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:86971e2795584fe8c002356d3b97ef6c61862720eeff03db2a7c86b678d85b3e", size = 371113 }, - { url = "https://files.pythonhosted.org/packages/50/4f/62faab3b479dfdcb741fe9e3f0323e2a7d5cd1ab2edc73221d57ad4834b2/yarl-1.20.1-cp311-cp311-win32.whl", hash = "sha256:597f40615b8d25812f14562699e287f0dcc035d25eb74da72cae043bb884d773", size = 81485 }, - { url = "https://files.pythonhosted.org/packages/f0/09/d9c7942f8f05c32ec72cd5c8e041c8b29b5807328b68b4801ff2511d4d5e/yarl-1.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:26ef53a9e726e61e9cd1cda6b478f17e350fb5800b4bd1cd9fe81c4d91cfeb2e", size = 86686 }, - { url = "https://files.pythonhosted.org/packages/5f/9a/cb7fad7d73c69f296eda6815e4a2c7ed53fc70c2f136479a91c8e5fbdb6d/yarl-1.20.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdcc4cd244e58593a4379fe60fdee5ac0331f8eb70320a24d591a3be197b94a9", size = 133667 }, - { url = "https://files.pythonhosted.org/packages/67/38/688577a1cb1e656e3971fb66a3492501c5a5df56d99722e57c98249e5b8a/yarl-1.20.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b29a2c385a5f5b9c7d9347e5812b6f7ab267193c62d282a540b4fc528c8a9d2a", size = 91025 }, - { url = "https://files.pythonhosted.org/packages/50/ec/72991ae51febeb11a42813fc259f0d4c8e0507f2b74b5514618d8b640365/yarl-1.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1112ae8154186dfe2de4732197f59c05a83dc814849a5ced892b708033f40dc2", size = 89709 }, - { url = "https://files.pythonhosted.org/packages/99/da/4d798025490e89426e9f976702e5f9482005c548c579bdae792a4c37769e/yarl-1.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90bbd29c4fe234233f7fa2b9b121fb63c321830e5d05b45153a2ca68f7d310ee", size = 352287 }, - { url = "https://files.pythonhosted.org/packages/1a/26/54a15c6a567aac1c61b18aa0f4b8aa2e285a52d547d1be8bf48abe2b3991/yarl-1.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:680e19c7ce3710ac4cd964e90dad99bf9b5029372ba0c7cbfcd55e54d90ea819", size = 345429 }, - { url = "https://files.pythonhosted.org/packages/d6/95/9dcf2386cb875b234353b93ec43e40219e14900e046bf6ac118f94b1e353/yarl-1.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a979218c1fdb4246a05efc2cc23859d47c89af463a90b99b7c56094daf25a16", size = 365429 }, - { url = "https://files.pythonhosted.org/packages/91/b2/33a8750f6a4bc224242a635f5f2cff6d6ad5ba651f6edcccf721992c21a0/yarl-1.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255b468adf57b4a7b65d8aad5b5138dce6a0752c139965711bdcb81bc370e1b6", size = 363862 }, - { url = "https://files.pythonhosted.org/packages/98/28/3ab7acc5b51f4434b181b0cee8f1f4b77a65919700a355fb3617f9488874/yarl-1.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a97d67108e79cfe22e2b430d80d7571ae57d19f17cda8bb967057ca8a7bf5bfd", size = 355616 }, - { url = "https://files.pythonhosted.org/packages/36/a3/f666894aa947a371724ec7cd2e5daa78ee8a777b21509b4252dd7bd15e29/yarl-1.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8570d998db4ddbfb9a590b185a0a33dbf8aafb831d07a5257b4ec9948df9cb0a", size = 339954 }, - { url = "https://files.pythonhosted.org/packages/f1/81/5f466427e09773c04219d3450d7a1256138a010b6c9f0af2d48565e9ad13/yarl-1.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97c75596019baae7c71ccf1d8cc4738bc08134060d0adfcbe5642f778d1dca38", size = 365575 }, - { url = "https://files.pythonhosted.org/packages/2e/e3/e4b0ad8403e97e6c9972dd587388940a032f030ebec196ab81a3b8e94d31/yarl-1.20.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1c48912653e63aef91ff988c5432832692ac5a1d8f0fb8a33091520b5bbe19ef", size = 365061 }, - { url = "https://files.pythonhosted.org/packages/ac/99/b8a142e79eb86c926f9f06452eb13ecb1bb5713bd01dc0038faf5452e544/yarl-1.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4c3ae28f3ae1563c50f3d37f064ddb1511ecc1d5584e88c6b7c63cf7702a6d5f", size = 364142 }, - { url = "https://files.pythonhosted.org/packages/34/f2/08ed34a4a506d82a1a3e5bab99ccd930a040f9b6449e9fd050320e45845c/yarl-1.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c5e9642f27036283550f5f57dc6156c51084b458570b9d0d96100c8bebb186a8", size = 381894 }, - { url = "https://files.pythonhosted.org/packages/92/f8/9a3fbf0968eac704f681726eff595dce9b49c8a25cd92bf83df209668285/yarl-1.20.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2c26b0c49220d5799f7b22c6838409ee9bc58ee5c95361a4d7831f03cc225b5a", size = 383378 }, - { url = "https://files.pythonhosted.org/packages/af/85/9363f77bdfa1e4d690957cd39d192c4cacd1c58965df0470a4905253b54f/yarl-1.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:564ab3d517e3d01c408c67f2e5247aad4019dcf1969982aba3974b4093279004", size = 374069 }, - { url = "https://files.pythonhosted.org/packages/35/99/9918c8739ba271dcd935400cff8b32e3cd319eaf02fcd023d5dcd487a7c8/yarl-1.20.1-cp312-cp312-win32.whl", hash = "sha256:daea0d313868da1cf2fac6b2d3a25c6e3a9e879483244be38c8e6a41f1d876a5", size = 81249 }, - { url = "https://files.pythonhosted.org/packages/eb/83/5d9092950565481b413b31a23e75dd3418ff0a277d6e0abf3729d4d1ce25/yarl-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:48ea7d7f9be0487339828a4de0360d7ce0efc06524a48e1810f945c45b813698", size = 86710 }, - { url = "https://files.pythonhosted.org/packages/8a/e1/2411b6d7f769a07687acee88a062af5833cf1966b7266f3d8dfb3d3dc7d3/yarl-1.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0b5ff0fbb7c9f1b1b5ab53330acbfc5247893069e7716840c8e7d5bb7355038a", size = 131811 }, - { url = "https://files.pythonhosted.org/packages/b2/27/584394e1cb76fb771371770eccad35de400e7b434ce3142c2dd27392c968/yarl-1.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:14f326acd845c2b2e2eb38fb1346c94f7f3b01a4f5c788f8144f9b630bfff9a3", size = 90078 }, - { url = "https://files.pythonhosted.org/packages/bf/9a/3246ae92d4049099f52d9b0fe3486e3b500e29b7ea872d0f152966fc209d/yarl-1.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f60e4ad5db23f0b96e49c018596707c3ae89f5d0bd97f0ad3684bcbad899f1e7", size = 88748 }, - { url = "https://files.pythonhosted.org/packages/a3/25/35afe384e31115a1a801fbcf84012d7a066d89035befae7c5d4284df1e03/yarl-1.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49bdd1b8e00ce57e68ba51916e4bb04461746e794e7c4d4bbc42ba2f18297691", size = 349595 }, - { url = "https://files.pythonhosted.org/packages/28/2d/8aca6cb2cabc8f12efcb82749b9cefecbccfc7b0384e56cd71058ccee433/yarl-1.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:66252d780b45189975abfed839616e8fd2dbacbdc262105ad7742c6ae58f3e31", size = 342616 }, - { url = "https://files.pythonhosted.org/packages/0b/e9/1312633d16b31acf0098d30440ca855e3492d66623dafb8e25b03d00c3da/yarl-1.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59174e7332f5d153d8f7452a102b103e2e74035ad085f404df2e40e663a22b28", size = 361324 }, - { url = "https://files.pythonhosted.org/packages/bc/a0/688cc99463f12f7669eec7c8acc71ef56a1521b99eab7cd3abb75af887b0/yarl-1.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3968ec7d92a0c0f9ac34d5ecfd03869ec0cab0697c91a45db3fbbd95fe1b653", size = 359676 }, - { url = "https://files.pythonhosted.org/packages/af/44/46407d7f7a56e9a85a4c207724c9f2c545c060380718eea9088f222ba697/yarl-1.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1a4fbb50e14396ba3d375f68bfe02215d8e7bc3ec49da8341fe3157f59d2ff5", size = 352614 }, - { url = "https://files.pythonhosted.org/packages/b1/91/31163295e82b8d5485d31d9cf7754d973d41915cadce070491778d9c9825/yarl-1.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11a62c839c3a8eac2410e951301309426f368388ff2f33799052787035793b02", size = 336766 }, - { url = "https://files.pythonhosted.org/packages/b4/8e/c41a5bc482121f51c083c4c2bcd16b9e01e1cf8729e380273a952513a21f/yarl-1.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:041eaa14f73ff5a8986b4388ac6bb43a77f2ea09bf1913df7a35d4646db69e53", size = 364615 }, - { url = "https://files.pythonhosted.org/packages/e3/5b/61a3b054238d33d70ea06ebba7e58597891b71c699e247df35cc984ab393/yarl-1.20.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:377fae2fef158e8fd9d60b4c8751387b8d1fb121d3d0b8e9b0be07d1b41e83dc", size = 360982 }, - { url = "https://files.pythonhosted.org/packages/df/a3/6a72fb83f8d478cb201d14927bc8040af901811a88e0ff2da7842dd0ed19/yarl-1.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1c92f4390e407513f619d49319023664643d3339bd5e5a56a3bebe01bc67ec04", size = 369792 }, - { url = "https://files.pythonhosted.org/packages/7c/af/4cc3c36dfc7c077f8dedb561eb21f69e1e9f2456b91b593882b0b18c19dc/yarl-1.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d25ddcf954df1754ab0f86bb696af765c5bfaba39b74095f27eececa049ef9a4", size = 382049 }, - { url = "https://files.pythonhosted.org/packages/19/3a/e54e2c4752160115183a66dc9ee75a153f81f3ab2ba4bf79c3c53b33de34/yarl-1.20.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:909313577e9619dcff8c31a0ea2aa0a2a828341d92673015456b3ae492e7317b", size = 384774 }, - { url = "https://files.pythonhosted.org/packages/9c/20/200ae86dabfca89060ec6447649f219b4cbd94531e425e50d57e5f5ac330/yarl-1.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:793fd0580cb9664548c6b83c63b43c477212c0260891ddf86809e1c06c8b08f1", size = 374252 }, - { url = "https://files.pythonhosted.org/packages/83/75/11ee332f2f516b3d094e89448da73d557687f7d137d5a0f48c40ff211487/yarl-1.20.1-cp313-cp313-win32.whl", hash = "sha256:468f6e40285de5a5b3c44981ca3a319a4b208ccc07d526b20b12aeedcfa654b7", size = 81198 }, - { url = "https://files.pythonhosted.org/packages/ba/ba/39b1ecbf51620b40ab402b0fc817f0ff750f6d92712b44689c2c215be89d/yarl-1.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:495b4ef2fea40596bfc0affe3837411d6aa3371abcf31aac0ccc4bdd64d4ef5c", size = 86346 }, - { url = "https://files.pythonhosted.org/packages/43/c7/669c52519dca4c95153c8ad96dd123c79f354a376346b198f438e56ffeb4/yarl-1.20.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f60233b98423aab21d249a30eb27c389c14929f47be8430efa7dbd91493a729d", size = 138826 }, - { url = "https://files.pythonhosted.org/packages/6a/42/fc0053719b44f6ad04a75d7f05e0e9674d45ef62f2d9ad2c1163e5c05827/yarl-1.20.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6f3eff4cc3f03d650d8755c6eefc844edde99d641d0dcf4da3ab27141a5f8ddf", size = 93217 }, - { url = "https://files.pythonhosted.org/packages/4f/7f/fa59c4c27e2a076bba0d959386e26eba77eb52ea4a0aac48e3515c186b4c/yarl-1.20.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:69ff8439d8ba832d6bed88af2c2b3445977eba9a4588b787b32945871c2444e3", size = 92700 }, - { url = "https://files.pythonhosted.org/packages/2f/d4/062b2f48e7c93481e88eff97a6312dca15ea200e959f23e96d8ab898c5b8/yarl-1.20.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cf34efa60eb81dd2645a2e13e00bb98b76c35ab5061a3989c7a70f78c85006d", size = 347644 }, - { url = "https://files.pythonhosted.org/packages/89/47/78b7f40d13c8f62b499cc702fdf69e090455518ae544c00a3bf4afc9fc77/yarl-1.20.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8e0fe9364ad0fddab2688ce72cb7a8e61ea42eff3c7caeeb83874a5d479c896c", size = 323452 }, - { url = "https://files.pythonhosted.org/packages/eb/2b/490d3b2dc66f52987d4ee0d3090a147ea67732ce6b4d61e362c1846d0d32/yarl-1.20.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f64fbf81878ba914562c672024089e3401974a39767747691c65080a67b18c1", size = 346378 }, - { url = "https://files.pythonhosted.org/packages/66/ad/775da9c8a94ce925d1537f939a4f17d782efef1f973039d821cbe4bcc211/yarl-1.20.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6342d643bf9a1de97e512e45e4b9560a043347e779a173250824f8b254bd5ce", size = 353261 }, - { url = "https://files.pythonhosted.org/packages/4b/23/0ed0922b47a4f5c6eb9065d5ff1e459747226ddce5c6a4c111e728c9f701/yarl-1.20.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56dac5f452ed25eef0f6e3c6a066c6ab68971d96a9fb441791cad0efba6140d3", size = 335987 }, - { url = "https://files.pythonhosted.org/packages/3e/49/bc728a7fe7d0e9336e2b78f0958a2d6b288ba89f25a1762407a222bf53c3/yarl-1.20.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7d7f497126d65e2cad8dc5f97d34c27b19199b6414a40cb36b52f41b79014be", size = 329361 }, - { url = "https://files.pythonhosted.org/packages/93/8f/b811b9d1f617c83c907e7082a76e2b92b655400e61730cd61a1f67178393/yarl-1.20.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:67e708dfb8e78d8a19169818eeb5c7a80717562de9051bf2413aca8e3696bf16", size = 346460 }, - { url = "https://files.pythonhosted.org/packages/70/fd/af94f04f275f95da2c3b8b5e1d49e3e79f1ed8b6ceb0f1664cbd902773ff/yarl-1.20.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:595c07bc79af2494365cc96ddeb772f76272364ef7c80fb892ef9d0649586513", size = 334486 }, - { url = "https://files.pythonhosted.org/packages/84/65/04c62e82704e7dd0a9b3f61dbaa8447f8507655fd16c51da0637b39b2910/yarl-1.20.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7bdd2f80f4a7df852ab9ab49484a4dee8030023aa536df41f2d922fd57bf023f", size = 342219 }, - { url = "https://files.pythonhosted.org/packages/91/95/459ca62eb958381b342d94ab9a4b6aec1ddec1f7057c487e926f03c06d30/yarl-1.20.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c03bfebc4ae8d862f853a9757199677ab74ec25424d0ebd68a0027e9c639a390", size = 350693 }, - { url = "https://files.pythonhosted.org/packages/a6/00/d393e82dd955ad20617abc546a8f1aee40534d599ff555ea053d0ec9bf03/yarl-1.20.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:344d1103e9c1523f32a5ed704d576172d2cabed3122ea90b1d4e11fe17c66458", size = 355803 }, - { url = "https://files.pythonhosted.org/packages/9e/ed/c5fb04869b99b717985e244fd93029c7a8e8febdfcffa06093e32d7d44e7/yarl-1.20.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:88cab98aa4e13e1ade8c141daeedd300a4603b7132819c484841bb7af3edce9e", size = 341709 }, - { url = "https://files.pythonhosted.org/packages/24/fd/725b8e73ac2a50e78a4534ac43c6addf5c1c2d65380dd48a9169cc6739a9/yarl-1.20.1-cp313-cp313t-win32.whl", hash = "sha256:b121ff6a7cbd4abc28985b6028235491941b9fe8fe226e6fdc539c977ea1739d", size = 86591 }, - { url = "https://files.pythonhosted.org/packages/94/c3/b2e9f38bc3e11191981d57ea08cab2166e74ea770024a646617c9cddd9f6/yarl-1.20.1-cp313-cp313t-win_amd64.whl", hash = "sha256:541d050a355bbbc27e55d906bc91cb6fe42f96c01413dd0f4ed5a5240513874f", size = 93003 }, - { url = "https://files.pythonhosted.org/packages/b4/2d/2345fce04cfd4bee161bf1e7d9cdc702e3e16109021035dbb24db654a622/yarl-1.20.1-py3-none-any.whl", hash = "sha256:83b8eb083fe4683c6115795d9fc1cfaf2cbbefb19b3a1cb68f6527460f483a77", size = 46542 }, +sdist = { url = "https://files.pythonhosted.org/packages/3c/fb/efaa23fa4e45537b827620f04cf8f3cd658b76642205162e072703a5b963/yarl-1.20.1.tar.gz", hash = "sha256:d017a4997ee50c91fd5466cef416231bb82177b93b029906cefc542ce14c35ac", size = 186428, upload-time = "2025-06-10T00:46:09.923Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/18/893b50efc2350e47a874c5c2d67e55a0ea5df91186b2a6f5ac52eff887cd/yarl-1.20.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:47ee6188fea634bdfaeb2cc420f5b3b17332e6225ce88149a17c413c77ff269e", size = 133833, upload-time = "2025-06-10T00:43:07.393Z" }, + { url = "https://files.pythonhosted.org/packages/89/ed/b8773448030e6fc47fa797f099ab9eab151a43a25717f9ac043844ad5ea3/yarl-1.20.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d0f6500f69e8402d513e5eedb77a4e1818691e8f45e6b687147963514d84b44b", size = 91070, upload-time = "2025-06-10T00:43:09.538Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e3/409bd17b1e42619bf69f60e4f031ce1ccb29bd7380117a55529e76933464/yarl-1.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a8900a42fcdaad568de58887c7b2f602962356908eedb7628eaf6021a6e435b", size = 89818, upload-time = "2025-06-10T00:43:11.575Z" }, + { url = "https://files.pythonhosted.org/packages/f8/77/64d8431a4d77c856eb2d82aa3de2ad6741365245a29b3a9543cd598ed8c5/yarl-1.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bad6d131fda8ef508b36be3ece16d0902e80b88ea7200f030a0f6c11d9e508d4", size = 347003, upload-time = "2025-06-10T00:43:14.088Z" }, + { url = "https://files.pythonhosted.org/packages/8d/d2/0c7e4def093dcef0bd9fa22d4d24b023788b0a33b8d0088b51aa51e21e99/yarl-1.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:df018d92fe22aaebb679a7f89fe0c0f368ec497e3dda6cb81a567610f04501f1", size = 336537, upload-time = "2025-06-10T00:43:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f3/fc514f4b2cf02cb59d10cbfe228691d25929ce8f72a38db07d3febc3f706/yarl-1.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f969afbb0a9b63c18d0feecf0db09d164b7a44a053e78a7d05f5df163e43833", size = 362358, upload-time = "2025-06-10T00:43:18.704Z" }, + { url = "https://files.pythonhosted.org/packages/ea/6d/a313ac8d8391381ff9006ac05f1d4331cee3b1efaa833a53d12253733255/yarl-1.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:812303eb4aa98e302886ccda58d6b099e3576b1b9276161469c25803a8db277d", size = 357362, upload-time = "2025-06-10T00:43:20.888Z" }, + { url = "https://files.pythonhosted.org/packages/00/70/8f78a95d6935a70263d46caa3dd18e1f223cf2f2ff2037baa01a22bc5b22/yarl-1.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98c4a7d166635147924aa0bf9bfe8d8abad6fffa6102de9c99ea04a1376f91e8", size = 348979, upload-time = "2025-06-10T00:43:23.169Z" }, + { url = "https://files.pythonhosted.org/packages/cb/05/42773027968968f4f15143553970ee36ead27038d627f457cc44bbbeecf3/yarl-1.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12e768f966538e81e6e7550f9086a6236b16e26cd964cf4df35349970f3551cf", size = 337274, upload-time = "2025-06-10T00:43:27.111Z" }, + { url = "https://files.pythonhosted.org/packages/05/be/665634aa196954156741ea591d2f946f1b78ceee8bb8f28488bf28c0dd62/yarl-1.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe41919b9d899661c5c28a8b4b0acf704510b88f27f0934ac7a7bebdd8938d5e", size = 363294, upload-time = "2025-06-10T00:43:28.96Z" }, + { url = "https://files.pythonhosted.org/packages/eb/90/73448401d36fa4e210ece5579895731f190d5119c4b66b43b52182e88cd5/yarl-1.20.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:8601bc010d1d7780592f3fc1bdc6c72e2b6466ea34569778422943e1a1f3c389", size = 358169, upload-time = "2025-06-10T00:43:30.701Z" }, + { url = "https://files.pythonhosted.org/packages/c3/b0/fce922d46dc1eb43c811f1889f7daa6001b27a4005587e94878570300881/yarl-1.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:daadbdc1f2a9033a2399c42646fbd46da7992e868a5fe9513860122d7fe7a73f", size = 362776, upload-time = "2025-06-10T00:43:32.51Z" }, + { url = "https://files.pythonhosted.org/packages/f1/0d/b172628fce039dae8977fd22caeff3eeebffd52e86060413f5673767c427/yarl-1.20.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:03aa1e041727cb438ca762628109ef1333498b122e4c76dd858d186a37cec845", size = 381341, upload-time = "2025-06-10T00:43:34.543Z" }, + { url = "https://files.pythonhosted.org/packages/6b/9b/5b886d7671f4580209e855974fe1cecec409aa4a89ea58b8f0560dc529b1/yarl-1.20.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:642980ef5e0fa1de5fa96d905c7e00cb2c47cb468bfcac5a18c58e27dbf8d8d1", size = 379988, upload-time = "2025-06-10T00:43:36.489Z" }, + { url = "https://files.pythonhosted.org/packages/73/be/75ef5fd0fcd8f083a5d13f78fd3f009528132a1f2a1d7c925c39fa20aa79/yarl-1.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:86971e2795584fe8c002356d3b97ef6c61862720eeff03db2a7c86b678d85b3e", size = 371113, upload-time = "2025-06-10T00:43:38.592Z" }, + { url = "https://files.pythonhosted.org/packages/50/4f/62faab3b479dfdcb741fe9e3f0323e2a7d5cd1ab2edc73221d57ad4834b2/yarl-1.20.1-cp311-cp311-win32.whl", hash = "sha256:597f40615b8d25812f14562699e287f0dcc035d25eb74da72cae043bb884d773", size = 81485, upload-time = "2025-06-10T00:43:41.038Z" }, + { url = "https://files.pythonhosted.org/packages/f0/09/d9c7942f8f05c32ec72cd5c8e041c8b29b5807328b68b4801ff2511d4d5e/yarl-1.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:26ef53a9e726e61e9cd1cda6b478f17e350fb5800b4bd1cd9fe81c4d91cfeb2e", size = 86686, upload-time = "2025-06-10T00:43:42.692Z" }, + { url = "https://files.pythonhosted.org/packages/5f/9a/cb7fad7d73c69f296eda6815e4a2c7ed53fc70c2f136479a91c8e5fbdb6d/yarl-1.20.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdcc4cd244e58593a4379fe60fdee5ac0331f8eb70320a24d591a3be197b94a9", size = 133667, upload-time = "2025-06-10T00:43:44.369Z" }, + { url = "https://files.pythonhosted.org/packages/67/38/688577a1cb1e656e3971fb66a3492501c5a5df56d99722e57c98249e5b8a/yarl-1.20.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b29a2c385a5f5b9c7d9347e5812b6f7ab267193c62d282a540b4fc528c8a9d2a", size = 91025, upload-time = "2025-06-10T00:43:46.295Z" }, + { url = "https://files.pythonhosted.org/packages/50/ec/72991ae51febeb11a42813fc259f0d4c8e0507f2b74b5514618d8b640365/yarl-1.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1112ae8154186dfe2de4732197f59c05a83dc814849a5ced892b708033f40dc2", size = 89709, upload-time = "2025-06-10T00:43:48.22Z" }, + { url = "https://files.pythonhosted.org/packages/99/da/4d798025490e89426e9f976702e5f9482005c548c579bdae792a4c37769e/yarl-1.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90bbd29c4fe234233f7fa2b9b121fb63c321830e5d05b45153a2ca68f7d310ee", size = 352287, upload-time = "2025-06-10T00:43:49.924Z" }, + { url = "https://files.pythonhosted.org/packages/1a/26/54a15c6a567aac1c61b18aa0f4b8aa2e285a52d547d1be8bf48abe2b3991/yarl-1.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:680e19c7ce3710ac4cd964e90dad99bf9b5029372ba0c7cbfcd55e54d90ea819", size = 345429, upload-time = "2025-06-10T00:43:51.7Z" }, + { url = "https://files.pythonhosted.org/packages/d6/95/9dcf2386cb875b234353b93ec43e40219e14900e046bf6ac118f94b1e353/yarl-1.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4a979218c1fdb4246a05efc2cc23859d47c89af463a90b99b7c56094daf25a16", size = 365429, upload-time = "2025-06-10T00:43:53.494Z" }, + { url = "https://files.pythonhosted.org/packages/91/b2/33a8750f6a4bc224242a635f5f2cff6d6ad5ba651f6edcccf721992c21a0/yarl-1.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:255b468adf57b4a7b65d8aad5b5138dce6a0752c139965711bdcb81bc370e1b6", size = 363862, upload-time = "2025-06-10T00:43:55.766Z" }, + { url = "https://files.pythonhosted.org/packages/98/28/3ab7acc5b51f4434b181b0cee8f1f4b77a65919700a355fb3617f9488874/yarl-1.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a97d67108e79cfe22e2b430d80d7571ae57d19f17cda8bb967057ca8a7bf5bfd", size = 355616, upload-time = "2025-06-10T00:43:58.056Z" }, + { url = "https://files.pythonhosted.org/packages/36/a3/f666894aa947a371724ec7cd2e5daa78ee8a777b21509b4252dd7bd15e29/yarl-1.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8570d998db4ddbfb9a590b185a0a33dbf8aafb831d07a5257b4ec9948df9cb0a", size = 339954, upload-time = "2025-06-10T00:43:59.773Z" }, + { url = "https://files.pythonhosted.org/packages/f1/81/5f466427e09773c04219d3450d7a1256138a010b6c9f0af2d48565e9ad13/yarl-1.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97c75596019baae7c71ccf1d8cc4738bc08134060d0adfcbe5642f778d1dca38", size = 365575, upload-time = "2025-06-10T00:44:02.051Z" }, + { url = "https://files.pythonhosted.org/packages/2e/e3/e4b0ad8403e97e6c9972dd587388940a032f030ebec196ab81a3b8e94d31/yarl-1.20.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:1c48912653e63aef91ff988c5432832692ac5a1d8f0fb8a33091520b5bbe19ef", size = 365061, upload-time = "2025-06-10T00:44:04.196Z" }, + { url = "https://files.pythonhosted.org/packages/ac/99/b8a142e79eb86c926f9f06452eb13ecb1bb5713bd01dc0038faf5452e544/yarl-1.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4c3ae28f3ae1563c50f3d37f064ddb1511ecc1d5584e88c6b7c63cf7702a6d5f", size = 364142, upload-time = "2025-06-10T00:44:06.527Z" }, + { url = "https://files.pythonhosted.org/packages/34/f2/08ed34a4a506d82a1a3e5bab99ccd930a040f9b6449e9fd050320e45845c/yarl-1.20.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c5e9642f27036283550f5f57dc6156c51084b458570b9d0d96100c8bebb186a8", size = 381894, upload-time = "2025-06-10T00:44:08.379Z" }, + { url = "https://files.pythonhosted.org/packages/92/f8/9a3fbf0968eac704f681726eff595dce9b49c8a25cd92bf83df209668285/yarl-1.20.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2c26b0c49220d5799f7b22c6838409ee9bc58ee5c95361a4d7831f03cc225b5a", size = 383378, upload-time = "2025-06-10T00:44:10.51Z" }, + { url = "https://files.pythonhosted.org/packages/af/85/9363f77bdfa1e4d690957cd39d192c4cacd1c58965df0470a4905253b54f/yarl-1.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:564ab3d517e3d01c408c67f2e5247aad4019dcf1969982aba3974b4093279004", size = 374069, upload-time = "2025-06-10T00:44:12.834Z" }, + { url = "https://files.pythonhosted.org/packages/35/99/9918c8739ba271dcd935400cff8b32e3cd319eaf02fcd023d5dcd487a7c8/yarl-1.20.1-cp312-cp312-win32.whl", hash = "sha256:daea0d313868da1cf2fac6b2d3a25c6e3a9e879483244be38c8e6a41f1d876a5", size = 81249, upload-time = "2025-06-10T00:44:14.731Z" }, + { url = "https://files.pythonhosted.org/packages/eb/83/5d9092950565481b413b31a23e75dd3418ff0a277d6e0abf3729d4d1ce25/yarl-1.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:48ea7d7f9be0487339828a4de0360d7ce0efc06524a48e1810f945c45b813698", size = 86710, upload-time = "2025-06-10T00:44:16.716Z" }, + { url = "https://files.pythonhosted.org/packages/8a/e1/2411b6d7f769a07687acee88a062af5833cf1966b7266f3d8dfb3d3dc7d3/yarl-1.20.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0b5ff0fbb7c9f1b1b5ab53330acbfc5247893069e7716840c8e7d5bb7355038a", size = 131811, upload-time = "2025-06-10T00:44:18.933Z" }, + { url = "https://files.pythonhosted.org/packages/b2/27/584394e1cb76fb771371770eccad35de400e7b434ce3142c2dd27392c968/yarl-1.20.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:14f326acd845c2b2e2eb38fb1346c94f7f3b01a4f5c788f8144f9b630bfff9a3", size = 90078, upload-time = "2025-06-10T00:44:20.635Z" }, + { url = "https://files.pythonhosted.org/packages/bf/9a/3246ae92d4049099f52d9b0fe3486e3b500e29b7ea872d0f152966fc209d/yarl-1.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f60e4ad5db23f0b96e49c018596707c3ae89f5d0bd97f0ad3684bcbad899f1e7", size = 88748, upload-time = "2025-06-10T00:44:22.34Z" }, + { url = "https://files.pythonhosted.org/packages/a3/25/35afe384e31115a1a801fbcf84012d7a066d89035befae7c5d4284df1e03/yarl-1.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49bdd1b8e00ce57e68ba51916e4bb04461746e794e7c4d4bbc42ba2f18297691", size = 349595, upload-time = "2025-06-10T00:44:24.314Z" }, + { url = "https://files.pythonhosted.org/packages/28/2d/8aca6cb2cabc8f12efcb82749b9cefecbccfc7b0384e56cd71058ccee433/yarl-1.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:66252d780b45189975abfed839616e8fd2dbacbdc262105ad7742c6ae58f3e31", size = 342616, upload-time = "2025-06-10T00:44:26.167Z" }, + { url = "https://files.pythonhosted.org/packages/0b/e9/1312633d16b31acf0098d30440ca855e3492d66623dafb8e25b03d00c3da/yarl-1.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59174e7332f5d153d8f7452a102b103e2e74035ad085f404df2e40e663a22b28", size = 361324, upload-time = "2025-06-10T00:44:27.915Z" }, + { url = "https://files.pythonhosted.org/packages/bc/a0/688cc99463f12f7669eec7c8acc71ef56a1521b99eab7cd3abb75af887b0/yarl-1.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e3968ec7d92a0c0f9ac34d5ecfd03869ec0cab0697c91a45db3fbbd95fe1b653", size = 359676, upload-time = "2025-06-10T00:44:30.041Z" }, + { url = "https://files.pythonhosted.org/packages/af/44/46407d7f7a56e9a85a4c207724c9f2c545c060380718eea9088f222ba697/yarl-1.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1a4fbb50e14396ba3d375f68bfe02215d8e7bc3ec49da8341fe3157f59d2ff5", size = 352614, upload-time = "2025-06-10T00:44:32.171Z" }, + { url = "https://files.pythonhosted.org/packages/b1/91/31163295e82b8d5485d31d9cf7754d973d41915cadce070491778d9c9825/yarl-1.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11a62c839c3a8eac2410e951301309426f368388ff2f33799052787035793b02", size = 336766, upload-time = "2025-06-10T00:44:34.494Z" }, + { url = "https://files.pythonhosted.org/packages/b4/8e/c41a5bc482121f51c083c4c2bcd16b9e01e1cf8729e380273a952513a21f/yarl-1.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:041eaa14f73ff5a8986b4388ac6bb43a77f2ea09bf1913df7a35d4646db69e53", size = 364615, upload-time = "2025-06-10T00:44:36.856Z" }, + { url = "https://files.pythonhosted.org/packages/e3/5b/61a3b054238d33d70ea06ebba7e58597891b71c699e247df35cc984ab393/yarl-1.20.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:377fae2fef158e8fd9d60b4c8751387b8d1fb121d3d0b8e9b0be07d1b41e83dc", size = 360982, upload-time = "2025-06-10T00:44:39.141Z" }, + { url = "https://files.pythonhosted.org/packages/df/a3/6a72fb83f8d478cb201d14927bc8040af901811a88e0ff2da7842dd0ed19/yarl-1.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1c92f4390e407513f619d49319023664643d3339bd5e5a56a3bebe01bc67ec04", size = 369792, upload-time = "2025-06-10T00:44:40.934Z" }, + { url = "https://files.pythonhosted.org/packages/7c/af/4cc3c36dfc7c077f8dedb561eb21f69e1e9f2456b91b593882b0b18c19dc/yarl-1.20.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d25ddcf954df1754ab0f86bb696af765c5bfaba39b74095f27eececa049ef9a4", size = 382049, upload-time = "2025-06-10T00:44:42.854Z" }, + { url = "https://files.pythonhosted.org/packages/19/3a/e54e2c4752160115183a66dc9ee75a153f81f3ab2ba4bf79c3c53b33de34/yarl-1.20.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:909313577e9619dcff8c31a0ea2aa0a2a828341d92673015456b3ae492e7317b", size = 384774, upload-time = "2025-06-10T00:44:45.275Z" }, + { url = "https://files.pythonhosted.org/packages/9c/20/200ae86dabfca89060ec6447649f219b4cbd94531e425e50d57e5f5ac330/yarl-1.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:793fd0580cb9664548c6b83c63b43c477212c0260891ddf86809e1c06c8b08f1", size = 374252, upload-time = "2025-06-10T00:44:47.31Z" }, + { url = "https://files.pythonhosted.org/packages/83/75/11ee332f2f516b3d094e89448da73d557687f7d137d5a0f48c40ff211487/yarl-1.20.1-cp313-cp313-win32.whl", hash = "sha256:468f6e40285de5a5b3c44981ca3a319a4b208ccc07d526b20b12aeedcfa654b7", size = 81198, upload-time = "2025-06-10T00:44:49.164Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ba/39b1ecbf51620b40ab402b0fc817f0ff750f6d92712b44689c2c215be89d/yarl-1.20.1-cp313-cp313-win_amd64.whl", hash = "sha256:495b4ef2fea40596bfc0affe3837411d6aa3371abcf31aac0ccc4bdd64d4ef5c", size = 86346, upload-time = "2025-06-10T00:44:51.182Z" }, + { url = "https://files.pythonhosted.org/packages/43/c7/669c52519dca4c95153c8ad96dd123c79f354a376346b198f438e56ffeb4/yarl-1.20.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f60233b98423aab21d249a30eb27c389c14929f47be8430efa7dbd91493a729d", size = 138826, upload-time = "2025-06-10T00:44:52.883Z" }, + { url = "https://files.pythonhosted.org/packages/6a/42/fc0053719b44f6ad04a75d7f05e0e9674d45ef62f2d9ad2c1163e5c05827/yarl-1.20.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6f3eff4cc3f03d650d8755c6eefc844edde99d641d0dcf4da3ab27141a5f8ddf", size = 93217, upload-time = "2025-06-10T00:44:54.658Z" }, + { url = "https://files.pythonhosted.org/packages/4f/7f/fa59c4c27e2a076bba0d959386e26eba77eb52ea4a0aac48e3515c186b4c/yarl-1.20.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:69ff8439d8ba832d6bed88af2c2b3445977eba9a4588b787b32945871c2444e3", size = 92700, upload-time = "2025-06-10T00:44:56.784Z" }, + { url = "https://files.pythonhosted.org/packages/2f/d4/062b2f48e7c93481e88eff97a6312dca15ea200e959f23e96d8ab898c5b8/yarl-1.20.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cf34efa60eb81dd2645a2e13e00bb98b76c35ab5061a3989c7a70f78c85006d", size = 347644, upload-time = "2025-06-10T00:44:59.071Z" }, + { url = "https://files.pythonhosted.org/packages/89/47/78b7f40d13c8f62b499cc702fdf69e090455518ae544c00a3bf4afc9fc77/yarl-1.20.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8e0fe9364ad0fddab2688ce72cb7a8e61ea42eff3c7caeeb83874a5d479c896c", size = 323452, upload-time = "2025-06-10T00:45:01.605Z" }, + { url = "https://files.pythonhosted.org/packages/eb/2b/490d3b2dc66f52987d4ee0d3090a147ea67732ce6b4d61e362c1846d0d32/yarl-1.20.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f64fbf81878ba914562c672024089e3401974a39767747691c65080a67b18c1", size = 346378, upload-time = "2025-06-10T00:45:03.946Z" }, + { url = "https://files.pythonhosted.org/packages/66/ad/775da9c8a94ce925d1537f939a4f17d782efef1f973039d821cbe4bcc211/yarl-1.20.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6342d643bf9a1de97e512e45e4b9560a043347e779a173250824f8b254bd5ce", size = 353261, upload-time = "2025-06-10T00:45:05.992Z" }, + { url = "https://files.pythonhosted.org/packages/4b/23/0ed0922b47a4f5c6eb9065d5ff1e459747226ddce5c6a4c111e728c9f701/yarl-1.20.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56dac5f452ed25eef0f6e3c6a066c6ab68971d96a9fb441791cad0efba6140d3", size = 335987, upload-time = "2025-06-10T00:45:08.227Z" }, + { url = "https://files.pythonhosted.org/packages/3e/49/bc728a7fe7d0e9336e2b78f0958a2d6b288ba89f25a1762407a222bf53c3/yarl-1.20.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7d7f497126d65e2cad8dc5f97d34c27b19199b6414a40cb36b52f41b79014be", size = 329361, upload-time = "2025-06-10T00:45:10.11Z" }, + { url = "https://files.pythonhosted.org/packages/93/8f/b811b9d1f617c83c907e7082a76e2b92b655400e61730cd61a1f67178393/yarl-1.20.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:67e708dfb8e78d8a19169818eeb5c7a80717562de9051bf2413aca8e3696bf16", size = 346460, upload-time = "2025-06-10T00:45:12.055Z" }, + { url = "https://files.pythonhosted.org/packages/70/fd/af94f04f275f95da2c3b8b5e1d49e3e79f1ed8b6ceb0f1664cbd902773ff/yarl-1.20.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:595c07bc79af2494365cc96ddeb772f76272364ef7c80fb892ef9d0649586513", size = 334486, upload-time = "2025-06-10T00:45:13.995Z" }, + { url = "https://files.pythonhosted.org/packages/84/65/04c62e82704e7dd0a9b3f61dbaa8447f8507655fd16c51da0637b39b2910/yarl-1.20.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7bdd2f80f4a7df852ab9ab49484a4dee8030023aa536df41f2d922fd57bf023f", size = 342219, upload-time = "2025-06-10T00:45:16.479Z" }, + { url = "https://files.pythonhosted.org/packages/91/95/459ca62eb958381b342d94ab9a4b6aec1ddec1f7057c487e926f03c06d30/yarl-1.20.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c03bfebc4ae8d862f853a9757199677ab74ec25424d0ebd68a0027e9c639a390", size = 350693, upload-time = "2025-06-10T00:45:18.399Z" }, + { url = "https://files.pythonhosted.org/packages/a6/00/d393e82dd955ad20617abc546a8f1aee40534d599ff555ea053d0ec9bf03/yarl-1.20.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:344d1103e9c1523f32a5ed704d576172d2cabed3122ea90b1d4e11fe17c66458", size = 355803, upload-time = "2025-06-10T00:45:20.677Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ed/c5fb04869b99b717985e244fd93029c7a8e8febdfcffa06093e32d7d44e7/yarl-1.20.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:88cab98aa4e13e1ade8c141daeedd300a4603b7132819c484841bb7af3edce9e", size = 341709, upload-time = "2025-06-10T00:45:23.221Z" }, + { url = "https://files.pythonhosted.org/packages/24/fd/725b8e73ac2a50e78a4534ac43c6addf5c1c2d65380dd48a9169cc6739a9/yarl-1.20.1-cp313-cp313t-win32.whl", hash = "sha256:b121ff6a7cbd4abc28985b6028235491941b9fe8fe226e6fdc539c977ea1739d", size = 86591, upload-time = "2025-06-10T00:45:25.793Z" }, + { url = "https://files.pythonhosted.org/packages/94/c3/b2e9f38bc3e11191981d57ea08cab2166e74ea770024a646617c9cddd9f6/yarl-1.20.1-cp313-cp313t-win_amd64.whl", hash = "sha256:541d050a355bbbc27e55d906bc91cb6fe42f96c01413dd0f4ed5a5240513874f", size = 93003, upload-time = "2025-06-10T00:45:27.752Z" }, + { url = "https://files.pythonhosted.org/packages/b4/2d/2345fce04cfd4bee161bf1e7d9cdc702e3e16109021035dbb24db654a622/yarl-1.20.1-py3-none-any.whl", hash = "sha256:83b8eb083fe4683c6115795d9fc1cfaf2cbbefb19b3a1cb68f6527460f483a77", size = 46542, upload-time = "2025-06-10T00:46:07.521Z" }, ] [[package]] name = "zarr" -version = "3.1.0" +version = "3.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "donfig" }, @@ -3782,9 +3800,9 @@ dependencies = [ { name = "packaging" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/66/852aa0905f906bc8ef0a6eb686d50c7ca8c46a38677c32152a8003bcce37/zarr-3.1.0.tar.gz", hash = "sha256:ace5b111dc69d5315cb1655dfd0f816c5acf9798d2ad92f43b608a52c8c8ac2b", size = 312546 } +sdist = { url = "https://files.pythonhosted.org/packages/15/a9/29fe1800380092ae03ac6207d757f3e5affaf1fcd2e5ef074cf4fc68f0fa/zarr-3.1.1.tar.gz", hash = "sha256:17db72f37f2489452d2137ac891c4133b8f976f9189d8efd3e75f3b3add84e8c", size = 314075, upload-time = "2025-07-30T11:51:36.81Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/72/c5fd70742126cab7403126a1719b4161a81b816d83a2fdb78b390d8ecc47/zarr-3.1.0-py3-none-any.whl", hash = "sha256:bd3d2f88d602d43f81df82e26dd115ea66635a2af5bf6da261d3c640bb4c1ce4", size = 254089 }, + { url = "https://files.pythonhosted.org/packages/c8/48/bde2f58cfbc9fd6ab844e2f2fd79d5e54195c12a17aa9b47c0b0e701a421/zarr-3.1.1-py3-none-any.whl", hash = "sha256:9a0b7e7c27bf62965b8eef6b8b8fdb9b47381f0738be35e40f37be6479b546be", size = 255373, upload-time = "2025-07-30T11:51:34.623Z" }, ] [[package]] @@ -3792,37 +3810,37 @@ name = "zfpy" version = "1.0.1" source = { registry = "https://pypi.org/simple" } wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/66/aee1c28a538530c4ff5a89cc56902fabcfd1fe1ae919d6471f12f45e8977/zfpy-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:13146293a5132627feb2c9f7adc6d95c528dd19dc3260f000e4b6284b2696b1f", size = 112715 }, - { url = "https://files.pythonhosted.org/packages/48/58/8f9440288005df7fa3aa20e80b5a491003823b916e6449cae39b1ad1d1b3/zfpy-1.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:06d6d6a46fbd198c6fec7f31b111e11f5be3a254859f5ac3ab9488d05b240337", size = 208465 }, - { url = "https://files.pythonhosted.org/packages/97/b5/4e2043c5f82253a5028d69eb767fbefd74ab77a4cfd7bef0340c11bbec37/zfpy-1.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d204b17ee8c1eef6a2e650c123d627c0f64b3d8957df4c788dd2aaf2a72eb4ae", size = 861001 }, - { url = "https://files.pythonhosted.org/packages/1a/6a/03aabc92ecca8f04c3597281e4fd93f70b0e0a7bade198950285438e4f07/zfpy-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0ea9d0bcf191ec345145592d2e7586413bcfd385034f85d00238e1eaa857185", size = 864815 }, - { url = "https://files.pythonhosted.org/packages/ca/e1/ef9efd59aa2511cf5cfbca429a320eaf0f19b8b314031e243cf93efca833/zfpy-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:78ff5cc656da9414e264bbdfb316a0c30bf930a426f9c2a1f1a5131620135439", size = 151894 }, - { url = "https://files.pythonhosted.org/packages/f0/4d/aea81d75eb68b1687ae4fee7a639123237a4c57e3be239ce12b3b74818c5/zfpy-1.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bb83fa31c943475c4ed8182c0bd1db518beca319809612c9851d78545e7d31c9", size = 113996 }, - { url = "https://files.pythonhosted.org/packages/36/bd/c0ed2701c9835426dd8dca72b9c5c74eca6add6c269fc6664be686fe740e/zfpy-1.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d401da303fe926b18df1e93483a2099762d61db87597ccdaf89e25fb71b107cc", size = 209473 }, - { url = "https://files.pythonhosted.org/packages/b1/e5/6a576f8e8d9da1548723145bafaf2b18dfc2db0925adab764cb8c5fd337e/zfpy-1.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b5e7c1f0ebdecc6850e65004e7fbba8d5e78bf4b626654e463c3e0aa5b3fe54", size = 833092 }, - { url = "https://files.pythonhosted.org/packages/fc/db/1d2d9db84ce26613ebe702de5905bd74b17346fe9ae7d872db19123fc93d/zfpy-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58180c0917656ab0eb2dadad7e033e10271a3c615dc8972657137dba16e2bd42", size = 842162 }, - { url = "https://files.pythonhosted.org/packages/ad/57/b21fb9f16e6478880c5ed9c24e452334f64b228975fa6268e8b41fa19b9f/zfpy-1.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:f15c91425cebca0ab5c88b3b2ba0eb800ec5310e3ea2a6b5f3e4b198a97288d9", size = 151579 }, - { url = "https://files.pythonhosted.org/packages/fb/e3/6252478931b05582c2d69fd6d632b889fc12f5ecb8bba1a658e370f39d8a/zfpy-1.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:791fa42b651a26be67e52043b619e3a039862900e7080711d07a5de956158b8c", size = 112789 }, - { url = "https://files.pythonhosted.org/packages/54/80/7a2b7ddc427ddde0448917e4b25e85c89ec243b6ab09671aafabb27333a3/zfpy-1.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f811480ebff2e028c50bf3491d1d2e3869eb4388883543d0698f5fdc917e4386", size = 208295 }, - { url = "https://files.pythonhosted.org/packages/84/04/bf33d66dbe69161f52b8315960c28bda8487fcc40a17ad2f21d969973705/zfpy-1.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4892bc441ce59de98c4b3b29f04e44657aa6ccfe3ae5ca23660efb010b829d6", size = 829807 }, - { url = "https://files.pythonhosted.org/packages/ce/a1/6c83ed879fdf8758dbf6cfea2dc626acd0885b844478a25d5add00189f8d/zfpy-1.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a64590ef3c182988f4ac5745ec6e1623b06c348583cbdb96d296e4899f4469", size = 840087 }, - { url = "https://files.pythonhosted.org/packages/c4/2c/2ae60826091824196d7b57d1fa95a78bd0bd5f84dc5633ea8151375ee415/zfpy-1.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9a71cfce2fb7a82497e90e7152f847250664f30ca4dfedcca500c35d4c63e44", size = 151298 }, + { url = "https://files.pythonhosted.org/packages/a8/66/aee1c28a538530c4ff5a89cc56902fabcfd1fe1ae919d6471f12f45e8977/zfpy-1.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:13146293a5132627feb2c9f7adc6d95c528dd19dc3260f000e4b6284b2696b1f", size = 112715, upload-time = "2024-11-26T08:20:03.115Z" }, + { url = "https://files.pythonhosted.org/packages/48/58/8f9440288005df7fa3aa20e80b5a491003823b916e6449cae39b1ad1d1b3/zfpy-1.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:06d6d6a46fbd198c6fec7f31b111e11f5be3a254859f5ac3ab9488d05b240337", size = 208465, upload-time = "2024-11-26T08:20:04.74Z" }, + { url = "https://files.pythonhosted.org/packages/97/b5/4e2043c5f82253a5028d69eb767fbefd74ab77a4cfd7bef0340c11bbec37/zfpy-1.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d204b17ee8c1eef6a2e650c123d627c0f64b3d8957df4c788dd2aaf2a72eb4ae", size = 861001, upload-time = "2024-11-26T08:20:05.843Z" }, + { url = "https://files.pythonhosted.org/packages/1a/6a/03aabc92ecca8f04c3597281e4fd93f70b0e0a7bade198950285438e4f07/zfpy-1.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0ea9d0bcf191ec345145592d2e7586413bcfd385034f85d00238e1eaa857185", size = 864815, upload-time = "2024-11-26T08:20:07.143Z" }, + { url = "https://files.pythonhosted.org/packages/ca/e1/ef9efd59aa2511cf5cfbca429a320eaf0f19b8b314031e243cf93efca833/zfpy-1.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:78ff5cc656da9414e264bbdfb316a0c30bf930a426f9c2a1f1a5131620135439", size = 151894, upload-time = "2024-11-26T07:39:29.863Z" }, + { url = "https://files.pythonhosted.org/packages/f0/4d/aea81d75eb68b1687ae4fee7a639123237a4c57e3be239ce12b3b74818c5/zfpy-1.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bb83fa31c943475c4ed8182c0bd1db518beca319809612c9851d78545e7d31c9", size = 113996, upload-time = "2024-11-26T08:20:09.154Z" }, + { url = "https://files.pythonhosted.org/packages/36/bd/c0ed2701c9835426dd8dca72b9c5c74eca6add6c269fc6664be686fe740e/zfpy-1.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d401da303fe926b18df1e93483a2099762d61db87597ccdaf89e25fb71b107cc", size = 209473, upload-time = "2024-11-26T08:20:10.406Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e5/6a576f8e8d9da1548723145bafaf2b18dfc2db0925adab764cb8c5fd337e/zfpy-1.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b5e7c1f0ebdecc6850e65004e7fbba8d5e78bf4b626654e463c3e0aa5b3fe54", size = 833092, upload-time = "2024-11-26T08:20:12.27Z" }, + { url = "https://files.pythonhosted.org/packages/fc/db/1d2d9db84ce26613ebe702de5905bd74b17346fe9ae7d872db19123fc93d/zfpy-1.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58180c0917656ab0eb2dadad7e033e10271a3c615dc8972657137dba16e2bd42", size = 842162, upload-time = "2024-11-26T08:20:14.124Z" }, + { url = "https://files.pythonhosted.org/packages/ad/57/b21fb9f16e6478880c5ed9c24e452334f64b228975fa6268e8b41fa19b9f/zfpy-1.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:f15c91425cebca0ab5c88b3b2ba0eb800ec5310e3ea2a6b5f3e4b198a97288d9", size = 151579, upload-time = "2024-11-27T14:27:22.752Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e3/6252478931b05582c2d69fd6d632b889fc12f5ecb8bba1a658e370f39d8a/zfpy-1.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:791fa42b651a26be67e52043b619e3a039862900e7080711d07a5de956158b8c", size = 112789, upload-time = "2024-11-26T08:20:16.266Z" }, + { url = "https://files.pythonhosted.org/packages/54/80/7a2b7ddc427ddde0448917e4b25e85c89ec243b6ab09671aafabb27333a3/zfpy-1.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f811480ebff2e028c50bf3491d1d2e3869eb4388883543d0698f5fdc917e4386", size = 208295, upload-time = "2024-11-26T08:20:17.27Z" }, + { url = "https://files.pythonhosted.org/packages/84/04/bf33d66dbe69161f52b8315960c28bda8487fcc40a17ad2f21d969973705/zfpy-1.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4892bc441ce59de98c4b3b29f04e44657aa6ccfe3ae5ca23660efb010b829d6", size = 829807, upload-time = "2024-11-26T08:20:18.625Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a1/6c83ed879fdf8758dbf6cfea2dc626acd0885b844478a25d5add00189f8d/zfpy-1.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a64590ef3c182988f4ac5745ec6e1623b06c348583cbdb96d296e4899f4469", size = 840087, upload-time = "2024-11-26T08:20:20.476Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2c/2ae60826091824196d7b57d1fa95a78bd0bd5f84dc5633ea8151375ee415/zfpy-1.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:f9a71cfce2fb7a82497e90e7152f847250664f30ca4dfedcca500c35d4c63e44", size = 151298, upload-time = "2024-11-27T14:27:24.084Z" }, ] [[package]] name = "zict" version = "3.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d1/ac/3c494dd7ec5122cff8252c1a209b282c0867af029f805ae9befd73ae37eb/zict-3.0.0.tar.gz", hash = "sha256:e321e263b6a97aafc0790c3cfb3c04656b7066e6738c37fffcca95d803c9fba5", size = 33238 } +sdist = { url = "https://files.pythonhosted.org/packages/d1/ac/3c494dd7ec5122cff8252c1a209b282c0867af029f805ae9befd73ae37eb/zict-3.0.0.tar.gz", hash = "sha256:e321e263b6a97aafc0790c3cfb3c04656b7066e6738c37fffcca95d803c9fba5", size = 33238, upload-time = "2023-04-17T21:41:16.041Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/80/ab/11a76c1e2126084fde2639514f24e6111b789b0bfa4fc6264a8975c7e1f1/zict-3.0.0-py2.py3-none-any.whl", hash = "sha256:5796e36bd0e0cc8cf0fbc1ace6a68912611c1dbd74750a3f3026b9b9d6a327ae", size = 43332 }, + { url = "https://files.pythonhosted.org/packages/80/ab/11a76c1e2126084fde2639514f24e6111b789b0bfa4fc6264a8975c7e1f1/zict-3.0.0-py2.py3-none-any.whl", hash = "sha256:5796e36bd0e0cc8cf0fbc1ace6a68912611c1dbd74750a3f3026b9b9d6a327ae", size = 43332, upload-time = "2023-04-17T21:41:13.444Z" }, ] [[package]] name = "zipp" version = "3.23.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547 } +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276 }, + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, ] From d21278c28857c4b6daab2545568fcf50dced11be Mon Sep 17 00:00:00 2001 From: Dima From Texas <34629861+dmitriyrepin@users.noreply.github.com> Date: Thu, 7 Aug 2025 09:10:41 -0500 Subject: [PATCH 55/56] address issues with VS Code dev containers (see issue 559) (#576) * Templates and TemplateRegistry * Fix pre-commit issues * Rever dev container changes * PR Review: address issues * PR Review: register default templates at registry initialization * Dockerfile.dev --------- Co-authored-by: Altay Sansal --- .devcontainer/Dockerfile.dev | 46 +++++++++++++++++++++++++++++++++ .devcontainer/devcontainer.json | 21 ++++++++------- 2 files changed, 58 insertions(+), 9 deletions(-) create mode 100644 .devcontainer/Dockerfile.dev diff --git a/.devcontainer/Dockerfile.dev b/.devcontainer/Dockerfile.dev new file mode 100644 index 000000000..ea04d0aae --- /dev/null +++ b/.devcontainer/Dockerfile.dev @@ -0,0 +1,46 @@ +# USAGE: +# This file will be used by the VS Code DevContainer extension +# to create a development environment for the mdio-python project. +# HOW TO MANUALLY BUILD AND DEBUG THE CONTAINER +# docker build -t mdio-dev -f .devcontainer/Dockerfile.dev . +# docker run -it --rm --entrypoint /bin/bash --name mdio-dev mdio-dev +# NOTES: +# 1. The container will be run as the non-root user 'vscode' with UID 1000. +# 2. The virtual environment will be setup at /home/vscode/.venv +# 3. The project source code will be host-mounted at /workspaces/mdio-python +ARG PYTHON_VERSION="3.13" +ARG LINUX_DISTRO="bookworm" +ARG UV_VERSION="0.6.11" +FROM mcr.microsoft.com/devcontainers/python:1-${PYTHON_VERSION}-${LINUX_DISTRO} + +ENV USERNAME="vscode" +USER $USERNAME + +COPY --chown=$USERNAME:$USERNAME ./ /workspaces/mdio-python + +WORKDIR /workspaces/mdio-python + +ARG UV_VERSION +# Install UV as described in https://devblogs.microsoft.com/ise/dockerizing-uv/ +RUN python3 -m pip install --no-cache-dir uv==${UV_VERSION} +# Prevent uv from trying to create hard links, which does not work in a container +# that mounts local file systems (e.g. VS Code Dev Containers) +ENV UV_LINK_MODE=copy +# Add path to the site-packages +ENV PYTHONUSERBASE=/home/$USERNAME/.local +ENV PATH="$PYTHONUSERBASE/bin:$PATH" + +# Initialize virtual environment in the container +ENV VIRTUAL_ENV="/home/$USERNAME/.venv" +ENV UV_PROJECT_ENVIRONMENT=$VIRTUAL_ENV +ENV PATH="$VIRTUAL_ENV/bin:$PATH" +RUN uv venv $VIRTUAL_ENV + +# Install the project in the editable mode +# https://setuptools.pypa.io/en/latest/userguide/development_mode.html +# This allows for live reloading of the code during development +RUN uv pip install -e . +# Install "extras" (development dependencies) in pyproject.toml +RUN uv sync --group dev +# Now one can run: +# pre-commit run --all-files diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b618a5260..cc26bcf29 100755 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,12 +2,12 @@ // README at: https://github.com/devcontainers/templates/tree/main/src/python { "build": { - "dockerfile": "Dockerfile", + "dockerfile": "Dockerfile.dev", "context": ".." }, // Use 'postCreateCommand' to run commands after the container is created. "postCreateCommand": { - "post_create_script": "bash ./.devcontainer/post-install.sh" + // "post_create_script": "bash ./.devcontainer/post-install.sh" }, // Forward 8787 to enable us to view dask dashboard "forwardPorts": [8787], @@ -16,8 +16,9 @@ // Configure properties specific to VS Code. "vscode": { "settings": { - "python.terminal.activateEnvInCurrentTerminal": true, - "python.defaultInterpreterPath": "/opt/venv/bin/python" + "python.testing.pytestArgs": ["tests"], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true }, "extensions": [ "ms-python.python", @@ -27,17 +28,19 @@ "ms-toolsai.jupyter-renderers", "vscode-icons-team.vscode-icons", "wayou.vscode-todo-highlight", - "streetsidesoftware.code-spell-checker" + "streetsidesoftware.code-spell-checker", + "eamodio.gitlens", + "visualstudioexptteam.vscodeintellicode", + "richie5um2.vscode-sort-json" ] } }, // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. // "remoteUser": "root", "updateRemoteUserUID": true, + "workspaceMount": "source=${localWorkspaceFolder},target=/workspaces/mdio-python,type=bind", + "workspaceFolder": "/workspaces/mdio-python", "mounts": [ - // Re-use local Git configuration - "source=${localEnv:HOME}/.gitconfig,target=/home/vscode/.gitconfig_tmp,type=bind,consistency=cached", - "source=${localEnv:HOME}/.gitconfig,target=/root/.gitconfig_tmp,type=bind,consistency=cached", - "source=${localEnv:SCRATCH_DIR}/${localEnv:USER},target=/scratch/,type=bind,consistency=cached" + // "source=${localWorkspaceFolder}/../DATA/,target=/DATA/,type=bind,consistency=cached" ] } From d3a7da28e1d5bc184785b8e3716a9dabc23abbcb Mon Sep 17 00:00:00 2001 From: Dima From Texas <34629861+dmitriyrepin@users.noreply.github.com> Date: Fri, 8 Aug 2025 15:12:00 -0500 Subject: [PATCH 56/56] segy_to_mdio_v1 (#577) * Templates and TemplateRegistry * Fix pre-commit issues * Rever dev container changes * PR Review: address issues * PR Review: register default templates at registry initialization * Dockerfile.dev * segy_to_mdio_v1 * Clean up * Prototype review notes * Add dev comment * Add notes that will be deleted later * segy_to_mdio_v1 pass 1 * indexing_v1 and blocked_io_v1 * Remove DEV notes * Clean up * Document bug location * Work around IndexError * Clean temporary code * More clean up * Remove *_1 infrastructure files * Restore accidently removed dask.array * Created an issue reproducer * Make the required template properties public * Simplify type converter * Improve templates * Move test_type_converter.py * Move test_type_converter.py * Revert to use the original grid * Integrate segy_to_mdio_v1_customized, fix indexing * Add dimension coordinates in tem,plates * Write statistics to Zarr * Delete factory_v1.py * Complete integrationtest. Fix coordinates * Fir pre-commit errors * PR review: fix trace_worker docstring * Review: address some of the issue * Fix bug * dding todo for sum squares calculation * Refactor ChunkIterator * Refactor ChunkIterator into ChunkIteratorV1 * Remove segy_to_mdio_v1_customized, dataset_serializer.to_zarr * Add support for trace headers without using _FillValue * Use StorageLocation in trace_worker_v1 * Fix statistics attribute name * PR review changes * PR Improvements: do a single write * TODO: chunked write for non-dimensional coordinates and trace_mask * Update StorageLocation to use fsspec * Reformat with pre-commit * Use domain name in get_grid_plan * Fix non-dim coords and chunk_samples=False * Convert test_3d_import_v1 to V1 * Fix test_meta_dataset_read * remove whitespace * clean up comments * update deps in lockfile * simplify dim and non-dim coordinate handling after scan * remove compatibility tests * add filtering capability to header worker * accept subset filter to pass to workers * make v1 grid planner awesome * double to single underscores in test names * fix broken test harnesses due to incorrect Sequence import * clean up dev comment * clean up whitespace * use new module name * clean up segy_to_mdio_v1 * fix whitespace and remove unnecessary list call * these are defined as float64 in template Previous check was passing due to an error in assignment during creation of coordinate variables * fix missing dimension coordinate for vertical axis * fix incorrect dtype comparison for time variable * simplify and fix critical bugs * rename v1 out of things and get rid of old code * remove fixed todo * remove more v1 from names * rename chunk iterator * fix dimensionality in tests due to new (missing) vertical dimension coordinate * add todo for numpy ingestion * fix references to non-v1 naming * extract grid operations to its own function * fix typo Co-authored-by: Brian Michell * add todo for simplifying storage location * Remove no_fill_var_names, add domain var to Seismic3DPreStackShotTemplate * Part 2 of the previous commit * pre-commit formatting * remove dev mount --------- Co-authored-by: Dmitriy Repin Co-authored-by: Altay Sansal Co-authored-by: Brian Michell --- src/mdio/api/convenience.py | 11 +- src/mdio/converters/numpy.py | 6 +- src/mdio/converters/segy.py | 607 ++++++++---------- src/mdio/converters/type_converter.py | 85 +++ src/mdio/core/indexing.py | 117 ++-- src/mdio/core/storage_location.py | 87 +++ src/mdio/schemas/v1/dataset_serializer.py | 63 +- .../v1/templates/abstract_dataset_template.py | 136 +++- .../v1/templates/seismic_2d_poststack.py | 6 +- .../v1/templates/seismic_3d_poststack.py | 6 +- .../v1/templates/seismic_3d_prestack_cdp.py | 10 +- .../v1/templates/seismic_3d_prestack_shot.py | 30 +- .../schemas/v1/templates/template_registry.py | 2 +- src/mdio/segy/_workers.py | 125 ++-- src/mdio/segy/blocked_io.py | 159 +++-- src/mdio/segy/parsers.py | 6 +- src/mdio/segy/utilities.py | 38 +- tests/integration/test_segy_import_export.py | 154 ++++- tests/integration/testing_helpers.py | 69 ++ tests/integration/v1/test_segy_to_mdio_v1.py | 354 ++++++++++ tests/unit/test_compat.py | 106 --- .../unit/v1/converters/test_type_converter.py | 95 +++ tests/unit/v1/core/test_indexing.py | 128 ++++ tests/unit/v1/core/test_storage_location.py | 132 ++++ tests/unit/v1/helpers.py | 16 +- tests/unit/v1/templates/conftest.py | 21 + .../v1/templates/test_seismic_2d_poststack.py | 158 +++-- .../v1/templates/test_seismic_3d_poststack.py | 168 +++-- .../templates/test_seismic_3d_prestack_cdp.py | 175 +++-- .../test_seismic_3d_prestack_shot.py | 245 +++---- .../v1/templates/test_seismic_templates.py | 62 +- .../v1/templates/test_template_registry.py | 3 +- .../v1/test_dataset_builder_add_coordinate.py | 12 +- .../v1/test_dataset_builder_add_variable.py | 16 +- tests/unit/v1/test_dataset_builder_build.py | 22 +- tests/unit/v1/test_dataset_serializer.py | 93 +-- uv.lock | 237 +++---- 37 files changed, 2441 insertions(+), 1319 deletions(-) create mode 100644 src/mdio/converters/type_converter.py create mode 100644 src/mdio/core/storage_location.py create mode 100644 tests/integration/testing_helpers.py create mode 100644 tests/integration/v1/test_segy_to_mdio_v1.py delete mode 100644 tests/unit/test_compat.py create mode 100644 tests/unit/v1/converters/test_type_converter.py create mode 100644 tests/unit/v1/core/test_indexing.py create mode 100644 tests/unit/v1/core/test_storage_location.py create mode 100644 tests/unit/v1/templates/conftest.py diff --git a/src/mdio/api/convenience.py b/src/mdio/api/convenience.py index a0536214d..4d8b5df6a 100644 --- a/src/mdio/api/convenience.py +++ b/src/mdio/api/convenience.py @@ -79,7 +79,11 @@ def copy_mdio( # noqa: PLR0913 writer.live_mask[:] = reader.live_mask[:] - iterator = ChunkIterator(reader._traces, chunk_samples=False) + shape = reader._traces.shape + chunks = reader._traces.chunks + chunks = chunks[:-1] + (shape[-1],) # don't chunk samples + + iterator = ChunkIterator(shape=shape, chunks=chunks) progress = tqdm(iterator, unit="block") progress.set_description(desc=f"Copying data for '{access_pattern=}'") for slice_ in progress: @@ -177,7 +181,10 @@ def create_rechunk_plan( n_dimension = len(data_array.shape) dummy_array = zarr.empty(shape=data_array.shape, chunks=(MAX_BUFFER,) * n_dimension) - iterator = ChunkIterator(dummy_array) + + shape = dummy_array.shape + chunks = dummy_array.chunks + iterator = ChunkIterator(shape=shape, chunks=chunks) return metadata_arrs, data_arrs, live_mask, iterator diff --git a/src/mdio/converters/numpy.py b/src/mdio/converters/numpy.py index 832b96563..de52e3143 100644 --- a/src/mdio/converters/numpy.py +++ b/src/mdio/converters/numpy.py @@ -7,7 +7,6 @@ import numpy as np from mdio.api.accessor import MDIOWriter -from mdio.converters.segy import get_compressor from mdio.core.dimension import Dimension from mdio.core.factory import MDIOCreateConfig from mdio.core.factory import MDIOVariableConfig @@ -137,6 +136,11 @@ def numpy_to_mdio( # noqa: PLR0913 suffix = [str(idx) for idx, value in enumerate(suffix) if value is not None] suffix = "".join(suffix) + # TODO(Dmitrit Repin): Implement Numpy converted in MDIO v1 + # https://github.com/TGSAI/mdio-python/issues/596 + def get_compressor(lossless: bool, tolerance: float) -> list[str]: + pass + compressors = get_compressor(lossless, compression_tolerance) mdio_var = MDIOVariableConfig( name=f"chunked_{suffix}", diff --git a/src/mdio/converters/segy.py b/src/mdio/converters/segy.py index 15946e84c..96f3ad1ae 100644 --- a/src/mdio/converters/segy.py +++ b/src/mdio/converters/segy.py @@ -1,42 +1,39 @@ -"""Conversion from SEG-Y to MDIO.""" +"""Conversion from SEG-Y to MDIO v1 format.""" from __future__ import annotations import logging import os from typing import TYPE_CHECKING -from typing import Any import numpy as np -import zarr -from numcodecs import Blosc from segy import SegyFile from segy.config import SegySettings -from segy.schema import HeaderField +from segy.standards.codes import MeasurementSystem as segy_MeasurementSystem +from segy.standards.fields.trace import Rev0 as TraceHeaderFieldsRev0 +from mdio.constants import UINT32_MAX from mdio.converters.exceptions import EnvironmentFormatError from mdio.converters.exceptions import GridTraceCountError from mdio.converters.exceptions import GridTraceSparsityError -from mdio.core import Grid -from mdio.core.factory import MDIOCreateConfig -from mdio.core.factory import MDIOVariableConfig -from mdio.core.factory import create_empty -from mdio.core.utils_write import write_attribute +from mdio.converters.type_converter import to_structured_type +from mdio.core.grid import Grid +from mdio.schemas.v1.dataset_serializer import to_xarray_dataset +from mdio.schemas.v1.units import AllUnits +from mdio.schemas.v1.units import LengthUnitEnum +from mdio.schemas.v1.units import LengthUnitModel from mdio.segy import blocked_io -from mdio.segy.compat import mdio_segy_spec from mdio.segy.utilities import get_grid_plan if TYPE_CHECKING: - from collections.abc import Sequence - from pathlib import Path - -try: - import zfpy # Base library - from numcodecs import ZFPY # Codec -except ImportError: - ZFPY = None - zfpy = None + from segy.arrays import HeaderArray as SegyHeaderArray + from segy.schema import SegySpec + from xarray import Dataset as xr_Dataset + from mdio.core.dimension import Dimension + from mdio.core.storage_location import StorageLocation + from mdio.schemas.v1.dataset import Dataset + from mdio.schemas.v1.templates.abstract_dataset_template import AbstractDatasetTemplate logger = logging.getLogger(__name__) @@ -115,354 +112,262 @@ def grid_density_qc(grid: Grid, num_traces: int) -> None: raise GridTraceSparsityError(grid.shape, num_traces, msg) -def get_compressor(lossless: bool, compression_tolerance: float = -1) -> Blosc | ZFPY | None: - """Get the appropriate compressor for the seismic traces.""" - if lossless: - compressor = Blosc("zstd") - else: - if zfpy is None or ZFPY is None: - msg = ( - "Lossy compression requires the 'zfpy' library. It is not installed in your " - "environment. To proceed, please install 'zfpy' or install mdio `lossy` extra." - ) - raise ImportError(msg) - - compressor = ZFPY(mode=zfpy.mode_fixed_accuracy, tolerance=compression_tolerance) - return compressor - - -def segy_to_mdio( # noqa: PLR0913, PLR0915 - segy_path: str | Path, - mdio_path_or_buffer: str | Path, - index_bytes: Sequence[int], - index_names: Sequence[str] | None = None, - index_types: Sequence[str] | None = None, - chunksize: tuple[int, ...] | None = None, - lossless: bool = True, - compression_tolerance: float = 0.01, - storage_options_input: dict[str, Any] | None = None, - storage_options_output: dict[str, Any] | None = None, - overwrite: bool = False, - grid_overrides: dict | None = None, -) -> None: - """Convert SEG-Y file to MDIO format. - - MDIO allows ingesting flattened seismic surveys in SEG-Y format into a multidimensional tensor - that represents the correct geometry of the seismic dataset. - - The SEG-Y file must be on disk, MDIO currently does not support reading SEG-Y directly from - the cloud object store. - - The output MDIO file can be local or on the cloud. For local files, a UNIX or Windows path is - sufficient. However, for cloud stores, an appropriate protocol must be provided. See examples - for more details. +def _scan_for_headers( + segy_file: SegyFile, template: AbstractDatasetTemplate +) -> tuple[list[Dimension], SegyHeaderArray]: + """Extract trace dimensions and index headers from the SEG-Y file. - The SEG-Y headers for indexing must also be specified. The index byte locations (starts from 1) - are the minimum amount of information needed to index the file. However, we suggest giving - names to the index dimensions, and if needed providing the header lengths if they are not - standard. By default, all header entries are assumed to be 4-byte long. + This is an expensive operation. + It scans the SEG-Y file in chunks by using ProcessPoolExecutor + """ + # TODO(Dmitriy): implement grid overrides + # https://github.com/TGSAI/mdio-python/issues/585 + # The 'grid_chunksize' is used only for grid_overrides + # While we do not support grid override, we can set it to None + grid_chunksize = None + segy_dimensions, chunksize, segy_headers = get_grid_plan( + segy_file=segy_file, + return_headers=True, + template=template, + chunksize=grid_chunksize, + grid_overrides=None, + ) + return segy_dimensions, segy_headers - The chunk size depends on the data type, however, it can be chosen to accommodate any - workflow's access patterns. See examples below for some common use cases. - By default, the data is ingested with LOSSLESS compression. This saves disk space in the range - of 20% to 40%. MDIO also allows data to be compressed using the ZFP compressor's fixed rate - lossy compression. If lossless parameter is set to False and MDIO was installed using the lossy - extra; then the data will be compressed to approximately 30% of its original size and will be - perceptually lossless. The compression ratio can be adjusted using the option compression_ratio - (integer). Higher values will compress more, but will introduce artifacts. +def _build_and_check_grid( + segy_dimensions: list[Dimension], segy_file: SegyFile, segy_headers: SegyHeaderArray +) -> Grid: + """Build and check the grid from the SEG-Y headers and dimensions. Args: - segy_path: Path to the input SEG-Y file - mdio_path_or_buffer: Output path for the MDIO file, either local or cloud-based (e.g., - with `s3://`, `gcs://`, or `abfs://` protocols). - index_bytes: Tuple of the byte location for the index attributes - index_names: List of names for the index dimensions. If not provided, defaults to `dim_0`, - `dim_1`, ..., with the last dimension named `sample`. - index_types: Tuple of the data-types for the index attributes. Must be in {"int16, int32, - float16, float32, ibm32"}. Default is 4-byte integers for each index key. - chunksize: Tuple specifying the chunk sizes for each dimension of the array. It must match - the number of dimensions in the input array. - lossless: If True, uses lossless Blosc compression with zstandard. If False, uses ZFP lossy - compression (requires `zfpy` library). - compression_tolerance: Tolerance for ZFP compression in lossy mode. Ignored if - `lossless=True`. Default is 0.01, providing ~70% size reduction. - storage_options_input: Dictionary of storage options for the SEGY input output file (e.g., - cloud credentials). Defaults to None. - storage_options_output: Dictionary of storage options for the MDIO output output file - (e.g., cloud credentials). Defaults to None. - overwrite: If True, overwrites existing MDIO file at the specified path. - grid_overrides: Option to add grid overrides. See examples. + segy_dimensions: List of of all SEG-Y dimensions to build grid from. + segy_file: Instance of SegyFile to check for trace count. + segy_headers: Headers read in from SEG-Y file for building the trace map. + + Returns: + A grid instance populated with the dimensions and trace index map. Raises: - GridTraceCountError: Raised if grid won't hold all traces in the SEG-Y file. - ValueError: If length of chunk sizes don't match number of dimensions. - NotImplementedError: If can't determine chunking automatically for 4D+. - - Examples: - If we are working locally and ingesting a 3D post-stack seismic file, we can use the - following example. This will ingest with default chunks of 128 x 128 x 128. - - >>> from mdio import segy_to_mdio - >>> - >>> - >>> segy_to_mdio( - ... segy_path="prefix1/file.segy", - ... mdio_path_or_buffer="prefix2/file.mdio", - ... index_bytes=(189, 193), - ... index_names=("inline", "crossline") - ... ) - - If we are on Amazon Web Services, we can do it like below. The protocol before the URL can - be `s3` for AWS, `gcs` for Google Cloud, and `abfs` for Microsoft Azure. In this example we - also change the chunk size as a demonstration. - - >>> segy_to_mdio( - ... segy_path="prefix/file.segy", - ... mdio_path_or_buffer="s3://bucket/file.mdio", - ... index_bytes=(189, 193), - ... index_names=("inline", "crossline"), - ... chunksize=(64, 64, 512), - ... ) - - Another example of loading a 4D seismic such as 3D seismic pre-stack gathers is below. This - will allow us to extract offset planes efficiently or run things in a local neighborhood - very efficiently. - - >>> segy_to_mdio( - ... segy_path="prefix/file.segy", - ... mdio_path_or_buffer="s3://bucket/file.mdio", - ... index_bytes=(189, 193, 37), - ... index_names=("inline", "crossline", "offset"), - ... chunksize=(16, 16, 16, 512), - ... ) - - We can override the dataset grid by the `grid_overrides` parameter. This allows us to - ingest files that don't conform to the true geometry of the seismic acquisition. - - For example if we are ingesting 3D seismic shots that don't have a cable number and channel - numbers are sequential (i.e. each cable doesn't start with channel number 1; we can tell - MDIO to ingest this with the correct geometry by calculating cable numbers and wrapped - channel numbers. Note the missing byte location and word length for the "cable" index. - - >>> segy_to_mdio( - ... segy_path="prefix/shot_file.segy", - ... mdio_path_or_buffer="s3://bucket/shot_file.mdio", - ... index_bytes=(17, None, 13), - ... index_lengths=(4, None, 4), - ... index_names=("shot", "cable", "channel"), - ... chunksize=(8, 2, 128, 1024), - ... grid_overrides={ - ... "ChannelWrap": True, "ChannelsPerCable": 800, - ... "CalculateCable": True - ... }, - ... ) - - If we do have cable numbers in the headers, but channels are still sequential (aka. - unwrapped), we can still ingest it like this. - - >>> segy_to_mdio( - ... segy_path="prefix/shot_file.segy", - ... mdio_path_or_buffer="s3://bucket/shot_file.mdio", - ... index_bytes=(17, 137, 13), - ... index_lengths=(4, 2, 4), - ... index_names=("shot_point", "cable", "channel"), - ... chunksize=(8, 2, 128, 1024), - ... grid_overrides={"ChannelWrap": True, "ChannelsPerCable": 800}, - ... ) - - For shot gathers with channel numbers and wrapped channels, no grid overrides necessary. - - In cases where the user does not know if the input has unwrapped channels but desires to - store with wrapped channel index use: - >>> grid_overrides = { - ... "AutoChannelWrap": True, - ... "AutoChannelTraceQC": 1000000 - ... } - - For ingestion of pre-stack streamer data where the user needs to access/index - *common-channel gathers* (single gun) then the following strategy can be used to densely - ingest while indexing on gun number: - - >>> segy_to_mdio( - ... segy_path="prefix/shot_file.segy", - ... mdio_path_or_buffer="s3://bucket/shot_file.mdio", - ... index_bytes=(133, 171, 17, 137, 13), - ... index_lengths=(2, 2, 4, 2, 4), - ... index_names=("shot_line", "gun", "shot_point", "cable", "channel"), - ... chunksize=(1, 1, 8, 1, 128, 1024), - ... grid_overrides={ - ... "AutoShotWrap": True, - ... "AutoChannelWrap": True, - ... "AutoChannelTraceQC": 1000000 - ... }, - ... ) - - For AutoShotWrap and AutoChannelWrap to work, the user must provide "shot_line", "gun", - "shot_point", "cable", "channel". For improved common-channel performance consider - modifying the chunksize to be (1, 1, 32, 1, 32, 2048) for good common-shot and - common-channel performance or (1, 1, 128, 1, 1, 2048) for common-channel performance. - - For cases with no well-defined trace header for indexing a NonBinned grid override is - provided.This creates the index and attributes an incrementing integer to the trace for - the index based on first in first out. For example a CDP and Offset keyed file might have a - header for offset as real world offset which would result in a very sparse populated index. - Instead, the following override will create a new index from 1 to N, where N is the number - of offsets within a CDP ensemble. The index to be auto generated is called "trace". Note - the required "chunksize" parameter in the grid override. This is due to the non-binned - ensemble chunksize is irrelevant to the index dimension chunksizes and has to be specified - in the grid override itself. Note the lack of offset, only indexing CDP, providing CDP - header type, and chunksize for only CDP and Sample dimension. The chunksize for non-binned - dimension is in the grid overrides as described above. The below configuration will yield - 1MB chunks: - - >>> segy_to_mdio( - ... segy_path="prefix/cdp_offset_file.segy", - ... mdio_path_or_buffer="s3://bucket/cdp_offset_file.mdio", - ... index_bytes=(21,), - ... index_types=("int32",), - ... index_names=("cdp",), - ... chunksize=(4, 1024), - ... grid_overrides={"NonBinned": True, "chunksize": 64}, - ... ) - - A more complicated case where you may have a 5D dataset that is not binned in Offset and - Azimuth directions can be ingested like below. However, the Offset and Azimuth dimensions - will be combined to "trace" dimension. The below configuration will yield 1MB chunks. - - >>> segy_to_mdio( - ... segy_path="prefix/cdp_offset_file.segy", - ... mdio_path_or_buffer="s3://bucket/cdp_offset_file.mdio", - ... index_bytes=(189, 193), - ... index_types=("int32", "int32"), - ... index_names=("inline", "crossline"), - ... chunksize=(4, 4, 1024), - ... grid_overrides={"NonBinned": True, "chunksize": 64}, - ... ) - - For dataset with expected duplicate traces we have the following parameterization. This - will use the same logic as NonBinned with a fixed chunksize of 1. The other keys are still - important. The below example allows multiple traces per receiver (i.e. reshoot). - - >>> segy_to_mdio( - ... segy_path="prefix/cdp_offset_file.segy", - ... mdio_path_or_buffer="s3://bucket/cdp_offset_file.mdio", - ... index_bytes=(9, 213, 13), - ... index_types=("int32", "int16", "int32"), - ... index_names=("shot", "cable", "chan"), - ... chunksize=(8, 2, 256, 512), - ... grid_overrides={"HasDuplicates": True}, - ... ) + GridTraceCountError: If number of traces in SEG-Y file does not match the parsed grid """ - index_names = index_names or [f"dim_{i}" for i in range(len(index_bytes))] - index_types = index_types or ["int32"] * len(index_bytes) - - if chunksize is not None and len(chunksize) != len(index_bytes) + 1: - message = ( - f"Length of chunks={len(chunksize)} must be equal to array " - f"dimensions={len(index_bytes) + 1}" - ) - raise ValueError(message) - - # Handle storage options and check permissions etc - storage_options_input = storage_options_input or {} - storage_options_output = storage_options_output or {} - - # Open SEG-Y with MDIO's SegySpec. Endianness will be inferred. - mdio_spec = mdio_segy_spec() - segy_settings = SegySettings(storage_options=storage_options_input) - segy = SegyFile(url=segy_path, spec=mdio_spec, settings=segy_settings) - - text_header = segy.text_header - binary_header = segy.binary_header - num_traces = segy.num_traces - - # Index the dataset using a spec that interprets the user provided index headers. - index_fields = [] - for name, byte, format_ in zip(index_names, index_bytes, index_types, strict=True): - index_fields.append(HeaderField(name=name, byte=byte, format=format_)) - mdio_spec_grid = mdio_spec.customize(trace_header_fields=index_fields) - segy_grid = SegyFile(url=segy_path, spec=mdio_spec_grid, settings=segy_settings) - - dimensions, chunksize, index_headers = get_grid_plan( - segy_file=segy_grid, - return_headers=True, - chunksize=chunksize, - grid_overrides=grid_overrides, - ) - grid = Grid(dims=dimensions) - grid_density_qc(grid, num_traces) - grid.build_map(index_headers) - + grid = Grid(dims=segy_dimensions) + grid_density_qc(grid, segy_file.num_traces) + grid.build_map(segy_headers) # Check grid validity by comparing trace numbers - if np.sum(grid.live_mask) != num_traces: + if np.sum(grid.live_mask) != segy_file.num_traces: for dim_name in grid.dim_names: dim_min, dim_max = grid.get_min(dim_name), grid.get_max(dim_name) logger.warning("%s min: %s max: %s", dim_name, dim_min, dim_max) logger.warning("Ingestion grid shape: %s.", grid.shape) - raise GridTraceCountError(np.sum(grid.live_mask), num_traces) - - if chunksize is None: - dim_count = len(index_names) + 1 - if dim_count == 2: # noqa: PLR2004 - chunksize = (512,) * 2 - - elif dim_count == 3: # noqa: PLR2004 - chunksize = (64,) * 3 - - else: - msg = ( - f"Default chunking for {dim_count}-D seismic data is not implemented yet. " - "Please explicity define chunk sizes." - ) - raise NotImplementedError(msg) - - suffix = [str(x) for x in range(dim_count)] - suffix = "".join(suffix) - else: - suffix = [dim_chunks if dim_chunks > 0 else None for dim_chunks in chunksize] - suffix = [str(idx) for idx, value in enumerate(suffix) if value is not None] - suffix = "".join(suffix) - - compressors = get_compressor(lossless, compression_tolerance) - header_dtype = segy.spec.trace.header.dtype.newbyteorder("=") - var_conf = MDIOVariableConfig( - name=f"chunked_{suffix}", - dtype="float32", - chunks=chunksize, - compressors=compressors, - header_dtype=header_dtype, + raise GridTraceCountError(np.sum(grid.live_mask), segy_file.num_traces) + return grid + + +def _get_coordinates( + segy_dimensions: list[Dimension], + segy_headers: SegyHeaderArray, + mdio_template: AbstractDatasetTemplate, +) -> tuple[list[Dimension], dict[str, SegyHeaderArray]]: + """Get the data dim and non-dim coordinates from the SEG-Y headers and MDIO template. + + Select a subset of the segy_dimensions that corresponds to the MDIO dimensions + The dimensions are ordered as in the MDIO template. + The last dimension is always the vertical domain dimension + + Args: + segy_dimensions: List of of all SEG-Y dimensions. + segy_headers: Headers read in from SEG-Y file. + mdio_template: The MDIO template to use for the conversion. + + Raises: + ValueError: If a dimension or coordinate name from the MDIO template is not found in + the SEG-Y headers. + + Returns: + A tuple containing: + - A list of dimension coordinates (1-D arrays). + - A dict of non-dimension coordinates (str: N-D arrays). + """ + dimensions_coords = [] + dim_names = [dim.name for dim in segy_dimensions] + for dim_name in mdio_template.dimension_names: + try: + dim_index = dim_names.index(dim_name) + except ValueError: + err = f"Dimension '{dim_name}' was not found in SEG-Y dimensions." + raise ValueError(err) from err + dimensions_coords.append(segy_dimensions[dim_index]) + + non_dim_coords: dict[str, SegyHeaderArray] = {} + available_headers = segy_headers.dtype.names + for coord_name in mdio_template.coordinate_names: + if coord_name not in available_headers: + err = f"Coordinate '{coord_name}' not found in SEG-Y dimensions." + raise ValueError(err) + non_dim_coords[coord_name] = segy_headers[coord_name] + + return dimensions_coords, non_dim_coords + + +def populate_dim_coordinates( + dataset: xr_Dataset, grid: Grid, drop_vars_delayed: list[str] +) -> tuple[xr_Dataset, list[str]]: + """Populate the xarray dataset with dimension coordinate variables.""" + for dim in grid.dims: + dataset[dim.name].values[:] = dim.coords + drop_vars_delayed.append(dim.name) + return dataset, drop_vars_delayed + + +def populate_non_dim_coordinates( + dataset: xr_Dataset, + grid: Grid, + coordinates: dict[str, SegyHeaderArray], + drop_vars_delayed: list[str], +) -> tuple[xr_Dataset, list[str]]: + """Populate the xarray dataset with coordinate variables.""" + not_null = grid.map[:] != UINT32_MAX + for c_name, c_values in coordinates.items(): + dataset[c_name].values[not_null] = c_values + drop_vars_delayed.append(c_name) + return dataset, drop_vars_delayed + + +def _get_horizontal_coordinate_unit(segy_headers: list[Dimension]) -> LengthUnitEnum | None: + """Get the coordinate unit from the SEG-Y headers.""" + name = TraceHeaderFieldsRev0.COORDINATE_UNIT.name.upper() + unit_hdr = next((c for c in segy_headers if c.name.upper() == name), None) + if unit_hdr is None or len(unit_hdr.coords) == 0: + # If the coordinate unit header is not found or empty, return None + # This is a common case for SEG-Y files, where the coordinate unit is not specified + return None + + if segy_MeasurementSystem(unit_hdr.coords[0]) == segy_MeasurementSystem.METERS: + # If the coordinate unit is in meters, return "m" + return AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER)) + if segy_MeasurementSystem(unit_hdr.coords[0]) == segy_MeasurementSystem.FEET: + # If the coordinate unit is in feet, return "ft" + return AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)) + err = f"Unsupported coordinate unit value: {unit_hdr.value[0]} in SEG-Y file." + raise ValueError(err) + + +def _populate_coordinates( + dataset: xr_Dataset, + grid: Grid, + coords: dict[str, SegyHeaderArray], +) -> tuple[xr_Dataset, list[str]]: + """Populate dim and non-dim coordinates in the xarray dataset and write to Zarr. + + This will write the xr Dataset with coords and dimensions, but empty traces and headers. + + Args: + dataset: The xarray dataset to populate. + grid: The grid object containing the grid map. + coords: The non-dim coordinates to populate. + + Returns: + Xarray dataset with filled coordinates and updated variables to drop after writing + """ + drop_vars_delayed = [] + # Populate the dimension coordinate variables (1-D arrays) + dataset, vars_to_drop_later = populate_dim_coordinates( + dataset, grid, drop_vars_delayed=drop_vars_delayed ) - config = MDIOCreateConfig(path=mdio_path_or_buffer, grid=grid, variables=[var_conf]) - root_group = create_empty( - config, - overwrite=overwrite, - storage_options=storage_options_output, - consolidate_meta=False, + # Populate the non-dimension coordinate variables (N-dim arrays) + dataset, vars_to_drop_later = populate_non_dim_coordinates( + dataset, grid, coordinates=coords, drop_vars_delayed=drop_vars_delayed ) - data_group = root_group["data"] - meta_group = root_group["metadata"] - data_array = data_group[f"chunked_{suffix}"] - header_array = meta_group[f"chunked_{suffix}_trace_headers"] - - # Write actual live mask and metadata to empty MDIO - meta_group["live_mask"][:] = grid.live_mask[:] - nonzero_count = np.count_nonzero(grid.live_mask) - write_attribute(name="trace_count", zarr_group=root_group, attribute=nonzero_count) - write_attribute(name="text_header", zarr_group=meta_group, attribute=text_header.split("\n")) - write_attribute(name="binary_header", zarr_group=meta_group, attribute=binary_header.to_dict()) - - # Write traces - stats = blocked_io.to_zarr( - segy_file=segy, + + return dataset, drop_vars_delayed + + +def segy_to_mdio( + segy_spec: SegySpec, + mdio_template: AbstractDatasetTemplate, + input_location: StorageLocation, + output_location: StorageLocation, + overwrite: bool = False, +) -> None: + """A function that converts a SEG-Y file to an MDIO v1 file. + + Ingest a SEG-Y file according to the segy_spec. This could be a spec from registry or custom. + + Args: + segy_spec: The SEG-Y specification to use for the conversion. + mdio_template: The MDIO template to use for the conversion. + input_location: The storage location of the input SEG-Y file. + output_location: The storage location for the output MDIO v1 file. + overwrite: Whether to overwrite the output file if it already exists. Defaults to False. + + Raises: + FileExistsError: If the output location already exists and overwrite is False. + """ + if not overwrite and output_location.exists(): + err = f"Output location '{output_location.uri}' exists. Set `overwrite=True` if intended." + raise FileExistsError(err) + + segy_settings = SegySettings(storage_options=input_location.options) + segy_file = SegyFile(url=input_location.uri, spec=segy_spec, settings=segy_settings) + + # Scan the SEG-Y file for headers + segy_dimensions, segy_headers = _scan_for_headers(segy_file, mdio_template) + + grid = _build_and_check_grid(segy_dimensions, segy_file, segy_headers) + + dimensions, non_dim_coords = _get_coordinates(segy_dimensions, segy_headers, mdio_template) + shape = [len(dim.coords) for dim in dimensions] + headers = to_structured_type(segy_headers.dtype) + + horizontal_unit = _get_horizontal_coordinate_unit(segy_dimensions) + mdio_ds: Dataset = mdio_template.build_dataset( + name=mdio_template.name, sizes=shape, horizontal_coord_unit=horizontal_unit, headers=headers + ) + + xr_dataset: xr_Dataset = to_xarray_dataset(mdio_ds=mdio_ds) + + xr_dataset, drop_vars_delayed = _populate_coordinates( + dataset=xr_dataset, grid=grid, - data_array=data_array, - header_array=header_array, + coords=non_dim_coords, ) - # Write actual stats - for key, value in stats.items(): - write_attribute(name=key, zarr_group=root_group, attribute=value) + xr_dataset.trace_mask.data[:] = grid.live_mask + + # TODO(Dmitriy Repin): Write out text and binary headers. + # https://github.com/TGSAI/mdio-python/issues/595 + + # IMPORTANT: Do not drop the "trace_mask" here, as it will be used later in + # blocked_io.to_zarr() -> _workers.trace_worker() + + # Write the xarray dataset to Zarr with as following: + # Populated arrays: + # - 1D dimensional coordinates + # - ND non-dimensional coordinates + # - ND trace_mask + # Empty arrays (will be populated later in chunks): + # - ND+1 traces + # - ND headers (no _FillValue set due to the bug https://github.com/TGSAI/mdio-python/issues/582) + # This will create the Zarr store with the correct structure + # TODO(Dmitriy Repin): do chunked write for non-dimensional coordinates and trace_mask + # https://github.com/TGSAI/mdio-python/issues/587 + xr_dataset.to_zarr( + store=output_location.uri, mode="w", write_empty_chunks=False, zarr_format=2, compute=True + ) - zarr.consolidate_metadata(root_group.store) + # Now we can drop them to simplify chunked write of the data variable + xr_dataset = xr_dataset.drop_vars(drop_vars_delayed) + + # Write the headers and traces in chunks using grid_map to indicate dead traces + data_variable_name = mdio_template.trace_variable_name + # This is an memory-expensive and time-consuming read-write operation + # performed in chunks to save the memory + blocked_io.to_zarr( + segy_file=segy_file, + output_location=output_location, + grid_map=grid.map, + dataset=xr_dataset, + data_variable_name=data_variable_name, + ) diff --git a/src/mdio/converters/type_converter.py b/src/mdio/converters/type_converter.py new file mode 100644 index 000000000..20ce63d2e --- /dev/null +++ b/src/mdio/converters/type_converter.py @@ -0,0 +1,85 @@ +"""A module for converting numpy dtypes to MDIO scalar and structured types.""" + +from numpy import dtype as np_dtype + +from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredField +from mdio.schemas.dtype import StructuredType + + +def to_scalar_type(data_type: np_dtype) -> ScalarType: + """Convert numpy dtype to MDIO ScalarType. + + Out of the 24 built-in numpy scalar type objects + (see https://numpy.org/doc/stable/reference/arrays.dtypes.html) + this function supports only a limited subset: + ScalarType.INT8 <-> int8 + ScalarType.INT16 <-> int16 + ScalarType.INT32 <-> int32 + ScalarType.INT64 <-> int64 + ScalarType.UINT8 <-> uint8 + ScalarType.UINT16 <-> uint16 + ScalarType.UINT32 <-> uint32 + ScalarType.UINT64 <-> uint64 + ScalarType.FLOAT32 <-> float32 + ScalarType.FLOAT64 <-> float64 + ScalarType.COMPLEX64 <-> complex64 + ScalarType.COMPLEX128 <-> complex128 + ScalarType.BOOL <-> bool + + Args: + data_type: numpy dtype to convert + + Returns: + ScalarType: corresponding MDIO scalar type + + Raises: + ValueError: if dtype is not supported + """ + try: + return ScalarType(data_type.name) + except ValueError as exc: + err = f"Unsupported numpy dtype '{data_type.name}' for conversion to ScalarType." + raise ValueError(err) from exc + + +def to_structured_type(data_type: np_dtype) -> StructuredType: + """Convert numpy dtype to MDIO StructuredType. + + This function supports only a limited subset of structured types. + In particular: + It does not support nested structured types. + It supports fields of only 13 out of 24 built-in numpy scalar types. + (see `to_scalar_type` for details). + + Args: + data_type: numpy dtype to convert + + Returns: + StructuredType: corresponding MDIO structured type + + Raises: + ValueError: if dtype is not structured or has no fields + + """ + if data_type is None or len(data_type.names or []) == 0: + err = "None or empty dtype provided, cannot convert to StructuredType." + raise ValueError(err) + + fields = [] + for field_name in data_type.names: + field_dtype = data_type.fields[field_name][0] + scalar_type = to_scalar_type(field_dtype) + structured_field = StructuredField(name=field_name, format=scalar_type) + fields.append(structured_field) + return StructuredType(fields=fields) + + +def to_numpy_dtype(data_type: ScalarType | StructuredType) -> np_dtype: + """Get the numpy dtype for a variable.""" + if isinstance(data_type, ScalarType): + return np_dtype(data_type.value) + if isinstance(data_type, StructuredType): + return np_dtype([(f.name, f.format.value) for f in data_type.fields]) + msg = f"Expected ScalarType or StructuredType, got '{type(data_type).__name__}'" + raise ValueError(msg) diff --git a/src/mdio/core/indexing.py b/src/mdio/core/indexing.py index 936178f8d..1e10cadfb 100644 --- a/src/mdio/core/indexing.py +++ b/src/mdio/core/indexing.py @@ -4,78 +4,83 @@ from math import ceil import numpy as np -from zarr import Array class ChunkIterator: - """Iterator for traversing a Zarr array in chunks. + """Chunk iterator for multi-dimensional arrays. - This iterator yields tuples of slices corresponding to the chunk boundaries of a Zarr array. - It supports chunking all dimensions or taking the full extent of the last dimension. + This iterator takes an array shape and chunks and every time it is iterated, it returns + a dictionary (if dimensions are provided) or a tuple of slices that align with + chunk boundaries. When dimensions are provided, they are used as the dictionary keys. Args: - array: The Zarr array to iterate, providing shape and chunk sizes. - chunk_samples: If True, chunks all dimensions. If False, takes the full extent of the - last dimension. Defaults to True. - - - Example: - >>> import zarr - >>> arr = zarr.array(np.zeros((10, 20)), chunks=(3, 4)) - >>> it = ChunkIterator(arr) - >>> for slices in it: - ... print(slices) - (slice(0, 3, None), slice(0, 4, None)) - (slice(0, 3, None), slice(4, 8, None)) - ... - >>> it = ChunkIterator(arr, chunk_samples=False) - >>> for slices in it: - ... print(slices) - (slice(0, 3, None), slice(0, 20, None)) - (slice(3, 6, None), slice(0, 20, None)) - ... + shape: The shape of the array. + chunks: The chunk sizes for each dimension. + dim_names: The names of the array dimensions, to be used with DataArray.isel(). + If the dim_names are not provided, a tuple of the slices will be returned. + + Attributes: # noqa: DOC602 + arr_shape: Shape of the array. + len_chunks: Length of chunks in each dimension. + dim_chunks: Number of chunks in each dimension. + num_chunks: Total number of chunks. + + Examples: + >> chunks = (3, 4, 5) + >> shape = (5, 11, 19) + >> dims = ["inline", "crossline", "depth"] + >> + >> iter = ChunkIterator(shape=shape, chunks=chunks, dim_names=dims) + >> for i in range(13): + >> region = iter.__next__() + >> print(region) + { "inline": slice(3,6, None), "crossline": slice(0,4, None), "depth": slice(0,5, None) } + + >> iter = ChunkIterator(shape=shape, chunks=chunks, dim_names=None) + >> for i in range(13): + >> region = iter.__next__() + >> print(region) + (slice(3,6,None), slice(0,4,None), slice(0,5,None)) """ - def __init__(self, array: Array, chunk_samples: bool = True): - self.arr_shape = array.shape - self.len_chunks = array.chunks - - # If chunk_samples is False, set the last dimension's chunk size to its full extent - if not chunk_samples: - self.len_chunks = self.len_chunks[:-1] + (self.arr_shape[-1],) - - # Calculate the number of chunks per dimension - self.dim_chunks = [ - ceil(len_dim / chunk) - for len_dim, chunk in zip(self.arr_shape, self.len_chunks, strict=True) - ] + def __init__( + self, shape: tuple[int, ...], chunks: tuple[int, ...], dim_names: tuple[str, ...] = None + ): + self.arr_shape = tuple(shape) # Deep copy to ensure immutability + self.len_chunks = tuple(chunks) # Deep copy to ensure immutability + self.dims = dim_names + + # Compute number of chunks per dimension, and total number of chunks + self.dim_chunks = tuple( + [ + ceil(len_dim / chunk) + for len_dim, chunk in zip(self.arr_shape, self.len_chunks, strict=True) + ] + ) self.num_chunks = np.prod(self.dim_chunks) - # Set up chunk index combinations using ranges for each dimension + # Under the hood stuff for the iterator. This generates C-ordered + # permutation of chunk indices. dim_ranges = [range(dim_len) for dim_len in self.dim_chunks] self._ranges = itertools.product(*dim_ranges) self._idx = 0 def __iter__(self) -> "ChunkIterator": - """Return the iterator object itself.""" + """Iteration context.""" return self def __len__(self) -> int: - """Return the total number of chunks.""" + """Get total number of chunks.""" return self.num_chunks - def __next__(self) -> tuple[slice, ...]: - """Yield the next set of chunk slices. - - Returns: - A tuple of slice objects for each dimension. - - Raises: - StopIteration: When all chunks have been iterated over. - """ - if self._idx < self.num_chunks: + def __next__(self) -> dict[str, slice]: + """Iteration logic.""" + if self._idx <= self.num_chunks: + # We build slices here. It is dimension agnostic current_start = next(self._ranges) + # TODO (Dmitriy Repin): Enhance ChunkIterator to make the last slice, if needed, smaller + # https://github.com/TGSAI/mdio-python/issues/586 start_indices = tuple( dim * chunk for dim, chunk in zip(current_start, self.len_chunks, strict=True) ) @@ -88,7 +93,17 @@ def __next__(self) -> tuple[slice, ...]: slice(start, stop) for start, stop in zip(start_indices, stop_indices, strict=True) ) + if self.dims: # noqa SIM108 + # Example + # {"inline":slice(3,6,None), "crossline":slice(0,4,None), "depth":slice(0,5,None)} + result = dict(zip(self.dims, slices, strict=False)) + else: + # Example + # (slice(3,6,None), slice(0,4,None), slice(0,5,None)) + result = slices + self._idx += 1 - return slices + + return result raise StopIteration diff --git a/src/mdio/core/storage_location.py b/src/mdio/core/storage_location.py new file mode 100644 index 000000000..3a5adb2a1 --- /dev/null +++ b/src/mdio/core/storage_location.py @@ -0,0 +1,87 @@ +"""StorageLocation class for managing local and cloud storage locations.""" + +from pathlib import Path +from typing import Any + +import fsspec + + +# TODO(Dmitriy Repin): Reuse fsspec functions for some methods we implemented here +# https://github.com/TGSAI/mdio-python/issues/597 +class StorageLocation: + """A class to represent a local or cloud storage location for SEG-Y or MDIO files. + + This class abstracts the storage location, allowing for both local file paths and + cloud storage URIs (e.g., S3, GCS). It uses fsspec to check existence and manage options. + Note, we do not want to make it a dataclass because we want the uri and the options to + be read-only immutable properties. + + uri: The URI of the storage location (e.g., '/path/to/file', 'file:///path/to/file', + 's3://bucket/path', 'gs://bucket/path'). + options: Optional dictionary of options for the cloud, such as credentials. + + """ + + def __init__(self, uri: str = "", options: dict[str, Any] = None): + self._uri = uri + self._options = options or {} + self._fs = None + + if uri.startswith(("s3://", "gs://")): + return + + if uri.startswith("file://"): + self._uri = self._uri.removeprefix("file://") + # For local paths, ensure they are absolute and resolved + self._uri = str(Path(self._uri).resolve()) + return + + @property + def uri(self) -> str: + """Get the URI (read-only).""" + return self._uri + + @property + def options(self) -> dict[str, Any]: + """Get the options (read-only).""" + # Return a copy to prevent external modification + return self._options.copy() + + @property + def _filesystem(self) -> fsspec.AbstractFileSystem: + """Get the fsspec filesystem instance for this storage location.""" + if self._fs is None: + self._fs = fsspec.filesystem(self._protocol, **self._options) + return self._fs + + @property + def _path(self) -> str: + """Extract the path portion from the URI.""" + if "://" in self._uri: + return self._uri.split("://", 1)[1] + return self._uri # For local paths without file:// prefix + + @property + def _protocol(self) -> str: + """Extract the protocol/scheme from the URI.""" + if "://" in self._uri: + return self._uri.split("://", 1)[0] + return "file" # Default to file protocol + + def exists(self) -> bool: + """Check if the storage location exists using fsspec.""" + try: + return self._filesystem.exists(self._path) + except Exception as e: + # Log the error and return False for safety + # In a production environment, you might want to use proper logging + print(f"Error checking existence of {self._uri}: {e}") + return False + + def __str__(self) -> str: + """String representation of the storage location.""" + return self._uri + + def __repr__(self) -> str: + """Developer representation of the storage location.""" + return f"StorageLocation(uri='{self._uri}', options={self._options})" diff --git a/src/mdio/schemas/v1/dataset_serializer.py b/src/mdio/schemas/v1/dataset_serializer.py index f1d21221e..af77e0c2e 100644 --- a/src/mdio/schemas/v1/dataset_serializer.py +++ b/src/mdio/schemas/v1/dataset_serializer.py @@ -1,15 +1,14 @@ """Convert MDIO v1 schema Dataset to Xarray DataSet and write it in Zarr.""" -from collections.abc import Mapping - import numpy as np from numcodecs import Blosc as nc_Blosc -from numpy import dtype as np_dtype from xarray import DataArray as xr_DataArray from xarray import Dataset as xr_Dataset from zarr import zeros as zarr_zeros from zarr.core.chunk_key_encodings import V2ChunkKeyEncoding +from mdio.converters.type_converter import to_numpy_dtype + try: # zfpy is an optional dependency for ZFP compression # It is not installed by default, so we check for its presence and import it only if available. @@ -91,16 +90,6 @@ def _get_coord_names(var: Variable) -> list[str]: return coord_names -def _get_np_datatype(data_type: ScalarType | StructuredType) -> np_dtype: - """Get the numpy dtype for a variable.""" - if isinstance(data_type, ScalarType): - return np_dtype(data_type.value) - if isinstance(data_type, StructuredType): - return np_dtype([(f.name, f.format.value) for f in data_type.fields]) - msg = f"Expected ScalarType or StructuredType, got '{type(data_type).__name__}'" - raise ValueError(msg) - - def _get_zarr_shape(var: Variable, all_named_dims: dict[str, NamedDimension]) -> tuple[int, ...]: """Get the shape of a variable for Zarr storage. @@ -170,7 +159,7 @@ def _get_fill_value(data_type: ScalarType | StructuredType | str) -> any: if isinstance(data_type, ScalarType): return fill_value_map.get(data_type) if isinstance(data_type, StructuredType): - d_type = _get_np_datatype(data_type) + d_type = to_numpy_dtype(data_type) return np.zeros((), dtype=d_type) if isinstance(data_type, str): return "" @@ -178,7 +167,7 @@ def _get_fill_value(data_type: ScalarType | StructuredType | str) -> any: return None -def to_xarray_dataset(mdio_ds: Dataset) -> xr_DataArray: # noqa: PLR0912 +def to_xarray_dataset(mdio_ds: Dataset) -> xr_Dataset: # noqa: PLR0912 """Build an XArray dataset with correct dimensions and dtypes. This function constructs the underlying data structure for an XArray dataset, @@ -203,7 +192,7 @@ def to_xarray_dataset(mdio_ds: Dataset) -> xr_DataArray: # noqa: PLR0912 data_arrays: dict[str, xr_DataArray] = {} for v in mdio_ds.variables: shape = _get_zarr_shape(v, all_named_dims=all_named_dims) - dtype = _get_np_datatype(v.data_type) + dtype = to_numpy_dtype(v.data_type) chunks = _get_zarr_chunks(v, all_named_dims=all_named_dims) # Use zarr.zeros to create an empty array with the specified shape and dtype @@ -228,12 +217,18 @@ def to_xarray_dataset(mdio_ds: Dataset) -> xr_DataArray: # noqa: PLR0912 # Create a custom chunk key encoding with "/" as separator chunk_key_encoding = V2ChunkKeyEncoding(separator="/").to_dict() encoding = { - # NOTE: See Zarr documentation on use of fill_value and _FillValue in Zarr v2 vs v3 - "_FillValue": _get_fill_value(v.data_type), "chunks": chunks, "chunk_key_encoding": chunk_key_encoding, "compressor": _convert_compressor(v.compressor), } + # NumPy structured data types have fields attribute, while scalar types do not. + if not hasattr(v.data_type, "fields"): + # TODO(Dmitriy Repin): work around of the bug + # https://github.com/TGSAI/mdio-python/issues/582 + # For structured data types we will not use the _FillValue + # NOTE: See Zarr documentation on use of fill_value and _FillValue in Zarr v2 vs v3 + encoding["_FillValue"] = _get_fill_value(v.data_type) + data_array.encoding = encoding # Let's store the data array for the second pass @@ -263,35 +258,3 @@ def to_xarray_dataset(mdio_ds: Dataset) -> xr_DataArray: # noqa: PLR0912 xr_ds.attrs["attributes"] = mdio_ds.metadata.attributes return xr_ds - - -def to_zarr( - dataset: xr_Dataset, - store: str | None = None, - *args: str | int | float | bool, - **kwargs: Mapping[str, str | int | float | bool], -) -> None: - """Write an XArray dataset to Zarr format. - - Args: - dataset: The XArray dataset to write. - store: The Zarr store to write to. If None, defaults to in-memory store. - *args: Additional positional arguments for the Zarr store. - **kwargs: Additional keyword arguments for the Zarr store. - - Notes: - It sets the zarr_format to 2, which is the default for XArray datasets. - Since we set kwargs["compute"], this method will return a dask.delayed.Delayed object - and the arrays will not be immediately written. - - References: - https://docs.xarray.dev/en/stable/user-guide/io.html - https://docs.xarray.dev/en/latest/generated/xarray.DataArray.to_zarr.html - - Returns: - None: The function writes the dataset as dask.delayed.Delayed object to the - specified Zarr store. - """ - kwargs["zarr_format"] = 2 - kwargs["compute"] = False - return dataset.to_zarr(*args, store=store, **kwargs) diff --git a/src/mdio/schemas/v1/templates/abstract_dataset_template.py b/src/mdio/schemas/v1/templates/abstract_dataset_template.py index 776a65ce0..ef3cfcbae 100644 --- a/src/mdio/schemas/v1/templates/abstract_dataset_template.py +++ b/src/mdio/schemas/v1/templates/abstract_dataset_template.py @@ -1,5 +1,6 @@ """Template method pattern implementation for MDIO v1 dataset template.""" +import copy from abc import ABC from abc import abstractmethod @@ -7,6 +8,7 @@ from mdio.schemas.chunk_grid import RegularChunkGrid from mdio.schemas.chunk_grid import RegularChunkShape from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredType from mdio.schemas.metadata import ChunkGridMetadata from mdio.schemas.metadata import UserAttributes from mdio.schemas.v1.dataset import Dataset @@ -32,25 +34,19 @@ def __init__(self, domain: str = "") -> None: # Note: For pre-stack Shot gathers, the coordinates are defined differently # and are not directly tied to _coord_dim_names. self._coord_dim_names = [] - # Names of all dimensions in the dataset + # *ORDERED* list of names of all dimensions in the dataset # e.g. ["cdp", "depth"] for 2D post-stack depth # e.g. ["inline", "crossline", "depth"] for 3D post-stack depth # e.g. ["inline", "crossline", "offset", "depth"] for 3D pre-stack depth CPD gathers # e.g. ["shot_point", "cable", "channel", "time"] for 3D pre-stack time Shot gathers self._dim_names = [] # Names of all coordinates in the dataset - # e.g. ["cdp-x", "cdp-y"] for 2D post-stack depth - # e.g. ["cdp-x", "cdp-y"] for 3D post-stack depth - # e.g. ["cdp-x", "cdp-y"] for 3D pre-stack CPD depth + # e.g. ["cdp_x", "cdp_y"] for 2D post-stack depth + # e.g. ["cdp_x", "cdp_y"] for 3D post-stack depth + # e.g. ["cdp_x", "cdp_y"] for 3D pre-stack CPD depth # e.g. ["gun", "shot-x", "shot-y", "receiver-x", "receiver-y"] for 3D pre-stack # time Shot gathers self._coord_names = [] - # Name of the variable in the dataset - # e.g. "StackedAmplitude" for 2D post-stack depth - # e.g. "StackedAmplitude" for 3D post-stack depth - # e.g. "AmplitudeCDP" for 3D pre-stack CPD depth - # e.g. "AmplitudeShot" for 3D pre-stack time Shot gathers - self._var_name = "" # Chunk shape for the variable in the dataset # e.g. [1024, 1024] for 2D post-stack depth # e.g. [128, 128, 128] for 3D post-stack depth @@ -64,34 +60,66 @@ def __init__(self, domain: str = "") -> None: self._dim_sizes = [] # Horizontal units for the coordinates (e.g, "m", "ft"), to be set when # build_dataset() is called - self._coord_units = [] - - def build_dataset(self, name: str, sizes: list[int], coord_units: list[AllUnits]) -> Dataset: + self._horizontal_coord_unit = None + + def build_dataset( + self, + name: str, + sizes: list[int], + horizontal_coord_unit: AllUnits, + headers: StructuredType = None, + ) -> Dataset: """Template method that builds the dataset. Args: name: The name of the dataset. sizes: The sizes of the dimensions. - coord_units: The units for the coordinates. + horizontal_coord_unit: The units for the horizontal coordinates. + headers: Optional structured headers for the dataset. Returns: Dataset: The constructed dataset """ self._dim_sizes = sizes - self._coord_units = coord_units + self._horizontal_coord_unit = horizontal_coord_unit self._builder = MDIODatasetBuilder(name=name, attributes=self._load_dataset_attributes()) self._add_dimensions() self._add_coordinates() self._add_variables() + self._add_trace_mask() + if headers: + self._add_trace_headers(headers) return self._builder.build() - def get_name(self) -> str: + @property + def name(self) -> str: """Returns the name of the template.""" - return self._get_name() + return self._name + + @property + def trace_variable_name(self) -> str: + """Returns the name of the trace variable.""" + return self._trace_variable_name + + @property + def trace_domain(self) -> str: + """Returns the name of the trace domain.""" + return self._trace_domain + + @property + def dimension_names(self) -> list[str]: + """Returns the names of the dimensions.""" + return copy.deepcopy(self._dim_names) + @property + def coordinate_names(self) -> list[str]: + """Returns the names of the coordinates.""" + return copy.deepcopy(self._coord_names) + + @property @abstractmethod - def _get_name(self) -> str: + def _name(self) -> str: """Abstract method to get the name of the template. Must be implemented by subclasses. @@ -100,6 +128,18 @@ def _get_name(self) -> str: str: The name of the template """ + @property + def _trace_variable_name(self) -> str: + """Get the name of the data variable. + + A virtual method that can be overwritten by subclasses to return a + custom data variable name. + + Returns: + str: The name of the data variable + """ + return "amplitude" + @abstractmethod def _load_dataset_attributes(self) -> UserAttributes: """Abstract method to load dataset attributes. @@ -111,33 +151,83 @@ def _load_dataset_attributes(self) -> UserAttributes: """ def _add_dimensions(self) -> None: - """A virtual method that can be overwritten by subclasses to add custom dimensions. + """Add custom dimensions. + A virtual method that can be overwritten by subclasses to add custom dimensions. Uses the class field 'builder' to add dimensions to the dataset. """ for i in range(len(self._dim_names)): self._builder.add_dimension(self._dim_names[i], self._dim_sizes[i]) def _add_coordinates(self) -> None: - """A virtual method that can be overwritten by subclasses to add custom coordinates. + """Add custom coordinates. + A virtual method that can be overwritten by subclasses to add custom coordinates. Uses the class field 'builder' to add coordinates to the dataset. """ + # Add dimension coordinates + for name in self._dim_names: + self._builder.add_coordinate( + name, + dimensions=[name], + data_type=ScalarType.INT32, + metadata_info=None, + ) + + # Add non-dimension coordinates + # TODO(Dmitriy Repin): do chunked write for non-dimensional coordinates and trace_mask + # https://github.com/TGSAI/mdio-python/issues/587 + # The chunk size used for trace mask will be different from the _var_chunk_shape + hor_coord_units = [self._horizontal_coord_unit] * len(self._coord_dim_names) for i in range(len(self._coord_names)): self._builder.add_coordinate( self._coord_names[i], dimensions=self._coord_dim_names, data_type=ScalarType.FLOAT64, - metadata_info=[self._coord_units], + metadata_info=hor_coord_units, ) + def _add_trace_mask(self) -> None: + """Add trace mask variables.""" + # TODO(Dmitriy Repin): do chunked write for non-dimensional coordinates and trace_mask + # https://github.com/TGSAI/mdio-python/issues/587 + # The chunk size used for trace mask will be different from the _var_chunk_shape + self._builder.add_variable( + name="trace_mask", + dimensions=self._dim_names[:-1], # All dimensions except vertical (the last one) + data_type=ScalarType.BOOL, + compressor=compressors.Blosc(algorithm=compressors.BloscAlgorithm.ZSTD), + coordinates=self._coord_names, + metadata_info=None, + ) + + def _add_trace_headers(self, headers: StructuredType) -> None: + """Add trace mask variables.""" + # headers = StructuredType.model_validate(header_fields) + + self._builder.add_variable( + name="headers", + dimensions=self._dim_names[:-1], # All dimensions except vertical (the last one) + data_type=headers, + compressor=compressors.Blosc(algorithm=compressors.BloscAlgorithm.ZSTD), + coordinates=self._coord_names, + metadata_info=[ + ChunkGridMetadata( + chunk_grid=RegularChunkGrid( + configuration=RegularChunkShape(chunk_shape=self._var_chunk_shape[:-1]) + ) + ) + ], + ) + def _add_variables(self) -> None: - """A virtual method that can be overwritten by subclasses to add custom variables. + """Add custom variables. + A virtual method that can be overwritten by subclasses to add custom variables. Uses the class field 'builder' to add variables to the dataset. """ self._builder.add_variable( - name=self._var_name, + name=self._trace_variable_name, dimensions=self._dim_names, data_type=ScalarType.FLOAT32, compressor=compressors.Blosc(algorithm=compressors.BloscAlgorithm.ZSTD), diff --git a/src/mdio/schemas/v1/templates/seismic_2d_poststack.py b/src/mdio/schemas/v1/templates/seismic_2d_poststack.py index 4f0d81b68..297d598bc 100644 --- a/src/mdio/schemas/v1/templates/seismic_2d_poststack.py +++ b/src/mdio/schemas/v1/templates/seismic_2d_poststack.py @@ -12,11 +12,11 @@ def __init__(self, domain: str): self._coord_dim_names = ["cdp"] self._dim_names = [*self._coord_dim_names, self._trace_domain] - self._coord_names = ["cdp-x", "cdp-y"] - self._var_name = "StackedAmplitude" + self._coord_names = ["cdp_x", "cdp_y"] self._var_chunk_shape = [1024, 1024] - def _get_name(self) -> str: + @property + def _name(self) -> str: return f"PostStack2D{self._trace_domain.capitalize()}" def _load_dataset_attributes(self) -> UserAttributes: diff --git a/src/mdio/schemas/v1/templates/seismic_3d_poststack.py b/src/mdio/schemas/v1/templates/seismic_3d_poststack.py index 3fd3950a3..78021f72e 100644 --- a/src/mdio/schemas/v1/templates/seismic_3d_poststack.py +++ b/src/mdio/schemas/v1/templates/seismic_3d_poststack.py @@ -12,11 +12,11 @@ def __init__(self, domain: str): # Template attributes to be overridden by subclasses self._coord_dim_names = ["inline", "crossline"] self._dim_names = [*self._coord_dim_names, self._trace_domain] - self._coord_names = ["cdp-x", "cdp-y"] - self._var_name = "StackedAmplitude" + self._coord_names = ["cdp_x", "cdp_y"] self._var_chunk_shape = [128, 128, 128] - def _get_name(self) -> str: + @property + def _name(self) -> str: return f"PostStack3D{self._trace_domain.capitalize()}" def _load_dataset_attributes(self) -> UserAttributes: diff --git a/src/mdio/schemas/v1/templates/seismic_3d_prestack_cdp.py b/src/mdio/schemas/v1/templates/seismic_3d_prestack_cdp.py index fa95729b8..2ae22b550 100644 --- a/src/mdio/schemas/v1/templates/seismic_3d_prestack_cdp.py +++ b/src/mdio/schemas/v1/templates/seismic_3d_prestack_cdp.py @@ -10,13 +10,13 @@ class Seismic3DPreStackCDPTemplate(AbstractDatasetTemplate): def __init__(self, domain: str): super().__init__(domain=domain) - self._coord_dim_names = ["inline", "crossline"] - self._dim_names = [*self._coord_dim_names, "offset", self._trace_domain] - self._coord_names = ["cdp-x", "cdp-y"] - self._var_name = "AmplitudeCDP" + self._coord_dim_names = ["inline", "crossline", "offset"] + self._dim_names = [*self._coord_dim_names, self._trace_domain] + self._coord_names = ["cdp_x", "cdp_y"] self._var_chunk_shape = [1, 1, 512, 4096] - def _get_name(self) -> str: + @property + def _name(self) -> str: return f"PreStackCdpGathers3D{self._trace_domain.capitalize()}" def _load_dataset_attributes(self) -> UserAttributes: diff --git a/src/mdio/schemas/v1/templates/seismic_3d_prestack_shot.py b/src/mdio/schemas/v1/templates/seismic_3d_prestack_shot.py index a39331276..ac644fbd1 100644 --- a/src/mdio/schemas/v1/templates/seismic_3d_prestack_shot.py +++ b/src/mdio/schemas/v1/templates/seismic_3d_prestack_shot.py @@ -12,13 +12,17 @@ class Seismic3DPreStackShotTemplate(AbstractDatasetTemplate): def __init__(self, domain: str): super().__init__(domain=domain) - self._coord_dim_names = [] # Custom coordinate definition for shot gathers - self._dim_names = ["shot_point", "cable", "channel", self._trace_domain] + self._coord_dim_names = [ + "shot_point", + "cable", + "channel", + ] # Custom coordinate definition for shot gathers + self._dim_names = [*self._coord_dim_names, self._trace_domain] self._coord_names = ["gun", "shot-x", "shot-y", "receiver-x", "receiver-y"] - self._var_name = "AmplitudeShot" self._var_chunk_shape = [1, 1, 512, 4096] - def _get_name(self) -> str: + @property + def _name(self) -> str: return f"PreStackShotGathers3D{self._trace_domain.capitalize()}" def _load_dataset_attributes(self) -> UserAttributes: @@ -31,6 +35,16 @@ def _load_dataset_attributes(self) -> UserAttributes: ) def _add_coordinates(self) -> None: + # Add dimension coordinates + for name in self._dim_names: + self._builder.add_coordinate( + name, + dimensions=[name], + data_type=ScalarType.INT32, + metadata_info=None, + ) + + # Add non-dimension coordinates self._builder.add_coordinate( "gun", dimensions=["shot_point"], @@ -41,23 +55,23 @@ def _add_coordinates(self) -> None: "shot-x", dimensions=["shot_point"], data_type=ScalarType.FLOAT64, - metadata_info=[self._coord_units[0]], + metadata_info=[self._horizontal_coord_unit], ) self._builder.add_coordinate( "shot-y", dimensions=["shot_point"], data_type=ScalarType.FLOAT64, - metadata_info=[self._coord_units[1]], + metadata_info=[self._horizontal_coord_unit], ) self._builder.add_coordinate( "receiver-x", dimensions=["shot_point", "cable", "channel"], data_type=ScalarType.FLOAT64, - metadata_info=[self._coord_units[0]], + metadata_info=[self._horizontal_coord_unit], ) self._builder.add_coordinate( "receiver-y", dimensions=["shot_point", "cable", "channel"], data_type=ScalarType.FLOAT64, - metadata_info=[self._coord_units[1]], + metadata_info=[self._horizontal_coord_unit], ) diff --git a/src/mdio/schemas/v1/templates/template_registry.py b/src/mdio/schemas/v1/templates/template_registry.py index c674b0c20..b1c7550a3 100644 --- a/src/mdio/schemas/v1/templates/template_registry.py +++ b/src/mdio/schemas/v1/templates/template_registry.py @@ -54,7 +54,7 @@ def register(self, instance: AbstractDatasetTemplate) -> str: ValueError: If the template name is already registered. """ with self._registry_lock: - name = instance.get_name() + name = instance.name if name in self._templates: err = f"Template '{name}' is already registered." raise ValueError(err) diff --git a/src/mdio/segy/_workers.py b/src/mdio/segy/_workers.py index 2380b16fa..2be530034 100644 --- a/src/mdio/segy/_workers.py +++ b/src/mdio/segy/_workers.py @@ -4,7 +4,6 @@ import os from typing import TYPE_CHECKING -from typing import Any from typing import TypedDict from typing import cast @@ -15,9 +14,14 @@ from segy.arrays import HeaderArray from segy.config import SegySettings from segy.schema import SegySpec - from zarr import Array + from xarray import Dataset as xr_Dataset + from zarr import Array as zarr_Array - from mdio.core import Grid + from mdio.core.storage_location import StorageLocation + +from mdio.constants import UINT32_MAX +from mdio.schemas.v1.stats import CenteredBinHistogram +from mdio.schemas.v1.stats import SummaryStatistics class SegyFileArguments(TypedDict): @@ -29,8 +33,7 @@ class SegyFileArguments(TypedDict): def header_scan_worker( - segy_kw: SegyFileArguments, - trace_range: tuple[int, int], + segy_kw: SegyFileArguments, trace_range: tuple[int, int], subset: list[str] | None = None ) -> HeaderArray: """Header scan worker. @@ -40,6 +43,7 @@ def header_scan_worker( Args: segy_kw: Arguments to open SegyFile instance. trace_range: Tuple consisting of the trace ranges to read. + subset: List of header names to filter and keep. Returns: HeaderArray parsed from SEG-Y library. @@ -55,6 +59,9 @@ def header_scan_worker( else: trace_header = segy_file.header[slice_] + if subset is not None: + trace_header = trace_header[subset] + # Get non-void fields from dtype and copy to new array for memory efficiency fields = trace_header.dtype.fields non_void_fields = [(name, dtype) for name, (dtype, _) in fields.items()] @@ -67,72 +74,68 @@ def header_scan_worker( return cast("HeaderArray", trace_header) -def trace_worker( +def trace_worker( # noqa: PLR0913 segy_kw: SegyFileArguments, - data_array: Array, - metadata_array: Array, - grid: Grid, - chunk_indices: tuple[slice, ...], -) -> tuple[Any, ...] | None: - """Worker function for multi-process enabled blocked SEG-Y I/O. - - Performance of `zarr.Array` writes is slow if data isn't aligned with chunk boundaries, - sacrificing sequential reads of SEG-Y files. This won't be an issue with SSDs or cloud. - - It retrieves trace numbers from the grid and gathers the current chunk's SEG-Y trace indices. - Then, it fills a temporary array in memory and writes to the `zarr.Array` chunk. We take full - slices across the sample dimension since SEG-Y data isn't chunked, eliminating concern. + output_location: StorageLocation, + data_variable_name: str, + region: dict[str, slice], + grid_map: zarr_Array, + dataset: xr_Dataset, +) -> SummaryStatistics | None: + """Writes a subset of traces from a region of the dataset of Zarr file. Args: segy_kw: Arguments to open SegyFile instance. - data_array: Handle for zarr.Array we are writing traces to - metadata_array: Handle for zarr.Array we are writing trace headers - grid: mdio.Grid instance - chunk_indices: Tuple consisting of the chunk slice indices for each dimension + output_location: StorageLocation for the output Zarr dataset + (e.g. local file path or cloud storage URI) the location + also includes storage options for cloud storage. + data_variable_name: Name of the data variable to write. + region: Region of the dataset to write to. + grid_map: Zarr array mapping live traces to their positions in the dataset. + dataset: Xarray dataset containing the data to write. Returns: - Partial statistics for chunk, or None + SummaryStatistics object containing statistics about the written traces. """ - # Special case where there are no traces inside chunk. - segy_file = SegyFile(**segy_kw) - live_subset = grid.live_mask[chunk_indices[:-1]] - - if np.count_nonzero(live_subset) == 0: + if not dataset.trace_mask.any(): return None - # Let's get trace numbers from grid map using the chunk indices. - seq_trace_indices = grid.map[chunk_indices[:-1]] - - tmp_data = np.zeros(seq_trace_indices.shape + (grid.shape[-1],), dtype=data_array.dtype) - tmp_metadata = np.zeros(seq_trace_indices.shape, dtype=metadata_array.dtype) - - del grid # To save some memory - - # Read headers and traces for block - valid_indices = seq_trace_indices[live_subset] - - traces = segy_file.trace[valid_indices.tolist()] - headers, samples = traces["header"], traces["data"] - - tmp_metadata[live_subset] = headers.view(tmp_metadata.dtype) - tmp_data[live_subset] = samples - - # Flush metadata to zarr - metadata_array.set_basic_selection(selection=chunk_indices[:-1], value=tmp_metadata) - - nonzero_mask = samples != 0 - nonzero_count = nonzero_mask.sum(dtype="uint32") + # Open the SEG-Y file in every new process / spawned worker since the + # open file handles cannot be shared across processes. + segy_file = SegyFile(**segy_kw) - if nonzero_count == 0: - return None + not_null = grid_map != UINT32_MAX - data_array.set_basic_selection(selection=chunk_indices, value=tmp_data) + live_trace_indexes = grid_map[not_null].tolist() + traces = segy_file.trace[live_trace_indexes] - # Calculate statistics - tmp_data = samples[nonzero_mask] - chunk_sum = tmp_data.sum(dtype="float64") - chunk_sum_squares = np.square(tmp_data, dtype="float64").sum() - min_val = tmp_data.min() - max_val = tmp_data.max() + # Get subset of the dataset that has not yet been saved + # The headers might not be present in the dataset + # TODO(Dmitriy Repin): Check, should we overwrite the 'dataset' instead to save the memory + # https://github.com/TGSAI/mdio-python/issues/584 + if "headers" in dataset.data_vars: + ds_to_write = dataset[[data_variable_name, "headers"]] + ds_to_write = ds_to_write.reset_coords() - return nonzero_count, chunk_sum, chunk_sum_squares, min_val, max_val + ds_to_write["headers"].data[not_null] = traces.header + ds_to_write["headers"].data[~not_null] = 0 + else: + ds_to_write = dataset[[data_variable_name]] + ds_to_write = ds_to_write.reset_coords() + + ds_to_write[data_variable_name].data[not_null] = traces.sample + + out_path = output_location.uri + ds_to_write.to_zarr(out_path, region=region, mode="r+", write_empty_chunks=False, zarr_format=2) + + histogram = CenteredBinHistogram(bin_centers=[], counts=[]) + return SummaryStatistics( + count=traces.sample.size, + min=traces.sample.min(), + max=traces.sample.max(), + sum=traces.sample.sum(), + # TODO(Altay): Look at how to do the sum squares statistic correctly + # https://github.com/TGSAI/mdio-python/issues/581 + sum_squares=(traces.sample**2).sum(), + histogram=histogram, + ) diff --git a/src/mdio/segy/blocked_io.py b/src/mdio/segy/blocked_io.py index 6e23be1f4..e92aed2e6 100644 --- a/src/mdio/segy/blocked_io.py +++ b/src/mdio/segy/blocked_io.py @@ -2,9 +2,10 @@ from __future__ import annotations +import multiprocessing as mp import os from concurrent.futures import ProcessPoolExecutor -from itertools import repeat +from concurrent.futures import as_completed from pathlib import Path from typing import TYPE_CHECKING @@ -13,8 +14,12 @@ from dask.array import map_blocks from psutil import cpu_count from tqdm.auto import tqdm +from zarr import consolidate_metadata as zarr_consolidate_metadata +from zarr import open_group as zarr_open_group from mdio.core.indexing import ChunkIterator +from mdio.schemas.v1.stats import CenteredBinHistogram +from mdio.schemas.v1.stats import SummaryStatistics from mdio.segy._workers import trace_worker from mdio.segy.creation import SegyPartRecord from mdio.segy.creation import concat_files @@ -25,89 +30,119 @@ from numpy.typing import NDArray from segy import SegyFactory from segy import SegyFile + from xarray import Dataset as xr_Dataset + from zarr import Array as zarr_Array - from mdio.core import Grid + from mdio.core.storage_location import StorageLocation default_cpus = cpu_count(logical=True) -def to_zarr(segy_file: SegyFile, grid: Grid, data_array: Array, header_array: Array) -> dict: - """Blocked I/O from SEG-Y to chunked `zarr.core.Array`. +def _create_stats() -> SummaryStatistics: + histogram = CenteredBinHistogram(bin_centers=[], counts=[]) + return SummaryStatistics(count=0, min=0, max=0, sum=0, sum_squares=0, histogram=histogram) + + +def _update_stats(final_stats: SummaryStatistics, partial_stats: SummaryStatistics) -> None: + final_stats.count += partial_stats.count + final_stats.min = min(final_stats.min, partial_stats.min) + final_stats.max = min(final_stats.max, partial_stats.max) + final_stats.sum += partial_stats.sum + final_stats.sum_squares += partial_stats.sum_squares + + +def to_zarr( # noqa: PLR0913, PLR0915 + segy_file: SegyFile, + output_location: StorageLocation, + grid_map: zarr_Array, + dataset: xr_Dataset, + data_variable_name: str, +) -> None: + """Blocked I/O from SEG-Y to chunked `xarray.Dataset`. Args: segy_file: SEG-Y file instance. - grid: mdio.Grid instance - data_array: Handle for zarr.core.Array we are writing trace data - header_array: Handle for zarr.core.Array we are writing trace headers + output_location: StorageLocation for the output Zarr dataset + (e.g. local file path or cloud storage URI) the location + also includes storage options for cloud storage. + grid_map: Zarr array with grid map for the traces. + dataset: Handle for xarray.Dataset we are writing trace data + data_variable_name: Name of the data variable in the dataset. Returns: - Global statistics for the SEG-Y as a dictionary. + None """ - # Initialize chunk iterator (returns next chunk slice indices each iteration) - chunker = ChunkIterator(data_array, chunk_samples=False) - num_chunks = len(chunker) - + data = dataset[data_variable_name] + + final_stats = _create_stats() + + # Must use data.encoding.get instead of data.chunks + chunks_t_of_t = (data.encoding.get("chunks"),) + # Unroll tuple of tuples into a flat list + chunks = [c for sub_tuple in chunks_t_of_t for c in sub_tuple] + # We will not chunk traces (old option chunk_samples=False) + chunks[-1] = data.shape[-1] + dim_names = list(data.dims) + # Initialize chunk iterator + # Since the dimensions are provided, it will return a dict of slices + chunk_iter = ChunkIterator(shape=data.shape, chunks=chunks, dim_names=dim_names) + num_chunks = chunk_iter.num_chunks + + # The following could be extracted in a function to allow executor injection + # (e.g. for unit testing or for debugging with non-parallelized processing) + # def _create_executor(num_chunks: int)-> ProcessPoolExecutor: + + # For Unix async writes with s3fs/fsspec & multiprocessing, use 'spawn' instead of default + # 'fork' to avoid deadlocks on cloud stores. Slower but necessary. Default on Windows. num_cpus = int(os.getenv("MDIO__IMPORT__CPU_COUNT", default_cpus)) num_workers = min(num_chunks, num_cpus) - - # Chunksize here is for multiprocessing, not Zarr chunksize. - pool_chunksize, extra = divmod(num_chunks, num_workers * 4) - pool_chunksize += 1 if extra else pool_chunksize + context = mp.get_context("spawn") + executor = ProcessPoolExecutor(max_workers=num_workers, mp_context=context) + # return executor segy_kw = { "url": segy_file.fs.unstrip_protocol(segy_file.url), "spec": segy_file.spec, "settings": segy_file.settings, } - tqdm_kw = {"unit": "block", "dynamic_ncols": True} - with ProcessPoolExecutor(max_workers=num_workers) as executor: - lazy_work = executor.map( - trace_worker, # fn - repeat(segy_kw), - repeat(data_array), - repeat(header_array), - repeat(grid), - chunker, - chunksize=pool_chunksize, - ) - - lazy_work = tqdm( - iterable=lazy_work, + with executor: + futures = [] + common_args = (segy_kw, output_location, data_variable_name) + for region in chunk_iter: + index_slices = tuple(region[key] for key in data.dims[:-1]) + subset_args = ( + region, + grid_map[index_slices], + dataset.isel(region), + ) + future = executor.submit(trace_worker, *common_args, *subset_args) + futures.append(future) + + iterable = tqdm( + as_completed(futures), total=num_chunks, - desc=f"Ingesting SEG-Y in {num_chunks} chunks", - **tqdm_kw, + unit="block", + desc="Ingesting traces", ) - # This executes the lazy work. - chunk_stats = list(lazy_work) - - # This comes in as n_chunk x 5 columns. - # Columns in order: count, sum, sum of squared, min, max. - # We can compute global mean, std, rms, min, max. - # Transposing because we want each statistic as a row to unpack later. - # REF: https://math.stackexchange.com/questions/1547141/aggregating-standard-deviation-to-a-summary-point # noqa: E501 - # REF: https://www.mathwords.com/r/root_mean_square.htm - chunk_stats = [stat for stat in chunk_stats if stat is not None] - - chunk_stats = zip(*chunk_stats) # noqa: B905 - glob_count, glob_sum, glob_sum_square, glob_min, glob_max = chunk_stats - - glob_count = np.sum(glob_count) # Comes in as `uint32` - glob_sum = np.sum(glob_sum) # `float64` - glob_sum_square = np.sum(glob_sum_square) # `float64` - glob_min = np.min(glob_min) # `float32` - glob_max = np.max(glob_max) # `float32` - - glob_mean = glob_sum / glob_count - glob_std = np.sqrt(glob_sum_square / glob_count - (glob_sum / glob_count) ** 2) - glob_rms = np.sqrt(glob_sum_square / glob_count) - - # We need to write these as float64 because float32 is not JSON serializable - # Trace data is originally float32, hence min/max - glob_min = glob_min.min().astype("float64") - glob_max = glob_max.max().astype("float64") - - return {"mean": glob_mean, "std": glob_std, "rms": glob_rms, "min": glob_min, "max": glob_max} + for future in iterable: + result = future.result() + if result is not None: + _update_stats(final_stats, result) + + # Xarray doesn't directly support incremental attribute updates when appending to an + # existing Zarr store. + # HACK: We will update the array attribute using zarr's API directly. + # Open the Zarr store using zarr directly + zarr_group = zarr_open_group(output_location.uri, mode="a") + attr_json = final_stats.model_dump_json() + # Use the data_variable_name to get the array in the Zarr group + # and write "statistics" metadata there + zarr_group[data_variable_name].attrs.update({"statsV1": attr_json}) + # Consolidate metadata (important for Xarray to recognize changes) + zarr_consolidate_metadata(output_location.uri) + + return final_stats def segy_record_concat( diff --git a/src/mdio/segy/parsers.py b/src/mdio/segy/parsers.py index 810924fb6..d46c61b3f 100644 --- a/src/mdio/segy/parsers.py +++ b/src/mdio/segy/parsers.py @@ -21,8 +21,9 @@ default_cpus = cpu_count(logical=True) -def parse_index_headers( +def parse_headers( segy_file: SegyFile, + subset: list[str] | None = None, block_size: int = 10000, progress_bar: bool = True, ) -> HeaderArray: @@ -30,6 +31,7 @@ def parse_index_headers( Args: segy_file: SegyFile instance. + subset: List of header names to filter and keep. block_size: Number of traces to read for each block. progress_bar: Enable or disable progress bar. Default is True. @@ -57,7 +59,7 @@ def parse_index_headers( } tqdm_kw = {"unit": "block", "dynamic_ncols": True} with ProcessPoolExecutor(num_workers) as executor: - lazy_work = executor.map(header_scan_worker, repeat(segy_kw), trace_ranges) + lazy_work = executor.map(header_scan_worker, repeat(segy_kw), trace_ranges, repeat(subset)) if progress_bar is True: lazy_work = tqdm( diff --git a/src/mdio/segy/utilities.py b/src/mdio/segy/utilities.py index 031d8b491..f5677e96b 100644 --- a/src/mdio/segy/utilities.py +++ b/src/mdio/segy/utilities.py @@ -12,20 +12,23 @@ from mdio.core import Dimension from mdio.segy.geometry import GridOverrider -from mdio.segy.parsers import parse_index_headers +from mdio.segy.parsers import parse_headers if TYPE_CHECKING: from numpy.typing import DTypeLike from segy import SegyFile from segy.arrays import HeaderArray + from mdio.schemas.v1.templates.abstract_dataset_template import AbstractDatasetTemplate + logger = logging.getLogger(__name__) def get_grid_plan( # noqa: C901 segy_file: SegyFile, - chunksize: list[int], + chunksize: tuple[int, ...] | None, + template: AbstractDatasetTemplate, return_headers: bool = False, grid_overrides: dict[str, Any] | None = None, ) -> tuple[list[Dimension], tuple[int, ...]] | tuple[list[Dimension], tuple[int, ...], HeaderArray]: @@ -40,6 +43,7 @@ def get_grid_plan( # noqa: C901 Args: segy_file: SegyFile instance. chunksize: Chunk sizes to be used in grid plan. + template: MDIO template where coordinate names and domain will be taken. return_headers: Option to return parsed headers with `Dimension` objects. Default is False. grid_overrides: Option to add grid overrides. See main documentation. @@ -49,37 +53,37 @@ def get_grid_plan( # noqa: C901 if grid_overrides is None: grid_overrides = {} - index_headers = parse_index_headers(segy_file=segy_file) - index_names = list(index_headers.dtype.names) - - dims = [] + # Keep only dimension and non-dimension coordinates excluding the vertical axis + horizontal_dimensions = template.dimension_names[:-1] + horizontal_coordinates = horizontal_dimensions + template.coordinate_names + headers_subset = parse_headers(segy_file=segy_file, subset=horizontal_coordinates) # Handle grid overrides. override_handler = GridOverrider() - index_headers, index_names, chunksize = override_handler.run( - index_headers, - index_names, + headers_subset, horizontal_coordinates, chunksize = override_handler.run( + headers_subset, + horizontal_coordinates, chunksize=chunksize, grid_overrides=grid_overrides, ) - for index_name in index_names: - dim_unique = np.unique(index_headers[index_name]) - dims.append(Dimension(coords=dim_unique, name=index_name)) + dimensions = [] + for dim_name in horizontal_dimensions: + dim_unique = np.unique(headers_subset[dim_name]) + dimensions.append(Dimension(coords=dim_unique, name=dim_name)) sample_labels = segy_file.sample_labels / 1000 # normalize if all(sample_labels.astype("int64") == sample_labels): sample_labels = sample_labels.astype("int64") - sample_dim = Dimension(coords=sample_labels, name="sample") - - dims.append(sample_dim) + vertical_dim = Dimension(coords=sample_labels, name=template.trace_domain) + dimensions.append(vertical_dim) if return_headers: - return dims, chunksize, index_headers + return dimensions, chunksize, headers_subset - return dims, chunksize + return dimensions, chunksize def find_trailing_ones_index(dim_blocks: tuple[int, ...]) -> int: diff --git a/tests/integration/test_segy_import_export.py b/tests/integration/test_segy_import_export.py index ecea8d1d2..d9d612435 100644 --- a/tests/integration/test_segy_import_export.py +++ b/tests/integration/test_segy_import_export.py @@ -2,6 +2,7 @@ from __future__ import annotations +import json import os from typing import TYPE_CHECKING @@ -9,13 +10,21 @@ import numpy as np import numpy.testing as npt import pytest +import xarray as xr from segy import SegyFile +from segy.standards import get_segy_standard +from tests.integration.testing_helpers import customize_segy_specs +from tests.integration.testing_helpers import get_inline_header_values +from tests.integration.testing_helpers import get_values +from tests.integration.testing_helpers import validate_variable from mdio import MDIOReader from mdio import mdio_to_segy -from mdio.converters import segy_to_mdio from mdio.converters.exceptions import GridTraceSparsityError +from mdio.converters.segy import segy_to_mdio from mdio.core import Dimension +from mdio.core.storage_location import StorageLocation +from mdio.schemas.v1.templates.template_registry import TemplateRegistry from mdio.segy.compat import mdio_segy_spec from mdio.segy.geometry import StreamerShotGeometryType @@ -247,20 +256,30 @@ def test_import_6d_segy( # noqa: PLR0913 @pytest.mark.dependency -@pytest.mark.parametrize("index_bytes", [(17, 13)]) -@pytest.mark.parametrize("index_names", [("inline", "crossline")]) -def test_3d_import( +@pytest.mark.parametrize("index_bytes", [(17, 13, 81, 85)]) +@pytest.mark.parametrize("index_names", [("inline", "crossline", "cdp_x", "cdp_y")]) +@pytest.mark.parametrize("index_types", [("int32", "int32", "int32", "int32")]) +def test_3d_import_v1( segy_input: Path, zarr_tmp: Path, index_bytes: tuple[int, ...], index_names: tuple[str, ...], + index_types: tuple[str, ...], ) -> None: """Test importing a SEG-Y file to MDIO.""" - segy_to_mdio( - segy_path=segy_input.__str__(), - mdio_path_or_buffer=zarr_tmp.__str__(), + segy_spec = get_segy_standard(1.0) + segy_spec = customize_segy_specs( + segy_spec=segy_spec, index_bytes=index_bytes, index_names=index_names, + index_types=index_types, + ) + + segy_to_mdio( + segy_spec=segy_spec, + mdio_template=TemplateRegistry().get("PostStack3DTime"), + input_location=StorageLocation(segy_input.__str__()), + output_location=StorageLocation(zarr_tmp.__str__()), overwrite=True, ) @@ -269,55 +288,120 @@ def test_3d_import( class TestReader: """Test reader functionality.""" - def test_meta_read(self, zarr_tmp: Path) -> None: + def test_meta_dataset_read(self, zarr_tmp: Path) -> None: + """Metadata reading tests.""" + path = zarr_tmp.__str__() + # path = "/tmp/pytest-of-vscode/my-mdio/mdio0" + ds = xr.open_dataset(path, engine="zarr") + expected_attrs = { + "apiVersion": "1.0.0a1", + "createdOn": "2025-08-06 16:21:54.747880+00:00", + "name": "PostStack3DTime", + } + actual_attrs_json = ds.attrs + # compare one by one due to ever changing createdOn. For it, we only check existence + for key, value in expected_attrs.items(): + assert key in actual_attrs_json + if key == "createdOn": + assert actual_attrs_json[key] is not None + else: + assert actual_attrs_json[key] == value + + def test_meta_variable_read(self, zarr_tmp: Path) -> None: """Metadata reading tests.""" - mdio = MDIOReader(zarr_tmp.__str__()) - assert mdio.binary_header["samples_per_trace"] == 1501 - assert mdio.binary_header["sample_interval"] == 2000 + path = zarr_tmp.__str__() + # path = "/tmp/pytest-of-vscode/my-mdio/mdio0" + ds = xr.open_dataset(path, engine="zarr") + expected_attrs = { + "count": 97354860, + "sum": -8594.551666259766, + "sum_squares": 40571291.6875, + "min": -8.375323295593262, + "max": 0.0, + "histogram": {"counts": [], "bin_centers": []}, + } + actual_attrs_json = json.loads(ds["amplitude"].attrs["statsV1"]) + assert actual_attrs_json == expected_attrs def test_grid(self, zarr_tmp: Path) -> None: - """Grid reading tests.""" - mdio = MDIOReader(zarr_tmp.__str__()) - grid = mdio.grid + """Test validating MDIO variables.""" + # Load Xarray dataset from the MDIO file + path = zarr_tmp.__str__() + # path = "/tmp/pytest-of-vscode/my-mdio/mdio0" + ds = xr.open_dataset(path, engine="zarr") + + # Note: in order to create the dataset we used the Time template, so the + # sample dimension is called "time" + + # Validate the dimension coordinate variables + validate_variable(ds, "inline", (345,), ["inline"], np.int32, range(1, 346), get_values) + validate_variable( + ds, "crossline", (188,), ["crossline"], np.int32, range(1, 189), get_values + ) + validate_variable(ds, "time", (1501,), ["time"], np.int32, range(0, 3002, 2), get_values) - assert grid.select_dim("inline") == Dimension(range(1, 346), "inline") - assert grid.select_dim("crossline") == Dimension(range(1, 189), "crossline") - assert grid.select_dim("sample") == Dimension(range(0, 3002, 2), "sample") + # Validate the non-dimensional coordinate variables + validate_variable(ds, "cdp_x", (345, 188), ["inline", "crossline"], np.float64, None, None) + validate_variable(ds, "cdp_y", (345, 188), ["inline", "crossline"], np.float64, None, None) - def test_get_data(self, zarr_tmp: Path) -> None: - """Data retrieval tests.""" - mdio = MDIOReader(zarr_tmp.__str__()) + # Validate the headers + # We have a subset of headers since we used customize_segy_specs() providing the values only + # for "inline", "crossline", "cdp_x", "cdp_y" + data_type = np.dtype( + [("inline", " None: """Read and compare every 75 inlines' mean and std. dev.""" - mdio = MDIOReader(zarr_tmp.__str__()) - - inlines = mdio[::75, :, :] + path = zarr_tmp.__str__() + # path = "/tmp/pytest-of-vscode/my-mdio/mdio0" + ds = xr.open_dataset(path, engine="zarr") + inlines = ds["amplitude"][::75, :, :] mean, std = inlines.mean(), inlines.std() - npt.assert_allclose([mean, std], [1.0555277e-04, 6.0027051e-01]) def test_crossline(self, zarr_tmp: Path) -> None: """Read and compare every 75 crosslines' mean and std. dev.""" - mdio = MDIOReader(zarr_tmp.__str__()) - - xlines = mdio[:, ::75, :] + path = zarr_tmp.__str__() + # path = "/tmp/pytest-of-vscode/my-mdio/mdio0" + ds = xr.open_dataset(path, engine="zarr") + xlines = ds["amplitude"][:, ::75, :] mean, std = xlines.mean(), xlines.std() npt.assert_allclose([mean, std], [-5.0329847e-05, 5.9406823e-01]) def test_zslice(self, zarr_tmp: Path) -> None: """Read and compare every 225 z-slices' mean and std. dev.""" - mdio = MDIOReader(zarr_tmp.__str__()) - - slices = mdio[:, :, ::225] + path = zarr_tmp.__str__() + # path = "/tmp/pytest-of-vscode/my-mdio/mdio0" + ds = xr.open_dataset(path, engine="zarr") + slices = ds["amplitude"][:, :, ::225] mean, std = slices.mean(), slices.std() - npt.assert_allclose([mean, std], [0.005236923, 0.61279935]) diff --git a/tests/integration/testing_helpers.py b/tests/integration/testing_helpers.py new file mode 100644 index 000000000..4df6bdad0 --- /dev/null +++ b/tests/integration/testing_helpers.py @@ -0,0 +1,69 @@ +"""This module provides testing helpers for integration testing.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import numpy as np +from segy.schema import HeaderField +from segy.schema import SegySpec + +if TYPE_CHECKING: + from collections.abc import Callable + + import xarray as xr + + +def customize_segy_specs( + segy_spec: SegySpec, + index_bytes: tuple[int, ...] | None = None, + index_names: tuple[int, ...] | None = None, + index_types: tuple[int, ...] | None = None, +) -> SegySpec: + """Customize SEG-Y specifications with user-defined index fields.""" + if not index_bytes: + # No customization + return segy_spec + + index_names = index_names or [f"dim_{i}" for i in range(len(index_bytes))] + index_types = index_types or ["int32"] * len(index_bytes) + + if not (len(index_names) == len(index_bytes) == len(index_types)): + err = "All index fields must have the same length." + raise ValueError(err) + + # Index the dataset using a spec that interprets the user provided index headers. + index_fields = [] + for name, byte, format_ in zip(index_names, index_bytes, index_types, strict=True): + index_fields.append(HeaderField(name=name, byte=byte, format=format_)) + + return segy_spec.customize(trace_header_fields=index_fields) + + +def get_values(arr: xr.DataArray) -> np.ndarray: + """Extract actual values from an Xarray DataArray.""" + return arr.values + + +def get_inline_header_values(dataset: xr.Dataset) -> np.ndarray: + """Extract a specific header value from an Xarray DataArray.""" + return dataset["inline"].values + + +def validate_variable( # noqa PLR0913 + dataset: xr.Dataset, + name: str, + shape: list[int], + dims: list[str], + data_type: np.dtype, + expected_values: range | None, + actual_value_generator: Callable, +) -> None: + """Validate the properties of a variable in an Xarray dataset.""" + arr = dataset[name] + assert shape == arr.shape + assert set(dims) == set(arr.dims) + assert data_type == arr.dtype + if expected_values is not None and actual_value_generator is not None: + actual_values = actual_value_generator(arr) + assert np.array_equal(expected_values, actual_values) diff --git a/tests/integration/v1/test_segy_to_mdio_v1.py b/tests/integration/v1/test_segy_to_mdio_v1.py new file mode 100644 index 000000000..e44af6cb2 --- /dev/null +++ b/tests/integration/v1/test_segy_to_mdio_v1.py @@ -0,0 +1,354 @@ +"""End to end testing for SEG-Y to MDIO conversion v1.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import numcodecs +import numpy as np +import pytest +import xarray as xr +import zarr +from segy.standards import get_segy_standard +from zarr.core.chunk_key_encodings import V2ChunkKeyEncoding + +from mdio.converters.segy import segy_to_mdio +from mdio.converters.type_converter import to_numpy_dtype +from mdio.core.storage_location import StorageLocation +from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredField +from mdio.schemas.dtype import StructuredType +from mdio.schemas.v1.templates.template_registry import TemplateRegistry + +if TYPE_CHECKING: + from collections.abc import Callable + + +def _slice_three_values(dims: tuple[int], values_from_start: bool) -> tuple[slice, ...]: + if values_from_start: + slices = tuple([slice(0, 3) for _ in range(len(dims))]) + else: + slices = tuple([slice(-3, None) for _ in range(len(dims))]) + return slices + + +def _get_actual_value(arr: xr.DataArray) -> np.ndarray: + return arr.values[_slice_three_values(arr.shape, values_from_start=True)] + + +def _validate_variable( # noqa PLR0913 + dataset: xr.Dataset, + name: str, + shape: list[int], + dims: list[str], + data_type: np.dtype, + expected_values: range | None, + actual_func: Callable, +) -> None: + arr = dataset[name] + assert shape == arr.shape + assert set(dims) == set(arr.dims) + assert data_type == arr.dtype + # Validate first/last values + # actual_values = d.values[_slice_three_values(shape, values_from_start)] + actual_values = actual_func(arr) + assert np.array_equal(expected_values, actual_values) + + +def test_segy_to_mdio_v1__f3() -> None: + """Test the SEG-Y to MDIO conversion for the f3 equinor/segyio dataset.""" + # The f3 dataset comes from + # equinor/segyio (https://github.com/equinor/segyio) project (GNU LGPL license) + # wget https://github.com/equinor/segyio/blob/main/test-data/f3.sgy + + pref_path = "/DATA/equinor-segyio/f3.sgy" + mdio_path = f"{pref_path}_mdio_v1" + + segy_to_mdio( + segy_spec=get_segy_standard(1.0), + mdio_template=TemplateRegistry().get("PostStack3DTime"), + input_location=StorageLocation(pref_path), + output_location=StorageLocation(mdio_path), + overwrite=True, + ) + + # Load Xarray dataset from the MDIO file + ds = xr.open_dataset(mdio_path, engine="zarr") + + # Tests "inline" variable + expected = np.array([111, 112, 113]) + _validate_variable(ds, "inline", (23,), ["inline"], np.int32, expected, _get_actual_value) + + # Tests "crossline" variable + expected = np.array([875, 876, 877]) + _validate_variable(ds, "crossline", (18,), ["crossline"], np.int32, expected, _get_actual_value) + + # Tests "time" variable + expected = np.array([0, 4, 8]) + _validate_variable(ds, "time", (75,), ["time"], np.int64, expected, _get_actual_value) + + # Tests "cdp_x" variable + expected = np.array( + [[6201972, 6202222, 6202472], [6201965, 6202215, 6202465], [6201958, 6202208, 6202458]] + ) + _validate_variable( + ds, "cdp_x", (23, 18), ["inline", "crossline"], np.int32, expected, _get_actual_value + ) + + # Tests "cdp_y" variable + expected = np.array( + [ + [60742329, 60742336, 60742343], + [60742579, 60742586, 60742593], + [60742828, 60742835, 60742842], + ] + ) + _validate_variable( + ds, "cdp_y", (23, 18), ["inline", "crossline"], np.int32, expected, _get_actual_value + ) + + # Tests "headers" variable + data_type = np.dtype( + [ + ("trace_seq_num_line", " np.ndarray: + cdp_x_headers = arr.values["cdp_x"] + return cdp_x_headers[_slice_three_values(arr.shape, values_from_start=True)] + + _validate_variable( + ds, "headers", (23, 18), ["inline", "crossline"], data_type, expected, get_actual_headers + ) + + # Tests "trace_mask" variable + expected = np.array([[True, True, True], [True, True, True], [True, True, True]]) + _validate_variable( + ds, "trace_mask", (23, 18), ["inline", "crossline"], np.bool, expected, _get_actual_value + ) + + # Tests "amplitude" variable + expected = np.array( + [ + [[487.0, -1104.0, -1456.0], [-129.0, -1728.0, 445.0], [-1443.0, 741.0, 1458.0]], + [[2464.0, 3220.0, 1362.0], [686.0, 530.0, -282.0], [3599.0, 2486.0, 433.0]], + [[4018.0, 5159.0, 2087.0], [-81.0, -3039.0, -1850.0], [2898.0, 1060.0, -121.0]], + ] + ) + + def get_actual_amplitudes(arr: xr.DataArray) -> np.ndarray: + return arr.values[_slice_three_values(arr.shape, values_from_start=False)] + + _validate_variable( + ds, + "amplitude", + (23, 18, 75), + ["inline", "crossline", "time"], + np.float32, + expected, + get_actual_amplitudes, + ) + + +@pytest.mark.skip(reason="Bug reproducer for the issue 582") +def test_bug_reproducer_structured_xr_to_zar() -> None: + """Bug reproducer for the issue https://github.com/TGSAI/mdio-python/issues/582. + + Will be removed in the when the bug is fixed + """ + shape = (4, 4, 2) + dim_names = ["inline", "crossline", "depth"] + chunks = (2, 2, 2) + # Pretend that we created a pydantic model from a template + structured_type = StructuredType( + fields=[ + StructuredField(name="cdp_x", format=ScalarType.INT32), + StructuredField(name="cdp_y", format=ScalarType.INT32), + StructuredField(name="elevation", format=ScalarType.FLOAT16), + StructuredField(name="some_scalar", format=ScalarType.FLOAT16), + ] + ) + + xr_dataset = xr.Dataset() + + # Add traces to the dataset, shape = (4, 4, 2) of floats + traces_zarr = zarr.zeros(shape=shape, dtype=np.float32, zarr_format=2) + traces_xr = xr.DataArray(traces_zarr, dims=dim_names) + traces_xr.encoding = { + "_FillValue": np.nan, + "chunks": chunks, + "chunk_key_encoding": V2ChunkKeyEncoding(separator="/").to_dict(), + "compressor": numcodecs.Blosc(cname="zstd", clevel=5, shuffle=1, blocksize=0), + } + xr_dataset["traces"] = traces_xr + + # Add headers to the dataset, shape = (4, 4) of structured type + data_type = to_numpy_dtype(structured_type) + + # Validate the conversion + assert data_type == np.dtype( + [("cdp_x", " trace_worker + + not_null = np.array( + [ + [True, False, False, False], + [False, True, False, False], + [False, False, True, False], + [False, False, False, True], + ] + ) + hdr = (11, 22, -33.0, 44.0) + headers = np.array([hdr, hdr, hdr, hdr], dtype=data_type) + trace = np.array( + [[100.0, 200.0], [300.0, 400.0], [500.0, 600.0], [700.0, 800.0]], dtype=np.float32 + ) + + # Here is one iteration of it: + ds_to_write = xr_dataset[["traces", "headers"]] + # We do not have any coords to reset + # ds_to_write = ds_to_write.reset_coords() + + ds_to_write["headers"].data[not_null] = headers + ds_to_write["headers"].data[~not_null] = 0 + ds_to_write["traces"].data[not_null] = trace + + region = { + "inline": slice(0, 2, None), + "crossline": slice(0, 2, None), + "depth": slice(0, 2, None), + } + + sub_dataset = ds_to_write.isel(region) + sub_dataset.to_zarr( + store="/tmp/reproducer_xr.zarr", # noqa: S108 + region=region, + mode="r+", + write_empty_chunks=False, + zarr_format=2, + ) diff --git a/tests/unit/test_compat.py b/tests/unit/test_compat.py deleted file mode 100644 index e1c950de3..000000000 --- a/tests/unit/test_compat.py +++ /dev/null @@ -1,106 +0,0 @@ -"""Test MDIO compatibility with older versions.""" - -from pathlib import Path - -import numpy as np -import pytest -import zarr -from segy import SegyFile -from segy.factory import SegyFactory -from segy.standards import get_segy_standard - -from mdio import mdio_to_segy -from mdio import segy_to_mdio - -# Constants -MDIO_VERSIONS = ["0.7.4", "0.8.3"] -SEGY_REVISIONS = [0.0, 0.1, 1.0, 1.1] -INLINES = (10, 10, 11, 11) -CROSSLINES = (100, 101, 100, 101) -INDEX_BYTES = (189, 193) -API_VERSION_KEY = "api_version" -BINARY_HEADER_KEY = "binary_header" -CHUNKED_TRACE_HEADERS_KEY = "chunked_012_trace_headers" - - -def update_mdio_for_version_0_7_4(root_group: zarr.Group) -> None: - """Update MDIO metadata to mimic version 0.7.4.""" - # Update binary header revision keys - meta_group = root_group.require_group("metadata") - bin_hdr = meta_group.attrs[BINARY_HEADER_KEY] - bin_hdr["SEGYRevision"] = bin_hdr.pop("segy_revision_major") - bin_hdr["SEGYRevisionMinor"] = bin_hdr.pop("segy_revision_minor") - meta_group.attrs[BINARY_HEADER_KEY] = bin_hdr - - # Remove trace headers past field 232 (pre-0.8 schema) - orig_hdr = meta_group[CHUNKED_TRACE_HEADERS_KEY] - new_dtype = np.dtype(orig_hdr.dtype.descr[:-1]) - meta_group.create_array( - name=CHUNKED_TRACE_HEADERS_KEY, - shape=orig_hdr.shape, - dtype=new_dtype, - chunks=orig_hdr.chunks, - chunk_key_encoding={"name": "v2", "separator": "/"}, - overwrite=True, - ) - zarr.consolidate_metadata(meta_group.store) - - -@pytest.mark.parametrize("mdio_version", MDIO_VERSIONS) -@pytest.mark.parametrize("segy_revision", SEGY_REVISIONS) -def test_revision_encode_decode(mdio_version: str, segy_revision: float, tmp_path: Path) -> None: - """Test binary header major/minor revision roundtrip. - - After introducting TGSAI/segy, we changed the header names. Now we use - aliasing and MDIO has a dummy schema. The handling is slightly different - for SEG-Y revision major/minor numbers. Testing to ensure they're - (de)serialized correctly. - """ - rev1_spec = get_segy_standard(1.0) - segy_filename = tmp_path / "segy_input.sgy" - mdio_output_filename = tmp_path / "output.mdio" - roundtrip_sgy_filename = tmp_path / "roundtrip_output.sgy" - - # Make a rev1 segy - factory = SegyFactory(rev1_spec, sample_interval=1000, samples_per_trace=5) - - # We will replace the values in revision fields with these - minor, major = np.modf(segy_revision) - major, minor = int(major), int(minor * 10) - revision_code = (major << 8) | minor - - # Make fake tiny 3D dataset - txt_buffer = factory.create_textual_header() - - header = factory.create_trace_header_template(len(INLINES)) - data = factory.create_trace_sample_template(len(INLINES)) - header["inline"] = INLINES - header["crossline"] = CROSSLINES - data[:] = np.arange(len(INLINES))[:, None] - trace_buffer = factory.create_traces(header, data) - - # Update revision during bin hdr creation - bin_hdr_buffer = factory.create_binary_header(update={"segy_revision": revision_code}) - with segy_filename.open(mode="wb") as fp: - fp.write(txt_buffer) - fp.write(bin_hdr_buffer) - fp.write(trace_buffer) - - # Convert SEG-Y to MDIO - segy_to_mdio(str(segy_filename), str(mdio_output_filename), index_bytes=INDEX_BYTES) - - # Modify MDIO for specific versions - root = zarr.open_group(mdio_output_filename, mode="r+") - root.attrs[API_VERSION_KEY] = mdio_version - if mdio_version == "0.7.4": - update_mdio_for_version_0_7_4(root) - - # Convert MDIO back to SEG-Y - mdio_to_segy(str(mdio_output_filename), str(roundtrip_sgy_filename)) - - # Assert binary headers and revisions match - orig = SegyFile(segy_filename, spec=rev1_spec) - rt = SegyFile(roundtrip_sgy_filename, spec=rev1_spec) - assert orig.binary_header["segy_revision_major"] == major - assert orig.binary_header["segy_revision_minor"] == minor - assert orig.binary_header == rt.binary_header diff --git a/tests/unit/v1/converters/test_type_converter.py b/tests/unit/v1/converters/test_type_converter.py new file mode 100644 index 000000000..31d72f157 --- /dev/null +++ b/tests/unit/v1/converters/test_type_converter.py @@ -0,0 +1,95 @@ +"""Unit tests for the type converter module.""" + +import pytest +from numpy import dtype as np_dtype + +from mdio.converters.type_converter import to_numpy_dtype +from mdio.converters.type_converter import to_scalar_type +from mdio.converters.type_converter import to_structured_type +from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredField +from mdio.schemas.dtype import StructuredType + + +@pytest.fixture +def supported_scalar_types_map() -> tuple[ScalarType, str]: + """Supported scalar types and their numpy equivalents.""" + return ( + (ScalarType.INT8, "int8"), + (ScalarType.INT16, "int16"), + (ScalarType.INT32, "int32"), + (ScalarType.INT64, "int64"), + (ScalarType.UINT8, "uint8"), + (ScalarType.UINT16, "uint16"), + (ScalarType.UINT32, "uint32"), + (ScalarType.UINT64, "uint64"), + (ScalarType.FLOAT32, "float32"), + (ScalarType.FLOAT64, "float64"), + (ScalarType.COMPLEX64, "complex64"), + (ScalarType.COMPLEX128, "complex128"), + (ScalarType.BOOL, "bool"), + ) + + +@pytest.fixture +def a_structured_type() -> StructuredType: + """Sample structured type. + + Returns a structured type. + """ + return StructuredType( + fields=[ + StructuredField(name="x", format=ScalarType.FLOAT64), + StructuredField(name="y", format=ScalarType.FLOAT64), + StructuredField(name="z", format=ScalarType.FLOAT64), + StructuredField(name="id", format=ScalarType.INT32), + StructuredField(name="valid", format=ScalarType.BOOL), + ] + ) + + +def test_to_numpy_dtype( + supported_scalar_types_map: tuple[ScalarType, str], a_structured_type: StructuredType +) -> None: + """Comprehensive test for to_numpy_dtype function.""" + # Test 0: invalid input + err = "Expected ScalarType or StructuredType, got 'str'" + with pytest.raises(ValueError, match=err): + to_numpy_dtype("parameter of invalid type") + + # Test 1: ScalarType cases - all supported scalar types + for scalar_type, expected_numpy_type in supported_scalar_types_map: + result = to_numpy_dtype(scalar_type) + expected = np_dtype(expected_numpy_type) + assert result == expected + assert isinstance(result, np_dtype) + assert result.name == expected.name + + # Test 2: StructuredType with multiple fields + result_multi = to_numpy_dtype(a_structured_type) + expected_multi = np_dtype( + [("x", "float64"), ("y", "float64"), ("z", "float64"), ("id", "int32"), ("valid", "bool")] + ) + + assert result_multi == expected_multi + assert isinstance(result_multi, np_dtype) + assert len(result_multi.names) == 5 + assert set(result_multi.names) == {"x", "y", "z", "id", "valid"} + + +def test_to_scalar_type(supported_scalar_types_map: tuple[ScalarType, str]) -> None: + """Test for to_scalar_type function.""" + for expected_mdio_type, numpy_type in supported_scalar_types_map: + result = to_scalar_type(np_dtype(numpy_type)) + assert result == expected_mdio_type + + +def test_to_structured_type(a_structured_type: StructuredType) -> None: + """Test for to_structured_type function.""" + dtype = np_dtype( + [("x", "float64"), ("y", "float64"), ("z", "float64"), ("id", "int32"), ("valid", "bool")] + ) + assert a_structured_type == to_structured_type(dtype) + + dtype = np_dtype([("x", " None: + """Test the ChunkIterator class.""" + dims = ["inline", "crossline", "depth"] + chunks = (3, 4, 5) + + shape = (6, 12, 20) + iter1 = ChunkIterator(shape=shape, chunks=chunks, dim_names=dims) + assert iter1.arr_shape == shape + assert iter1.dims == dims + assert iter1.len_chunks == chunks + assert iter1.dim_chunks == (2, 3, 4) + assert iter1.num_chunks == 24 + + shape = (5, 11, 19) + iter2 = ChunkIterator(shape=shape, chunks=chunks, dim_names=dims) + assert iter2.dim_chunks == (2, 3, 4) + assert iter2.num_chunks == 24 + + # Its purpose is to confirm that all slices are created of the same size, + # even if the last slice should have been smaller. + for _ in range(13): # element index 12 + region = iter1.__next__() + assert region == { + "inline": slice(3, 6, None), + "crossline": slice(0, 4, None), + "depth": slice(0, 5, None), + } + + for _ in range(13): # element index 12 + region = iter2.__next__() + assert region == { + "inline": slice(3, 6, None), + "crossline": slice(0, 4, None), + "depth": slice(0, 5, None), + } + + +def test_chunk_iterator_returning_tuple() -> None: + """Test the ChunkIterator class.""" + chunks = (3, 4, 5) + + shape = (6, 12, 20) + iter1 = ChunkIterator(shape=shape, chunks=chunks) + assert iter1.arr_shape == shape + assert iter1.dims is None + assert iter1.len_chunks == chunks + assert iter1.dim_chunks == (2, 3, 4) + assert iter1.num_chunks == 24 + + shape = (5, 11, 19) + iter2 = ChunkIterator(shape=shape, chunks=chunks) + assert iter2.dim_chunks == (2, 3, 4) + assert iter2.num_chunks == 24 + + # Its purpose is to confirm that all slices are created of the same size, + # even if the last slice should have been smaller. + for _ in range(13): # element index 12 + region = iter1.__next__() + assert region == (slice(3, 6, None), slice(0, 4, None), slice(0, 5, None)) + + for _ in range(13): # element index 12 + region = iter2.__next__() + assert region == (slice(3, 6, None), slice(0, 4, None), slice(0, 5, None)) + + +def val(shape: tuple[int, int, int], i: int, j: int, k: int) -> int: + """Calculate the linear index in a 3D array.""" + return i * (shape[1] * shape[2]) + j * shape[2] + k + + +def mock_trace_worker( + shape: tuple[int, int, int], region: dict[str, slice], dataset: xr_Dataset, grid_map: np.array +) -> None: + """Mock trace worker function. + + Note: + Xarray, Zarr, and NumPy automatically truncates the slice to the valid bounds of the array + (see the test above, where the last chunk is always of the same size) + and does not raise an error. However, if one attempts to access an element at an index + that is out of bounds, you will get an IndexError + """ + # We used a 2D selection with 2D index_slices + assert grid_map.shape == (3, 4, 20) + # We used a 3D selection with isel() + assert tuple(dataset.dims[d] for d in region) == (3, 4, 5) + + dimension_names = list(dataset.dims) + + slice0 = region[dimension_names[0]] + slice1 = region[dimension_names[1]] + slice2 = region[dimension_names[2]] + for ii, i in enumerate(range(slice0.start, min(slice0.stop, shape[0]))): + for jj, j in enumerate(range(slice1.start, min(slice1.stop, shape[1]))): + for kk, k in enumerate(range(slice2.start, min(slice2.stop, shape[2]))): + # Validate that we've got the sample indexing right + assert dataset["amplitude"].values[ii, jj, kk] == val(shape, i, j, k) + # NOTE: grid_map is 2D, so we need to use k for the depth dimension + assert dataset["amplitude"].values[ii, jj, kk] == grid_map[ii, jj, k] + + +def test_chunk_iterator_with_dataset() -> None: + """Test the ChunkIterator with a dataset.""" + shape = (6, 12, 20) + dims = ["inline", "crossline", "depth"] + chunks = (3, 4, 5) + + data3 = np.arange(shape[0] * shape[1] * shape[2]).reshape(shape) + amplitude = xr_DataArray(data3, dims=dims, name="amplitude") + ds = xr_Dataset({"amplitude": amplitude}) + + chunk_iter = ChunkIterator(shape, chunks, dims) + for region in chunk_iter: + # If one needs both a dict and a tuple of slices, + # one can use the following line an example to strip dim names out + index_slices = tuple(region[key] for key in dims[:-1]) + # The .isel() method takes keyword arguments, region, where each keyword corresponds + # to a dimension name and the value is an integer, a slice object (our case), + # or an array-like object + mock_trace_worker(shape, region, ds.isel(region), amplitude[index_slices]) diff --git a/tests/unit/v1/core/test_storage_location.py b/tests/unit/v1/core/test_storage_location.py new file mode 100644 index 000000000..4f18e93a7 --- /dev/null +++ b/tests/unit/v1/core/test_storage_location.py @@ -0,0 +1,132 @@ +"""Unit tests for StorageLocation class.""" + +import tempfile +from pathlib import Path +from unittest.mock import MagicMock +from unittest.mock import Mock +from unittest.mock import patch + +import pytest + +from mdio.core.storage_location import StorageLocation + + +class TestStorageLocation: + """Test cases for StorageLocation class.""" + + @patch("fsspec.filesystem") + def test_exists(self, mock_filesystem: MagicMock, capsys: pytest.CaptureFixture[str]) -> None: + """Test the exists() method of StorageLocation.""" + # Test exists() returns True when file exists. + mock_fs = Mock() + mock_fs.exists.return_value = True + mock_filesystem.return_value = mock_fs + location = StorageLocation("/test/existing/file") + result = location.exists() + assert result is True + mock_fs.exists.assert_called_once() + + # Test exists() returns False when file does not exist. + mock_fs = Mock() + mock_fs.exists.return_value = False + mock_filesystem.return_value = mock_fs + location = StorageLocation("/test/nonexistent/file") + result = location.exists() + assert result is False + mock_fs.exists.assert_called_once() + + # Test exists() handles exceptions gracefully. + mock_fs = Mock() + mock_fs.exists.side_effect = Exception("Connection failed") + mock_filesystem.return_value = mock_fs + location = StorageLocation("s3://bucket/file") + result = location.exists() + assert result is False + captured = capsys.readouterr() + assert "Error checking existence of s3://bucket/file: Connection failed" in captured.out + + def test_representations(self) -> None: + """Test string and developer representations of StorageLocation.""" + # Test string representation of StorageLocation. + location = StorageLocation("/test/path") + assert str(location) == "/test/path" + + # Test developer representation of StorageLocation. + + uri = "s3://my-bucket/file.segy" + options = {"region": "us-west-2"} + location = StorageLocation(uri=uri, options=options) + expected = ( + "StorageLocation(uri='s3://my-bucket/file.segy', options={'region': 'us-west-2'})" + ) + assert repr(location) == expected + + def test_from_path(self) -> None: + """Test from_path class method.""" + # Test with string path. + path_str = "/home/user/data.segy" + location = StorageLocation(path_str) + # Should resolve to absolute path + expected_path = str(Path(path_str).resolve()) + assert location.uri == expected_path + assert location.options == {} + + # Test with path uri path. + location = StorageLocation(f"file://{path_str}") + # Should resolve to absolute path + expected_path = str(Path(path_str).resolve()) + assert location.uri == expected_path + assert location.options == {} + + # Test with real local file operations. + # Create a temporary file for testing + with tempfile.NamedTemporaryFile(delete=False) as temp_file: + temp_path = Path(temp_file.name) + temp_file.write(b"test content") + try: + # Test with real local file + location = StorageLocation(str(temp_path)) + # Should exist + assert location.exists() is True + # Should have correct URI + assert location.uri == str(temp_path.resolve()) + finally: + # Clean up + temp_path.unlink() + # Now should not exist + assert location.exists() is False + + def test_from_cloud(self) -> None: + """Test class for cloud storage URIs.""" + # Test from_s3 without options. + s3_uri = "s3://bucket/file" + location = StorageLocation(s3_uri) + assert location.uri == s3_uri + assert location.options == {} + + # Test from_s3 with valid S3 URI. + s3_uri = "s3://my-bucket/path/to/file.segy" + options = {"region": "us-west-2", "aws_access_key_id": "key123"} + location = StorageLocation(s3_uri, options=options) + assert location.uri == s3_uri + assert location.options == options + + def test_options_immutability(self) -> None: + """Test that options property returns a defensive copy.""" + original_options = {"region": "us-east-1", "timeout": 30} + location = StorageLocation(uri="s3://bucket/file", options=original_options) + + # Get options through property + returned_options = location.options + + # Verify it's equal to original + assert returned_options == original_options + + # Modify the returned dict + returned_options["new_key"] = "new_value" + returned_options["timeout"] = 60 + + # Original should be unchanged + assert location.options == original_options + assert "new_key" not in location.options + assert location.options["timeout"] == 30 diff --git a/tests/unit/v1/helpers.py b/tests/unit/v1/helpers.py index f9d209690..ca0383d09 100644 --- a/tests/unit/v1/helpers.py +++ b/tests/unit/v1/helpers.py @@ -185,13 +185,13 @@ def make_seismic_poststack_3d_acceptance_dataset(dataset_name: str) -> Dataset: ) # Add coordinates ds.add_coordinate( - "cdp-x", + "cdp_x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32, metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))], ) ds.add_coordinate( - "cdp-y", + "cdp_y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32, metadata_info=[AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.METER))], @@ -203,7 +203,7 @@ def make_seismic_poststack_3d_acceptance_dataset(dataset_name: str) -> Dataset: dimensions=["inline", "crossline", "depth"], data_type=ScalarType.FLOAT32, compressor=Blosc(algorithm="zstd"), - coordinates=["cdp-x", "cdp-y"], + coordinates=["cdp_x", "cdp_y"], metadata_info=[ ChunkGridMetadata( chunk_grid=RegularChunkGrid( @@ -228,7 +228,7 @@ def make_seismic_poststack_3d_acceptance_dataset(dataset_name: str) -> Dataset: name="velocity", dimensions=["inline", "crossline", "depth"], data_type=ScalarType.FLOAT16, - coordinates=["cdp-x", "cdp-y"], + coordinates=["cdp_x", "cdp_y"], metadata_info=[ ChunkGridMetadata( chunk_grid=RegularChunkGrid( @@ -245,7 +245,7 @@ def make_seismic_poststack_3d_acceptance_dataset(dataset_name: str) -> Dataset: dimensions=["inline", "crossline", "depth"], data_type=ScalarType.FLOAT32, compressor=Blosc(algorithm="zstd"), - coordinates=["cdp-x", "cdp-y"], + coordinates=["cdp_x", "cdp_y"], metadata_info=[ ChunkGridMetadata( chunk_grid=RegularChunkGrid( @@ -258,11 +258,11 @@ def make_seismic_poststack_3d_acceptance_dataset(dataset_name: str) -> Dataset: ds.add_variable( name="image_headers", dimensions=["inline", "crossline"], - coordinates=["cdp-x", "cdp-y"], + coordinates=["cdp_x", "cdp_y"], data_type=StructuredType( fields=[ - StructuredField(name="cdp-x", format=ScalarType.INT32), - StructuredField(name="cdp-y", format=ScalarType.INT32), + StructuredField(name="cdp_x", format=ScalarType.INT32), + StructuredField(name="cdp_y", format=ScalarType.INT32), StructuredField(name="elevation", format=ScalarType.FLOAT16), StructuredField(name="some_scalar", format=ScalarType.FLOAT16), ] diff --git a/tests/unit/v1/templates/conftest.py b/tests/unit/v1/templates/conftest.py new file mode 100644 index 000000000..1a3e5e097 --- /dev/null +++ b/tests/unit/v1/templates/conftest.py @@ -0,0 +1,21 @@ +"""Unit tests for the conftest module in the templates directory.""" + +# conftest.py +import pytest + +from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredField +from mdio.schemas.dtype import StructuredType + + +@pytest.fixture(scope="session") +def structured_headers() -> StructuredType: + """Fixture to provide structured headers for testing.""" + return StructuredType( + fields=[ + StructuredField(name="cdp_x", format=ScalarType.INT32), + StructuredField(name="cdp_y", format=ScalarType.INT32), + StructuredField(name="elevation", format=ScalarType.FLOAT16), + StructuredField(name="some_scalar", format=ScalarType.FLOAT16), + ] + ) diff --git a/tests/unit/v1/templates/test_seismic_2d_poststack.py b/tests/unit/v1/templates/test_seismic_2d_poststack.py index 79f795854..89b5d0655 100644 --- a/tests/unit/v1/templates/test_seismic_2d_poststack.py +++ b/tests/unit/v1/templates/test_seismic_2d_poststack.py @@ -4,6 +4,8 @@ from mdio.schemas.chunk_grid import RegularChunkGrid from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredType +from mdio.schemas.v1.dataset import Dataset from mdio.schemas.v1.templates.seismic_2d_poststack import Seismic2DPostStackTemplate from mdio.schemas.v1.units import AllUnits from mdio.schemas.v1.units import LengthUnitEnum @@ -15,6 +17,70 @@ _UNIT_SECOND = AllUnits(units_v1=TimeUnitModel(time=TimeUnitEnum.SECOND)) +def _validate_coordinates_headers_trace_mask( + dataset: Dataset, headers: StructuredType, domain: str +) -> None: + """Validate the coordinate, headers, trace_mask variables in the dataset.""" + # Verify variables + # 2 dim coords + 2 non-dim coords + 1 data + 1 trace mask + 1 headers = 6 variables + assert len(dataset.variables) == 7 + + # Verify trace headers + validate_variable( + dataset, + name="headers", + dims=[("cdp", 2048)], + coords=["cdp_x", "cdp_y"], + dtype=headers, + ) + + validate_variable( + dataset, + name="trace_mask", + dims=[("cdp", 2048)], + coords=["cdp_x", "cdp_y"], + dtype=ScalarType.BOOL, + ) + + # Verify dimension coordinate variables + inline = validate_variable( + dataset, + name="cdp", + dims=[("cdp", 2048)], + coords=["cdp"], + dtype=ScalarType.INT32, + ) + assert inline.metadata is None + + domain = validate_variable( + dataset, + name=domain, + dims=[(domain, 4096)], + coords=[domain], + dtype=ScalarType.INT32, + ) + assert domain.metadata is None + + # Verify non-dimension coordinate variables + cdp_x = validate_variable( + dataset, + name="cdp_x", + dims=[("cdp", 2048)], + coords=["cdp_x"], + dtype=ScalarType.FLOAT64, + ) + assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER + + cdp_y = validate_variable( + dataset, + name="cdp_y", + dims=[("cdp", 2048)], + coords=["cdp_y"], + dtype=ScalarType.FLOAT64, + ) + assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER + + class TestSeismic2DPostStackTemplate: """Unit tests for Seismic2DPostStackTemplate.""" @@ -26,14 +92,13 @@ def test_configuration_depth(self) -> None: assert t._trace_domain == "depth" assert t._coord_dim_names == ["cdp"] assert t._dim_names == ["cdp", "depth"] - assert t._coord_names == ["cdp-x", "cdp-y"] - assert t._var_name == "StackedAmplitude" + assert t._coord_names == ["cdp_x", "cdp_y"] assert t._var_chunk_shape == [1024, 1024] # Variables instantiated when build_dataset() is called assert t._builder is None assert t._dim_sizes == [] - assert t._coord_units == [] + assert t._horizontal_coord_unit is None # Verify dataset attributes attrs = t._load_dataset_attributes() @@ -43,6 +108,8 @@ def test_configuration_depth(self) -> None: "processingStage": "post-stack", } + assert t.trace_variable_name == "amplitude" + def test_configuration_time(self) -> None: """Test configuration of Seismic2DPostStackTemplate with time domain.""" t = Seismic2DPostStackTemplate("time") @@ -51,35 +118,44 @@ def test_configuration_time(self) -> None: assert t._trace_domain == "time" assert t._coord_dim_names == ["cdp"] assert t._dim_names == ["cdp", "time"] - assert t._coord_names == ["cdp-x", "cdp-y"] - assert t._var_name == "StackedAmplitude" + assert t._coord_names == ["cdp_x", "cdp_y"] assert t._var_chunk_shape == [1024, 1024] # Variables instantiated when build_dataset() is called assert t._builder is None assert t._dim_sizes == [] - assert t._coord_units == [] + assert t._horizontal_coord_unit is None + + # Verify dataset attributes + attrs = t._load_dataset_attributes() + assert attrs.attributes == { + "surveyDimensionality": "2D", + "ensembleType": "line", + "processingStage": "post-stack", + } + assert t.trace_variable_name == "amplitude" def test_domain_case_handling(self) -> None: """Test that domain parameter handles different cases correctly.""" # Test uppercase t1 = Seismic2DPostStackTemplate("ELEVATION") assert t1._trace_domain == "elevation" - assert t1.get_name() == "PostStack2DElevation" + assert t1.name == "PostStack2DElevation" # Test mixed case t2 = Seismic2DPostStackTemplate("elevatioN") assert t2._trace_domain == "elevation" - assert t2.get_name() == "PostStack2DElevation" + assert t2.name == "PostStack2DElevation" - def test_build_dataset_depth(self) -> None: + def test_build_dataset_depth(self, structured_headers: StructuredType) -> None: """Test building a complete 2D depth dataset.""" t = Seismic2DPostStackTemplate("depth") dataset = t.build_dataset( "Seismic 2D Depth Line 001", sizes=[2048, 4096], - coord_units=[_UNIT_METER, _UNIT_METER], # Both coordinates and depth in meters + horizontal_coord_unit=_UNIT_METER, + headers=structured_headers, ) # Verify dataset metadata @@ -88,48 +164,29 @@ def test_build_dataset_depth(self) -> None: assert dataset.metadata.attributes["ensembleType"] == "line" assert dataset.metadata.attributes["processingStage"] == "post-stack" - # 2 coordinate variables + 1 data variable = 5 variables - assert len(dataset.variables) == 3 - - # Verify coordinate variables - cdp_x = validate_variable( - dataset, - name="cdp-x", - dims=[("cdp", 2048)], - coords=["cdp-x"], - dtype=ScalarType.FLOAT64, - ) - assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER - - cdp_y = validate_variable( - dataset, - name="cdp-y", - dims=[("cdp", 2048)], - coords=["cdp-y"], - dtype=ScalarType.FLOAT64, - ) - assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER + _validate_coordinates_headers_trace_mask(dataset, structured_headers, "depth") # Verify seismic variable seismic = validate_variable( dataset, - name="StackedAmplitude", + name="amplitude", dims=[("cdp", 2048), ("depth", 4096)], - coords=["cdp-x", "cdp-y"], + coords=["cdp_x", "cdp_y"], dtype=ScalarType.FLOAT32, ) assert isinstance(seismic.metadata.chunk_grid, RegularChunkGrid) assert seismic.metadata.chunk_grid.configuration.chunk_shape == [1024, 1024] assert seismic.metadata.stats_v1 is None - def test_build_dataset_time(self) -> None: + def test_build_dataset_time(self, structured_headers: StructuredType) -> None: """Test building a complete 2D time dataset.""" t = Seismic2DPostStackTemplate("time") dataset = t.build_dataset( "Seismic 2D Time Line 001", sizes=[2048, 4096], - coord_units=[_UNIT_METER, _UNIT_METER], # Coordinates in meters, time in seconds + horizontal_coord_unit=_UNIT_METER, + headers=structured_headers, ) # Verify dataset metadata @@ -138,34 +195,14 @@ def test_build_dataset_time(self) -> None: assert dataset.metadata.attributes["ensembleType"] == "line" assert dataset.metadata.attributes["processingStage"] == "post-stack" - # Verify variables count - assert len(dataset.variables) == 3 - - # Verify coordinate variables - v = validate_variable( - dataset, - name="cdp-x", - dims=[("cdp", 2048)], - coords=["cdp-x"], - dtype=ScalarType.FLOAT64, - ) - assert v.metadata.units_v1.length == LengthUnitEnum.METER - - v = validate_variable( - dataset, - name="cdp-y", - dims=[("cdp", 2048)], - coords=["cdp-y"], - dtype=ScalarType.FLOAT64, - ) - assert v.metadata.units_v1.length == LengthUnitEnum.METER + _validate_coordinates_headers_trace_mask(dataset, structured_headers, "time") # Verify seismic variable v = validate_variable( dataset, - name="StackedAmplitude", + name="amplitude", dims=[("cdp", 2048), ("time", 4096)], - coords=["cdp-x", "cdp-y"], + coords=["cdp_x", "cdp_y"], dtype=ScalarType.FLOAT32, ) assert isinstance(v.metadata.chunk_grid, RegularChunkGrid) @@ -182,11 +219,10 @@ def test_time_vs_depth_comparison(self) -> None: assert depth_template._trace_domain == "depth" # Different names - assert time_template.get_name() == "PostStack2DTime" - assert depth_template.get_name() == "PostStack2DDepth" + assert time_template.name == "PostStack2DTime" + assert depth_template.name == "PostStack2DDepth" # Same other attributes assert time_template._coord_dim_names == depth_template._coord_dim_names assert time_template._coord_names == depth_template._coord_names - assert time_template._var_name == depth_template._var_name assert time_template._var_chunk_shape == depth_template._var_chunk_shape diff --git a/tests/unit/v1/templates/test_seismic_3d_poststack.py b/tests/unit/v1/templates/test_seismic_3d_poststack.py index 3e205b0ae..8f4c1ad0e 100644 --- a/tests/unit/v1/templates/test_seismic_3d_poststack.py +++ b/tests/unit/v1/templates/test_seismic_3d_poststack.py @@ -5,6 +5,8 @@ from mdio.schemas.chunk_grid import RegularChunkGrid from mdio.schemas.compressors import Blosc from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredType +from mdio.schemas.v1.dataset import Dataset from mdio.schemas.v1.templates.seismic_3d_poststack import Seismic3DPostStackTemplate from mdio.schemas.v1.units import AllUnits from mdio.schemas.v1.units import LengthUnitEnum @@ -16,6 +18,79 @@ _UNIT_SECOND = AllUnits(units_v1=TimeUnitModel(time=TimeUnitEnum.SECOND)) +def _validate_coordinates_headers_trace_mask( + dataset: Dataset, headers: StructuredType, domain: str +) -> None: + """Validate the coordinate, headers, trace_mask variables in the dataset.""" + # Verify variables + # 3 dim coords + 2 non-dim coords + 1 data + 1 trace mask + 1 headers = 7 variables + assert len(dataset.variables) == 8 + + # Verify trace headers + validate_variable( + dataset, + name="headers", + dims=[("inline", 256), ("crossline", 512)], + coords=["cdp_x", "cdp_y"], + dtype=headers, + ) + + validate_variable( + dataset, + name="trace_mask", + dims=[("inline", 256), ("crossline", 512)], + coords=["cdp_x", "cdp_y"], + dtype=ScalarType.BOOL, + ) + + # Verify dimension coordinate variables + inline = validate_variable( + dataset, + name="inline", + dims=[("inline", 256)], + coords=["inline"], + dtype=ScalarType.INT32, + ) + assert inline.metadata is None + + crossline = validate_variable( + dataset, + name="crossline", + dims=[("crossline", 512)], + coords=["crossline"], + dtype=ScalarType.INT32, + ) + assert crossline.metadata is None + + domain = validate_variable( + dataset, + name=domain, + dims=[(domain, 1024)], + coords=[domain], + dtype=ScalarType.INT32, + ) + assert domain.metadata is None + + # Verify non-dimension coordinate variables + cdp_x = validate_variable( + dataset, + name="cdp_x", + dims=[("inline", 256), ("crossline", 512)], + coords=["cdp_x"], + dtype=ScalarType.FLOAT64, + ) + assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER + + cdp_y = validate_variable( + dataset, + name="cdp_y", + dims=[("inline", 256), ("crossline", 512)], + coords=["cdp_y"], + dtype=ScalarType.FLOAT64, + ) + assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER + + class TestSeismic3DPostStackTemplate: """Unit tests for Seismic3DPostStackTemplate.""" @@ -27,21 +102,22 @@ def test_configuration_depth(self) -> None: assert t._trace_domain == "depth" # Domain should be lowercased assert t._coord_dim_names == ["inline", "crossline"] assert t._dim_names == ["inline", "crossline", "depth"] - assert t._coord_names == ["cdp-x", "cdp-y"] + assert t._coord_names == ["cdp_x", "cdp_y"] assert t._var_chunk_shape == [128, 128, 128] # Variables instantiated when build_dataset() is called assert t._builder is None assert t._dim_sizes == [] - assert t._coord_units == [] + assert t._horizontal_coord_unit is None - assert t._load_dataset_attributes().attributes == { + # Verify dataset attributes + attrs = t._load_dataset_attributes() + assert attrs.attributes == { "surveyDimensionality": "3D", "ensembleType": "line", "processingStage": "post-stack", } - - assert t.get_name() == "PostStack3DDepth" + assert t.trace_variable_name == "amplitude" def test_configuration_time(self) -> None: """Unit tests for Seismic3DPostStackTemplate with time domain.""" @@ -51,13 +127,13 @@ def test_configuration_time(self) -> None: assert t._trace_domain == "time" # Domain should be lowercased assert t._coord_dim_names == ["inline", "crossline"] assert t._dim_names == ["inline", "crossline", "time"] - assert t._coord_names == ["cdp-x", "cdp-y"] + assert t._coord_names == ["cdp_x", "cdp_y"] assert t._var_chunk_shape == [128, 128, 128] # Variables instantiated when build_dataset() is called assert t._builder is None assert t._dim_sizes == [] - assert t._coord_units == [] + assert t._horizontal_coord_unit is None assert t._load_dataset_attributes().attributes == { "surveyDimensionality": "3D", @@ -65,27 +141,30 @@ def test_configuration_time(self) -> None: "processingStage": "post-stack", } - assert t.get_name() == "PostStack3DTime" + assert t.name == "PostStack3DTime" def test_domain_case_handling(self) -> None: """Test that domain parameter handles different cases correctly.""" # Test uppercase t1 = Seismic3DPostStackTemplate("ELEVATION") assert t1._trace_domain == "elevation" - assert t1.get_name() == "PostStack3DElevation" + assert t1.name == "PostStack3DElevation" # Test mixed case t2 = Seismic3DPostStackTemplate("elevatioN") assert t2._trace_domain == "elevation" - assert t2.get_name() == "PostStack3DElevation" + assert t2.name == "PostStack3DElevation" - def test_build_dataset_depth(self) -> None: + def test_build_dataset_depth(self, structured_headers: StructuredType) -> None: """Unit tests for Seismic3DPostStackTemplate build with depth domain.""" t = Seismic3DPostStackTemplate(domain="depth") - assert t.get_name() == "PostStack3DDepth" + assert t.name == "PostStack3DDepth" dataset = t.build_dataset( - "Seismic 3D", sizes=[256, 512, 1024], coord_units=[_UNIT_METER, _UNIT_METER] + "Seismic 3D", + sizes=[256, 512, 1024], + horizontal_coord_unit=_UNIT_METER, + headers=structured_headers, ) assert dataset.metadata.name == "Seismic 3D" @@ -93,35 +172,14 @@ def test_build_dataset_depth(self) -> None: assert dataset.metadata.attributes["ensembleType"] == "line" assert dataset.metadata.attributes["processingStage"] == "post-stack" - # Verify variables - # 2 coordinate variables + 1 data variables = 3 variables - assert len(dataset.variables) == 3 - - # Verify coordinate variables - cdp_x = validate_variable( - dataset, - name="cdp-x", - dims=[("inline", 256), ("crossline", 512)], - coords=["cdp-x"], - dtype=ScalarType.FLOAT64, - ) - assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER - - cdp_y = validate_variable( - dataset, - name="cdp-y", - dims=[("inline", 256), ("crossline", 512)], - coords=["cdp-y"], - dtype=ScalarType.FLOAT64, - ) - assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER + _validate_coordinates_headers_trace_mask(dataset, structured_headers, "depth") # Verify seismic variable seismic = validate_variable( dataset, - name="StackedAmplitude", + name="amplitude", dims=[("inline", 256), ("crossline", 512), ("depth", 1024)], - coords=["cdp-x", "cdp-y"], + coords=["cdp_x", "cdp_y"], dtype=ScalarType.FLOAT32, ) assert isinstance(seismic.compressor, Blosc) @@ -130,13 +188,16 @@ def test_build_dataset_depth(self) -> None: assert seismic.metadata.chunk_grid.configuration.chunk_shape == [128, 128, 128] assert seismic.metadata.stats_v1 is None - def test_build_dataset_time(self) -> None: + def test_build_dataset_time(self, structured_headers: StructuredType) -> None: """Unit tests for Seismic3DPostStackTimeTemplate build with time domain.""" t = Seismic3DPostStackTemplate(domain="time") - assert t.get_name() == "PostStack3DTime" + assert t.name == "PostStack3DTime" dataset = t.build_dataset( - "Seismic 3D", sizes=[256, 512, 1024], coord_units=[_UNIT_METER, _UNIT_METER] + "Seismic 3D", + sizes=[256, 512, 1024], + horizontal_coord_unit=_UNIT_METER, + headers=structured_headers, ) assert dataset.metadata.name == "Seismic 3D" @@ -144,35 +205,14 @@ def test_build_dataset_time(self) -> None: assert dataset.metadata.attributes["ensembleType"] == "line" assert dataset.metadata.attributes["processingStage"] == "post-stack" - # Verify variables - # 2 coordinate variables + 1 data variables = 3 variables - assert len(dataset.variables) == 3 - - # Verify coordinate variables - cdp_x = validate_variable( - dataset, - name="cdp-x", - dims=[("inline", 256), ("crossline", 512)], - coords=["cdp-x"], - dtype=ScalarType.FLOAT64, - ) - assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER - - cdp_y = validate_variable( - dataset, - name="cdp-y", - dims=[("inline", 256), ("crossline", 512)], - coords=["cdp-y"], - dtype=ScalarType.FLOAT64, - ) - assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER + _validate_coordinates_headers_trace_mask(dataset, structured_headers, "time") # Verify seismic variable seismic = validate_variable( dataset, - name="StackedAmplitude", + name="amplitude", dims=[("inline", 256), ("crossline", 512), ("time", 1024)], - coords=["cdp-x", "cdp-y"], + coords=["cdp_x", "cdp_y"], dtype=ScalarType.FLOAT32, ) assert isinstance(seismic.compressor, Blosc) diff --git a/tests/unit/v1/templates/test_seismic_3d_prestack_cdp.py b/tests/unit/v1/templates/test_seismic_3d_prestack_cdp.py index 4f936940e..07af31837 100644 --- a/tests/unit/v1/templates/test_seismic_3d_prestack_cdp.py +++ b/tests/unit/v1/templates/test_seismic_3d_prestack_cdp.py @@ -5,6 +5,8 @@ from mdio.schemas.chunk_grid import RegularChunkGrid from mdio.schemas.compressors import Blosc from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredType +from mdio.schemas.v1.dataset import Dataset from mdio.schemas.v1.templates.seismic_3d_prestack_cdp import Seismic3DPreStackCDPTemplate from mdio.schemas.v1.units import AllUnits from mdio.schemas.v1.units import LengthUnitEnum @@ -16,6 +18,88 @@ _UNIT_SECOND = AllUnits(units_v1=TimeUnitModel(time=TimeUnitEnum.SECOND)) +def validate_coordinates_headers_trace_mask( + dataset: Dataset, headers: StructuredType, domain: str +) -> None: + """A helper method to validate coordinates, headers, and trace mask.""" + # Verify variables + # 4 dim coords + 2 non-dim coords + 1 data + 1 trace mask + 1 headers = 8 variables + assert len(dataset.variables) == 9 + + # Verify trace headers + validate_variable( + dataset, + name="headers", + dims=[("inline", 512), ("crossline", 768), ("offset", 36)], + coords=["cdp_x", "cdp_y"], + dtype=headers, + ) + + validate_variable( + dataset, + name="trace_mask", + dims=[("inline", 512), ("crossline", 768), ("offset", 36)], + coords=["cdp_x", "cdp_y"], + dtype=ScalarType.BOOL, + ) + + # Verify dimension coordinate variables + inline = validate_variable( + dataset, + name="inline", + dims=[("inline", 512)], + coords=["inline"], + dtype=ScalarType.INT32, + ) + assert inline.metadata is None + + crossline = validate_variable( + dataset, + name="crossline", + dims=[("crossline", 768)], + coords=["crossline"], + dtype=ScalarType.INT32, + ) + assert crossline.metadata is None + + crossline = validate_variable( + dataset, + name="offset", + dims=[("offset", 36)], + coords=["offset"], + dtype=ScalarType.INT32, + ) + assert crossline.metadata is None + + domain = validate_variable( + dataset, + name=domain, + dims=[(domain, 1536)], + coords=[domain], + dtype=ScalarType.INT32, + ) + assert domain.metadata is None + + # Verify non-dimension coordinate variables + cdp_x = validate_variable( + dataset, + name="cdp_x", + dims=[("inline", 512), ("crossline", 768), ("offset", 36)], + coords=["cdp_x"], + dtype=ScalarType.FLOAT64, + ) + assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER + + cdp_y = validate_variable( + dataset, + name="cdp_y", + dims=[("inline", 512), ("crossline", 768), ("offset", 36)], + coords=["cdp_y"], + dtype=ScalarType.FLOAT64, + ) + assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER + + class TestSeismic3DPreStackCDPTemplate: """Unit tests for Seismic3DPreStackCDPTemplate.""" @@ -25,16 +109,15 @@ def test_configuration_depth(self) -> None: # Template attributes for prestack CDP assert t._trace_domain == "depth" - assert t._coord_dim_names == ["inline", "crossline"] + assert t._coord_dim_names == ["inline", "crossline", "offset"] assert t._dim_names == ["inline", "crossline", "offset", "depth"] - assert t._coord_names == ["cdp-x", "cdp-y"] - assert t._var_name == "AmplitudeCDP" + assert t._coord_names == ["cdp_x", "cdp_y"] assert t._var_chunk_shape == [1, 1, 512, 4096] # Variables instantiated when build_dataset() is called assert t._builder is None assert t._dim_sizes == [] - assert t._coord_units == [] + assert t._horizontal_coord_unit is None # Verify prestack CDP attributes attrs = t._load_dataset_attributes() @@ -43,8 +126,7 @@ def test_configuration_depth(self) -> None: "ensembleType": "cdp", "processingStage": "pre-stack", } - - assert t.get_name() == "PreStackCdpGathers3DDepth" + assert t.trace_variable_name == "amplitude" def test_configuration_time(self) -> None: """Unit tests for Seismic3DPreStackCDPTemplate.""" @@ -52,16 +134,15 @@ def test_configuration_time(self) -> None: # Template attributes for prestack CDP assert t._trace_domain == "time" - assert t._coord_dim_names == ["inline", "crossline"] + assert t._coord_dim_names == ["inline", "crossline", "offset"] assert t._dim_names == ["inline", "crossline", "offset", "time"] - assert t._coord_names == ["cdp-x", "cdp-y"] - assert t._var_name == "AmplitudeCDP" + assert t._coord_names == ["cdp_x", "cdp_y"] assert t._var_chunk_shape == [1, 1, 512, 4096] # Variables instantiated when build_dataset() is called assert t._builder is None assert t._dim_sizes == [] - assert t._coord_units == [] + assert t._horizontal_coord_unit is None # Verify prestack CDP attributes attrs = t._load_dataset_attributes() @@ -71,29 +152,30 @@ def test_configuration_time(self) -> None: "processingStage": "pre-stack", } - assert t.get_name() == "PreStackCdpGathers3DTime" + assert t.name == "PreStackCdpGathers3DTime" def test_domain_case_handling(self) -> None: """Test that domain parameter handles different cases correctly.""" # Test uppercase t1 = Seismic3DPreStackCDPTemplate("ELEVATION") assert t1._trace_domain == "elevation" - assert t1.get_name() == "PreStackCdpGathers3DElevation" + assert t1.name == "PreStackCdpGathers3DElevation" # Test mixed case t2 = Seismic3DPreStackCDPTemplate("elevatioN") assert t2._trace_domain == "elevation" - assert t2.get_name() == "PreStackCdpGathers3DElevation" + assert t2.name == "PreStackCdpGathers3DElevation" - def test_build_dataset_depth(self) -> None: + def test_build_dataset_depth(self, structured_headers: StructuredType) -> None: """Unit tests for Seismic3DPreStackCDPDepthTemplate build with depth domain.""" t = Seismic3DPreStackCDPTemplate(domain="depth") - assert t.get_name() == "PreStackCdpGathers3DDepth" + assert t.name == "PreStackCdpGathers3DDepth" dataset = t.build_dataset( "North Sea 3D Prestack Depth", sizes=[512, 768, 36, 1536], - coord_units=[_UNIT_METER, _UNIT_METER], + horizontal_coord_unit=_UNIT_METER, + headers=structured_headers, ) assert dataset.metadata.name == "North Sea 3D Prestack Depth" @@ -101,35 +183,14 @@ def test_build_dataset_depth(self) -> None: assert dataset.metadata.attributes["ensembleType"] == "cdp" assert dataset.metadata.attributes["processingStage"] == "pre-stack" - # Verify variables - # 2 coordinate variables + 1 data variable = 3 variables - assert len(dataset.variables) == 3 - - # Verify coordinate variables - cdp_x = validate_variable( - dataset, - name="cdp-x", - dims=[("inline", 512), ("crossline", 768)], - coords=["cdp-x"], - dtype=ScalarType.FLOAT64, - ) - assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER - - cdp_y = validate_variable( - dataset, - name="cdp-y", - dims=[("inline", 512), ("crossline", 768)], - coords=["cdp-y"], - dtype=ScalarType.FLOAT64, - ) - assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER + validate_coordinates_headers_trace_mask(dataset, structured_headers, "depth") # Verify seismic variable (prestack depth data) seismic = validate_variable( dataset, - name="AmplitudeCDP", + name="amplitude", dims=[("inline", 512), ("crossline", 768), ("offset", 36), ("depth", 1536)], - coords=["cdp-x", "cdp-y"], + coords=["cdp_x", "cdp_y"], dtype=ScalarType.FLOAT32, ) assert isinstance(seismic.compressor, Blosc) @@ -138,15 +199,16 @@ def test_build_dataset_depth(self) -> None: assert seismic.metadata.chunk_grid.configuration.chunk_shape == [1, 1, 512, 4096] assert seismic.metadata.stats_v1 is None - def test_build_dataset_time(self) -> None: + def test_build_dataset_time(self, structured_headers: StructuredType) -> None: """Unit tests for Seismic3DPreStackCDPTimeTemplate build with time domain.""" t = Seismic3DPreStackCDPTemplate(domain="time") - assert t.get_name() == "PreStackCdpGathers3DTime" + assert t.name == "PreStackCdpGathers3DTime" dataset = t.build_dataset( "Santos Basin 3D Prestack", sizes=[512, 768, 36, 1536], - coord_units=[_UNIT_METER, _UNIT_METER], + horizontal_coord_unit=_UNIT_METER, + headers=structured_headers, ) assert dataset.metadata.name == "Santos Basin 3D Prestack" @@ -154,35 +216,14 @@ def test_build_dataset_time(self) -> None: assert dataset.metadata.attributes["ensembleType"] == "cdp" assert dataset.metadata.attributes["processingStage"] == "pre-stack" - # Verify variables - # 2 coordinate variables + 1 data variable = 3 variables - assert len(dataset.variables) == 3 - - # Verify coordinate variables - cdp_x = validate_variable( - dataset, - name="cdp-x", - dims=[("inline", 512), ("crossline", 768)], - coords=["cdp-x"], - dtype=ScalarType.FLOAT64, - ) - assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER - - cdp_y = validate_variable( - dataset, - name="cdp-y", - dims=[("inline", 512), ("crossline", 768)], - coords=["cdp-y"], - dtype=ScalarType.FLOAT64, - ) - assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER + validate_coordinates_headers_trace_mask(dataset, structured_headers, "time") # Verify seismic variable (prestack time data) seismic = validate_variable( dataset, - name="AmplitudeCDP", + name="amplitude", dims=[("inline", 512), ("crossline", 768), ("offset", 36), ("time", 1536)], - coords=["cdp-x", "cdp-y"], + coords=["cdp_x", "cdp_y"], dtype=ScalarType.FLOAT32, ) assert isinstance(seismic.compressor, Blosc) diff --git a/tests/unit/v1/templates/test_seismic_3d_prestack_shot.py b/tests/unit/v1/templates/test_seismic_3d_prestack_shot.py index eea66cf6b..5d4b51c29 100644 --- a/tests/unit/v1/templates/test_seismic_3d_prestack_shot.py +++ b/tests/unit/v1/templates/test_seismic_3d_prestack_shot.py @@ -5,6 +5,8 @@ from mdio.schemas.chunk_grid import RegularChunkGrid from mdio.schemas.compressors import Blosc from mdio.schemas.dtype import ScalarType +from mdio.schemas.dtype import StructuredType +from mdio.schemas.v1.dataset import Dataset from mdio.schemas.v1.templates.seismic_3d_prestack_shot import Seismic3DPreStackShotTemplate from mdio.schemas.v1.units import AllUnits from mdio.schemas.v1.units import LengthUnitEnum @@ -16,6 +18,114 @@ _UNIT_SECOND = AllUnits(units_v1=TimeUnitModel(time=TimeUnitEnum.SECOND)) +def _validate_coordinates_headers_trace_mask( + dataset: Dataset, headers: StructuredType, domain: str +) -> None: + """Validate the coordinate, headers, trace_mask variables in the dataset.""" + # Verify variables + # 4 dim coords + 5 non-dim coords + 1 data + 1 trace mask + 1 headers = 12 variables + assert len(dataset.variables) == 12 + + # Verify trace headers + validate_variable( + dataset, + name="headers", + dims=[("shot_point", 256), ("cable", 512), ("channel", 24)], + coords=["gun", "shot-x", "shot-y", "receiver-x", "receiver-y"], + dtype=headers, + ) + + validate_variable( + dataset, + name="trace_mask", + dims=[("shot_point", 256), ("cable", 512), ("channel", 24)], + coords=["gun", "shot-x", "shot-y", "receiver-x", "receiver-y"], + dtype=ScalarType.BOOL, + ) + + # Verify dimension coordinate variables + inline = validate_variable( + dataset, + name="shot_point", + dims=[("shot_point", 256)], + coords=["shot_point"], + dtype=ScalarType.INT32, + ) + assert inline.metadata is None + + crossline = validate_variable( + dataset, + name="cable", + dims=[("cable", 512)], + coords=["cable"], + dtype=ScalarType.INT32, + ) + assert crossline.metadata is None + + crossline = validate_variable( + dataset, + name="channel", + dims=[("channel", 24)], + coords=["channel"], + dtype=ScalarType.INT32, + ) + assert crossline.metadata is None + + domain = validate_variable( + dataset, + name=domain, + dims=[(domain, 2048)], + coords=[domain], + dtype=ScalarType.INT32, + ) + assert domain.metadata is None + + # Verify non-dimension coordinate variables + validate_variable( + dataset, + name="gun", + dims=[("shot_point", 256)], + coords=["gun"], + dtype=ScalarType.UINT8, + ) + + shot_x = validate_variable( + dataset, + name="shot-x", + dims=[("shot_point", 256)], + coords=["shot-x"], + dtype=ScalarType.FLOAT64, + ) + assert shot_x.metadata.units_v1.length == LengthUnitEnum.METER + + shot_y = validate_variable( + dataset, + name="shot-y", + dims=[("shot_point", 256)], + coords=["shot-y"], + dtype=ScalarType.FLOAT64, + ) + assert shot_y.metadata.units_v1.length == LengthUnitEnum.METER + + receiver_x = validate_variable( + dataset, + name="receiver-x", + dims=[("shot_point", 256), ("cable", 512), ("channel", 24)], + coords=["receiver-x"], + dtype=ScalarType.FLOAT64, + ) + assert receiver_x.metadata.units_v1.length == LengthUnitEnum.METER + + receiver_y = validate_variable( + dataset, + name="receiver-y", + dims=[("shot_point", 256), ("cable", 512), ("channel", 24)], + coords=["receiver-y"], + dtype=ScalarType.FLOAT64, + ) + assert receiver_y.metadata.units_v1.length == LengthUnitEnum.METER + + class TestSeismic3DPreStackShotTemplate: """Unit tests for Seismic3DPreStackShotTemplate.""" @@ -25,16 +135,15 @@ def test_configuration_depth(self) -> None: # Template attributes for prestack shot assert t._trace_domain == "depth" - assert t._coord_dim_names == [] + assert t._coord_dim_names == ["shot_point", "cable", "channel"] assert t._dim_names == ["shot_point", "cable", "channel", "depth"] assert t._coord_names == ["gun", "shot-x", "shot-y", "receiver-x", "receiver-y"] - assert t._var_name == "AmplitudeShot" assert t._var_chunk_shape == [1, 1, 512, 4096] # Variables instantiated when build_dataset() is called assert t._builder is None assert t._dim_sizes == [] - assert t._coord_units == [] + assert t._horizontal_coord_unit is None # Verify prestack shot attributes attrs = t._load_dataset_attributes() @@ -43,8 +152,7 @@ def test_configuration_depth(self) -> None: "ensembleType": "shot", "processingStage": "pre-stack", } - - assert t.get_name() == "PreStackShotGathers3DDepth" + assert t.trace_variable_name == "amplitude" def test_configuration_time(self) -> None: """Unit tests for Seismic3DPreStackShotTemplate in time domain.""" @@ -52,16 +160,15 @@ def test_configuration_time(self) -> None: # Template attributes for prestack shot assert t._trace_domain == "time" - assert t._coord_dim_names == [] + assert t._coord_dim_names == ["shot_point", "cable", "channel"] assert t._dim_names == ["shot_point", "cable", "channel", "time"] assert t._coord_names == ["gun", "shot-x", "shot-y", "receiver-x", "receiver-y"] - assert t._var_name == "AmplitudeShot" assert t._var_chunk_shape == [1, 1, 512, 4096] # Variables instantiated when build_dataset() is called assert t._builder is None assert t._dim_sizes == [] - assert t._coord_units == [] + assert t._horizontal_coord_unit is None # Verify prestack shot attributes attrs = t._load_dataset_attributes() @@ -71,29 +178,30 @@ def test_configuration_time(self) -> None: "processingStage": "pre-stack", } - assert t.get_name() == "PreStackShotGathers3DTime" + assert t.name == "PreStackShotGathers3DTime" def test_domain_case_handling(self) -> None: """Test that domain parameter handles different cases correctly.""" # Test uppercase t1 = Seismic3DPreStackShotTemplate("ELEVATION") assert t1._trace_domain == "elevation" - assert t1.get_name() == "PreStackShotGathers3DElevation" + assert t1.name == "PreStackShotGathers3DElevation" # Test mixed case t2 = Seismic3DPreStackShotTemplate("elevatioN") assert t2._trace_domain == "elevation" - assert t2.get_name() == "PreStackShotGathers3DElevation" + assert t2.name == "PreStackShotGathers3DElevation" - def test_build_dataset_depth(self) -> None: + def test_build_dataset_depth(self, structured_headers: StructuredType) -> None: """Unit tests for Seismic3DPreStackShotTemplate build in depth domain.""" t = Seismic3DPreStackShotTemplate(domain="depth") - assert t.get_name() == "PreStackShotGathers3DDepth" + assert t.name == "PreStackShotGathers3DDepth" dataset = t.build_dataset( "Gulf of Mexico 3D Shot Depth", sizes=[256, 512, 24, 2048], - coord_units=[_UNIT_METER, _UNIT_METER], + horizontal_coord_unit=_UNIT_METER, + headers=structured_headers, ) assert dataset.metadata.name == "Gulf of Mexico 3D Shot Depth" @@ -101,59 +209,12 @@ def test_build_dataset_depth(self) -> None: assert dataset.metadata.attributes["ensembleType"] == "shot" assert dataset.metadata.attributes["processingStage"] == "pre-stack" - # Verify variables (including dimension variables) - # 5 coordinate variables + 1 data variable = 6 variables - assert len(dataset.variables) == 6 - - # Verify coordinate variables - validate_variable( - dataset, - name="gun", - dims=[("shot_point", 256)], - coords=["gun"], - dtype=ScalarType.UINT8, - ) - - shot_x = validate_variable( - dataset, - name="shot-x", - dims=[("shot_point", 256)], - coords=["shot-x"], - dtype=ScalarType.FLOAT64, - ) - assert shot_x.metadata.units_v1.length == LengthUnitEnum.METER - - shot_y = validate_variable( - dataset, - name="shot-y", - dims=[("shot_point", 256)], - coords=["shot-y"], - dtype=ScalarType.FLOAT64, - ) - assert shot_y.metadata.units_v1.length == LengthUnitEnum.METER - - receiver_x = validate_variable( - dataset, - name="receiver-x", - dims=[("shot_point", 256), ("cable", 512), ("channel", 24)], - coords=["receiver-x"], - dtype=ScalarType.FLOAT64, - ) - assert receiver_x.metadata.units_v1.length == LengthUnitEnum.METER - - receiver_y = validate_variable( - dataset, - name="receiver-y", - dims=[("shot_point", 256), ("cable", 512), ("channel", 24)], - coords=["receiver-y"], - dtype=ScalarType.FLOAT64, - ) - assert receiver_y.metadata.units_v1.length == LengthUnitEnum.METER + _validate_coordinates_headers_trace_mask(dataset, structured_headers, "depth") # Verify seismic variable (prestack shot depth data) seismic = validate_variable( dataset, - name="AmplitudeShot", + name="amplitude", dims=[("shot_point", 256), ("cable", 512), ("channel", 24), ("depth", 2048)], coords=["gun", "shot-x", "shot-y", "receiver-x", "receiver-y"], dtype=ScalarType.FLOAT32, @@ -164,15 +225,16 @@ def test_build_dataset_depth(self) -> None: assert seismic.metadata.chunk_grid.configuration.chunk_shape == [1, 1, 512, 4096] assert seismic.metadata.stats_v1 is None - def test_build_dataset_time(self) -> None: + def test_build_dataset_time(self, structured_headers: StructuredType) -> None: """Unit tests for Seismic3DPreStackShotTemplate build in time domain.""" t = Seismic3DPreStackShotTemplate(domain="time") - assert t.get_name() == "PreStackShotGathers3DTime" + assert t.name == "PreStackShotGathers3DTime" dataset = t.build_dataset( "North Sea 3D Shot Time", sizes=[256, 512, 24, 2048], - coord_units=[_UNIT_METER, _UNIT_METER], + horizontal_coord_unit=_UNIT_METER, + headers=structured_headers, ) assert dataset.metadata.name == "North Sea 3D Shot Time" @@ -180,59 +242,12 @@ def test_build_dataset_time(self) -> None: assert dataset.metadata.attributes["ensembleType"] == "shot" assert dataset.metadata.attributes["processingStage"] == "pre-stack" - # Verify variables (including dimension variables) - # 5 coordinate variables + 1 data variable = 6 variables - assert len(dataset.variables) == 6 - - # Verify coordinate variables - validate_variable( - dataset, - name="gun", - dims=[("shot_point", 256)], - coords=["gun"], - dtype=ScalarType.UINT8, - ) - - shot_x = validate_variable( - dataset, - name="shot-x", - dims=[("shot_point", 256)], - coords=["shot-x"], - dtype=ScalarType.FLOAT64, - ) - assert shot_x.metadata.units_v1.length == LengthUnitEnum.METER - - shot_y = validate_variable( - dataset, - name="shot-y", - dims=[("shot_point", 256)], - coords=["shot-y"], - dtype=ScalarType.FLOAT64, - ) - assert shot_y.metadata.units_v1.length == LengthUnitEnum.METER - - receiver_x = validate_variable( - dataset, - name="receiver-x", - dims=[("shot_point", 256), ("cable", 512), ("channel", 24)], - coords=["receiver-x"], - dtype=ScalarType.FLOAT64, - ) - assert receiver_x.metadata.units_v1.length == LengthUnitEnum.METER - - receiver_y = validate_variable( - dataset, - name="receiver-y", - dims=[("shot_point", 256), ("cable", 512), ("channel", 24)], - coords=["receiver-y"], - dtype=ScalarType.FLOAT64, - ) - assert receiver_y.metadata.units_v1.length == LengthUnitEnum.METER + _validate_coordinates_headers_trace_mask(dataset, structured_headers, "time") # Verify seismic variable (prestack shot time data) seismic = validate_variable( dataset, - name="AmplitudeShot", + name="amplitude", dims=[("shot_point", 256), ("cable", 512), ("channel", 24), ("time", 2048)], coords=["gun", "shot-x", "shot-y", "receiver-x", "receiver-y"], dtype=ScalarType.FLOAT32, diff --git a/tests/unit/v1/templates/test_seismic_templates.py b/tests/unit/v1/templates/test_seismic_templates.py index 46d2245a2..c0b487099 100644 --- a/tests/unit/v1/templates/test_seismic_templates.py +++ b/tests/unit/v1/templates/test_seismic_templates.py @@ -1,6 +1,10 @@ """Unit tests for concrete seismic dataset template implementations.""" # Import all concrete template classes +from tests.unit.v1.helpers import validate_variable +from tests.unit.v1.templates.test_seismic_2d_poststack import _UNIT_METER + +from mdio.schemas.dtype import ScalarType from mdio.schemas.v1.templates.abstract_dataset_template import AbstractDatasetTemplate from mdio.schemas.v1.templates.seismic_2d_poststack import Seismic2DPostStackTemplate from mdio.schemas.v1.templates.seismic_3d_poststack import Seismic3DPostStackTemplate @@ -11,31 +15,64 @@ class TestSeismicTemplates: """Test cases for Seismic2DPostStackTemplate.""" + def test_custom_data_variable_name(self) -> None: + """Test get_data_variable_name with custom names.""" + + # Define a template with a custom data variable name 'velocity' + class Velocity2DPostStackTemplate(Seismic2DPostStackTemplate): + def __init__(self, domain: str): + super().__init__(domain=domain) + + @property + def _trace_variable_name(self) -> str: + return "velocity" + + @property + def _name(self) -> str: + return f"Velocity2D{self._trace_domain.capitalize()}" + + t = Velocity2DPostStackTemplate("depth") + assert t.name == "Velocity2DDepth" + assert t.trace_variable_name == "velocity" + + dataset = t.build_dataset( + "Velocity 2D Depth Line 001", sizes=[2048, 4096], horizontal_coord_unit=_UNIT_METER + ) + + # Verify velocity variable + validate_variable( + dataset, + name="velocity", + dims=[("cdp", 2048), ("depth", 4096)], + coords=["cdp_x", "cdp_y"], + dtype=ScalarType.FLOAT32, + ) + def test_get_name_time(self) -> None: """Test get_name with domain.""" time_template = Seismic2DPostStackTemplate("time") dpth_template = Seismic2DPostStackTemplate("depth") - assert time_template.get_name() == "PostStack2DTime" - assert dpth_template.get_name() == "PostStack2DDepth" + assert time_template.name == "PostStack2DTime" + assert dpth_template.name == "PostStack2DDepth" time_template = Seismic3DPostStackTemplate("time") dpth_template = Seismic3DPostStackTemplate("depth") - assert time_template.get_name() == "PostStack3DTime" - assert dpth_template.get_name() == "PostStack3DDepth" + assert time_template.name == "PostStack3DTime" + assert dpth_template.name == "PostStack3DDepth" time_template = Seismic3DPreStackCDPTemplate("time") dpth_template = Seismic3DPreStackCDPTemplate("depth") - assert time_template.get_name() == "PreStackCdpGathers3DTime" - assert dpth_template.get_name() == "PreStackCdpGathers3DDepth" + assert time_template.name == "PreStackCdpGathers3DTime" + assert dpth_template.name == "PreStackCdpGathers3DDepth" time_template = Seismic3DPreStackShotTemplate("time") dpth_template = Seismic3DPreStackShotTemplate("depth") - assert time_template.get_name() == "PreStackShotGathers3DTime" - assert dpth_template.get_name() == "PreStackShotGathers3DDepth" + assert time_template.name == "PreStackShotGathers3DTime" + assert dpth_template.name == "PreStackShotGathers3DDepth" def test_all_templates_inherit_from_abstract(self) -> None: """Test that all concrete templates inherit from AbstractDatasetTemplate.""" @@ -52,8 +89,13 @@ def test_all_templates_inherit_from_abstract(self) -> None: for template in templates: assert isinstance(template, AbstractDatasetTemplate) - assert hasattr(template, "get_name") + # That each template has the required properties and methods + assert hasattr(template, "name") + assert hasattr(template, "trace_variable_name") + assert hasattr(template, "trace_domain") + assert hasattr(template, "dimension_names") + assert hasattr(template, "coordinate_names") assert hasattr(template, "build_dataset") - names = [template.get_name() for template in templates] + names = [template.name for template in templates] assert len(names) == len(set(names)), f"Duplicate template names found: {names}" diff --git a/tests/unit/v1/templates/test_template_registry.py b/tests/unit/v1/templates/test_template_registry.py index a40f5021c..e8c61fe6a 100644 --- a/tests/unit/v1/templates/test_template_registry.py +++ b/tests/unit/v1/templates/test_template_registry.py @@ -21,7 +21,8 @@ def __init__(self, name: str): super().__init__() self.template_name = name - def _get_name(self) -> str: + @property + def _name(self) -> str: return self.template_name def _load_dataset_attributes(self) -> None: diff --git a/tests/unit/v1/test_dataset_builder_add_coordinate.py b/tests/unit/v1/test_dataset_builder_add_coordinate.py index 9d5f123b5..5ad4c70c0 100644 --- a/tests/unit/v1/test_dataset_builder_add_coordinate.py +++ b/tests/unit/v1/test_dataset_builder_add_coordinate.py @@ -38,9 +38,9 @@ def test_add_coordinate() -> None: with pytest.raises(ValueError, match="'name' must be a non-empty string"): builder.add_coordinate("", dimensions=["speed"], data_type=ScalarType.FLOAT32) with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): - builder.add_coordinate("cdp-x", dimensions=None, data_type=ScalarType.FLOAT32) + builder.add_coordinate("cdp_x", dimensions=None, data_type=ScalarType.FLOAT32) with pytest.raises(ValueError, match="'dimensions' must be a non-empty list"): - builder.add_coordinate("cdp-x", dimensions=[], data_type=ScalarType.FLOAT32) + builder.add_coordinate("cdp_x", dimensions=[], data_type=ScalarType.FLOAT32) # Add a variable using non-existent dimensions msg = "Pre-existing dimension named 'xline' is not found" @@ -51,14 +51,14 @@ def test_add_coordinate() -> None: # Validate state transition builder.add_coordinate( - "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32 + "cdp_x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32 ) validate_builder(builder, _BuilderState.HAS_COORDINATES, n_dims=2, n_coords=1, n_var=1) validate_variable( builder, - name="cdp-x", + name="cdp_x", dims=[("inline", 100), ("crossline", 200)], - coords=["cdp-x"], + coords=["cdp_x"], dtype=ScalarType.FLOAT32, ) @@ -66,7 +66,7 @@ def test_add_coordinate() -> None: msg = "Adding coordinate with the same name twice is not allowed" with pytest.raises(ValueError, match=msg): builder.add_coordinate( - "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32 + "cdp_x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32 ) diff --git a/tests/unit/v1/test_dataset_builder_add_variable.py b/tests/unit/v1/test_dataset_builder_add_variable.py index 2db85f3ca..9bcb97ff1 100644 --- a/tests/unit/v1/test_dataset_builder_add_variable.py +++ b/tests/unit/v1/test_dataset_builder_add_variable.py @@ -115,17 +115,17 @@ def test_add_variable_with_coords() -> None: # Add non-dim coordinates (e.g., 2D coordinates) builder.add_coordinate( - "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32 + "cdp_x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32 ) builder.add_coordinate( - "cdp-y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32 + "cdp_y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT32 ) # Add a variable with pre-defined dimension and non-dimension coordinates builder.add_variable( "ampl2", dimensions=["inline", "crossline", "depth"], - coordinates=["inline", "crossline", "cdp-x", "cdp-y"], + coordinates=["inline", "crossline", "cdp_x", "cdp_y"], data_type=ScalarType.FLOAT32, ) validate_builder(builder, _BuilderState.HAS_VARIABLES, n_dims=3, n_coords=4, n_var=6) @@ -133,7 +133,7 @@ def test_add_variable_with_coords() -> None: builder, "ampl2", dims=[("inline", 100), ("crossline", 200), ("depth", 300)], - coords=["inline", "crossline", "cdp-x", "cdp-y"], + coords=["inline", "crossline", "cdp_x", "cdp_y"], dtype=ScalarType.FLOAT32, ) @@ -186,10 +186,10 @@ def test_add_variable_full_parameters() -> None: builder.add_coordinate("depth", dimensions=["depth"], data_type=ScalarType.UINT32) # Add coordinates before we can add a data variable builder.add_coordinate( - "cdp-x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64 + "cdp_x", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64 ) builder.add_coordinate( - "cdp-y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64 + "cdp_y", dimensions=["inline", "crossline"], data_type=ScalarType.FLOAT64 ) # Add data variable with full parameters @@ -199,7 +199,7 @@ def test_add_variable_full_parameters() -> None: dimensions=["inline", "crossline", "depth"], data_type=ScalarType.FLOAT32, compressor=Blosc(algorithm="zstd"), - coordinates=["inline", "crossline", "depth", "cdp-x", "cdp-y"], + coordinates=["inline", "crossline", "depth", "cdp_x", "cdp_y"], metadata_info=[ AllUnits(units_v1=LengthUnitModel(length=LengthUnitEnum.FOOT)), UserAttributes(attributes={"MGA": 51, "UnitSystem": "Imperial"}), @@ -223,7 +223,7 @@ def test_add_variable_full_parameters() -> None: builder, "ampl", dims=[("inline", 100), ("crossline", 200), ("depth", 300)], - coords=["inline", "crossline", "depth", "cdp-x", "cdp-y"], + coords=["inline", "crossline", "depth", "cdp_x", "cdp_y"], dtype=ScalarType.FLOAT32, ) assert v.long_name == "Amplitude (dimensionless)" diff --git a/tests/unit/v1/test_dataset_builder_build.py b/tests/unit/v1/test_dataset_builder_build.py index 43b87fb5f..a5d817e1f 100644 --- a/tests/unit/v1/test_dataset_builder_build.py +++ b/tests/unit/v1/test_dataset_builder_build.py @@ -78,18 +78,18 @@ def test_build_seismic_poststack_3d_acceptance_dataset() -> None: # noqa: PLR09 # Verify coordinate variables cdp_x = validate_variable( dataset, - name="cdp-x", + name="cdp_x", dims=[("inline", 256), ("crossline", 512)], - coords=["cdp-x"], + coords=["cdp_x"], dtype=ScalarType.FLOAT32, ) assert cdp_x.metadata.units_v1.length == LengthUnitEnum.METER cdp_y = validate_variable( dataset, - name="cdp-y", + name="cdp_y", dims=[("inline", 256), ("crossline", 512)], - coords=["cdp-y"], + coords=["cdp_y"], dtype=ScalarType.FLOAT32, ) assert cdp_y.metadata.units_v1.length == LengthUnitEnum.METER @@ -99,7 +99,7 @@ def test_build_seismic_poststack_3d_acceptance_dataset() -> None: # noqa: PLR09 dataset, name="image", dims=[("inline", 256), ("crossline", 512), ("depth", 384)], - coords=["cdp-x", "cdp-y"], + coords=["cdp_x", "cdp_y"], dtype=ScalarType.FLOAT32, ) assert image.metadata.units_v1 is None # No units defined for image @@ -111,7 +111,7 @@ def test_build_seismic_poststack_3d_acceptance_dataset() -> None: # noqa: PLR09 dataset, name="velocity", dims=[("inline", 256), ("crossline", 512), ("depth", 384)], - coords=["cdp-x", "cdp-y"], + coords=["cdp_x", "cdp_y"], dtype=ScalarType.FLOAT16, ) assert velocity.compressor is None @@ -122,7 +122,7 @@ def test_build_seismic_poststack_3d_acceptance_dataset() -> None: # noqa: PLR09 dataset, name="image_inline", dims=[("inline", 256), ("crossline", 512), ("depth", 384)], - coords=["cdp-x", "cdp-y"], + coords=["cdp_x", "cdp_y"], dtype=ScalarType.FLOAT32, ) assert image_inline.long_name == "inline optimized version of 3d_stack" @@ -133,17 +133,17 @@ def test_build_seismic_poststack_3d_acceptance_dataset() -> None: # noqa: PLR09 headers = next(v for v in dataset.variables if v.name == "image_headers") assert isinstance(headers.data_type, StructuredType) assert len(headers.data_type.fields) == 4 - assert headers.data_type.fields[0].name == "cdp-x" + assert headers.data_type.fields[0].name == "cdp_x" headers = validate_variable( dataset, name="image_headers", dims=[("inline", 256), ("crossline", 512)], - coords=["cdp-x", "cdp-y"], + coords=["cdp_x", "cdp_y"], dtype=StructuredType( fields=[ - StructuredField(name="cdp-x", format=ScalarType.INT32), - StructuredField(name="cdp-y", format=ScalarType.INT32), + StructuredField(name="cdp_x", format=ScalarType.INT32), + StructuredField(name="cdp_y", format=ScalarType.INT32), StructuredField(name="elevation", format=ScalarType.FLOAT16), StructuredField(name="some_scalar", format=ScalarType.FLOAT16), ] diff --git a/tests/unit/v1/test_dataset_serializer.py b/tests/unit/v1/test_dataset_serializer.py index 9db2deee1..4ad2040e3 100644 --- a/tests/unit/v1/test_dataset_serializer.py +++ b/tests/unit/v1/test_dataset_serializer.py @@ -28,11 +28,9 @@ from mdio.schemas.v1.dataset_serializer import _get_coord_names from mdio.schemas.v1.dataset_serializer import _get_dimension_names from mdio.schemas.v1.dataset_serializer import _get_fill_value -from mdio.schemas.v1.dataset_serializer import _get_np_datatype from mdio.schemas.v1.dataset_serializer import _get_zarr_chunks from mdio.schemas.v1.dataset_serializer import _get_zarr_shape from mdio.schemas.v1.dataset_serializer import to_xarray_dataset -from mdio.schemas.v1.dataset_serializer import to_zarr from mdio.schemas.v1.variable import Coordinate from mdio.schemas.v1.variable import Variable @@ -56,7 +54,7 @@ from mdio.schemas.compressors import ZFPMode as mdio_ZFPMode -def test__get_all_named_dimensions() -> None: +def test_get_all_named_dimensions() -> None: """Test _get_all_named_dimensions function.""" dim1 = NamedDimension(name="inline", size=100) dim2 = NamedDimension(name="crossline", size=200) @@ -85,7 +83,7 @@ def test__get_all_named_dimensions() -> None: assert set(all_dims) == {"inline", "crossline", "depth"} -def test__get_dimension_names() -> None: +def test_get_dimension_names() -> None: """Test _get_dimension_names function with various dimension types.""" dim1 = NamedDimension(name="inline", size=100) dim2 = NamedDimension(name="crossline", size=200) @@ -110,7 +108,7 @@ def test__get_dimension_names() -> None: # NOTE: mixing NamedDimension and string dimensions is not allowed by the Variable schema -def test__get_coord_names() -> None: +def test_get_coord_names() -> None: """Comprehensive test for _get_coord_names function covering all scenarios.""" dim1 = NamedDimension(name="inline", size=100) dim2 = NamedDimension(name="crossline", size=200) @@ -140,57 +138,7 @@ def test__get_coord_names() -> None: # Variable schema -def test__get_np_datatype() -> None: - """Comprehensive test for _get_np_datatype function.""" - # Test 1: ScalarType cases - all supported scalar types - scalar_type_tests = [ - (ScalarType.FLOAT32, "float32"), - (ScalarType.FLOAT64, "float64"), - (ScalarType.INT8, "int8"), - (ScalarType.INT16, "int16"), - (ScalarType.INT32, "int32"), - (ScalarType.INT64, "int64"), - (ScalarType.UINT8, "uint8"), - (ScalarType.UINT16, "uint16"), - (ScalarType.UINT32, "uint32"), - (ScalarType.UINT64, "uint64"), - (ScalarType.COMPLEX64, "complex64"), - (ScalarType.COMPLEX128, "complex128"), - (ScalarType.BOOL, "bool"), - ] - err = "Expected ScalarType or StructuredType, got 'str'" - with pytest.raises(ValueError, match=err): - _get_np_datatype("parameter of invalid type") - - for scalar_type, expected_numpy_type in scalar_type_tests: - result = _get_np_datatype(scalar_type) - expected = np_dtype(expected_numpy_type) - - assert result == expected - assert isinstance(result, np_dtype) - assert result.name == expected.name - - # Test 2: StructuredType with multiple fields - multi_fields = [ - StructuredField(name="x", format=ScalarType.FLOAT64), - StructuredField(name="y", format=ScalarType.FLOAT64), - StructuredField(name="z", format=ScalarType.FLOAT64), - StructuredField(name="id", format=ScalarType.INT32), - StructuredField(name="valid", format=ScalarType.BOOL), - ] - structured_multi = StructuredType(fields=multi_fields) - result_multi = _get_np_datatype(structured_multi) - expected_multi = np_dtype( - [("x", "float64"), ("y", "float64"), ("z", "float64"), ("id", "int32"), ("valid", "bool")] - ) - - assert result_multi == expected_multi - assert isinstance(result_multi, np_dtype) - assert len(result_multi.names) == 5 - assert set(result_multi.names) == {"x", "y", "z", "id", "valid"} - - -def test__get_zarr_shape() -> None: +def test_get_zarr_shape() -> None: """Test for _get_zarr_shape function.""" d1 = NamedDimension(name="inline", size=100) d2 = NamedDimension(name="crossline", size=200) @@ -215,7 +163,7 @@ def test__get_zarr_shape() -> None: assert _get_zarr_shape(v2, all_named_dims) == (100, 200, 300) -def test__get_zarr_chunks() -> None: +def test_get_zarr_chunks() -> None: """Test for _get_zarr_chunks function.""" d1 = NamedDimension(name="inline", size=100) d2 = NamedDimension(name="crossline", size=200) @@ -241,7 +189,7 @@ def test__get_zarr_chunks() -> None: assert _get_zarr_chunks(v, all_named_dims=[d1, d2, d3]) == (100, 200, 300) -def test__get_fill_value() -> None: +def test_get_fill_value() -> None: """Test for _get_fill_value function.""" # Test 1: ScalarType cases - should return values from fill_value_map scalar_types = [ @@ -282,8 +230,8 @@ def test__get_fill_value() -> None: assert np_isnan(val.imag) # Test 2: StructuredType - f1 = StructuredField(name="cdp-x", format=ScalarType.INT32) - f2 = StructuredField(name="cdp-y", format=ScalarType.INT32) + f1 = StructuredField(name="cdp_x", format=ScalarType.INT32) + f2 = StructuredField(name="cdp_y", format=ScalarType.INT32) f3 = StructuredField(name="elevation", format=ScalarType.FLOAT16) f4 = StructuredField(name="some_scalar", format=ScalarType.FLOAT16) structured_type = StructuredType(fields=[f1, f2, f3, f4]) @@ -291,7 +239,7 @@ def test__get_fill_value() -> None: expected = np_array( (0, 0, 0.0, 0.0), dtype=np_dtype( - [("cdp-x", " None: assert result_none_input is None -def test__convert_compressor() -> None: +def test_convert_compressor() -> None: """Simple test for _convert_compressor function covering basic scenarios.""" # Test 1: None input - should return None result_none = _convert_compressor(None) @@ -393,7 +341,7 @@ def test_to_xarray_dataset(tmp_path: Path) -> None: xr_ds = to_xarray_dataset(dataset) file_path = output_path(tmp_path, f"{xr_ds.attrs['name']}", debugging=False) - to_zarr(xr_ds, file_path, mode="w") + xr_ds.to_zarr(store=file_path, mode="w", zarr_format=2, compute=False) def test_seismic_poststack_3d_acceptance_to_xarray_dataset(tmp_path: Path) -> None: @@ -403,14 +351,17 @@ def test_seismic_poststack_3d_acceptance_to_xarray_dataset(tmp_path: Path) -> No xr_ds = to_xarray_dataset(dataset) file_path = output_path(tmp_path, f"{xr_ds.attrs['name']}", debugging=False) - to_zarr(xr_ds, file_path, mode="w") + xr_ds.to_zarr(store=file_path, mode="w", zarr_format=2, compute=False) + +@pytest.mark.skip(reason="Bug reproducer for the issue 582") +def test_buf_reproducer_dask_to_zarr(tmp_path: Path) -> None: + """Bug reproducer for the issue https://github.com/TGSAI/mdio-python/issues/582.""" + # TODO(Dmitriy Repin): Remove this test after the bug is fixed + # https://github.com/TGSAI/mdio-python/issues/582 -@pytest.mark.skip(reason="Issues serializing dask arrays of structured types to dask.") -def test_to_zarr_dask(tmp_path: Path) -> None: - """Test writing XArray dataset with data as dask array to Zarr.""" # Create a data type and the fill value - dtype = np_dtype([("inline", "int32"), ("cdp-x", "float64")]) + dtype = np_dtype([("inline", "int32"), ("cdp_x", "float64")]) dtype_fill_value = np_zeros((), dtype=dtype) # Use '_FillValue' instead of 'fill_value' @@ -437,7 +388,7 @@ def test_to_zarr_from_zarr_zeros_1(tmp_path: Path) -> None: Set encoding in as DataArray attributes """ # Create a data type and the fill value - dtype = np_dtype([("inline", "int32"), ("cdp-x", "float64")]) + dtype = np_dtype([("inline", "int32"), ("cdp_x", "float64")]) dtype_fill_value = np_zeros((), dtype=dtype) # Use '_FillValue' instead of 'fill_value' @@ -463,7 +414,7 @@ def test_to_zarr_from_zarr_zeros_2(tmp_path: Path) -> None: Set encoding in the to_zar method """ # Create a data type and the fill value - dtype = np_dtype([("inline", "int32"), ("cdp-x", "float64")]) + dtype = np_dtype([("inline", "int32"), ("cdp_x", "float64")]) dtype_fill_value = np_zeros((), dtype=dtype) # Use '_FillValue' instead of 'fill_value' @@ -487,7 +438,7 @@ def test_to_zarr_from_zarr_zeros_2(tmp_path: Path) -> None: def test_to_zarr_from_np(tmp_path: Path) -> None: """Test writing XArray dataset with data as NumPy array to Zarr.""" # Create a data type and the fill value - dtype = np_dtype([("inline", "int32"), ("cdp-x", "float64")]) + dtype = np_dtype([("inline", "int32"), ("cdp_x", "float64")]) dtype_fill_value = np_zeros((), dtype=dtype) # Use '_FillValue' instead of 'fill_value' diff --git a/uv.lock b/uv.lock index 9ecc1d26f..9bb4ff529 100644 --- a/uv.lock +++ b/uv.lock @@ -733,23 +733,23 @@ wheels = [ [[package]] name = "debugpy" -version = "1.8.15" +version = "1.8.16" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/3a9a28ddb750a76eaec445c7f4d3147ea2c579a97dbd9e25d39001b92b21/debugpy-1.8.15.tar.gz", hash = "sha256:58d7a20b7773ab5ee6bdfb2e6cf622fdf1e40c9d5aef2857d85391526719ac00", size = 1643279, upload-time = "2025-07-15T16:43:29.135Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/d4/722d0bcc7986172ac2ef3c979ad56a1030e3afd44ced136d45f8142b1f4a/debugpy-1.8.16.tar.gz", hash = "sha256:31e69a1feb1cf6b51efbed3f6c9b0ef03bc46ff050679c4be7ea6d2e23540870", size = 1643809, upload-time = "2025-08-06T18:00:02.647Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/b3/1c44a2ed311199ab11c2299c9474a6c7cd80d19278defd333aeb7c287995/debugpy-1.8.15-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:babc4fb1962dd6a37e94d611280e3d0d11a1f5e6c72ac9b3d87a08212c4b6dd3", size = 2183442, upload-time = "2025-07-15T16:43:36.733Z" }, - { url = "https://files.pythonhosted.org/packages/f6/69/e2dcb721491e1c294d348681227c9b44fb95218f379aa88e12a19d85528d/debugpy-1.8.15-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f778e68f2986a58479d0ac4f643e0b8c82fdd97c2e200d4d61e7c2d13838eb53", size = 3134215, upload-time = "2025-07-15T16:43:38.116Z" }, - { url = "https://files.pythonhosted.org/packages/17/76/4ce63b95d8294dcf2fd1820860b300a420d077df4e93afcaa25a984c2ca7/debugpy-1.8.15-cp311-cp311-win32.whl", hash = "sha256:f9d1b5abd75cd965e2deabb1a06b0e93a1546f31f9f621d2705e78104377c702", size = 5154037, upload-time = "2025-07-15T16:43:39.471Z" }, - { url = "https://files.pythonhosted.org/packages/c2/a7/e5a7c784465eb9c976d84408873d597dc7ce74a0fc69ed009548a1a94813/debugpy-1.8.15-cp311-cp311-win_amd64.whl", hash = "sha256:62954fb904bec463e2b5a415777f6d1926c97febb08ef1694da0e5d1463c5c3b", size = 5178133, upload-time = "2025-07-15T16:43:40.969Z" }, - { url = "https://files.pythonhosted.org/packages/ab/4a/4508d256e52897f5cdfee6a6d7580974811e911c6d01321df3264508a5ac/debugpy-1.8.15-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:3dcc7225cb317469721ab5136cda9ff9c8b6e6fb43e87c9e15d5b108b99d01ba", size = 2511197, upload-time = "2025-07-15T16:43:42.343Z" }, - { url = "https://files.pythonhosted.org/packages/99/8d/7f6ef1097e7fecf26b4ef72338d08e41644a41b7ee958a19f494ffcffc29/debugpy-1.8.15-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:047a493ca93c85ccede1dbbaf4e66816794bdc214213dde41a9a61e42d27f8fc", size = 4229517, upload-time = "2025-07-15T16:43:44.14Z" }, - { url = "https://files.pythonhosted.org/packages/3f/e8/e8c6a9aa33a9c9c6dacbf31747384f6ed2adde4de2e9693c766bdf323aa3/debugpy-1.8.15-cp312-cp312-win32.whl", hash = "sha256:b08e9b0bc260cf324c890626961dad4ffd973f7568fbf57feb3c3a65ab6b6327", size = 5276132, upload-time = "2025-07-15T16:43:45.529Z" }, - { url = "https://files.pythonhosted.org/packages/e9/ad/231050c6177b3476b85fcea01e565dac83607b5233d003ff067e2ee44d8f/debugpy-1.8.15-cp312-cp312-win_amd64.whl", hash = "sha256:e2a4fe357c92334272eb2845fcfcdbec3ef9f22c16cf613c388ac0887aed15fa", size = 5317645, upload-time = "2025-07-15T16:43:46.968Z" }, - { url = "https://files.pythonhosted.org/packages/28/70/2928aad2310726d5920b18ed9f54b9f06df5aa4c10cf9b45fa18ff0ab7e8/debugpy-1.8.15-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:f5e01291ad7d6649aed5773256c5bba7a1a556196300232de1474c3c372592bf", size = 2495538, upload-time = "2025-07-15T16:43:48.927Z" }, - { url = "https://files.pythonhosted.org/packages/9e/c6/9b8ffb4ca91fac8b2877eef63c9cc0e87dd2570b1120054c272815ec4cd0/debugpy-1.8.15-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94dc0f0d00e528d915e0ce1c78e771475b2335b376c49afcc7382ee0b146bab6", size = 4221874, upload-time = "2025-07-15T16:43:50.282Z" }, - { url = "https://files.pythonhosted.org/packages/55/8a/9b8d59674b4bf489318c7c46a1aab58e606e583651438084b7e029bf3c43/debugpy-1.8.15-cp313-cp313-win32.whl", hash = "sha256:fcf0748d4f6e25f89dc5e013d1129ca6f26ad4da405e0723a4f704583896a709", size = 5275949, upload-time = "2025-07-15T16:43:52.079Z" }, - { url = "https://files.pythonhosted.org/packages/72/83/9e58e6fdfa8710a5e6ec06c2401241b9ad48b71c0a7eb99570a1f1edb1d3/debugpy-1.8.15-cp313-cp313-win_amd64.whl", hash = "sha256:73c943776cb83e36baf95e8f7f8da765896fd94b05991e7bc162456d25500683", size = 5317720, upload-time = "2025-07-15T16:43:53.703Z" }, - { url = "https://files.pythonhosted.org/packages/07/d5/98748d9860e767a1248b5e31ffa7ce8cb7006e97bf8abbf3d891d0a8ba4e/debugpy-1.8.15-py2.py3-none-any.whl", hash = "sha256:bce2e6c5ff4f2e00b98d45e7e01a49c7b489ff6df5f12d881c67d2f1ac635f3d", size = 5282697, upload-time = "2025-07-15T16:44:07.996Z" }, + { url = "https://files.pythonhosted.org/packages/63/d6/ad70ba8b49b23fa286fb21081cf732232cc19374af362051da9c7537ae52/debugpy-1.8.16-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:67371b28b79a6a12bcc027d94a06158f2fde223e35b5c4e0783b6f9d3b39274a", size = 2184063, upload-time = "2025-08-06T18:00:11.885Z" }, + { url = "https://files.pythonhosted.org/packages/aa/49/7b03e88dea9759a4c7910143f87f92beb494daaae25560184ff4ae883f9e/debugpy-1.8.16-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2abae6dd02523bec2dee16bd6b0781cccb53fd4995e5c71cc659b5f45581898", size = 3134837, upload-time = "2025-08-06T18:00:13.782Z" }, + { url = "https://files.pythonhosted.org/packages/5d/52/b348930316921de7565fbe37a487d15409041713004f3d74d03eb077dbd4/debugpy-1.8.16-cp311-cp311-win32.whl", hash = "sha256:f8340a3ac2ed4f5da59e064aa92e39edd52729a88fbde7bbaa54e08249a04493", size = 5159142, upload-time = "2025-08-06T18:00:15.391Z" }, + { url = "https://files.pythonhosted.org/packages/d8/ef/9aa9549ce1e10cea696d980292e71672a91ee4a6a691ce5f8629e8f48c49/debugpy-1.8.16-cp311-cp311-win_amd64.whl", hash = "sha256:70f5fcd6d4d0c150a878d2aa37391c52de788c3dc680b97bdb5e529cb80df87a", size = 5183117, upload-time = "2025-08-06T18:00:17.251Z" }, + { url = "https://files.pythonhosted.org/packages/61/fb/0387c0e108d842c902801bc65ccc53e5b91d8c169702a9bbf4f7efcedf0c/debugpy-1.8.16-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:b202e2843e32e80b3b584bcebfe0e65e0392920dc70df11b2bfe1afcb7a085e4", size = 2511822, upload-time = "2025-08-06T18:00:18.526Z" }, + { url = "https://files.pythonhosted.org/packages/37/44/19e02745cae22bf96440141f94e15a69a1afaa3a64ddfc38004668fcdebf/debugpy-1.8.16-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64473c4a306ba11a99fe0bb14622ba4fbd943eb004847d9b69b107bde45aa9ea", size = 4230135, upload-time = "2025-08-06T18:00:19.997Z" }, + { url = "https://files.pythonhosted.org/packages/f3/0b/19b1ba5ee4412f303475a2c7ad5858efb99c90eae5ec627aa6275c439957/debugpy-1.8.16-cp312-cp312-win32.whl", hash = "sha256:833a61ed446426e38b0dd8be3e9d45ae285d424f5bf6cd5b2b559c8f12305508", size = 5281271, upload-time = "2025-08-06T18:00:21.281Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e0/bc62e2dc141de53bd03e2c7cb9d7011de2e65e8bdcdaa26703e4d28656ba/debugpy-1.8.16-cp312-cp312-win_amd64.whl", hash = "sha256:75f204684581e9ef3dc2f67687c3c8c183fde2d6675ab131d94084baf8084121", size = 5323149, upload-time = "2025-08-06T18:00:23.033Z" }, + { url = "https://files.pythonhosted.org/packages/62/66/607ab45cc79e60624df386e233ab64a6d8d39ea02e7f80e19c1d451345bb/debugpy-1.8.16-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:85df3adb1de5258dca910ae0bb185e48c98801ec15018a263a92bb06be1c8787", size = 2496157, upload-time = "2025-08-06T18:00:24.361Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a0/c95baae08a75bceabb79868d663a0736655e427ab9c81fb848da29edaeac/debugpy-1.8.16-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee89e948bc236a5c43c4214ac62d28b29388453f5fd328d739035e205365f0b", size = 4222491, upload-time = "2025-08-06T18:00:25.806Z" }, + { url = "https://files.pythonhosted.org/packages/5b/2f/1c8db6ddd8a257c3cd2c46413b267f1d5fa3df910401c899513ce30392d6/debugpy-1.8.16-cp313-cp313-win32.whl", hash = "sha256:cf358066650439847ec5ff3dae1da98b5461ea5da0173d93d5e10f477c94609a", size = 5281126, upload-time = "2025-08-06T18:00:27.207Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ba/c3e154ab307366d6c5a9c1b68de04914e2ce7fa2f50d578311d8cc5074b2/debugpy-1.8.16-cp313-cp313-win_amd64.whl", hash = "sha256:b5aea1083f6f50023e8509399d7dc6535a351cc9f2e8827d1e093175e4d9fa4c", size = 5323094, upload-time = "2025-08-06T18:00:29.03Z" }, + { url = "https://files.pythonhosted.org/packages/52/57/ecc9ae29fa5b2d90107cd1d9bf8ed19aacb74b2264d986ae9d44fe9bdf87/debugpy-1.8.16-py2.py3-none-any.whl", hash = "sha256:19c9521962475b87da6f673514f7fd610328757ec993bf7ec0d8c96f9a325f9e", size = 5287700, upload-time = "2025-08-06T18:00:42.333Z" }, ] [[package]] @@ -1126,37 +1126,37 @@ wheels = [ [[package]] name = "greenlet" -version = "3.2.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c9/92/bb85bd6e80148a4d2e0c59f7c0c2891029f8fd510183afc7d8d2feeed9b6/greenlet-3.2.3.tar.gz", hash = "sha256:8b0dd8ae4c0d6f5e54ee55ba935eeb3d735a9b58a8a1e5b5cbab64e01a39f365", size = 185752, upload-time = "2025-06-05T16:16:09.955Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/2e/d4fcb2978f826358b673f779f78fa8a32ee37df11920dc2bb5589cbeecef/greenlet-3.2.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:784ae58bba89fa1fa5733d170d42486580cab9decda3484779f4759345b29822", size = 270219, upload-time = "2025-06-05T16:10:10.414Z" }, - { url = "https://files.pythonhosted.org/packages/16/24/929f853e0202130e4fe163bc1d05a671ce8dcd604f790e14896adac43a52/greenlet-3.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0921ac4ea42a5315d3446120ad48f90c3a6b9bb93dd9b3cf4e4d84a66e42de83", size = 630383, upload-time = "2025-06-05T16:38:51.785Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b2/0320715eb61ae70c25ceca2f1d5ae620477d246692d9cc284c13242ec31c/greenlet-3.2.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:d2971d93bb99e05f8c2c0c2f4aa9484a18d98c4c3bd3c62b65b7e6ae33dfcfaf", size = 642422, upload-time = "2025-06-05T16:41:35.259Z" }, - { url = "https://files.pythonhosted.org/packages/bd/49/445fd1a210f4747fedf77615d941444349c6a3a4a1135bba9701337cd966/greenlet-3.2.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c667c0bf9d406b77a15c924ef3285e1e05250948001220368e039b6aa5b5034b", size = 638375, upload-time = "2025-06-05T16:48:18.235Z" }, - { url = "https://files.pythonhosted.org/packages/7e/c8/ca19760cf6eae75fa8dc32b487e963d863b3ee04a7637da77b616703bc37/greenlet-3.2.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:592c12fb1165be74592f5de0d70f82bc5ba552ac44800d632214b76089945147", size = 637627, upload-time = "2025-06-05T16:13:02.858Z" }, - { url = "https://files.pythonhosted.org/packages/65/89/77acf9e3da38e9bcfca881e43b02ed467c1dedc387021fc4d9bd9928afb8/greenlet-3.2.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29e184536ba333003540790ba29829ac14bb645514fbd7e32af331e8202a62a5", size = 585502, upload-time = "2025-06-05T16:12:49.642Z" }, - { url = "https://files.pythonhosted.org/packages/97/c6/ae244d7c95b23b7130136e07a9cc5aadd60d59b5951180dc7dc7e8edaba7/greenlet-3.2.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:93c0bb79844a367782ec4f429d07589417052e621aa39a5ac1fb99c5aa308edc", size = 1114498, upload-time = "2025-06-05T16:36:46.598Z" }, - { url = "https://files.pythonhosted.org/packages/89/5f/b16dec0cbfd3070658e0d744487919740c6d45eb90946f6787689a7efbce/greenlet-3.2.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:751261fc5ad7b6705f5f76726567375bb2104a059454e0226e1eef6c756748ba", size = 1139977, upload-time = "2025-06-05T16:12:38.262Z" }, - { url = "https://files.pythonhosted.org/packages/66/77/d48fb441b5a71125bcac042fc5b1494c806ccb9a1432ecaa421e72157f77/greenlet-3.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:83a8761c75312361aa2b5b903b79da97f13f556164a7dd2d5448655425bd4c34", size = 297017, upload-time = "2025-06-05T16:25:05.225Z" }, - { url = "https://files.pythonhosted.org/packages/f3/94/ad0d435f7c48debe960c53b8f60fb41c2026b1d0fa4a99a1cb17c3461e09/greenlet-3.2.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:25ad29caed5783d4bd7a85c9251c651696164622494c00802a139c00d639242d", size = 271992, upload-time = "2025-06-05T16:11:23.467Z" }, - { url = "https://files.pythonhosted.org/packages/93/5d/7c27cf4d003d6e77749d299c7c8f5fd50b4f251647b5c2e97e1f20da0ab5/greenlet-3.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88cd97bf37fe24a6710ec6a3a7799f3f81d9cd33317dcf565ff9950c83f55e0b", size = 638820, upload-time = "2025-06-05T16:38:52.882Z" }, - { url = "https://files.pythonhosted.org/packages/c6/7e/807e1e9be07a125bb4c169144937910bf59b9d2f6d931578e57f0bce0ae2/greenlet-3.2.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:baeedccca94880d2f5666b4fa16fc20ef50ba1ee353ee2d7092b383a243b0b0d", size = 653046, upload-time = "2025-06-05T16:41:36.343Z" }, - { url = "https://files.pythonhosted.org/packages/9d/ab/158c1a4ea1068bdbc78dba5a3de57e4c7aeb4e7fa034320ea94c688bfb61/greenlet-3.2.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:be52af4b6292baecfa0f397f3edb3c6092ce071b499dd6fe292c9ac9f2c8f264", size = 647701, upload-time = "2025-06-05T16:48:19.604Z" }, - { url = "https://files.pythonhosted.org/packages/cc/0d/93729068259b550d6a0288da4ff72b86ed05626eaf1eb7c0d3466a2571de/greenlet-3.2.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0cc73378150b8b78b0c9fe2ce56e166695e67478550769536a6742dca3651688", size = 649747, upload-time = "2025-06-05T16:13:04.628Z" }, - { url = "https://files.pythonhosted.org/packages/f6/f6/c82ac1851c60851302d8581680573245c8fc300253fc1ff741ae74a6c24d/greenlet-3.2.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:706d016a03e78df129f68c4c9b4c4f963f7d73534e48a24f5f5a7101ed13dbbb", size = 605461, upload-time = "2025-06-05T16:12:50.792Z" }, - { url = "https://files.pythonhosted.org/packages/98/82/d022cf25ca39cf1200650fc58c52af32c90f80479c25d1cbf57980ec3065/greenlet-3.2.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:419e60f80709510c343c57b4bb5a339d8767bf9aef9b8ce43f4f143240f88b7c", size = 1121190, upload-time = "2025-06-05T16:36:48.59Z" }, - { url = "https://files.pythonhosted.org/packages/f5/e1/25297f70717abe8104c20ecf7af0a5b82d2f5a980eb1ac79f65654799f9f/greenlet-3.2.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:93d48533fade144203816783373f27a97e4193177ebaaf0fc396db19e5d61163", size = 1149055, upload-time = "2025-06-05T16:12:40.457Z" }, - { url = "https://files.pythonhosted.org/packages/1f/8f/8f9e56c5e82eb2c26e8cde787962e66494312dc8cb261c460e1f3a9c88bc/greenlet-3.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:7454d37c740bb27bdeddfc3f358f26956a07d5220818ceb467a483197d84f849", size = 297817, upload-time = "2025-06-05T16:29:49.244Z" }, - { url = "https://files.pythonhosted.org/packages/b1/cf/f5c0b23309070ae93de75c90d29300751a5aacefc0a3ed1b1d8edb28f08b/greenlet-3.2.3-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:500b8689aa9dd1ab26872a34084503aeddefcb438e2e7317b89b11eaea1901ad", size = 270732, upload-time = "2025-06-05T16:10:08.26Z" }, - { url = "https://files.pythonhosted.org/packages/48/ae/91a957ba60482d3fecf9be49bc3948f341d706b52ddb9d83a70d42abd498/greenlet-3.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a07d3472c2a93117af3b0136f246b2833fdc0b542d4a9799ae5f41c28323faef", size = 639033, upload-time = "2025-06-05T16:38:53.983Z" }, - { url = "https://files.pythonhosted.org/packages/6f/df/20ffa66dd5a7a7beffa6451bdb7400d66251374ab40b99981478c69a67a8/greenlet-3.2.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:8704b3768d2f51150626962f4b9a9e4a17d2e37c8a8d9867bbd9fa4eb938d3b3", size = 652999, upload-time = "2025-06-05T16:41:37.89Z" }, - { url = "https://files.pythonhosted.org/packages/51/b4/ebb2c8cb41e521f1d72bf0465f2f9a2fd803f674a88db228887e6847077e/greenlet-3.2.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5035d77a27b7c62db6cf41cf786cfe2242644a7a337a0e155c80960598baab95", size = 647368, upload-time = "2025-06-05T16:48:21.467Z" }, - { url = "https://files.pythonhosted.org/packages/8e/6a/1e1b5aa10dced4ae876a322155705257748108b7fd2e4fae3f2a091fe81a/greenlet-3.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2d8aa5423cd4a396792f6d4580f88bdc6efcb9205891c9d40d20f6e670992efb", size = 650037, upload-time = "2025-06-05T16:13:06.402Z" }, - { url = "https://files.pythonhosted.org/packages/26/f2/ad51331a157c7015c675702e2d5230c243695c788f8f75feba1af32b3617/greenlet-3.2.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2c724620a101f8170065d7dded3f962a2aea7a7dae133a009cada42847e04a7b", size = 608402, upload-time = "2025-06-05T16:12:51.91Z" }, - { url = "https://files.pythonhosted.org/packages/26/bc/862bd2083e6b3aff23300900a956f4ea9a4059de337f5c8734346b9b34fc/greenlet-3.2.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:873abe55f134c48e1f2a6f53f7d1419192a3d1a4e873bace00499a4e45ea6af0", size = 1119577, upload-time = "2025-06-05T16:36:49.787Z" }, - { url = "https://files.pythonhosted.org/packages/86/94/1fc0cc068cfde885170e01de40a619b00eaa8f2916bf3541744730ffb4c3/greenlet-3.2.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:024571bbce5f2c1cfff08bf3fbaa43bbc7444f580ae13b0099e95d0e6e67ed36", size = 1147121, upload-time = "2025-06-05T16:12:42.527Z" }, - { url = "https://files.pythonhosted.org/packages/27/1a/199f9587e8cb08a0658f9c30f3799244307614148ffe8b1e3aa22f324dea/greenlet-3.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5195fb1e75e592dd04ce79881c8a22becdfa3e6f500e7feb059b1e6fdd54d3e3", size = 297603, upload-time = "2025-06-05T16:20:12.651Z" }, +version = "3.2.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/b8/704d753a5a45507a7aab61f18db9509302ed3d0a27ac7e0359ec2905b1a6/greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d", size = 188260, upload-time = "2025-08-07T13:24:33.51Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/de/f28ced0a67749cac23fecb02b694f6473f47686dff6afaa211d186e2ef9c/greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2", size = 272305, upload-time = "2025-08-07T13:15:41.288Z" }, + { url = "https://files.pythonhosted.org/packages/09/16/2c3792cba130000bf2a31c5272999113f4764fd9d874fb257ff588ac779a/greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246", size = 632472, upload-time = "2025-08-07T13:42:55.044Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8f/95d48d7e3d433e6dae5b1682e4292242a53f22df82e6d3dda81b1701a960/greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3", size = 644646, upload-time = "2025-08-07T13:45:26.523Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5e/405965351aef8c76b8ef7ad370e5da58d57ef6068df197548b015464001a/greenlet-3.2.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633", size = 640519, upload-time = "2025-08-07T13:53:13.928Z" }, + { url = "https://files.pythonhosted.org/packages/25/5d/382753b52006ce0218297ec1b628e048c4e64b155379331f25a7316eb749/greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079", size = 639707, upload-time = "2025-08-07T13:18:27.146Z" }, + { url = "https://files.pythonhosted.org/packages/1f/8e/abdd3f14d735b2929290a018ecf133c901be4874b858dd1c604b9319f064/greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8", size = 587684, upload-time = "2025-08-07T13:18:25.164Z" }, + { url = "https://files.pythonhosted.org/packages/5d/65/deb2a69c3e5996439b0176f6651e0052542bb6c8f8ec2e3fba97c9768805/greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52", size = 1116647, upload-time = "2025-08-07T13:42:38.655Z" }, + { url = "https://files.pythonhosted.org/packages/3f/cc/b07000438a29ac5cfb2194bfc128151d52f333cee74dd7dfe3fb733fc16c/greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa", size = 1142073, upload-time = "2025-08-07T13:18:21.737Z" }, + { url = "https://files.pythonhosted.org/packages/d8/0f/30aef242fcab550b0b3520b8e3561156857c94288f0332a79928c31a52cf/greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9", size = 299100, upload-time = "2025-08-07T13:44:12.287Z" }, + { url = "https://files.pythonhosted.org/packages/44/69/9b804adb5fd0671f367781560eb5eb586c4d495277c93bde4307b9e28068/greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd", size = 274079, upload-time = "2025-08-07T13:15:45.033Z" }, + { url = "https://files.pythonhosted.org/packages/46/e9/d2a80c99f19a153eff70bc451ab78615583b8dac0754cfb942223d2c1a0d/greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb", size = 640997, upload-time = "2025-08-07T13:42:56.234Z" }, + { url = "https://files.pythonhosted.org/packages/3b/16/035dcfcc48715ccd345f3a93183267167cdd162ad123cd93067d86f27ce4/greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968", size = 655185, upload-time = "2025-08-07T13:45:27.624Z" }, + { url = "https://files.pythonhosted.org/packages/31/da/0386695eef69ffae1ad726881571dfe28b41970173947e7c558d9998de0f/greenlet-3.2.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9", size = 649926, upload-time = "2025-08-07T13:53:15.251Z" }, + { url = "https://files.pythonhosted.org/packages/68/88/69bf19fd4dc19981928ceacbc5fd4bb6bc2215d53199e367832e98d1d8fe/greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6", size = 651839, upload-time = "2025-08-07T13:18:30.281Z" }, + { url = "https://files.pythonhosted.org/packages/19/0d/6660d55f7373b2ff8152401a83e02084956da23ae58cddbfb0b330978fe9/greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0", size = 607586, upload-time = "2025-08-07T13:18:28.544Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1a/c953fdedd22d81ee4629afbb38d2f9d71e37d23caace44775a3a969147d4/greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0", size = 1123281, upload-time = "2025-08-07T13:42:39.858Z" }, + { url = "https://files.pythonhosted.org/packages/3f/c7/12381b18e21aef2c6bd3a636da1088b888b97b7a0362fac2e4de92405f97/greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f", size = 1151142, upload-time = "2025-08-07T13:18:22.981Z" }, + { url = "https://files.pythonhosted.org/packages/e9/08/b0814846b79399e585f974bbeebf5580fbe59e258ea7be64d9dfb253c84f/greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02", size = 299899, upload-time = "2025-08-07T13:38:53.448Z" }, + { url = "https://files.pythonhosted.org/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", size = 272814, upload-time = "2025-08-07T13:15:50.011Z" }, + { url = "https://files.pythonhosted.org/packages/62/dd/b9f59862e9e257a16e4e610480cfffd29e3fae018a68c2332090b53aac3d/greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", size = 641073, upload-time = "2025-08-07T13:42:57.23Z" }, + { url = "https://files.pythonhosted.org/packages/f7/0b/bc13f787394920b23073ca3b6c4a7a21396301ed75a655bcb47196b50e6e/greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc", size = 655191, upload-time = "2025-08-07T13:45:29.752Z" }, + { url = "https://files.pythonhosted.org/packages/f2/d6/6adde57d1345a8d0f14d31e4ab9c23cfe8e2cd39c3baf7674b4b0338d266/greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a", size = 649516, upload-time = "2025-08-07T13:53:16.314Z" }, + { url = "https://files.pythonhosted.org/packages/7f/3b/3a3328a788d4a473889a2d403199932be55b1b0060f4ddd96ee7cdfcad10/greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504", size = 652169, upload-time = "2025-08-07T13:18:32.861Z" }, + { url = "https://files.pythonhosted.org/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", size = 610497, upload-time = "2025-08-07T13:18:31.636Z" }, + { url = "https://files.pythonhosted.org/packages/b8/19/06b6cf5d604e2c382a6f31cafafd6f33d5dea706f4db7bdab184bad2b21d/greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", size = 1121662, upload-time = "2025-08-07T13:42:41.117Z" }, + { url = "https://files.pythonhosted.org/packages/a2/15/0d5e4e1a66fab130d98168fe984c509249c833c1a3c16806b90f253ce7b9/greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae", size = 1149210, upload-time = "2025-08-07T13:18:24.072Z" }, + { url = "https://files.pythonhosted.org/packages/0b/55/2321e43595e6801e105fcfdee02b34c0f996eb71e6ddffca6b10b7e1d771/greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b", size = 299685, upload-time = "2025-08-07T13:24:38.824Z" }, ] [[package]] @@ -2819,76 +2819,81 @@ wheels = [ [[package]] name = "rpds-py" -version = "0.26.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/aa/4456d84bbb54adc6a916fb10c9b374f78ac840337644e4a5eda229c81275/rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0", size = 27385, upload-time = "2025-07-01T15:57:13.958Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/09/4c/4ee8f7e512030ff79fda1df3243c88d70fc874634e2dbe5df13ba4210078/rpds_py-0.26.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9e8cb77286025bdb21be2941d64ac6ca016130bfdcd228739e8ab137eb4406ed", size = 372610, upload-time = "2025-07-01T15:53:58.844Z" }, - { url = "https://files.pythonhosted.org/packages/fa/9d/3dc16be00f14fc1f03c71b1d67c8df98263ab2710a2fbd65a6193214a527/rpds_py-0.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e09330b21d98adc8ccb2dbb9fc6cb434e8908d4c119aeaa772cb1caab5440a0", size = 358032, upload-time = "2025-07-01T15:53:59.985Z" }, - { url = "https://files.pythonhosted.org/packages/e7/5a/7f1bf8f045da2866324a08ae80af63e64e7bfaf83bd31f865a7b91a58601/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9c1b92b774b2e68d11193dc39620d62fd8ab33f0a3c77ecdabe19c179cdbc1", size = 381525, upload-time = "2025-07-01T15:54:01.162Z" }, - { url = "https://files.pythonhosted.org/packages/45/8a/04479398c755a066ace10e3d158866beb600867cacae194c50ffa783abd0/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:824e6d3503ab990d7090768e4dfd9e840837bae057f212ff9f4f05ec6d1975e7", size = 397089, upload-time = "2025-07-01T15:54:02.319Z" }, - { url = "https://files.pythonhosted.org/packages/72/88/9203f47268db488a1b6d469d69c12201ede776bb728b9d9f29dbfd7df406/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ad7fd2258228bf288f2331f0a6148ad0186b2e3643055ed0db30990e59817a6", size = 514255, upload-time = "2025-07-01T15:54:03.38Z" }, - { url = "https://files.pythonhosted.org/packages/f5/b4/01ce5d1e853ddf81fbbd4311ab1eff0b3cf162d559288d10fd127e2588b5/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dc23bbb3e06ec1ea72d515fb572c1fea59695aefbffb106501138762e1e915e", size = 402283, upload-time = "2025-07-01T15:54:04.923Z" }, - { url = "https://files.pythonhosted.org/packages/34/a2/004c99936997bfc644d590a9defd9e9c93f8286568f9c16cdaf3e14429a7/rpds_py-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d80bf832ac7b1920ee29a426cdca335f96a2b5caa839811803e999b41ba9030d", size = 383881, upload-time = "2025-07-01T15:54:06.482Z" }, - { url = "https://files.pythonhosted.org/packages/05/1b/ef5fba4a8f81ce04c427bfd96223f92f05e6cd72291ce9d7523db3b03a6c/rpds_py-0.26.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0919f38f5542c0a87e7b4afcafab6fd2c15386632d249e9a087498571250abe3", size = 415822, upload-time = "2025-07-01T15:54:07.605Z" }, - { url = "https://files.pythonhosted.org/packages/16/80/5c54195aec456b292f7bd8aa61741c8232964063fd8a75fdde9c1e982328/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d422b945683e409000c888e384546dbab9009bb92f7c0b456e217988cf316107", size = 558347, upload-time = "2025-07-01T15:54:08.591Z" }, - { url = "https://files.pythonhosted.org/packages/f2/1c/1845c1b1fd6d827187c43afe1841d91678d7241cbdb5420a4c6de180a538/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a7711fa562ba2da1aa757e11024ad6d93bad6ad7ede5afb9af144623e5f76a", size = 587956, upload-time = "2025-07-01T15:54:09.963Z" }, - { url = "https://files.pythonhosted.org/packages/2e/ff/9e979329dd131aa73a438c077252ddabd7df6d1a7ad7b9aacf6261f10faa/rpds_py-0.26.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238e8c8610cb7c29460e37184f6799547f7e09e6a9bdbdab4e8edb90986a2318", size = 554363, upload-time = "2025-07-01T15:54:11.073Z" }, - { url = "https://files.pythonhosted.org/packages/00/8b/d78cfe034b71ffbe72873a136e71acc7a831a03e37771cfe59f33f6de8a2/rpds_py-0.26.0-cp311-cp311-win32.whl", hash = "sha256:893b022bfbdf26d7bedb083efeea624e8550ca6eb98bf7fea30211ce95b9201a", size = 220123, upload-time = "2025-07-01T15:54:12.382Z" }, - { url = "https://files.pythonhosted.org/packages/94/c1/3c8c94c7dd3905dbfde768381ce98778500a80db9924731d87ddcdb117e9/rpds_py-0.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:87a5531de9f71aceb8af041d72fc4cab4943648d91875ed56d2e629bef6d4c03", size = 231732, upload-time = "2025-07-01T15:54:13.434Z" }, - { url = "https://files.pythonhosted.org/packages/67/93/e936fbed1b734eabf36ccb5d93c6a2e9246fbb13c1da011624b7286fae3e/rpds_py-0.26.0-cp311-cp311-win_arm64.whl", hash = "sha256:de2713f48c1ad57f89ac25b3cb7daed2156d8e822cf0eca9b96a6f990718cc41", size = 221917, upload-time = "2025-07-01T15:54:14.559Z" }, - { url = "https://files.pythonhosted.org/packages/ea/86/90eb87c6f87085868bd077c7a9938006eb1ce19ed4d06944a90d3560fce2/rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d", size = 363933, upload-time = "2025-07-01T15:54:15.734Z" }, - { url = "https://files.pythonhosted.org/packages/63/78/4469f24d34636242c924626082b9586f064ada0b5dbb1e9d096ee7a8e0c6/rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136", size = 350447, upload-time = "2025-07-01T15:54:16.922Z" }, - { url = "https://files.pythonhosted.org/packages/ad/91/c448ed45efdfdade82348d5e7995e15612754826ea640afc20915119734f/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582", size = 384711, upload-time = "2025-07-01T15:54:18.101Z" }, - { url = "https://files.pythonhosted.org/packages/ec/43/e5c86fef4be7f49828bdd4ecc8931f0287b1152c0bb0163049b3218740e7/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e", size = 400865, upload-time = "2025-07-01T15:54:19.295Z" }, - { url = "https://files.pythonhosted.org/packages/55/34/e00f726a4d44f22d5c5fe2e5ddd3ac3d7fd3f74a175607781fbdd06fe375/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15", size = 517763, upload-time = "2025-07-01T15:54:20.858Z" }, - { url = "https://files.pythonhosted.org/packages/52/1c/52dc20c31b147af724b16104500fba13e60123ea0334beba7b40e33354b4/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8", size = 406651, upload-time = "2025-07-01T15:54:22.508Z" }, - { url = "https://files.pythonhosted.org/packages/2e/77/87d7bfabfc4e821caa35481a2ff6ae0b73e6a391bb6b343db2c91c2b9844/rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a", size = 386079, upload-time = "2025-07-01T15:54:23.987Z" }, - { url = "https://files.pythonhosted.org/packages/e3/d4/7f2200c2d3ee145b65b3cddc4310d51f7da6a26634f3ac87125fd789152a/rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323", size = 421379, upload-time = "2025-07-01T15:54:25.073Z" }, - { url = "https://files.pythonhosted.org/packages/ae/13/9fdd428b9c820869924ab62236b8688b122baa22d23efdd1c566938a39ba/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158", size = 562033, upload-time = "2025-07-01T15:54:26.225Z" }, - { url = "https://files.pythonhosted.org/packages/f3/e1/b69686c3bcbe775abac3a4c1c30a164a2076d28df7926041f6c0eb5e8d28/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3", size = 591639, upload-time = "2025-07-01T15:54:27.424Z" }, - { url = "https://files.pythonhosted.org/packages/5c/c9/1e3d8c8863c84a90197ac577bbc3d796a92502124c27092413426f670990/rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2", size = 557105, upload-time = "2025-07-01T15:54:29.93Z" }, - { url = "https://files.pythonhosted.org/packages/9f/c5/90c569649057622959f6dcc40f7b516539608a414dfd54b8d77e3b201ac0/rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44", size = 223272, upload-time = "2025-07-01T15:54:31.128Z" }, - { url = "https://files.pythonhosted.org/packages/7d/16/19f5d9f2a556cfed454eebe4d354c38d51c20f3db69e7b4ce6cff904905d/rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c", size = 234995, upload-time = "2025-07-01T15:54:32.195Z" }, - { url = "https://files.pythonhosted.org/packages/83/f0/7935e40b529c0e752dfaa7880224771b51175fce08b41ab4a92eb2fbdc7f/rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8", size = 223198, upload-time = "2025-07-01T15:54:33.271Z" }, - { url = "https://files.pythonhosted.org/packages/6a/67/bb62d0109493b12b1c6ab00de7a5566aa84c0e44217c2d94bee1bd370da9/rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d", size = 363917, upload-time = "2025-07-01T15:54:34.755Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f3/34e6ae1925a5706c0f002a8d2d7f172373b855768149796af87bd65dcdb9/rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1", size = 350073, upload-time = "2025-07-01T15:54:36.292Z" }, - { url = "https://files.pythonhosted.org/packages/75/83/1953a9d4f4e4de7fd0533733e041c28135f3c21485faaef56a8aadbd96b5/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e", size = 384214, upload-time = "2025-07-01T15:54:37.469Z" }, - { url = "https://files.pythonhosted.org/packages/48/0e/983ed1b792b3322ea1d065e67f4b230f3b96025f5ce3878cc40af09b7533/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1", size = 400113, upload-time = "2025-07-01T15:54:38.954Z" }, - { url = "https://files.pythonhosted.org/packages/69/7f/36c0925fff6f660a80be259c5b4f5e53a16851f946eb080351d057698528/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9", size = 515189, upload-time = "2025-07-01T15:54:40.57Z" }, - { url = "https://files.pythonhosted.org/packages/13/45/cbf07fc03ba7a9b54662c9badb58294ecfb24f828b9732970bd1a431ed5c/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7", size = 406998, upload-time = "2025-07-01T15:54:43.025Z" }, - { url = "https://files.pythonhosted.org/packages/6c/b0/8fa5e36e58657997873fd6a1cf621285ca822ca75b4b3434ead047daa307/rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04", size = 385903, upload-time = "2025-07-01T15:54:44.752Z" }, - { url = "https://files.pythonhosted.org/packages/4b/f7/b25437772f9f57d7a9fbd73ed86d0dcd76b4c7c6998348c070d90f23e315/rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1", size = 419785, upload-time = "2025-07-01T15:54:46.043Z" }, - { url = "https://files.pythonhosted.org/packages/a7/6b/63ffa55743dfcb4baf2e9e77a0b11f7f97ed96a54558fcb5717a4b2cd732/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9", size = 561329, upload-time = "2025-07-01T15:54:47.64Z" }, - { url = "https://files.pythonhosted.org/packages/2f/07/1f4f5e2886c480a2346b1e6759c00278b8a69e697ae952d82ae2e6ee5db0/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9", size = 590875, upload-time = "2025-07-01T15:54:48.9Z" }, - { url = "https://files.pythonhosted.org/packages/cc/bc/e6639f1b91c3a55f8c41b47d73e6307051b6e246254a827ede730624c0f8/rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba", size = 556636, upload-time = "2025-07-01T15:54:50.619Z" }, - { url = "https://files.pythonhosted.org/packages/05/4c/b3917c45566f9f9a209d38d9b54a1833f2bb1032a3e04c66f75726f28876/rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b", size = 222663, upload-time = "2025-07-01T15:54:52.023Z" }, - { url = "https://files.pythonhosted.org/packages/e0/0b/0851bdd6025775aaa2365bb8de0697ee2558184c800bfef8d7aef5ccde58/rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5", size = 234428, upload-time = "2025-07-01T15:54:53.692Z" }, - { url = "https://files.pythonhosted.org/packages/ed/e8/a47c64ed53149c75fb581e14a237b7b7cd18217e969c30d474d335105622/rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256", size = 222571, upload-time = "2025-07-01T15:54:54.822Z" }, - { url = "https://files.pythonhosted.org/packages/89/bf/3d970ba2e2bcd17d2912cb42874107390f72873e38e79267224110de5e61/rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618", size = 360475, upload-time = "2025-07-01T15:54:56.228Z" }, - { url = "https://files.pythonhosted.org/packages/82/9f/283e7e2979fc4ec2d8ecee506d5a3675fce5ed9b4b7cb387ea5d37c2f18d/rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35", size = 346692, upload-time = "2025-07-01T15:54:58.561Z" }, - { url = "https://files.pythonhosted.org/packages/e3/03/7e50423c04d78daf391da3cc4330bdb97042fc192a58b186f2d5deb7befd/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f", size = 379415, upload-time = "2025-07-01T15:54:59.751Z" }, - { url = "https://files.pythonhosted.org/packages/57/00/d11ee60d4d3b16808432417951c63df803afb0e0fc672b5e8d07e9edaaae/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83", size = 391783, upload-time = "2025-07-01T15:55:00.898Z" }, - { url = "https://files.pythonhosted.org/packages/08/b3/1069c394d9c0d6d23c5b522e1f6546b65793a22950f6e0210adcc6f97c3e/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1", size = 512844, upload-time = "2025-07-01T15:55:02.201Z" }, - { url = "https://files.pythonhosted.org/packages/08/3b/c4fbf0926800ed70b2c245ceca99c49f066456755f5d6eb8863c2c51e6d0/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8", size = 402105, upload-time = "2025-07-01T15:55:03.698Z" }, - { url = "https://files.pythonhosted.org/packages/1c/b0/db69b52ca07413e568dae9dc674627a22297abb144c4d6022c6d78f1e5cc/rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f", size = 383440, upload-time = "2025-07-01T15:55:05.398Z" }, - { url = "https://files.pythonhosted.org/packages/4c/e1/c65255ad5b63903e56b3bb3ff9dcc3f4f5c3badde5d08c741ee03903e951/rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed", size = 412759, upload-time = "2025-07-01T15:55:08.316Z" }, - { url = "https://files.pythonhosted.org/packages/e4/22/bb731077872377a93c6e93b8a9487d0406c70208985831034ccdeed39c8e/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632", size = 556032, upload-time = "2025-07-01T15:55:09.52Z" }, - { url = "https://files.pythonhosted.org/packages/e0/8b/393322ce7bac5c4530fb96fc79cc9ea2f83e968ff5f6e873f905c493e1c4/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c", size = 585416, upload-time = "2025-07-01T15:55:11.216Z" }, - { url = "https://files.pythonhosted.org/packages/49/ae/769dc372211835bf759319a7aae70525c6eb523e3371842c65b7ef41c9c6/rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0", size = 554049, upload-time = "2025-07-01T15:55:13.004Z" }, - { url = "https://files.pythonhosted.org/packages/6b/f9/4c43f9cc203d6ba44ce3146246cdc38619d92c7bd7bad4946a3491bd5b70/rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9", size = 218428, upload-time = "2025-07-01T15:55:14.486Z" }, - { url = "https://files.pythonhosted.org/packages/7e/8b/9286b7e822036a4a977f2f1e851c7345c20528dbd56b687bb67ed68a8ede/rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9", size = 231524, upload-time = "2025-07-01T15:55:15.745Z" }, - { url = "https://files.pythonhosted.org/packages/51/f2/b5c85b758a00c513bb0389f8fc8e61eb5423050c91c958cdd21843faa3e6/rpds_py-0.26.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f61a9326f80ca59214d1cceb0a09bb2ece5b2563d4e0cd37bfd5515c28510674", size = 373505, upload-time = "2025-07-01T15:56:34.716Z" }, - { url = "https://files.pythonhosted.org/packages/23/e0/25db45e391251118e915e541995bb5f5ac5691a3b98fb233020ba53afc9b/rpds_py-0.26.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:183f857a53bcf4b1b42ef0f57ca553ab56bdd170e49d8091e96c51c3d69ca696", size = 359468, upload-time = "2025-07-01T15:56:36.219Z" }, - { url = "https://files.pythonhosted.org/packages/0b/73/dd5ee6075bb6491be3a646b301dfd814f9486d924137a5098e61f0487e16/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:941c1cfdf4799d623cf3aa1d326a6b4fdb7a5799ee2687f3516738216d2262fb", size = 382680, upload-time = "2025-07-01T15:56:37.644Z" }, - { url = "https://files.pythonhosted.org/packages/2f/10/84b522ff58763a5c443f5bcedc1820240e454ce4e620e88520f04589e2ea/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72a8d9564a717ee291f554eeb4bfeafe2309d5ec0aa6c475170bdab0f9ee8e88", size = 397035, upload-time = "2025-07-01T15:56:39.241Z" }, - { url = "https://files.pythonhosted.org/packages/06/ea/8667604229a10a520fcbf78b30ccc278977dcc0627beb7ea2c96b3becef0/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:511d15193cbe013619dd05414c35a7dedf2088fcee93c6bbb7c77859765bd4e8", size = 514922, upload-time = "2025-07-01T15:56:40.645Z" }, - { url = "https://files.pythonhosted.org/packages/24/e6/9ed5b625c0661c4882fc8cdf302bf8e96c73c40de99c31e0b95ed37d508c/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aea1f9741b603a8d8fedb0ed5502c2bc0accbc51f43e2ad1337fe7259c2b77a5", size = 402822, upload-time = "2025-07-01T15:56:42.137Z" }, - { url = "https://files.pythonhosted.org/packages/8a/58/212c7b6fd51946047fb45d3733da27e2fa8f7384a13457c874186af691b1/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4019a9d473c708cf2f16415688ef0b4639e07abaa569d72f74745bbeffafa2c7", size = 384336, upload-time = "2025-07-01T15:56:44.239Z" }, - { url = "https://files.pythonhosted.org/packages/aa/f5/a40ba78748ae8ebf4934d4b88e77b98497378bc2c24ba55ebe87a4e87057/rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:093d63b4b0f52d98ebae33b8c50900d3d67e0666094b1be7a12fffd7f65de74b", size = 416871, upload-time = "2025-07-01T15:56:46.284Z" }, - { url = "https://files.pythonhosted.org/packages/d5/a6/33b1fc0c9f7dcfcfc4a4353daa6308b3ece22496ceece348b3e7a7559a09/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2abe21d8ba64cded53a2a677e149ceb76dcf44284202d737178afe7ba540c1eb", size = 559439, upload-time = "2025-07-01T15:56:48.549Z" }, - { url = "https://files.pythonhosted.org/packages/71/2d/ceb3f9c12f8cfa56d34995097f6cd99da1325642c60d1b6680dd9df03ed8/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:4feb7511c29f8442cbbc28149a92093d32e815a28aa2c50d333826ad2a20fdf0", size = 588380, upload-time = "2025-07-01T15:56:50.086Z" }, - { url = "https://files.pythonhosted.org/packages/c8/ed/9de62c2150ca8e2e5858acf3f4f4d0d180a38feef9fdab4078bea63d8dba/rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e99685fc95d386da368013e7fb4269dd39c30d99f812a8372d62f244f662709c", size = 555334, upload-time = "2025-07-01T15:56:51.703Z" }, +version = "0.27.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/d9/991a0dee12d9fc53ed027e26a26a64b151d77252ac477e22666b9688bc16/rpds_py-0.27.0.tar.gz", hash = "sha256:8b23cf252f180cda89220b378d917180f29d313cd6a07b2431c0d3b776aae86f", size = 27420, upload-time = "2025-08-07T08:26:39.624Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/c1/49d515434c1752e40f5e35b985260cf27af052593378580a2f139a5be6b8/rpds_py-0.27.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:dbc2ab5d10544eb485baa76c63c501303b716a5c405ff2469a1d8ceffaabf622", size = 371577, upload-time = "2025-08-07T08:23:25.379Z" }, + { url = "https://files.pythonhosted.org/packages/e1/6d/bf2715b2fee5087fa13b752b5fd573f1a93e4134c74d275f709e38e54fe7/rpds_py-0.27.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7ec85994f96a58cf7ed288caa344b7fe31fd1d503bdf13d7331ead5f70ab60d5", size = 354959, upload-time = "2025-08-07T08:23:26.767Z" }, + { url = "https://files.pythonhosted.org/packages/a3/5c/e7762808c746dd19733a81373c10da43926f6a6adcf4920a21119697a60a/rpds_py-0.27.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:190d7285cd3bb6d31d37a0534d7359c1ee191eb194c511c301f32a4afa5a1dd4", size = 381485, upload-time = "2025-08-07T08:23:27.869Z" }, + { url = "https://files.pythonhosted.org/packages/40/51/0d308eb0b558309ca0598bcba4243f52c4cd20e15fe991b5bd75824f2e61/rpds_py-0.27.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c10d92fb6d7fd827e44055fcd932ad93dac6a11e832d51534d77b97d1d85400f", size = 396816, upload-time = "2025-08-07T08:23:29.424Z" }, + { url = "https://files.pythonhosted.org/packages/5c/aa/2d585ec911d78f66458b2c91252134ca0c7c70f687a72c87283173dc0c96/rpds_py-0.27.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd2c1d27ebfe6a015cfa2005b7fe8c52d5019f7bbdd801bc6f7499aab9ae739e", size = 514950, upload-time = "2025-08-07T08:23:30.576Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ef/aced551cc1148179557aed84343073adadf252c91265263ee6203458a186/rpds_py-0.27.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4790c9d5dd565ddb3e9f656092f57268951398cef52e364c405ed3112dc7c7c1", size = 402132, upload-time = "2025-08-07T08:23:32.428Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ac/cf644803d8d417653fe2b3604186861d62ea6afaef1b2284045741baef17/rpds_py-0.27.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4300e15e7d03660f04be84a125d1bdd0e6b2f674bc0723bc0fd0122f1a4585dc", size = 383660, upload-time = "2025-08-07T08:23:33.829Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ec/caf47c55ce02b76cbaeeb2d3b36a73da9ca2e14324e3d75cf72b59dcdac5/rpds_py-0.27.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:59195dc244fc183209cf8a93406889cadde47dfd2f0a6b137783aa9c56d67c85", size = 401730, upload-time = "2025-08-07T08:23:34.97Z" }, + { url = "https://files.pythonhosted.org/packages/0b/71/c1f355afdcd5b99ffc253422aa4bdcb04ccf1491dcd1bda3688a0c07fd61/rpds_py-0.27.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fae4a01ef8c4cb2bbe92ef2063149596907dc4a881a8d26743b3f6b304713171", size = 416122, upload-time = "2025-08-07T08:23:36.062Z" }, + { url = "https://files.pythonhosted.org/packages/38/0f/f4b5b1eda724ed0e04d2b26d8911cdc131451a7ee4c4c020a1387e5c6ded/rpds_py-0.27.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e3dc8d4ede2dbae6c0fc2b6c958bf51ce9fd7e9b40c0f5b8835c3fde44f5807d", size = 558771, upload-time = "2025-08-07T08:23:37.478Z" }, + { url = "https://files.pythonhosted.org/packages/93/c0/5f8b834db2289ab48d5cffbecbb75e35410103a77ac0b8da36bf9544ec1c/rpds_py-0.27.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c3782fb753aa825b4ccabc04292e07897e2fd941448eabf666856c5530277626", size = 587876, upload-time = "2025-08-07T08:23:38.662Z" }, + { url = "https://files.pythonhosted.org/packages/d2/dd/1a1df02ab8eb970115cff2ae31a6f73916609b900dc86961dc382b8c2e5e/rpds_py-0.27.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:887ab1f12b0d227e9260558a4a2320024b20102207ada65c43e1ffc4546df72e", size = 554359, upload-time = "2025-08-07T08:23:39.897Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e4/95a014ab0d51ab6e3bebbdb476a42d992d2bbf9c489d24cff9fda998e925/rpds_py-0.27.0-cp311-cp311-win32.whl", hash = "sha256:5d6790ff400254137b81b8053b34417e2c46921e302d655181d55ea46df58cf7", size = 218084, upload-time = "2025-08-07T08:23:41.086Z" }, + { url = "https://files.pythonhosted.org/packages/49/78/f8d5b71ec65a0376b0de31efcbb5528ce17a9b7fdd19c3763303ccfdedec/rpds_py-0.27.0-cp311-cp311-win_amd64.whl", hash = "sha256:e24d8031a2c62f34853756d9208eeafa6b940a1efcbfe36e8f57d99d52bb7261", size = 230085, upload-time = "2025-08-07T08:23:42.143Z" }, + { url = "https://files.pythonhosted.org/packages/e7/d3/84429745184091e06b4cc70f8597408e314c2d2f7f5e13249af9ffab9e3d/rpds_py-0.27.0-cp311-cp311-win_arm64.whl", hash = "sha256:08680820d23df1df0a0260f714d12966bc6c42d02e8055a91d61e03f0c47dda0", size = 222112, upload-time = "2025-08-07T08:23:43.233Z" }, + { url = "https://files.pythonhosted.org/packages/cd/17/e67309ca1ac993fa1888a0d9b2f5ccc1f67196ace32e76c9f8e1dbbbd50c/rpds_py-0.27.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:19c990fdf5acecbf0623e906ae2e09ce1c58947197f9bced6bbd7482662231c4", size = 362611, upload-time = "2025-08-07T08:23:44.773Z" }, + { url = "https://files.pythonhosted.org/packages/93/2e/28c2fb84aa7aa5d75933d1862d0f7de6198ea22dfd9a0cca06e8a4e7509e/rpds_py-0.27.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6c27a7054b5224710fcfb1a626ec3ff4f28bcb89b899148c72873b18210e446b", size = 347680, upload-time = "2025-08-07T08:23:46.014Z" }, + { url = "https://files.pythonhosted.org/packages/44/3e/9834b4c8f4f5fe936b479e623832468aa4bd6beb8d014fecaee9eac6cdb1/rpds_py-0.27.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09965b314091829b378b60607022048953e25f0b396c2b70e7c4c81bcecf932e", size = 384600, upload-time = "2025-08-07T08:23:48Z" }, + { url = "https://files.pythonhosted.org/packages/19/78/744123c7b38865a965cd9e6f691fde7ef989a00a256fa8bf15b75240d12f/rpds_py-0.27.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:14f028eb47f59e9169bfdf9f7ceafd29dd64902141840633683d0bad5b04ff34", size = 400697, upload-time = "2025-08-07T08:23:49.407Z" }, + { url = "https://files.pythonhosted.org/packages/32/97/3c3d32fe7daee0a1f1a678b6d4dfb8c4dcf88197fa2441f9da7cb54a8466/rpds_py-0.27.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6168af0be75bba990a39f9431cdfae5f0ad501f4af32ae62e8856307200517b8", size = 517781, upload-time = "2025-08-07T08:23:50.557Z" }, + { url = "https://files.pythonhosted.org/packages/b2/be/28f0e3e733680aa13ecec1212fc0f585928a206292f14f89c0b8a684cad1/rpds_py-0.27.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab47fe727c13c09d0e6f508e3a49e545008e23bf762a245b020391b621f5b726", size = 406449, upload-time = "2025-08-07T08:23:51.732Z" }, + { url = "https://files.pythonhosted.org/packages/95/ae/5d15c83e337c082d0367053baeb40bfba683f42459f6ebff63a2fd7e5518/rpds_py-0.27.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fa01b3d5e3b7d97efab65bd3d88f164e289ec323a8c033c5c38e53ee25c007e", size = 386150, upload-time = "2025-08-07T08:23:52.822Z" }, + { url = "https://files.pythonhosted.org/packages/bf/65/944e95f95d5931112829e040912b25a77b2e7ed913ea5fe5746aa5c1ce75/rpds_py-0.27.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:6c135708e987f46053e0a1246a206f53717f9fadfba27174a9769ad4befba5c3", size = 406100, upload-time = "2025-08-07T08:23:54.339Z" }, + { url = "https://files.pythonhosted.org/packages/21/a4/1664b83fae02894533cd11dc0b9f91d673797c2185b7be0f7496107ed6c5/rpds_py-0.27.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc327f4497b7087d06204235199daf208fd01c82d80465dc5efa4ec9df1c5b4e", size = 421345, upload-time = "2025-08-07T08:23:55.832Z" }, + { url = "https://files.pythonhosted.org/packages/7c/26/b7303941c2b0823bfb34c71378249f8beedce57301f400acb04bb345d025/rpds_py-0.27.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e57906e38583a2cba67046a09c2637e23297618dc1f3caddbc493f2be97c93f", size = 561891, upload-time = "2025-08-07T08:23:56.951Z" }, + { url = "https://files.pythonhosted.org/packages/9b/c8/48623d64d4a5a028fa99576c768a6159db49ab907230edddc0b8468b998b/rpds_py-0.27.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f4f69d7a4300fbf91efb1fb4916421bd57804c01ab938ab50ac9c4aa2212f03", size = 591756, upload-time = "2025-08-07T08:23:58.146Z" }, + { url = "https://files.pythonhosted.org/packages/b3/51/18f62617e8e61cc66334c9fb44b1ad7baae3438662098efbc55fb3fda453/rpds_py-0.27.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b4c4fbbcff474e1e5f38be1bf04511c03d492d42eec0babda5d03af3b5589374", size = 557088, upload-time = "2025-08-07T08:23:59.6Z" }, + { url = "https://files.pythonhosted.org/packages/bd/4c/e84c3a276e2496a93d245516be6b49e20499aa8ca1c94d59fada0d79addc/rpds_py-0.27.0-cp312-cp312-win32.whl", hash = "sha256:27bac29bbbf39601b2aab474daf99dbc8e7176ca3389237a23944b17f8913d97", size = 221926, upload-time = "2025-08-07T08:24:00.695Z" }, + { url = "https://files.pythonhosted.org/packages/83/89/9d0fbcef64340db0605eb0a0044f258076f3ae0a3b108983b2c614d96212/rpds_py-0.27.0-cp312-cp312-win_amd64.whl", hash = "sha256:8a06aa1197ec0281eb1d7daf6073e199eb832fe591ffa329b88bae28f25f5fe5", size = 233235, upload-time = "2025-08-07T08:24:01.846Z" }, + { url = "https://files.pythonhosted.org/packages/c9/b0/e177aa9f39cbab060f96de4a09df77d494f0279604dc2f509263e21b05f9/rpds_py-0.27.0-cp312-cp312-win_arm64.whl", hash = "sha256:e14aab02258cb776a108107bd15f5b5e4a1bbaa61ef33b36693dfab6f89d54f9", size = 223315, upload-time = "2025-08-07T08:24:03.337Z" }, + { url = "https://files.pythonhosted.org/packages/81/d2/dfdfd42565a923b9e5a29f93501664f5b984a802967d48d49200ad71be36/rpds_py-0.27.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:443d239d02d9ae55b74015234f2cd8eb09e59fbba30bf60baeb3123ad4c6d5ff", size = 362133, upload-time = "2025-08-07T08:24:04.508Z" }, + { url = "https://files.pythonhosted.org/packages/ac/4a/0a2e2460c4b66021d349ce9f6331df1d6c75d7eea90df9785d333a49df04/rpds_py-0.27.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b8a7acf04fda1f30f1007f3cc96d29d8cf0a53e626e4e1655fdf4eabc082d367", size = 347128, upload-time = "2025-08-07T08:24:05.695Z" }, + { url = "https://files.pythonhosted.org/packages/35/8d/7d1e4390dfe09d4213b3175a3f5a817514355cb3524593380733204f20b9/rpds_py-0.27.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d0f92b78cfc3b74a42239fdd8c1266f4715b573204c234d2f9fc3fc7a24f185", size = 384027, upload-time = "2025-08-07T08:24:06.841Z" }, + { url = "https://files.pythonhosted.org/packages/c1/65/78499d1a62172891c8cd45de737b2a4b84a414b6ad8315ab3ac4945a5b61/rpds_py-0.27.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ce4ed8e0c7dbc5b19352b9c2c6131dd23b95fa8698b5cdd076307a33626b72dc", size = 399973, upload-time = "2025-08-07T08:24:08.143Z" }, + { url = "https://files.pythonhosted.org/packages/10/a1/1c67c1d8cc889107b19570bb01f75cf49852068e95e6aee80d22915406fc/rpds_py-0.27.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fde355b02934cc6b07200cc3b27ab0c15870a757d1a72fd401aa92e2ea3c6bfe", size = 515295, upload-time = "2025-08-07T08:24:09.711Z" }, + { url = "https://files.pythonhosted.org/packages/df/27/700ec88e748436b6c7c4a2262d66e80f8c21ab585d5e98c45e02f13f21c0/rpds_py-0.27.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13bbc4846ae4c993f07c93feb21a24d8ec637573d567a924b1001e81c8ae80f9", size = 406737, upload-time = "2025-08-07T08:24:11.182Z" }, + { url = "https://files.pythonhosted.org/packages/33/cc/6b0ee8f0ba3f2df2daac1beda17fde5cf10897a7d466f252bd184ef20162/rpds_py-0.27.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be0744661afbc4099fef7f4e604e7f1ea1be1dd7284f357924af12a705cc7d5c", size = 385898, upload-time = "2025-08-07T08:24:12.798Z" }, + { url = "https://files.pythonhosted.org/packages/e8/7e/c927b37d7d33c0a0ebf249cc268dc2fcec52864c1b6309ecb960497f2285/rpds_py-0.27.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:069e0384a54f427bd65d7fda83b68a90606a3835901aaff42185fcd94f5a9295", size = 405785, upload-time = "2025-08-07T08:24:14.906Z" }, + { url = "https://files.pythonhosted.org/packages/5b/d2/8ed50746d909dcf402af3fa58b83d5a590ed43e07251d6b08fad1a535ba6/rpds_py-0.27.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4bc262ace5a1a7dc3e2eac2fa97b8257ae795389f688b5adf22c5db1e2431c43", size = 419760, upload-time = "2025-08-07T08:24:16.129Z" }, + { url = "https://files.pythonhosted.org/packages/d3/60/2b2071aee781cb3bd49f94d5d35686990b925e9b9f3e3d149235a6f5d5c1/rpds_py-0.27.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2fe6e18e5c8581f0361b35ae575043c7029d0a92cb3429e6e596c2cdde251432", size = 561201, upload-time = "2025-08-07T08:24:17.645Z" }, + { url = "https://files.pythonhosted.org/packages/98/1f/27b67304272521aaea02be293fecedce13fa351a4e41cdb9290576fc6d81/rpds_py-0.27.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d93ebdb82363d2e7bec64eecdc3632b59e84bd270d74fe5be1659f7787052f9b", size = 591021, upload-time = "2025-08-07T08:24:18.999Z" }, + { url = "https://files.pythonhosted.org/packages/db/9b/a2fadf823164dd085b1f894be6443b0762a54a7af6f36e98e8fcda69ee50/rpds_py-0.27.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0954e3a92e1d62e83a54ea7b3fdc9efa5d61acef8488a8a3d31fdafbfb00460d", size = 556368, upload-time = "2025-08-07T08:24:20.54Z" }, + { url = "https://files.pythonhosted.org/packages/24/f3/6d135d46a129cda2e3e6d4c5e91e2cc26ea0428c6cf152763f3f10b6dd05/rpds_py-0.27.0-cp313-cp313-win32.whl", hash = "sha256:2cff9bdd6c7b906cc562a505c04a57d92e82d37200027e8d362518df427f96cd", size = 221236, upload-time = "2025-08-07T08:24:22.144Z" }, + { url = "https://files.pythonhosted.org/packages/c5/44/65d7494f5448ecc755b545d78b188440f81da98b50ea0447ab5ebfdf9bd6/rpds_py-0.27.0-cp313-cp313-win_amd64.whl", hash = "sha256:dc79d192fb76fc0c84f2c58672c17bbbc383fd26c3cdc29daae16ce3d927e8b2", size = 232634, upload-time = "2025-08-07T08:24:23.642Z" }, + { url = "https://files.pythonhosted.org/packages/70/d9/23852410fadab2abb611733933401de42a1964ce6600a3badae35fbd573e/rpds_py-0.27.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b3a5c8089eed498a3af23ce87a80805ff98f6ef8f7bdb70bd1b7dae5105f6ac", size = 222783, upload-time = "2025-08-07T08:24:25.098Z" }, + { url = "https://files.pythonhosted.org/packages/15/75/03447917f78512b34463f4ef11066516067099a0c466545655503bed0c77/rpds_py-0.27.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:90fb790138c1a89a2e58c9282fe1089638401f2f3b8dddd758499041bc6e0774", size = 359154, upload-time = "2025-08-07T08:24:26.249Z" }, + { url = "https://files.pythonhosted.org/packages/6b/fc/4dac4fa756451f2122ddaf136e2c6aeb758dc6fdbe9ccc4bc95c98451d50/rpds_py-0.27.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:010c4843a3b92b54373e3d2291a7447d6c3fc29f591772cc2ea0e9f5c1da434b", size = 343909, upload-time = "2025-08-07T08:24:27.405Z" }, + { url = "https://files.pythonhosted.org/packages/7b/81/723c1ed8e6f57ed9d8c0c07578747a2d3d554aaefc1ab89f4e42cfeefa07/rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9ce7a9e967afc0a2af7caa0d15a3e9c1054815f73d6a8cb9225b61921b419bd", size = 379340, upload-time = "2025-08-07T08:24:28.714Z" }, + { url = "https://files.pythonhosted.org/packages/98/16/7e3740413de71818ce1997df82ba5f94bae9fff90c0a578c0e24658e6201/rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aa0bf113d15e8abdfee92aa4db86761b709a09954083afcb5bf0f952d6065fdb", size = 391655, upload-time = "2025-08-07T08:24:30.223Z" }, + { url = "https://files.pythonhosted.org/packages/e0/63/2a9f510e124d80660f60ecce07953f3f2d5f0b96192c1365443859b9c87f/rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb91d252b35004a84670dfeafadb042528b19842a0080d8b53e5ec1128e8f433", size = 513017, upload-time = "2025-08-07T08:24:31.446Z" }, + { url = "https://files.pythonhosted.org/packages/2c/4e/cf6ff311d09776c53ea1b4f2e6700b9d43bb4e99551006817ade4bbd6f78/rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db8a6313dbac934193fc17fe7610f70cd8181c542a91382531bef5ed785e5615", size = 402058, upload-time = "2025-08-07T08:24:32.613Z" }, + { url = "https://files.pythonhosted.org/packages/88/11/5e36096d474cb10f2a2d68b22af60a3bc4164fd8db15078769a568d9d3ac/rpds_py-0.27.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce96ab0bdfcef1b8c371ada2100767ace6804ea35aacce0aef3aeb4f3f499ca8", size = 383474, upload-time = "2025-08-07T08:24:33.767Z" }, + { url = "https://files.pythonhosted.org/packages/db/a2/3dff02805b06058760b5eaa6d8cb8db3eb3e46c9e452453ad5fc5b5ad9fe/rpds_py-0.27.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:7451ede3560086abe1aa27dcdcf55cd15c96b56f543fb12e5826eee6f721f858", size = 400067, upload-time = "2025-08-07T08:24:35.021Z" }, + { url = "https://files.pythonhosted.org/packages/67/87/eed7369b0b265518e21ea836456a4ed4a6744c8c12422ce05bce760bb3cf/rpds_py-0.27.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:32196b5a99821476537b3f7732432d64d93a58d680a52c5e12a190ee0135d8b5", size = 412085, upload-time = "2025-08-07T08:24:36.267Z" }, + { url = "https://files.pythonhosted.org/packages/8b/48/f50b2ab2fbb422fbb389fe296e70b7a6b5ea31b263ada5c61377e710a924/rpds_py-0.27.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a029be818059870664157194e46ce0e995082ac49926f1423c1f058534d2aaa9", size = 555928, upload-time = "2025-08-07T08:24:37.573Z" }, + { url = "https://files.pythonhosted.org/packages/98/41/b18eb51045d06887666c3560cd4bbb6819127b43d758f5adb82b5f56f7d1/rpds_py-0.27.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3841f66c1ffdc6cebce8aed64e36db71466f1dc23c0d9a5592e2a782a3042c79", size = 585527, upload-time = "2025-08-07T08:24:39.391Z" }, + { url = "https://files.pythonhosted.org/packages/be/03/a3dd6470fc76499959b00ae56295b76b4bdf7c6ffc60d62006b1217567e1/rpds_py-0.27.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:42894616da0fc0dcb2ec08a77896c3f56e9cb2f4b66acd76fc8992c3557ceb1c", size = 554211, upload-time = "2025-08-07T08:24:40.6Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d1/ee5fd1be395a07423ac4ca0bcc05280bf95db2b155d03adefeb47d5ebf7e/rpds_py-0.27.0-cp313-cp313t-win32.whl", hash = "sha256:b1fef1f13c842a39a03409e30ca0bf87b39a1e2a305a9924deadb75a43105d23", size = 216624, upload-time = "2025-08-07T08:24:42.204Z" }, + { url = "https://files.pythonhosted.org/packages/1c/94/4814c4c858833bf46706f87349c37ca45e154da7dbbec9ff09f1abeb08cc/rpds_py-0.27.0-cp313-cp313t-win_amd64.whl", hash = "sha256:183f5e221ba3e283cd36fdfbe311d95cd87699a083330b4f792543987167eff1", size = 230007, upload-time = "2025-08-07T08:24:43.329Z" }, + { url = "https://files.pythonhosted.org/packages/59/64/72ab5b911fdcc48058359b0e786e5363e3fde885156116026f1a2ba9a5b5/rpds_py-0.27.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e6491658dd2569f05860bad645569145c8626ac231877b0fb2d5f9bcb7054089", size = 371658, upload-time = "2025-08-07T08:26:02.369Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4b/90ff04b4da055db53d8fea57640d8d5d55456343a1ec9a866c0ecfe10fd1/rpds_py-0.27.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:bec77545d188f8bdd29d42bccb9191682a46fb2e655e3d1fb446d47c55ac3b8d", size = 355529, upload-time = "2025-08-07T08:26:03.83Z" }, + { url = "https://files.pythonhosted.org/packages/a4/be/527491fb1afcd86fc5ce5812eb37bc70428ee017d77fee20de18155c3937/rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a4aebf8ca02bbb90a9b3e7a463bbf3bee02ab1c446840ca07b1695a68ce424", size = 382822, upload-time = "2025-08-07T08:26:05.52Z" }, + { url = "https://files.pythonhosted.org/packages/e0/a5/dcdb8725ce11e6d0913e6fcf782a13f4b8a517e8acc70946031830b98441/rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:44524b96481a4c9b8e6c46d6afe43fa1fb485c261e359fbe32b63ff60e3884d8", size = 397233, upload-time = "2025-08-07T08:26:07.179Z" }, + { url = "https://files.pythonhosted.org/packages/33/f9/0947920d1927e9f144660590cc38cadb0795d78fe0d9aae0ef71c1513b7c/rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45d04a73c54b6a5fd2bab91a4b5bc8b426949586e61340e212a8484919183859", size = 514892, upload-time = "2025-08-07T08:26:08.622Z" }, + { url = "https://files.pythonhosted.org/packages/1d/ed/d1343398c1417c68f8daa1afce56ef6ce5cc587daaf98e29347b00a80ff2/rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:343cf24de9ed6c728abefc5d5c851d5de06497caa7ac37e5e65dd572921ed1b5", size = 402733, upload-time = "2025-08-07T08:26:10.433Z" }, + { url = "https://files.pythonhosted.org/packages/1d/0b/646f55442cd14014fb64d143428f25667a100f82092c90087b9ea7101c74/rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aed8118ae20515974650d08eb724150dc2e20c2814bcc307089569995e88a14", size = 384447, upload-time = "2025-08-07T08:26:11.847Z" }, + { url = "https://files.pythonhosted.org/packages/4b/15/0596ef7529828e33a6c81ecf5013d1dd33a511a3e0be0561f83079cda227/rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:af9d4fd79ee1cc8e7caf693ee02737daabfc0fcf2773ca0a4735b356c8ad6f7c", size = 402502, upload-time = "2025-08-07T08:26:13.537Z" }, + { url = "https://files.pythonhosted.org/packages/c3/8d/986af3c42f8454a6cafff8729d99fb178ae9b08a9816325ac7a8fa57c0c0/rpds_py-0.27.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f0396e894bd1e66c74ecbc08b4f6a03dc331140942c4b1d345dd131b68574a60", size = 416651, upload-time = "2025-08-07T08:26:14.923Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9a/b4ec3629b7b447e896eec574469159b5b60b7781d3711c914748bf32de05/rpds_py-0.27.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:59714ab0a5af25d723d8e9816638faf7f4254234decb7d212715c1aa71eee7be", size = 559460, upload-time = "2025-08-07T08:26:16.295Z" }, + { url = "https://files.pythonhosted.org/packages/61/63/d1e127b40c3e4733b3a6f26ae7a063cdf2bc1caa5272c89075425c7d397a/rpds_py-0.27.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:88051c3b7d5325409f433c5a40328fcb0685fc04e5db49ff936e910901d10114", size = 588072, upload-time = "2025-08-07T08:26:17.776Z" }, + { url = "https://files.pythonhosted.org/packages/04/7e/8ffc71a8f6833d9c9fb999f5b0ee736b8b159fd66968e05c7afc2dbcd57e/rpds_py-0.27.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:181bc29e59e5e5e6e9d63b143ff4d5191224d355e246b5a48c88ce6b35c4e466", size = 555083, upload-time = "2025-08-07T08:26:19.301Z" }, ] [[package]]