From d7a94963daac732496d4c6d6681f2907c01948d8 Mon Sep 17 00:00:00 2001 From: Ben Mares Date: Tue, 28 Oct 2025 02:24:32 +0100 Subject: [PATCH 01/10] Reproduce the corruption --- tests/test-corrupt-repodata/.gitattributes | 3 + tests/test-corrupt-repodata/.gitignore | 4 + tests/test-corrupt-repodata/01-explicit.lock | 196 ++ .../01-generate-sample-explicit-lockfile.py | 53 + ...reproduce-corrupt-repodata-via-upstream.py | 197 ++ tests/test-corrupt-repodata/02.Dockerfile | 8 + .../test-corrupt-repodata/03-clobber-pkgs.py | 269 ++ .../04-run-conda-lock.sh | 54 + .../04-setup-editable.sh | 14 + .../04-test-conda-lock-with-pkgs.py | 217 ++ tests/test-corrupt-repodata/04.Dockerfile | 13 + .../05-test-update-with-corrupt-cache.py | 296 +++ tests/test-corrupt-repodata/2.1.0-pkgs.tar.gz | Bin 0 -> 32036 bytes tests/test-corrupt-repodata/2.1.1-pkgs.tar.gz | Bin 0 -> 29162 bytes tests/test-corrupt-repodata/2.3.3-pkgs.tar.gz | Bin 0 -> 30787 bytes tests/test-corrupt-repodata/README.md | 187 ++ .../lockfile-2.1.0-pkgs.yml | 2364 +++++++++++++++++ .../lockfile-2.1.1-pkgs.yml | 2364 +++++++++++++++++ 18 files changed, 6239 insertions(+) create mode 100644 tests/test-corrupt-repodata/.gitattributes create mode 100644 tests/test-corrupt-repodata/.gitignore create mode 100644 tests/test-corrupt-repodata/01-explicit.lock create mode 100755 tests/test-corrupt-repodata/01-generate-sample-explicit-lockfile.py create mode 100755 tests/test-corrupt-repodata/02-reproduce-corrupt-repodata-via-upstream.py create mode 100644 tests/test-corrupt-repodata/02.Dockerfile create mode 100755 tests/test-corrupt-repodata/03-clobber-pkgs.py create mode 100644 tests/test-corrupt-repodata/04-run-conda-lock.sh create mode 100644 tests/test-corrupt-repodata/04-setup-editable.sh create mode 100755 tests/test-corrupt-repodata/04-test-conda-lock-with-pkgs.py create mode 100644 tests/test-corrupt-repodata/04.Dockerfile create mode 100755 tests/test-corrupt-repodata/05-test-update-with-corrupt-cache.py create mode 100644 tests/test-corrupt-repodata/2.1.0-pkgs.tar.gz create mode 100644 tests/test-corrupt-repodata/2.1.1-pkgs.tar.gz create mode 100644 tests/test-corrupt-repodata/2.3.3-pkgs.tar.gz create mode 100644 tests/test-corrupt-repodata/README.md create mode 100644 tests/test-corrupt-repodata/lockfile-2.1.0-pkgs.yml create mode 100644 tests/test-corrupt-repodata/lockfile-2.1.1-pkgs.yml diff --git a/tests/test-corrupt-repodata/.gitattributes b/tests/test-corrupt-repodata/.gitattributes new file mode 100644 index 000000000..87c69f290 --- /dev/null +++ b/tests/test-corrupt-repodata/.gitattributes @@ -0,0 +1,3 @@ +# Treat tar.gz files as binary (no line ending conversion) +*.tar.gz binary + diff --git a/tests/test-corrupt-repodata/.gitignore b/tests/test-corrupt-repodata/.gitignore new file mode 100644 index 000000000..4b5a70510 --- /dev/null +++ b/tests/test-corrupt-repodata/.gitignore @@ -0,0 +1,4 @@ +*-pkgs/ +lockfile-*.yml +updated-*.yml +outputs/ diff --git a/tests/test-corrupt-repodata/01-explicit.lock b/tests/test-corrupt-repodata/01-explicit.lock new file mode 100644 index 000000000..5b43101cf --- /dev/null +++ b/tests/test-corrupt-repodata/01-explicit.lock @@ -0,0 +1,196 @@ +# Generated by conda-lock. +# platform: linux-64 +# input_hash: 9bce7296a3440ba0575a13474be4eadffe1f886caf8e489de3c7f58c27b3a06b +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda#59659d0213082bc13be8500bab80c002 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-ha97dd6f_2.conda#14bae321b8127b63cba276bd53fac237 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.6-h2dba641_1.conda#ede4673863426c0883c0063d853bbd85 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda#c7e925f37e3b40d893459e625f6a53f1 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda#45161d96307e3a447cc3eb5896cf6f8c +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 +https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda#69fbc0a9e42eb5fe6733d2d60d818822 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a +https://conda.anaconda.org/conda-forge/linux-64/cpp-expected-1.3.1-h171cf75_0.conda#d17488e343e4c5c0bd0db18b3934d517 +https://conda.anaconda.org/conda-forge/linux-64/fmt-11.2.0-h07f6e7f_0.conda#0c2f855a88fab6afa92a7aa41217dc8e +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 +https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 +https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.35-h9463b59_0.conda#21769ce326958ec230cdcbd0f2ad97eb +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda#0b367fad34931cb79e0d6b7e5c06bb1c +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda#7fa07cb0fb1b625a089ccc01218ee5b1 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 +https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda#828302fca535f9cfeb598d5f7c204323 +https://conda.anaconda.org/conda-forge/linux-64/simdjson-4.0.7-hb700be7_0.conda#cc9c262a71dd584aa5a3a22fc963255c +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 +https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda#92b90f5f7a322e74468bb4909c7354b5 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.0-h1fed272_0.conda#b8e4c93f4ab70c3b6f6499299627dbdc +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 +https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h5989046_100_cp314.conda#d2e16e0bb7c3d9ddb3c597d43c8c708d +https://conda.anaconda.org/conda-forge/noarch/appdirs-1.4.4-pyhd8ed1ab_1.conda#f4e90937bbfc3a4a92539545a37bb448 +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda#767d508c1a67e02ae8f50e44cacfadb2 +https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda#b16e2595d3a9042aa9d570375978835f +https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py314h68536ef_0.conda#71d9c4f6a05a4b9da1b03b973e078db0 +https://conda.anaconda.org/conda-forge/noarch/boltons-25.0.0-pyhd8ed1ab_0.conda#c7eb87af73750d6fd97eff8bbee8cb9c +https://conda.anaconda.org/conda-forge/noarch/bracex-2.2.1-pyhd8ed1ab_0.tar.bz2#586272349d7bef5b1ef527b56dca73cb +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py314ha160325_4.conda#a5529cb388bf7c6c9ae3d9d1ae54be56 +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded +https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.3-pyhd8ed1ab_0.conda#7e7d5ef1b9ed630e4a1c358d6bc62284 +https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda#e76c4ba9e1837847679421b8d549b784 +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 +https://conda.anaconda.org/conda-forge/noarch/crashtest-0.4.1-pyhd8ed1ab_1.conda#e036e2f76d9c9aebc12510ed23352b6c +https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda#679616eb5ad4e521c83da4650860aba7 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 +https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda#66b8b26023b8efdf8fcb23bac4b6325d +https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_1.conda#7e081d00fdcba21b76658c1649691836 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.10-pyhd8ed1ab_1.conda#39a4f67be3286c86d696df570b1201b7 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_1.conda#6837f3eff7dcea42ecd714ce1ac2b108 +https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.0-pyhd8ed1ab_1.conda#365e9cb87dccc17796c7ca29a25a0bce +https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda#b4b91eb14fbe2f850dd2c5fc20676c0d +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.14.1-h332b0f4_0.conda#45f6713cb00f124af300342512219182 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.0-ha9997c6_1.conda#b24dd2bd61cd8e4f8a13ee2a945a723c +https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda#fab1be106a50e20f10fe5228fd1d1651 +https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda#d9a8fc1f01deae61735c88ec242e855c +https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda#de8af4000a4872e16fb784c649679c8e +https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhd8ed1ab_0.conda#d7620a15dc400b448e1c88a981b23ddd +https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.1.2-py314h9891dd4_0.conda#cef101d1e8f0f21f563d30ab95c3d3bc +https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda#e9c622e0d00fa24a6292279af3ab6d06 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda#c3f35453097faf911fd3f6023fc2ab24 +https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda#617f15191456cc6a13db418a275435e5 +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh145f28c_0.conda#e7ab34d5a93e0819b62563c78635d937 +https://conda.anaconda.org/conda-forge/noarch/pkginfo-1.12.1.2-pyhd8ed1ab_0.conda#dc702b2fae7ebe770aff3c83adb16b63 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 +https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.0-py314h5bd0f2a_0.conda#3bba9ff64ab2030c4c28c0d225864196 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/python-fastjsonschema-2.21.2-pyhe01879c_0.conda#23029aae904a2ba587daba708208012f +https://conda.anaconda.org/conda-forge/noarch/python-installer-0.7.0-pyhff2d567_1.conda#e27480eebcdf247209e90da706ebef8d +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 +https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2#2807a0becd1d986fe1ef9b7f8135f215 +https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda#b12f41c0d7fb5ab81709fcc86579688f +https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.12-py314h5bd0f2a_1.conda#24a93319d4523f8b628177892a7e224e +https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.0-ha3a3aed_0.conda#bf901feac47041795ef6666c777f3422 +https://conda.anaconda.org/conda-forge/noarch/semver-3.0.4-pyhd8ed1ab_0.conda#982aa48accc06494cbd2b51af69e17c7 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_1.conda#7c3c2a0f3ebdea2bbc35538d162b43bf +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 +https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda#87f47a78808baf2fa1ea9c315a1e48f1 +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.3-pyha770c72_0.conda#146402bf0f11cbeb8f781fa4309a95d3 +https://conda.anaconda.org/conda-forge/noarch/trove-classifiers-2025.9.11.17-pyhd8ed1ab_0.conda#fc3b129397a910cfe1350075a7ad7432 +https://conda.anaconda.org/conda-forge/noarch/types-click-7.1.8-pyhd8ed1ab_1.conda#08ed65e279de69322843b075679567ea +https://conda.anaconda.org/conda-forge/noarch/types-filelock-3.2.7-pyhd8ed1ab_1.conda#3f1356104d409d6deba0c689f3b2c602 +https://conda.anaconda.org/conda-forge/noarch/types-freezegun-1.1.10-pyhd8ed1ab_1.conda#0b609b66e56bbe70d97cd52ad24058fb +https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_0.conda#3c9919ecee97547fa14fea57e2a9bb54 +https://conda.anaconda.org/conda-forge/noarch/types-setuptools-80.9.0.20250822-pyhcf101f3_0.conda#6404dcec3d8f8b8fe540516837aa08ec +https://conda.anaconda.org/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda#353b9704e4851a6f210e641d3595755f +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda#2f1ed718fcd829c184a6d4f0f2e07409 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/linux-64/zizmor-1.14.1-py314ha5689aa_0.conda#1f0180642729883f29c47e11d857e786 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhd8ed1ab_1.conda#df837d654933488220b454c6a3b0fad6 +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314ha6a4811_0.conda#f572c769fb8bfa15708594c6f7f354e0 +https://conda.anaconda.org/conda-forge/noarch/click-default-group-1.2.4-pyhd8ed1ab_1.conda#7cd83dd6831b61ad9624a694e4afd7dc +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.10.7-py314h67df5f8_0.conda#0f9130a6e23d286d2df2c7e57c985f97 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda#7c14f3706e099f8fcd47af2d494616cc +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_2.conda#ade6b25a6136661dadd1a43e4350b10b +https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.3.0-pyhd8ed1ab_0.conda#b86839fa387a5b904846e77c84167e57 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.0-h26afc86_1.conda#8337b675e0cad517fbcb3daf7588087a +https://conda.anaconda.org/conda-forge/linux-64/mypy-1.18.2-py314h5bd0f2a_0.conda#1e87cabfdfea01d30e2ce1dd6152846f +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 +https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda#d4582021af437c931d7d77ec39007845 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda#e8e53c4150a1bba3b160eacf9d53a51b +https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml-0.18.15-py314h5bd0f2a_1.conda#b600106b833cff74e1c71e78c8b9478e +https://conda.anaconda.org/conda-forge/noarch/tqdm-4.67.1-pyhd8ed1ab_1.conda#9efbfdc37242619130ea42b1cc4ed861 +https://conda.anaconda.org/conda-forge/noarch/types-click-default-group-1.2.0.20250513-pyhe01879c_0.conda#335926a07f57d325d0d6966bf36eee0b +https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.15.0-h396c80c_0.conda#edd329d7d3a4ab45dcf905899a7a6115 +https://conda.anaconda.org/conda-forge/noarch/typing-inspection-0.4.2-pyhd8ed1ab_0.conda#399701494e731ce73fdd86c185a3d1b4 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.3-pyhd8ed1ab_0.conda#bf0dc4c8a32e91290e3fae5403798c63 +https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py314hdafbbf9_1.conda#099125fcb130e9fe134c6b610f33b0e1 +https://conda.anaconda.org/conda-forge/noarch/wcmatch-10.1-pyhd8ed1ab_0.conda#b045a877087e3bbdd36fe460e7f5cc55 +https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_1.conda#2934f256a8acfe48f6ebb4fce6cde29c +https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.2-py314hb613cbf_0.conda#19ed3f93a65fe3f057594cb3195e956f +https://conda.anaconda.org/conda-forge/linux-64/editdistance-s-1.0.0-py314h9891dd4_7.conda#2111df2165d475f89934dbceeb61110c +https://conda.anaconda.org/conda-forge/noarch/freezegun-1.5.5-pyhd8ed1ab_0.conda#0fdb8ebc8dbdb62530ff73181ae63554 +https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda#93f742fe078a7b34c29a182958d4d765 +https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda#b91d463ea8be13bcbe644ae8bc99c39f +https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.0.1-pyhd8ed1ab_0.conda#bcc023a32ea1c44a790bbf1eae473486 +https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.1-gpl_h7be2006_101.conda#e6f55365ce179b10b48de5a1677ae013 +https://conda.anaconda.org/conda-forge/noarch/markdown-3.9-pyhd8ed1ab_0.conda#17784de2c4da64a3595328b34982cdc5 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda#84382acddb26c27c70f2de8d4c830830 +https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.41.1-py314h68536ef_0.conda#1fd80b4d56b42a7c1fe8df083fad1d5f +https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.0-py314h5bd0f2a_0.conda#287eabdd0b0a176376968b84c2707bd8 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda#1f987505580cb972cf28dc5f74a0f81b +https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda#ed5d43e9ef92cc2a9872f9bdfe94b984 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h31f8a6b_0.conda#68bd13651618354987763f746ee1fadc +https://conda.anaconda.org/conda-forge/noarch/check-manifest-0.50-pyhd8ed1ab_1.conda#377be6dde8e383743a2e98210326532b +https://conda.anaconda.org/conda-forge/noarch/conda-package-streaming-0.12.0-pyhd8ed1ab_0.conda#ff75d06af779966a5aeae1be1d409b96 +https://conda.anaconda.org/conda-forge/noarch/identify-2.3.7-pyhd8ed1ab_0.tar.bz2#ae1a5e834fbca62ee88ab55fb276be63 +https://conda.anaconda.org/conda-forge/linux-64/libmamba-2.3.2-hae34dd5_2.conda#b0cfdfd4632cc769a1ca211ecfc1093c +https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda#14661160be39d78f2b210f2cc2766059 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-click-0.9.0-pyh29332c3_0.conda#5fe524d35646dadfdc024c510d29330a +https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda#1a884d2b1ea21abfb73911dcdb8342e4 +https://conda.anaconda.org/conda-forge/noarch/pydantic-2.12.0-pyh3cfb1c2_0.conda#41749e96b495f27bf1729e0f99722415 +https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda#26e013bc453e643991cfa9b76911fb79 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 +https://conda.anaconda.org/conda-forge/noarch/pytest-split-0.10.0-pyhff2d567_0.conda#3bd32c44526b455aa146d8fdb27a65b3 +https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda#52a50ca8ea1b3496fbd3261bea8c5722 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda#8375cfbda7c57fbceeda18229be10417 +https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.0-py314hdafbbf9_0.conda#a804c54ce3a1aed268b13657b79825b8 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/linux-64/dulwich-0.24.2-py314ha5689aa_0.conda#a2c0dd6bd9e2c7b6239b9fc4cac2c74d +https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyha804496_0.conda#cdd58ab99c214b55d56099108a914282 +https://conda.anaconda.org/conda-forge/linux-64/mamba-2.3.2-h4a52834_2.conda#0e6c861326fd1fe1bed0d840c142d736 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-include-markdown-plugin-7.1.7-pyhd8ed1ab_0.conda#3b79eac4eefefcf71bef5c9a61ec7519 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 +https://conda.anaconda.org/conda-forge/noarch/types-requests-2.32.4.20250913-pyhd8ed1ab_0.conda#829c891bfd4147c25b030455d3a57a3a +https://conda.anaconda.org/conda-forge/noarch/cachecontrol-0.14.3-pyha770c72_0.conda#241ef6e3db47a143ac34c21bfba510f1 +https://conda.anaconda.org/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda#07ce73ca6f6c1a1df5d498679fc52d9e +https://conda.anaconda.org/conda-forge/noarch/doctr-1.9.0-pyhd8ed1ab_0.tar.bz2#f57b656502db0e45cc996ddbef2a9d25 +https://conda.anaconda.org/conda-forge/noarch/ensureconda-1.6.0-pyhcf101f3_0.conda#fcc02785e4da41e5f19f740e017b6ffb +https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.21-pyhcf101f3_0.conda#53686b570071ee9944a443a60e4a9e09 +https://conda.anaconda.org/conda-forge/noarch/requests-mock-1.12.1-pyhd8ed1ab_1.conda#8212b70c509aaa0fa6c8fa974f784b2e +https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda#66de8645e324fda0ea6ef28c2f99a2ab +https://conda.anaconda.org/conda-forge/noarch/cachecontrol-with-filecache-0.14.3-pyhd8ed1ab_0.conda#b4af8c1b61929b1bcb001c2953882149 +https://conda.anaconda.org/conda-forge/noarch/twine-1.11.0-py_1.tar.bz2#9d276c93b9631b740e9119a1193558a9 +# pip ty @ https://files.pythonhosted.org/packages/fd/07/f852fb20ac27707de495c39a02aeb056e3368833b7e12888d43b1f61594d/ty-0.0.1a22-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=a3ffda8149cab0000a21e7a078142073e27a1a9ac03b9a0837aa2f53d1fbebcb diff --git a/tests/test-corrupt-repodata/01-generate-sample-explicit-lockfile.py b/tests/test-corrupt-repodata/01-generate-sample-explicit-lockfile.py new file mode 100755 index 000000000..da406ea03 --- /dev/null +++ b/tests/test-corrupt-repodata/01-generate-sample-explicit-lockfile.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 + +import shlex +import subprocess + +from pathlib import Path +from typing import Final + + +SCRIPT_DIR: Final[Path] = Path(__file__).resolve().parent +DESTINATION_FILE: Final[Path] = SCRIPT_DIR / "01-explicit.lock" +DEFAULT_DESTINATION_LOCKFILE_RELATIVE_REPO_ROOT: Final[Path] = ( + Path() / "environments" / "conda-lock.yml" +) + +COMMAND = """ + conda-lock render -p linux-64 --kind explicit \ + --filename-template DESTINATION_FILE FULL_LOCKFILE_PATH +""" + + +def main() -> None: + """Main function.""" + repo_root = get_repo_root() + full_lockfile_path = repo_root / DEFAULT_DESTINATION_LOCKFILE_RELATIVE_REPO_ROOT + cmd = shlex.split(COMMAND) + replacements = { + "DESTINATION_FILE": str(DESTINATION_FILE), + "FULL_LOCKFILE_PATH": str(full_lockfile_path), + } + replace_in_command(cmd, replacements) + print(f"Running command: {shlex.join(cmd)}") + subprocess.run(cmd, check=True, cwd=repo_root) + print(f"Generated: {DESTINATION_FILE}") + + +def get_repo_root() -> Path: + """Get the root directory of the repository by finding the .git directory.""" + for parent in SCRIPT_DIR.parents: + if (parent / ".git").exists(): + return parent + raise FileNotFoundError("Could not find the root directory of the repository.") + + +def replace_in_command(split_command: list[str], replacements: dict[str, str]) -> None: + """Replace the placeholders in the command with the replacements.""" + for i, arg in enumerate(split_command): + if arg in replacements: + split_command[i] = replacements[arg] + + +if __name__ == "__main__": + main() diff --git a/tests/test-corrupt-repodata/02-reproduce-corrupt-repodata-via-upstream.py b/tests/test-corrupt-repodata/02-reproduce-corrupt-repodata-via-upstream.py new file mode 100755 index 000000000..3ca52dba3 --- /dev/null +++ b/tests/test-corrupt-repodata/02-reproduce-corrupt-repodata-via-upstream.py @@ -0,0 +1,197 @@ +#!/usr/bin/env python3 + +"""Reproduce the corrupt repodata record by running micromamba from a Docker image. + +Writes the repodata records to the pkgs/ directory. + +Last good version: 2.1.0 +First bad version: 2.1.1 +Last bad version: 2.3.2 +First good version: 2.3.3 + +For more context, see: + +""" + +import argparse +import gzip +import io +import shlex +import subprocess +import tarfile + +from pathlib import Path +from typing import Final + + +SCRIPT_DIR: Final[Path] = Path(__file__).resolve().parent +DOCKERFILE_PATH: Final[Path] = SCRIPT_DIR / "02.Dockerfile" +EXPLICIT_LOCK_PATH: Final[Path] = SCRIPT_DIR / "01-explicit.lock" +SOURCE_DIR: Final[str] = "/opt/conda/pkgs" +DEFAULT_VERSION: Final[str] = "2.1.1" + + +def build_docker_image(version: str = DEFAULT_VERSION) -> None: + """Build the Docker image that produces a (potentially) corrupt repodata record. + + The build uses the Dockerfile and tags the image for later use. + + Args: + version: The micromamba version to use (e.g., "2.1.1") + """ + image_tag = f"bad-repodata:{version}" + + cmd = [ + "docker", + "build", + f"--file={DOCKERFILE_PATH}", + f"--build-arg=MICROMAMBA_TAG={version}", + f"--tag={image_tag}", + str(SCRIPT_DIR), + ] + + print("Running command:") + print(f" {shlex.join(cmd)}") + print() + + subprocess.run(cmd, check=True) + + +def extract_pkgs_from_image( + version: str = DEFAULT_VERSION, destination: Path | None = None +) -> Path: + """Create a container from the built image and save the pkgs directory as tar.gz. + + Writes the compressed archive next to this script unless a destination is provided. + + Args: + version: The micromamba version to use (e.g., "2.1.1") + destination: Optional destination path for the tar.gz file + + Returns: + Path to the created tar.gz file + """ + image_tag = f"bad-repodata:{version}" + + # Create a container without starting it + result = subprocess.run( + ["docker", "create", image_tag], + check=True, + capture_output=True, + text=True, + ) + container_id = result.stdout.strip() + + try: + # Get the archive of the pkgs directory + result = subprocess.run( + ["docker", "cp", f"{container_id}:{SOURCE_DIR}", "-"], + check=True, + capture_output=True, + ) + tar_bytes = result.stdout + + output_file = destination or SCRIPT_DIR / f"{version}-pkgs.tar.gz" + + # Filter and recompress the tar archive + # Docker gives us a tar, we need to filter it and save as tar.gz + # Include a parent directory so extraction creates only one directory + parent_dir = f"{version}-pkgs" + + # Collect members and their data for reproducible output + members_to_add = [] + with tarfile.open(fileobj=io.BytesIO(tar_bytes), mode="r") as tf_in: + for member in tf_in.getmembers(): + # Only include index.json and repodata_record.json from info/ directories + if not ( + member.name.endswith("/info/index.json") + or member.name.endswith("/info/repodata_record.json") + ): + continue + + # Strip "pkgs/" prefix and add parent directory + name = member.name + if name.startswith("pkgs/"): + name = name[5:] # Remove "pkgs/" + name = f"{parent_dir}/{name}" + + # Store name and file data + fileobj = tf_in.extractfile(member) + if fileobj: + members_to_add.append((name, fileobj.read())) + + # Sort by name for reproducible ordering + members_to_add.sort(key=lambda x: x[0]) + + # Write sorted members to a deterministic gzip-compressed tar + out_bytes = io.BytesIO() + with gzip.GzipFile(filename="", mode="wb", fileobj=out_bytes, mtime=0) as gz: + with tarfile.open( + fileobj=gz, mode="w", format=tarfile.PAX_FORMAT + ) as tf_out: + for name, data in members_to_add: + # Create TarInfo with reproducible metadata + ti = tarfile.TarInfo(name=name) + ti.size = len(data) + ti.mtime = 0 + ti.uid = 0 + ti.gid = 0 + ti.uname = "" + ti.gname = "" + ti.mode = 0o644 + tf_out.addfile(ti, io.BytesIO(data)) + + # Persist to disk + with open(output_file, "wb") as f_out: + f_out.write(out_bytes.getvalue()) + + return output_file + finally: + subprocess.run( + ["docker", "rm", "--force", container_id], + check=True, + ) + + +def cleanup_docker_image(version: str = DEFAULT_VERSION) -> None: + """Remove the Docker image created by build_docker_image(). + + Args: + version: The micromamba version to use (e.g., "2.1.1") + """ + image_tag = f"bad-repodata:{version}" + subprocess.run( + ["docker", "rmi", "--force", image_tag], + check=True, + ) + + +def main(version: str = DEFAULT_VERSION) -> None: + """Build the Docker image and extract the corrupt repodata records. + + Args: + version: The micromamba version to use (e.g., "2.1.1") + """ + print(f"Building Docker image: bad-repodata:{version}") + build_docker_image(version) + + print(f"Extracting pkgs directory to: {SCRIPT_DIR / f'{version}-pkgs.tar.gz'}") + output_path = extract_pkgs_from_image(version) + + print(f"Successfully wrote pkgs archive to: {output_path}") + print("Cleaning up Docker image...") + cleanup_docker_image(version) + print("Done") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Reproduce corrupt repodata records from micromamba Docker images" + ) + parser.add_argument( + "--version", + default=DEFAULT_VERSION, + help=f"Micromamba version to use (default: {DEFAULT_VERSION})", + ) + args = parser.parse_args() + main(version=args.version) diff --git a/tests/test-corrupt-repodata/02.Dockerfile b/tests/test-corrupt-repodata/02.Dockerfile new file mode 100644 index 000000000..5aea61d32 --- /dev/null +++ b/tests/test-corrupt-repodata/02.Dockerfile @@ -0,0 +1,8 @@ +ARG MICROMAMBA_TAG=latest + +FROM mambaorg/micromamba:${MICROMAMBA_TAG} + +COPY 01-explicit.lock /tmp/explicit.lock + +RUN micromamba install -y -p /opt/conda -f /tmp/explicit.lock + diff --git a/tests/test-corrupt-repodata/03-clobber-pkgs.py b/tests/test-corrupt-repodata/03-clobber-pkgs.py new file mode 100755 index 000000000..2e525faca --- /dev/null +++ b/tests/test-corrupt-repodata/03-clobber-pkgs.py @@ -0,0 +1,269 @@ +#!/usr/bin/env python3 + +"""Clobber repodata_record.json files to simulate the corruption bug. + +This script modifies repodata_record.json files from a good pkgs directory (2.1.0) +to match the corruption pattern seen in micromamba versions 2.1.1-2.3.2, where +metadata is lost when installing from explicit lockfiles. + +After clobbering, it verifies that the result matches the corrupt version (2.1.1) +by running a diff and ensuring it's empty. + +For more context, see: + +""" + +import argparse +import json +import shlex +import shutil +import subprocess +import sys +import tarfile + +from pathlib import Path +from typing import Final + + +DEFAULT_INPUT_VERSION: Final[str] = "2.1.0" +DEFAULT_CORRUPT_VERSION: Final[str] = "2.1.1" + + +def extract_pkgs_archive(archive_path: Path, extract_to: Path) -> None: + """Extract a pkgs tar.gz archive. + + Args: + archive_path: Path to the .tar.gz file + extract_to: Directory to extract into + """ + extract_to.mkdir(parents=True, exist_ok=True) + with tarfile.open(archive_path, "r:gz") as tf: + tf.extractall(path=extract_to) + print(f"Extracted {archive_path} to {extract_to}") + + +def clobber_repodata_records( + input_dir: Path, output_dir: Path, corruption_pattern: str = "2.1.1" +) -> None: + """Clobber repodata_record.json files to simulate corruption. + + Args: + input_dir: Source pkgs directory (e.g., "2.1.0-pkgs") + output_dir: Destination directory for clobbered files (e.g., "clobbered-2.1.0-pkgs") + corruption_pattern: Which corruption pattern to apply ("2.1.1" or "2.3.3") + """ + if not input_dir.exists(): + raise FileNotFoundError(f"Input directory not found: {input_dir}") + + # Remove output directory if it exists + if output_dir.exists(): + if not output_dir.name.endswith("-pkgs"): + raise ValueError( + f"Safety check failed: refusing to delete {output_dir} (does not end with '-pkgs')" + ) + shutil.rmtree(output_dir) + + # Copy the entire directory structure + shutil.copytree(input_dir, output_dir) + + # Find and modify all repodata_record.json files + repodata_files = list(output_dir.rglob("*/info/repodata_record.json")) + + print( + f"Found {len(repodata_files)} repodata_record.json files to clobber (pattern: {corruption_pattern})" + ) + + for repodata_file in repodata_files: + # Read the original file + with open(repodata_file, encoding="utf-8") as f: + data = json.load(f) + + # Apply corruption pattern based on version + if corruption_pattern == "2.1.1": + # Versions 2.1.1-2.3.2: corrupt depends, constrains, license, timestamp, build_number, track_features + data["depends"] = [] + data["constrains"] = [] + data["license"] = "" + data["timestamp"] = 0 + data["build_number"] = 0 + data["track_features"] = "" + elif corruption_pattern == "2.3.3": + # Version 2.3.3: mirror presence/content of depends/constrains from info/index.json + # and corrupt license/timestamp/build_number/track_features + + index_path = repodata_file.with_name("index.json") + try: + with open(index_path, encoding="utf-8") as f_idx: + index_data = json.load(f_idx) + except FileNotFoundError: + index_data = {} + + # depends: set exactly as in index.json (delete if absent) + if "depends" in index_data: + data["depends"] = index_data["depends"] + elif "depends" in data: + del data["depends"] + + # constrains: keep non-empty from index.json, otherwise remove + if index_data.get("constrains"): + data["constrains"] = index_data["constrains"] + elif "constrains" in data: + del data["constrains"] + + data["license"] = "" + data["timestamp"] = 0 + data["build_number"] = 0 + data["track_features"] = "" + else: + raise ValueError( + f"Unknown corruption pattern: {corruption_pattern}. Use '2.1.1' or '2.3.3'" + ) + + # Write back the modified data + with open(repodata_file, "w", encoding="utf-8") as f: + json.dump(data, f, indent=4) + + print(f"Clobbered {len(repodata_files)} files in {output_dir}") + + +def verify_matches_corrupt( + clobbered_dir: Path, corrupt_dir: Path, verbose: bool = False +) -> bool: + """Verify that the clobbered directory matches the corrupt version. + + Args: + clobbered_dir: The directory with clobbered files + corrupt_dir: The directory with corrupt files from micromamba + verbose: Whether to print diff output + + Returns: + True if directories match (diff is empty), False otherwise + """ + cmd = [ + "diff", + "--recursive", + "--brief", + str(clobbered_dir), + str(corrupt_dir), + ] + + print("Verifying clobbered files match corrupt version...") + print(f"Running command: {shlex.join(cmd)}") + print() + + result = subprocess.run(cmd, capture_output=True, text=True) + + if result.returncode == 0: + print("✓ SUCCESS: Clobbered files match corrupt version exactly!") + return True + else: + print("✗ FAILURE: Clobbered files differ from corrupt version!") + print() + if verbose or result.stdout: + print("Differences found:") + print(result.stdout) + if result.stderr: + print("Errors:") + print(result.stderr) + return False + + +def main() -> None: + """Clobber repodata_record.json files to simulate the corruption bug.""" + parser = argparse.ArgumentParser( + description="Clobber repodata_record.json files to simulate corruption and verify" + ) + parser.add_argument( + "--input-version", + default=DEFAULT_INPUT_VERSION, + help=f"Version of the input pkgs directory (default: {DEFAULT_INPUT_VERSION})", + ) + parser.add_argument( + "--corrupt-version", + default=DEFAULT_CORRUPT_VERSION, + help=f"Version of the corrupt pkgs directory to compare against (default: {DEFAULT_CORRUPT_VERSION})", + ) + parser.add_argument( + "--verbose", + action="store_true", + help="Show detailed diff output if verification fails", + ) + parser.add_argument( + "--pattern", + default="2.1.1", + choices=["2.1.1", "2.3.3"], + help="Corruption pattern to apply: '2.1.1' (full corruption) or '2.3.3' (partial corruption, default: 2.1.1)", + ) + args = parser.parse_args() + + script_dir = Path(__file__).resolve().parent + input_archive = script_dir / f"{args.input_version}-pkgs.tar.gz" + corrupt_archive = script_dir / f"{args.corrupt_version}-pkgs.tar.gz" + output_dir = script_dir / f"clobbered-{args.input_version}-pkgs" + + # Check that input archives exist + if not input_archive.exists(): + print(f"Error: Input archive not found: {input_archive}", file=sys.stderr) + print( + f"Run: python 02-reproduce-corrupt-repodata-via-upstream.py --version={args.input_version}", + file=sys.stderr, + ) + sys.exit(1) + + if not corrupt_archive.exists(): + print(f"Error: Corrupt archive not found: {corrupt_archive}", file=sys.stderr) + print( + f"Run: python 02-reproduce-corrupt-repodata-via-upstream.py --version={args.corrupt_version}", + file=sys.stderr, + ) + sys.exit(1) + + # Extract archives to persistent directories (for later inspection) + input_dir = script_dir / f"{args.input_version}-pkgs" + corrupt_dir = script_dir / f"{args.corrupt_version}-pkgs" + + print(f"Input archive: {input_archive}") + print(f"Corrupt archive: {corrupt_archive}") + print(f"Output directory: {output_dir}") + print() + + # Always delete and re-extract to ensure fresh state + if input_dir.exists(): + if not input_dir.name.endswith("-pkgs"): + raise ValueError( + f"Safety check failed: refusing to delete {input_dir} (does not end with '-pkgs')" + ) + shutil.rmtree(input_dir) + print(f"Extracting {input_archive}...") + extract_pkgs_archive(input_archive, script_dir) + + if corrupt_dir.exists(): + if not corrupt_dir.name.endswith("-pkgs"): + raise ValueError( + f"Safety check failed: refusing to delete {corrupt_dir} (does not end with '-pkgs')" + ) + shutil.rmtree(corrupt_dir) + print(f"Extracting {corrupt_archive}...") + extract_pkgs_archive(corrupt_archive, script_dir) + print() + + clobber_repodata_records(input_dir, output_dir, corruption_pattern=args.pattern) + print() + + # Verify the clobbered files match the corrupt version + matches = verify_matches_corrupt(output_dir, corrupt_dir, verbose=args.verbose) + print() + + if matches: + print("✓ Verification passed!") + sys.exit(0) + else: + print("✗ Verification failed!") + print() + print("To see detailed differences, run:") + print(f" diff --recursive {output_dir} {corrupt_dir}") + sys.exit(1) + + +if __name__ == "__main__": + main() diff --git a/tests/test-corrupt-repodata/04-run-conda-lock.sh b/tests/test-corrupt-repodata/04-run-conda-lock.sh new file mode 100644 index 000000000..1b43dbc7a --- /dev/null +++ b/tests/test-corrupt-repodata/04-run-conda-lock.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# Script to run conda-lock with a specific pkgs directory inside a Docker container +# +# This script reproduces the corrupt repodata issue by: +# 1. Copying the read-only mounted pkgs directory to a writable location +# 2. Configuring micromamba to use the writable pkgs directory +# 3. Running an explicit install to populate missing package files (generates warnings) +# 4. Running conda-lock which will read from the now-populated but corrupt cache + +set -e + +# Setup editable install of conda-lock from mounted source +bash /setup-editable.sh + +# Copy the read-only mounted pkgs directory to a writable location in the user's home +# The pkgs directory must be writable for micromamba to use it properly +echo "Copying pkgs directory to writable location..." +cp -r /custom-pkgs-ro/ ~/custom-pkgs-writeable/ + +# Configure micromamba to use our custom writable pkgs directory +# This prepends it to the pkgs_dirs list so it's searched first +echo "Configuring micromamba to use custom pkgs directory..." +micromamba config prepend pkgs_dirs ~/custom-pkgs-writeable/ + +# Verify the configuration +echo "Current pkgs_dirs configuration:" +micromamba config list pkgs_dirs +echo "" + +# The pkgs directory only contains index.json and repodata_record.json files +# We need to populate the actual package files by doing an explicit install +# This will generate warnings about invalid package cache, which is expected +echo "Populating package cache with explicit install (warnings are expected and filtered out)..." +echo "This fills in missing package files from the incomplete cache..." +# Filter out warning lines and the blank line that follows each warning +micromamba create -n temp-populate -y -f /explicit.lock 2>&1 | awk ' + /warning.*Invalid package cache/ { skip_next=1; next } + skip_next { skip_next=0; if (NF==0) next } + { print } +' +echo "" + +# Run conda-lock to generate the lockfile +# It will now read from the populated cache which has corrupt repodata_record.json files +echo "Running conda-lock..." +micromamba run -n base conda-lock lock \ + --micromamba \ + -f /workspace/dev-environment.yaml \ + -p linux-64 \ + --lockfile /tmp/lockfile.yml + +echo "" +echo "Lockfile generated at /tmp/lockfile.yml" + diff --git a/tests/test-corrupt-repodata/04-setup-editable.sh b/tests/test-corrupt-repodata/04-setup-editable.sh new file mode 100644 index 000000000..13a1fc4c4 --- /dev/null +++ b/tests/test-corrupt-repodata/04-setup-editable.sh @@ -0,0 +1,14 @@ +#!/bin/bash +# Setup script to install conda-lock in editable mode from mounted source + +set -e + +if [ -d "/conda-lock-src" ]; then + micromamba run -n base pip check + echo "Setting up editable install from /conda-lock-src..." + micromamba run -n base pip install --no-deps --editable /conda-lock-src + micromamba run -n base pip check + echo "Editable install complete!" +else + echo "No /conda-lock-src found, using existing PyPI install" +fi diff --git a/tests/test-corrupt-repodata/04-test-conda-lock-with-pkgs.py b/tests/test-corrupt-repodata/04-test-conda-lock-with-pkgs.py new file mode 100755 index 000000000..4c7fb6947 --- /dev/null +++ b/tests/test-corrupt-repodata/04-test-conda-lock-with-pkgs.py @@ -0,0 +1,217 @@ +"""Test conda-lock lockfile generation with different pkgs directories. + +This script builds a Docker image with conda-lock installed, extracts the +specified pkgs archive, and generates lockfiles to compare the results. + +The pkgs archives contain only metadata files (index.json and repodata_record.json) +from package cache directories. To reproduce the corruption issue, the script: +1. Mounts the incomplete pkgs directory as read-only +2. Copies it to a writable location inside the container +3. Runs an explicit install to populate missing package files +4. Runs conda-lock which reads from the populated but corrupt cache + +For more context, see: + +""" + +import argparse +import shlex +import shutil +import subprocess +import sys +import tarfile + +from pathlib import Path +from typing import Final + + +SCRIPT_DIR: Final[Path] = Path(__file__).resolve().parent +REPO_ROOT: Final[Path] = SCRIPT_DIR / "../.." +DOCKERFILE_PATH: Final[Path] = SCRIPT_DIR / "04.Dockerfile" +SOURCE_FILE: Final[Path] = SCRIPT_DIR / "../../environments/dev-environment.yaml" +EXPLICIT_LOCK: Final[Path] = SCRIPT_DIR / "01-explicit.lock" +DEFAULT_MICROMAMBA_VERSION: Final[str] = "2.1.0" +DEFAULT_PKGS_DIR: Final[str] = "2.1.0-pkgs" + + +def build_conda_lock_image(micromamba_version: str = DEFAULT_MICROMAMBA_VERSION) -> str: + """Build Docker image with conda-lock installed. + + Args: + micromamba_version: The micromamba version to use as base + + Returns: + The Docker image tag + """ + image_tag = f"conda-lock-test:{micromamba_version}" + + cmd = [ + "docker", + "build", + f"--file={DOCKERFILE_PATH}", + f"--build-arg=MICROMAMBA_TAG={micromamba_version}", + f"--tag={image_tag}", + str(SCRIPT_DIR), + ] + + print(f"Building Docker image: {image_tag}") + print("Running command:") + print(f" {shlex.join(cmd)}") + print() + + subprocess.run(cmd, check=True) + + return image_tag + + +def generate_lockfile_with_pkgs( + image_tag: str, + pkgs_dir: Path, + output_name: str, +) -> Path: + """Generate a conda-lock lockfile using a specific pkgs directory. + + The conda-lock source from the repo is mounted and installed in editable mode + at runtime, so changes to the source code are immediately reflected. + + Args: + image_tag: Docker image tag to use + pkgs_dir: Path to the pkgs directory to mount as cache + output_name: Name for the output lockfile (without extension) + + Returns: + Path to the generated lockfile + """ + output_file = SCRIPT_DIR / f"{output_name}.yml" + + print(f"Generating lockfile: {output_file}") + print(f"Using pkgs directory: {pkgs_dir}") + print("Using editable install from local source") + print() + + # Build docker run command - mount custom pkgs directory and source + # The pkgs directory is mounted as read-only and will be copied to a writable location + # The run-conda-lock.sh script will: + # 1. Copy /custom-pkgs-ro to ~/custom-pkgs-writeable + # 2. Configure micromamba to use ~/custom-pkgs-writeable + # 3. Run explicit install to populate missing package files + # 4. Run conda-lock which reads from the now-populated corrupt cache + # We can't use --rm because we need to copy the file out after the container exits. + container_name = f"conda-lock-temp-{output_file.stem}" + + cmd = [ + "docker", + "run", + "--interactive", + "--tty", + f"--name={container_name}", + f"--volume={SOURCE_FILE}:/workspace/dev-environment.yaml:ro", + f"--volume={pkgs_dir}:/custom-pkgs-ro:ro", + f"--volume={EXPLICIT_LOCK}:/explicit.lock:ro", + f"--volume={REPO_ROOT}:/conda-lock-src:ro", + f"--volume={SCRIPT_DIR / '04-setup-editable.sh'}:/setup-editable.sh:ro", + f"--volume={SCRIPT_DIR / '04-run-conda-lock.sh'}:/run-conda-lock.sh:ro", + image_tag, + "bash", + "/run-conda-lock.sh", + ] + + print("Running command:") + print(f" {shlex.join(cmd)}") + print() + try: + subprocess.run(cmd, check=True) + + # Copy the lockfile out of the container + print("Copying lockfile from container...") + subprocess.run( + ["docker", "cp", f"{container_name}:/tmp/lockfile.yml", str(output_file)], + check=True, + ) + finally: + # Clean up the container + subprocess.run( + ["docker", "rm", "--force", container_name], + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + + print(f"Generated: {output_file}") + print() + return output_file + + +def main() -> None: + """Test conda-lock with different pkgs directories.""" + parser = argparse.ArgumentParser( + description="Test conda-lock lockfile generation with different pkgs directories" + ) + parser.add_argument( + "--micromamba-version", + default=DEFAULT_MICROMAMBA_VERSION, + help=f"Micromamba version for base image (default: {DEFAULT_MICROMAMBA_VERSION})", + ) + parser.add_argument( + "--pkgs-archive", + dest="pkgs_archive_name", + default=f"{DEFAULT_PKGS_DIR}.tar.gz", + help=f"Name of pkgs archive to use (default: {DEFAULT_PKGS_DIR}.tar.gz)", + ) + parser.add_argument( + "--output-name", + help="Name for output lockfile (default: lockfile-{pkgs-dir})", + ) + args = parser.parse_args() + + # Build the Docker image + image_tag = build_conda_lock_image(args.micromamba_version) + + # Determine paths + pkgs_archive = SCRIPT_DIR / args.pkgs_archive_name + + # Check if archive exists + if not pkgs_archive.exists(): + print( + f"Error: Archive not found: {pkgs_archive}", + file=sys.stderr, + ) + # Try to extract version from filename like "2.1.0-pkgs.tar.gz" + archive_stem = pkgs_archive.stem.replace(".tar", "") # Remove .tar from .tar.gz + version = archive_stem.split("-")[0] if "-" in archive_stem else "VERSION" + print( + f"Run: python 02-reproduce-corrupt-repodata-via-upstream.py --version={version}", + file=sys.stderr, + ) + sys.exit(1) + + # Determine extraction directory name (remove .tar.gz suffix) + pkgs_name = pkgs_archive.stem.replace( + ".tar", "" + ) # e.g., "2.1.0-pkgs.tar.gz" -> "2.1.0-pkgs" + pkgs_dir = SCRIPT_DIR / pkgs_name + + # Always delete and re-extract to ensure fresh state + if pkgs_dir.exists(): + if not pkgs_dir.name.endswith("-pkgs"): + raise ValueError( + f"Safety check failed: refusing to delete {pkgs_dir} (does not end with '-pkgs')" + ) + shutil.rmtree(pkgs_dir) + print(f"Extracting {pkgs_archive}...") + with tarfile.open(pkgs_archive, "r:gz") as tf: + tf.extractall(path=SCRIPT_DIR) + print() + + output_name = args.output_name or f"lockfile-{pkgs_name}" + lockfile = generate_lockfile_with_pkgs(image_tag, pkgs_dir, output_name) + + print("=" * 60) + print("Success!") + print(f"Generated lockfile: {lockfile}") + print() + print("To compare lockfiles, run:") + print(" diff lockfile-2.1.0-pkgs.yml lockfile-2.1.1-pkgs.yml") + + +if __name__ == "__main__": + main() diff --git a/tests/test-corrupt-repodata/04.Dockerfile b/tests/test-corrupt-repodata/04.Dockerfile new file mode 100644 index 000000000..cf6fa34c5 --- /dev/null +++ b/tests/test-corrupt-repodata/04.Dockerfile @@ -0,0 +1,13 @@ +ARG MICROMAMBA_TAG=latest + +FROM mambaorg/micromamba:${MICROMAMBA_TAG} + +# Install Python and pip +RUN micromamba install -y -n base -c conda-forge python pip git mamba less nano + +# Install conda-lock from PyPI as a base +# This will be replaced with an editable install at runtime if desired +RUN micromamba run -n base pip install conda-lock + +WORKDIR /workspace + diff --git a/tests/test-corrupt-repodata/05-test-update-with-corrupt-cache.py b/tests/test-corrupt-repodata/05-test-update-with-corrupt-cache.py new file mode 100755 index 000000000..f5eca392d --- /dev/null +++ b/tests/test-corrupt-repodata/05-test-update-with-corrupt-cache.py @@ -0,0 +1,296 @@ +"""Test that --update with corrupt cache propagates corruption to lockfile. + +This script demonstrates that the corruption bug manifests during --update operations +when conda-lock reads from a corrupt package cache created by buggy micromamba versions. + +For more context, see: + +""" + +import argparse +import os +import shutil +import subprocess +import sys +import tarfile +import tempfile + +from pathlib import Path +from typing import Final + + +SCRIPT_DIR: Final[Path] = Path(__file__).resolve().parent +DOCKERFILE_PATH: Final[Path] = SCRIPT_DIR / "04.Dockerfile" +SOURCE_FILE: Final[Path] = SCRIPT_DIR / "../../environments/dev-environment.yaml" +DEFAULT_MICROMAMBA_VERSION: Final[str] = "2.1.0" + + +def build_conda_lock_image(_: str = DEFAULT_MICROMAMBA_VERSION) -> str: + """Deprecated: Docker build no longer used. Kept for CLI compatibility.""" + return "" + + +def test_update_with_cache( + base_lockfile: Path, + pkgs_dir: Path, + update_package: str, + output_name: str, +) -> Path: + """Test conda-lock --update with a specific pkgs cache. + + Args: + image_tag: Docker image tag to use + base_lockfile: Path to the base lockfile + pkgs_dir: Path to the pkgs directory to mount as cache + update_package: Package to update + output_name: Name for the output lockfile (without extension) + + Returns: + Path to the generated lockfile + """ + output_file = SCRIPT_DIR / f"{output_name}.yml" + + print("Testing --update with:") + print(f" Base lockfile: {base_lockfile}") + print(f" Pkgs cache: {pkgs_dir}") + print(f" Update: {update_package}") + print(f" Output: {output_file}") + print() + + # Run conda-lock locally using a temporary copy of the pkgs cache + with tempfile.TemporaryDirectory(prefix="conda-lock-update-") as tmpdir: + tmpdir_path = Path(tmpdir) + tmp_pkgs = tmpdir_path / "pkgs" + tmp_pkgs.mkdir(parents=True, exist_ok=True) + + # Copy pkgs cache to a temp location to avoid any accidental writes to repo + # Modern Python: use dirs_exist_ok to safely copy into an existing directory + shutil.copytree(pkgs_dir, tmp_pkgs, symlinks=True, dirs_exist_ok=True) + + tmp_lockfile = tmpdir_path / "lockfile.yml" + shutil.copy2(base_lockfile, tmp_lockfile) + + env = os.environ.copy() + env["CONDA_PKGS_DIRS"] = str(tmp_pkgs) + + cmd = [ + "micromamba", + "run", + "--name=conda-lock-dev", + "python", + "-m", + "conda_lock.conda_lock", + "lock", + "--log-level=DEBUG", + f"--file={SOURCE_FILE}", + "--platform=linux-64", + f"--lockfile={tmp_lockfile}", + f"--update={update_package}", + ] + + result = subprocess.run( + cmd, + capture_output=True, + text=True, + env=env, + cwd=str(SCRIPT_DIR.parent.parent), # Run from repo root + ) + + if result.returncode != 0: + print("STDERR:") + print(result.stderr) + print("STDOUT:") + print(result.stdout) + raise subprocess.CalledProcessError( + result.returncode, result.args, result.stdout, result.stderr + ) + + shutil.copy2(tmp_lockfile, output_file) + + print(f"Generated: {output_file}") + print() + return output_file + + +def check_for_corruption(lockfile: Path) -> dict[str, list[str]]: + """Check a lockfile for signs of corruption. + + Args: + lockfile: Path to the lockfile to check + + Returns: + Dict with corruption indicators: + - 'empty_depends': list of packages with no dependencies + - 'missing_sha256': list of packages missing sha256 + """ + import yaml + + with open(lockfile) as f: + data = yaml.safe_load(f) + + empty_depends = [] + missing_sha256 = [] + + for package in data.get("package", []): + if package.get("manager") != "conda": + continue + + # Check for empty depends (but allow packages that genuinely have no deps) + depends = package.get("dependencies", {}) + if isinstance(depends, dict) and len(depends) == 0: + # This might be suspicious, but some packages genuinely have no deps + pass + + # Check for missing sha256 (this is suspicious for non-cache entries) + hash_info = package.get("hash", {}) + if hash_info.get("md5") and not hash_info.get("sha256"): + missing_sha256.append(package["name"]) + + return { + "empty_depends": empty_depends, + "missing_sha256": missing_sha256, + } + + +def main() -> None: + """Test conda-lock --update with corrupt cache.""" + parser = argparse.ArgumentParser( + description="Test conda-lock --update with corrupt package cache" + ) + parser.add_argument( + "--micromamba-version", + default=DEFAULT_MICROMAMBA_VERSION, + help=f"Micromamba version for base image (default: {DEFAULT_MICROMAMBA_VERSION})", + ) + parser.add_argument( + "--base-lockfile", + default="lockfile-2.1.0-pkgs.yml", + help="Base lockfile to update from (default: lockfile-2.1.0-pkgs.yml)", + ) + parser.add_argument( + "--update-package", + default="pytest", + help="Package to update (default: pytest)", + ) + args = parser.parse_args() + + # Docker no longer required for this test + _ = build_conda_lock_image(args.micromamba_version) + + # Paths + base_lockfile = SCRIPT_DIR / args.base_lockfile + if not base_lockfile.exists(): + print(f"Error: Base lockfile not found: {base_lockfile}", file=sys.stderr) + print( + "Run: python 04-test-conda-lock-with-pkgs.py --pkgs-archive 2.1.0-pkgs.tar.gz", + file=sys.stderr, + ) + sys.exit(1) + + good_pkgs_archive = SCRIPT_DIR / "2.1.0-pkgs.tar.gz" + corrupt_pkgs_archive = SCRIPT_DIR / "2.1.1-pkgs.tar.gz" + + for pkgs_archive in [good_pkgs_archive, corrupt_pkgs_archive]: + if not pkgs_archive.exists(): + version = pkgs_archive.stem.split("-")[0] # Extract version from filename + print(f"Error: pkgs archive not found: {pkgs_archive}", file=sys.stderr) + print( + f"Run: python 02-reproduce-corrupt-repodata-via-upstream.py --version={version}", + file=sys.stderr, + ) + sys.exit(1) + + # Extract archives to persistent directories (for later inspection) + good_pkgs = SCRIPT_DIR / "2.1.0-pkgs" + corrupt_pkgs = SCRIPT_DIR / "2.1.1-pkgs" + + # Always delete and re-extract to ensure fresh state + if good_pkgs.exists(): + if not good_pkgs.name.endswith("-pkgs"): + raise ValueError( + f"Safety check failed: refusing to delete {good_pkgs} (does not end with '-pkgs')" + ) + shutil.rmtree(good_pkgs) + print(f"Extracting {good_pkgs_archive}...") + with tarfile.open(good_pkgs_archive, "r:gz") as tf: + tf.extractall(path=SCRIPT_DIR) + + if corrupt_pkgs.exists(): + if not corrupt_pkgs.name.endswith("-pkgs"): + raise ValueError( + f"Safety check failed: refusing to delete {corrupt_pkgs} (does not end with '-pkgs')" + ) + shutil.rmtree(corrupt_pkgs) + print(f"Extracting {corrupt_pkgs_archive}...") + with tarfile.open(corrupt_pkgs_archive, "r:gz") as tf: + tf.extractall(path=SCRIPT_DIR) + print() + + print("=" * 80) + print("TEST 1: Update with GOOD cache (2.1.0-pkgs)") + print("=" * 80) + print() + + lockfile_good = test_update_with_cache( + base_lockfile, + good_pkgs, + args.update_package, + f"updated-with-good-cache-{args.update_package}", + ) + + print("=" * 80) + print("TEST 2: Update with CORRUPT cache (2.1.1-pkgs)") + print("=" * 80) + print() + + lockfile_corrupt = test_update_with_cache( + base_lockfile, + corrupt_pkgs, + args.update_package, + f"updated-with-corrupt-cache-{args.update_package}", + ) + + print("=" * 80) + print("ANALYSIS") + print("=" * 80) + print() + + print("Checking for corruption indicators...") + print() + + good_check = check_for_corruption(lockfile_good) + corrupt_check = check_for_corruption(lockfile_corrupt) + + print(f"Good cache lockfile ({lockfile_good.name}):") + print(f" Packages missing sha256: {len(good_check['missing_sha256'])}") + print() + + print(f"Corrupt cache lockfile ({lockfile_corrupt.name}):") + print(f" Packages missing sha256: {len(corrupt_check['missing_sha256'])}") + print() + + if len(corrupt_check["missing_sha256"]) > len(good_check["missing_sha256"]): + print("⚠️ CORRUPTION DETECTED!") + print( + f" The corrupt cache resulted in {len(corrupt_check['missing_sha256']) - len(good_check['missing_sha256'])} more packages missing sha256" + ) + print() + print("Additional packages missing sha256 in corrupt version:") + for pkg in set(corrupt_check["missing_sha256"]) - set( + good_check["missing_sha256"] + ): + print(f" - {pkg}") + else: + print("✓ No additional corruption detected") + print(" (This might mean the update didn't trigger the reconstruction path)") + + print() + print("To compare lockfiles:") + print(f" diff {lockfile_good.name} {lockfile_corrupt.name}") + print() + print("To see detailed differences:") + print(f" diff -u {lockfile_good.name} {lockfile_corrupt.name} | less") + + +if __name__ == "__main__": + main() diff --git a/tests/test-corrupt-repodata/2.1.0-pkgs.tar.gz b/tests/test-corrupt-repodata/2.1.0-pkgs.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..d70df81f07a2b1c744af690b8b3a526417e22e6c GIT binary patch literal 32036 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 +GI#zwBAk=(81Qvm&sAk*?P@yJ+YqN5O37% zFLbmZ3i@0j{qh7%a!nE?mq4=JS5)Q@3BOu2GL*G)%nH?r1WjrG!=p+hqqh$0p9K@V ztF9)#%$NvS7rgDAw>ImCk6s!#Zz52|M@(iS7l4p+%%qG(nxWl4YO2+<0;msw9-?3i zC^9|wnVOTmL(7|Ly`uUWr{Qt%03}a^npZb8}*7^vyG^4M}!&<|d74?CHoBPmz{|Q*+0u*Hy_}C2?psELo79wW;gXpM(pTRCc*6cK)FsT>$1whG5Yy z#MhC1S+7)xvZaiKj-$gvpJ3?qp^q0}y?f&A-OZdP*N-0t=Uw<~WMzUr4;H*zaFiC5 z>@rf6*u)zdrb)`K^_WB6DY-E%A2 z>6wYZTz4ipZrA*P!~Bs_HTRQD$zHPj90e1xSy+43i3g#wi#~~;G8hhU-NAcNwFl7H zF%OZP3*%lH83AvmiVK??5}U6{;r7Se!A^r*ZGFu zVA78)b{>)!g(#T;$Se^It%8l)Rh4QnXEV%sX0OdK+V~b<*NeZ*tkEW^mCU76V)SGg zX+*E9bbtJy*vC-GCkN#9TJ5|~b?(?3VTX%w`ACRwCwl!6IeH9!dGZ=H*6HTS6KMcBh z6jM7fAs^k>4n1_wDzKk^viP;&WcX1DzisIYyl7&`MSIdRgj*@8hOex99F3eTk&5Xq z>iu^6x_6}xG0*nkKvjNgQ|QN2bbB}R(fh;2eWKj=Jey~1ayOS=IjinnL{|;sa^S!d zh}s1p$uf%-?S#s^K@pll<41_^GIur9uUmKrp}=8k!-9zJH!_M5rk1AVw;Bqwc?`YD zUiUyma>(%*(@xD<$n}!(Zf*9aa+-BV#=+Cz#15o302#@^lQp2^hS|wK7g@ton(X$Q zT|13dl_`ai3@Zj2HiPXzqDaf=G2~DVghX*boEw;(1%fxLD!n{&Eoru&7RO9?>0R}d zi*Yefl8g71^|G^lHFbr8`8D;A$~Lye2Q&F5fUEqj65a0*hE67ej~9LacNtbQ*0j8J~$pM0+o%^ZhQpzqbWuR?%&T)<1aat1!ZEI zeVh{gNXsOLxk^h8VSW{T3CV(s;|_dC7YVy3l1WxE)=Q!*4+jrK3RK^KlFoaVzq`BT z&VN3X+yP-ik5b6UppgZoS1w5K8waVYXz~@J@5h37P7Tsf4fs6tvSZoEcPJ|(z@(*# z^Vy>FCH&?0em^GYksXB{zW;MYP+s8572Xvq)6Ubnvl0pb;F^jdXmSI-s zfdE4V9nec#MgN1N)*-L|xf{ss(x`2>rOULh=6NkkrDpIMB`5u$!9W2YmdJOzP(BKfdP;Vl;%@5-c)$5u1cw3P!eo&33oc4iGXIT<#cQjBjhl@#TXq8XA zb%b6o`~yyK7i=(g2YRheK35uX-D;C2jja}L8c`h(lJm3 zjn7?NZVmddvlbn8zT?rBOOmjj9h(Af6zgVafr6B~T!c%xf>Uy9#Ly{=*yzGto!{*b zPcAn5s<^^jwAp|-lWPa^O2_goUW_~+jK>u7)x0Ze2(BikH4 zu%ptLhaybqioW8>1CywJi(8+?4#5}|<7y}j;odTqs(cDP+k$Je^avf4wxML0P7r^B zW(-n30#XK<(+$yjRX)OX$29_vCz61Gw0Nf-a930QVhzcqX z(f03F99f%s@1lOYP^SIJbcm*)vGlu9H)G99DO>LL=hcEisb=K0I}+GELl z;|e72V^df?Sqy@Y*G-+l`ic8vB!gBRfthpbSHf3UievUTHiL^1Esu zqmtgSr0>EIcIN-9?7YLN`~$yluWUj#$p{&R$~b2B9wmDfAtE7h+at;=QnB9BlZbDfa5pClK|McP7P=7k_S&nKiz}7m8v0p*ae})~DVFfc-;oi&cv7;Ner-;eVyIp&fPa$rOzB{@x4~nsT3`axgyNIsl z1E*fcn9IUk`q32ZStqAj{K2njsGXc1v=X(&sOg<&W}b^MIk>-mHu5K{w9MX7wew62 zvi|tjuBR5e`;qR`(fKrRiv_q5kT>~tH>f6<@X6LELvg31>B+tSnQOeS+`LV4R|;v! z1X#X5a=cP7{xMjNC`CSL-?Q{P8b9d(WU*|@){REXOKnBw9`k!#8~Az|*z{}S57`c_ ztFy#V+JI3b6h?y-1YkZ20kCwuvxar>J4Fp8Hw6NJVbL@r zk^4JcMA`|&&e1Y+Cd`aoMEd?{^8tjKp-fz*4Bx~-i^121pkD01b{#T(B37jcCKh{< zVseMpoYBUx&?MeGvaDEOp68u~L&y1<)pRPNu2&9YeUsx5Zr!B*PjXc+O9vHaEafU3 zzX}`=PEb$Xp94FDZ?F$-8aUO#35~33LT4UPx5PyvR*Qt$Y z%QK3Y*c^fP;VE4lL`*f_kx z512$mpCbc;%cyo_T5k(7b?`oSsg(~Q)hB7A-z12!UDx#PvFU5}(OZm+i26}-J)6e^ zL44vWa6_WAVAw$&`!6J5MYKFm2I65p%6iFX>tP^a$*jmushzxiM31{ac4qw- zxu;4=iF8DY<7w(lzRpYn3{Gx64Xyt}-Xs;oTS`)u58Cijea8h?jw){wFoma>nJvE; z6;&@Hr6b-I(uH7t@JL+RSq6lwRZXx|KWO6y`f*_R1Nhg0^evR*=6^=BRQKz-f8kRS zu85bTDIT$;^h%87Gv|qjJH=jrPQGoz+Op(2XfS*nVq@5|-}GRL)jlaPk-7B);@$)y z@ifXI70}m&9fln~JB)}YmKIpxnV5Og?(hzs+7&NI>oIXZHICbM8H7?H`q?HFFqB*a zA(sDFxlYli@aJVm+MAIH>ii@;=jn4I*}n3py(V#DNAN3O%0g*r+i2gI%#1I!R2$4R z!DwX_c(-ndVhetjfOH*!<8!cdgt3D38@SKowXb%i_4&yfaKJ8s0uldH`E3U0SApaO zf&V6w%yZPpMDlOkDmfm((meQP0}HJBfuE)r4YxI84>gytbdI zhSA>=td&qhW3WB3&rFaH7CEx-!?Qgg$%ppy*0}aJeje$(;5_jrdwGHkdD!WEP-9 z7Mn%#U5(>)$Ia27_hFP3tS|xcPl5S=wr&U1`lfvka}6ng5!X1yGFtLq;2}-2>B~nu zJtQaVV!KUF8zjNq)JJ^b>@8uUNGv5jLNJ3bY89+|E9V;5L8VU$WQ2?@Y-SBX8>8bX z9>uWHtBa~sFXF=KYeL%(j{J)kU&Vh3tqP+v362Xe2V6ueRPPz*FZ_|>5 zr5|QUs;pr zYXKekDdyHI@X!!Gx^V3p&p#6Bn{)qCm z!rc_rsY`#~RbRS8z^tJyr8cs~6hsRR-?8VaYee064zMTip&!s*MwfR3P8?d1WtI5| zSA@P*Uh_HqAo-1rWxd^_x~YZfVWk^&Qto;=znV|2n8C#*S$$*_5-{CodHl2kEm#p6 z1%#}xe|}{tMO5mF4t2%RG1S})FX485?D6r4V0>Ax^p;*r3>ot*ql>;&lSLKsH@$^L zaqsdC9YEAeP_kSh3ll{qy+QO_qPkFN(>db{U}E5q{ww@ByZr?0pt5Yodk+INQt*${jO+Y+<16ugOn z<}^V=w?)+By;~@oVJW!aNphO9dH<)ih4iYM*LoSxIg3TJX8m|J%O~#9*|~7h1EHhz zM0~*C#DFM9BE(9u{ijU7EkjY|-2$zbySR9SBr1qx$Sc%F5C zOHSYp*_VA4DYJ9L)5rTCKbRjsASXai9!YIjCY<`UV4*Dn`kg)KCT_I`>G1$@XKe0- z|4g9W?V{06D18~=#!U6xL*t6!%)*cNh@0~Vu0<^8S*24*7K?s(3Jql;DYwEv-h-rT z-Y+zGcch(T{crMXoON_^!n{^Jpu-;Ls*Dgpe2nvn$}NcbSP6!Z-CJf=YCW$eruSd(+(gRrZKC=6V z@IDpKXXO#t0f~(|ISJMKNXPp^u^Bdl`K`=Emvl6WwM7k^G(uhormDMEPCCuxTFf-V zm29PtF~`DL<)SrKk(6O`Bq>PSZ4ORu1d{)Pdo`q(Vjh96&HR1X)wtuUaU#Ebou0L5 zfb3j^y6B?9%f^42oIU(YH$ad(G=2nx?|{T0)61xFDV{7~l)cG+8Q|YCMh<^w7|l>K zz#iPVXDWJkG6bTAZv8k;Jv!y&gW`+#F;%bno&vH*x9hh6jCqMScG*%(@r?&uH1- zfhpNPcejgV+LMnK1AJLV#OB%Bsk;{Bd~4%A?hK{5>nj)42HvjXX>+{svht6t;bZMG z^+n$7Xo)_ijfc07?~71BKLpsn=wm60Qw;L%io~MHHh@u<*OT%});tnDa_QTCt~5dw zugOJdSV`7Xb|2YKbM0PT$SP3{GQAs^`fag$WdZg1$h)nN+%B%6XfEp%L)ESZd|m-R zE!gu9JR^qL@a}4Quf2ke&pb16i!_L5_+{Q`r#-1 zpzagtlzm!pE=c|i==gc}p;jfZlYn*nL?pM)7p9V>T!;#ki3`}^%;dA%hidYM#?l9PM~B^?l30H~B6mW9cn8LQ zP%J$Ty=4NEO#~iF#5n?TjAi}gCqQ*L`A7g$Ab8($5(J^&=;Y)MRKuBC~ z*~LWh0__r2zGI_?(|SGw1tZQ?RO+wjj-kkoHb75i14!vC=}!kud~!HHoVfyp3c{Wh zp!{q6%__=4Rzm&GU}N3E9ZiEQ0bVjBNa20MT*=+n)|Wj@tYih_s5L*8gTvncu7JoP zz64kHL!bWfj9k`?9gUu8t8^-Fp8a$6?panU-7S9pl!8KZ)5rapec=b3laY$t3nHxb z`1ldXr#5|nsHT_Yr8-F)FF#SPn1{;}BrtbC;7j^s3;Y9MB0eO-? zPhC;i1Fq|N<0}qfe;e~qUT@7Tr6PX+{GxgoS~j*r;Hr9zE#C6UWr~`>ysq9${PK4x z);bDTU`a`HFud%LJbEd}{`TGXb`LG>8{o&~|I+=N1WlUK#SI0s)7aYD>We)p0R=Vcv7ePip?O$kT;+ZA`S^d|QE9*gIrf^0~lJ zX%B8IZyEDI1mRL`R3PEAX6qJ2u>G)A+Ii=DAJenk&z>X)==(43C>UdB{c93>8AODe zfs+-S#V6mSa(@ZA^?f;3A$)XR;@f9fQZW3A8F?Vam##`=F{l;qrP@!^w5A{=x)RdqfqT0@*+h zq_l>W#s0y_Glr)wroE9BukL$|smhp%g>QaT6k~EN+#8A~41M7R7lMJOAQqE#GE{ox zbMVZeIU+uG$4=uA=ZF3F_xjb~N1m4IU3WJ8&3zPJ#6`??S$jp%y`F056jgI2k#S|L zG8}KgYSJlvRe5v(#5*BsByUPj0HwAdc+l15!I1U(??K(0I6<-1zu`H;h}~{ywrrX4v=j*^+b3$NpAg(Yh-P?=Dk)-GT0? z0g)aY>SH$)cN-m&%N5MfIdp12(Ckwb!9+KGKrSx#dOByZb6~p4U`3!Knl@26uq*6l zip{r?FGK2UJl?U%)9F*2>`QtDV;A`zvDVY;Gse!hcxQ_-wAKFl{s zhOAfBzWY}nbFj~e!@JRMthkpzGt6qnfN_d8{?Bcl6&-|0q-L^$LQb|YX%Mh==rOVR zg!!;77$cXU{IxX^83_8gywK^;*cAV8`h2MZ4Z2DHVWL)0&IW#jA#L10L|*ZY(?4`q z*oc@YbS^Fl@zZ!{k=N>p)02^qs9NL^wNL~+ZBbRf#c5;zn8$gnKjbI0^UPDOpkbU^ zw7iM_e5>+X)vq`{hQGiKZV&{Wi_qx~*hq7mK8Mlqw38O$kPUCMR>7-WJ{O8dd(zh- zdn%g0;PrpbNgZBlvjD`nFwb2}e>O;b-iXZCh|7k*jVXoq%!fF&1(KcJ?jGQJ$Wd#9dPH8#19P;6Kbl=cV%3Q{`v^5=MV!Azl9l8Uu-}ubEu!?a~erA zOH3T={NjM9)6CgPbksmY>rE-`Rkf<>NTz@yR^PYEBBO7g5oJ$}l$5kUk|H7ICz;1P zCIB*GRDC#m0BvE>jO}(4dvxm-#+u@khxD?c3;CWA}_W>(88VnoO@wYLFTi4HUu*= zrr6DG%hrd4T2Q~ebdH3*Fzm27&sXmE=TsPfMj&(MCa*6ahgUKn$Dw8V4=^6PnC*O@ zMbwjf%R`fWn;}2q6HAq1|7!_OQpUYP&shh8fUrJaDB6j{d?)s)zZiFd}Ky{S|= znvr$g5&u{<5`bVbgrm-l6uX2mzAv}HYR60DwS=OLJmTyB=Lq=RC0Aa67!9D`G-@6W zq+a-P`#VXx66!jlZ{nH^?<Hx1*#H<&7&W)V2uYiGk?rIEavj zGY`=v?f)mFT}HDAEB4Hz=uFiLi8I)9E=uxKR!iTI{(ga_=(V!zTZ1OCbtqEl=^Dm}Q62b4Xle>U;8nR-!`sH%N9JC;KH)<8hA^QrnY?PKk| z5k&!7mf!IB9RH4`xQ{KU_2d_JekyF-Mx-mbA+udc2}Vx<|B?hU*+1UtfHU(iJj|x5 zbNCoJbYI$|t@Xb}%M$HyXCnGCYQF75!Yex_=GuiQqW(8%+^odvI%A;4D)R<#`3oHd z7V!d7=~M7;xJlsqH{9IO{x{r2GWX&YG*!g~mpqz_awK~Ex8v2FOdMBtXsz>4pD(UV z6(xJyRH|x*U-|k_lV>#lspB&G87$?%eut!&)o|_9u}4HwQr^n;1=;o>#Jzli{-3Io zVE9Tc%rop{q3Y|BOX|oM%WN8vpy@QV)3Uph4*n3(>=cM{n015|k>5t_zy0tmdbTa% zcqgy7%b7ntMqX7{JLT6G-y|2WRJRryQ8IM_itP?j5)zq+w34=PY&e^Q@khGEyfbW2edi1AE(`m)h_lqyKy zYq;ye0CxJ3dUio@3V3tn6jJ}MO!OBXlj4p-21;HMq%=a(sxhXlztnTuq6%3v*rp0) zRU&fF`HEbWX;uBsVfd7^I9c-ZZ0IfqA;xWe5O#k`2vM4%%^D-1SrJAl!W&Wn2Ooha zC&_96Jo+ubl9Z}+bwlCNeU_>ayP>CkGE#d!@QWZW39CyEx=)AQlh_f$k! zJVL&Q1U@9c#xugFUI);MfqVwOf+E&KOdwUA==_(Wl$=P>EulxxqZb4DNkjYKcbXCr zD#=HF<*M`5H5ni-#(PV<11j!7lR6w#n!a?xBIsgJ+gUL)+<3%eC(TwJ{ z8%-#}fiVQ{0ME<0mR}Wzw;3-{3#IhNhB57X^c6OoLV;9XTi_iA2#}e~fDB&H3gaoe z|HBRzGaRYf)3--4deGC7n~9OrbS81bYC=5o3~GXTuI?16jSqn$N0o*5qs&_ zr|DLIO>QM&l2*Pr^pZx)*a@m@{QyI|c!WA*>myTkak9G!Z{yw=a7kN5#S0=_yl|y4svxc19%w-F>AyX&&(rCn& z&jtu@;hr!OH@YMe_es>;Sq317y$q94M$TWF>ONGJZmYr#m>w$;X^t!KY0h;THq5EEk4G6JL$#4?Z0p?J6o=q_<*ogl^8>pyPl z5GkKO*G3#+Yj#r_9Dzy2+8KF2iDc;IrV@S8?Xz1GysAy`Tn{yq1+U;MXPQ~!$%}!tLi$(I_$!z-KLUxj6 z^?>QqL+q6g6>2A7akDri>~S+R;xI*W@mtcVc4K9Y!dw+?OsfX?Y|Sm2@0NStk0 zXw1TKdbBWi4EGg>)xn?iPD5B;{%Nc@vkDK@$N6k`%Nq2(#gWl-$~FcFcM)}|%G;X7 zT(}bPAb9rq#}68VU={0-vj~XAVD#@}@Kvs`5=aF;sevFuVdJ8M@>n&wcPs`$o@ne`YSsxJ>7__yk_-q9uG>a3A*h1J0S=-iAbG(aB@L z?QQS!HzLw69)@qej#02!j^yNU#MZ2QcXHBt>hBrAY5Ri&H*-M~Ht7m25HJ<3otFCKe~C z{yw142=uLTW)v54OW&U1PfB4Vd82GMLGIug@(OqyG05Ri(lPTOw*dG&A~^ib_4>$S za;r-7Jj39K5sQn2G(~k+9tTaANc{MZ_pg)KwQ1AO@!KaGN_-3MI)VIeYAZYZps{p* z;7z99m2kcT3Qh-CBj$nPb+DBKPVZ2f_d~_Vw%)z+W4KSOqMjP%oThHCw5Q+vo<&~% z%u)fMUO*cHlv?ylJembL&yLYHoImcuKDgEg$3B_8%S8n>-(y)S5u|`{*_c6;aEDE2 zg!CPj{SYa+YtQV1>K=U0F4;hlk(`ci=4YilY>-JBbJEpKJf9iSR4*jj3ufy& zpyXbt;cQ`MtyJ(s*FTsF;Hp)gvxWwL#Q23LIZG`Ul?KEB66LP!k zK9g62(qixX^BM#Oo;bD6e;G6FL&?sgC9vS-33}laESmx*3EA z4Vmd>()UJx&`Qw2_OZIqnMbH(lLxR$SP-!Uz82xokCJ6|$cOxER z8HHR&z>S8y4gsCiHX7RS{Io|g+_haChRx2HX1hR)F_1z(AFt5R>!1cF44-|0`M7$ zIh4?M0tmt%+HZ{Wowfu?-Oykr%KRGWPUDz2satQ7Cfv!TUw(-upyjwg7S8Pl&*TJ_ zko7%yB(5s;N1vA`|L-5#D++&XScp5$(N8fOd6s`E9lNT{BzNnwJL$LFepb~;i$0U& z^eUS}wzEzW<#qr)qolnbM^kj{E|79|(S&Ss8)S|EGtpxRw+lXa&$<$T{gz+aGDO3o zCUn;WhaMHX8sfI;561~Q2I4bCunzV|J}NNUn{HJry0^HPWsW|br<0uHV>&C-LTdNb zl%iC7olQCNk}u8y;xf&;qb5?02GUG8{@#iYO-chwHwi#Hw6^dpJ2u9=8~IekW$$7N zk1CtcP0&c-H@BQgdR{!Cc4B<#7h&P;3lM2%#0=c>TrN^kru}`K@OE~19vw0S9&Dhh zM6sCTUCfgOw4#B02tE$iHO`jt+xwQ2s*$;KRn5p~n#cj4rx+(qpqZ&$)W^Z#(?_Y1 zL9O`1AP{FWfzWLpF8H+FMaKsOy?pO0!HOyrs!IoC`lo;$&SeKYj0}ToOPMoWH+S3% z9e-)QomCeOs*5-?D>&D7NI9?6v73S`NQ}0_YfInHgNSagLo40T=W?*+R85MH*kN^# zN}7pm)r?@i?d00j-onUiaK`QojgVTGRWIk1>}?sDD5J|!hlGln{o)OP@@cN0P^FSe zr|eqAXLdt*vv&Y`*YNc!;6AFnJKa4l_47`~n}z|Umhl4RZ%`vy@Z;NKq@M>GX6zk0 zoHV+oRpJy1cViEDo?K3FKNfe!t?pShbIGDY*Y&fp{06ESw9@>IUJ~NBAG6Mz3(Y?) z02&`_aE#AI$l;e}`R<(MvdFc(4GTlETAHN!@MncRVo5LQ0f~!Q zdGyAZ-~*ldZf=q$yO8UoFE4IzoPdQ^W%76EPY&#YjS|W7fX-JIWWGE$=DUhm>pRnR zK!vaZ@PC+b(-ZSoUOO1b2t=0hfBk~*Gp&2I0&d|jh5L{c7DLNBC>d4AF+t2j+ zUiVo>K`{;?4)%-qjfat8bPqUb!(W)nkrHiwO2`y{k@*I}F`O*@4aP2E;UxiEdL1ti zPo+WIe!4twojSXHlH5fo=(v=v1(LfU?`aUy8IpN}#n+hPvf2k-Xj-ndp|oM^N}onw zOj%1yG-KBH5w63T*&*x2u4~}*Q&l?1IYvkC$%4ao_*xrciUFXS{>%Pr#IiAE!e>4? z=2r=vROO}vXIHvN0|x~@Q$#31!F%o3>+pKJHjm-a~Z!O!}F?Y_R+ zEM^m@D*g=?DL$BAb{7Z>)h@VLuSX zXAVH82J(tjURTXx{k!XAj0$g4+gvX4RA)*LivvD3uPM$K@;l2%%`&ruX4f!$C#4CXFb?L$_01#7~N3X$!(g)3UkH1GIXg}jFy+V_WS ze#I7mCp4RjC>jqK8FCzBG5B@J-%x&%!Tn|1ck7iGjut`BJX*wsxqp7=xG^cVn{Plj zNZz4`t><^#p=+`@P|_ecj60>#=xAY7bh5qx{WQR1N1_FWqJezm!w?sKHkda&+UM^z zI#!yltE8RoeMG5;Z|A&Rw^DE@E5P2L21{jS;FH^+Y<#9$bv>DALbaLGg6Gq+Dx|Fu zFKeaIqDrUuRPC#Uhct2}y_3#-)zMr^_0muQkoT5nW42tE%r|G24HC6w2cI%d&~1?R zBDxue`D*#?jdEhkC+k(N1s7J@omch*;4jI2^s= ze+u(qK<#nKsbWv^f9qm$~aPYJy*WWQpQ1%S%8}2}pHzfcPwqwaNe?-$Y~INfi-YVvBHTrduChgq((P8MW8z&J`jw zI--UR$iobnZbO&%!GH{?{N?&NAJU_aE-Nx3`Z|Yd{&=DGmMoo|{6k7M`9=3S1`|;^ zF00K?uU9UmWOhL}*OZ;yXB_0gYgbrN3WqV81AYBK@#<@zgF0|jT(gD7gT~NW`)eq%yI+1oK)^h_;W$}t1x16L zw%JF3lk>-U!91m_m*~FcdR_vi%neB_#BCI?3x~8^zxCUSclCEY@^@|&|BVSdR6M3K zwH+j)@c;TzbSY*HctX#~%j|c^W^`{9OvX!WGz)cc;L|ht0E=|KpE4 z6jO2u5tt!#)wAN=wVANc+s(C+z(=tC>j1PV^%xO9j{L`L2My20=(3u$0ttKto^`!aWF z#pA@PDSC5EK8l^yEYA^1IL`ea#bx4_!(oW(p&YGV&wORQ0TOQx)6#lhX2J!(<;gHC0e zO;%Qc1=ZPJ{fko^1lIm;CJH^(aLuyA2f-ail9{1HfRSnw1IRxkviqnq7hE@xA7^)0 zdM{aHM*4t;C5AhQhpRQ*WZ2K$&tBt7Y!NSAHRH$YZ|^qQPhLgQiF>jVz}v8|;|GLH zH_T2vK71|ULz9d>9Uq+A3elzu119xEm@gN=`*wTcMqtFXMN*Mtf`Z}~jq)GWkSc=< zKc7joihJKzk;ELV7(>m~40Fj-jRNw;L%A2K2OjxQ+GBa(B+qm zq{Xx;;a?vJ@Ewj#;_wW6#E-fltdFY|aN9z@eT%@Ob8h`6XT%6^@ zjXA0s1+(Ax$>4gPN-5nlCrou;tl#Ka@XC}6_D(txCS%Va>4^_ChCclL>2qpB_1{%= zQ=;&v7SU!|`y&MxSV{=%V0E;k(GArEU=~V}-R(cfOiAoamFpU@JYQlKPZBid zGdi?WyFTeW60~_Q;!SM; zH*wsB(Z*8V;Q2O5rm|?V$>@8c%zm^qLqyc4_g5~6uN<#|8vjoR3T~6^Bue#w;lcqQ zV>2tEfCW5L1m_R-wH9*kj8RgM>Bx-AZk*3Kar3l-k5TUdgU)~F>E<%DdF8k5I!ixi zM8ws0*ALMaQ{=tAye!@?)0AE}*BH>-8euPJ|56`vjcZaBNC zpxFC)Y8R!&uwx=wF)KyXoWrYcOZhUtB zE>{<@wdpU%NIz%V$tH<8_ol1C*TX`zY}?M$-qpz+Bc*eX-8$Q>?c!ACOteA`~ZD=~(_;tA}SGXHAh8*pEXG-l$ZojIB zL1P1CJ3A3WiXMyd?0Pdyc|z21ic&a5`x-rkhdRKxbhI)@o#c%7b`#wh;hwAw$`bD_ zqRaueLSz4IiM#Xbnn_H78BgPP=`?9FtnxY*9?4=i1K~I|$3WP@40P(l-FbM(oAXC4 z(BIqd5vuDB@^6ZmI4|MyIG&&QxP`^7%$H+4Eg?Ko=|Xdjit73ciKh6e>X_jpr%nNher9CY}N88)H5{4xhA?C<@7{V^Qc-Z*EPPS2+_0C?O}HufF4HhLDXu&}k8UZz fd)QjX+S=`k1?$ZKq<=pR-EV^CDH!^=eZ^P literal 0 HcmV?d00001 diff --git a/tests/test-corrupt-repodata/2.3.3-pkgs.tar.gz b/tests/test-corrupt-repodata/2.3.3-pkgs.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..f2445732946536392781ab0318a543978110223a GIT binary patch literal 30787 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 F{|~s5a~A*r literal 0 HcmV?d00001 diff --git a/tests/test-corrupt-repodata/README.md b/tests/test-corrupt-repodata/README.md new file mode 100644 index 000000000..9eda4b67d --- /dev/null +++ b/tests/test-corrupt-repodata/README.md @@ -0,0 +1,187 @@ +# Mitigations for repodata corruption + +An upstream [regression in libmamba](https://github.com/mamba-org/mamba/issues/4052) causes repodata to be corrupted. +The affected mamba/micromamba versions are 2.1.1 through 2.3.2. +The regression was partially fixed in [mamba-org/mamba#4071](https://github.com/mamba-org/mamba/pull/4071) and released as version 2.3.3. + +## The corruption pattern + +When installing packages from an explicit lockfile (e.g., `micromamba install -f 01-explicit.lock`), affected versions write incorrect metadata to `repodata_record.json` files in the package cache. + +### 2.1.1–2.3.2 (full corruption) +The following fields are corrupted in `repodata_record.json`: + +- `depends` → `[]` (emptied) +- `constrains` → `[]` (emptied) +- `license` → `""` (emptied) +- `timestamp` → `0` +- `build_number` → `0` +- `track_features` → `""` + +The corresponding `info/index.json` files remain correct; only `repodata_record.json` is corrupted. + +### 2.3.3 (partial fix) +Upstream fixed how `depends` and `constrains` are populated: they are now copied from `info/index.json`. Other fields remain zeroed/emptied. + +- `depends` → copied exactly from `index.json` (key omitted if absent) +- `constrains` → copied from `index.json`; empty lists are omitted +- `license` → `""` +- `timestamp` → `0` +- `build_number` → `0` +- `track_features` → `""` + +This means 2.3.3 still differs from a good cache, but only in the four metadata fields above; dependency-related fields match `index.json`. + +### Field-by-field behavior + +| Field | 2.1.0 (good) | 2.1.1–2.3.2 (bug) | 2.3.3 (partial fix) | +|-----------------|---------------|--------------------|---------------------------------| +| depends | correct | [] | from `index.json` (omit if none) | +| constrains | correct | [] | from `index.json` (omit if empty) | +| license | correct | "" | "" | +| timestamp | correct | 0 | 0 | +| build_number | correct | 0 | 0 | +| track_features | correct | "" | "" | + +See upstream fix PR `mamba-org/mamba#4071` for details. + +## Reproducing the issue + +This directory contains scripts to reproduce the corrupt repodata issue by running different micromamba versions in Docker. + +### Generating the explicit lockfile + +The `01-explicit.lock` file is generated from the main conda-lock environment: + +```bash +cd tests/test-corrupt-repodata +python 01-generate-sample-explicit-lockfile.py +``` + +This will generate `01-explicit.lock` from `environments/conda-lock.yml`. + +### Extracting repodata from different micromamba versions + +Run the script with different versions to extract and compare repodata records: + +```bash +python 02-reproduce-corrupt-repodata-via-upstream.py --version 2.1.0 +python 02-reproduce-corrupt-repodata-via-upstream.py --version 2.1.1 +python 02-reproduce-corrupt-repodata-via-upstream.py --version 2.3.3 +``` + +This will create version-specific compressed archives (e.g., `2.1.0-pkgs.tar.gz`, `2.1.1-pkgs.tar.gz`, `2.3.3-pkgs.tar.gz`) containing the `index.json` and `repodata_record.json` files from each package's `info/` directory. + +### Comparing results + +The archives contain filtered package metadata. The scripts will automatically extract them to `{version}-pkgs/` directories when run (always fresh extraction). To manually compare: + +```bash +rm -rf 2.1.0-pkgs 2.1.1-pkgs 2.3.3-pkgs +tar -xzf 2.1.0-pkgs.tar.gz +tar -xzf 2.1.1-pkgs.tar.gz +tar -xzf 2.3.3-pkgs.tar.gz +diff -r 2.1.0-pkgs/ 2.1.1-pkgs/ +diff -r 2.1.0-pkgs/ 2.3.3-pkgs/ +``` + +The corrupt versions will have different corruption patterns: +- **2.1.1–2.3.2**: Full corruption — `depends`/`constrains` emptied; `license`/`timestamp`/`build_number`/`track_features` zeroed/empty +- **2.3.3**: Partial fix — `depends`/`constrains` copied from `index.json` (empty constrains omitted); other fields still zeroed/empty + +**Note:** Extracted directories are kept for inspection and ignored by git. The `.tar.gz` archives are the source of truth and should be committed to git. + +### Simulating the corruption + +To verify that the corruption pattern is well-understood, you can apply the same corruption to a good version: + +```bash +# Test the 2.1.1 pattern (full corruption) +python 03-clobber-pkgs.py --corrupt-version=2.1.1 --pattern=2.1.1 + +# Test the 2.3.3 pattern (partial fix — depends/constrains from index.json) +python 03-clobber-pkgs.py --corrupt-version=2.3.3 --pattern=2.3.3 +``` + +This script: +1. Extracts the input and corrupt pkgs archives (always fresh) +2. Copies the good pkgs to `clobbered-{version}-pkgs/` +3. Applies the specified corruption pattern to all `repodata_record.json` files: + - **2.1.1**: Sets `depends`/`constrains` to `[]`, zeros the other fields + - **2.3.3**: Reads `info/index.json` and sets `depends`/`constrains` to match (omits absent/empty), zeros the other fields +4. Runs `diff` to verify the clobbered files match the corrupt version exactly +5. Exits with status 0 if they match, 1 if they differ + +If the corruption pattern is correctly understood, the diff should be empty and the script will report success. + +The extracted directories are kept for inspection after the script completes. + +## Testing conda-lock with different pkgs directories + +To test how conda-lock behaves when reading from different package caches, use the fourth script: + +```bash +# Generate lockfile using the good 2.1.0 cache +python 04-test-conda-lock-with-pkgs.py --pkgs-archive 2.1.0-pkgs.tar.gz + +# Generate lockfile using the corrupt 2.1.1 cache +python 04-test-conda-lock-with-pkgs.py --pkgs-archive 2.1.1-pkgs.tar.gz + +# Generate lockfile using the corrupt 2.3.3 cache +python 04-test-conda-lock-with-pkgs.py --pkgs-archive 2.3.3-pkgs.tar.gz +``` + +This will: +1. Build a Docker image with conda-lock installed from PyPI +2. Extract the specified `.tar.gz` archive (always fresh) +3. Mount the extracted pkgs directory as `/custom-pkgs-ro` (read-only) +4. Mount the explicit lockfile (`01-explicit.lock`) for populating the cache +5. Inside the container: + - Copy the pkgs directory to a writable location (`~/custom-pkgs-writeable`) + - Configure micromamba to use the writable pkgs directory + - Run `micromamba create` with the explicit lockfile to populate missing package files + - This generates warnings about "Invalid package cache" (expected, as the cache only has metadata) + - Run conda-lock which reads from the now-populated but corrupt cache +6. Save the lockfile as `lockfile-{pkgs-dir}.yml` + +**Why these steps are necessary:** +- The pkgs directory must be **writable** for micromamba to use it +- The extracted archives only contain `index.json` and `repodata_record.json` files (metadata) +- An explicit install populates the actual package files while preserving the corrupt metadata +- conda-lock then reads from this populated cache with corrupt `repodata_record.json` files + +Compare the generated lockfiles to see how corrupt metadata affects the output: + +```bash +diff lockfile-2.1.0-pkgs.yml lockfile-2.1.1-pkgs.yml +diff lockfile-2.1.0-pkgs.yml lockfile-2.3.3-pkgs.yml +``` + +This allows us to verify whether corrupt `repodata_record.json` files lead to corrupt lockfile entries (missing dependencies, missing sha256, etc.). + +## Testing the `--update` corruption path + +The most reliable way to trigger corruption is through the `--update` code path, which reads from the cache when reconstructing unchanged packages: + +```bash +# First, generate a base lockfile with good cache +python 04-test-conda-lock-with-pkgs.py --pkgs-archive 2.1.0-pkgs.tar.gz + +# Then test --update with both good and corrupt caches +python 05-test-update-with-corrupt-cache.py --update-package pytest +``` + +This will: +1. Use `lockfile-2.1.0-pkgs.yml` as the base lockfile +2. Run `conda-lock lock --update pytest` twice: + - Once with `2.1.0-pkgs` (good cache) + - Once with `2.1.1-pkgs` (corrupt cache) +3. Compare the results to detect corruption + +The `--update` path triggers corruption because: +- It creates a fake environment from the existing lockfile +- Runs an update dry-run which may use cached packages +- Calls `_reconstruct_fetch_actions()` to read from cache +- Corrupt cache → corrupt lockfile entries + +This is the primary way the bug manifests in the wild! diff --git a/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs.yml b/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs.yml new file mode 100644 index 000000000..77fb79425 --- /dev/null +++ b/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs.yml @@ -0,0 +1,2364 @@ +# This lock file was generated by conda-lock (https://github.com/conda/conda-lock). DO NOT EDIT! +# +# A "lock file" contains a concrete list of package versions (with checksums) to be installed. Unlike +# e.g. `conda env create`, the resulting environment will not change as new package versions become +# available, unless you explicitly update the lock file. +# +# Install this environment as "YOURENV" with: +# conda-lock install -n YOURENV lockfile.yml +# This lock contains optional development dependencies. Include them in the installed environment with: +# conda-lock install --dev-dependencies -n YOURENV lockfile.yml +# To update a single package to the latest version compatible with the version constraints in the source: +# conda-lock lock --lockfile lockfile.yml --update PACKAGE +# To re-solve the entire environment, e.g. after changing a version constraint in the source file: +# conda-lock -f ../workspace/dev-environment.yaml --lockfile lockfile.yml +version: 1 +metadata: + content_hash: + linux-64: 478bc8b4c815f08c094483870ca25bcd5452f8f76ab8d993b0d8a1b82429c488 + channels: + - url: conda-forge + used_env_vars: [] + platforms: + - linux-64 + sources: + - ../workspace/dev-environment.yaml +package: +- name: _libgcc_mutex + version: '0.1' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + hash: + md5: d7c89558ba9fa0495403155b64376d81 + category: main + optional: false +- name: _openmp_mutex + version: '4.5' + manager: conda + platform: linux-64 + dependencies: + _libgcc_mutex: '0.1' + libgomp: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + hash: + md5: 73aaf86a425cc6e73fcf236a5a46396d + category: main + optional: false +- name: _python_abi3_support + version: '1.0' + manager: conda + platform: linux-64 + dependencies: + cpython: '' + python-gil: '' + url: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + hash: + md5: aaa2a381ccc56eac91d63b6c1240312f + sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 + category: dev + optional: true +- name: babel + version: 2.17.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + pytz: '>=2015.7' + url: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + hash: + md5: 0a01c169f0ab0f91b26e77a3301fbfe4 + category: dev + optional: true +- name: backports + version: '1.0' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda + hash: + md5: 767d508c1a67e02ae8f50e44cacfadb2 + category: dev + optional: true +- name: backports.tarfile + version: 1.2.0 + manager: conda + platform: linux-64 + dependencies: + backports: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhd8ed1ab_1.conda + hash: + md5: df837d654933488220b454c6a3b0fad6 + category: dev + optional: true +- name: backrefs + version: '5.8' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda + hash: + md5: b16e2595d3a9042aa9d570375978835f + category: dev + optional: true +- name: bcrypt + version: 5.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py314h68536ef_0.conda + hash: + md5: 71d9c4f6a05a4b9da1b03b973e078db0 + category: dev + optional: true +- name: bracex + version: 2.2.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/bracex-2.2.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 586272349d7bef5b1ef527b56dca73cb + category: dev + optional: true +- name: brotli-python + version: 1.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314hdfeb8a1_0.conda + hash: + md5: 3ef9d2a701760467b9db2338b6cd926f + sha256: 9f6d339fb78b647be35e3564dac453d8d2f1b865ba72fb961eaac41061368699 + category: dev + optional: true +- name: bzip2 + version: 1.0.8 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + hash: + md5: 51a19bba1b8ebfb60df25cde030b7ebc + category: main + optional: false +- name: c-ares + version: 1.34.5 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + hash: + md5: f7f0d6cc2dc986d42ac2689ec88192be + category: dev + optional: true +- name: ca-certificates + version: 2025.10.5 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + url: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda + hash: + md5: f9e5fbc24009179e8b0409624691758a + category: main + optional: false +- name: certifi + version: 2025.10.5 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda + hash: + md5: 257ae203f1d204107ba389607d375ded + category: dev + optional: true +- name: cffi + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libffi: '>=3.5.2,<3.6.0a0' + libgcc: '>=14' + pycparser: '' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda + hash: + md5: cf45f4278afd6f4e6d03eda0f435d527 + sha256: c6339858a0aaf5d939e00d345c98b99e4558f285942b27232ac098ad17ac7f8e + category: dev + optional: true +- name: cfgv + version: 3.3.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + hash: + md5: 57df494053e17dce2ac3a0b33e1b2a2e + category: dev + optional: true +- name: charset-normalizer + version: 3.4.4 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + hash: + md5: a22d1fd9bf98827e280a02875d9a007a + sha256: b32f8362e885f1b8417bac2b3da4db7323faa12d5db62b7fd6691c02d60d6f59 + category: dev + optional: true +- name: check-manifest + version: '0.51' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + python-build: '>=0.1' + setuptools: '' + toml: '' + url: https://conda.anaconda.org/conda-forge/noarch/check-manifest-0.51-pyhd8ed1ab_0.conda + hash: + md5: 7f4022a44e9fce926fc9eb0da40bcda2 + sha256: 18637560b1725c32680560566db00d3c16687a3b1adb8f628cbb251a19d9963d + category: dev + optional: true +- name: click + version: 8.3.0 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda + hash: + md5: e76c4ba9e1837847679421b8d549b784 + category: dev + optional: true +- name: cmarkgfm + version: 2024.11.20 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.0.0' + libgcc: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py314h5bd0f2a_1.conda + hash: + md5: 23985f6de5f68e3465807e1fbbc98f30 + sha256: c2420839a943580dece9c5857492d69732df2af6dac6cb8fd8dd92c20060beae + category: dev + optional: true +- name: colorama + version: 0.4.6 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + hash: + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + category: dev + optional: true +- name: coverage + version: 7.11.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + tomli: '' + url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.11.0-py314h67df5f8_0.conda + hash: + md5: 6ff84b39468623308dee97e5dfbafca0 + sha256: d928f6d0567807c8a09786e18966445b011ec2eb85c7e18382c0b4870cf12f17 + category: dev + optional: true +- name: cpp-expected + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/cpp-expected-1.3.1-h171cf75_0.conda + hash: + md5: d17488e343e4c5c0bd0db18b3934d517 + category: dev + optional: true +- name: cpython + version: 3.14.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.14,<3.15.0a0' + python_abi: '*' + url: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.conda + hash: + md5: ff3061d315c4a988fa1c29c543800780 + sha256: 8e2a33b36d36820698840bf0c1ed50e5dd4bdeaa434c7b4f5e13d421225b0414 + category: dev + optional: true +- name: cryptography + version: 46.0.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.14' + libgcc: '>=14' + openssl: '>=3.5.4,<4.0a0' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.3-py314hb613cbf_0.conda + hash: + md5: f291630db5dc438b6ce37c2bb1a96516 + sha256: 4bf88483f944b5624269c926369002d58951627a369aeac1e2cd64a6aa00eb05 + category: dev + optional: true +- name: dbus + version: 1.16.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libexpat: '>=2.7.0,<3.0a0' + libgcc: '>=13' + libglib: '>=2.84.2,<3.0a0' + libstdcxx: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + hash: + md5: 679616eb5ad4e521c83da4650860aba7 + category: dev + optional: true +- name: distlib + version: 0.4.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + hash: + md5: 003b8ba0a94e2f1e117d0bd46aebc901 + category: dev + optional: true +- name: docker-py + version: 7.1.0 + manager: conda + platform: linux-64 + dependencies: + paramiko: '>=2.4.3' + python: '>=3.9' + pywin32-on-windows: '' + requests: '>=2.26.0' + urllib3: '>=1.26.0' + websocket-client: '>=0.32.0' + url: https://conda.anaconda.org/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda + hash: + md5: 07ce73ca6f6c1a1df5d498679fc52d9e + category: dev + optional: true +- name: doctr + version: 1.9.0 + manager: conda + platform: linux-64 + dependencies: + cryptography: '' + python: '>=3.5' + pyyaml: '' + requests: '' + url: https://conda.anaconda.org/conda-forge/noarch/doctr-1.9.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: f57b656502db0e45cc996ddbef2a9d25 + category: dev + optional: true +- name: docutils + version: 0.22.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.2-pyhd8ed1ab_0.conda + hash: + md5: ba6a7a1c262587d333761b0cda2bbd28 + sha256: dd02330f2ecca4a489a001e5ec66ee8aa50773dc2c621c8fc7053b454d9a27b2 + category: dev + optional: true +- name: exceptiongroup + version: 1.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + typing_extensions: '>=4.6.0' + url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + hash: + md5: 72e42d28960d875c7654614f8b50939a + category: dev + optional: true +- name: execnet + version: 2.1.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + hash: + md5: a71efeae2c160f6789900ba2631a2c90 + category: dev + optional: true +- name: filelock + version: 3.20.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda + hash: + md5: 66b8b26023b8efdf8fcb23bac4b6325d + category: dev + optional: true +- name: flaky + version: 3.8.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_1.conda + hash: + md5: 7e081d00fdcba21b76658c1649691836 + category: dev + optional: true +- name: fmt + version: 12.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.0.0-h2b0788b_0.conda + hash: + md5: d90bf58b03d9a958cb4f9d3de539af17 + sha256: b546c4eb5e11c2d8eab0685593e078fd0cd483e467d5d6e307d60d887488230f + category: dev + optional: true +- name: freezegun + version: 1.5.5 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + python-dateutil: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/freezegun-1.5.5-pyhd8ed1ab_0.conda + hash: + md5: 0fdb8ebc8dbdb62530ff73181ae63554 + category: dev + optional: true +- name: ghp-import + version: 2.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + python-dateutil: '>=2.8.1' + url: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + hash: + md5: 93f742fe078a7b34c29a182958d4d765 + category: dev + optional: true +- name: gitdb + version: 4.0.12 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + smmap: '>=3.0.1,<6' + url: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda + hash: + md5: 7c14f3706e099f8fcd47af2d494616cc + category: dev + optional: true +- name: gitpython + version: 3.1.45 + manager: conda + platform: linux-64 + dependencies: + gitdb: '>=4.0.1,<5' + python: '>=3.9' + typing_extensions: '>=3.10.0.2' + url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda + hash: + md5: b91d463ea8be13bcbe644ae8bc99c39f + category: dev + optional: true +- name: h2 + version: 4.3.0 + manager: conda + platform: linux-64 + dependencies: + hpack: '>=4.1,<5' + hyperframe: '>=6.1,<7' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + hash: + md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 + category: dev + optional: true +- name: hpack + version: 4.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + hash: + md5: 0a802cb9888dd14eeefc611f05c40b6e + category: dev + optional: true +- name: hyperframe + version: 6.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + hash: + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + category: dev + optional: true +- name: id + version: 1.5.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + requests: '' + url: https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda + hash: + md5: d37314c8f553e3b4b44d113a0ee10196 + sha256: 161e3eb5aba887d0329bb4099f72cb92eed9072cf63f551d08540480116e69a2 + category: dev + optional: true +- name: identify + version: 2.6.15 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + ukkonen: '' + url: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda + hash: + md5: 25f954b7dae6dd7b0dc004dab74f1ce9 + sha256: 32d5007d12e5731867908cbf5345f5cd44a6c8755a2e8e63e15a184826a51f82 + category: dev + optional: true +- name: idna + version: '3.11' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + hash: + md5: 53abe63df7e10a6ba605dc5f9f961d36 + sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 + category: dev + optional: true +- name: importlib-metadata + version: 8.7.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + zipp: '>=3.20' + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + hash: + md5: 63ccfdc3a3ce25b027b8767eb722fca8 + category: dev + optional: true +- name: importlib_resources + version: 6.5.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + zipp: '>=3.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + hash: + md5: c85c76dc67d75619a92f51dfbce06992 + category: dev + optional: true +- name: iniconfig + version: 2.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + hash: + md5: 9614359868482abba1bd15ce465e3c42 + sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 + category: dev + optional: true +- name: invoke + version: 2.2.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + hash: + md5: 3a804714ed59be1969ffca10f703ec2a + sha256: 5a4e3a01f626c8de15ddada622d364e94ff28e8d6bdedf1665442ef03a4e0140 + category: dev + optional: true +- name: jaraco.classes + version: 3.4.0 + manager: conda + platform: linux-64 + dependencies: + more-itertools: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_2.conda + hash: + md5: ade6b25a6136661dadd1a43e4350b10b + category: dev + optional: true +- name: jaraco.context + version: 6.0.1 + manager: conda + platform: linux-64 + dependencies: + backports.tarfile: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.0.1-pyhd8ed1ab_0.conda + hash: + md5: bcc023a32ea1c44a790bbf1eae473486 + category: dev + optional: true +- name: jaraco.functools + version: 4.3.0 + manager: conda + platform: linux-64 + dependencies: + more-itertools: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.3.0-pyhd8ed1ab_0.conda + hash: + md5: b86839fa387a5b904846e77c84167e57 + category: dev + optional: true +- name: jeepney + version: 0.9.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda + hash: + md5: b4b91eb14fbe2f850dd2c5fc20676c0d + category: dev + optional: true +- name: jinja2 + version: 3.1.6 + manager: conda + platform: linux-64 + dependencies: + markupsafe: '>=2.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + hash: + md5: 446bd6c8cb26050d528881df495ce646 + category: dev + optional: true +- name: keyring + version: 25.6.0 + manager: conda + platform: linux-64 + dependencies: + __linux: '' + importlib-metadata: '>=4.11.4' + importlib_resources: '' + jaraco.classes: '' + jaraco.context: '' + jaraco.functools: '' + jeepney: '>=0.4.2' + python: '>=3.9' + secretstorage: '>=3.2' + url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyha804496_0.conda + hash: + md5: cdd58ab99c214b55d56099108a914282 + category: dev + optional: true +- name: keyutils + version: 1.6.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + hash: + md5: b38117a3c920364aff79f870c984b4a3 + category: dev + optional: true +- name: krb5 + version: 1.21.3 + manager: conda + platform: linux-64 + dependencies: + keyutils: '>=1.6.1,<2.0a0' + libedit: '>=3.1.20191231,<4.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + hash: + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + category: dev + optional: true +- name: ld_impl_linux-64 + version: '2.44' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_4.conda + hash: + md5: c94ab6ff54ba5172cf1c58267005670f + sha256: 96b6900ca0489d9e5d0318a6b49f8eff43fd85fef6e07cb0c25344ee94cd7a3a + category: main + optional: false +- name: libarchive + version: 3.8.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + libgcc: '>=14' + liblzma: '>=5.8.1,<6.0a0' + libxml2: '' + libxml2-16: '>=2.14.6' + libzlib: '>=1.3.1,<2.0a0' + lz4-c: '>=1.10.0,<1.11.0a0' + lzo: '>=2.10,<3.0a0' + openssl: '>=3.5.4,<4.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.2-gpl_h7be2006_100.conda + hash: + md5: 9d0eaa26e3c5d7af747b3ddee928327b + sha256: 3fb3baf9f6ac39a4720f91dbb6fdace0208fd76500d362e8d6ae985a8bd42451 + category: dev + optional: true +- name: libcurl + version: 8.16.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + krb5: '>=1.21.3,<1.22.0a0' + libgcc: '>=14' + libnghttp2: '>=1.67.0,<2.0a0' + libssh2: '>=1.11.1,<2.0a0' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.5.4,<4.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.16.0-h4e3cde8_0.conda + hash: + md5: a401aa9329350320c7d3809a7a5a1640 + sha256: f21af777602d17ced05f168898e759fb0bac5af09ba72c5ece245dd0f14e0fec + category: dev + optional: true +- name: libedit + version: 3.1.20250104 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + ncurses: '>=6.5,<7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + hash: + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + category: dev + optional: true +- name: libev + version: '4.33' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + hash: + md5: 172bf1cd1ff8629f2b1179945ed45055 + category: dev + optional: true +- name: libexpat + version: 2.7.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + hash: + md5: 4211416ecba1866fab0c6470986c22d6 + category: main + optional: false +- name: libffi + version: 3.5.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + hash: + md5: 35f29eec58405aaf55e01cb470d8c26a + sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 + category: main + optional: false +- name: libgcc + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + _openmp_mutex: '>=4.5' + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda + hash: + md5: c0374badb3a5d4b1372db28d19462c53 + category: main + optional: false +- name: libgcc-ng + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + libgcc: 15.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda + hash: + md5: 280ea6eee9e2ddefde25ff799c4f0363 + category: dev + optional: true +- name: libglib + version: 2.86.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libffi: '>=3.5.2,<3.6.0a0' + libgcc: '>=14' + libiconv: '>=1.18,<2.0a0' + libzlib: '>=1.3.1,<2.0a0' + pcre2: '>=10.46,<10.47.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.0-h32235b2_1.conda + hash: + md5: a400fd9bad095c7cdf74661552ef802f + sha256: 8f4ccf81ebde248f8a8070a987e2dc7caa02471ae3506667da8e02176a8e0060 + category: dev + optional: true +- name: libgomp + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + hash: + md5: f7b4d76975aac7e5d9e6ad13845f92fe + category: main + optional: false +- name: libiconv + version: '1.18' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + hash: + md5: 915f5995e94f60e9a4826e0b0920ee88 + category: dev + optional: true +- name: liblzma + version: 5.8.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + hash: + md5: 1a580f7796c7bf6393fddb8bbbde58dc + category: main + optional: false +- name: libmamba + version: 2.3.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cpp-expected: '>=1.3.1,<1.3.2.0a0' + fmt: '>=12.0.0,<12.1.0a0' + libarchive: '>=3.8.2,<3.9.0a0' + libcurl: '>=8.14.1,<9.0a0' + libgcc: '>=14' + libsolv: '>=0.7.35,<0.8.0a0' + libstdcxx: '>=14' + nlohmann_json-abi: 3.12.0 + openssl: '>=3.5.4,<4.0a0' + reproc: '>=14.2,<15.0a0' + reproc-cpp: '>=14.2,<15.0a0' + simdjson: '>=4.0.7,<4.1.0a0' + yaml-cpp: '>=0.8.0,<0.9.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libmamba-2.3.3-h09abcb8_2.conda + hash: + md5: afca7d1181d858718852e4d8402c05ac + sha256: fb32dac071b66a23afe866acf2174bf3fa911cb45a714027328232e86592368c + category: dev + optional: true +- name: libmpdec + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + hash: + md5: c7e925f37e3b40d893459e625f6a53f1 + category: main + optional: false +- name: libnghttp2 + version: 1.67.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + c-ares: '>=1.34.5,<2.0a0' + libev: '>=4.33,<5.0a0' + libgcc: '>=14' + libstdcxx: '>=14' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.5.2,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + hash: + md5: b499ce4b026493a13774bcf0f4c33849 + category: dev + optional: true +- name: libsodium + version: 1.0.20 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + hash: + md5: a587892d3c13b6621a6091be690dbca2 + category: dev + optional: true +- name: libsolv + version: 0.7.35 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.35-h9463b59_0.conda + hash: + md5: 21769ce326958ec230cdcbd0f2ad97eb + category: dev + optional: true +- name: libsqlite + version: 3.50.4 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + hash: + md5: 0b367fad34931cb79e0d6b7e5c06bb1c + category: main + optional: false +- name: libssh2 + version: 1.11.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.5.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + hash: + md5: eecce068c7e4eddeb169591baac20ac4 + category: dev + optional: true +- name: libstdcxx + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: 15.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda + hash: + md5: 5b767048b1b3ee9a954b06f4084f93dc + category: main + optional: false +- name: libstdcxx-ng + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + libstdcxx: 15.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + hash: + md5: f627678cf829bd70bccf141a19c3ad3e + category: dev + optional: true +- name: libuuid + version: 2.41.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + hash: + md5: 80c07c68d2f6870250959dcc95b209d1 + category: main + optional: false +- name: libxml2 + version: 2.15.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libiconv: '>=1.18,<2.0a0' + liblzma: '>=5.8.1,<6.0a0' + libxml2-16: 2.15.1 + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h031cc0b_0.conda + hash: + md5: a67cd8f7b0369bbf2c40411f05a62f3b + sha256: ee64e507b37b073e0bdad739e35330933dd5be7c639600a096551a6968f1035d + category: dev + optional: true +- name: libxml2-16 + version: 2.15.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libiconv: '>=1.18,<2.0a0' + liblzma: '>=5.8.1,<6.0a0' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hf2a90c1_0.conda + hash: + md5: 23720d17346b21efb08d68c2255c8431 + sha256: f5220ff49efc31431279859049199b9250e79f98c1dee1da12feb74bda2d9cf1 + category: dev + optional: true +- name: libzlib + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + hash: + md5: edb0dca6bc32e4f4789199455a1dbeb8 + category: main + optional: false +- name: lz4-c + version: 1.10.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + hash: + md5: 9de5350a85c4a20c685259b889aa6393 + category: dev + optional: true +- name: lzo + version: '2.10' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda + hash: + md5: 45161d96307e3a447cc3eb5896cf6f8c + category: dev + optional: true +- name: mamba + version: 2.3.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libmamba: '>=2.3.3,<2.4.0a0' + reproc: '>=14.2,<15.0a0' + reproc-cpp: '>=14.2,<15.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/mamba-2.3.3-h4396525_2.conda + hash: + md5: 7eb628c8e865dd6e33a46ade708de780 + sha256: 5b07dcfcaf67e2d843756cf79e7139ecdf13ee1f8c3734002aee729afb439393 + category: dev + optional: true +- name: markdown + version: '3.9' + manager: conda + platform: linux-64 + dependencies: + importlib-metadata: '>=4.4' + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/markdown-3.9-pyhd8ed1ab_0.conda + hash: + md5: 17784de2c4da64a3595328b34982cdc5 + category: dev + optional: true +- name: markdown-it-py + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + mdurl: '>=0.1,<1' + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + hash: + md5: 5b5203189eb668f042ac2b0826244964 + sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e + category: dev + optional: true +- name: markupsafe + version: 3.0.3 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda + hash: + md5: fab1be106a50e20f10fe5228fd1d1651 + category: dev + optional: true +- name: mdurl + version: 0.1.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + hash: + md5: 592132998493b3ff25fd7479396e8351 + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + category: dev + optional: true +- name: mergedeep + version: 1.3.4 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + hash: + md5: d9a8fc1f01deae61735c88ec242e855c + category: dev + optional: true +- name: mkdocs + version: 1.6.1 + manager: conda + platform: linux-64 + dependencies: + click: '>=7.0' + colorama: '>=0.4' + ghp-import: '>=1.0' + importlib-metadata: '>=4.4' + jinja2: '>=2.11.1' + markdown: '>=3.3.6' + markupsafe: '>=2.0.1' + mergedeep: '>=1.3.4' + mkdocs-get-deps: '>=0.2.0' + packaging: '>=20.5' + pathspec: '>=0.11.1' + python: '>=3.9' + pyyaml: '>=5.1' + pyyaml-env-tag: '>=0.1' + watchdog: '>=2.0' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + hash: + md5: 14661160be39d78f2b210f2cc2766059 + category: dev + optional: true +- name: mkdocs-click + version: 0.9.0 + manager: conda + platform: linux-64 + dependencies: + click: '>=8.1' + markdown: '>=3.3' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-click-0.9.0-pyh29332c3_0.conda + hash: + md5: 5fe524d35646dadfdc024c510d29330a + category: dev + optional: true +- name: mkdocs-get-deps + version: 0.2.0 + manager: conda + platform: linux-64 + dependencies: + importlib-metadata: '>=4.3' + mergedeep: '>=1.3.4' + platformdirs: '>=2.2.0' + python: '>=3.9' + pyyaml: '>=5.1' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + hash: + md5: 84382acddb26c27c70f2de8d4c830830 + category: dev + optional: true +- name: mkdocs-include-markdown-plugin + version: 7.2.0 + manager: conda + platform: linux-64 + dependencies: + mkdocs: '>=1.4' + python: '>=3.10' + wcmatch: '' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-include-markdown-plugin-7.2.0-pyhd8ed1ab_0.conda + hash: + md5: 4e2463b17fc15bb0ce9f67a14e3846ed + sha256: 89bea7fadc8172b8084c85971a0d09004193f9f419705dc8fc67b3267a7fdf19 + category: dev + optional: true +- name: mkdocs-material + version: 9.6.22 + manager: conda + platform: linux-64 + dependencies: + babel: '>=2.10,<3.dev0' + backrefs: '>=5.7.post1,<6.dev0' + colorama: '>=0.4,<1.dev0' + jinja2: '>=3.0,<4.dev0' + markdown: '>=3.2,<4.dev0' + mkdocs: '>=1.6,<2.dev0' + mkdocs-material-extensions: '>=1.3,<2.dev0' + paginate: '>=0.5,<1.dev0' + pygments: '>=2.16,<3.dev0' + pymdown-extensions: '>=10.2,<11.dev0' + python: '' + requests: '>=2.26,<3.dev0' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.22-pyhcf101f3_0.conda + hash: + md5: 5b9120156602e68f39129853b89acf86 + sha256: 4abb9d42fcd3820898e95f6670a2713df9f35d4eee84dd32121c6b6445a1e115 + category: dev + optional: true +- name: mkdocs-material-extensions + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + hash: + md5: de8af4000a4872e16fb784c649679c8e + category: dev + optional: true +- name: more-itertools + version: 10.8.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhd8ed1ab_0.conda + hash: + md5: d7620a15dc400b448e1c88a981b23ddd + category: dev + optional: true +- name: mypy + version: 1.18.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + mypy_extensions: '>=1.0.0' + pathspec: '>=0.9.0' + psutil: '>=4.0' + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + typing_extensions: '>=4.6.0' + url: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.18.2-py314h5bd0f2a_0.conda + hash: + md5: 1e87cabfdfea01d30e2ce1dd6152846f + category: dev + optional: true +- name: mypy_extensions + version: 1.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + hash: + md5: e9c622e0d00fa24a6292279af3ab6d06 + category: dev + optional: true +- name: ncurses + version: '6.5' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + hash: + md5: 47e340acb35de30501a76c7c799c41d7 + category: main + optional: false +- name: nh3 + version: 0.3.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + _python_abi3_support: 1.* + cpython: '>=3.10' + libgcc: '>=14' + python: '' + url: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.1-py310h1570de5_0.conda + hash: + md5: 5408ec76dfdab005a3f43be2d2c2cef3 + sha256: 01da3cb9332b933dc5a6da743814023fd2cf7f03844fd1857f66244e27eddc6d + category: dev + optional: true +- name: nlohmann_json-abi + version: 3.12.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda + hash: + md5: 59659d0213082bc13be8500bab80c002 + category: dev + optional: true +- name: nodeenv + version: 1.9.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + setuptools: '' + url: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + hash: + md5: 7ba3f09fceae6a120d664217e58fe686 + category: dev + optional: true +- name: openssl + version: 3.5.4 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + ca-certificates: '' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda + hash: + md5: 14edad12b59ccbfa3910d42c72adc2a0 + category: main + optional: false +- name: packaging + version: '25.0' + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + hash: + md5: 58335b26c38bf4a20f399384c33cbcf9 + category: dev + optional: true +- name: paginate + version: 0.5.7 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + hash: + md5: c3f35453097faf911fd3f6023fc2ab24 + category: dev + optional: true +- name: paramiko + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + bcrypt: '>=3.2' + cryptography: '>=3.3' + invoke: '>=2.0' + pynacl: '>=1.5' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda + hash: + md5: 1a884d2b1ea21abfb73911dcdb8342e4 + category: dev + optional: true +- name: pathspec + version: 0.12.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + hash: + md5: 617f15191456cc6a13db418a275435e5 + category: dev + optional: true +- name: pcre2 + version: '10.46' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + libgcc: '>=14' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda + hash: + md5: 7fa07cb0fb1b625a089ccc01218ee5b1 + category: dev + optional: true +- name: pip + version: '25.2' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.13.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh145f28c_0.conda + hash: + md5: e7ab34d5a93e0819b62563c78635d937 + category: main + optional: false +- name: platformdirs + version: 4.5.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda + hash: + md5: 5c7a868f8241e64e1cf5fdf4962f23e2 + category: dev + optional: true +- name: pluggy + version: 1.6.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + hash: + md5: 7da7ccd349dbf6487a7778579d2bb971 + category: dev + optional: true +- name: pre-commit + version: 4.3.0 + manager: conda + platform: linux-64 + dependencies: + cfgv: '>=2.0.0' + identify: '>=1.0.0' + nodeenv: '>=0.11.1' + python: '>=3.9' + pyyaml: '>=5.1' + virtualenv: '>=20.10.0' + url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda + hash: + md5: bc6c44af2a9e6067dd7e949ef10cdfba + category: dev + optional: true +- name: psutil + version: 7.1.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.0-py314h5bd0f2a_0.conda + hash: + md5: 3bba9ff64ab2030c4c28c0d225864196 + category: dev + optional: true +- name: pycparser + version: '2.22' + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + hash: + md5: 12c566707c80111f9799308d9e265aef + category: dev + optional: true +- name: pygments + version: 2.19.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + hash: + md5: 6b6ece66ebcae2d5f326c77ef2c5a066 + category: dev + optional: true +- name: pymdown-extensions + version: 10.16.1 + manager: conda + platform: linux-64 + dependencies: + markdown: '>=3.6' + python: '>=3.9' + pyyaml: '' + url: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda + hash: + md5: 26e013bc453e643991cfa9b76911fb79 + category: dev + optional: true +- name: pynacl + version: 1.6.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.4.1' + libgcc: '>=14' + libsodium: '>=1.0.20,<1.0.21.0a0' + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + six: '' + url: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.0-py314h5bd0f2a_0.conda + hash: + md5: 287eabdd0b0a176376968b84c2707bd8 + category: dev + optional: true +- name: pyproject_hooks + version: 1.2.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + tomli: '>=1.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda + hash: + md5: d4582021af437c931d7d77ec39007845 + category: dev + optional: true +- name: pysocks + version: 1.7.1 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + hash: + md5: 461219d1a5bd61342293efa2c0c90eac + category: dev + optional: true +- name: pytest + version: 8.4.2 + manager: conda + platform: linux-64 + dependencies: + colorama: '>=0.4' + exceptiongroup: '>=1' + iniconfig: '>=1' + packaging: '>=20' + pluggy: '>=1.5,<2' + pygments: '>=2.7.2' + python: '>=3.10' + tomli: '>=1' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda + hash: + md5: 1f987505580cb972cf28dc5f74a0f81b + category: dev + optional: true +- name: pytest-cov + version: 7.0.0 + manager: conda + platform: linux-64 + dependencies: + coverage: '>=7.10.6' + pluggy: '>=1.2' + pytest: '>=7' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda + hash: + md5: 6891acad5e136cb62a8c2ed2679d6528 + category: dev + optional: true +- name: pytest-split + version: 0.10.0 + manager: conda + platform: linux-64 + dependencies: + pytest: '>=5.0.0,<9.0.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-split-0.10.0-pyhff2d567_0.conda + hash: + md5: 3bd32c44526b455aa146d8fdb27a65b3 + category: dev + optional: true +- name: pytest-timeout + version: 2.4.0 + manager: conda + platform: linux-64 + dependencies: + pytest: '>=7.0.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + hash: + md5: 52a50ca8ea1b3496fbd3261bea8c5722 + category: dev + optional: true +- name: pytest-xdist + version: 3.8.0 + manager: conda + platform: linux-64 + dependencies: + execnet: '>=2.1' + pytest: '>=7.0.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + hash: + md5: 8375cfbda7c57fbceeda18229be10417 + category: dev + optional: true +- name: python + version: 3.14.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + ld_impl_linux-64: '>=2.36.1' + libexpat: '>=2.7.1,<3.0a0' + libffi: '>=3.5.2,<3.6.0a0' + libgcc: '>=14' + liblzma: '>=5.8.1,<6.0a0' + libmpdec: '>=4.0.0,<5.0a0' + libsqlite: '>=3.50.4,<4.0a0' + libuuid: '>=2.41.2,<3.0a0' + libzlib: '>=1.3.1,<2.0a0' + ncurses: '>=6.5,<7.0a0' + openssl: '>=3.5.4,<4.0a0' + pip: '' + python_abi: 3.14.* + readline: '>=8.2,<9.0a0' + tk: '>=8.6.13,<8.7.0a0' + tzdata: '' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda + hash: + md5: 0a19d2cc6eb15881889b0c6fa7d6a78d + sha256: 76d750045b94fded676323bfd01975a26a474023635735773d0e4d80aaa72518 + category: main + optional: false +- name: python-build + version: 1.3.0 + manager: conda + platform: linux-64 + dependencies: + colorama: '' + importlib-metadata: '>=4.6' + packaging: '>=19.0' + pyproject_hooks: '' + python: '>=3.9' + tomli: '>=1.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + hash: + md5: ed5d43e9ef92cc2a9872f9bdfe94b984 + category: dev + optional: true +- name: python-dateutil + version: 2.9.0.post0 + manager: conda + platform: linux-64 + dependencies: + python: '' + six: '>=1.5' + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + hash: + md5: 5b8d21249ff20967101ffa321cab24e8 + category: dev + optional: true +- name: python-gil + version: 3.14.0 + manager: conda + platform: linux-64 + dependencies: + cpython: 3.14.0.* + python_abi: '*' + url: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda + hash: + md5: d152e423d80848fe95f0f4b43448030e + sha256: e68c9796fba0825ebc1338ceb94496683ab7d45dcd281b378ec2a56365d3c555 + category: dev + optional: true +- name: python_abi + version: '3.14' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + hash: + md5: 0539938c55b6b1a59b560e843ad864a4 + category: main + optional: false +- name: pytz + version: '2025.2' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + hash: + md5: bc8e3267d44011051f2eb14d22fb0960 + category: dev + optional: true +- name: pywin32-on-windows + version: 0.1.0 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 + hash: + md5: 2807a0becd1d986fe1ef9b7f8135f215 + category: dev + optional: true +- name: pyyaml + version: 6.0.3 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10.*' + yaml: '' + url: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda + hash: + md5: b12f41c0d7fb5ab81709fcc86579688f + category: dev + optional: true +- name: pyyaml-env-tag + version: '1.1' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + pyyaml: '' + url: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda + hash: + md5: e8e53c4150a1bba3b160eacf9d53a51b + category: dev + optional: true +- name: readline + version: '8.2' + manager: conda + platform: linux-64 + dependencies: + libgcc: '>=13' + ncurses: '>=6.5,<7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + hash: + md5: 283b96675859b20a825f8fa30f311446 + category: main + optional: false +- name: readme_renderer + version: '44.0' + manager: conda + platform: linux-64 + dependencies: + cmarkgfm: '>=0.8.0' + docutils: '>=0.21.2' + nh3: '>=0.2.14' + pygments: '>=2.5.1' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda + hash: + md5: c58dd5d147492671866464405364c0f1 + sha256: 66f3adf6aaabf977cfcc22cb65607002b1de4a22bc9fac7be6bb774bc6f85a3a + category: dev + optional: true +- name: reproc + version: 14.2.5.post0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda + hash: + md5: 69fbc0a9e42eb5fe6733d2d60d818822 + category: dev + optional: true +- name: reproc-cpp + version: 14.2.5.post0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + reproc: 14.2.5.post0 + url: https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda + hash: + md5: 828302fca535f9cfeb598d5f7c204323 + category: dev + optional: true +- name: requests + version: 2.32.5 + manager: conda + platform: linux-64 + dependencies: + certifi: '>=2017.4.17' + charset-normalizer: '>=2,<4' + idna: '>=2.5,<4' + python: '>=3.9' + urllib3: '>=1.21.1,<3' + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + hash: + md5: db0c6b99149880c8ba515cf4abe93ee4 + category: dev + optional: true +- name: requests-mock + version: 1.12.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + requests: '>=2.22,<3' + url: https://conda.anaconda.org/conda-forge/noarch/requests-mock-1.12.1-pyhd8ed1ab_1.conda + hash: + md5: 8212b70c509aaa0fa6c8fa974f784b2e + category: dev + optional: true +- name: requests-toolbelt + version: 1.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + requests: '>=2.0.1,<3.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda + hash: + md5: 66de8645e324fda0ea6ef28c2f99a2ab + category: dev + optional: true +- name: rfc3986 + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 43e14f832d7551e5a8910672bfc3d8c6 + sha256: d617373ba1a5108336cb87754d030b9e384dcf91796d143fa60fe61e76e5cfb0 + category: dev + optional: true +- name: rich + version: 14.2.0 + manager: conda + platform: linux-64 + dependencies: + markdown-it-py: '>=2.2.0' + pygments: '>=2.13.0,<3.0.0' + python: '' + typing_extensions: '>=4.0.0,<5.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + hash: + md5: a247579d8a59931091b16a1e932bbed6 + sha256: edfb44d0b6468a8dfced728534c755101f06f1a9870a7ad329ec51389f16b086 + category: dev + optional: true +- name: ruff + version: 0.14.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '' + url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.2-ha3a3aed_0.conda + hash: + md5: ba27344e81c9c460c9502fcbf7bd1e5c + sha256: d6c3ee6381ce275107a3fb3cfe82499f3cb74da1d95e134a93ed5e4851b4ec01 + category: dev + optional: true +- name: secretstorage + version: 3.4.0 + manager: conda + platform: linux-64 + dependencies: + cryptography: '>=2.0' + dbus: '' + jeepney: '>=0.6' + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.0-py314hdafbbf9_0.conda + hash: + md5: a804c54ce3a1aed268b13657b79825b8 + category: dev + optional: true +- name: setuptools + version: 80.9.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + hash: + md5: 4de79c071274a53dcaf2a8c749d1499e + category: dev + optional: true +- name: simdjson + version: 4.0.7 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/simdjson-4.0.7-hb700be7_0.conda + hash: + md5: cc9c262a71dd584aa5a3a22fc963255c + category: dev + optional: true +- name: six + version: 1.17.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + hash: + md5: 3339e3b65d58accf4ca4fb8748ab16b3 + category: dev + optional: true +- name: smmap + version: 5.0.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + hash: + md5: 87f47a78808baf2fa1ea9c315a1e48f1 + category: dev + optional: true +- name: tk + version: 8.6.13 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + hash: + md5: a0116df4f4ed05c303811a837d5b39d8 + category: main + optional: false +- name: toml + version: 0.10.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + hash: + md5: b0dd904de08b7db706167240bf37b164 + category: dev + optional: true +- name: tomli + version: 2.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + hash: + md5: d2732eb636c264dc9aa4cbee404b1a53 + category: dev + optional: true +- name: twine + version: 6.2.0 + manager: conda + platform: linux-64 + dependencies: + id: '' + importlib-metadata: '>=3.6' + keyring: '>=21.2.0' + packaging: '>=24.0' + python: '' + readme_renderer: '>=35.0' + requests: '>=2.20' + requests-toolbelt: '>=0.8.0,!=0.9.0' + rfc3986: '>=1.4.0' + rich: '>=12.0.0' + urllib3: '>=1.26.0' + url: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda + hash: + md5: 901a86453fa6183e914b937643619a03 + sha256: 0370098cab22773e33755026bf78539c2f05645fce7dcc9713d01e21950756bb + category: dev + optional: true +- name: types-click + version: 7.1.8 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-click-7.1.8-pyhd8ed1ab_1.conda + hash: + md5: 08ed65e279de69322843b075679567ea + category: dev + optional: true +- name: types-click-default-group + version: 1.2.0.20250513 + manager: conda + platform: linux-64 + dependencies: + click: '>=8.0.0' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/types-click-default-group-1.2.0.20250513-pyhe01879c_0.conda + hash: + md5: 335926a07f57d325d0d6966bf36eee0b + category: dev + optional: true +- name: types-filelock + version: 3.2.7 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-filelock-3.2.7-pyhd8ed1ab_1.conda + hash: + md5: 3f1356104d409d6deba0c689f3b2c602 + category: dev + optional: true +- name: types-freezegun + version: 1.1.10 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-freezegun-1.1.10-pyhd8ed1ab_1.conda + hash: + md5: 0b609b66e56bbe70d97cd52ad24058fb + category: dev + optional: true +- name: types-pyyaml + version: 6.0.12.20250915 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_0.conda + hash: + md5: 3c9919ecee97547fa14fea57e2a9bb54 + category: dev + optional: true +- name: types-requests + version: 2.32.4.20250913 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + urllib3: '>=2' + url: https://conda.anaconda.org/conda-forge/noarch/types-requests-2.32.4.20250913-pyhd8ed1ab_0.conda + hash: + md5: 829c891bfd4147c25b030455d3a57a3a + category: dev + optional: true +- name: types-setuptools + version: 80.9.0.20250822 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/types-setuptools-80.9.0.20250822-pyhcf101f3_0.conda + hash: + md5: 6404dcec3d8f8b8fe540516837aa08ec + category: dev + optional: true +- name: types-toml + version: 0.10.8.20240310 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda + hash: + md5: 353b9704e4851a6f210e641d3595755f + category: dev + optional: true +- name: typing_extensions + version: 4.15.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + hash: + md5: 0caa1af407ecff61170c9437a808404d + category: dev + optional: true +- name: tzdata + version: 2025b + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + hash: + md5: 4222072737ccff51314b5ece9c7d6f5a + category: main + optional: false +- name: ukkonen + version: 1.0.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '' + libgcc: '>=14' + libstdcxx: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py314h9891dd4_6.conda + hash: + md5: 28303a78c48916ab07b95ffdbffdfd6c + sha256: ef6753f6febaa74d35253e4e0dd09dc9497af8e370893bd97c479f59346daa57 + category: dev + optional: true +- name: urllib3 + version: 2.5.0 + manager: conda + platform: linux-64 + dependencies: + brotli-python: '>=1.0.9' + h2: '>=4,<5' + pysocks: '>=1.5.6,<2.0,!=1.5.7' + python: '>=3.9' + zstandard: '>=0.18.0' + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + hash: + md5: 436c165519e140cb08d246a4472a9d6a + category: dev + optional: true +- name: virtualenv + version: 20.35.3 + manager: conda + platform: linux-64 + dependencies: + distlib: '>=0.3.7,<1' + filelock: '>=3.12.2,<4' + platformdirs: '>=3.9.1,<5' + python: '>=3.10' + typing_extensions: '>=4.13.2' + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.3-pyhd8ed1ab_0.conda + hash: + md5: bf0dc4c8a32e91290e3fae5403798c63 + category: dev + optional: true +- name: watchdog + version: 6.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + pyyaml: '>=3.10' + url: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py314hdafbbf9_1.conda + hash: + md5: 099125fcb130e9fe134c6b610f33b0e1 + category: dev + optional: true +- name: wcmatch + version: '10.1' + manager: conda + platform: linux-64 + dependencies: + bracex: '>=2.1.1' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/wcmatch-10.1-pyhd8ed1ab_0.conda + hash: + md5: b045a877087e3bbdd36fe460e7f5cc55 + category: dev + optional: true +- name: websocket-client + version: 1.9.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + hash: + md5: 2f1ed718fcd829c184a6d4f0f2e07409 + category: dev + optional: true +- name: wheel + version: 0.45.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + hash: + md5: 75cb7132eb58d97896e173ef12ac9986 + category: dev + optional: true +- name: yaml + version: 0.2.5 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + hash: + md5: a77f85f77be52ff59391544bfe73390a + category: dev + optional: true +- name: yaml-cpp + version: 0.8.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda + hash: + md5: 92b90f5f7a322e74468bb4909c7354b5 + category: dev + optional: true +- name: zipp + version: 3.23.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + hash: + md5: df5e78d904988eb55042c0c97446079f + category: dev + optional: true +- name: zizmor + version: 1.14.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '>=3.14.0rc3,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/zizmor-1.14.1-py314ha5689aa_0.conda + hash: + md5: 1f0180642729883f29c47e11d857e786 + category: dev + optional: true +- name: zstandard + version: 0.25.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.11' + libgcc: '>=14' + python: '' + python_abi: 3.14.* + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h31f8a6b_0.conda + hash: + md5: 68bd13651618354987763f746ee1fadc + category: dev + optional: true +- name: zstd + version: 1.5.7 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + hash: + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + category: main + optional: false +- name: ty + version: 0.0.1a24 + manager: pip + platform: linux-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/78/ae/323f373fcf54a883e39ea3fb6f83ed6d1eda6dfd8246462d0cfd81dac781/ty-0.0.1a24-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + hash: + sha256: d4836854411059de592f0ecc62193f2b24fc3acbfe6ce6ce0bf2c6d1a5ea9de7 + category: dev + optional: true diff --git a/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs.yml b/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs.yml new file mode 100644 index 000000000..77fb79425 --- /dev/null +++ b/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs.yml @@ -0,0 +1,2364 @@ +# This lock file was generated by conda-lock (https://github.com/conda/conda-lock). DO NOT EDIT! +# +# A "lock file" contains a concrete list of package versions (with checksums) to be installed. Unlike +# e.g. `conda env create`, the resulting environment will not change as new package versions become +# available, unless you explicitly update the lock file. +# +# Install this environment as "YOURENV" with: +# conda-lock install -n YOURENV lockfile.yml +# This lock contains optional development dependencies. Include them in the installed environment with: +# conda-lock install --dev-dependencies -n YOURENV lockfile.yml +# To update a single package to the latest version compatible with the version constraints in the source: +# conda-lock lock --lockfile lockfile.yml --update PACKAGE +# To re-solve the entire environment, e.g. after changing a version constraint in the source file: +# conda-lock -f ../workspace/dev-environment.yaml --lockfile lockfile.yml +version: 1 +metadata: + content_hash: + linux-64: 478bc8b4c815f08c094483870ca25bcd5452f8f76ab8d993b0d8a1b82429c488 + channels: + - url: conda-forge + used_env_vars: [] + platforms: + - linux-64 + sources: + - ../workspace/dev-environment.yaml +package: +- name: _libgcc_mutex + version: '0.1' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + hash: + md5: d7c89558ba9fa0495403155b64376d81 + category: main + optional: false +- name: _openmp_mutex + version: '4.5' + manager: conda + platform: linux-64 + dependencies: + _libgcc_mutex: '0.1' + libgomp: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + hash: + md5: 73aaf86a425cc6e73fcf236a5a46396d + category: main + optional: false +- name: _python_abi3_support + version: '1.0' + manager: conda + platform: linux-64 + dependencies: + cpython: '' + python-gil: '' + url: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + hash: + md5: aaa2a381ccc56eac91d63b6c1240312f + sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 + category: dev + optional: true +- name: babel + version: 2.17.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + pytz: '>=2015.7' + url: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + hash: + md5: 0a01c169f0ab0f91b26e77a3301fbfe4 + category: dev + optional: true +- name: backports + version: '1.0' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda + hash: + md5: 767d508c1a67e02ae8f50e44cacfadb2 + category: dev + optional: true +- name: backports.tarfile + version: 1.2.0 + manager: conda + platform: linux-64 + dependencies: + backports: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhd8ed1ab_1.conda + hash: + md5: df837d654933488220b454c6a3b0fad6 + category: dev + optional: true +- name: backrefs + version: '5.8' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda + hash: + md5: b16e2595d3a9042aa9d570375978835f + category: dev + optional: true +- name: bcrypt + version: 5.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py314h68536ef_0.conda + hash: + md5: 71d9c4f6a05a4b9da1b03b973e078db0 + category: dev + optional: true +- name: bracex + version: 2.2.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/bracex-2.2.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 586272349d7bef5b1ef527b56dca73cb + category: dev + optional: true +- name: brotli-python + version: 1.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314hdfeb8a1_0.conda + hash: + md5: 3ef9d2a701760467b9db2338b6cd926f + sha256: 9f6d339fb78b647be35e3564dac453d8d2f1b865ba72fb961eaac41061368699 + category: dev + optional: true +- name: bzip2 + version: 1.0.8 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + hash: + md5: 51a19bba1b8ebfb60df25cde030b7ebc + category: main + optional: false +- name: c-ares + version: 1.34.5 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + hash: + md5: f7f0d6cc2dc986d42ac2689ec88192be + category: dev + optional: true +- name: ca-certificates + version: 2025.10.5 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + url: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda + hash: + md5: f9e5fbc24009179e8b0409624691758a + category: main + optional: false +- name: certifi + version: 2025.10.5 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda + hash: + md5: 257ae203f1d204107ba389607d375ded + category: dev + optional: true +- name: cffi + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libffi: '>=3.5.2,<3.6.0a0' + libgcc: '>=14' + pycparser: '' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda + hash: + md5: cf45f4278afd6f4e6d03eda0f435d527 + sha256: c6339858a0aaf5d939e00d345c98b99e4558f285942b27232ac098ad17ac7f8e + category: dev + optional: true +- name: cfgv + version: 3.3.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + hash: + md5: 57df494053e17dce2ac3a0b33e1b2a2e + category: dev + optional: true +- name: charset-normalizer + version: 3.4.4 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + hash: + md5: a22d1fd9bf98827e280a02875d9a007a + sha256: b32f8362e885f1b8417bac2b3da4db7323faa12d5db62b7fd6691c02d60d6f59 + category: dev + optional: true +- name: check-manifest + version: '0.51' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + python-build: '>=0.1' + setuptools: '' + toml: '' + url: https://conda.anaconda.org/conda-forge/noarch/check-manifest-0.51-pyhd8ed1ab_0.conda + hash: + md5: 7f4022a44e9fce926fc9eb0da40bcda2 + sha256: 18637560b1725c32680560566db00d3c16687a3b1adb8f628cbb251a19d9963d + category: dev + optional: true +- name: click + version: 8.3.0 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda + hash: + md5: e76c4ba9e1837847679421b8d549b784 + category: dev + optional: true +- name: cmarkgfm + version: 2024.11.20 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.0.0' + libgcc: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py314h5bd0f2a_1.conda + hash: + md5: 23985f6de5f68e3465807e1fbbc98f30 + sha256: c2420839a943580dece9c5857492d69732df2af6dac6cb8fd8dd92c20060beae + category: dev + optional: true +- name: colorama + version: 0.4.6 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + hash: + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + category: dev + optional: true +- name: coverage + version: 7.11.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + tomli: '' + url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.11.0-py314h67df5f8_0.conda + hash: + md5: 6ff84b39468623308dee97e5dfbafca0 + sha256: d928f6d0567807c8a09786e18966445b011ec2eb85c7e18382c0b4870cf12f17 + category: dev + optional: true +- name: cpp-expected + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/cpp-expected-1.3.1-h171cf75_0.conda + hash: + md5: d17488e343e4c5c0bd0db18b3934d517 + category: dev + optional: true +- name: cpython + version: 3.14.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.14,<3.15.0a0' + python_abi: '*' + url: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.conda + hash: + md5: ff3061d315c4a988fa1c29c543800780 + sha256: 8e2a33b36d36820698840bf0c1ed50e5dd4bdeaa434c7b4f5e13d421225b0414 + category: dev + optional: true +- name: cryptography + version: 46.0.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.14' + libgcc: '>=14' + openssl: '>=3.5.4,<4.0a0' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.3-py314hb613cbf_0.conda + hash: + md5: f291630db5dc438b6ce37c2bb1a96516 + sha256: 4bf88483f944b5624269c926369002d58951627a369aeac1e2cd64a6aa00eb05 + category: dev + optional: true +- name: dbus + version: 1.16.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libexpat: '>=2.7.0,<3.0a0' + libgcc: '>=13' + libglib: '>=2.84.2,<3.0a0' + libstdcxx: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + hash: + md5: 679616eb5ad4e521c83da4650860aba7 + category: dev + optional: true +- name: distlib + version: 0.4.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + hash: + md5: 003b8ba0a94e2f1e117d0bd46aebc901 + category: dev + optional: true +- name: docker-py + version: 7.1.0 + manager: conda + platform: linux-64 + dependencies: + paramiko: '>=2.4.3' + python: '>=3.9' + pywin32-on-windows: '' + requests: '>=2.26.0' + urllib3: '>=1.26.0' + websocket-client: '>=0.32.0' + url: https://conda.anaconda.org/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda + hash: + md5: 07ce73ca6f6c1a1df5d498679fc52d9e + category: dev + optional: true +- name: doctr + version: 1.9.0 + manager: conda + platform: linux-64 + dependencies: + cryptography: '' + python: '>=3.5' + pyyaml: '' + requests: '' + url: https://conda.anaconda.org/conda-forge/noarch/doctr-1.9.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: f57b656502db0e45cc996ddbef2a9d25 + category: dev + optional: true +- name: docutils + version: 0.22.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.2-pyhd8ed1ab_0.conda + hash: + md5: ba6a7a1c262587d333761b0cda2bbd28 + sha256: dd02330f2ecca4a489a001e5ec66ee8aa50773dc2c621c8fc7053b454d9a27b2 + category: dev + optional: true +- name: exceptiongroup + version: 1.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + typing_extensions: '>=4.6.0' + url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + hash: + md5: 72e42d28960d875c7654614f8b50939a + category: dev + optional: true +- name: execnet + version: 2.1.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + hash: + md5: a71efeae2c160f6789900ba2631a2c90 + category: dev + optional: true +- name: filelock + version: 3.20.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda + hash: + md5: 66b8b26023b8efdf8fcb23bac4b6325d + category: dev + optional: true +- name: flaky + version: 3.8.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_1.conda + hash: + md5: 7e081d00fdcba21b76658c1649691836 + category: dev + optional: true +- name: fmt + version: 12.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.0.0-h2b0788b_0.conda + hash: + md5: d90bf58b03d9a958cb4f9d3de539af17 + sha256: b546c4eb5e11c2d8eab0685593e078fd0cd483e467d5d6e307d60d887488230f + category: dev + optional: true +- name: freezegun + version: 1.5.5 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + python-dateutil: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/freezegun-1.5.5-pyhd8ed1ab_0.conda + hash: + md5: 0fdb8ebc8dbdb62530ff73181ae63554 + category: dev + optional: true +- name: ghp-import + version: 2.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + python-dateutil: '>=2.8.1' + url: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + hash: + md5: 93f742fe078a7b34c29a182958d4d765 + category: dev + optional: true +- name: gitdb + version: 4.0.12 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + smmap: '>=3.0.1,<6' + url: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda + hash: + md5: 7c14f3706e099f8fcd47af2d494616cc + category: dev + optional: true +- name: gitpython + version: 3.1.45 + manager: conda + platform: linux-64 + dependencies: + gitdb: '>=4.0.1,<5' + python: '>=3.9' + typing_extensions: '>=3.10.0.2' + url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda + hash: + md5: b91d463ea8be13bcbe644ae8bc99c39f + category: dev + optional: true +- name: h2 + version: 4.3.0 + manager: conda + platform: linux-64 + dependencies: + hpack: '>=4.1,<5' + hyperframe: '>=6.1,<7' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + hash: + md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 + category: dev + optional: true +- name: hpack + version: 4.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + hash: + md5: 0a802cb9888dd14eeefc611f05c40b6e + category: dev + optional: true +- name: hyperframe + version: 6.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + hash: + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + category: dev + optional: true +- name: id + version: 1.5.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + requests: '' + url: https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda + hash: + md5: d37314c8f553e3b4b44d113a0ee10196 + sha256: 161e3eb5aba887d0329bb4099f72cb92eed9072cf63f551d08540480116e69a2 + category: dev + optional: true +- name: identify + version: 2.6.15 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + ukkonen: '' + url: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda + hash: + md5: 25f954b7dae6dd7b0dc004dab74f1ce9 + sha256: 32d5007d12e5731867908cbf5345f5cd44a6c8755a2e8e63e15a184826a51f82 + category: dev + optional: true +- name: idna + version: '3.11' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + hash: + md5: 53abe63df7e10a6ba605dc5f9f961d36 + sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 + category: dev + optional: true +- name: importlib-metadata + version: 8.7.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + zipp: '>=3.20' + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + hash: + md5: 63ccfdc3a3ce25b027b8767eb722fca8 + category: dev + optional: true +- name: importlib_resources + version: 6.5.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + zipp: '>=3.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + hash: + md5: c85c76dc67d75619a92f51dfbce06992 + category: dev + optional: true +- name: iniconfig + version: 2.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + hash: + md5: 9614359868482abba1bd15ce465e3c42 + sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 + category: dev + optional: true +- name: invoke + version: 2.2.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + hash: + md5: 3a804714ed59be1969ffca10f703ec2a + sha256: 5a4e3a01f626c8de15ddada622d364e94ff28e8d6bdedf1665442ef03a4e0140 + category: dev + optional: true +- name: jaraco.classes + version: 3.4.0 + manager: conda + platform: linux-64 + dependencies: + more-itertools: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_2.conda + hash: + md5: ade6b25a6136661dadd1a43e4350b10b + category: dev + optional: true +- name: jaraco.context + version: 6.0.1 + manager: conda + platform: linux-64 + dependencies: + backports.tarfile: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.0.1-pyhd8ed1ab_0.conda + hash: + md5: bcc023a32ea1c44a790bbf1eae473486 + category: dev + optional: true +- name: jaraco.functools + version: 4.3.0 + manager: conda + platform: linux-64 + dependencies: + more-itertools: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.3.0-pyhd8ed1ab_0.conda + hash: + md5: b86839fa387a5b904846e77c84167e57 + category: dev + optional: true +- name: jeepney + version: 0.9.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda + hash: + md5: b4b91eb14fbe2f850dd2c5fc20676c0d + category: dev + optional: true +- name: jinja2 + version: 3.1.6 + manager: conda + platform: linux-64 + dependencies: + markupsafe: '>=2.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + hash: + md5: 446bd6c8cb26050d528881df495ce646 + category: dev + optional: true +- name: keyring + version: 25.6.0 + manager: conda + platform: linux-64 + dependencies: + __linux: '' + importlib-metadata: '>=4.11.4' + importlib_resources: '' + jaraco.classes: '' + jaraco.context: '' + jaraco.functools: '' + jeepney: '>=0.4.2' + python: '>=3.9' + secretstorage: '>=3.2' + url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyha804496_0.conda + hash: + md5: cdd58ab99c214b55d56099108a914282 + category: dev + optional: true +- name: keyutils + version: 1.6.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + hash: + md5: b38117a3c920364aff79f870c984b4a3 + category: dev + optional: true +- name: krb5 + version: 1.21.3 + manager: conda + platform: linux-64 + dependencies: + keyutils: '>=1.6.1,<2.0a0' + libedit: '>=3.1.20191231,<4.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + hash: + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + category: dev + optional: true +- name: ld_impl_linux-64 + version: '2.44' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_4.conda + hash: + md5: c94ab6ff54ba5172cf1c58267005670f + sha256: 96b6900ca0489d9e5d0318a6b49f8eff43fd85fef6e07cb0c25344ee94cd7a3a + category: main + optional: false +- name: libarchive + version: 3.8.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + libgcc: '>=14' + liblzma: '>=5.8.1,<6.0a0' + libxml2: '' + libxml2-16: '>=2.14.6' + libzlib: '>=1.3.1,<2.0a0' + lz4-c: '>=1.10.0,<1.11.0a0' + lzo: '>=2.10,<3.0a0' + openssl: '>=3.5.4,<4.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.2-gpl_h7be2006_100.conda + hash: + md5: 9d0eaa26e3c5d7af747b3ddee928327b + sha256: 3fb3baf9f6ac39a4720f91dbb6fdace0208fd76500d362e8d6ae985a8bd42451 + category: dev + optional: true +- name: libcurl + version: 8.16.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + krb5: '>=1.21.3,<1.22.0a0' + libgcc: '>=14' + libnghttp2: '>=1.67.0,<2.0a0' + libssh2: '>=1.11.1,<2.0a0' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.5.4,<4.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.16.0-h4e3cde8_0.conda + hash: + md5: a401aa9329350320c7d3809a7a5a1640 + sha256: f21af777602d17ced05f168898e759fb0bac5af09ba72c5ece245dd0f14e0fec + category: dev + optional: true +- name: libedit + version: 3.1.20250104 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + ncurses: '>=6.5,<7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + hash: + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + category: dev + optional: true +- name: libev + version: '4.33' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + hash: + md5: 172bf1cd1ff8629f2b1179945ed45055 + category: dev + optional: true +- name: libexpat + version: 2.7.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + hash: + md5: 4211416ecba1866fab0c6470986c22d6 + category: main + optional: false +- name: libffi + version: 3.5.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + hash: + md5: 35f29eec58405aaf55e01cb470d8c26a + sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 + category: main + optional: false +- name: libgcc + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + _openmp_mutex: '>=4.5' + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda + hash: + md5: c0374badb3a5d4b1372db28d19462c53 + category: main + optional: false +- name: libgcc-ng + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + libgcc: 15.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda + hash: + md5: 280ea6eee9e2ddefde25ff799c4f0363 + category: dev + optional: true +- name: libglib + version: 2.86.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libffi: '>=3.5.2,<3.6.0a0' + libgcc: '>=14' + libiconv: '>=1.18,<2.0a0' + libzlib: '>=1.3.1,<2.0a0' + pcre2: '>=10.46,<10.47.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.0-h32235b2_1.conda + hash: + md5: a400fd9bad095c7cdf74661552ef802f + sha256: 8f4ccf81ebde248f8a8070a987e2dc7caa02471ae3506667da8e02176a8e0060 + category: dev + optional: true +- name: libgomp + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + hash: + md5: f7b4d76975aac7e5d9e6ad13845f92fe + category: main + optional: false +- name: libiconv + version: '1.18' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + hash: + md5: 915f5995e94f60e9a4826e0b0920ee88 + category: dev + optional: true +- name: liblzma + version: 5.8.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + hash: + md5: 1a580f7796c7bf6393fddb8bbbde58dc + category: main + optional: false +- name: libmamba + version: 2.3.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cpp-expected: '>=1.3.1,<1.3.2.0a0' + fmt: '>=12.0.0,<12.1.0a0' + libarchive: '>=3.8.2,<3.9.0a0' + libcurl: '>=8.14.1,<9.0a0' + libgcc: '>=14' + libsolv: '>=0.7.35,<0.8.0a0' + libstdcxx: '>=14' + nlohmann_json-abi: 3.12.0 + openssl: '>=3.5.4,<4.0a0' + reproc: '>=14.2,<15.0a0' + reproc-cpp: '>=14.2,<15.0a0' + simdjson: '>=4.0.7,<4.1.0a0' + yaml-cpp: '>=0.8.0,<0.9.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libmamba-2.3.3-h09abcb8_2.conda + hash: + md5: afca7d1181d858718852e4d8402c05ac + sha256: fb32dac071b66a23afe866acf2174bf3fa911cb45a714027328232e86592368c + category: dev + optional: true +- name: libmpdec + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + hash: + md5: c7e925f37e3b40d893459e625f6a53f1 + category: main + optional: false +- name: libnghttp2 + version: 1.67.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + c-ares: '>=1.34.5,<2.0a0' + libev: '>=4.33,<5.0a0' + libgcc: '>=14' + libstdcxx: '>=14' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.5.2,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + hash: + md5: b499ce4b026493a13774bcf0f4c33849 + category: dev + optional: true +- name: libsodium + version: 1.0.20 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + hash: + md5: a587892d3c13b6621a6091be690dbca2 + category: dev + optional: true +- name: libsolv + version: 0.7.35 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.35-h9463b59_0.conda + hash: + md5: 21769ce326958ec230cdcbd0f2ad97eb + category: dev + optional: true +- name: libsqlite + version: 3.50.4 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + hash: + md5: 0b367fad34931cb79e0d6b7e5c06bb1c + category: main + optional: false +- name: libssh2 + version: 1.11.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.5.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + hash: + md5: eecce068c7e4eddeb169591baac20ac4 + category: dev + optional: true +- name: libstdcxx + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: 15.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda + hash: + md5: 5b767048b1b3ee9a954b06f4084f93dc + category: main + optional: false +- name: libstdcxx-ng + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + libstdcxx: 15.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + hash: + md5: f627678cf829bd70bccf141a19c3ad3e + category: dev + optional: true +- name: libuuid + version: 2.41.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + hash: + md5: 80c07c68d2f6870250959dcc95b209d1 + category: main + optional: false +- name: libxml2 + version: 2.15.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libiconv: '>=1.18,<2.0a0' + liblzma: '>=5.8.1,<6.0a0' + libxml2-16: 2.15.1 + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h031cc0b_0.conda + hash: + md5: a67cd8f7b0369bbf2c40411f05a62f3b + sha256: ee64e507b37b073e0bdad739e35330933dd5be7c639600a096551a6968f1035d + category: dev + optional: true +- name: libxml2-16 + version: 2.15.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libiconv: '>=1.18,<2.0a0' + liblzma: '>=5.8.1,<6.0a0' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hf2a90c1_0.conda + hash: + md5: 23720d17346b21efb08d68c2255c8431 + sha256: f5220ff49efc31431279859049199b9250e79f98c1dee1da12feb74bda2d9cf1 + category: dev + optional: true +- name: libzlib + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + hash: + md5: edb0dca6bc32e4f4789199455a1dbeb8 + category: main + optional: false +- name: lz4-c + version: 1.10.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + hash: + md5: 9de5350a85c4a20c685259b889aa6393 + category: dev + optional: true +- name: lzo + version: '2.10' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda + hash: + md5: 45161d96307e3a447cc3eb5896cf6f8c + category: dev + optional: true +- name: mamba + version: 2.3.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libmamba: '>=2.3.3,<2.4.0a0' + reproc: '>=14.2,<15.0a0' + reproc-cpp: '>=14.2,<15.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/mamba-2.3.3-h4396525_2.conda + hash: + md5: 7eb628c8e865dd6e33a46ade708de780 + sha256: 5b07dcfcaf67e2d843756cf79e7139ecdf13ee1f8c3734002aee729afb439393 + category: dev + optional: true +- name: markdown + version: '3.9' + manager: conda + platform: linux-64 + dependencies: + importlib-metadata: '>=4.4' + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/markdown-3.9-pyhd8ed1ab_0.conda + hash: + md5: 17784de2c4da64a3595328b34982cdc5 + category: dev + optional: true +- name: markdown-it-py + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + mdurl: '>=0.1,<1' + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + hash: + md5: 5b5203189eb668f042ac2b0826244964 + sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e + category: dev + optional: true +- name: markupsafe + version: 3.0.3 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda + hash: + md5: fab1be106a50e20f10fe5228fd1d1651 + category: dev + optional: true +- name: mdurl + version: 0.1.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + hash: + md5: 592132998493b3ff25fd7479396e8351 + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + category: dev + optional: true +- name: mergedeep + version: 1.3.4 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + hash: + md5: d9a8fc1f01deae61735c88ec242e855c + category: dev + optional: true +- name: mkdocs + version: 1.6.1 + manager: conda + platform: linux-64 + dependencies: + click: '>=7.0' + colorama: '>=0.4' + ghp-import: '>=1.0' + importlib-metadata: '>=4.4' + jinja2: '>=2.11.1' + markdown: '>=3.3.6' + markupsafe: '>=2.0.1' + mergedeep: '>=1.3.4' + mkdocs-get-deps: '>=0.2.0' + packaging: '>=20.5' + pathspec: '>=0.11.1' + python: '>=3.9' + pyyaml: '>=5.1' + pyyaml-env-tag: '>=0.1' + watchdog: '>=2.0' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + hash: + md5: 14661160be39d78f2b210f2cc2766059 + category: dev + optional: true +- name: mkdocs-click + version: 0.9.0 + manager: conda + platform: linux-64 + dependencies: + click: '>=8.1' + markdown: '>=3.3' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-click-0.9.0-pyh29332c3_0.conda + hash: + md5: 5fe524d35646dadfdc024c510d29330a + category: dev + optional: true +- name: mkdocs-get-deps + version: 0.2.0 + manager: conda + platform: linux-64 + dependencies: + importlib-metadata: '>=4.3' + mergedeep: '>=1.3.4' + platformdirs: '>=2.2.0' + python: '>=3.9' + pyyaml: '>=5.1' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + hash: + md5: 84382acddb26c27c70f2de8d4c830830 + category: dev + optional: true +- name: mkdocs-include-markdown-plugin + version: 7.2.0 + manager: conda + platform: linux-64 + dependencies: + mkdocs: '>=1.4' + python: '>=3.10' + wcmatch: '' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-include-markdown-plugin-7.2.0-pyhd8ed1ab_0.conda + hash: + md5: 4e2463b17fc15bb0ce9f67a14e3846ed + sha256: 89bea7fadc8172b8084c85971a0d09004193f9f419705dc8fc67b3267a7fdf19 + category: dev + optional: true +- name: mkdocs-material + version: 9.6.22 + manager: conda + platform: linux-64 + dependencies: + babel: '>=2.10,<3.dev0' + backrefs: '>=5.7.post1,<6.dev0' + colorama: '>=0.4,<1.dev0' + jinja2: '>=3.0,<4.dev0' + markdown: '>=3.2,<4.dev0' + mkdocs: '>=1.6,<2.dev0' + mkdocs-material-extensions: '>=1.3,<2.dev0' + paginate: '>=0.5,<1.dev0' + pygments: '>=2.16,<3.dev0' + pymdown-extensions: '>=10.2,<11.dev0' + python: '' + requests: '>=2.26,<3.dev0' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.22-pyhcf101f3_0.conda + hash: + md5: 5b9120156602e68f39129853b89acf86 + sha256: 4abb9d42fcd3820898e95f6670a2713df9f35d4eee84dd32121c6b6445a1e115 + category: dev + optional: true +- name: mkdocs-material-extensions + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + hash: + md5: de8af4000a4872e16fb784c649679c8e + category: dev + optional: true +- name: more-itertools + version: 10.8.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhd8ed1ab_0.conda + hash: + md5: d7620a15dc400b448e1c88a981b23ddd + category: dev + optional: true +- name: mypy + version: 1.18.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + mypy_extensions: '>=1.0.0' + pathspec: '>=0.9.0' + psutil: '>=4.0' + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + typing_extensions: '>=4.6.0' + url: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.18.2-py314h5bd0f2a_0.conda + hash: + md5: 1e87cabfdfea01d30e2ce1dd6152846f + category: dev + optional: true +- name: mypy_extensions + version: 1.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + hash: + md5: e9c622e0d00fa24a6292279af3ab6d06 + category: dev + optional: true +- name: ncurses + version: '6.5' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + hash: + md5: 47e340acb35de30501a76c7c799c41d7 + category: main + optional: false +- name: nh3 + version: 0.3.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + _python_abi3_support: 1.* + cpython: '>=3.10' + libgcc: '>=14' + python: '' + url: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.1-py310h1570de5_0.conda + hash: + md5: 5408ec76dfdab005a3f43be2d2c2cef3 + sha256: 01da3cb9332b933dc5a6da743814023fd2cf7f03844fd1857f66244e27eddc6d + category: dev + optional: true +- name: nlohmann_json-abi + version: 3.12.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda + hash: + md5: 59659d0213082bc13be8500bab80c002 + category: dev + optional: true +- name: nodeenv + version: 1.9.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + setuptools: '' + url: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + hash: + md5: 7ba3f09fceae6a120d664217e58fe686 + category: dev + optional: true +- name: openssl + version: 3.5.4 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + ca-certificates: '' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda + hash: + md5: 14edad12b59ccbfa3910d42c72adc2a0 + category: main + optional: false +- name: packaging + version: '25.0' + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + hash: + md5: 58335b26c38bf4a20f399384c33cbcf9 + category: dev + optional: true +- name: paginate + version: 0.5.7 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + hash: + md5: c3f35453097faf911fd3f6023fc2ab24 + category: dev + optional: true +- name: paramiko + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + bcrypt: '>=3.2' + cryptography: '>=3.3' + invoke: '>=2.0' + pynacl: '>=1.5' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda + hash: + md5: 1a884d2b1ea21abfb73911dcdb8342e4 + category: dev + optional: true +- name: pathspec + version: 0.12.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + hash: + md5: 617f15191456cc6a13db418a275435e5 + category: dev + optional: true +- name: pcre2 + version: '10.46' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + libgcc: '>=14' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda + hash: + md5: 7fa07cb0fb1b625a089ccc01218ee5b1 + category: dev + optional: true +- name: pip + version: '25.2' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.13.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh145f28c_0.conda + hash: + md5: e7ab34d5a93e0819b62563c78635d937 + category: main + optional: false +- name: platformdirs + version: 4.5.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda + hash: + md5: 5c7a868f8241e64e1cf5fdf4962f23e2 + category: dev + optional: true +- name: pluggy + version: 1.6.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + hash: + md5: 7da7ccd349dbf6487a7778579d2bb971 + category: dev + optional: true +- name: pre-commit + version: 4.3.0 + manager: conda + platform: linux-64 + dependencies: + cfgv: '>=2.0.0' + identify: '>=1.0.0' + nodeenv: '>=0.11.1' + python: '>=3.9' + pyyaml: '>=5.1' + virtualenv: '>=20.10.0' + url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda + hash: + md5: bc6c44af2a9e6067dd7e949ef10cdfba + category: dev + optional: true +- name: psutil + version: 7.1.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.0-py314h5bd0f2a_0.conda + hash: + md5: 3bba9ff64ab2030c4c28c0d225864196 + category: dev + optional: true +- name: pycparser + version: '2.22' + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + hash: + md5: 12c566707c80111f9799308d9e265aef + category: dev + optional: true +- name: pygments + version: 2.19.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + hash: + md5: 6b6ece66ebcae2d5f326c77ef2c5a066 + category: dev + optional: true +- name: pymdown-extensions + version: 10.16.1 + manager: conda + platform: linux-64 + dependencies: + markdown: '>=3.6' + python: '>=3.9' + pyyaml: '' + url: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda + hash: + md5: 26e013bc453e643991cfa9b76911fb79 + category: dev + optional: true +- name: pynacl + version: 1.6.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.4.1' + libgcc: '>=14' + libsodium: '>=1.0.20,<1.0.21.0a0' + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + six: '' + url: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.0-py314h5bd0f2a_0.conda + hash: + md5: 287eabdd0b0a176376968b84c2707bd8 + category: dev + optional: true +- name: pyproject_hooks + version: 1.2.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + tomli: '>=1.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda + hash: + md5: d4582021af437c931d7d77ec39007845 + category: dev + optional: true +- name: pysocks + version: 1.7.1 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + hash: + md5: 461219d1a5bd61342293efa2c0c90eac + category: dev + optional: true +- name: pytest + version: 8.4.2 + manager: conda + platform: linux-64 + dependencies: + colorama: '>=0.4' + exceptiongroup: '>=1' + iniconfig: '>=1' + packaging: '>=20' + pluggy: '>=1.5,<2' + pygments: '>=2.7.2' + python: '>=3.10' + tomli: '>=1' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda + hash: + md5: 1f987505580cb972cf28dc5f74a0f81b + category: dev + optional: true +- name: pytest-cov + version: 7.0.0 + manager: conda + platform: linux-64 + dependencies: + coverage: '>=7.10.6' + pluggy: '>=1.2' + pytest: '>=7' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda + hash: + md5: 6891acad5e136cb62a8c2ed2679d6528 + category: dev + optional: true +- name: pytest-split + version: 0.10.0 + manager: conda + platform: linux-64 + dependencies: + pytest: '>=5.0.0,<9.0.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-split-0.10.0-pyhff2d567_0.conda + hash: + md5: 3bd32c44526b455aa146d8fdb27a65b3 + category: dev + optional: true +- name: pytest-timeout + version: 2.4.0 + manager: conda + platform: linux-64 + dependencies: + pytest: '>=7.0.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + hash: + md5: 52a50ca8ea1b3496fbd3261bea8c5722 + category: dev + optional: true +- name: pytest-xdist + version: 3.8.0 + manager: conda + platform: linux-64 + dependencies: + execnet: '>=2.1' + pytest: '>=7.0.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + hash: + md5: 8375cfbda7c57fbceeda18229be10417 + category: dev + optional: true +- name: python + version: 3.14.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + ld_impl_linux-64: '>=2.36.1' + libexpat: '>=2.7.1,<3.0a0' + libffi: '>=3.5.2,<3.6.0a0' + libgcc: '>=14' + liblzma: '>=5.8.1,<6.0a0' + libmpdec: '>=4.0.0,<5.0a0' + libsqlite: '>=3.50.4,<4.0a0' + libuuid: '>=2.41.2,<3.0a0' + libzlib: '>=1.3.1,<2.0a0' + ncurses: '>=6.5,<7.0a0' + openssl: '>=3.5.4,<4.0a0' + pip: '' + python_abi: 3.14.* + readline: '>=8.2,<9.0a0' + tk: '>=8.6.13,<8.7.0a0' + tzdata: '' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda + hash: + md5: 0a19d2cc6eb15881889b0c6fa7d6a78d + sha256: 76d750045b94fded676323bfd01975a26a474023635735773d0e4d80aaa72518 + category: main + optional: false +- name: python-build + version: 1.3.0 + manager: conda + platform: linux-64 + dependencies: + colorama: '' + importlib-metadata: '>=4.6' + packaging: '>=19.0' + pyproject_hooks: '' + python: '>=3.9' + tomli: '>=1.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + hash: + md5: ed5d43e9ef92cc2a9872f9bdfe94b984 + category: dev + optional: true +- name: python-dateutil + version: 2.9.0.post0 + manager: conda + platform: linux-64 + dependencies: + python: '' + six: '>=1.5' + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + hash: + md5: 5b8d21249ff20967101ffa321cab24e8 + category: dev + optional: true +- name: python-gil + version: 3.14.0 + manager: conda + platform: linux-64 + dependencies: + cpython: 3.14.0.* + python_abi: '*' + url: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda + hash: + md5: d152e423d80848fe95f0f4b43448030e + sha256: e68c9796fba0825ebc1338ceb94496683ab7d45dcd281b378ec2a56365d3c555 + category: dev + optional: true +- name: python_abi + version: '3.14' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + hash: + md5: 0539938c55b6b1a59b560e843ad864a4 + category: main + optional: false +- name: pytz + version: '2025.2' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + hash: + md5: bc8e3267d44011051f2eb14d22fb0960 + category: dev + optional: true +- name: pywin32-on-windows + version: 0.1.0 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 + hash: + md5: 2807a0becd1d986fe1ef9b7f8135f215 + category: dev + optional: true +- name: pyyaml + version: 6.0.3 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10.*' + yaml: '' + url: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda + hash: + md5: b12f41c0d7fb5ab81709fcc86579688f + category: dev + optional: true +- name: pyyaml-env-tag + version: '1.1' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + pyyaml: '' + url: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda + hash: + md5: e8e53c4150a1bba3b160eacf9d53a51b + category: dev + optional: true +- name: readline + version: '8.2' + manager: conda + platform: linux-64 + dependencies: + libgcc: '>=13' + ncurses: '>=6.5,<7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + hash: + md5: 283b96675859b20a825f8fa30f311446 + category: main + optional: false +- name: readme_renderer + version: '44.0' + manager: conda + platform: linux-64 + dependencies: + cmarkgfm: '>=0.8.0' + docutils: '>=0.21.2' + nh3: '>=0.2.14' + pygments: '>=2.5.1' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda + hash: + md5: c58dd5d147492671866464405364c0f1 + sha256: 66f3adf6aaabf977cfcc22cb65607002b1de4a22bc9fac7be6bb774bc6f85a3a + category: dev + optional: true +- name: reproc + version: 14.2.5.post0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda + hash: + md5: 69fbc0a9e42eb5fe6733d2d60d818822 + category: dev + optional: true +- name: reproc-cpp + version: 14.2.5.post0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + reproc: 14.2.5.post0 + url: https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda + hash: + md5: 828302fca535f9cfeb598d5f7c204323 + category: dev + optional: true +- name: requests + version: 2.32.5 + manager: conda + platform: linux-64 + dependencies: + certifi: '>=2017.4.17' + charset-normalizer: '>=2,<4' + idna: '>=2.5,<4' + python: '>=3.9' + urllib3: '>=1.21.1,<3' + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + hash: + md5: db0c6b99149880c8ba515cf4abe93ee4 + category: dev + optional: true +- name: requests-mock + version: 1.12.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + requests: '>=2.22,<3' + url: https://conda.anaconda.org/conda-forge/noarch/requests-mock-1.12.1-pyhd8ed1ab_1.conda + hash: + md5: 8212b70c509aaa0fa6c8fa974f784b2e + category: dev + optional: true +- name: requests-toolbelt + version: 1.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + requests: '>=2.0.1,<3.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda + hash: + md5: 66de8645e324fda0ea6ef28c2f99a2ab + category: dev + optional: true +- name: rfc3986 + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 43e14f832d7551e5a8910672bfc3d8c6 + sha256: d617373ba1a5108336cb87754d030b9e384dcf91796d143fa60fe61e76e5cfb0 + category: dev + optional: true +- name: rich + version: 14.2.0 + manager: conda + platform: linux-64 + dependencies: + markdown-it-py: '>=2.2.0' + pygments: '>=2.13.0,<3.0.0' + python: '' + typing_extensions: '>=4.0.0,<5.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + hash: + md5: a247579d8a59931091b16a1e932bbed6 + sha256: edfb44d0b6468a8dfced728534c755101f06f1a9870a7ad329ec51389f16b086 + category: dev + optional: true +- name: ruff + version: 0.14.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '' + url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.2-ha3a3aed_0.conda + hash: + md5: ba27344e81c9c460c9502fcbf7bd1e5c + sha256: d6c3ee6381ce275107a3fb3cfe82499f3cb74da1d95e134a93ed5e4851b4ec01 + category: dev + optional: true +- name: secretstorage + version: 3.4.0 + manager: conda + platform: linux-64 + dependencies: + cryptography: '>=2.0' + dbus: '' + jeepney: '>=0.6' + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.0-py314hdafbbf9_0.conda + hash: + md5: a804c54ce3a1aed268b13657b79825b8 + category: dev + optional: true +- name: setuptools + version: 80.9.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + hash: + md5: 4de79c071274a53dcaf2a8c749d1499e + category: dev + optional: true +- name: simdjson + version: 4.0.7 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/simdjson-4.0.7-hb700be7_0.conda + hash: + md5: cc9c262a71dd584aa5a3a22fc963255c + category: dev + optional: true +- name: six + version: 1.17.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + hash: + md5: 3339e3b65d58accf4ca4fb8748ab16b3 + category: dev + optional: true +- name: smmap + version: 5.0.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + hash: + md5: 87f47a78808baf2fa1ea9c315a1e48f1 + category: dev + optional: true +- name: tk + version: 8.6.13 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + hash: + md5: a0116df4f4ed05c303811a837d5b39d8 + category: main + optional: false +- name: toml + version: 0.10.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + hash: + md5: b0dd904de08b7db706167240bf37b164 + category: dev + optional: true +- name: tomli + version: 2.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + hash: + md5: d2732eb636c264dc9aa4cbee404b1a53 + category: dev + optional: true +- name: twine + version: 6.2.0 + manager: conda + platform: linux-64 + dependencies: + id: '' + importlib-metadata: '>=3.6' + keyring: '>=21.2.0' + packaging: '>=24.0' + python: '' + readme_renderer: '>=35.0' + requests: '>=2.20' + requests-toolbelt: '>=0.8.0,!=0.9.0' + rfc3986: '>=1.4.0' + rich: '>=12.0.0' + urllib3: '>=1.26.0' + url: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda + hash: + md5: 901a86453fa6183e914b937643619a03 + sha256: 0370098cab22773e33755026bf78539c2f05645fce7dcc9713d01e21950756bb + category: dev + optional: true +- name: types-click + version: 7.1.8 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-click-7.1.8-pyhd8ed1ab_1.conda + hash: + md5: 08ed65e279de69322843b075679567ea + category: dev + optional: true +- name: types-click-default-group + version: 1.2.0.20250513 + manager: conda + platform: linux-64 + dependencies: + click: '>=8.0.0' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/types-click-default-group-1.2.0.20250513-pyhe01879c_0.conda + hash: + md5: 335926a07f57d325d0d6966bf36eee0b + category: dev + optional: true +- name: types-filelock + version: 3.2.7 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-filelock-3.2.7-pyhd8ed1ab_1.conda + hash: + md5: 3f1356104d409d6deba0c689f3b2c602 + category: dev + optional: true +- name: types-freezegun + version: 1.1.10 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-freezegun-1.1.10-pyhd8ed1ab_1.conda + hash: + md5: 0b609b66e56bbe70d97cd52ad24058fb + category: dev + optional: true +- name: types-pyyaml + version: 6.0.12.20250915 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_0.conda + hash: + md5: 3c9919ecee97547fa14fea57e2a9bb54 + category: dev + optional: true +- name: types-requests + version: 2.32.4.20250913 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + urllib3: '>=2' + url: https://conda.anaconda.org/conda-forge/noarch/types-requests-2.32.4.20250913-pyhd8ed1ab_0.conda + hash: + md5: 829c891bfd4147c25b030455d3a57a3a + category: dev + optional: true +- name: types-setuptools + version: 80.9.0.20250822 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/types-setuptools-80.9.0.20250822-pyhcf101f3_0.conda + hash: + md5: 6404dcec3d8f8b8fe540516837aa08ec + category: dev + optional: true +- name: types-toml + version: 0.10.8.20240310 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda + hash: + md5: 353b9704e4851a6f210e641d3595755f + category: dev + optional: true +- name: typing_extensions + version: 4.15.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + hash: + md5: 0caa1af407ecff61170c9437a808404d + category: dev + optional: true +- name: tzdata + version: 2025b + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + hash: + md5: 4222072737ccff51314b5ece9c7d6f5a + category: main + optional: false +- name: ukkonen + version: 1.0.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '' + libgcc: '>=14' + libstdcxx: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py314h9891dd4_6.conda + hash: + md5: 28303a78c48916ab07b95ffdbffdfd6c + sha256: ef6753f6febaa74d35253e4e0dd09dc9497af8e370893bd97c479f59346daa57 + category: dev + optional: true +- name: urllib3 + version: 2.5.0 + manager: conda + platform: linux-64 + dependencies: + brotli-python: '>=1.0.9' + h2: '>=4,<5' + pysocks: '>=1.5.6,<2.0,!=1.5.7' + python: '>=3.9' + zstandard: '>=0.18.0' + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + hash: + md5: 436c165519e140cb08d246a4472a9d6a + category: dev + optional: true +- name: virtualenv + version: 20.35.3 + manager: conda + platform: linux-64 + dependencies: + distlib: '>=0.3.7,<1' + filelock: '>=3.12.2,<4' + platformdirs: '>=3.9.1,<5' + python: '>=3.10' + typing_extensions: '>=4.13.2' + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.3-pyhd8ed1ab_0.conda + hash: + md5: bf0dc4c8a32e91290e3fae5403798c63 + category: dev + optional: true +- name: watchdog + version: 6.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + pyyaml: '>=3.10' + url: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py314hdafbbf9_1.conda + hash: + md5: 099125fcb130e9fe134c6b610f33b0e1 + category: dev + optional: true +- name: wcmatch + version: '10.1' + manager: conda + platform: linux-64 + dependencies: + bracex: '>=2.1.1' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/wcmatch-10.1-pyhd8ed1ab_0.conda + hash: + md5: b045a877087e3bbdd36fe460e7f5cc55 + category: dev + optional: true +- name: websocket-client + version: 1.9.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + hash: + md5: 2f1ed718fcd829c184a6d4f0f2e07409 + category: dev + optional: true +- name: wheel + version: 0.45.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + hash: + md5: 75cb7132eb58d97896e173ef12ac9986 + category: dev + optional: true +- name: yaml + version: 0.2.5 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + hash: + md5: a77f85f77be52ff59391544bfe73390a + category: dev + optional: true +- name: yaml-cpp + version: 0.8.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda + hash: + md5: 92b90f5f7a322e74468bb4909c7354b5 + category: dev + optional: true +- name: zipp + version: 3.23.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + hash: + md5: df5e78d904988eb55042c0c97446079f + category: dev + optional: true +- name: zizmor + version: 1.14.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '>=3.14.0rc3,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/zizmor-1.14.1-py314ha5689aa_0.conda + hash: + md5: 1f0180642729883f29c47e11d857e786 + category: dev + optional: true +- name: zstandard + version: 0.25.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.11' + libgcc: '>=14' + python: '' + python_abi: 3.14.* + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h31f8a6b_0.conda + hash: + md5: 68bd13651618354987763f746ee1fadc + category: dev + optional: true +- name: zstd + version: 1.5.7 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + hash: + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + category: main + optional: false +- name: ty + version: 0.0.1a24 + manager: pip + platform: linux-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/78/ae/323f373fcf54a883e39ea3fb6f83ed6d1eda6dfd8246462d0cfd81dac781/ty-0.0.1a24-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + hash: + sha256: d4836854411059de592f0ecc62193f2b24fc3acbfe6ce6ce0bf2c6d1a5ea9de7 + category: dev + optional: true From 8ebc396cfeb1c5c5fe4450ac3f48dc5c6805a653 Mon Sep 17 00:00:00 2001 From: Ben Mares Date: Tue, 28 Oct 2025 20:20:39 +0100 Subject: [PATCH 02/10] Fix lockfile generation --- .../04-run-conda-lock.sh | 27 +- .../04-test-conda-lock-with-pkgs.py | 42 +- tests/test-corrupt-repodata/04.Dockerfile | 1 - tests/test-corrupt-repodata/README.md | 14 +- .../lockfile-2.1.0-pkgs.yml | 9 +- .../lockfile-2.1.1-pkgs.yml | 1339 +--------- .../lockfile-2.3.3-pkgs.yml | 2365 +++++++++++++++++ 7 files changed, 2531 insertions(+), 1266 deletions(-) create mode 100644 tests/test-corrupt-repodata/lockfile-2.3.3-pkgs.yml diff --git a/tests/test-corrupt-repodata/04-run-conda-lock.sh b/tests/test-corrupt-repodata/04-run-conda-lock.sh index 1b43dbc7a..d65cb416e 100644 --- a/tests/test-corrupt-repodata/04-run-conda-lock.sh +++ b/tests/test-corrupt-repodata/04-run-conda-lock.sh @@ -12,13 +12,7 @@ set -e # Setup editable install of conda-lock from mounted source bash /setup-editable.sh -# Copy the read-only mounted pkgs directory to a writable location in the user's home -# The pkgs directory must be writable for micromamba to use it properly -echo "Copying pkgs directory to writable location..." -cp -r /custom-pkgs-ro/ ~/custom-pkgs-writeable/ - -# Configure micromamba to use our custom writable pkgs directory -# This prepends it to the pkgs_dirs list so it's searched first +# Configure micromamba to use our custom writable pkgs directory first echo "Configuring micromamba to use custom pkgs directory..." micromamba config prepend pkgs_dirs ~/custom-pkgs-writeable/ @@ -27,19 +21,16 @@ echo "Current pkgs_dirs configuration:" micromamba config list pkgs_dirs echo "" -# The pkgs directory only contains index.json and repodata_record.json files -# We need to populate the actual package files by doing an explicit install -# This will generate warnings about invalid package cache, which is expected -echo "Populating package cache with explicit install (warnings are expected and filtered out)..." -echo "This fills in missing package files from the incomplete cache..." -# Filter out warning lines and the blank line that follows each warning -micromamba create -n temp-populate -y -f /explicit.lock 2>&1 | awk ' - /warning.*Invalid package cache/ { skip_next=1; next } - skip_next { skip_next=0; if (NF==0) next } - { print } -' +# Warm the default package cache by performing an explicit install +# This ensures all package files are available without touching our custom metadata +echo "Warming default package cache with explicit install..." +micromamba create -n temp-populate -y -f /explicit.lock echo "" +# Now copy the read-only mounted pkgs directory (metadata only) over the warmed cache +echo "Copying pkgs directory to writable location..." +cp -r /custom-pkgs-ro/. ~/custom-pkgs-writeable/ + # Run conda-lock to generate the lockfile # It will now read from the populated cache which has corrupt repodata_record.json files echo "Running conda-lock..." diff --git a/tests/test-corrupt-repodata/04-test-conda-lock-with-pkgs.py b/tests/test-corrupt-repodata/04-test-conda-lock-with-pkgs.py index 4c7fb6947..31c25971a 100755 --- a/tests/test-corrupt-repodata/04-test-conda-lock-with-pkgs.py +++ b/tests/test-corrupt-repodata/04-test-conda-lock-with-pkgs.py @@ -4,11 +4,11 @@ specified pkgs archive, and generates lockfiles to compare the results. The pkgs archives contain only metadata files (index.json and repodata_record.json) -from package cache directories. To reproduce the corruption issue, the script: -1. Mounts the incomplete pkgs directory as read-only -2. Copies it to a writable location inside the container -3. Runs an explicit install to populate missing package files -4. Runs conda-lock which reads from the populated but corrupt cache +from package cache directories. To reproduce the corruption issue, the container will: +1. Warm the default package cache via an explicit install from /explicit.lock +2. Copy the incomplete pkgs directory (metadata only) to a writable location +3. Configure micromamba to use the custom pkgs directory first +4. Run conda-lock, which reads corrupt metadata from the custom pkgs and uses warmed files For more context, see: @@ -31,7 +31,7 @@ SOURCE_FILE: Final[Path] = SCRIPT_DIR / "../../environments/dev-environment.yaml" EXPLICIT_LOCK: Final[Path] = SCRIPT_DIR / "01-explicit.lock" DEFAULT_MICROMAMBA_VERSION: Final[str] = "2.1.0" -DEFAULT_PKGS_DIR: Final[str] = "2.1.0-pkgs" +DEFAULT_PKGS_ARCHIVE: Final[str] = "2.1.0-pkgs.tar.gz" def build_conda_lock_image(micromamba_version: str = DEFAULT_MICROMAMBA_VERSION) -> str: @@ -64,6 +64,20 @@ def build_conda_lock_image(micromamba_version: str = DEFAULT_MICROMAMBA_VERSION) return image_tag +def remove_container_if_exists(container_name: str) -> None: + """Remove an existing container with the given name, if present. + + This avoids errors from docker run when a prior container with the same + name was left behind (e.g., from an interrupted run). + """ + subprocess.run( + ["docker", "rm", "--force", container_name], + check=False, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + + def generate_lockfile_with_pkgs( image_tag: str, pkgs_dir: Path, @@ -99,6 +113,9 @@ def generate_lockfile_with_pkgs( # We can't use --rm because we need to copy the file out after the container exits. container_name = f"conda-lock-temp-{output_file.stem}" + # Ensure any prior container is removed to avoid name conflicts + remove_container_if_exists(container_name) + cmd = [ "docker", "run", @@ -130,11 +147,7 @@ def generate_lockfile_with_pkgs( ) finally: # Clean up the container - subprocess.run( - ["docker", "rm", "--force", container_name], - stdout=subprocess.DEVNULL, - stderr=subprocess.DEVNULL, - ) + remove_container_if_exists(container_name) print(f"Generated: {output_file}") print() @@ -154,12 +167,12 @@ def main() -> None: parser.add_argument( "--pkgs-archive", dest="pkgs_archive_name", - default=f"{DEFAULT_PKGS_DIR}.tar.gz", - help=f"Name of pkgs archive to use (default: {DEFAULT_PKGS_DIR}.tar.gz)", + default=DEFAULT_PKGS_ARCHIVE, + help=f"Name of pkgs archive to use (default: {DEFAULT_PKGS_ARCHIVE})", ) parser.add_argument( "--output-name", - help="Name for output lockfile (default: lockfile-{pkgs-dir})", + help="Name for output lockfile (default: lockfile-{pkgs_name})", ) args = parser.parse_args() @@ -211,6 +224,7 @@ def main() -> None: print() print("To compare lockfiles, run:") print(" diff lockfile-2.1.0-pkgs.yml lockfile-2.1.1-pkgs.yml") + print(" diff lockfile-2.1.0-pkgs.yml lockfile-2.3.3-pkgs.yml") if __name__ == "__main__": diff --git a/tests/test-corrupt-repodata/04.Dockerfile b/tests/test-corrupt-repodata/04.Dockerfile index cf6fa34c5..b8458ba34 100644 --- a/tests/test-corrupt-repodata/04.Dockerfile +++ b/tests/test-corrupt-repodata/04.Dockerfile @@ -10,4 +10,3 @@ RUN micromamba install -y -n base -c conda-forge python pip git mamba less nano RUN micromamba run -n base pip install conda-lock WORKDIR /workspace - diff --git a/tests/test-corrupt-repodata/README.md b/tests/test-corrupt-repodata/README.md index 9eda4b67d..a10209c13 100644 --- a/tests/test-corrupt-repodata/README.md +++ b/tests/test-corrupt-repodata/README.md @@ -137,18 +137,16 @@ This will: 3. Mount the extracted pkgs directory as `/custom-pkgs-ro` (read-only) 4. Mount the explicit lockfile (`01-explicit.lock`) for populating the cache 5. Inside the container: + - Warm the default package cache with `micromamba create -n temp-populate -y -f /explicit.lock` - Copy the pkgs directory to a writable location (`~/custom-pkgs-writeable`) - - Configure micromamba to use the writable pkgs directory - - Run `micromamba create` with the explicit lockfile to populate missing package files - - This generates warnings about "Invalid package cache" (expected, as the cache only has metadata) - - Run conda-lock which reads from the now-populated but corrupt cache + - Configure micromamba to use the writable pkgs directory first + - Run conda-lock which reads corrupt metadata from the custom pkgs and uses warmed files 6. Save the lockfile as `lockfile-{pkgs-dir}.yml` **Why these steps are necessary:** -- The pkgs directory must be **writable** for micromamba to use it -- The extracted archives only contain `index.json` and `repodata_record.json` files (metadata) -- An explicit install populates the actual package files while preserving the corrupt metadata -- conda-lock then reads from this populated cache with corrupt `repodata_record.json` files +- The extracted archives only contain `index.json`/`repodata_record.json` (metadata) +- Warming the default cache ensures package files are available without touching the custom metadata +- Using the custom pkgs directory first makes micromamba/conda-lock read the corrupt metadata while finding files via the warmed cache Compare the generated lockfiles to see how corrupt metadata affects the output: diff --git a/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs.yml b/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs.yml index 77fb79425..873a16e49 100644 --- a/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs.yml +++ b/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs.yml @@ -1529,17 +1529,18 @@ package: category: dev optional: true - name: psutil - version: 7.1.0 + version: 7.1.2 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' - python: '>=3.14.0rc2,<3.15.0a0' + python: '' python_abi: 3.14.* - url: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.0-py314h5bd0f2a_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.2-py314h0f05182_0.conda hash: - md5: 3bba9ff64ab2030c4c28c0d225864196 + md5: 50eba940aa0f5105f6ae0edc586e14da + sha256: 7a5a754cda58b1c050c8084028c60350bfd903dd697fc69a8d33a567411d47f7 category: dev optional: true - name: pycparser diff --git a/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs.yml b/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs.yml index 77fb79425..24c145c4a 100644 --- a/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs.yml +++ b/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs.yml @@ -24,28 +24,6 @@ metadata: sources: - ../workspace/dev-environment.yaml package: -- name: _libgcc_mutex - version: '0.1' - manager: conda - platform: linux-64 - dependencies: {} - url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 - hash: - md5: d7c89558ba9fa0495403155b64376d81 - category: main - optional: false -- name: _openmp_mutex - version: '4.5' - manager: conda - platform: linux-64 - dependencies: - _libgcc_mutex: '0.1' - libgomp: '>=7.5.0' - url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 - hash: - md5: 73aaf86a425cc6e73fcf236a5a46396d - category: main - optional: false - name: _python_abi3_support version: '1.0' manager: conda @@ -63,133 +41,30 @@ package: version: 2.17.0 manager: conda platform: linux-64 - dependencies: - python: '>=3.9' - pytz: '>=2015.7' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda hash: md5: 0a01c169f0ab0f91b26e77a3301fbfe4 category: dev optional: true -- name: backports - version: '1.0' - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda - hash: - md5: 767d508c1a67e02ae8f50e44cacfadb2 - category: dev - optional: true -- name: backports.tarfile - version: 1.2.0 - manager: conda - platform: linux-64 - dependencies: - backports: '' - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhd8ed1ab_1.conda - hash: - md5: df837d654933488220b454c6a3b0fad6 - category: dev - optional: true - name: backrefs version: '5.8' manager: conda platform: linux-64 - dependencies: - python: '>=3.9' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda hash: md5: b16e2595d3a9042aa9d570375978835f category: dev optional: true -- name: bcrypt - version: 5.0.0 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - python: '' - python_abi: 3.14.* - url: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py314h68536ef_0.conda - hash: - md5: 71d9c4f6a05a4b9da1b03b973e078db0 - category: dev - optional: true -- name: bracex - version: 2.2.1 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.5' - url: https://conda.anaconda.org/conda-forge/noarch/bracex-2.2.1-pyhd8ed1ab_0.tar.bz2 - hash: - md5: 586272349d7bef5b1ef527b56dca73cb - category: dev - optional: true -- name: brotli-python - version: 1.2.0 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - libstdcxx: '>=14' - python: '>=3.14,<3.15.0a0' - python_abi: 3.14.* - url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314hdfeb8a1_0.conda - hash: - md5: 3ef9d2a701760467b9db2338b6cd926f - sha256: 9f6d339fb78b647be35e3564dac453d8d2f1b865ba72fb961eaac41061368699 - category: dev - optional: true - name: bzip2 version: 1.0.8 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda hash: md5: 51a19bba1b8ebfb60df25cde030b7ebc - category: main - optional: false -- name: c-ares - version: 1.34.5 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=13' - url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda - hash: - md5: f7f0d6cc2dc986d42ac2689ec88192be - category: dev - optional: true -- name: ca-certificates - version: 2025.10.5 - manager: conda - platform: linux-64 - dependencies: - __unix: '' - url: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda - hash: - md5: f9e5fbc24009179e8b0409624691758a - category: main - optional: false -- name: certifi - version: 2025.10.5 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda - hash: - md5: 257ae203f1d204107ba389607d375ded category: dev optional: true - name: cffi @@ -209,29 +84,6 @@ package: sha256: c6339858a0aaf5d939e00d345c98b99e4558f285942b27232ac098ad17ac7f8e category: dev optional: true -- name: cfgv - version: 3.3.1 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda - hash: - md5: 57df494053e17dce2ac3a0b33e1b2a2e - category: dev - optional: true -- name: charset-normalizer - version: 3.4.4 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda - hash: - md5: a22d1fd9bf98827e280a02875d9a007a - sha256: b32f8362e885f1b8417bac2b3da4db7323faa12d5db62b7fd6691c02d60d6f59 - category: dev - optional: true - name: check-manifest version: '0.51' manager: conda @@ -247,18 +99,6 @@ package: sha256: 18637560b1725c32680560566db00d3c16687a3b1adb8f628cbb251a19d9963d category: dev optional: true -- name: click - version: 8.3.0 - manager: conda - platform: linux-64 - dependencies: - __unix: '' - python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda - hash: - md5: e76c4ba9e1837847679421b8d549b784 - category: dev - optional: true - name: cmarkgfm version: 2024.11.20 manager: conda @@ -279,37 +119,17 @@ package: version: 0.4.6 manager: conda platform: linux-64 - dependencies: - python: '>=3.9' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda hash: md5: 962b9857ee8e7018c22f2776ffa0b2d7 category: dev optional: true -- name: coverage - version: 7.11.0 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - python: '>=3.14,<3.15.0a0' - python_abi: 3.14.* - tomli: '' - url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.11.0-py314h67df5f8_0.conda - hash: - md5: 6ff84b39468623308dee97e5dfbafca0 - sha256: d928f6d0567807c8a09786e18966445b011ec2eb85c7e18382c0b4870cf12f17 - category: dev - optional: true - name: cpp-expected version: 1.3.1 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - libstdcxx: '>=14' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/cpp-expected-1.3.1-h171cf75_0.conda hash: md5: d17488e343e4c5c0bd0db18b3934d517 @@ -328,61 +148,11 @@ package: sha256: 8e2a33b36d36820698840bf0c1ed50e5dd4bdeaa434c7b4f5e13d421225b0414 category: dev optional: true -- name: cryptography - version: 46.0.3 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - cffi: '>=1.14' - libgcc: '>=14' - openssl: '>=3.5.4,<4.0a0' - python: '>=3.14,<3.15.0a0' - python_abi: 3.14.* - url: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.3-py314hb613cbf_0.conda - hash: - md5: f291630db5dc438b6ce37c2bb1a96516 - sha256: 4bf88483f944b5624269c926369002d58951627a369aeac1e2cd64a6aa00eb05 - category: dev - optional: true -- name: dbus - version: 1.16.2 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libexpat: '>=2.7.0,<3.0a0' - libgcc: '>=13' - libglib: '>=2.84.2,<3.0a0' - libstdcxx: '>=13' - libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda - hash: - md5: 679616eb5ad4e521c83da4650860aba7 - category: dev - optional: true -- name: distlib - version: 0.4.0 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda - hash: - md5: 003b8ba0a94e2f1e117d0bd46aebc901 - category: dev - optional: true - name: docker-py version: 7.1.0 manager: conda platform: linux-64 - dependencies: - paramiko: '>=2.4.3' - python: '>=3.9' - pywin32-on-windows: '' - requests: '>=2.26.0' - urllib3: '>=1.26.0' - websocket-client: '>=0.32.0' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda hash: md5: 07ce73ca6f6c1a1df5d498679fc52d9e @@ -392,11 +162,7 @@ package: version: 1.9.0 manager: conda platform: linux-64 - dependencies: - cryptography: '' - python: '>=3.5' - pyyaml: '' - requests: '' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/doctr-1.9.0-pyhd8ed1ab_0.tar.bz2 hash: md5: f57b656502db0e45cc996ddbef2a9d25 @@ -414,46 +180,11 @@ package: sha256: dd02330f2ecca4a489a001e5ec66ee8aa50773dc2c621c8fc7053b454d9a27b2 category: dev optional: true -- name: exceptiongroup - version: 1.3.0 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - typing_extensions: '>=4.6.0' - url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda - hash: - md5: 72e42d28960d875c7654614f8b50939a - category: dev - optional: true -- name: execnet - version: 2.1.1 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda - hash: - md5: a71efeae2c160f6789900ba2631a2c90 - category: dev - optional: true -- name: filelock - version: 3.20.0 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda - hash: - md5: 66b8b26023b8efdf8fcb23bac4b6325d - category: dev - optional: true - name: flaky version: 3.8.1 manager: conda platform: linux-64 - dependencies: - python: '>=3.9' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_1.conda hash: md5: 7e081d00fdcba21b76658c1649691836 @@ -477,86 +208,22 @@ package: version: 1.5.5 manager: conda platform: linux-64 - dependencies: - python: '>=3.9' - python-dateutil: '>=2.7' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/freezegun-1.5.5-pyhd8ed1ab_0.conda hash: md5: 0fdb8ebc8dbdb62530ff73181ae63554 category: dev optional: true -- name: ghp-import - version: 2.1.0 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - python-dateutil: '>=2.8.1' - url: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda - hash: - md5: 93f742fe078a7b34c29a182958d4d765 - category: dev - optional: true -- name: gitdb - version: 4.0.12 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - smmap: '>=3.0.1,<6' - url: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda - hash: - md5: 7c14f3706e099f8fcd47af2d494616cc - category: dev - optional: true - name: gitpython version: 3.1.45 manager: conda platform: linux-64 - dependencies: - gitdb: '>=4.0.1,<5' - python: '>=3.9' - typing_extensions: '>=3.10.0.2' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda hash: md5: b91d463ea8be13bcbe644ae8bc99c39f category: dev optional: true -- name: h2 - version: 4.3.0 - manager: conda - platform: linux-64 - dependencies: - hpack: '>=4.1,<5' - hyperframe: '>=6.1,<7' - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda - hash: - md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 - category: dev - optional: true -- name: hpack - version: 4.1.0 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda - hash: - md5: 0a802cb9888dd14eeefc611f05c40b6e - category: dev - optional: true -- name: hyperframe - version: 6.1.0 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda - hash: - md5: 8e6923fc12f1fe8f8c4e5c9f343256ac - category: dev - optional: true - name: id version: 1.5.0 manager: conda @@ -570,133 +237,21 @@ package: sha256: 161e3eb5aba887d0329bb4099f72cb92eed9072cf63f551d08540480116e69a2 category: dev optional: true -- name: identify - version: 2.6.15 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.10' - ukkonen: '' - url: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda - hash: - md5: 25f954b7dae6dd7b0dc004dab74f1ce9 - sha256: 32d5007d12e5731867908cbf5345f5cd44a6c8755a2e8e63e15a184826a51f82 - category: dev - optional: true -- name: idna - version: '3.11' - manager: conda - platform: linux-64 - dependencies: - python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda - hash: - md5: 53abe63df7e10a6ba605dc5f9f961d36 - sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 - category: dev - optional: true - name: importlib-metadata version: 8.7.0 manager: conda platform: linux-64 - dependencies: - python: '' - zipp: '>=3.20' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda hash: md5: 63ccfdc3a3ce25b027b8767eb722fca8 category: dev optional: true -- name: importlib_resources - version: 6.5.2 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - zipp: '>=3.1.0' - url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda - hash: - md5: c85c76dc67d75619a92f51dfbce06992 - category: dev - optional: true -- name: iniconfig - version: 2.3.0 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - hash: - md5: 9614359868482abba1bd15ce465e3c42 - sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 - category: dev - optional: true -- name: invoke - version: 2.2.1 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda - hash: - md5: 3a804714ed59be1969ffca10f703ec2a - sha256: 5a4e3a01f626c8de15ddada622d364e94ff28e8d6bdedf1665442ef03a4e0140 - category: dev - optional: true -- name: jaraco.classes - version: 3.4.0 - manager: conda - platform: linux-64 - dependencies: - more-itertools: '' - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_2.conda - hash: - md5: ade6b25a6136661dadd1a43e4350b10b - category: dev - optional: true -- name: jaraco.context - version: 6.0.1 - manager: conda - platform: linux-64 - dependencies: - backports.tarfile: '' - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.0.1-pyhd8ed1ab_0.conda - hash: - md5: bcc023a32ea1c44a790bbf1eae473486 - category: dev - optional: true -- name: jaraco.functools - version: 4.3.0 - manager: conda - platform: linux-64 - dependencies: - more-itertools: '' - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.3.0-pyhd8ed1ab_0.conda - hash: - md5: b86839fa387a5b904846e77c84167e57 - category: dev - optional: true -- name: jeepney - version: 0.9.0 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda - hash: - md5: b4b91eb14fbe2f850dd2c5fc20676c0d - category: dev - optional: true - name: jinja2 version: 3.1.6 manager: conda platform: linux-64 - dependencies: - markupsafe: '>=2.0' - python: '>=3.9' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda hash: md5: 446bd6c8cb26050d528881df495ce646 @@ -706,43 +261,17 @@ package: version: 25.6.0 manager: conda platform: linux-64 - dependencies: - __linux: '' - importlib-metadata: '>=4.11.4' - importlib_resources: '' - jaraco.classes: '' - jaraco.context: '' - jaraco.functools: '' - jeepney: '>=0.4.2' - python: '>=3.9' - secretstorage: '>=3.2' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyha804496_0.conda hash: md5: cdd58ab99c214b55d56099108a914282 category: dev optional: true -- name: keyutils - version: 1.6.3 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=13' - url: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda - hash: - md5: b38117a3c920364aff79f870c984b4a3 - category: dev - optional: true - name: krb5 version: 1.21.3 manager: conda platform: linux-64 - dependencies: - keyutils: '>=1.6.1,<2.0a0' - libedit: '>=3.1.20191231,<4.0a0' - libgcc-ng: '>=12' - libstdcxx-ng: '>=12' - openssl: '>=3.3.1,<4.0a0' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda hash: md5: 3f43953b7d3fb3aaa1d0d0723d91e368 @@ -759,8 +288,8 @@ package: hash: md5: c94ab6ff54ba5172cf1c58267005670f sha256: 96b6900ca0489d9e5d0318a6b49f8eff43fd85fef6e07cb0c25344ee94cd7a3a - category: main - optional: false + category: dev + optional: true - name: libarchive version: 3.8.2 manager: conda @@ -802,42 +331,16 @@ package: sha256: f21af777602d17ced05f168898e759fb0bac5af09ba72c5ece245dd0f14e0fec category: dev optional: true -- name: libedit - version: 3.1.20250104 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=13' - ncurses: '>=6.5,<7.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda - hash: - md5: c277e0a4d549b03ac1e9d6cbbe3d017b - category: dev - optional: true -- name: libev - version: '4.33' - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda - hash: - md5: 172bf1cd1ff8629f2b1179945ed45055 - category: dev - optional: true - name: libexpat version: 2.7.1 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda hash: md5: 4211416ecba1866fab0c6470986c22d6 - category: main - optional: false + category: dev + optional: true - name: libffi version: 3.5.2 manager: conda @@ -849,66 +352,23 @@ package: hash: md5: 35f29eec58405aaf55e01cb470d8c26a sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 - category: main - optional: false -- name: libgcc - version: 15.2.0 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - _openmp_mutex: '>=4.5' - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda - hash: - md5: c0374badb3a5d4b1372db28d19462c53 - category: main - optional: false -- name: libgcc-ng - version: 15.2.0 - manager: conda - platform: linux-64 - dependencies: - libgcc: 15.2.0 - url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda - hash: - md5: 280ea6eee9e2ddefde25ff799c4f0363 - category: dev - optional: true -- name: libglib - version: 2.86.0 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libffi: '>=3.5.2,<3.6.0a0' - libgcc: '>=14' - libiconv: '>=1.18,<2.0a0' - libzlib: '>=1.3.1,<2.0a0' - pcre2: '>=10.46,<10.47.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.0-h32235b2_1.conda - hash: - md5: a400fd9bad095c7cdf74661552ef802f - sha256: 8f4ccf81ebde248f8a8070a987e2dc7caa02471ae3506667da8e02176a8e0060 category: dev optional: true -- name: libgomp +- name: libgcc version: 15.2.0 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda hash: - md5: f7b4d76975aac7e5d9e6ad13845f92fe - category: main - optional: false + md5: c0374badb3a5d4b1372db28d19462c53 + category: dev + optional: true - name: libiconv version: '1.18' manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda hash: md5: 915f5995e94f60e9a4826e0b0920ee88 @@ -918,14 +378,12 @@ package: version: 5.8.1 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=13' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda hash: md5: 1a580f7796c7bf6393fddb8bbbde58dc - category: main - optional: false + category: dev + optional: true - name: libmamba version: 2.3.3 manager: conda @@ -956,51 +414,27 @@ package: version: 4.0.0 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=13' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda hash: md5: c7e925f37e3b40d893459e625f6a53f1 - category: main - optional: false + category: dev + optional: true - name: libnghttp2 version: 1.67.0 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - c-ares: '>=1.34.5,<2.0a0' - libev: '>=4.33,<5.0a0' - libgcc: '>=14' - libstdcxx: '>=14' - libzlib: '>=1.3.1,<2.0a0' - openssl: '>=3.5.2,<4.0a0' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda hash: md5: b499ce4b026493a13774bcf0f4c33849 category: dev optional: true -- name: libsodium - version: 1.0.20 - manager: conda - platform: linux-64 - dependencies: - libgcc-ng: '>=12' - url: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda - hash: - md5: a587892d3c13b6621a6091be690dbca2 - category: dev - optional: true - name: libsolv version: 0.7.35 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - libstdcxx: '>=14' - libzlib: '>=1.3.1,<2.0a0' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.35-h9463b59_0.conda hash: md5: 21769ce326958ec230cdcbd0f2ad97eb @@ -1010,24 +444,17 @@ package: version: 3.50.4 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - libzlib: '>=1.3.1,<2.0a0' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda hash: md5: 0b367fad34931cb79e0d6b7e5c06bb1c - category: main - optional: false + category: dev + optional: true - name: libssh2 version: 1.11.1 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=13' - libzlib: '>=1.3.1,<2.0a0' - openssl: '>=3.5.0,<4.0a0' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda hash: md5: eecce068c7e4eddeb169591baac20ac4 @@ -1037,37 +464,22 @@ package: version: 15.2.0 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: 15.2.0 + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda hash: md5: 5b767048b1b3ee9a954b06f4084f93dc - category: main - optional: false -- name: libstdcxx-ng - version: 15.2.0 - manager: conda - platform: linux-64 - dependencies: - libstdcxx: 15.2.0 - url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda - hash: - md5: f627678cf829bd70bccf141a19c3ad3e category: dev optional: true - name: libuuid version: 2.41.2 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda hash: md5: 80c07c68d2f6870250959dcc95b209d1 - category: main - optional: false + category: dev + optional: true - name: libxml2 version: 2.15.1 manager: conda @@ -1105,22 +517,17 @@ package: version: 1.3.1 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=13' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda hash: md5: edb0dca6bc32e4f4789199455a1dbeb8 - category: main - optional: false + category: dev + optional: true - name: lz4-c version: 1.10.0 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=13' - libstdcxx: '>=13' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda hash: md5: 9de5350a85c4a20c685259b889aa6393 @@ -1130,9 +537,7 @@ package: version: '2.10' manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda hash: md5: 45161d96307e3a447cc3eb5896cf6f8c @@ -1158,9 +563,7 @@ package: version: '3.9' manager: conda platform: linux-64 - dependencies: - importlib-metadata: '>=4.4' - python: '>=3.10' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/markdown-3.9-pyhd8ed1ab_0.conda hash: md5: 17784de2c4da64a3595328b34982cdc5 @@ -1179,17 +582,6 @@ package: sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e category: dev optional: true -- name: markupsafe - version: 3.0.3 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda - hash: - md5: fab1be106a50e20f10fe5228fd1d1651 - category: dev - optional: true - name: mdurl version: 0.1.2 manager: conda @@ -1202,37 +594,11 @@ package: sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 category: dev optional: true -- name: mergedeep - version: 1.3.4 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda - hash: - md5: d9a8fc1f01deae61735c88ec242e855c - category: dev - optional: true - name: mkdocs version: 1.6.1 manager: conda platform: linux-64 - dependencies: - click: '>=7.0' - colorama: '>=0.4' - ghp-import: '>=1.0' - importlib-metadata: '>=4.4' - jinja2: '>=2.11.1' - markdown: '>=3.3.6' - markupsafe: '>=2.0.1' - mergedeep: '>=1.3.4' - mkdocs-get-deps: '>=0.2.0' - packaging: '>=20.5' - pathspec: '>=0.11.1' - python: '>=3.9' - pyyaml: '>=5.1' - pyyaml-env-tag: '>=0.1' - watchdog: '>=2.0' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda hash: md5: 14661160be39d78f2b210f2cc2766059 @@ -1242,30 +608,12 @@ package: version: 0.9.0 manager: conda platform: linux-64 - dependencies: - click: '>=8.1' - markdown: '>=3.3' - python: '' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-click-0.9.0-pyh29332c3_0.conda hash: md5: 5fe524d35646dadfdc024c510d29330a category: dev optional: true -- name: mkdocs-get-deps - version: 0.2.0 - manager: conda - platform: linux-64 - dependencies: - importlib-metadata: '>=4.3' - mergedeep: '>=1.3.4' - platformdirs: '>=2.2.0' - python: '>=3.9' - pyyaml: '>=5.1' - url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda - hash: - md5: 84382acddb26c27c70f2de8d4c830830 - category: dev - optional: true - name: mkdocs-include-markdown-plugin version: 7.2.0 manager: conda @@ -1307,65 +655,32 @@ package: version: 1.3.1 manager: conda platform: linux-64 - dependencies: - python: '>=3.9' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda hash: md5: de8af4000a4872e16fb784c649679c8e category: dev optional: true -- name: more-itertools - version: 10.8.0 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhd8ed1ab_0.conda - hash: - md5: d7620a15dc400b448e1c88a981b23ddd - category: dev - optional: true - name: mypy version: 1.18.2 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - mypy_extensions: '>=1.0.0' - pathspec: '>=0.9.0' - psutil: '>=4.0' - python: '>=3.14.0rc2,<3.15.0a0' - python_abi: 3.14.* - typing_extensions: '>=4.6.0' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.18.2-py314h5bd0f2a_0.conda hash: md5: 1e87cabfdfea01d30e2ce1dd6152846f category: dev optional: true -- name: mypy_extensions - version: 1.1.0 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda - hash: - md5: e9c622e0d00fa24a6292279af3ab6d06 - category: dev - optional: true - name: ncurses version: '6.5' manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=13' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda hash: md5: 47e340acb35de30501a76c7c799c41d7 - category: main - optional: false + category: dev + optional: true - name: nh3 version: 0.3.1 manager: conda @@ -1392,37 +707,21 @@ package: md5: 59659d0213082bc13be8500bab80c002 category: dev optional: true -- name: nodeenv - version: 1.9.1 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - setuptools: '' - url: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda - hash: - md5: 7ba3f09fceae6a120d664217e58fe686 - category: dev - optional: true - name: openssl version: 3.5.4 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - ca-certificates: '' - libgcc: '>=14' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda hash: md5: 14edad12b59ccbfa3910d42c72adc2a0 - category: main - optional: false + category: dev + optional: true - name: packaging version: '25.0' manager: conda platform: linux-64 - dependencies: - python: '' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda hash: md5: 58335b26c38bf4a20f399384c33cbcf9 @@ -1432,205 +731,67 @@ package: version: 0.5.7 manager: conda platform: linux-64 - dependencies: - python: '>=3.9' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda hash: md5: c3f35453097faf911fd3f6023fc2ab24 category: dev optional: true -- name: paramiko - version: 4.0.0 - manager: conda - platform: linux-64 - dependencies: - bcrypt: '>=3.2' - cryptography: '>=3.3' - invoke: '>=2.0' - pynacl: '>=1.5' - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda - hash: - md5: 1a884d2b1ea21abfb73911dcdb8342e4 - category: dev - optional: true -- name: pathspec - version: 0.12.1 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda - hash: - md5: 617f15191456cc6a13db418a275435e5 - category: dev - optional: true -- name: pcre2 - version: '10.46' - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - bzip2: '>=1.0.8,<2.0a0' - libgcc: '>=14' - libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda - hash: - md5: 7fa07cb0fb1b625a089ccc01218ee5b1 - category: dev - optional: true - name: pip version: '25.2' manager: conda platform: linux-64 - dependencies: - python: '>=3.13.0a0' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh145f28c_0.conda hash: md5: e7ab34d5a93e0819b62563c78635d937 category: main optional: false -- name: platformdirs - version: 4.5.0 - manager: conda - platform: linux-64 - dependencies: - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda - hash: - md5: 5c7a868f8241e64e1cf5fdf4962f23e2 - category: dev - optional: true -- name: pluggy - version: 1.6.0 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda - hash: - md5: 7da7ccd349dbf6487a7778579d2bb971 - category: dev - optional: true - name: pre-commit version: 4.3.0 manager: conda platform: linux-64 - dependencies: - cfgv: '>=2.0.0' - identify: '>=1.0.0' - nodeenv: '>=0.11.1' - python: '>=3.9' - pyyaml: '>=5.1' - virtualenv: '>=20.10.0' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda hash: - md5: bc6c44af2a9e6067dd7e949ef10cdfba - category: dev - optional: true -- name: psutil - version: 7.1.0 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - python: '>=3.14.0rc2,<3.15.0a0' - python_abi: 3.14.* - url: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.0-py314h5bd0f2a_0.conda - hash: - md5: 3bba9ff64ab2030c4c28c0d225864196 - category: dev - optional: true -- name: pycparser - version: '2.22' - manager: conda - platform: linux-64 - dependencies: - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda - hash: - md5: 12c566707c80111f9799308d9e265aef - category: dev - optional: true -- name: pygments - version: 2.19.2 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda - hash: - md5: 6b6ece66ebcae2d5f326c77ef2c5a066 - category: dev - optional: true -- name: pymdown-extensions - version: 10.16.1 - manager: conda - platform: linux-64 - dependencies: - markdown: '>=3.6' - python: '>=3.9' - pyyaml: '' - url: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda - hash: - md5: 26e013bc453e643991cfa9b76911fb79 + md5: bc6c44af2a9e6067dd7e949ef10cdfba category: dev optional: true -- name: pynacl - version: 1.6.0 +- name: pycparser + version: '2.22' manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - cffi: '>=1.4.1' - libgcc: '>=14' - libsodium: '>=1.0.20,<1.0.21.0a0' - python: '>=3.14.0rc2,<3.15.0a0' - python_abi: 3.14.* - six: '' - url: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.0-py314h5bd0f2a_0.conda + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda hash: - md5: 287eabdd0b0a176376968b84c2707bd8 + md5: 12c566707c80111f9799308d9e265aef category: dev optional: true -- name: pyproject_hooks - version: 1.2.0 +- name: pygments + version: 2.19.2 manager: conda platform: linux-64 - dependencies: - python: '>=3.9' - tomli: '>=1.1.0' - url: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda hash: - md5: d4582021af437c931d7d77ec39007845 + md5: 6b6ece66ebcae2d5f326c77ef2c5a066 category: dev optional: true -- name: pysocks - version: 1.7.1 +- name: pymdown-extensions + version: 10.16.1 manager: conda platform: linux-64 - dependencies: - __unix: '' - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda hash: - md5: 461219d1a5bd61342293efa2c0c90eac + md5: 26e013bc453e643991cfa9b76911fb79 category: dev optional: true - name: pytest version: 8.4.2 manager: conda platform: linux-64 - dependencies: - colorama: '>=0.4' - exceptiongroup: '>=1' - iniconfig: '>=1' - packaging: '>=20' - pluggy: '>=1.5,<2' - pygments: '>=2.7.2' - python: '>=3.10' - tomli: '>=1' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda hash: md5: 1f987505580cb972cf28dc5f74a0f81b @@ -1640,11 +801,7 @@ package: version: 7.0.0 manager: conda platform: linux-64 - dependencies: - coverage: '>=7.10.6' - pluggy: '>=1.2' - pytest: '>=7' - python: '' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda hash: md5: 6891acad5e136cb62a8c2ed2679d6528 @@ -1654,9 +811,7 @@ package: version: 0.10.0 manager: conda platform: linux-64 - dependencies: - pytest: '>=5.0.0,<9.0.0' - python: '>=3.9' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/pytest-split-0.10.0-pyhff2d567_0.conda hash: md5: 3bd32c44526b455aa146d8fdb27a65b3 @@ -1666,9 +821,7 @@ package: version: 2.4.0 manager: conda platform: linux-64 - dependencies: - pytest: '>=7.0.0' - python: '>=3.9' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda hash: md5: 52a50ca8ea1b3496fbd3261bea8c5722 @@ -1678,10 +831,7 @@ package: version: 3.8.0 manager: conda platform: linux-64 - dependencies: - execnet: '>=2.1' - pytest: '>=7.0.0' - python: '>=3.9' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda hash: md5: 8375cfbda7c57fbceeda18229be10417 @@ -1715,36 +865,18 @@ package: hash: md5: 0a19d2cc6eb15881889b0c6fa7d6a78d sha256: 76d750045b94fded676323bfd01975a26a474023635735773d0e4d80aaa72518 - category: main - optional: false + category: dev + optional: true - name: python-build version: 1.3.0 manager: conda platform: linux-64 - dependencies: - colorama: '' - importlib-metadata: '>=4.6' - packaging: '>=19.0' - pyproject_hooks: '' - python: '>=3.9' - tomli: '>=1.1.0' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda hash: md5: ed5d43e9ef92cc2a9872f9bdfe94b984 category: dev optional: true -- name: python-dateutil - version: 2.9.0.post0 - manager: conda - platform: linux-64 - dependencies: - python: '' - six: '>=1.5' - url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda - hash: - md5: 5b8d21249ff20967101ffa321cab24e8 - category: dev - optional: true - name: python-gil version: 3.14.0 manager: conda @@ -1766,67 +898,18 @@ package: url: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda hash: md5: 0539938c55b6b1a59b560e843ad864a4 - category: main - optional: false -- name: pytz - version: '2025.2' - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda - hash: - md5: bc8e3267d44011051f2eb14d22fb0960 - category: dev - optional: true -- name: pywin32-on-windows - version: 0.1.0 - manager: conda - platform: linux-64 - dependencies: - __unix: '' - python: '>=2.7' - url: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 - hash: - md5: 2807a0becd1d986fe1ef9b7f8135f215 - category: dev - optional: true -- name: pyyaml - version: 6.0.3 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.10.*' - yaml: '' - url: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda - hash: - md5: b12f41c0d7fb5ab81709fcc86579688f - category: dev - optional: true -- name: pyyaml-env-tag - version: '1.1' - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - pyyaml: '' - url: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda - hash: - md5: e8e53c4150a1bba3b160eacf9d53a51b category: dev optional: true - name: readline version: '8.2' manager: conda platform: linux-64 - dependencies: - libgcc: '>=13' - ncurses: '>=6.5,<7.0a0' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda hash: md5: 283b96675859b20a825f8fa30f311446 - category: main - optional: false + category: dev + optional: true - name: readme_renderer version: '44.0' manager: conda @@ -1847,9 +930,7 @@ package: version: 14.2.5.post0 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=13' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda hash: md5: 69fbc0a9e42eb5fe6733d2d60d818822 @@ -1859,11 +940,7 @@ package: version: 14.2.5.post0 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=13' - libstdcxx: '>=13' - reproc: 14.2.5.post0 + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda hash: md5: 828302fca535f9cfeb598d5f7c204323 @@ -1873,12 +950,7 @@ package: version: 2.32.5 manager: conda platform: linux-64 - dependencies: - certifi: '>=2017.4.17' - charset-normalizer: '>=2,<4' - idna: '>=2.5,<4' - python: '>=3.9' - urllib3: '>=1.21.1,<3' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda hash: md5: db0c6b99149880c8ba515cf4abe93ee4 @@ -1888,9 +960,7 @@ package: version: 1.12.1 manager: conda platform: linux-64 - dependencies: - python: '>=3.9' - requests: '>=2.22,<3' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/requests-mock-1.12.1-pyhd8ed1ab_1.conda hash: md5: 8212b70c509aaa0fa6c8fa974f784b2e @@ -1900,9 +970,7 @@ package: version: 1.0.0 manager: conda platform: linux-64 - dependencies: - python: '>=3.9' - requests: '>=2.0.1,<3.0.0' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda hash: md5: 66de8645e324fda0ea6ef28c2f99a2ab @@ -1949,27 +1017,11 @@ package: sha256: d6c3ee6381ce275107a3fb3cfe82499f3cb74da1d95e134a93ed5e4851b4ec01 category: dev optional: true -- name: secretstorage - version: 3.4.0 - manager: conda - platform: linux-64 - dependencies: - cryptography: '>=2.0' - dbus: '' - jeepney: '>=0.6' - python: '>=3.14.0rc2,<3.15.0a0' - python_abi: 3.14.* - url: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.0-py314hdafbbf9_0.conda - hash: - md5: a804c54ce3a1aed268b13657b79825b8 - category: dev - optional: true - name: setuptools version: 80.9.0 manager: conda platform: linux-64 - dependencies: - python: '>=3.9' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda hash: md5: 4de79c071274a53dcaf2a8c749d1499e @@ -1979,56 +1031,27 @@ package: version: 4.0.7 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - libstdcxx: '>=14' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/simdjson-4.0.7-hb700be7_0.conda hash: md5: cc9c262a71dd584aa5a3a22fc963255c category: dev optional: true -- name: six - version: 1.17.0 - manager: conda - platform: linux-64 - dependencies: - python: '' - url: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda - hash: - md5: 3339e3b65d58accf4ca4fb8748ab16b3 - category: dev - optional: true -- name: smmap - version: 5.0.2 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda - hash: - md5: 87f47a78808baf2fa1ea9c315a1e48f1 - category: dev - optional: true - name: tk version: 8.6.13 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=13' - libzlib: '>=1.3.1,<2.0a0' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda hash: md5: a0116df4f4ed05c303811a837d5b39d8 - category: main - optional: false + category: dev + optional: true - name: toml version: 0.10.2 manager: conda platform: linux-64 - dependencies: - python: '>=3.9' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda hash: md5: b0dd904de08b7db706167240bf37b164 @@ -2038,8 +1061,7 @@ package: version: 2.3.0 manager: conda platform: linux-64 - dependencies: - python: '' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda hash: md5: d2732eb636c264dc9aa4cbee404b1a53 @@ -2071,8 +1093,7 @@ package: version: 7.1.8 manager: conda platform: linux-64 - dependencies: - python: '>=3.9' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/types-click-7.1.8-pyhd8ed1ab_1.conda hash: md5: 08ed65e279de69322843b075679567ea @@ -2082,9 +1103,7 @@ package: version: 1.2.0.20250513 manager: conda platform: linux-64 - dependencies: - click: '>=8.0.0' - python: '' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/types-click-default-group-1.2.0.20250513-pyhe01879c_0.conda hash: md5: 335926a07f57d325d0d6966bf36eee0b @@ -2094,8 +1113,7 @@ package: version: 3.2.7 manager: conda platform: linux-64 - dependencies: - python: '>=3.9' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/types-filelock-3.2.7-pyhd8ed1ab_1.conda hash: md5: 3f1356104d409d6deba0c689f3b2c602 @@ -2105,8 +1123,7 @@ package: version: 1.1.10 manager: conda platform: linux-64 - dependencies: - python: '>=3.9' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/types-freezegun-1.1.10-pyhd8ed1ab_1.conda hash: md5: 0b609b66e56bbe70d97cd52ad24058fb @@ -2116,8 +1133,7 @@ package: version: 6.0.12.20250915 manager: conda platform: linux-64 - dependencies: - python: '>=3.10' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_0.conda hash: md5: 3c9919ecee97547fa14fea57e2a9bb54 @@ -2127,9 +1143,7 @@ package: version: 2.32.4.20250913 manager: conda platform: linux-64 - dependencies: - python: '>=3.10' - urllib3: '>=2' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/types-requests-2.32.4.20250913-pyhd8ed1ab_0.conda hash: md5: 829c891bfd4147c25b030455d3a57a3a @@ -2139,8 +1153,7 @@ package: version: 80.9.0.20250822 manager: conda platform: linux-64 - dependencies: - python: '' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/types-setuptools-80.9.0.20250822-pyhcf101f3_0.conda hash: md5: 6404dcec3d8f8b8fe540516837aa08ec @@ -2150,8 +1163,7 @@ package: version: 0.10.8.20240310 manager: conda platform: linux-64 - dependencies: - python: '>=3.9' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda hash: md5: 353b9704e4851a6f210e641d3595755f @@ -2161,8 +1173,7 @@ package: version: 4.15.0 manager: conda platform: linux-64 - dependencies: - python: '' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda hash: md5: 0caa1af407ecff61170c9437a808404d @@ -2176,182 +1187,68 @@ package: url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda hash: md5: 4222072737ccff51314b5ece9c7d6f5a - category: main - optional: false -- name: ukkonen - version: 1.0.1 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - cffi: '' - libgcc: '>=14' - libstdcxx: '>=14' - python: '>=3.14,<3.15.0a0' - python_abi: 3.14.* - url: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py314h9891dd4_6.conda - hash: - md5: 28303a78c48916ab07b95ffdbffdfd6c - sha256: ef6753f6febaa74d35253e4e0dd09dc9497af8e370893bd97c479f59346daa57 category: dev optional: true - name: urllib3 version: 2.5.0 manager: conda platform: linux-64 - dependencies: - brotli-python: '>=1.0.9' - h2: '>=4,<5' - pysocks: '>=1.5.6,<2.0,!=1.5.7' - python: '>=3.9' - zstandard: '>=0.18.0' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda hash: md5: 436c165519e140cb08d246a4472a9d6a category: dev optional: true -- name: virtualenv - version: 20.35.3 - manager: conda - platform: linux-64 - dependencies: - distlib: '>=0.3.7,<1' - filelock: '>=3.12.2,<4' - platformdirs: '>=3.9.1,<5' - python: '>=3.10' - typing_extensions: '>=4.13.2' - url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.3-pyhd8ed1ab_0.conda - hash: - md5: bf0dc4c8a32e91290e3fae5403798c63 - category: dev - optional: true -- name: watchdog - version: 6.0.0 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.14.0rc2,<3.15.0a0' - python_abi: 3.14.* - pyyaml: '>=3.10' - url: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py314hdafbbf9_1.conda - hash: - md5: 099125fcb130e9fe134c6b610f33b0e1 - category: dev - optional: true - name: wcmatch version: '10.1' manager: conda platform: linux-64 - dependencies: - bracex: '>=2.1.1' - python: '>=3.9' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/wcmatch-10.1-pyhd8ed1ab_0.conda hash: md5: b045a877087e3bbdd36fe460e7f5cc55 category: dev optional: true -- name: websocket-client - version: 1.9.0 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda - hash: - md5: 2f1ed718fcd829c184a6d4f0f2e07409 - category: dev - optional: true - name: wheel version: 0.45.1 manager: conda platform: linux-64 - dependencies: - python: '>=3.9' + dependencies: {} url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda hash: md5: 75cb7132eb58d97896e173ef12ac9986 category: dev optional: true -- name: yaml - version: 0.2.5 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - url: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda - hash: - md5: a77f85f77be52ff59391544bfe73390a - category: dev - optional: true - name: yaml-cpp version: 0.8.0 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=13' - libstdcxx: '>=13' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda hash: md5: 92b90f5f7a322e74468bb4909c7354b5 category: dev optional: true -- name: zipp - version: 3.23.0 - manager: conda - platform: linux-64 - dependencies: - python: '>=3.9' - url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda - hash: - md5: df5e78d904988eb55042c0c97446079f - category: dev - optional: true - name: zizmor version: 1.14.1 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=14' - python: '>=3.14.0rc3,<3.15.0a0' - python_abi: 3.14.* + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/zizmor-1.14.1-py314ha5689aa_0.conda hash: md5: 1f0180642729883f29c47e11d857e786 category: dev optional: true -- name: zstandard - version: 0.25.0 - manager: conda - platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - cffi: '>=1.11' - libgcc: '>=14' - python: '' - python_abi: 3.14.* - zstd: '>=1.5.7,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h31f8a6b_0.conda - hash: - md5: 68bd13651618354987763f746ee1fadc - category: dev - optional: true - name: zstd version: 1.5.7 manager: conda platform: linux-64 - dependencies: - __glibc: '>=2.17,<3.0.a0' - libgcc: '>=13' - libstdcxx: '>=13' - libzlib: '>=1.3.1,<2.0a0' + dependencies: {} url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda hash: md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 - category: main - optional: false + category: dev + optional: true - name: ty version: 0.0.1a24 manager: pip diff --git a/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs.yml b/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs.yml new file mode 100644 index 000000000..873a16e49 --- /dev/null +++ b/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs.yml @@ -0,0 +1,2365 @@ +# This lock file was generated by conda-lock (https://github.com/conda/conda-lock). DO NOT EDIT! +# +# A "lock file" contains a concrete list of package versions (with checksums) to be installed. Unlike +# e.g. `conda env create`, the resulting environment will not change as new package versions become +# available, unless you explicitly update the lock file. +# +# Install this environment as "YOURENV" with: +# conda-lock install -n YOURENV lockfile.yml +# This lock contains optional development dependencies. Include them in the installed environment with: +# conda-lock install --dev-dependencies -n YOURENV lockfile.yml +# To update a single package to the latest version compatible with the version constraints in the source: +# conda-lock lock --lockfile lockfile.yml --update PACKAGE +# To re-solve the entire environment, e.g. after changing a version constraint in the source file: +# conda-lock -f ../workspace/dev-environment.yaml --lockfile lockfile.yml +version: 1 +metadata: + content_hash: + linux-64: 478bc8b4c815f08c094483870ca25bcd5452f8f76ab8d993b0d8a1b82429c488 + channels: + - url: conda-forge + used_env_vars: [] + platforms: + - linux-64 + sources: + - ../workspace/dev-environment.yaml +package: +- name: _libgcc_mutex + version: '0.1' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + hash: + md5: d7c89558ba9fa0495403155b64376d81 + category: main + optional: false +- name: _openmp_mutex + version: '4.5' + manager: conda + platform: linux-64 + dependencies: + _libgcc_mutex: '0.1' + libgomp: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + hash: + md5: 73aaf86a425cc6e73fcf236a5a46396d + category: main + optional: false +- name: _python_abi3_support + version: '1.0' + manager: conda + platform: linux-64 + dependencies: + cpython: '' + python-gil: '' + url: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + hash: + md5: aaa2a381ccc56eac91d63b6c1240312f + sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 + category: dev + optional: true +- name: babel + version: 2.17.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + pytz: '>=2015.7' + url: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + hash: + md5: 0a01c169f0ab0f91b26e77a3301fbfe4 + category: dev + optional: true +- name: backports + version: '1.0' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda + hash: + md5: 767d508c1a67e02ae8f50e44cacfadb2 + category: dev + optional: true +- name: backports.tarfile + version: 1.2.0 + manager: conda + platform: linux-64 + dependencies: + backports: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhd8ed1ab_1.conda + hash: + md5: df837d654933488220b454c6a3b0fad6 + category: dev + optional: true +- name: backrefs + version: '5.8' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda + hash: + md5: b16e2595d3a9042aa9d570375978835f + category: dev + optional: true +- name: bcrypt + version: 5.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py314h68536ef_0.conda + hash: + md5: 71d9c4f6a05a4b9da1b03b973e078db0 + category: dev + optional: true +- name: bracex + version: 2.2.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/bracex-2.2.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 586272349d7bef5b1ef527b56dca73cb + category: dev + optional: true +- name: brotli-python + version: 1.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314hdfeb8a1_0.conda + hash: + md5: 3ef9d2a701760467b9db2338b6cd926f + sha256: 9f6d339fb78b647be35e3564dac453d8d2f1b865ba72fb961eaac41061368699 + category: dev + optional: true +- name: bzip2 + version: 1.0.8 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + hash: + md5: 51a19bba1b8ebfb60df25cde030b7ebc + category: main + optional: false +- name: c-ares + version: 1.34.5 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + hash: + md5: f7f0d6cc2dc986d42ac2689ec88192be + category: dev + optional: true +- name: ca-certificates + version: 2025.10.5 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + url: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda + hash: + md5: f9e5fbc24009179e8b0409624691758a + category: main + optional: false +- name: certifi + version: 2025.10.5 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda + hash: + md5: 257ae203f1d204107ba389607d375ded + category: dev + optional: true +- name: cffi + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libffi: '>=3.5.2,<3.6.0a0' + libgcc: '>=14' + pycparser: '' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda + hash: + md5: cf45f4278afd6f4e6d03eda0f435d527 + sha256: c6339858a0aaf5d939e00d345c98b99e4558f285942b27232ac098ad17ac7f8e + category: dev + optional: true +- name: cfgv + version: 3.3.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + hash: + md5: 57df494053e17dce2ac3a0b33e1b2a2e + category: dev + optional: true +- name: charset-normalizer + version: 3.4.4 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + hash: + md5: a22d1fd9bf98827e280a02875d9a007a + sha256: b32f8362e885f1b8417bac2b3da4db7323faa12d5db62b7fd6691c02d60d6f59 + category: dev + optional: true +- name: check-manifest + version: '0.51' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + python-build: '>=0.1' + setuptools: '' + toml: '' + url: https://conda.anaconda.org/conda-forge/noarch/check-manifest-0.51-pyhd8ed1ab_0.conda + hash: + md5: 7f4022a44e9fce926fc9eb0da40bcda2 + sha256: 18637560b1725c32680560566db00d3c16687a3b1adb8f628cbb251a19d9963d + category: dev + optional: true +- name: click + version: 8.3.0 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda + hash: + md5: e76c4ba9e1837847679421b8d549b784 + category: dev + optional: true +- name: cmarkgfm + version: 2024.11.20 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.0.0' + libgcc: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py314h5bd0f2a_1.conda + hash: + md5: 23985f6de5f68e3465807e1fbbc98f30 + sha256: c2420839a943580dece9c5857492d69732df2af6dac6cb8fd8dd92c20060beae + category: dev + optional: true +- name: colorama + version: 0.4.6 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + hash: + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + category: dev + optional: true +- name: coverage + version: 7.11.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + tomli: '' + url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.11.0-py314h67df5f8_0.conda + hash: + md5: 6ff84b39468623308dee97e5dfbafca0 + sha256: d928f6d0567807c8a09786e18966445b011ec2eb85c7e18382c0b4870cf12f17 + category: dev + optional: true +- name: cpp-expected + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/cpp-expected-1.3.1-h171cf75_0.conda + hash: + md5: d17488e343e4c5c0bd0db18b3934d517 + category: dev + optional: true +- name: cpython + version: 3.14.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.14,<3.15.0a0' + python_abi: '*' + url: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.conda + hash: + md5: ff3061d315c4a988fa1c29c543800780 + sha256: 8e2a33b36d36820698840bf0c1ed50e5dd4bdeaa434c7b4f5e13d421225b0414 + category: dev + optional: true +- name: cryptography + version: 46.0.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.14' + libgcc: '>=14' + openssl: '>=3.5.4,<4.0a0' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.3-py314hb613cbf_0.conda + hash: + md5: f291630db5dc438b6ce37c2bb1a96516 + sha256: 4bf88483f944b5624269c926369002d58951627a369aeac1e2cd64a6aa00eb05 + category: dev + optional: true +- name: dbus + version: 1.16.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libexpat: '>=2.7.0,<3.0a0' + libgcc: '>=13' + libglib: '>=2.84.2,<3.0a0' + libstdcxx: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + hash: + md5: 679616eb5ad4e521c83da4650860aba7 + category: dev + optional: true +- name: distlib + version: 0.4.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + hash: + md5: 003b8ba0a94e2f1e117d0bd46aebc901 + category: dev + optional: true +- name: docker-py + version: 7.1.0 + manager: conda + platform: linux-64 + dependencies: + paramiko: '>=2.4.3' + python: '>=3.9' + pywin32-on-windows: '' + requests: '>=2.26.0' + urllib3: '>=1.26.0' + websocket-client: '>=0.32.0' + url: https://conda.anaconda.org/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda + hash: + md5: 07ce73ca6f6c1a1df5d498679fc52d9e + category: dev + optional: true +- name: doctr + version: 1.9.0 + manager: conda + platform: linux-64 + dependencies: + cryptography: '' + python: '>=3.5' + pyyaml: '' + requests: '' + url: https://conda.anaconda.org/conda-forge/noarch/doctr-1.9.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: f57b656502db0e45cc996ddbef2a9d25 + category: dev + optional: true +- name: docutils + version: 0.22.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.2-pyhd8ed1ab_0.conda + hash: + md5: ba6a7a1c262587d333761b0cda2bbd28 + sha256: dd02330f2ecca4a489a001e5ec66ee8aa50773dc2c621c8fc7053b454d9a27b2 + category: dev + optional: true +- name: exceptiongroup + version: 1.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + typing_extensions: '>=4.6.0' + url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + hash: + md5: 72e42d28960d875c7654614f8b50939a + category: dev + optional: true +- name: execnet + version: 2.1.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + hash: + md5: a71efeae2c160f6789900ba2631a2c90 + category: dev + optional: true +- name: filelock + version: 3.20.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda + hash: + md5: 66b8b26023b8efdf8fcb23bac4b6325d + category: dev + optional: true +- name: flaky + version: 3.8.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_1.conda + hash: + md5: 7e081d00fdcba21b76658c1649691836 + category: dev + optional: true +- name: fmt + version: 12.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.0.0-h2b0788b_0.conda + hash: + md5: d90bf58b03d9a958cb4f9d3de539af17 + sha256: b546c4eb5e11c2d8eab0685593e078fd0cd483e467d5d6e307d60d887488230f + category: dev + optional: true +- name: freezegun + version: 1.5.5 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + python-dateutil: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/freezegun-1.5.5-pyhd8ed1ab_0.conda + hash: + md5: 0fdb8ebc8dbdb62530ff73181ae63554 + category: dev + optional: true +- name: ghp-import + version: 2.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + python-dateutil: '>=2.8.1' + url: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + hash: + md5: 93f742fe078a7b34c29a182958d4d765 + category: dev + optional: true +- name: gitdb + version: 4.0.12 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + smmap: '>=3.0.1,<6' + url: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda + hash: + md5: 7c14f3706e099f8fcd47af2d494616cc + category: dev + optional: true +- name: gitpython + version: 3.1.45 + manager: conda + platform: linux-64 + dependencies: + gitdb: '>=4.0.1,<5' + python: '>=3.9' + typing_extensions: '>=3.10.0.2' + url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda + hash: + md5: b91d463ea8be13bcbe644ae8bc99c39f + category: dev + optional: true +- name: h2 + version: 4.3.0 + manager: conda + platform: linux-64 + dependencies: + hpack: '>=4.1,<5' + hyperframe: '>=6.1,<7' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + hash: + md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 + category: dev + optional: true +- name: hpack + version: 4.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + hash: + md5: 0a802cb9888dd14eeefc611f05c40b6e + category: dev + optional: true +- name: hyperframe + version: 6.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + hash: + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + category: dev + optional: true +- name: id + version: 1.5.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + requests: '' + url: https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda + hash: + md5: d37314c8f553e3b4b44d113a0ee10196 + sha256: 161e3eb5aba887d0329bb4099f72cb92eed9072cf63f551d08540480116e69a2 + category: dev + optional: true +- name: identify + version: 2.6.15 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + ukkonen: '' + url: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda + hash: + md5: 25f954b7dae6dd7b0dc004dab74f1ce9 + sha256: 32d5007d12e5731867908cbf5345f5cd44a6c8755a2e8e63e15a184826a51f82 + category: dev + optional: true +- name: idna + version: '3.11' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + hash: + md5: 53abe63df7e10a6ba605dc5f9f961d36 + sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 + category: dev + optional: true +- name: importlib-metadata + version: 8.7.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + zipp: '>=3.20' + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + hash: + md5: 63ccfdc3a3ce25b027b8767eb722fca8 + category: dev + optional: true +- name: importlib_resources + version: 6.5.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + zipp: '>=3.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + hash: + md5: c85c76dc67d75619a92f51dfbce06992 + category: dev + optional: true +- name: iniconfig + version: 2.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + hash: + md5: 9614359868482abba1bd15ce465e3c42 + sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 + category: dev + optional: true +- name: invoke + version: 2.2.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + hash: + md5: 3a804714ed59be1969ffca10f703ec2a + sha256: 5a4e3a01f626c8de15ddada622d364e94ff28e8d6bdedf1665442ef03a4e0140 + category: dev + optional: true +- name: jaraco.classes + version: 3.4.0 + manager: conda + platform: linux-64 + dependencies: + more-itertools: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_2.conda + hash: + md5: ade6b25a6136661dadd1a43e4350b10b + category: dev + optional: true +- name: jaraco.context + version: 6.0.1 + manager: conda + platform: linux-64 + dependencies: + backports.tarfile: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.0.1-pyhd8ed1ab_0.conda + hash: + md5: bcc023a32ea1c44a790bbf1eae473486 + category: dev + optional: true +- name: jaraco.functools + version: 4.3.0 + manager: conda + platform: linux-64 + dependencies: + more-itertools: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.3.0-pyhd8ed1ab_0.conda + hash: + md5: b86839fa387a5b904846e77c84167e57 + category: dev + optional: true +- name: jeepney + version: 0.9.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda + hash: + md5: b4b91eb14fbe2f850dd2c5fc20676c0d + category: dev + optional: true +- name: jinja2 + version: 3.1.6 + manager: conda + platform: linux-64 + dependencies: + markupsafe: '>=2.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + hash: + md5: 446bd6c8cb26050d528881df495ce646 + category: dev + optional: true +- name: keyring + version: 25.6.0 + manager: conda + platform: linux-64 + dependencies: + __linux: '' + importlib-metadata: '>=4.11.4' + importlib_resources: '' + jaraco.classes: '' + jaraco.context: '' + jaraco.functools: '' + jeepney: '>=0.4.2' + python: '>=3.9' + secretstorage: '>=3.2' + url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyha804496_0.conda + hash: + md5: cdd58ab99c214b55d56099108a914282 + category: dev + optional: true +- name: keyutils + version: 1.6.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + hash: + md5: b38117a3c920364aff79f870c984b4a3 + category: dev + optional: true +- name: krb5 + version: 1.21.3 + manager: conda + platform: linux-64 + dependencies: + keyutils: '>=1.6.1,<2.0a0' + libedit: '>=3.1.20191231,<4.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + hash: + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + category: dev + optional: true +- name: ld_impl_linux-64 + version: '2.44' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_4.conda + hash: + md5: c94ab6ff54ba5172cf1c58267005670f + sha256: 96b6900ca0489d9e5d0318a6b49f8eff43fd85fef6e07cb0c25344ee94cd7a3a + category: main + optional: false +- name: libarchive + version: 3.8.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + libgcc: '>=14' + liblzma: '>=5.8.1,<6.0a0' + libxml2: '' + libxml2-16: '>=2.14.6' + libzlib: '>=1.3.1,<2.0a0' + lz4-c: '>=1.10.0,<1.11.0a0' + lzo: '>=2.10,<3.0a0' + openssl: '>=3.5.4,<4.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.2-gpl_h7be2006_100.conda + hash: + md5: 9d0eaa26e3c5d7af747b3ddee928327b + sha256: 3fb3baf9f6ac39a4720f91dbb6fdace0208fd76500d362e8d6ae985a8bd42451 + category: dev + optional: true +- name: libcurl + version: 8.16.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + krb5: '>=1.21.3,<1.22.0a0' + libgcc: '>=14' + libnghttp2: '>=1.67.0,<2.0a0' + libssh2: '>=1.11.1,<2.0a0' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.5.4,<4.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.16.0-h4e3cde8_0.conda + hash: + md5: a401aa9329350320c7d3809a7a5a1640 + sha256: f21af777602d17ced05f168898e759fb0bac5af09ba72c5ece245dd0f14e0fec + category: dev + optional: true +- name: libedit + version: 3.1.20250104 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + ncurses: '>=6.5,<7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + hash: + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + category: dev + optional: true +- name: libev + version: '4.33' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + hash: + md5: 172bf1cd1ff8629f2b1179945ed45055 + category: dev + optional: true +- name: libexpat + version: 2.7.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + hash: + md5: 4211416ecba1866fab0c6470986c22d6 + category: main + optional: false +- name: libffi + version: 3.5.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + hash: + md5: 35f29eec58405aaf55e01cb470d8c26a + sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 + category: main + optional: false +- name: libgcc + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + _openmp_mutex: '>=4.5' + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda + hash: + md5: c0374badb3a5d4b1372db28d19462c53 + category: main + optional: false +- name: libgcc-ng + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + libgcc: 15.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda + hash: + md5: 280ea6eee9e2ddefde25ff799c4f0363 + category: dev + optional: true +- name: libglib + version: 2.86.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libffi: '>=3.5.2,<3.6.0a0' + libgcc: '>=14' + libiconv: '>=1.18,<2.0a0' + libzlib: '>=1.3.1,<2.0a0' + pcre2: '>=10.46,<10.47.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.0-h32235b2_1.conda + hash: + md5: a400fd9bad095c7cdf74661552ef802f + sha256: 8f4ccf81ebde248f8a8070a987e2dc7caa02471ae3506667da8e02176a8e0060 + category: dev + optional: true +- name: libgomp + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + hash: + md5: f7b4d76975aac7e5d9e6ad13845f92fe + category: main + optional: false +- name: libiconv + version: '1.18' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + hash: + md5: 915f5995e94f60e9a4826e0b0920ee88 + category: dev + optional: true +- name: liblzma + version: 5.8.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + hash: + md5: 1a580f7796c7bf6393fddb8bbbde58dc + category: main + optional: false +- name: libmamba + version: 2.3.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cpp-expected: '>=1.3.1,<1.3.2.0a0' + fmt: '>=12.0.0,<12.1.0a0' + libarchive: '>=3.8.2,<3.9.0a0' + libcurl: '>=8.14.1,<9.0a0' + libgcc: '>=14' + libsolv: '>=0.7.35,<0.8.0a0' + libstdcxx: '>=14' + nlohmann_json-abi: 3.12.0 + openssl: '>=3.5.4,<4.0a0' + reproc: '>=14.2,<15.0a0' + reproc-cpp: '>=14.2,<15.0a0' + simdjson: '>=4.0.7,<4.1.0a0' + yaml-cpp: '>=0.8.0,<0.9.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libmamba-2.3.3-h09abcb8_2.conda + hash: + md5: afca7d1181d858718852e4d8402c05ac + sha256: fb32dac071b66a23afe866acf2174bf3fa911cb45a714027328232e86592368c + category: dev + optional: true +- name: libmpdec + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + hash: + md5: c7e925f37e3b40d893459e625f6a53f1 + category: main + optional: false +- name: libnghttp2 + version: 1.67.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + c-ares: '>=1.34.5,<2.0a0' + libev: '>=4.33,<5.0a0' + libgcc: '>=14' + libstdcxx: '>=14' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.5.2,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + hash: + md5: b499ce4b026493a13774bcf0f4c33849 + category: dev + optional: true +- name: libsodium + version: 1.0.20 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + hash: + md5: a587892d3c13b6621a6091be690dbca2 + category: dev + optional: true +- name: libsolv + version: 0.7.35 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.35-h9463b59_0.conda + hash: + md5: 21769ce326958ec230cdcbd0f2ad97eb + category: dev + optional: true +- name: libsqlite + version: 3.50.4 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + hash: + md5: 0b367fad34931cb79e0d6b7e5c06bb1c + category: main + optional: false +- name: libssh2 + version: 1.11.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.5.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + hash: + md5: eecce068c7e4eddeb169591baac20ac4 + category: dev + optional: true +- name: libstdcxx + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: 15.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda + hash: + md5: 5b767048b1b3ee9a954b06f4084f93dc + category: main + optional: false +- name: libstdcxx-ng + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + libstdcxx: 15.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + hash: + md5: f627678cf829bd70bccf141a19c3ad3e + category: dev + optional: true +- name: libuuid + version: 2.41.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + hash: + md5: 80c07c68d2f6870250959dcc95b209d1 + category: main + optional: false +- name: libxml2 + version: 2.15.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libiconv: '>=1.18,<2.0a0' + liblzma: '>=5.8.1,<6.0a0' + libxml2-16: 2.15.1 + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h031cc0b_0.conda + hash: + md5: a67cd8f7b0369bbf2c40411f05a62f3b + sha256: ee64e507b37b073e0bdad739e35330933dd5be7c639600a096551a6968f1035d + category: dev + optional: true +- name: libxml2-16 + version: 2.15.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libiconv: '>=1.18,<2.0a0' + liblzma: '>=5.8.1,<6.0a0' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hf2a90c1_0.conda + hash: + md5: 23720d17346b21efb08d68c2255c8431 + sha256: f5220ff49efc31431279859049199b9250e79f98c1dee1da12feb74bda2d9cf1 + category: dev + optional: true +- name: libzlib + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + hash: + md5: edb0dca6bc32e4f4789199455a1dbeb8 + category: main + optional: false +- name: lz4-c + version: 1.10.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + hash: + md5: 9de5350a85c4a20c685259b889aa6393 + category: dev + optional: true +- name: lzo + version: '2.10' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda + hash: + md5: 45161d96307e3a447cc3eb5896cf6f8c + category: dev + optional: true +- name: mamba + version: 2.3.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libmamba: '>=2.3.3,<2.4.0a0' + reproc: '>=14.2,<15.0a0' + reproc-cpp: '>=14.2,<15.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/mamba-2.3.3-h4396525_2.conda + hash: + md5: 7eb628c8e865dd6e33a46ade708de780 + sha256: 5b07dcfcaf67e2d843756cf79e7139ecdf13ee1f8c3734002aee729afb439393 + category: dev + optional: true +- name: markdown + version: '3.9' + manager: conda + platform: linux-64 + dependencies: + importlib-metadata: '>=4.4' + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/markdown-3.9-pyhd8ed1ab_0.conda + hash: + md5: 17784de2c4da64a3595328b34982cdc5 + category: dev + optional: true +- name: markdown-it-py + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + mdurl: '>=0.1,<1' + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + hash: + md5: 5b5203189eb668f042ac2b0826244964 + sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e + category: dev + optional: true +- name: markupsafe + version: 3.0.3 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda + hash: + md5: fab1be106a50e20f10fe5228fd1d1651 + category: dev + optional: true +- name: mdurl + version: 0.1.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + hash: + md5: 592132998493b3ff25fd7479396e8351 + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + category: dev + optional: true +- name: mergedeep + version: 1.3.4 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + hash: + md5: d9a8fc1f01deae61735c88ec242e855c + category: dev + optional: true +- name: mkdocs + version: 1.6.1 + manager: conda + platform: linux-64 + dependencies: + click: '>=7.0' + colorama: '>=0.4' + ghp-import: '>=1.0' + importlib-metadata: '>=4.4' + jinja2: '>=2.11.1' + markdown: '>=3.3.6' + markupsafe: '>=2.0.1' + mergedeep: '>=1.3.4' + mkdocs-get-deps: '>=0.2.0' + packaging: '>=20.5' + pathspec: '>=0.11.1' + python: '>=3.9' + pyyaml: '>=5.1' + pyyaml-env-tag: '>=0.1' + watchdog: '>=2.0' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + hash: + md5: 14661160be39d78f2b210f2cc2766059 + category: dev + optional: true +- name: mkdocs-click + version: 0.9.0 + manager: conda + platform: linux-64 + dependencies: + click: '>=8.1' + markdown: '>=3.3' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-click-0.9.0-pyh29332c3_0.conda + hash: + md5: 5fe524d35646dadfdc024c510d29330a + category: dev + optional: true +- name: mkdocs-get-deps + version: 0.2.0 + manager: conda + platform: linux-64 + dependencies: + importlib-metadata: '>=4.3' + mergedeep: '>=1.3.4' + platformdirs: '>=2.2.0' + python: '>=3.9' + pyyaml: '>=5.1' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + hash: + md5: 84382acddb26c27c70f2de8d4c830830 + category: dev + optional: true +- name: mkdocs-include-markdown-plugin + version: 7.2.0 + manager: conda + platform: linux-64 + dependencies: + mkdocs: '>=1.4' + python: '>=3.10' + wcmatch: '' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-include-markdown-plugin-7.2.0-pyhd8ed1ab_0.conda + hash: + md5: 4e2463b17fc15bb0ce9f67a14e3846ed + sha256: 89bea7fadc8172b8084c85971a0d09004193f9f419705dc8fc67b3267a7fdf19 + category: dev + optional: true +- name: mkdocs-material + version: 9.6.22 + manager: conda + platform: linux-64 + dependencies: + babel: '>=2.10,<3.dev0' + backrefs: '>=5.7.post1,<6.dev0' + colorama: '>=0.4,<1.dev0' + jinja2: '>=3.0,<4.dev0' + markdown: '>=3.2,<4.dev0' + mkdocs: '>=1.6,<2.dev0' + mkdocs-material-extensions: '>=1.3,<2.dev0' + paginate: '>=0.5,<1.dev0' + pygments: '>=2.16,<3.dev0' + pymdown-extensions: '>=10.2,<11.dev0' + python: '' + requests: '>=2.26,<3.dev0' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.22-pyhcf101f3_0.conda + hash: + md5: 5b9120156602e68f39129853b89acf86 + sha256: 4abb9d42fcd3820898e95f6670a2713df9f35d4eee84dd32121c6b6445a1e115 + category: dev + optional: true +- name: mkdocs-material-extensions + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + hash: + md5: de8af4000a4872e16fb784c649679c8e + category: dev + optional: true +- name: more-itertools + version: 10.8.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhd8ed1ab_0.conda + hash: + md5: d7620a15dc400b448e1c88a981b23ddd + category: dev + optional: true +- name: mypy + version: 1.18.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + mypy_extensions: '>=1.0.0' + pathspec: '>=0.9.0' + psutil: '>=4.0' + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + typing_extensions: '>=4.6.0' + url: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.18.2-py314h5bd0f2a_0.conda + hash: + md5: 1e87cabfdfea01d30e2ce1dd6152846f + category: dev + optional: true +- name: mypy_extensions + version: 1.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + hash: + md5: e9c622e0d00fa24a6292279af3ab6d06 + category: dev + optional: true +- name: ncurses + version: '6.5' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + hash: + md5: 47e340acb35de30501a76c7c799c41d7 + category: main + optional: false +- name: nh3 + version: 0.3.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + _python_abi3_support: 1.* + cpython: '>=3.10' + libgcc: '>=14' + python: '' + url: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.1-py310h1570de5_0.conda + hash: + md5: 5408ec76dfdab005a3f43be2d2c2cef3 + sha256: 01da3cb9332b933dc5a6da743814023fd2cf7f03844fd1857f66244e27eddc6d + category: dev + optional: true +- name: nlohmann_json-abi + version: 3.12.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda + hash: + md5: 59659d0213082bc13be8500bab80c002 + category: dev + optional: true +- name: nodeenv + version: 1.9.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + setuptools: '' + url: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + hash: + md5: 7ba3f09fceae6a120d664217e58fe686 + category: dev + optional: true +- name: openssl + version: 3.5.4 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + ca-certificates: '' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda + hash: + md5: 14edad12b59ccbfa3910d42c72adc2a0 + category: main + optional: false +- name: packaging + version: '25.0' + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + hash: + md5: 58335b26c38bf4a20f399384c33cbcf9 + category: dev + optional: true +- name: paginate + version: 0.5.7 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + hash: + md5: c3f35453097faf911fd3f6023fc2ab24 + category: dev + optional: true +- name: paramiko + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + bcrypt: '>=3.2' + cryptography: '>=3.3' + invoke: '>=2.0' + pynacl: '>=1.5' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda + hash: + md5: 1a884d2b1ea21abfb73911dcdb8342e4 + category: dev + optional: true +- name: pathspec + version: 0.12.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + hash: + md5: 617f15191456cc6a13db418a275435e5 + category: dev + optional: true +- name: pcre2 + version: '10.46' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + libgcc: '>=14' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda + hash: + md5: 7fa07cb0fb1b625a089ccc01218ee5b1 + category: dev + optional: true +- name: pip + version: '25.2' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.13.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh145f28c_0.conda + hash: + md5: e7ab34d5a93e0819b62563c78635d937 + category: main + optional: false +- name: platformdirs + version: 4.5.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda + hash: + md5: 5c7a868f8241e64e1cf5fdf4962f23e2 + category: dev + optional: true +- name: pluggy + version: 1.6.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + hash: + md5: 7da7ccd349dbf6487a7778579d2bb971 + category: dev + optional: true +- name: pre-commit + version: 4.3.0 + manager: conda + platform: linux-64 + dependencies: + cfgv: '>=2.0.0' + identify: '>=1.0.0' + nodeenv: '>=0.11.1' + python: '>=3.9' + pyyaml: '>=5.1' + virtualenv: '>=20.10.0' + url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda + hash: + md5: bc6c44af2a9e6067dd7e949ef10cdfba + category: dev + optional: true +- name: psutil + version: 7.1.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.2-py314h0f05182_0.conda + hash: + md5: 50eba940aa0f5105f6ae0edc586e14da + sha256: 7a5a754cda58b1c050c8084028c60350bfd903dd697fc69a8d33a567411d47f7 + category: dev + optional: true +- name: pycparser + version: '2.22' + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + hash: + md5: 12c566707c80111f9799308d9e265aef + category: dev + optional: true +- name: pygments + version: 2.19.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + hash: + md5: 6b6ece66ebcae2d5f326c77ef2c5a066 + category: dev + optional: true +- name: pymdown-extensions + version: 10.16.1 + manager: conda + platform: linux-64 + dependencies: + markdown: '>=3.6' + python: '>=3.9' + pyyaml: '' + url: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda + hash: + md5: 26e013bc453e643991cfa9b76911fb79 + category: dev + optional: true +- name: pynacl + version: 1.6.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.4.1' + libgcc: '>=14' + libsodium: '>=1.0.20,<1.0.21.0a0' + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + six: '' + url: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.0-py314h5bd0f2a_0.conda + hash: + md5: 287eabdd0b0a176376968b84c2707bd8 + category: dev + optional: true +- name: pyproject_hooks + version: 1.2.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + tomli: '>=1.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda + hash: + md5: d4582021af437c931d7d77ec39007845 + category: dev + optional: true +- name: pysocks + version: 1.7.1 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + hash: + md5: 461219d1a5bd61342293efa2c0c90eac + category: dev + optional: true +- name: pytest + version: 8.4.2 + manager: conda + platform: linux-64 + dependencies: + colorama: '>=0.4' + exceptiongroup: '>=1' + iniconfig: '>=1' + packaging: '>=20' + pluggy: '>=1.5,<2' + pygments: '>=2.7.2' + python: '>=3.10' + tomli: '>=1' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda + hash: + md5: 1f987505580cb972cf28dc5f74a0f81b + category: dev + optional: true +- name: pytest-cov + version: 7.0.0 + manager: conda + platform: linux-64 + dependencies: + coverage: '>=7.10.6' + pluggy: '>=1.2' + pytest: '>=7' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda + hash: + md5: 6891acad5e136cb62a8c2ed2679d6528 + category: dev + optional: true +- name: pytest-split + version: 0.10.0 + manager: conda + platform: linux-64 + dependencies: + pytest: '>=5.0.0,<9.0.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-split-0.10.0-pyhff2d567_0.conda + hash: + md5: 3bd32c44526b455aa146d8fdb27a65b3 + category: dev + optional: true +- name: pytest-timeout + version: 2.4.0 + manager: conda + platform: linux-64 + dependencies: + pytest: '>=7.0.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + hash: + md5: 52a50ca8ea1b3496fbd3261bea8c5722 + category: dev + optional: true +- name: pytest-xdist + version: 3.8.0 + manager: conda + platform: linux-64 + dependencies: + execnet: '>=2.1' + pytest: '>=7.0.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + hash: + md5: 8375cfbda7c57fbceeda18229be10417 + category: dev + optional: true +- name: python + version: 3.14.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + ld_impl_linux-64: '>=2.36.1' + libexpat: '>=2.7.1,<3.0a0' + libffi: '>=3.5.2,<3.6.0a0' + libgcc: '>=14' + liblzma: '>=5.8.1,<6.0a0' + libmpdec: '>=4.0.0,<5.0a0' + libsqlite: '>=3.50.4,<4.0a0' + libuuid: '>=2.41.2,<3.0a0' + libzlib: '>=1.3.1,<2.0a0' + ncurses: '>=6.5,<7.0a0' + openssl: '>=3.5.4,<4.0a0' + pip: '' + python_abi: 3.14.* + readline: '>=8.2,<9.0a0' + tk: '>=8.6.13,<8.7.0a0' + tzdata: '' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda + hash: + md5: 0a19d2cc6eb15881889b0c6fa7d6a78d + sha256: 76d750045b94fded676323bfd01975a26a474023635735773d0e4d80aaa72518 + category: main + optional: false +- name: python-build + version: 1.3.0 + manager: conda + platform: linux-64 + dependencies: + colorama: '' + importlib-metadata: '>=4.6' + packaging: '>=19.0' + pyproject_hooks: '' + python: '>=3.9' + tomli: '>=1.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + hash: + md5: ed5d43e9ef92cc2a9872f9bdfe94b984 + category: dev + optional: true +- name: python-dateutil + version: 2.9.0.post0 + manager: conda + platform: linux-64 + dependencies: + python: '' + six: '>=1.5' + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + hash: + md5: 5b8d21249ff20967101ffa321cab24e8 + category: dev + optional: true +- name: python-gil + version: 3.14.0 + manager: conda + platform: linux-64 + dependencies: + cpython: 3.14.0.* + python_abi: '*' + url: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda + hash: + md5: d152e423d80848fe95f0f4b43448030e + sha256: e68c9796fba0825ebc1338ceb94496683ab7d45dcd281b378ec2a56365d3c555 + category: dev + optional: true +- name: python_abi + version: '3.14' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + hash: + md5: 0539938c55b6b1a59b560e843ad864a4 + category: main + optional: false +- name: pytz + version: '2025.2' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + hash: + md5: bc8e3267d44011051f2eb14d22fb0960 + category: dev + optional: true +- name: pywin32-on-windows + version: 0.1.0 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 + hash: + md5: 2807a0becd1d986fe1ef9b7f8135f215 + category: dev + optional: true +- name: pyyaml + version: 6.0.3 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10.*' + yaml: '' + url: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda + hash: + md5: b12f41c0d7fb5ab81709fcc86579688f + category: dev + optional: true +- name: pyyaml-env-tag + version: '1.1' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + pyyaml: '' + url: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda + hash: + md5: e8e53c4150a1bba3b160eacf9d53a51b + category: dev + optional: true +- name: readline + version: '8.2' + manager: conda + platform: linux-64 + dependencies: + libgcc: '>=13' + ncurses: '>=6.5,<7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + hash: + md5: 283b96675859b20a825f8fa30f311446 + category: main + optional: false +- name: readme_renderer + version: '44.0' + manager: conda + platform: linux-64 + dependencies: + cmarkgfm: '>=0.8.0' + docutils: '>=0.21.2' + nh3: '>=0.2.14' + pygments: '>=2.5.1' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda + hash: + md5: c58dd5d147492671866464405364c0f1 + sha256: 66f3adf6aaabf977cfcc22cb65607002b1de4a22bc9fac7be6bb774bc6f85a3a + category: dev + optional: true +- name: reproc + version: 14.2.5.post0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda + hash: + md5: 69fbc0a9e42eb5fe6733d2d60d818822 + category: dev + optional: true +- name: reproc-cpp + version: 14.2.5.post0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + reproc: 14.2.5.post0 + url: https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda + hash: + md5: 828302fca535f9cfeb598d5f7c204323 + category: dev + optional: true +- name: requests + version: 2.32.5 + manager: conda + platform: linux-64 + dependencies: + certifi: '>=2017.4.17' + charset-normalizer: '>=2,<4' + idna: '>=2.5,<4' + python: '>=3.9' + urllib3: '>=1.21.1,<3' + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + hash: + md5: db0c6b99149880c8ba515cf4abe93ee4 + category: dev + optional: true +- name: requests-mock + version: 1.12.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + requests: '>=2.22,<3' + url: https://conda.anaconda.org/conda-forge/noarch/requests-mock-1.12.1-pyhd8ed1ab_1.conda + hash: + md5: 8212b70c509aaa0fa6c8fa974f784b2e + category: dev + optional: true +- name: requests-toolbelt + version: 1.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + requests: '>=2.0.1,<3.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda + hash: + md5: 66de8645e324fda0ea6ef28c2f99a2ab + category: dev + optional: true +- name: rfc3986 + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 43e14f832d7551e5a8910672bfc3d8c6 + sha256: d617373ba1a5108336cb87754d030b9e384dcf91796d143fa60fe61e76e5cfb0 + category: dev + optional: true +- name: rich + version: 14.2.0 + manager: conda + platform: linux-64 + dependencies: + markdown-it-py: '>=2.2.0' + pygments: '>=2.13.0,<3.0.0' + python: '' + typing_extensions: '>=4.0.0,<5.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + hash: + md5: a247579d8a59931091b16a1e932bbed6 + sha256: edfb44d0b6468a8dfced728534c755101f06f1a9870a7ad329ec51389f16b086 + category: dev + optional: true +- name: ruff + version: 0.14.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '' + url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.2-ha3a3aed_0.conda + hash: + md5: ba27344e81c9c460c9502fcbf7bd1e5c + sha256: d6c3ee6381ce275107a3fb3cfe82499f3cb74da1d95e134a93ed5e4851b4ec01 + category: dev + optional: true +- name: secretstorage + version: 3.4.0 + manager: conda + platform: linux-64 + dependencies: + cryptography: '>=2.0' + dbus: '' + jeepney: '>=0.6' + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.0-py314hdafbbf9_0.conda + hash: + md5: a804c54ce3a1aed268b13657b79825b8 + category: dev + optional: true +- name: setuptools + version: 80.9.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + hash: + md5: 4de79c071274a53dcaf2a8c749d1499e + category: dev + optional: true +- name: simdjson + version: 4.0.7 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/simdjson-4.0.7-hb700be7_0.conda + hash: + md5: cc9c262a71dd584aa5a3a22fc963255c + category: dev + optional: true +- name: six + version: 1.17.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + hash: + md5: 3339e3b65d58accf4ca4fb8748ab16b3 + category: dev + optional: true +- name: smmap + version: 5.0.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + hash: + md5: 87f47a78808baf2fa1ea9c315a1e48f1 + category: dev + optional: true +- name: tk + version: 8.6.13 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + hash: + md5: a0116df4f4ed05c303811a837d5b39d8 + category: main + optional: false +- name: toml + version: 0.10.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + hash: + md5: b0dd904de08b7db706167240bf37b164 + category: dev + optional: true +- name: tomli + version: 2.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + hash: + md5: d2732eb636c264dc9aa4cbee404b1a53 + category: dev + optional: true +- name: twine + version: 6.2.0 + manager: conda + platform: linux-64 + dependencies: + id: '' + importlib-metadata: '>=3.6' + keyring: '>=21.2.0' + packaging: '>=24.0' + python: '' + readme_renderer: '>=35.0' + requests: '>=2.20' + requests-toolbelt: '>=0.8.0,!=0.9.0' + rfc3986: '>=1.4.0' + rich: '>=12.0.0' + urllib3: '>=1.26.0' + url: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda + hash: + md5: 901a86453fa6183e914b937643619a03 + sha256: 0370098cab22773e33755026bf78539c2f05645fce7dcc9713d01e21950756bb + category: dev + optional: true +- name: types-click + version: 7.1.8 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-click-7.1.8-pyhd8ed1ab_1.conda + hash: + md5: 08ed65e279de69322843b075679567ea + category: dev + optional: true +- name: types-click-default-group + version: 1.2.0.20250513 + manager: conda + platform: linux-64 + dependencies: + click: '>=8.0.0' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/types-click-default-group-1.2.0.20250513-pyhe01879c_0.conda + hash: + md5: 335926a07f57d325d0d6966bf36eee0b + category: dev + optional: true +- name: types-filelock + version: 3.2.7 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-filelock-3.2.7-pyhd8ed1ab_1.conda + hash: + md5: 3f1356104d409d6deba0c689f3b2c602 + category: dev + optional: true +- name: types-freezegun + version: 1.1.10 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-freezegun-1.1.10-pyhd8ed1ab_1.conda + hash: + md5: 0b609b66e56bbe70d97cd52ad24058fb + category: dev + optional: true +- name: types-pyyaml + version: 6.0.12.20250915 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_0.conda + hash: + md5: 3c9919ecee97547fa14fea57e2a9bb54 + category: dev + optional: true +- name: types-requests + version: 2.32.4.20250913 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + urllib3: '>=2' + url: https://conda.anaconda.org/conda-forge/noarch/types-requests-2.32.4.20250913-pyhd8ed1ab_0.conda + hash: + md5: 829c891bfd4147c25b030455d3a57a3a + category: dev + optional: true +- name: types-setuptools + version: 80.9.0.20250822 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/types-setuptools-80.9.0.20250822-pyhcf101f3_0.conda + hash: + md5: 6404dcec3d8f8b8fe540516837aa08ec + category: dev + optional: true +- name: types-toml + version: 0.10.8.20240310 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda + hash: + md5: 353b9704e4851a6f210e641d3595755f + category: dev + optional: true +- name: typing_extensions + version: 4.15.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + hash: + md5: 0caa1af407ecff61170c9437a808404d + category: dev + optional: true +- name: tzdata + version: 2025b + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + hash: + md5: 4222072737ccff51314b5ece9c7d6f5a + category: main + optional: false +- name: ukkonen + version: 1.0.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '' + libgcc: '>=14' + libstdcxx: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py314h9891dd4_6.conda + hash: + md5: 28303a78c48916ab07b95ffdbffdfd6c + sha256: ef6753f6febaa74d35253e4e0dd09dc9497af8e370893bd97c479f59346daa57 + category: dev + optional: true +- name: urllib3 + version: 2.5.0 + manager: conda + platform: linux-64 + dependencies: + brotli-python: '>=1.0.9' + h2: '>=4,<5' + pysocks: '>=1.5.6,<2.0,!=1.5.7' + python: '>=3.9' + zstandard: '>=0.18.0' + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + hash: + md5: 436c165519e140cb08d246a4472a9d6a + category: dev + optional: true +- name: virtualenv + version: 20.35.3 + manager: conda + platform: linux-64 + dependencies: + distlib: '>=0.3.7,<1' + filelock: '>=3.12.2,<4' + platformdirs: '>=3.9.1,<5' + python: '>=3.10' + typing_extensions: '>=4.13.2' + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.3-pyhd8ed1ab_0.conda + hash: + md5: bf0dc4c8a32e91290e3fae5403798c63 + category: dev + optional: true +- name: watchdog + version: 6.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + pyyaml: '>=3.10' + url: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py314hdafbbf9_1.conda + hash: + md5: 099125fcb130e9fe134c6b610f33b0e1 + category: dev + optional: true +- name: wcmatch + version: '10.1' + manager: conda + platform: linux-64 + dependencies: + bracex: '>=2.1.1' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/wcmatch-10.1-pyhd8ed1ab_0.conda + hash: + md5: b045a877087e3bbdd36fe460e7f5cc55 + category: dev + optional: true +- name: websocket-client + version: 1.9.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + hash: + md5: 2f1ed718fcd829c184a6d4f0f2e07409 + category: dev + optional: true +- name: wheel + version: 0.45.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + hash: + md5: 75cb7132eb58d97896e173ef12ac9986 + category: dev + optional: true +- name: yaml + version: 0.2.5 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + hash: + md5: a77f85f77be52ff59391544bfe73390a + category: dev + optional: true +- name: yaml-cpp + version: 0.8.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda + hash: + md5: 92b90f5f7a322e74468bb4909c7354b5 + category: dev + optional: true +- name: zipp + version: 3.23.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + hash: + md5: df5e78d904988eb55042c0c97446079f + category: dev + optional: true +- name: zizmor + version: 1.14.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '>=3.14.0rc3,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/zizmor-1.14.1-py314ha5689aa_0.conda + hash: + md5: 1f0180642729883f29c47e11d857e786 + category: dev + optional: true +- name: zstandard + version: 0.25.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.11' + libgcc: '>=14' + python: '' + python_abi: 3.14.* + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h31f8a6b_0.conda + hash: + md5: 68bd13651618354987763f746ee1fadc + category: dev + optional: true +- name: zstd + version: 1.5.7 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + hash: + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + category: main + optional: false +- name: ty + version: 0.0.1a24 + manager: pip + platform: linux-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/78/ae/323f373fcf54a883e39ea3fb6f83ed6d1eda6dfd8246462d0cfd81dac781/ty-0.0.1a24-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + hash: + sha256: d4836854411059de592f0ecc62193f2b24fc3acbfe6ce6ce0bf2c6d1a5ea9de7 + category: dev + optional: true From 99b7f62fed802973cbe4dd415e3afe21590988f9 Mon Sep 17 00:00:00 2001 From: Ben Mares Date: Thu, 6 Nov 2025 20:37:43 +0100 Subject: [PATCH 03/10] Regenerate lockfiles --- .../lockfile-2.1.0-pkgs.yml | 126 +++++++++------- .../lockfile-2.1.1-pkgs.yml | 141 +++++++++++++----- .../lockfile-2.3.3-pkgs.yml | 126 +++++++++------- 3 files changed, 247 insertions(+), 146 deletions(-) diff --git a/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs.yml b/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs.yml index 873a16e49..c7cdf142a 100644 --- a/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs.yml +++ b/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs.yml @@ -403,15 +403,15 @@ package: category: dev optional: true - name: docutils - version: 0.22.2 + version: 0.22.3 manager: conda platform: linux-64 dependencies: python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda hash: - md5: ba6a7a1c262587d333761b0cda2bbd28 - sha256: dd02330f2ecca4a489a001e5ec66ee8aa50773dc2c621c8fc7053b454d9a27b2 + md5: abbe8c85619c87c4f4f61b44173434af + sha256: ab77ee201665dc654248e3a250bd6fe05db0a1892716a6feb8da4a3162518624 category: dev optional: true - name: exceptiongroup @@ -557,6 +557,19 @@ package: md5: 8e6923fc12f1fe8f8c4e5c9f343256ac category: dev optional: true +- name: icu + version: '75.1' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + hash: + md5: 8b189310083baabfb622af68fd9d3ae3 + category: main + optional: false - name: id version: 1.5.0 manager: conda @@ -784,7 +797,7 @@ package: category: dev optional: true - name: libcurl - version: 8.16.0 + version: 8.17.0 manager: conda platform: linux-64 dependencies: @@ -796,10 +809,10 @@ package: libzlib: '>=1.3.1,<2.0a0' openssl: '>=3.5.4,<4.0a0' zstd: '>=1.5.7,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.16.0-h4e3cde8_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda hash: - md5: a401aa9329350320c7d3809a7a5a1640 - sha256: f21af777602d17ced05f168898e759fb0bac5af09ba72c5ece245dd0f14e0fec + md5: 01e149d4a53185622dc2e788281961f2 + sha256: 100e29ca864c32af15a5cc354f502d07b2600218740fdf2439fa7d66b50b3529 category: dev optional: true - name: libedit @@ -872,10 +885,10 @@ package: url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda hash: md5: 280ea6eee9e2ddefde25ff799c4f0363 - category: dev - optional: true + category: main + optional: false - name: libglib - version: 2.86.0 + version: 2.86.1 manager: conda platform: linux-64 dependencies: @@ -885,10 +898,10 @@ package: libiconv: '>=1.18,<2.0a0' libzlib: '>=1.3.1,<2.0a0' pcre2: '>=10.46,<10.47.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.0-h32235b2_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.1-h32235b2_1.conda hash: - md5: a400fd9bad095c7cdf74661552ef802f - sha256: 8f4ccf81ebde248f8a8070a987e2dc7caa02471ae3506667da8e02176a8e0060 + md5: 8eef974130690cf385b569ecdeed2cf0 + sha256: 2421c8a9ac34a7406cff53b7cb96752177edbd245b0782ee88ef3fee5a732aa4 category: dev optional: true - name: libgomp @@ -1007,16 +1020,18 @@ package: category: dev optional: true - name: libsqlite - version: 3.50.4 + version: 3.51.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' libgcc: '>=14' libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda hash: - md5: 0b367fad34931cb79e0d6b7e5c06bb1c + md5: 729a572a3ebb8c43933b30edcc628ceb + sha256: 4c992dcd0e34b68f843e75406f7f303b1b97c248d18f3c7c330bdc0bc26ae0b3 category: main optional: false - name: libssh2 @@ -1054,8 +1069,8 @@ package: url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda hash: md5: f627678cf829bd70bccf141a19c3ad3e - category: dev - optional: true + category: main + optional: false - name: libuuid version: 2.41.2 manager: conda @@ -1074,15 +1089,16 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' libgcc: '>=14' libiconv: '>=1.18,<2.0a0' liblzma: '>=5.8.1,<6.0a0' libxml2-16: 2.15.1 libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h031cc0b_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda hash: - md5: a67cd8f7b0369bbf2c40411f05a62f3b - sha256: ee64e507b37b073e0bdad739e35330933dd5be7c639600a096551a6968f1035d + md5: e512be7dc1f84966d50959e900ca121f + sha256: ec0735ae56c3549149eebd7dc22c0bed91fd50c02eaa77ff418613ddda190aa8 category: dev optional: true - name: libxml2-16 @@ -1091,14 +1107,15 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' libgcc: '>=14' libiconv: '>=1.18,<2.0a0' liblzma: '>=5.8.1,<6.0a0' libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hf2a90c1_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda hash: - md5: 23720d17346b21efb08d68c2255c8431 - sha256: f5220ff49efc31431279859049199b9250e79f98c1dee1da12feb74bda2d9cf1 + md5: e7733bc6785ec009e47a224a71917e84 + sha256: 71436e72a286ef8b57d6f4287626ff91991eb03c7bdbe835280521791efd1434 category: dev optional: true - name: libzlib @@ -1155,15 +1172,16 @@ package: category: dev optional: true - name: markdown - version: '3.9' + version: '3.10' manager: conda platform: linux-64 dependencies: importlib-metadata: '>=4.4' python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/markdown-3.9-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhd8ed1ab_0.conda hash: - md5: 17784de2c4da64a3595328b34982cdc5 + md5: 1b9272ad4388efc264ff504384e2b578 + sha256: 2b889cd55574a4858955a8c517491948458a2c1c554ed3201d083319acf28a96 category: dev optional: true - name: markdown-it-py @@ -1281,7 +1299,7 @@ package: category: dev optional: true - name: mkdocs-material - version: 9.6.22 + version: 9.6.23 manager: conda platform: linux-64 dependencies: @@ -1297,10 +1315,10 @@ package: pymdown-extensions: '>=10.2,<11.dev0' python: '' requests: '>=2.26,<3.dev0' - url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.22-pyhcf101f3_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.23-pyhcf101f3_0.conda hash: - md5: 5b9120156602e68f39129853b89acf86 - sha256: 4abb9d42fcd3820898e95f6670a2713df9f35d4eee84dd32121c6b6445a1e115 + md5: b00890e53c4c652f55f3afc4290a814a + sha256: 86f84db5f028ba882546b56815fc62e03fa947e04f4933fa181d9bb29445d15e category: dev optional: true - name: mkdocs-material-extensions @@ -1367,7 +1385,7 @@ package: category: main optional: false - name: nh3 - version: 0.3.1 + version: 0.3.2 manager: conda platform: linux-64 dependencies: @@ -1376,10 +1394,10 @@ package: cpython: '>=3.10' libgcc: '>=14' python: '' - url: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.1-py310h1570de5_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.2-py310h1570de5_0.conda hash: - md5: 5408ec76dfdab005a3f43be2d2c2cef3 - sha256: 01da3cb9332b933dc5a6da743814023fd2cf7f03844fd1857f66244e27eddc6d + md5: 383616287311316d120b028aac89f6f4 + sha256: f6095c759df15baa9cccc20394b21667f4d0440f3c432e07539c3b47ef195c0b category: dev optional: true - name: nlohmann_json-abi @@ -1529,7 +1547,7 @@ package: category: dev optional: true - name: psutil - version: 7.1.2 + version: 7.1.3 manager: conda platform: linux-64 dependencies: @@ -1537,10 +1555,10 @@ package: libgcc: '>=14' python: '' python_abi: 3.14.* - url: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.2-py314h0f05182_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.3-py314h0f05182_0.conda hash: - md5: 50eba940aa0f5105f6ae0edc586e14da - sha256: 7a5a754cda58b1c050c8084028c60350bfd903dd697fc69a8d33a567411d47f7 + md5: aee1c9aecc66339ea6fd89e6a143a282 + sha256: 7c5d69ad61fe4e0d3657185f51302075ef5b9e34686238c6b3bde102344d4390 category: dev optional: true - name: pycparser @@ -1630,11 +1648,12 @@ package: packaging: '>=20' pluggy: '>=1.5,<2' pygments: '>=2.7.2' - python: '>=3.10' + python: '' tomli: '>=1' - url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda hash: - md5: 1f987505580cb972cf28dc5f74a0f81b + md5: da0c42269086f5170e2b296878ec13a6 + sha256: 39f41a52eb6f927caf5cd42a2ff98a09bb850ce9758b432869374b6253826962 category: dev optional: true - name: pytest-cov @@ -1937,17 +1956,17 @@ package: category: dev optional: true - name: ruff - version: 0.14.2 + version: 0.14.3 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' python: '' - url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.2-ha3a3aed_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.3-h813ae00_1.conda hash: - md5: ba27344e81c9c460c9502fcbf7bd1e5c - sha256: d6c3ee6381ce275107a3fb3cfe82499f3cb74da1d95e134a93ed5e4851b4ec01 + md5: 57df47ec0ca6c4ab8f46865a8933f0cd + sha256: 05a2d6a1123d31573163629ae5d47c02c2576b4d2c5110320d063ccd09f97c12 category: dev optional: true - name: secretstorage @@ -2212,7 +2231,7 @@ package: category: dev optional: true - name: virtualenv - version: 20.35.3 + version: 20.35.4 manager: conda platform: linux-64 dependencies: @@ -2221,9 +2240,10 @@ package: platformdirs: '>=3.9.1,<5' python: '>=3.10' typing_extensions: '>=4.13.2' - url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda hash: - md5: bf0dc4c8a32e91290e3fae5403798c63 + md5: cfccfd4e8d9de82ed75c8e2c91cab375 + sha256: 77193c99c6626c58446168d3700f9643d8c0dab1f6deb6b9dd039e6872781bfb category: dev optional: true - name: watchdog @@ -2354,12 +2374,12 @@ package: category: main optional: false - name: ty - version: 0.0.1a24 + version: 0.0.1a25 manager: pip platform: linux-64 dependencies: {} - url: https://files.pythonhosted.org/packages/78/ae/323f373fcf54a883e39ea3fb6f83ed6d1eda6dfd8246462d0cfd81dac781/ty-0.0.1a24-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + url: https://files.pythonhosted.org/packages/57/d3/01ecc23bbd8f3e0dfbcf9172d06d84e88155c5f416f1491137e8066fd859/ty-0.0.1a25-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl hash: - sha256: d4836854411059de592f0ecc62193f2b24fc3acbfe6ce6ce0bf2c6d1a5ea9de7 + sha256: 0a90d897a7c1a5ae9b41a4c7b0a42262a06361476ad88d783dbedd7913edadbc category: dev optional: true diff --git a/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs.yml b/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs.yml index 24c145c4a..106a674ec 100644 --- a/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs.yml +++ b/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs.yml @@ -169,15 +169,25 @@ package: category: dev optional: true - name: docutils - version: 0.22.2 + version: 0.22.3 manager: conda platform: linux-64 dependencies: python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda hash: - md5: ba6a7a1c262587d333761b0cda2bbd28 - sha256: dd02330f2ecca4a489a001e5ec66ee8aa50773dc2c621c8fc7053b454d9a27b2 + md5: abbe8c85619c87c4f4f61b44173434af + sha256: ab77ee201665dc654248e3a250bd6fe05db0a1892716a6feb8da4a3162518624 + category: dev + optional: true +- name: exceptiongroup + version: 1.3.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + hash: + md5: 72e42d28960d875c7654614f8b50939a category: dev optional: true - name: flaky @@ -224,6 +234,16 @@ package: md5: b91d463ea8be13bcbe644ae8bc99c39f category: dev optional: true +- name: icu + version: '75.1' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + hash: + md5: 8b189310083baabfb622af68fd9d3ae3 + category: dev + optional: true - name: id version: 1.5.0 manager: conda @@ -247,6 +267,18 @@ package: md5: 63ccfdc3a3ce25b027b8767eb722fca8 category: dev optional: true +- name: iniconfig + version: 2.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + hash: + md5: 9614359868482abba1bd15ce465e3c42 + sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 + category: dev + optional: true - name: jinja2 version: 3.1.6 manager: conda @@ -313,7 +345,7 @@ package: category: dev optional: true - name: libcurl - version: 8.16.0 + version: 8.17.0 manager: conda platform: linux-64 dependencies: @@ -325,10 +357,10 @@ package: libzlib: '>=1.3.1,<2.0a0' openssl: '>=3.5.4,<4.0a0' zstd: '>=1.5.7,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.16.0-h4e3cde8_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda hash: - md5: a401aa9329350320c7d3809a7a5a1640 - sha256: f21af777602d17ced05f168898e759fb0bac5af09ba72c5ece245dd0f14e0fec + md5: 01e149d4a53185622dc2e788281961f2 + sha256: 100e29ca864c32af15a5cc354f502d07b2600218740fdf2439fa7d66b50b3529 category: dev optional: true - name: libexpat @@ -441,13 +473,18 @@ package: category: dev optional: true - name: libsqlite - version: 3.50.4 + version: 3.51.0 manager: conda platform: linux-64 - dependencies: {} - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + dependencies: + __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' + libgcc: '>=14' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda hash: - md5: 0b367fad34931cb79e0d6b7e5c06bb1c + md5: 729a572a3ebb8c43933b30edcc628ceb + sha256: 4c992dcd0e34b68f843e75406f7f303b1b97c248d18f3c7c330bdc0bc26ae0b3 category: dev optional: true - name: libssh2 @@ -486,15 +523,16 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' libgcc: '>=14' libiconv: '>=1.18,<2.0a0' liblzma: '>=5.8.1,<6.0a0' libxml2-16: 2.15.1 libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h031cc0b_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda hash: - md5: a67cd8f7b0369bbf2c40411f05a62f3b - sha256: ee64e507b37b073e0bdad739e35330933dd5be7c639600a096551a6968f1035d + md5: e512be7dc1f84966d50959e900ca121f + sha256: ec0735ae56c3549149eebd7dc22c0bed91fd50c02eaa77ff418613ddda190aa8 category: dev optional: true - name: libxml2-16 @@ -503,14 +541,15 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' libgcc: '>=14' libiconv: '>=1.18,<2.0a0' liblzma: '>=5.8.1,<6.0a0' libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hf2a90c1_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda hash: - md5: 23720d17346b21efb08d68c2255c8431 - sha256: f5220ff49efc31431279859049199b9250e79f98c1dee1da12feb74bda2d9cf1 + md5: e7733bc6785ec009e47a224a71917e84 + sha256: 71436e72a286ef8b57d6f4287626ff91991eb03c7bdbe835280521791efd1434 category: dev optional: true - name: libzlib @@ -560,13 +599,16 @@ package: category: dev optional: true - name: markdown - version: '3.9' + version: '3.10' manager: conda platform: linux-64 - dependencies: {} - url: https://conda.anaconda.org/conda-forge/noarch/markdown-3.9-pyhd8ed1ab_0.conda + dependencies: + importlib-metadata: '>=4.4' + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhd8ed1ab_0.conda hash: - md5: 17784de2c4da64a3595328b34982cdc5 + md5: 1b9272ad4388efc264ff504384e2b578 + sha256: 2b889cd55574a4858955a8c517491948458a2c1c554ed3201d083319acf28a96 category: dev optional: true - name: markdown-it-py @@ -629,7 +671,7 @@ package: category: dev optional: true - name: mkdocs-material - version: 9.6.22 + version: 9.6.23 manager: conda platform: linux-64 dependencies: @@ -645,10 +687,10 @@ package: pymdown-extensions: '>=10.2,<11.dev0' python: '' requests: '>=2.26,<3.dev0' - url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.22-pyhcf101f3_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.23-pyhcf101f3_0.conda hash: - md5: 5b9120156602e68f39129853b89acf86 - sha256: 4abb9d42fcd3820898e95f6670a2713df9f35d4eee84dd32121c6b6445a1e115 + md5: b00890e53c4c652f55f3afc4290a814a + sha256: 86f84db5f028ba882546b56815fc62e03fa947e04f4933fa181d9bb29445d15e category: dev optional: true - name: mkdocs-material-extensions @@ -682,7 +724,7 @@ package: category: dev optional: true - name: nh3 - version: 0.3.1 + version: 0.3.2 manager: conda platform: linux-64 dependencies: @@ -691,10 +733,10 @@ package: cpython: '>=3.10' libgcc: '>=14' python: '' - url: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.1-py310h1570de5_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.2-py310h1570de5_0.conda hash: - md5: 5408ec76dfdab005a3f43be2d2c2cef3 - sha256: 01da3cb9332b933dc5a6da743814023fd2cf7f03844fd1857f66244e27eddc6d + md5: 383616287311316d120b028aac89f6f4 + sha256: f6095c759df15baa9cccc20394b21667f4d0440f3c432e07539c3b47ef195c0b category: dev optional: true - name: nlohmann_json-abi @@ -747,6 +789,16 @@ package: md5: e7ab34d5a93e0819b62563c78635d937 category: main optional: false +- name: pluggy + version: 1.6.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + hash: + md5: 7da7ccd349dbf6487a7778579d2bb971 + category: dev + optional: true - name: pre-commit version: 4.3.0 manager: conda @@ -791,10 +843,19 @@ package: version: 8.4.2 manager: conda platform: linux-64 - dependencies: {} - url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda + dependencies: + colorama: '>=0.4' + exceptiongroup: '>=1' + iniconfig: '>=1' + packaging: '>=20' + pluggy: '>=1.5,<2' + pygments: '>=2.7.2' + python: '' + tomli: '>=1' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda hash: - md5: 1f987505580cb972cf28dc5f74a0f81b + md5: da0c42269086f5170e2b296878ec13a6 + sha256: 39f41a52eb6f927caf5cd42a2ff98a09bb850ce9758b432869374b6253826962 category: dev optional: true - name: pytest-cov @@ -1004,17 +1065,17 @@ package: category: dev optional: true - name: ruff - version: 0.14.2 + version: 0.14.3 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' python: '' - url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.2-ha3a3aed_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.3-h813ae00_1.conda hash: - md5: ba27344e81c9c460c9502fcbf7bd1e5c - sha256: d6c3ee6381ce275107a3fb3cfe82499f3cb74da1d95e134a93ed5e4851b4ec01 + md5: 57df47ec0ca6c4ab8f46865a8933f0cd + sha256: 05a2d6a1123d31573163629ae5d47c02c2576b4d2c5110320d063ccd09f97c12 category: dev optional: true - name: setuptools @@ -1250,12 +1311,12 @@ package: category: dev optional: true - name: ty - version: 0.0.1a24 + version: 0.0.1a25 manager: pip platform: linux-64 dependencies: {} - url: https://files.pythonhosted.org/packages/78/ae/323f373fcf54a883e39ea3fb6f83ed6d1eda6dfd8246462d0cfd81dac781/ty-0.0.1a24-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + url: https://files.pythonhosted.org/packages/57/d3/01ecc23bbd8f3e0dfbcf9172d06d84e88155c5f416f1491137e8066fd859/ty-0.0.1a25-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl hash: - sha256: d4836854411059de592f0ecc62193f2b24fc3acbfe6ce6ce0bf2c6d1a5ea9de7 + sha256: 0a90d897a7c1a5ae9b41a4c7b0a42262a06361476ad88d783dbedd7913edadbc category: dev optional: true diff --git a/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs.yml b/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs.yml index 873a16e49..c7cdf142a 100644 --- a/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs.yml +++ b/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs.yml @@ -403,15 +403,15 @@ package: category: dev optional: true - name: docutils - version: 0.22.2 + version: 0.22.3 manager: conda platform: linux-64 dependencies: python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda hash: - md5: ba6a7a1c262587d333761b0cda2bbd28 - sha256: dd02330f2ecca4a489a001e5ec66ee8aa50773dc2c621c8fc7053b454d9a27b2 + md5: abbe8c85619c87c4f4f61b44173434af + sha256: ab77ee201665dc654248e3a250bd6fe05db0a1892716a6feb8da4a3162518624 category: dev optional: true - name: exceptiongroup @@ -557,6 +557,19 @@ package: md5: 8e6923fc12f1fe8f8c4e5c9f343256ac category: dev optional: true +- name: icu + version: '75.1' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + hash: + md5: 8b189310083baabfb622af68fd9d3ae3 + category: main + optional: false - name: id version: 1.5.0 manager: conda @@ -784,7 +797,7 @@ package: category: dev optional: true - name: libcurl - version: 8.16.0 + version: 8.17.0 manager: conda platform: linux-64 dependencies: @@ -796,10 +809,10 @@ package: libzlib: '>=1.3.1,<2.0a0' openssl: '>=3.5.4,<4.0a0' zstd: '>=1.5.7,<1.6.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.16.0-h4e3cde8_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda hash: - md5: a401aa9329350320c7d3809a7a5a1640 - sha256: f21af777602d17ced05f168898e759fb0bac5af09ba72c5ece245dd0f14e0fec + md5: 01e149d4a53185622dc2e788281961f2 + sha256: 100e29ca864c32af15a5cc354f502d07b2600218740fdf2439fa7d66b50b3529 category: dev optional: true - name: libedit @@ -872,10 +885,10 @@ package: url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda hash: md5: 280ea6eee9e2ddefde25ff799c4f0363 - category: dev - optional: true + category: main + optional: false - name: libglib - version: 2.86.0 + version: 2.86.1 manager: conda platform: linux-64 dependencies: @@ -885,10 +898,10 @@ package: libiconv: '>=1.18,<2.0a0' libzlib: '>=1.3.1,<2.0a0' pcre2: '>=10.46,<10.47.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.0-h32235b2_1.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.1-h32235b2_1.conda hash: - md5: a400fd9bad095c7cdf74661552ef802f - sha256: 8f4ccf81ebde248f8a8070a987e2dc7caa02471ae3506667da8e02176a8e0060 + md5: 8eef974130690cf385b569ecdeed2cf0 + sha256: 2421c8a9ac34a7406cff53b7cb96752177edbd245b0782ee88ef3fee5a732aa4 category: dev optional: true - name: libgomp @@ -1007,16 +1020,18 @@ package: category: dev optional: true - name: libsqlite - version: 3.50.4 + version: 3.51.0 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' libgcc: '>=14' libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.50.4-h0c1763c_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda hash: - md5: 0b367fad34931cb79e0d6b7e5c06bb1c + md5: 729a572a3ebb8c43933b30edcc628ceb + sha256: 4c992dcd0e34b68f843e75406f7f303b1b97c248d18f3c7c330bdc0bc26ae0b3 category: main optional: false - name: libssh2 @@ -1054,8 +1069,8 @@ package: url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda hash: md5: f627678cf829bd70bccf141a19c3ad3e - category: dev - optional: true + category: main + optional: false - name: libuuid version: 2.41.2 manager: conda @@ -1074,15 +1089,16 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' libgcc: '>=14' libiconv: '>=1.18,<2.0a0' liblzma: '>=5.8.1,<6.0a0' libxml2-16: 2.15.1 libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h031cc0b_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda hash: - md5: a67cd8f7b0369bbf2c40411f05a62f3b - sha256: ee64e507b37b073e0bdad739e35330933dd5be7c639600a096551a6968f1035d + md5: e512be7dc1f84966d50959e900ca121f + sha256: ec0735ae56c3549149eebd7dc22c0bed91fd50c02eaa77ff418613ddda190aa8 category: dev optional: true - name: libxml2-16 @@ -1091,14 +1107,15 @@ package: platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' libgcc: '>=14' libiconv: '>=1.18,<2.0a0' liblzma: '>=5.8.1,<6.0a0' libzlib: '>=1.3.1,<2.0a0' - url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-hf2a90c1_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda hash: - md5: 23720d17346b21efb08d68c2255c8431 - sha256: f5220ff49efc31431279859049199b9250e79f98c1dee1da12feb74bda2d9cf1 + md5: e7733bc6785ec009e47a224a71917e84 + sha256: 71436e72a286ef8b57d6f4287626ff91991eb03c7bdbe835280521791efd1434 category: dev optional: true - name: libzlib @@ -1155,15 +1172,16 @@ package: category: dev optional: true - name: markdown - version: '3.9' + version: '3.10' manager: conda platform: linux-64 dependencies: importlib-metadata: '>=4.4' python: '>=3.10' - url: https://conda.anaconda.org/conda-forge/noarch/markdown-3.9-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhd8ed1ab_0.conda hash: - md5: 17784de2c4da64a3595328b34982cdc5 + md5: 1b9272ad4388efc264ff504384e2b578 + sha256: 2b889cd55574a4858955a8c517491948458a2c1c554ed3201d083319acf28a96 category: dev optional: true - name: markdown-it-py @@ -1281,7 +1299,7 @@ package: category: dev optional: true - name: mkdocs-material - version: 9.6.22 + version: 9.6.23 manager: conda platform: linux-64 dependencies: @@ -1297,10 +1315,10 @@ package: pymdown-extensions: '>=10.2,<11.dev0' python: '' requests: '>=2.26,<3.dev0' - url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.22-pyhcf101f3_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.23-pyhcf101f3_0.conda hash: - md5: 5b9120156602e68f39129853b89acf86 - sha256: 4abb9d42fcd3820898e95f6670a2713df9f35d4eee84dd32121c6b6445a1e115 + md5: b00890e53c4c652f55f3afc4290a814a + sha256: 86f84db5f028ba882546b56815fc62e03fa947e04f4933fa181d9bb29445d15e category: dev optional: true - name: mkdocs-material-extensions @@ -1367,7 +1385,7 @@ package: category: main optional: false - name: nh3 - version: 0.3.1 + version: 0.3.2 manager: conda platform: linux-64 dependencies: @@ -1376,10 +1394,10 @@ package: cpython: '>=3.10' libgcc: '>=14' python: '' - url: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.1-py310h1570de5_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.2-py310h1570de5_0.conda hash: - md5: 5408ec76dfdab005a3f43be2d2c2cef3 - sha256: 01da3cb9332b933dc5a6da743814023fd2cf7f03844fd1857f66244e27eddc6d + md5: 383616287311316d120b028aac89f6f4 + sha256: f6095c759df15baa9cccc20394b21667f4d0440f3c432e07539c3b47ef195c0b category: dev optional: true - name: nlohmann_json-abi @@ -1529,7 +1547,7 @@ package: category: dev optional: true - name: psutil - version: 7.1.2 + version: 7.1.3 manager: conda platform: linux-64 dependencies: @@ -1537,10 +1555,10 @@ package: libgcc: '>=14' python: '' python_abi: 3.14.* - url: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.2-py314h0f05182_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.3-py314h0f05182_0.conda hash: - md5: 50eba940aa0f5105f6ae0edc586e14da - sha256: 7a5a754cda58b1c050c8084028c60350bfd903dd697fc69a8d33a567411d47f7 + md5: aee1c9aecc66339ea6fd89e6a143a282 + sha256: 7c5d69ad61fe4e0d3657185f51302075ef5b9e34686238c6b3bde102344d4390 category: dev optional: true - name: pycparser @@ -1630,11 +1648,12 @@ package: packaging: '>=20' pluggy: '>=1.5,<2' pygments: '>=2.7.2' - python: '>=3.10' + python: '' tomli: '>=1' - url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda hash: - md5: 1f987505580cb972cf28dc5f74a0f81b + md5: da0c42269086f5170e2b296878ec13a6 + sha256: 39f41a52eb6f927caf5cd42a2ff98a09bb850ce9758b432869374b6253826962 category: dev optional: true - name: pytest-cov @@ -1937,17 +1956,17 @@ package: category: dev optional: true - name: ruff - version: 0.14.2 + version: 0.14.3 manager: conda platform: linux-64 dependencies: __glibc: '>=2.17,<3.0.a0' libgcc: '>=14' python: '' - url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.2-ha3a3aed_0.conda + url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.3-h813ae00_1.conda hash: - md5: ba27344e81c9c460c9502fcbf7bd1e5c - sha256: d6c3ee6381ce275107a3fb3cfe82499f3cb74da1d95e134a93ed5e4851b4ec01 + md5: 57df47ec0ca6c4ab8f46865a8933f0cd + sha256: 05a2d6a1123d31573163629ae5d47c02c2576b4d2c5110320d063ccd09f97c12 category: dev optional: true - name: secretstorage @@ -2212,7 +2231,7 @@ package: category: dev optional: true - name: virtualenv - version: 20.35.3 + version: 20.35.4 manager: conda platform: linux-64 dependencies: @@ -2221,9 +2240,10 @@ package: platformdirs: '>=3.9.1,<5' python: '>=3.10' typing_extensions: '>=4.13.2' - url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.3-pyhd8ed1ab_0.conda + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda hash: - md5: bf0dc4c8a32e91290e3fae5403798c63 + md5: cfccfd4e8d9de82ed75c8e2c91cab375 + sha256: 77193c99c6626c58446168d3700f9643d8c0dab1f6deb6b9dd039e6872781bfb category: dev optional: true - name: watchdog @@ -2354,12 +2374,12 @@ package: category: main optional: false - name: ty - version: 0.0.1a24 + version: 0.0.1a25 manager: pip platform: linux-64 dependencies: {} - url: https://files.pythonhosted.org/packages/78/ae/323f373fcf54a883e39ea3fb6f83ed6d1eda6dfd8246462d0cfd81dac781/ty-0.0.1a24-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + url: https://files.pythonhosted.org/packages/57/d3/01ecc23bbd8f3e0dfbcf9172d06d84e88155c5f416f1491137e8066fd859/ty-0.0.1a25-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl hash: - sha256: d4836854411059de592f0ecc62193f2b24fc3acbfe6ce6ce0bf2c6d1a5ea9de7 + sha256: 0a90d897a7c1a5ae9b41a4c7b0a42262a06361476ad88d783dbedd7913edadbc category: dev optional: true From a88754d1beac3ba3a09df8c3ce3caaeef2153b4b Mon Sep 17 00:00:00 2001 From: Ben Mares Date: Thu, 6 Nov 2025 21:39:08 +0100 Subject: [PATCH 04/10] Add conda/mamba lockfiles --- ...> lockfile-2.1.0-pkgs-lock-with-conda.yml} | 9 +- ...> lockfile-2.1.0-pkgs-lock-with-mamba.yml} | 8 +- .../lockfile-2.1.1-pkgs-lock-with-conda.yml | 1660 +++++++++++ ...> lockfile-2.1.1-pkgs-lock-with-mamba.yml} | 8 +- .../lockfile-2.3.3-pkgs-lock-with-conda.yml | 2438 +++++++++++++++++ .../lockfile-2.3.3-pkgs-lock-with-mamba.yml | 2385 ++++++++++++++++ 6 files changed, 6495 insertions(+), 13 deletions(-) rename tests/test-corrupt-repodata/{lockfile-2.1.0-pkgs.yml => lockfile-2.1.0-pkgs-lock-with-conda.yml} (99%) rename tests/test-corrupt-repodata/{lockfile-2.3.3-pkgs.yml => lockfile-2.1.0-pkgs-lock-with-mamba.yml} (99%) create mode 100644 tests/test-corrupt-repodata/lockfile-2.1.1-pkgs-lock-with-conda.yml rename tests/test-corrupt-repodata/{lockfile-2.1.1-pkgs.yml => lockfile-2.1.1-pkgs-lock-with-mamba.yml} (99%) create mode 100644 tests/test-corrupt-repodata/lockfile-2.3.3-pkgs-lock-with-conda.yml create mode 100644 tests/test-corrupt-repodata/lockfile-2.3.3-pkgs-lock-with-mamba.yml diff --git a/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs.yml b/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs-lock-with-conda.yml similarity index 99% rename from tests/test-corrupt-repodata/lockfile-2.1.0-pkgs.yml rename to tests/test-corrupt-repodata/lockfile-2.1.0-pkgs-lock-with-conda.yml index c7cdf142a..6c7f10711 100644 --- a/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs.yml +++ b/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs-lock-with-conda.yml @@ -5,13 +5,13 @@ # available, unless you explicitly update the lock file. # # Install this environment as "YOURENV" with: -# conda-lock install -n YOURENV lockfile.yml +# conda-lock install -n YOURENV lockfile-conda.yml # This lock contains optional development dependencies. Include them in the installed environment with: -# conda-lock install --dev-dependencies -n YOURENV lockfile.yml +# conda-lock install --dev-dependencies -n YOURENV lockfile-conda.yml # To update a single package to the latest version compatible with the version constraints in the source: -# conda-lock lock --lockfile lockfile.yml --update PACKAGE +# conda-lock lock --lockfile lockfile-conda.yml --update PACKAGE # To re-solve the entire environment, e.g. after changing a version constraint in the source file: -# conda-lock -f ../workspace/dev-environment.yaml --lockfile lockfile.yml +# conda-lock -f ../workspace/dev-environment.yaml --lockfile lockfile-conda.yml version: 1 metadata: content_hash: @@ -1725,7 +1725,6 @@ package: libzlib: '>=1.3.1,<2.0a0' ncurses: '>=6.5,<7.0a0' openssl: '>=3.5.4,<4.0a0' - pip: '' python_abi: 3.14.* readline: '>=8.2,<9.0a0' tk: '>=8.6.13,<8.7.0a0' diff --git a/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs.yml b/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs-lock-with-mamba.yml similarity index 99% rename from tests/test-corrupt-repodata/lockfile-2.3.3-pkgs.yml rename to tests/test-corrupt-repodata/lockfile-2.1.0-pkgs-lock-with-mamba.yml index c7cdf142a..fa2901ad3 100644 --- a/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs.yml +++ b/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs-lock-with-mamba.yml @@ -5,13 +5,13 @@ # available, unless you explicitly update the lock file. # # Install this environment as "YOURENV" with: -# conda-lock install -n YOURENV lockfile.yml +# conda-lock install -n YOURENV lockfile-mamba.yml # This lock contains optional development dependencies. Include them in the installed environment with: -# conda-lock install --dev-dependencies -n YOURENV lockfile.yml +# conda-lock install --dev-dependencies -n YOURENV lockfile-mamba.yml # To update a single package to the latest version compatible with the version constraints in the source: -# conda-lock lock --lockfile lockfile.yml --update PACKAGE +# conda-lock lock --lockfile lockfile-mamba.yml --update PACKAGE # To re-solve the entire environment, e.g. after changing a version constraint in the source file: -# conda-lock -f ../workspace/dev-environment.yaml --lockfile lockfile.yml +# conda-lock -f ../workspace/dev-environment.yaml --lockfile lockfile-mamba.yml version: 1 metadata: content_hash: diff --git a/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs-lock-with-conda.yml b/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs-lock-with-conda.yml new file mode 100644 index 000000000..59294aafc --- /dev/null +++ b/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs-lock-with-conda.yml @@ -0,0 +1,1660 @@ +# This lock file was generated by conda-lock (https://github.com/conda/conda-lock). DO NOT EDIT! +# +# A "lock file" contains a concrete list of package versions (with checksums) to be installed. Unlike +# e.g. `conda env create`, the resulting environment will not change as new package versions become +# available, unless you explicitly update the lock file. +# +# Install this environment as "YOURENV" with: +# conda-lock install -n YOURENV lockfile-conda.yml +# This lock contains optional development dependencies. Include them in the installed environment with: +# conda-lock install --dev-dependencies -n YOURENV lockfile-conda.yml +# To update a single package to the latest version compatible with the version constraints in the source: +# conda-lock lock --lockfile lockfile-conda.yml --update PACKAGE +# To re-solve the entire environment, e.g. after changing a version constraint in the source file: +# conda-lock -f ../workspace/dev-environment.yaml --lockfile lockfile-conda.yml +version: 1 +metadata: + content_hash: + linux-64: 478bc8b4c815f08c094483870ca25bcd5452f8f76ab8d993b0d8a1b82429c488 + channels: + - url: conda-forge + used_env_vars: [] + platforms: + - linux-64 + sources: + - ../workspace/dev-environment.yaml +package: +- name: _libgcc_mutex + version: '0.1' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + hash: + md5: d7c89558ba9fa0495403155b64376d81 + category: dev + optional: true +- name: _openmp_mutex + version: '4.5' + manager: conda + platform: linux-64 + dependencies: + _libgcc_mutex: '0.1' + libgomp: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + hash: + md5: 73aaf86a425cc6e73fcf236a5a46396d + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + category: dev + optional: true +- name: _python_abi3_support + version: '1.0' + manager: conda + platform: linux-64 + dependencies: + cpython: '' + python-gil: '' + url: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + hash: + md5: aaa2a381ccc56eac91d63b6c1240312f + sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 + category: dev + optional: true +- name: babel + version: 2.17.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + hash: + md5: 0a01c169f0ab0f91b26e77a3301fbfe4 + category: dev + optional: true +- name: backrefs + version: '5.8' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda + hash: + md5: b16e2595d3a9042aa9d570375978835f + category: dev + optional: true +- name: bzip2 + version: 1.0.8 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + hash: + md5: 51a19bba1b8ebfb60df25cde030b7ebc + sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 + category: dev + optional: true +- name: cffi + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libffi: '>=3.5.2,<3.6.0a0' + libgcc: '>=14' + pycparser: '' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda + hash: + md5: cf45f4278afd6f4e6d03eda0f435d527 + sha256: c6339858a0aaf5d939e00d345c98b99e4558f285942b27232ac098ad17ac7f8e + category: dev + optional: true +- name: check-manifest + version: '0.51' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + python-build: '>=0.1' + setuptools: '' + toml: '' + url: https://conda.anaconda.org/conda-forge/noarch/check-manifest-0.51-pyhd8ed1ab_0.conda + hash: + md5: 7f4022a44e9fce926fc9eb0da40bcda2 + sha256: 18637560b1725c32680560566db00d3c16687a3b1adb8f628cbb251a19d9963d + category: dev + optional: true +- name: click + version: 8.3.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda + hash: + md5: e76c4ba9e1837847679421b8d549b784 + category: dev + optional: true +- name: cmarkgfm + version: 2024.11.20 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.0.0' + libgcc: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py314h5bd0f2a_1.conda + hash: + md5: 23985f6de5f68e3465807e1fbbc98f30 + sha256: c2420839a943580dece9c5857492d69732df2af6dac6cb8fd8dd92c20060beae + category: dev + optional: true +- name: colorama + version: 0.4.6 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + hash: + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + category: dev + optional: true +- name: coverage + version: 7.11.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + tomli: '' + url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.11.0-py314h67df5f8_0.conda + hash: + md5: 6ff84b39468623308dee97e5dfbafca0 + sha256: d928f6d0567807c8a09786e18966445b011ec2eb85c7e18382c0b4870cf12f17 + category: dev + optional: true +- name: cpp-expected + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/cpp-expected-1.3.1-h171cf75_0.conda + hash: + md5: d17488e343e4c5c0bd0db18b3934d517 + category: dev + optional: true +- name: cpython + version: 3.14.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.14,<3.15.0a0' + python_abi: '*' + url: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.conda + hash: + md5: ff3061d315c4a988fa1c29c543800780 + sha256: 8e2a33b36d36820698840bf0c1ed50e5dd4bdeaa434c7b4f5e13d421225b0414 + category: dev + optional: true +- name: docker-py + version: 7.1.0 + manager: conda + platform: linux-64 + dependencies: + paramiko: '>=2.4.3' + python: '>=3.9' + pywin32-on-windows: '' + requests: '>=2.26.0' + urllib3: '>=1.26.0' + websocket-client: '>=0.32.0' + url: https://conda.anaconda.org/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda + hash: + md5: 07ce73ca6f6c1a1df5d498679fc52d9e + sha256: 909bad7898ef2933a7efe69a48200e2331a362b0a1edd2d592942cde1f130979 + category: dev + optional: true +- name: doctr + version: 1.9.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/doctr-1.9.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: f57b656502db0e45cc996ddbef2a9d25 + category: dev + optional: true +- name: docutils + version: 0.22.3 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda + hash: + md5: abbe8c85619c87c4f4f61b44173434af + sha256: ab77ee201665dc654248e3a250bd6fe05db0a1892716a6feb8da4a3162518624 + category: dev + optional: true +- name: exceptiongroup + version: 1.3.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + hash: + md5: 72e42d28960d875c7654614f8b50939a + category: dev + optional: true +- name: flaky + version: 3.8.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_1.conda + hash: + md5: 7e081d00fdcba21b76658c1649691836 + sha256: 483f3291f0236d9b2a3bb417b4620d08149e1ef383da4b392fbcccce4c3ceeb5 + category: dev + optional: true +- name: fmt + version: 12.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.0.0-h2b0788b_0.conda + hash: + md5: d90bf58b03d9a958cb4f9d3de539af17 + sha256: b546c4eb5e11c2d8eab0685593e078fd0cd483e467d5d6e307d60d887488230f + category: dev + optional: true +- name: freezegun + version: 1.5.5 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/freezegun-1.5.5-pyhd8ed1ab_0.conda + hash: + md5: 0fdb8ebc8dbdb62530ff73181ae63554 + category: dev + optional: true +- name: ghp-import + version: 2.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + python-dateutil: '>=2.8.1' + url: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + hash: + md5: 93f742fe078a7b34c29a182958d4d765 + sha256: 40fdf5a9d5cc7a3503cd0c33e1b90b1e6eab251aaaa74e6b965417d089809a15 + category: dev + optional: true +- name: gitpython + version: 3.1.45 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda + hash: + md5: b91d463ea8be13bcbe644ae8bc99c39f + category: dev + optional: true +- name: icu + version: '75.1' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + hash: + md5: 8b189310083baabfb622af68fd9d3ae3 + category: dev + optional: true +- name: id + version: 1.5.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + requests: '' + url: https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda + hash: + md5: d37314c8f553e3b4b44d113a0ee10196 + sha256: 161e3eb5aba887d0329bb4099f72cb92eed9072cf63f551d08540480116e69a2 + category: dev + optional: true +- name: importlib-metadata + version: 8.7.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + zipp: '>=3.20' + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + hash: + md5: 63ccfdc3a3ce25b027b8767eb722fca8 + sha256: c18ab120a0613ada4391b15981d86ff777b5690ca461ea7e9e49531e8f374745 + category: dev + optional: true +- name: iniconfig + version: 2.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + hash: + md5: 9614359868482abba1bd15ce465e3c42 + sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 + category: dev + optional: true +- name: jinja2 + version: 3.1.6 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + hash: + md5: 446bd6c8cb26050d528881df495ce646 + category: dev + optional: true +- name: keyring + version: 25.6.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyha804496_0.conda + hash: + md5: cdd58ab99c214b55d56099108a914282 + category: dev + optional: true +- name: krb5 + version: 1.21.3 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + hash: + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + category: dev + optional: true +- name: ld_impl_linux-64 + version: '2.44' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_4.conda + hash: + md5: c94ab6ff54ba5172cf1c58267005670f + sha256: 96b6900ca0489d9e5d0318a6b49f8eff43fd85fef6e07cb0c25344ee94cd7a3a + category: dev + optional: true +- name: libarchive + version: 3.8.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + libgcc: '>=14' + liblzma: '>=5.8.1,<6.0a0' + libxml2: '' + libxml2-16: '>=2.14.6' + libzlib: '>=1.3.1,<2.0a0' + lz4-c: '>=1.10.0,<1.11.0a0' + lzo: '>=2.10,<3.0a0' + openssl: '>=3.5.4,<4.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.2-gpl_h7be2006_100.conda + hash: + md5: 9d0eaa26e3c5d7af747b3ddee928327b + sha256: 3fb3baf9f6ac39a4720f91dbb6fdace0208fd76500d362e8d6ae985a8bd42451 + category: dev + optional: true +- name: libcurl + version: 8.17.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + krb5: '>=1.21.3,<1.22.0a0' + libgcc: '>=14' + libnghttp2: '>=1.67.0,<2.0a0' + libssh2: '>=1.11.1,<2.0a0' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.5.4,<4.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda + hash: + md5: 01e149d4a53185622dc2e788281961f2 + sha256: 100e29ca864c32af15a5cc354f502d07b2600218740fdf2439fa7d66b50b3529 + category: dev + optional: true +- name: libexpat + version: 2.7.1 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + hash: + md5: 4211416ecba1866fab0c6470986c22d6 + category: dev + optional: true +- name: libffi + version: 3.5.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + hash: + md5: 35f29eec58405aaf55e01cb470d8c26a + sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 + category: dev + optional: true +- name: libgcc + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + _openmp_mutex: '>=4.5' + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda + hash: + md5: c0374badb3a5d4b1372db28d19462c53 + sha256: 08f9b87578ab981c7713e4e6a7d935e40766e10691732bba376d4964562bcb45 + category: dev + optional: true +- name: libgomp + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + hash: + md5: f7b4d76975aac7e5d9e6ad13845f92fe + sha256: e9fb1c258c8e66ee278397b5822692527c5f5786d372fe7a869b900853f3f5ca + category: dev + optional: true +- name: libiconv + version: '1.18' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + hash: + md5: 915f5995e94f60e9a4826e0b0920ee88 + sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f + category: dev + optional: true +- name: liblzma + version: 5.8.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + hash: + md5: 1a580f7796c7bf6393fddb8bbbde58dc + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + category: dev + optional: true +- name: libmamba + version: 2.3.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cpp-expected: '>=1.3.1,<1.3.2.0a0' + fmt: '>=12.0.0,<12.1.0a0' + libarchive: '>=3.8.2,<3.9.0a0' + libcurl: '>=8.14.1,<9.0a0' + libgcc: '>=14' + libsolv: '>=0.7.35,<0.8.0a0' + libstdcxx: '>=14' + nlohmann_json-abi: 3.12.0 + openssl: '>=3.5.4,<4.0a0' + reproc: '>=14.2,<15.0a0' + reproc-cpp: '>=14.2,<15.0a0' + simdjson: '>=4.0.7,<4.1.0a0' + yaml-cpp: '>=0.8.0,<0.9.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libmamba-2.3.3-h09abcb8_2.conda + hash: + md5: afca7d1181d858718852e4d8402c05ac + sha256: fb32dac071b66a23afe866acf2174bf3fa911cb45a714027328232e86592368c + category: dev + optional: true +- name: libmpdec + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + hash: + md5: c7e925f37e3b40d893459e625f6a53f1 + category: dev + optional: true +- name: libnghttp2 + version: 1.67.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + hash: + md5: b499ce4b026493a13774bcf0f4c33849 + category: dev + optional: true +- name: libsolv + version: 0.7.35 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.35-h9463b59_0.conda + hash: + md5: 21769ce326958ec230cdcbd0f2ad97eb + category: dev + optional: true +- name: libsqlite + version: 3.51.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' + libgcc: '>=14' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda + hash: + md5: 729a572a3ebb8c43933b30edcc628ceb + sha256: 4c992dcd0e34b68f843e75406f7f303b1b97c248d18f3c7c330bdc0bc26ae0b3 + category: dev + optional: true +- name: libssh2 + version: 1.11.1 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + hash: + md5: eecce068c7e4eddeb169591baac20ac4 + category: dev + optional: true +- name: libstdcxx + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: 15.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda + hash: + md5: 5b767048b1b3ee9a954b06f4084f93dc + sha256: 1b981647d9775e1cdeb2fab0a4dd9cd75a6b0de2963f6c3953dbd712f78334b3 + category: dev + optional: true +- name: libuuid + version: 2.41.2 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + hash: + md5: 80c07c68d2f6870250959dcc95b209d1 + category: dev + optional: true +- name: libxml2 + version: 2.15.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' + libgcc: '>=14' + libiconv: '>=1.18,<2.0a0' + liblzma: '>=5.8.1,<6.0a0' + libxml2-16: 2.15.1 + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda + hash: + md5: e512be7dc1f84966d50959e900ca121f + sha256: ec0735ae56c3549149eebd7dc22c0bed91fd50c02eaa77ff418613ddda190aa8 + category: dev + optional: true +- name: libxml2-16 + version: 2.15.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' + libgcc: '>=14' + libiconv: '>=1.18,<2.0a0' + liblzma: '>=5.8.1,<6.0a0' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda + hash: + md5: e7733bc6785ec009e47a224a71917e84 + sha256: 71436e72a286ef8b57d6f4287626ff91991eb03c7bdbe835280521791efd1434 + category: dev + optional: true +- name: libzlib + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + hash: + md5: edb0dca6bc32e4f4789199455a1dbeb8 + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + category: dev + optional: true +- name: lz4-c + version: 1.10.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + hash: + md5: 9de5350a85c4a20c685259b889aa6393 + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + category: dev + optional: true +- name: lzo + version: '2.10' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda + hash: + md5: 45161d96307e3a447cc3eb5896cf6f8c + sha256: 5c6bbeec116e29f08e3dad3d0524e9bc5527098e12fc432c0e5ca53ea16337d4 + category: dev + optional: true +- name: mamba + version: 2.3.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libmamba: '>=2.3.3,<2.4.0a0' + reproc: '>=14.2,<15.0a0' + reproc-cpp: '>=14.2,<15.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/mamba-2.3.3-h4396525_2.conda + hash: + md5: 7eb628c8e865dd6e33a46ade708de780 + sha256: 5b07dcfcaf67e2d843756cf79e7139ecdf13ee1f8c3734002aee729afb439393 + category: dev + optional: true +- name: markdown + version: '3.10' + manager: conda + platform: linux-64 + dependencies: + importlib-metadata: '>=4.4' + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhd8ed1ab_0.conda + hash: + md5: 1b9272ad4388efc264ff504384e2b578 + sha256: 2b889cd55574a4858955a8c517491948458a2c1c554ed3201d083319acf28a96 + category: dev + optional: true +- name: markdown-it-py + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + mdurl: '>=0.1,<1' + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + hash: + md5: 5b5203189eb668f042ac2b0826244964 + sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e + category: dev + optional: true +- name: markupsafe + version: 3.0.3 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda + hash: + md5: fab1be106a50e20f10fe5228fd1d1651 + category: dev + optional: true +- name: mdurl + version: 0.1.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + hash: + md5: 592132998493b3ff25fd7479396e8351 + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + category: dev + optional: true +- name: mergedeep + version: 1.3.4 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + hash: + md5: d9a8fc1f01deae61735c88ec242e855c + sha256: e5b555fd638334a253d83df14e3c913ef8ce10100090e17fd6fb8e752d36f95d + category: dev + optional: true +- name: mkdocs + version: 1.6.1 + manager: conda + platform: linux-64 + dependencies: + click: '>=7.0' + colorama: '>=0.4' + ghp-import: '>=1.0' + importlib-metadata: '>=4.4' + jinja2: '>=2.11.1' + markdown: '>=3.3.6' + markupsafe: '>=2.0.1' + mergedeep: '>=1.3.4' + mkdocs-get-deps: '>=0.2.0' + packaging: '>=20.5' + pathspec: '>=0.11.1' + python: '>=3.9' + pyyaml: '>=5.1' + pyyaml-env-tag: '>=0.1' + watchdog: '>=2.0' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + hash: + md5: 14661160be39d78f2b210f2cc2766059 + sha256: 902d2e251f9a7ffa7d86a3e62be5b2395e28614bd4dbe5f50acf921fd64a8c35 + category: dev + optional: true +- name: mkdocs-click + version: 0.9.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-click-0.9.0-pyh29332c3_0.conda + hash: + md5: 5fe524d35646dadfdc024c510d29330a + category: dev + optional: true +- name: mkdocs-get-deps + version: 0.2.0 + manager: conda + platform: linux-64 + dependencies: + importlib-metadata: '>=4.3' + mergedeep: '>=1.3.4' + platformdirs: '>=2.2.0' + python: '>=3.9' + pyyaml: '>=5.1' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + hash: + md5: 84382acddb26c27c70f2de8d4c830830 + sha256: e0b501b96f7e393757fb2a61d042015966f6c5e9ac825925e43f9a6eafa907b6 + category: dev + optional: true +- name: mkdocs-include-markdown-plugin + version: 7.2.0 + manager: conda + platform: linux-64 + dependencies: + mkdocs: '>=1.4' + python: '>=3.10' + wcmatch: '' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-include-markdown-plugin-7.2.0-pyhd8ed1ab_0.conda + hash: + md5: 4e2463b17fc15bb0ce9f67a14e3846ed + sha256: 89bea7fadc8172b8084c85971a0d09004193f9f419705dc8fc67b3267a7fdf19 + category: dev + optional: true +- name: mkdocs-material + version: 9.6.23 + manager: conda + platform: linux-64 + dependencies: + babel: '>=2.10,<3.dev0' + backrefs: '>=5.7.post1,<6.dev0' + colorama: '>=0.4,<1.dev0' + jinja2: '>=3.0,<4.dev0' + markdown: '>=3.2,<4.dev0' + mkdocs: '>=1.6,<2.dev0' + mkdocs-material-extensions: '>=1.3,<2.dev0' + paginate: '>=0.5,<1.dev0' + pygments: '>=2.16,<3.dev0' + pymdown-extensions: '>=10.2,<11.dev0' + python: '' + requests: '>=2.26,<3.dev0' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.23-pyhcf101f3_0.conda + hash: + md5: b00890e53c4c652f55f3afc4290a814a + sha256: 86f84db5f028ba882546b56815fc62e03fa947e04f4933fa181d9bb29445d15e + category: dev + optional: true +- name: mkdocs-material-extensions + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + hash: + md5: de8af4000a4872e16fb784c649679c8e + sha256: f62955d40926770ab65cc54f7db5fde6c073a3ba36a0787a7a5767017da50aa3 + category: dev + optional: true +- name: mypy + version: 1.18.2 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.18.2-py314h5bd0f2a_0.conda + hash: + md5: 1e87cabfdfea01d30e2ce1dd6152846f + category: dev + optional: true +- name: ncurses + version: '6.5' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + hash: + md5: 47e340acb35de30501a76c7c799c41d7 + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + category: dev + optional: true +- name: nh3 + version: 0.3.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + _python_abi3_support: 1.* + cpython: '>=3.10' + libgcc: '>=14' + python: '' + url: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.2-py310h1570de5_0.conda + hash: + md5: 383616287311316d120b028aac89f6f4 + sha256: f6095c759df15baa9cccc20394b21667f4d0440f3c432e07539c3b47ef195c0b + category: dev + optional: true +- name: nlohmann_json-abi + version: 3.12.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda + hash: + md5: 59659d0213082bc13be8500bab80c002 + sha256: 2a909594ca78843258e4bda36e43d165cda844743329838a29402823c8f20dec + category: dev + optional: true +- name: openssl + version: 3.5.4 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda + hash: + md5: 14edad12b59ccbfa3910d42c72adc2a0 + category: dev + optional: true +- name: packaging + version: '25.0' + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + hash: + md5: 58335b26c38bf4a20f399384c33cbcf9 + sha256: 289861ed0c13a15d7bbb408796af4de72c2fe67e2bcb0de98f4c3fce259d7991 + category: dev + optional: true +- name: paginate + version: 0.5.7 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + hash: + md5: c3f35453097faf911fd3f6023fc2ab24 + sha256: f6fef1b43b0d3d92476e1870c08d7b9c229aebab9a0556b073a5e1641cf453bd + category: dev + optional: true +- name: paramiko + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda + hash: + md5: 1a884d2b1ea21abfb73911dcdb8342e4 + category: dev + optional: true +- name: pathspec + version: 0.12.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + hash: + md5: 617f15191456cc6a13db418a275435e5 + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + category: dev + optional: true +- name: pip + version: '25.2' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh145f28c_0.conda + hash: + md5: e7ab34d5a93e0819b62563c78635d937 + category: main + optional: false +- name: platformdirs + version: 4.5.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda + hash: + md5: 5c7a868f8241e64e1cf5fdf4962f23e2 + category: dev + optional: true +- name: pluggy + version: 1.6.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + hash: + md5: 7da7ccd349dbf6487a7778579d2bb971 + category: dev + optional: true +- name: pre-commit + version: 4.3.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda + hash: + md5: bc6c44af2a9e6067dd7e949ef10cdfba + category: dev + optional: true +- name: pycparser + version: '2.22' + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + hash: + md5: 12c566707c80111f9799308d9e265aef + sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 + category: dev + optional: true +- name: pygments + version: 2.19.2 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + hash: + md5: 6b6ece66ebcae2d5f326c77ef2c5a066 + category: dev + optional: true +- name: pymdown-extensions + version: 10.16.1 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda + hash: + md5: 26e013bc453e643991cfa9b76911fb79 + category: dev + optional: true +- name: pytest + version: 8.4.2 + manager: conda + platform: linux-64 + dependencies: + colorama: '>=0.4' + exceptiongroup: '>=1' + iniconfig: '>=1' + packaging: '>=20' + pluggy: '>=1.5,<2' + pygments: '>=2.7.2' + python: '' + tomli: '>=1' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda + hash: + md5: da0c42269086f5170e2b296878ec13a6 + sha256: 39f41a52eb6f927caf5cd42a2ff98a09bb850ce9758b432869374b6253826962 + category: dev + optional: true +- name: pytest-cov + version: 7.0.0 + manager: conda + platform: linux-64 + dependencies: + coverage: '>=7.10.6' + pluggy: '>=1.2' + pytest: '>=7' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda + hash: + md5: 6891acad5e136cb62a8c2ed2679d6528 + sha256: d0f45586aad48ef604590188c33c83d76e4fc6370ac569ba0900906b24fd6a26 + category: dev + optional: true +- name: pytest-split + version: 0.10.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/pytest-split-0.10.0-pyhff2d567_0.conda + hash: + md5: 3bd32c44526b455aa146d8fdb27a65b3 + category: dev + optional: true +- name: pytest-timeout + version: 2.4.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + hash: + md5: 52a50ca8ea1b3496fbd3261bea8c5722 + category: dev + optional: true +- name: pytest-xdist + version: 3.8.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + hash: + md5: 8375cfbda7c57fbceeda18229be10417 + category: dev + optional: true +- name: python + version: 3.14.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + ld_impl_linux-64: '>=2.36.1' + libexpat: '>=2.7.1,<3.0a0' + libffi: '>=3.5.2,<3.6.0a0' + libgcc: '>=14' + liblzma: '>=5.8.1,<6.0a0' + libmpdec: '>=4.0.0,<5.0a0' + libsqlite: '>=3.50.4,<4.0a0' + libuuid: '>=2.41.2,<3.0a0' + libzlib: '>=1.3.1,<2.0a0' + ncurses: '>=6.5,<7.0a0' + openssl: '>=3.5.4,<4.0a0' + python_abi: 3.14.* + readline: '>=8.2,<9.0a0' + tk: '>=8.6.13,<8.7.0a0' + tzdata: '' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda + hash: + md5: 0a19d2cc6eb15881889b0c6fa7d6a78d + sha256: 76d750045b94fded676323bfd01975a26a474023635735773d0e4d80aaa72518 + category: dev + optional: true +- name: python-build + version: 1.3.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + hash: + md5: ed5d43e9ef92cc2a9872f9bdfe94b984 + category: dev + optional: true +- name: python-dateutil + version: 2.9.0.post0 + manager: conda + platform: linux-64 + dependencies: + python: '' + six: '>=1.5' + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + hash: + md5: 5b8d21249ff20967101ffa321cab24e8 + sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 + category: dev + optional: true +- name: python-gil + version: 3.14.0 + manager: conda + platform: linux-64 + dependencies: + cpython: 3.14.0.* + python_abi: '*' + url: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda + hash: + md5: d152e423d80848fe95f0f4b43448030e + sha256: e68c9796fba0825ebc1338ceb94496683ab7d45dcd281b378ec2a56365d3c555 + category: dev + optional: true +- name: python_abi + version: '3.14' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + hash: + md5: 0539938c55b6b1a59b560e843ad864a4 + sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 + category: dev + optional: true +- name: pywin32-on-windows + version: 0.1.0 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 + hash: + md5: 2807a0becd1d986fe1ef9b7f8135f215 + sha256: 6502696aaef571913b22a808b15c185bd8ea4aabb952685deb29e6a6765761cb + category: dev + optional: true +- name: pyyaml + version: 6.0.3 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda + hash: + md5: b12f41c0d7fb5ab81709fcc86579688f + category: dev + optional: true +- name: pyyaml-env-tag + version: '1.1' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda + hash: + md5: e8e53c4150a1bba3b160eacf9d53a51b + category: dev + optional: true +- name: readline + version: '8.2' + manager: conda + platform: linux-64 + dependencies: + libgcc: '>=13' + ncurses: '>=6.5,<7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + hash: + md5: 283b96675859b20a825f8fa30f311446 + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + category: dev + optional: true +- name: readme_renderer + version: '44.0' + manager: conda + platform: linux-64 + dependencies: + cmarkgfm: '>=0.8.0' + docutils: '>=0.21.2' + nh3: '>=0.2.14' + pygments: '>=2.5.1' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda + hash: + md5: c58dd5d147492671866464405364c0f1 + sha256: 66f3adf6aaabf977cfcc22cb65607002b1de4a22bc9fac7be6bb774bc6f85a3a + category: dev + optional: true +- name: reproc + version: 14.2.5.post0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda + hash: + md5: 69fbc0a9e42eb5fe6733d2d60d818822 + category: dev + optional: true +- name: reproc-cpp + version: 14.2.5.post0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda + hash: + md5: 828302fca535f9cfeb598d5f7c204323 + category: dev + optional: true +- name: requests + version: 2.32.5 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + hash: + md5: db0c6b99149880c8ba515cf4abe93ee4 + category: dev + optional: true +- name: requests-mock + version: 1.12.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + requests: '>=2.22,<3' + url: https://conda.anaconda.org/conda-forge/noarch/requests-mock-1.12.1-pyhd8ed1ab_1.conda + hash: + md5: 8212b70c509aaa0fa6c8fa974f784b2e + sha256: 7e58a039a0ade1e467b7974ad4753d62c7436a2036ef98fc8a2722518344c104 + category: dev + optional: true +- name: requests-toolbelt + version: 1.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + requests: '>=2.0.1,<3.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda + hash: + md5: 66de8645e324fda0ea6ef28c2f99a2ab + sha256: c0b815e72bb3f08b67d60d5e02251bbb0164905b5f72942ff5b6d2a339640630 + category: dev + optional: true +- name: rfc3986 + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 43e14f832d7551e5a8910672bfc3d8c6 + sha256: d617373ba1a5108336cb87754d030b9e384dcf91796d143fa60fe61e76e5cfb0 + category: dev + optional: true +- name: rich + version: 14.2.0 + manager: conda + platform: linux-64 + dependencies: + markdown-it-py: '>=2.2.0' + pygments: '>=2.13.0,<3.0.0' + python: '' + typing_extensions: '>=4.0.0,<5.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + hash: + md5: a247579d8a59931091b16a1e932bbed6 + sha256: edfb44d0b6468a8dfced728534c755101f06f1a9870a7ad329ec51389f16b086 + category: dev + optional: true +- name: ruff + version: 0.14.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '' + url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.3-h813ae00_1.conda + hash: + md5: 57df47ec0ca6c4ab8f46865a8933f0cd + sha256: 05a2d6a1123d31573163629ae5d47c02c2576b4d2c5110320d063ccd09f97c12 + category: dev + optional: true +- name: setuptools + version: 80.9.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + hash: + md5: 4de79c071274a53dcaf2a8c749d1499e + category: dev + optional: true +- name: simdjson + version: 4.0.7 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/simdjson-4.0.7-hb700be7_0.conda + hash: + md5: cc9c262a71dd584aa5a3a22fc963255c + category: dev + optional: true +- name: six + version: 1.17.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + hash: + md5: 3339e3b65d58accf4ca4fb8748ab16b3 + sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d + category: dev + optional: true +- name: tk + version: 8.6.13 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + hash: + md5: a0116df4f4ed05c303811a837d5b39d8 + sha256: a84ff687119e6d8752346d1d408d5cf360dee0badd487a472aa8ddedfdc219e1 + category: dev + optional: true +- name: toml + version: 0.10.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + hash: + md5: b0dd904de08b7db706167240bf37b164 + sha256: 34f3a83384ac3ac30aefd1309e69498d8a4aa0bf2d1f21c645f79b180e378938 + category: dev + optional: true +- name: tomli + version: 2.3.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + hash: + md5: d2732eb636c264dc9aa4cbee404b1a53 + category: dev + optional: true +- name: twine + version: 6.2.0 + manager: conda + platform: linux-64 + dependencies: + id: '' + importlib-metadata: '>=3.6' + keyring: '>=21.2.0' + packaging: '>=24.0' + python: '' + readme_renderer: '>=35.0' + requests: '>=2.20' + requests-toolbelt: '>=0.8.0,!=0.9.0' + rfc3986: '>=1.4.0' + rich: '>=12.0.0' + urllib3: '>=1.26.0' + url: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda + hash: + md5: 901a86453fa6183e914b937643619a03 + sha256: 0370098cab22773e33755026bf78539c2f05645fce7dcc9713d01e21950756bb + category: dev + optional: true +- name: types-click + version: 7.1.8 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-click-7.1.8-pyhd8ed1ab_1.conda + hash: + md5: 08ed65e279de69322843b075679567ea + sha256: 89e2437226abd85dbb1a810d95d479825e947ed24dc80e976d94fb05cf5000ed + category: dev + optional: true +- name: types-click-default-group + version: 1.2.0.20250513 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/types-click-default-group-1.2.0.20250513-pyhe01879c_0.conda + hash: + md5: 335926a07f57d325d0d6966bf36eee0b + category: dev + optional: true +- name: types-filelock + version: 3.2.7 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-filelock-3.2.7-pyhd8ed1ab_1.conda + hash: + md5: 3f1356104d409d6deba0c689f3b2c602 + sha256: ad6c8ffdc202a4ea142a08a4f77422254aa75f67efef4bcea6439619fdc20fc6 + category: dev + optional: true +- name: types-freezegun + version: 1.1.10 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-freezegun-1.1.10-pyhd8ed1ab_1.conda + hash: + md5: 0b609b66e56bbe70d97cd52ad24058fb + sha256: 2a43251b9d93467890e7974df5c70c78e71d3c6c8e05dc85974134e8f1e66df8 + category: dev + optional: true +- name: types-pyyaml + version: 6.0.12.20250915 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_0.conda + hash: + md5: 3c9919ecee97547fa14fea57e2a9bb54 + category: dev + optional: true +- name: types-requests + version: 2.32.4.20250913 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/types-requests-2.32.4.20250913-pyhd8ed1ab_0.conda + hash: + md5: 829c891bfd4147c25b030455d3a57a3a + category: dev + optional: true +- name: types-setuptools + version: 80.9.0.20250822 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/types-setuptools-80.9.0.20250822-pyhcf101f3_0.conda + hash: + md5: 6404dcec3d8f8b8fe540516837aa08ec + category: dev + optional: true +- name: types-toml + version: 0.10.8.20240310 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda + hash: + md5: 353b9704e4851a6f210e641d3595755f + sha256: 6d4c574da215ba20eddb7f5b80ba34ac19b9f49e2e48f67169f135c6bb0e2e00 + category: dev + optional: true +- name: typing_extensions + version: 4.15.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + hash: + md5: 0caa1af407ecff61170c9437a808404d + category: dev + optional: true +- name: tzdata + version: 2025b + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + hash: + md5: 4222072737ccff51314b5ece9c7d6f5a + category: dev + optional: true +- name: urllib3 + version: 2.5.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + hash: + md5: 436c165519e140cb08d246a4472a9d6a + category: dev + optional: true +- name: watchdog + version: 6.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + pyyaml: '>=3.10' + url: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py314hdafbbf9_1.conda + hash: + md5: 099125fcb130e9fe134c6b610f33b0e1 + sha256: 0fee43f08e1f7d407588e8bffb0916c63d1ab907b1a18003666ed3467674f1dc + category: dev + optional: true +- name: wcmatch + version: '10.1' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/wcmatch-10.1-pyhd8ed1ab_0.conda + hash: + md5: b045a877087e3bbdd36fe460e7f5cc55 + category: dev + optional: true +- name: websocket-client + version: 1.9.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + hash: + md5: 2f1ed718fcd829c184a6d4f0f2e07409 + category: dev + optional: true +- name: wheel + version: 0.45.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + hash: + md5: 75cb7132eb58d97896e173ef12ac9986 + sha256: 1b34021e815ff89a4d902d879c3bd2040bc1bd6169b32e9427497fa05c55f1ce + category: dev + optional: true +- name: yaml-cpp + version: 0.8.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda + hash: + md5: 92b90f5f7a322e74468bb4909c7354b5 + category: dev + optional: true +- name: zipp + version: 3.23.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + hash: + md5: df5e78d904988eb55042c0c97446079f + category: dev + optional: true +- name: zizmor + version: 1.14.1 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/zizmor-1.14.1-py314ha5689aa_0.conda + hash: + md5: 1f0180642729883f29c47e11d857e786 + category: dev + optional: true +- name: zstd + version: 1.5.7 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + hash: + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + sha256: a4166e3d8ff4e35932510aaff7aa90772f84b4d07e9f6f83c614cba7ceefe0eb + category: dev + optional: true +- name: ty + version: 0.0.1a25 + manager: pip + platform: linux-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/57/d3/01ecc23bbd8f3e0dfbcf9172d06d84e88155c5f416f1491137e8066fd859/ty-0.0.1a25-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + hash: + sha256: 0a90d897a7c1a5ae9b41a4c7b0a42262a06361476ad88d783dbedd7913edadbc + category: dev + optional: true diff --git a/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs.yml b/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs-lock-with-mamba.yml similarity index 99% rename from tests/test-corrupt-repodata/lockfile-2.1.1-pkgs.yml rename to tests/test-corrupt-repodata/lockfile-2.1.1-pkgs-lock-with-mamba.yml index 106a674ec..4d0e4cc45 100644 --- a/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs.yml +++ b/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs-lock-with-mamba.yml @@ -5,13 +5,13 @@ # available, unless you explicitly update the lock file. # # Install this environment as "YOURENV" with: -# conda-lock install -n YOURENV lockfile.yml +# conda-lock install -n YOURENV lockfile-mamba.yml # This lock contains optional development dependencies. Include them in the installed environment with: -# conda-lock install --dev-dependencies -n YOURENV lockfile.yml +# conda-lock install --dev-dependencies -n YOURENV lockfile-mamba.yml # To update a single package to the latest version compatible with the version constraints in the source: -# conda-lock lock --lockfile lockfile.yml --update PACKAGE +# conda-lock lock --lockfile lockfile-mamba.yml --update PACKAGE # To re-solve the entire environment, e.g. after changing a version constraint in the source file: -# conda-lock -f ../workspace/dev-environment.yaml --lockfile lockfile.yml +# conda-lock -f ../workspace/dev-environment.yaml --lockfile lockfile-mamba.yml version: 1 metadata: content_hash: diff --git a/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs-lock-with-conda.yml b/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs-lock-with-conda.yml new file mode 100644 index 000000000..c7eb70337 --- /dev/null +++ b/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs-lock-with-conda.yml @@ -0,0 +1,2438 @@ +# This lock file was generated by conda-lock (https://github.com/conda/conda-lock). DO NOT EDIT! +# +# A "lock file" contains a concrete list of package versions (with checksums) to be installed. Unlike +# e.g. `conda env create`, the resulting environment will not change as new package versions become +# available, unless you explicitly update the lock file. +# +# Install this environment as "YOURENV" with: +# conda-lock install -n YOURENV lockfile-conda.yml +# This lock contains optional development dependencies. Include them in the installed environment with: +# conda-lock install --dev-dependencies -n YOURENV lockfile-conda.yml +# To update a single package to the latest version compatible with the version constraints in the source: +# conda-lock lock --lockfile lockfile-conda.yml --update PACKAGE +# To re-solve the entire environment, e.g. after changing a version constraint in the source file: +# conda-lock -f ../workspace/dev-environment.yaml --lockfile lockfile-conda.yml +version: 1 +metadata: + content_hash: + linux-64: 478bc8b4c815f08c094483870ca25bcd5452f8f76ab8d993b0d8a1b82429c488 + channels: + - url: conda-forge + used_env_vars: [] + platforms: + - linux-64 + sources: + - ../workspace/dev-environment.yaml +package: +- name: _libgcc_mutex + version: '0.1' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + hash: + md5: d7c89558ba9fa0495403155b64376d81 + category: main + optional: false +- name: _openmp_mutex + version: '4.5' + manager: conda + platform: linux-64 + dependencies: + _libgcc_mutex: '0.1' + libgomp: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + hash: + md5: 73aaf86a425cc6e73fcf236a5a46396d + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + category: main + optional: false +- name: _python_abi3_support + version: '1.0' + manager: conda + platform: linux-64 + dependencies: + cpython: '' + python-gil: '' + url: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + hash: + md5: aaa2a381ccc56eac91d63b6c1240312f + sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 + category: dev + optional: true +- name: babel + version: 2.17.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + pytz: '>=2015.7' + url: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + hash: + md5: 0a01c169f0ab0f91b26e77a3301fbfe4 + category: dev + optional: true +- name: backports + version: '1.0' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda + hash: + md5: 767d508c1a67e02ae8f50e44cacfadb2 + sha256: e1c3dc8b5aa6e12145423fed262b4754d70fec601339896b9ccf483178f690a6 + category: dev + optional: true +- name: backports.tarfile + version: 1.2.0 + manager: conda + platform: linux-64 + dependencies: + backports: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhd8ed1ab_1.conda + hash: + md5: df837d654933488220b454c6a3b0fad6 + sha256: a0f41db6d7580cec3c850e5d1b82cb03197dd49a3179b1cee59c62cd2c761b36 + category: dev + optional: true +- name: backrefs + version: '5.8' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda + hash: + md5: b16e2595d3a9042aa9d570375978835f + category: dev + optional: true +- name: bcrypt + version: 5.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py314h68536ef_0.conda + hash: + md5: 71d9c4f6a05a4b9da1b03b973e078db0 + category: dev + optional: true +- name: bracex + version: 2.2.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/bracex-2.2.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 586272349d7bef5b1ef527b56dca73cb + category: dev + optional: true +- name: brotli-python + version: 1.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314hdfeb8a1_0.conda + hash: + md5: 3ef9d2a701760467b9db2338b6cd926f + sha256: 9f6d339fb78b647be35e3564dac453d8d2f1b865ba72fb961eaac41061368699 + category: dev + optional: true +- name: bzip2 + version: 1.0.8 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + hash: + md5: 51a19bba1b8ebfb60df25cde030b7ebc + sha256: c30daba32ddebbb7ded490f0e371eae90f51e72db620554089103b4a6934b0d5 + category: main + optional: false +- name: c-ares + version: 1.34.5 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + hash: + md5: f7f0d6cc2dc986d42ac2689ec88192be + category: dev + optional: true +- name: ca-certificates + version: 2025.10.5 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + url: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda + hash: + md5: f9e5fbc24009179e8b0409624691758a + category: main + optional: false +- name: certifi + version: 2025.10.5 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda + hash: + md5: 257ae203f1d204107ba389607d375ded + category: dev + optional: true +- name: cffi + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libffi: '>=3.5.2,<3.6.0a0' + libgcc: '>=14' + pycparser: '' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda + hash: + md5: cf45f4278afd6f4e6d03eda0f435d527 + sha256: c6339858a0aaf5d939e00d345c98b99e4558f285942b27232ac098ad17ac7f8e + category: dev + optional: true +- name: cfgv + version: 3.3.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + hash: + md5: 57df494053e17dce2ac3a0b33e1b2a2e + sha256: d5696636733b3c301054b948cdd793f118efacce361d9bd4afb57d5980a9064f + category: dev + optional: true +- name: charset-normalizer + version: 3.4.4 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + hash: + md5: a22d1fd9bf98827e280a02875d9a007a + sha256: b32f8362e885f1b8417bac2b3da4db7323faa12d5db62b7fd6691c02d60d6f59 + category: dev + optional: true +- name: check-manifest + version: '0.51' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + python-build: '>=0.1' + setuptools: '' + toml: '' + url: https://conda.anaconda.org/conda-forge/noarch/check-manifest-0.51-pyhd8ed1ab_0.conda + hash: + md5: 7f4022a44e9fce926fc9eb0da40bcda2 + sha256: 18637560b1725c32680560566db00d3c16687a3b1adb8f628cbb251a19d9963d + category: dev + optional: true +- name: click + version: 8.3.0 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda + hash: + md5: e76c4ba9e1837847679421b8d549b784 + category: dev + optional: true +- name: cmarkgfm + version: 2024.11.20 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.0.0' + libgcc: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py314h5bd0f2a_1.conda + hash: + md5: 23985f6de5f68e3465807e1fbbc98f30 + sha256: c2420839a943580dece9c5857492d69732df2af6dac6cb8fd8dd92c20060beae + category: dev + optional: true +- name: colorama + version: 0.4.6 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + hash: + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + sha256: ab29d57dc70786c1269633ba3dff20288b81664d3ff8d21af995742e2bb03287 + category: dev + optional: true +- name: coverage + version: 7.11.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + tomli: '' + url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.11.0-py314h67df5f8_0.conda + hash: + md5: 6ff84b39468623308dee97e5dfbafca0 + sha256: d928f6d0567807c8a09786e18966445b011ec2eb85c7e18382c0b4870cf12f17 + category: dev + optional: true +- name: cpp-expected + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/cpp-expected-1.3.1-h171cf75_0.conda + hash: + md5: d17488e343e4c5c0bd0db18b3934d517 + category: dev + optional: true +- name: cpython + version: 3.14.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.14,<3.15.0a0' + python_abi: '*' + url: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.conda + hash: + md5: ff3061d315c4a988fa1c29c543800780 + sha256: 8e2a33b36d36820698840bf0c1ed50e5dd4bdeaa434c7b4f5e13d421225b0414 + category: dev + optional: true +- name: cryptography + version: 46.0.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.14' + libgcc: '>=14' + openssl: '>=3.5.4,<4.0a0' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.3-py314hb613cbf_0.conda + hash: + md5: f291630db5dc438b6ce37c2bb1a96516 + sha256: 4bf88483f944b5624269c926369002d58951627a369aeac1e2cd64a6aa00eb05 + category: dev + optional: true +- name: dbus + version: 1.16.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libexpat: '>=2.7.0,<3.0a0' + libgcc: '>=13' + libglib: '>=2.84.2,<3.0a0' + libstdcxx: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + hash: + md5: 679616eb5ad4e521c83da4650860aba7 + category: dev + optional: true +- name: distlib + version: 0.4.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + hash: + md5: 003b8ba0a94e2f1e117d0bd46aebc901 + category: dev + optional: true +- name: docker-py + version: 7.1.0 + manager: conda + platform: linux-64 + dependencies: + paramiko: '>=2.4.3' + python: '>=3.9' + pywin32-on-windows: '' + requests: '>=2.26.0' + urllib3: '>=1.26.0' + websocket-client: '>=0.32.0' + url: https://conda.anaconda.org/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda + hash: + md5: 07ce73ca6f6c1a1df5d498679fc52d9e + sha256: 909bad7898ef2933a7efe69a48200e2331a362b0a1edd2d592942cde1f130979 + category: dev + optional: true +- name: doctr + version: 1.9.0 + manager: conda + platform: linux-64 + dependencies: + cryptography: '' + python: '>=3.5' + pyyaml: '' + requests: '' + url: https://conda.anaconda.org/conda-forge/noarch/doctr-1.9.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: f57b656502db0e45cc996ddbef2a9d25 + category: dev + optional: true +- name: docutils + version: 0.22.3 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda + hash: + md5: abbe8c85619c87c4f4f61b44173434af + sha256: ab77ee201665dc654248e3a250bd6fe05db0a1892716a6feb8da4a3162518624 + category: dev + optional: true +- name: exceptiongroup + version: 1.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + typing_extensions: '>=4.6.0' + url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + hash: + md5: 72e42d28960d875c7654614f8b50939a + category: dev + optional: true +- name: execnet + version: 2.1.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + hash: + md5: a71efeae2c160f6789900ba2631a2c90 + sha256: 9abc6c128cd40733e9b24284d0462e084d4aff6afe614f0754aa8533ebe505e4 + category: dev + optional: true +- name: filelock + version: 3.20.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda + hash: + md5: 66b8b26023b8efdf8fcb23bac4b6325d + category: dev + optional: true +- name: flaky + version: 3.8.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_1.conda + hash: + md5: 7e081d00fdcba21b76658c1649691836 + sha256: 483f3291f0236d9b2a3bb417b4620d08149e1ef383da4b392fbcccce4c3ceeb5 + category: dev + optional: true +- name: fmt + version: 12.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.0.0-h2b0788b_0.conda + hash: + md5: d90bf58b03d9a958cb4f9d3de539af17 + sha256: b546c4eb5e11c2d8eab0685593e078fd0cd483e467d5d6e307d60d887488230f + category: dev + optional: true +- name: freezegun + version: 1.5.5 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + python-dateutil: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/freezegun-1.5.5-pyhd8ed1ab_0.conda + hash: + md5: 0fdb8ebc8dbdb62530ff73181ae63554 + category: dev + optional: true +- name: ghp-import + version: 2.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + python-dateutil: '>=2.8.1' + url: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + hash: + md5: 93f742fe078a7b34c29a182958d4d765 + sha256: 40fdf5a9d5cc7a3503cd0c33e1b90b1e6eab251aaaa74e6b965417d089809a15 + category: dev + optional: true +- name: gitdb + version: 4.0.12 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + smmap: '>=3.0.1,<6' + url: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda + hash: + md5: 7c14f3706e099f8fcd47af2d494616cc + category: dev + optional: true +- name: gitpython + version: 3.1.45 + manager: conda + platform: linux-64 + dependencies: + gitdb: '>=4.0.1,<5' + python: '>=3.9' + typing_extensions: '>=3.10.0.2' + url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda + hash: + md5: b91d463ea8be13bcbe644ae8bc99c39f + category: dev + optional: true +- name: h2 + version: 4.3.0 + manager: conda + platform: linux-64 + dependencies: + hpack: '>=4.1,<5' + hyperframe: '>=6.1,<7' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + hash: + md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 + category: dev + optional: true +- name: hpack + version: 4.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + hash: + md5: 0a802cb9888dd14eeefc611f05c40b6e + category: dev + optional: true +- name: hyperframe + version: 6.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + hash: + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + category: dev + optional: true +- name: icu + version: '75.1' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + hash: + md5: 8b189310083baabfb622af68fd9d3ae3 + category: main + optional: false +- name: id + version: 1.5.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + requests: '' + url: https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda + hash: + md5: d37314c8f553e3b4b44d113a0ee10196 + sha256: 161e3eb5aba887d0329bb4099f72cb92eed9072cf63f551d08540480116e69a2 + category: dev + optional: true +- name: identify + version: 2.6.15 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + ukkonen: '' + url: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda + hash: + md5: 25f954b7dae6dd7b0dc004dab74f1ce9 + sha256: 32d5007d12e5731867908cbf5345f5cd44a6c8755a2e8e63e15a184826a51f82 + category: dev + optional: true +- name: idna + version: '3.11' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + hash: + md5: 53abe63df7e10a6ba605dc5f9f961d36 + sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 + category: dev + optional: true +- name: importlib-metadata + version: 8.7.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + zipp: '>=3.20' + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + hash: + md5: 63ccfdc3a3ce25b027b8767eb722fca8 + sha256: c18ab120a0613ada4391b15981d86ff777b5690ca461ea7e9e49531e8f374745 + category: dev + optional: true +- name: importlib_resources + version: 6.5.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + zipp: '>=3.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + hash: + md5: c85c76dc67d75619a92f51dfbce06992 + category: dev + optional: true +- name: iniconfig + version: 2.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + hash: + md5: 9614359868482abba1bd15ce465e3c42 + sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 + category: dev + optional: true +- name: invoke + version: 2.2.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + hash: + md5: 3a804714ed59be1969ffca10f703ec2a + sha256: 5a4e3a01f626c8de15ddada622d364e94ff28e8d6bdedf1665442ef03a4e0140 + category: dev + optional: true +- name: jaraco.classes + version: 3.4.0 + manager: conda + platform: linux-64 + dependencies: + more-itertools: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_2.conda + hash: + md5: ade6b25a6136661dadd1a43e4350b10b + sha256: 3d16a0fa55a29fe723c918a979b2ee927eb0bf9616381cdfd26fa9ea2b649546 + category: dev + optional: true +- name: jaraco.context + version: 6.0.1 + manager: conda + platform: linux-64 + dependencies: + backports.tarfile: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.0.1-pyhd8ed1ab_0.conda + hash: + md5: bcc023a32ea1c44a790bbf1eae473486 + category: dev + optional: true +- name: jaraco.functools + version: 4.3.0 + manager: conda + platform: linux-64 + dependencies: + more-itertools: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.3.0-pyhd8ed1ab_0.conda + hash: + md5: b86839fa387a5b904846e77c84167e57 + category: dev + optional: true +- name: jeepney + version: 0.9.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda + hash: + md5: b4b91eb14fbe2f850dd2c5fc20676c0d + category: dev + optional: true +- name: jinja2 + version: 3.1.6 + manager: conda + platform: linux-64 + dependencies: + markupsafe: '>=2.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + hash: + md5: 446bd6c8cb26050d528881df495ce646 + category: dev + optional: true +- name: keyring + version: 25.6.0 + manager: conda + platform: linux-64 + dependencies: + __linux: '' + importlib-metadata: '>=4.11.4' + importlib_resources: '' + jaraco.classes: '' + jaraco.context: '' + jaraco.functools: '' + jeepney: '>=0.4.2' + python: '>=3.9' + secretstorage: '>=3.2' + url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyha804496_0.conda + hash: + md5: cdd58ab99c214b55d56099108a914282 + category: dev + optional: true +- name: keyutils + version: 1.6.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + hash: + md5: b38117a3c920364aff79f870c984b4a3 + category: dev + optional: true +- name: krb5 + version: 1.21.3 + manager: conda + platform: linux-64 + dependencies: + keyutils: '>=1.6.1,<2.0a0' + libedit: '>=3.1.20191231,<4.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + hash: + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + category: dev + optional: true +- name: ld_impl_linux-64 + version: '2.44' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_4.conda + hash: + md5: c94ab6ff54ba5172cf1c58267005670f + sha256: 96b6900ca0489d9e5d0318a6b49f8eff43fd85fef6e07cb0c25344ee94cd7a3a + category: main + optional: false +- name: libarchive + version: 3.8.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + libgcc: '>=14' + liblzma: '>=5.8.1,<6.0a0' + libxml2: '' + libxml2-16: '>=2.14.6' + libzlib: '>=1.3.1,<2.0a0' + lz4-c: '>=1.10.0,<1.11.0a0' + lzo: '>=2.10,<3.0a0' + openssl: '>=3.5.4,<4.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.2-gpl_h7be2006_100.conda + hash: + md5: 9d0eaa26e3c5d7af747b3ddee928327b + sha256: 3fb3baf9f6ac39a4720f91dbb6fdace0208fd76500d362e8d6ae985a8bd42451 + category: dev + optional: true +- name: libcurl + version: 8.17.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + krb5: '>=1.21.3,<1.22.0a0' + libgcc: '>=14' + libnghttp2: '>=1.67.0,<2.0a0' + libssh2: '>=1.11.1,<2.0a0' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.5.4,<4.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda + hash: + md5: 01e149d4a53185622dc2e788281961f2 + sha256: 100e29ca864c32af15a5cc354f502d07b2600218740fdf2439fa7d66b50b3529 + category: dev + optional: true +- name: libedit + version: 3.1.20250104 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + ncurses: '>=6.5,<7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + hash: + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + category: dev + optional: true +- name: libev + version: '4.33' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + hash: + md5: 172bf1cd1ff8629f2b1179945ed45055 + sha256: 1cd6048169fa0395af74ed5d8f1716e22c19a81a8a36f934c110ca3ad4dd27b4 + category: dev + optional: true +- name: libexpat + version: 2.7.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + hash: + md5: 4211416ecba1866fab0c6470986c22d6 + category: main + optional: false +- name: libffi + version: 3.5.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + hash: + md5: 35f29eec58405aaf55e01cb470d8c26a + sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 + category: main + optional: false +- name: libgcc + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + _openmp_mutex: '>=4.5' + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda + hash: + md5: c0374badb3a5d4b1372db28d19462c53 + sha256: 08f9b87578ab981c7713e4e6a7d935e40766e10691732bba376d4964562bcb45 + category: main + optional: false +- name: libgcc-ng + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + libgcc: 15.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda + hash: + md5: 280ea6eee9e2ddefde25ff799c4f0363 + sha256: 2045066dd8e6e58aaf5ae2b722fb6dfdbb57c862b5f34ac7bfb58c40ef39b6ad + category: main + optional: false +- name: libglib + version: 2.86.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libffi: '>=3.5.2,<3.6.0a0' + libgcc: '>=14' + libiconv: '>=1.18,<2.0a0' + libzlib: '>=1.3.1,<2.0a0' + pcre2: '>=10.46,<10.47.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.1-h32235b2_1.conda + hash: + md5: 8eef974130690cf385b569ecdeed2cf0 + sha256: 2421c8a9ac34a7406cff53b7cb96752177edbd245b0782ee88ef3fee5a732aa4 + category: dev + optional: true +- name: libgomp + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + hash: + md5: f7b4d76975aac7e5d9e6ad13845f92fe + sha256: e9fb1c258c8e66ee278397b5822692527c5f5786d372fe7a869b900853f3f5ca + category: main + optional: false +- name: libiconv + version: '1.18' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + hash: + md5: 915f5995e94f60e9a4826e0b0920ee88 + sha256: c467851a7312765447155e071752d7bf9bf44d610a5687e32706f480aad2833f + category: dev + optional: true +- name: liblzma + version: 5.8.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + hash: + md5: 1a580f7796c7bf6393fddb8bbbde58dc + sha256: f2591c0069447bbe28d4d696b7fcb0c5bd0b4ac582769b89addbcf26fb3430d8 + category: main + optional: false +- name: libmamba + version: 2.3.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cpp-expected: '>=1.3.1,<1.3.2.0a0' + fmt: '>=12.0.0,<12.1.0a0' + libarchive: '>=3.8.2,<3.9.0a0' + libcurl: '>=8.14.1,<9.0a0' + libgcc: '>=14' + libsolv: '>=0.7.35,<0.8.0a0' + libstdcxx: '>=14' + nlohmann_json-abi: 3.12.0 + openssl: '>=3.5.4,<4.0a0' + reproc: '>=14.2,<15.0a0' + reproc-cpp: '>=14.2,<15.0a0' + simdjson: '>=4.0.7,<4.1.0a0' + yaml-cpp: '>=0.8.0,<0.9.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libmamba-2.3.3-h09abcb8_2.conda + hash: + md5: afca7d1181d858718852e4d8402c05ac + sha256: fb32dac071b66a23afe866acf2174bf3fa911cb45a714027328232e86592368c + category: dev + optional: true +- name: libmpdec + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + hash: + md5: c7e925f37e3b40d893459e625f6a53f1 + category: main + optional: false +- name: libnghttp2 + version: 1.67.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + c-ares: '>=1.34.5,<2.0a0' + libev: '>=4.33,<5.0a0' + libgcc: '>=14' + libstdcxx: '>=14' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.5.2,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + hash: + md5: b499ce4b026493a13774bcf0f4c33849 + category: dev + optional: true +- name: libsodium + version: 1.0.20 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + hash: + md5: a587892d3c13b6621a6091be690dbca2 + category: dev + optional: true +- name: libsolv + version: 0.7.35 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.35-h9463b59_0.conda + hash: + md5: 21769ce326958ec230cdcbd0f2ad97eb + category: dev + optional: true +- name: libsqlite + version: 3.51.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' + libgcc: '>=14' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda + hash: + md5: 729a572a3ebb8c43933b30edcc628ceb + sha256: 4c992dcd0e34b68f843e75406f7f303b1b97c248d18f3c7c330bdc0bc26ae0b3 + category: main + optional: false +- name: libssh2 + version: 1.11.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.5.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + hash: + md5: eecce068c7e4eddeb169591baac20ac4 + category: dev + optional: true +- name: libstdcxx + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: 15.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda + hash: + md5: 5b767048b1b3ee9a954b06f4084f93dc + sha256: 1b981647d9775e1cdeb2fab0a4dd9cd75a6b0de2963f6c3953dbd712f78334b3 + category: main + optional: false +- name: libstdcxx-ng + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + libstdcxx: 15.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + hash: + md5: f627678cf829bd70bccf141a19c3ad3e + sha256: 024fd46ac3ea8032a5ec3ea7b91c4c235701a8bf0e6520fe5e6539992a6bd05f + category: main + optional: false +- name: libuuid + version: 2.41.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + hash: + md5: 80c07c68d2f6870250959dcc95b209d1 + category: main + optional: false +- name: libxml2 + version: 2.15.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' + libgcc: '>=14' + libiconv: '>=1.18,<2.0a0' + liblzma: '>=5.8.1,<6.0a0' + libxml2-16: 2.15.1 + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda + hash: + md5: e512be7dc1f84966d50959e900ca121f + sha256: ec0735ae56c3549149eebd7dc22c0bed91fd50c02eaa77ff418613ddda190aa8 + category: dev + optional: true +- name: libxml2-16 + version: 2.15.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' + libgcc: '>=14' + libiconv: '>=1.18,<2.0a0' + liblzma: '>=5.8.1,<6.0a0' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda + hash: + md5: e7733bc6785ec009e47a224a71917e84 + sha256: 71436e72a286ef8b57d6f4287626ff91991eb03c7bdbe835280521791efd1434 + category: dev + optional: true +- name: libzlib + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + hash: + md5: edb0dca6bc32e4f4789199455a1dbeb8 + sha256: d4bfe88d7cb447768e31650f06257995601f89076080e76df55e3112d4e47dc4 + category: main + optional: false +- name: lz4-c + version: 1.10.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + hash: + md5: 9de5350a85c4a20c685259b889aa6393 + sha256: 47326f811392a5fd3055f0f773036c392d26fdb32e4d8e7a8197eed951489346 + category: dev + optional: true +- name: lzo + version: '2.10' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda + hash: + md5: 45161d96307e3a447cc3eb5896cf6f8c + sha256: 5c6bbeec116e29f08e3dad3d0524e9bc5527098e12fc432c0e5ca53ea16337d4 + category: dev + optional: true +- name: mamba + version: 2.3.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libmamba: '>=2.3.3,<2.4.0a0' + reproc: '>=14.2,<15.0a0' + reproc-cpp: '>=14.2,<15.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/mamba-2.3.3-h4396525_2.conda + hash: + md5: 7eb628c8e865dd6e33a46ade708de780 + sha256: 5b07dcfcaf67e2d843756cf79e7139ecdf13ee1f8c3734002aee729afb439393 + category: dev + optional: true +- name: markdown + version: '3.10' + manager: conda + platform: linux-64 + dependencies: + importlib-metadata: '>=4.4' + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhd8ed1ab_0.conda + hash: + md5: 1b9272ad4388efc264ff504384e2b578 + sha256: 2b889cd55574a4858955a8c517491948458a2c1c554ed3201d083319acf28a96 + category: dev + optional: true +- name: markdown-it-py + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + mdurl: '>=0.1,<1' + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + hash: + md5: 5b5203189eb668f042ac2b0826244964 + sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e + category: dev + optional: true +- name: markupsafe + version: 3.0.3 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda + hash: + md5: fab1be106a50e20f10fe5228fd1d1651 + category: dev + optional: true +- name: mdurl + version: 0.1.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + hash: + md5: 592132998493b3ff25fd7479396e8351 + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + category: dev + optional: true +- name: mergedeep + version: 1.3.4 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + hash: + md5: d9a8fc1f01deae61735c88ec242e855c + sha256: e5b555fd638334a253d83df14e3c913ef8ce10100090e17fd6fb8e752d36f95d + category: dev + optional: true +- name: mkdocs + version: 1.6.1 + manager: conda + platform: linux-64 + dependencies: + click: '>=7.0' + colorama: '>=0.4' + ghp-import: '>=1.0' + importlib-metadata: '>=4.4' + jinja2: '>=2.11.1' + markdown: '>=3.3.6' + markupsafe: '>=2.0.1' + mergedeep: '>=1.3.4' + mkdocs-get-deps: '>=0.2.0' + packaging: '>=20.5' + pathspec: '>=0.11.1' + python: '>=3.9' + pyyaml: '>=5.1' + pyyaml-env-tag: '>=0.1' + watchdog: '>=2.0' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + hash: + md5: 14661160be39d78f2b210f2cc2766059 + sha256: 902d2e251f9a7ffa7d86a3e62be5b2395e28614bd4dbe5f50acf921fd64a8c35 + category: dev + optional: true +- name: mkdocs-click + version: 0.9.0 + manager: conda + platform: linux-64 + dependencies: + click: '>=8.1' + markdown: '>=3.3' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-click-0.9.0-pyh29332c3_0.conda + hash: + md5: 5fe524d35646dadfdc024c510d29330a + category: dev + optional: true +- name: mkdocs-get-deps + version: 0.2.0 + manager: conda + platform: linux-64 + dependencies: + importlib-metadata: '>=4.3' + mergedeep: '>=1.3.4' + platformdirs: '>=2.2.0' + python: '>=3.9' + pyyaml: '>=5.1' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + hash: + md5: 84382acddb26c27c70f2de8d4c830830 + sha256: e0b501b96f7e393757fb2a61d042015966f6c5e9ac825925e43f9a6eafa907b6 + category: dev + optional: true +- name: mkdocs-include-markdown-plugin + version: 7.2.0 + manager: conda + platform: linux-64 + dependencies: + mkdocs: '>=1.4' + python: '>=3.10' + wcmatch: '' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-include-markdown-plugin-7.2.0-pyhd8ed1ab_0.conda + hash: + md5: 4e2463b17fc15bb0ce9f67a14e3846ed + sha256: 89bea7fadc8172b8084c85971a0d09004193f9f419705dc8fc67b3267a7fdf19 + category: dev + optional: true +- name: mkdocs-material + version: 9.6.23 + manager: conda + platform: linux-64 + dependencies: + babel: '>=2.10,<3.dev0' + backrefs: '>=5.7.post1,<6.dev0' + colorama: '>=0.4,<1.dev0' + jinja2: '>=3.0,<4.dev0' + markdown: '>=3.2,<4.dev0' + mkdocs: '>=1.6,<2.dev0' + mkdocs-material-extensions: '>=1.3,<2.dev0' + paginate: '>=0.5,<1.dev0' + pygments: '>=2.16,<3.dev0' + pymdown-extensions: '>=10.2,<11.dev0' + python: '' + requests: '>=2.26,<3.dev0' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.23-pyhcf101f3_0.conda + hash: + md5: b00890e53c4c652f55f3afc4290a814a + sha256: 86f84db5f028ba882546b56815fc62e03fa947e04f4933fa181d9bb29445d15e + category: dev + optional: true +- name: mkdocs-material-extensions + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + hash: + md5: de8af4000a4872e16fb784c649679c8e + sha256: f62955d40926770ab65cc54f7db5fde6c073a3ba36a0787a7a5767017da50aa3 + category: dev + optional: true +- name: more-itertools + version: 10.8.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhd8ed1ab_0.conda + hash: + md5: d7620a15dc400b448e1c88a981b23ddd + category: dev + optional: true +- name: mypy + version: 1.18.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + mypy_extensions: '>=1.0.0' + pathspec: '>=0.9.0' + psutil: '>=4.0' + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + typing_extensions: '>=4.6.0' + url: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.18.2-py314h5bd0f2a_0.conda + hash: + md5: 1e87cabfdfea01d30e2ce1dd6152846f + category: dev + optional: true +- name: mypy_extensions + version: 1.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + hash: + md5: e9c622e0d00fa24a6292279af3ab6d06 + category: dev + optional: true +- name: ncurses + version: '6.5' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + hash: + md5: 47e340acb35de30501a76c7c799c41d7 + sha256: 3fde293232fa3fca98635e1167de6b7c7fda83caf24b9d6c91ec9eefb4f4d586 + category: main + optional: false +- name: nh3 + version: 0.3.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + _python_abi3_support: 1.* + cpython: '>=3.10' + libgcc: '>=14' + python: '' + url: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.2-py310h1570de5_0.conda + hash: + md5: 383616287311316d120b028aac89f6f4 + sha256: f6095c759df15baa9cccc20394b21667f4d0440f3c432e07539c3b47ef195c0b + category: dev + optional: true +- name: nlohmann_json-abi + version: 3.12.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda + hash: + md5: 59659d0213082bc13be8500bab80c002 + sha256: 2a909594ca78843258e4bda36e43d165cda844743329838a29402823c8f20dec + category: dev + optional: true +- name: nodeenv + version: 1.9.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + setuptools: '' + url: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + hash: + md5: 7ba3f09fceae6a120d664217e58fe686 + sha256: 3636eec0e60466a00069b47ce94b6d88b01419b6577d8e393da44bb5bc8d3468 + category: dev + optional: true +- name: openssl + version: 3.5.4 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + ca-certificates: '' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda + hash: + md5: 14edad12b59ccbfa3910d42c72adc2a0 + category: main + optional: false +- name: packaging + version: '25.0' + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + hash: + md5: 58335b26c38bf4a20f399384c33cbcf9 + sha256: 289861ed0c13a15d7bbb408796af4de72c2fe67e2bcb0de98f4c3fce259d7991 + category: dev + optional: true +- name: paginate + version: 0.5.7 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + hash: + md5: c3f35453097faf911fd3f6023fc2ab24 + sha256: f6fef1b43b0d3d92476e1870c08d7b9c229aebab9a0556b073a5e1641cf453bd + category: dev + optional: true +- name: paramiko + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + bcrypt: '>=3.2' + cryptography: '>=3.3' + invoke: '>=2.0' + pynacl: '>=1.5' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda + hash: + md5: 1a884d2b1ea21abfb73911dcdb8342e4 + category: dev + optional: true +- name: pathspec + version: 0.12.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + hash: + md5: 617f15191456cc6a13db418a275435e5 + sha256: 9f64009cdf5b8e529995f18e03665b03f5d07c0b17445b8badef45bde76249ee + category: dev + optional: true +- name: pcre2 + version: '10.46' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + libgcc: '>=14' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda + hash: + md5: 7fa07cb0fb1b625a089ccc01218ee5b1 + category: dev + optional: true +- name: pip + version: '25.2' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.13.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh145f28c_0.conda + hash: + md5: e7ab34d5a93e0819b62563c78635d937 + category: main + optional: false +- name: platformdirs + version: 4.5.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda + hash: + md5: 5c7a868f8241e64e1cf5fdf4962f23e2 + category: dev + optional: true +- name: pluggy + version: 1.6.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + hash: + md5: 7da7ccd349dbf6487a7778579d2bb971 + category: dev + optional: true +- name: pre-commit + version: 4.3.0 + manager: conda + platform: linux-64 + dependencies: + cfgv: '>=2.0.0' + identify: '>=1.0.0' + nodeenv: '>=0.11.1' + python: '>=3.9' + pyyaml: '>=5.1' + virtualenv: '>=20.10.0' + url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda + hash: + md5: bc6c44af2a9e6067dd7e949ef10cdfba + category: dev + optional: true +- name: psutil + version: 7.1.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.3-py314h0f05182_0.conda + hash: + md5: aee1c9aecc66339ea6fd89e6a143a282 + sha256: 7c5d69ad61fe4e0d3657185f51302075ef5b9e34686238c6b3bde102344d4390 + category: dev + optional: true +- name: pycparser + version: '2.22' + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + hash: + md5: 12c566707c80111f9799308d9e265aef + sha256: 79db7928d13fab2d892592223d7570f5061c192f27b9febd1a418427b719acc6 + category: dev + optional: true +- name: pygments + version: 2.19.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + hash: + md5: 6b6ece66ebcae2d5f326c77ef2c5a066 + category: dev + optional: true +- name: pymdown-extensions + version: 10.16.1 + manager: conda + platform: linux-64 + dependencies: + markdown: '>=3.6' + python: '>=3.9' + pyyaml: '' + url: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda + hash: + md5: 26e013bc453e643991cfa9b76911fb79 + category: dev + optional: true +- name: pynacl + version: 1.6.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.4.1' + libgcc: '>=14' + libsodium: '>=1.0.20,<1.0.21.0a0' + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + six: '' + url: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.0-py314h5bd0f2a_0.conda + hash: + md5: 287eabdd0b0a176376968b84c2707bd8 + category: dev + optional: true +- name: pyproject_hooks + version: 1.2.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + tomli: '>=1.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda + hash: + md5: d4582021af437c931d7d77ec39007845 + sha256: 065ac44591da9abf1ff740feb25929554b920b00d09287a551fcced2c9791092 + category: dev + optional: true +- name: pysocks + version: 1.7.1 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + hash: + md5: 461219d1a5bd61342293efa2c0c90eac + sha256: ba3b032fa52709ce0d9fd388f63d330a026754587a2f461117cac9ab73d8d0d8 + category: dev + optional: true +- name: pytest + version: 8.4.2 + manager: conda + platform: linux-64 + dependencies: + colorama: '>=0.4' + exceptiongroup: '>=1' + iniconfig: '>=1' + packaging: '>=20' + pluggy: '>=1.5,<2' + pygments: '>=2.7.2' + python: '' + tomli: '>=1' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda + hash: + md5: da0c42269086f5170e2b296878ec13a6 + sha256: 39f41a52eb6f927caf5cd42a2ff98a09bb850ce9758b432869374b6253826962 + category: dev + optional: true +- name: pytest-cov + version: 7.0.0 + manager: conda + platform: linux-64 + dependencies: + coverage: '>=7.10.6' + pluggy: '>=1.2' + pytest: '>=7' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda + hash: + md5: 6891acad5e136cb62a8c2ed2679d6528 + sha256: d0f45586aad48ef604590188c33c83d76e4fc6370ac569ba0900906b24fd6a26 + category: dev + optional: true +- name: pytest-split + version: 0.10.0 + manager: conda + platform: linux-64 + dependencies: + pytest: '>=5.0.0,<9.0.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-split-0.10.0-pyhff2d567_0.conda + hash: + md5: 3bd32c44526b455aa146d8fdb27a65b3 + category: dev + optional: true +- name: pytest-timeout + version: 2.4.0 + manager: conda + platform: linux-64 + dependencies: + pytest: '>=7.0.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + hash: + md5: 52a50ca8ea1b3496fbd3261bea8c5722 + category: dev + optional: true +- name: pytest-xdist + version: 3.8.0 + manager: conda + platform: linux-64 + dependencies: + execnet: '>=2.1' + pytest: '>=7.0.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + hash: + md5: 8375cfbda7c57fbceeda18229be10417 + category: dev + optional: true +- name: python + version: 3.14.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + ld_impl_linux-64: '>=2.36.1' + libexpat: '>=2.7.1,<3.0a0' + libffi: '>=3.5.2,<3.6.0a0' + libgcc: '>=14' + liblzma: '>=5.8.1,<6.0a0' + libmpdec: '>=4.0.0,<5.0a0' + libsqlite: '>=3.50.4,<4.0a0' + libuuid: '>=2.41.2,<3.0a0' + libzlib: '>=1.3.1,<2.0a0' + ncurses: '>=6.5,<7.0a0' + openssl: '>=3.5.4,<4.0a0' + python_abi: 3.14.* + readline: '>=8.2,<9.0a0' + tk: '>=8.6.13,<8.7.0a0' + tzdata: '' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda + hash: + md5: 0a19d2cc6eb15881889b0c6fa7d6a78d + sha256: 76d750045b94fded676323bfd01975a26a474023635735773d0e4d80aaa72518 + category: main + optional: false +- name: python-build + version: 1.3.0 + manager: conda + platform: linux-64 + dependencies: + colorama: '' + importlib-metadata: '>=4.6' + packaging: '>=19.0' + pyproject_hooks: '' + python: '>=3.9' + tomli: '>=1.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + hash: + md5: ed5d43e9ef92cc2a9872f9bdfe94b984 + category: dev + optional: true +- name: python-dateutil + version: 2.9.0.post0 + manager: conda + platform: linux-64 + dependencies: + python: '' + six: '>=1.5' + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + hash: + md5: 5b8d21249ff20967101ffa321cab24e8 + sha256: d6a17ece93bbd5139e02d2bd7dbfa80bee1a4261dced63f65f679121686bf664 + category: dev + optional: true +- name: python-gil + version: 3.14.0 + manager: conda + platform: linux-64 + dependencies: + cpython: 3.14.0.* + python_abi: '*' + url: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda + hash: + md5: d152e423d80848fe95f0f4b43448030e + sha256: e68c9796fba0825ebc1338ceb94496683ab7d45dcd281b378ec2a56365d3c555 + category: dev + optional: true +- name: python_abi + version: '3.14' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + hash: + md5: 0539938c55b6b1a59b560e843ad864a4 + sha256: ad6d2e9ac39751cc0529dd1566a26751a0bf2542adb0c232533d32e176e21db5 + category: main + optional: false +- name: pytz + version: '2025.2' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + hash: + md5: bc8e3267d44011051f2eb14d22fb0960 + category: dev + optional: true +- name: pywin32-on-windows + version: 0.1.0 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 + hash: + md5: 2807a0becd1d986fe1ef9b7f8135f215 + sha256: 6502696aaef571913b22a808b15c185bd8ea4aabb952685deb29e6a6765761cb + category: dev + optional: true +- name: pyyaml + version: 6.0.3 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10.*' + yaml: '' + url: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda + hash: + md5: b12f41c0d7fb5ab81709fcc86579688f + category: dev + optional: true +- name: pyyaml-env-tag + version: '1.1' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + pyyaml: '' + url: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda + hash: + md5: e8e53c4150a1bba3b160eacf9d53a51b + category: dev + optional: true +- name: readline + version: '8.2' + manager: conda + platform: linux-64 + dependencies: + libgcc: '>=13' + ncurses: '>=6.5,<7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + hash: + md5: 283b96675859b20a825f8fa30f311446 + sha256: 2d6d0c026902561ed77cd646b5021aef2d4db22e57a5b0178dfc669231e06d2c + category: main + optional: false +- name: readme_renderer + version: '44.0' + manager: conda + platform: linux-64 + dependencies: + cmarkgfm: '>=0.8.0' + docutils: '>=0.21.2' + nh3: '>=0.2.14' + pygments: '>=2.5.1' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda + hash: + md5: c58dd5d147492671866464405364c0f1 + sha256: 66f3adf6aaabf977cfcc22cb65607002b1de4a22bc9fac7be6bb774bc6f85a3a + category: dev + optional: true +- name: reproc + version: 14.2.5.post0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda + hash: + md5: 69fbc0a9e42eb5fe6733d2d60d818822 + category: dev + optional: true +- name: reproc-cpp + version: 14.2.5.post0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + reproc: 14.2.5.post0 + url: https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda + hash: + md5: 828302fca535f9cfeb598d5f7c204323 + category: dev + optional: true +- name: requests + version: 2.32.5 + manager: conda + platform: linux-64 + dependencies: + certifi: '>=2017.4.17' + charset-normalizer: '>=2,<4' + idna: '>=2.5,<4' + python: '>=3.9' + urllib3: '>=1.21.1,<3' + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + hash: + md5: db0c6b99149880c8ba515cf4abe93ee4 + category: dev + optional: true +- name: requests-mock + version: 1.12.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + requests: '>=2.22,<3' + url: https://conda.anaconda.org/conda-forge/noarch/requests-mock-1.12.1-pyhd8ed1ab_1.conda + hash: + md5: 8212b70c509aaa0fa6c8fa974f784b2e + sha256: 7e58a039a0ade1e467b7974ad4753d62c7436a2036ef98fc8a2722518344c104 + category: dev + optional: true +- name: requests-toolbelt + version: 1.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + requests: '>=2.0.1,<3.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda + hash: + md5: 66de8645e324fda0ea6ef28c2f99a2ab + sha256: c0b815e72bb3f08b67d60d5e02251bbb0164905b5f72942ff5b6d2a339640630 + category: dev + optional: true +- name: rfc3986 + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 43e14f832d7551e5a8910672bfc3d8c6 + sha256: d617373ba1a5108336cb87754d030b9e384dcf91796d143fa60fe61e76e5cfb0 + category: dev + optional: true +- name: rich + version: 14.2.0 + manager: conda + platform: linux-64 + dependencies: + markdown-it-py: '>=2.2.0' + pygments: '>=2.13.0,<3.0.0' + python: '' + typing_extensions: '>=4.0.0,<5.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + hash: + md5: a247579d8a59931091b16a1e932bbed6 + sha256: edfb44d0b6468a8dfced728534c755101f06f1a9870a7ad329ec51389f16b086 + category: dev + optional: true +- name: ruff + version: 0.14.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '' + url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.3-h813ae00_1.conda + hash: + md5: 57df47ec0ca6c4ab8f46865a8933f0cd + sha256: 05a2d6a1123d31573163629ae5d47c02c2576b4d2c5110320d063ccd09f97c12 + category: dev + optional: true +- name: secretstorage + version: 3.4.0 + manager: conda + platform: linux-64 + dependencies: + cryptography: '>=2.0' + dbus: '' + jeepney: '>=0.6' + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.0-py314hdafbbf9_0.conda + hash: + md5: a804c54ce3a1aed268b13657b79825b8 + category: dev + optional: true +- name: setuptools + version: 80.9.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + hash: + md5: 4de79c071274a53dcaf2a8c749d1499e + category: dev + optional: true +- name: simdjson + version: 4.0.7 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/simdjson-4.0.7-hb700be7_0.conda + hash: + md5: cc9c262a71dd584aa5a3a22fc963255c + category: dev + optional: true +- name: six + version: 1.17.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + hash: + md5: 3339e3b65d58accf4ca4fb8748ab16b3 + sha256: 458227f759d5e3fcec5d9b7acce54e10c9e1f4f4b7ec978f3bfd54ce4ee9853d + category: dev + optional: true +- name: smmap + version: 5.0.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + hash: + md5: 87f47a78808baf2fa1ea9c315a1e48f1 + category: dev + optional: true +- name: tk + version: 8.6.13 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + hash: + md5: a0116df4f4ed05c303811a837d5b39d8 + sha256: a84ff687119e6d8752346d1d408d5cf360dee0badd487a472aa8ddedfdc219e1 + category: main + optional: false +- name: toml + version: 0.10.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + hash: + md5: b0dd904de08b7db706167240bf37b164 + sha256: 34f3a83384ac3ac30aefd1309e69498d8a4aa0bf2d1f21c645f79b180e378938 + category: dev + optional: true +- name: tomli + version: 2.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + hash: + md5: d2732eb636c264dc9aa4cbee404b1a53 + category: dev + optional: true +- name: twine + version: 6.2.0 + manager: conda + platform: linux-64 + dependencies: + id: '' + importlib-metadata: '>=3.6' + keyring: '>=21.2.0' + packaging: '>=24.0' + python: '' + readme_renderer: '>=35.0' + requests: '>=2.20' + requests-toolbelt: '>=0.8.0,!=0.9.0' + rfc3986: '>=1.4.0' + rich: '>=12.0.0' + urllib3: '>=1.26.0' + url: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda + hash: + md5: 901a86453fa6183e914b937643619a03 + sha256: 0370098cab22773e33755026bf78539c2f05645fce7dcc9713d01e21950756bb + category: dev + optional: true +- name: types-click + version: 7.1.8 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-click-7.1.8-pyhd8ed1ab_1.conda + hash: + md5: 08ed65e279de69322843b075679567ea + sha256: 89e2437226abd85dbb1a810d95d479825e947ed24dc80e976d94fb05cf5000ed + category: dev + optional: true +- name: types-click-default-group + version: 1.2.0.20250513 + manager: conda + platform: linux-64 + dependencies: + click: '>=8.0.0' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/types-click-default-group-1.2.0.20250513-pyhe01879c_0.conda + hash: + md5: 335926a07f57d325d0d6966bf36eee0b + category: dev + optional: true +- name: types-filelock + version: 3.2.7 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-filelock-3.2.7-pyhd8ed1ab_1.conda + hash: + md5: 3f1356104d409d6deba0c689f3b2c602 + sha256: ad6c8ffdc202a4ea142a08a4f77422254aa75f67efef4bcea6439619fdc20fc6 + category: dev + optional: true +- name: types-freezegun + version: 1.1.10 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-freezegun-1.1.10-pyhd8ed1ab_1.conda + hash: + md5: 0b609b66e56bbe70d97cd52ad24058fb + sha256: 2a43251b9d93467890e7974df5c70c78e71d3c6c8e05dc85974134e8f1e66df8 + category: dev + optional: true +- name: types-pyyaml + version: 6.0.12.20250915 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_0.conda + hash: + md5: 3c9919ecee97547fa14fea57e2a9bb54 + category: dev + optional: true +- name: types-requests + version: 2.32.4.20250913 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + urllib3: '>=2' + url: https://conda.anaconda.org/conda-forge/noarch/types-requests-2.32.4.20250913-pyhd8ed1ab_0.conda + hash: + md5: 829c891bfd4147c25b030455d3a57a3a + category: dev + optional: true +- name: types-setuptools + version: 80.9.0.20250822 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/types-setuptools-80.9.0.20250822-pyhcf101f3_0.conda + hash: + md5: 6404dcec3d8f8b8fe540516837aa08ec + category: dev + optional: true +- name: types-toml + version: 0.10.8.20240310 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda + hash: + md5: 353b9704e4851a6f210e641d3595755f + sha256: 6d4c574da215ba20eddb7f5b80ba34ac19b9f49e2e48f67169f135c6bb0e2e00 + category: dev + optional: true +- name: typing_extensions + version: 4.15.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + hash: + md5: 0caa1af407ecff61170c9437a808404d + category: dev + optional: true +- name: tzdata + version: 2025b + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + hash: + md5: 4222072737ccff51314b5ece9c7d6f5a + category: main + optional: false +- name: ukkonen + version: 1.0.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '' + libgcc: '>=14' + libstdcxx: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py314h9891dd4_6.conda + hash: + md5: 28303a78c48916ab07b95ffdbffdfd6c + sha256: ef6753f6febaa74d35253e4e0dd09dc9497af8e370893bd97c479f59346daa57 + category: dev + optional: true +- name: urllib3 + version: 2.5.0 + manager: conda + platform: linux-64 + dependencies: + brotli-python: '>=1.0.9' + h2: '>=4,<5' + pysocks: '>=1.5.6,<2.0,!=1.5.7' + python: '>=3.9' + zstandard: '>=0.18.0' + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + hash: + md5: 436c165519e140cb08d246a4472a9d6a + category: dev + optional: true +- name: virtualenv + version: 20.35.4 + manager: conda + platform: linux-64 + dependencies: + distlib: '>=0.3.7,<1' + filelock: '>=3.12.2,<4' + platformdirs: '>=3.9.1,<5' + python: '>=3.10' + typing_extensions: '>=4.13.2' + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda + hash: + md5: cfccfd4e8d9de82ed75c8e2c91cab375 + sha256: 77193c99c6626c58446168d3700f9643d8c0dab1f6deb6b9dd039e6872781bfb + category: dev + optional: true +- name: watchdog + version: 6.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + pyyaml: '>=3.10' + url: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py314hdafbbf9_1.conda + hash: + md5: 099125fcb130e9fe134c6b610f33b0e1 + sha256: 0fee43f08e1f7d407588e8bffb0916c63d1ab907b1a18003666ed3467674f1dc + category: dev + optional: true +- name: wcmatch + version: '10.1' + manager: conda + platform: linux-64 + dependencies: + bracex: '>=2.1.1' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/wcmatch-10.1-pyhd8ed1ab_0.conda + hash: + md5: b045a877087e3bbdd36fe460e7f5cc55 + category: dev + optional: true +- name: websocket-client + version: 1.9.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + hash: + md5: 2f1ed718fcd829c184a6d4f0f2e07409 + category: dev + optional: true +- name: wheel + version: 0.45.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + hash: + md5: 75cb7132eb58d97896e173ef12ac9986 + sha256: 1b34021e815ff89a4d902d879c3bd2040bc1bd6169b32e9427497fa05c55f1ce + category: dev + optional: true +- name: yaml + version: 0.2.5 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + hash: + md5: a77f85f77be52ff59391544bfe73390a + sha256: 6d9ea2f731e284e9316d95fa61869fe7bbba33df7929f82693c121022810f4ad + category: dev + optional: true +- name: yaml-cpp + version: 0.8.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda + hash: + md5: 92b90f5f7a322e74468bb4909c7354b5 + category: dev + optional: true +- name: zipp + version: 3.23.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + hash: + md5: df5e78d904988eb55042c0c97446079f + category: dev + optional: true +- name: zizmor + version: 1.14.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '>=3.14.0rc3,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/zizmor-1.14.1-py314ha5689aa_0.conda + hash: + md5: 1f0180642729883f29c47e11d857e786 + category: dev + optional: true +- name: zstandard + version: 0.25.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.11' + libgcc: '>=14' + python: '' + python_abi: 3.14.* + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h31f8a6b_0.conda + hash: + md5: 68bd13651618354987763f746ee1fadc + category: dev + optional: true +- name: zstd + version: 1.5.7 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + hash: + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + sha256: a4166e3d8ff4e35932510aaff7aa90772f84b4d07e9f6f83c614cba7ceefe0eb + category: main + optional: false +- name: ty + version: 0.0.1a25 + manager: pip + platform: linux-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/57/d3/01ecc23bbd8f3e0dfbcf9172d06d84e88155c5f416f1491137e8066fd859/ty-0.0.1a25-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + hash: + sha256: 0a90d897a7c1a5ae9b41a4c7b0a42262a06361476ad88d783dbedd7913edadbc + category: dev + optional: true diff --git a/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs-lock-with-mamba.yml b/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs-lock-with-mamba.yml new file mode 100644 index 000000000..fa2901ad3 --- /dev/null +++ b/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs-lock-with-mamba.yml @@ -0,0 +1,2385 @@ +# This lock file was generated by conda-lock (https://github.com/conda/conda-lock). DO NOT EDIT! +# +# A "lock file" contains a concrete list of package versions (with checksums) to be installed. Unlike +# e.g. `conda env create`, the resulting environment will not change as new package versions become +# available, unless you explicitly update the lock file. +# +# Install this environment as "YOURENV" with: +# conda-lock install -n YOURENV lockfile-mamba.yml +# This lock contains optional development dependencies. Include them in the installed environment with: +# conda-lock install --dev-dependencies -n YOURENV lockfile-mamba.yml +# To update a single package to the latest version compatible with the version constraints in the source: +# conda-lock lock --lockfile lockfile-mamba.yml --update PACKAGE +# To re-solve the entire environment, e.g. after changing a version constraint in the source file: +# conda-lock -f ../workspace/dev-environment.yaml --lockfile lockfile-mamba.yml +version: 1 +metadata: + content_hash: + linux-64: 478bc8b4c815f08c094483870ca25bcd5452f8f76ab8d993b0d8a1b82429c488 + channels: + - url: conda-forge + used_env_vars: [] + platforms: + - linux-64 + sources: + - ../workspace/dev-environment.yaml +package: +- name: _libgcc_mutex + version: '0.1' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + hash: + md5: d7c89558ba9fa0495403155b64376d81 + category: main + optional: false +- name: _openmp_mutex + version: '4.5' + manager: conda + platform: linux-64 + dependencies: + _libgcc_mutex: '0.1' + libgomp: '>=7.5.0' + url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + hash: + md5: 73aaf86a425cc6e73fcf236a5a46396d + category: main + optional: false +- name: _python_abi3_support + version: '1.0' + manager: conda + platform: linux-64 + dependencies: + cpython: '' + python-gil: '' + url: https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda + hash: + md5: aaa2a381ccc56eac91d63b6c1240312f + sha256: a3967b937b9abf0f2a99f3173fa4630293979bd1644709d89580e7c62a544661 + category: dev + optional: true +- name: babel + version: 2.17.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + pytz: '>=2015.7' + url: https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda + hash: + md5: 0a01c169f0ab0f91b26e77a3301fbfe4 + category: dev + optional: true +- name: backports + version: '1.0' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda + hash: + md5: 767d508c1a67e02ae8f50e44cacfadb2 + category: dev + optional: true +- name: backports.tarfile + version: 1.2.0 + manager: conda + platform: linux-64 + dependencies: + backports: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhd8ed1ab_1.conda + hash: + md5: df837d654933488220b454c6a3b0fad6 + category: dev + optional: true +- name: backrefs + version: '5.8' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda + hash: + md5: b16e2595d3a9042aa9d570375978835f + category: dev + optional: true +- name: bcrypt + version: 5.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py314h68536ef_0.conda + hash: + md5: 71d9c4f6a05a4b9da1b03b973e078db0 + category: dev + optional: true +- name: bracex + version: 2.2.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.5' + url: https://conda.anaconda.org/conda-forge/noarch/bracex-2.2.1-pyhd8ed1ab_0.tar.bz2 + hash: + md5: 586272349d7bef5b1ef527b56dca73cb + category: dev + optional: true +- name: brotli-python + version: 1.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314hdfeb8a1_0.conda + hash: + md5: 3ef9d2a701760467b9db2338b6cd926f + sha256: 9f6d339fb78b647be35e3564dac453d8d2f1b865ba72fb961eaac41061368699 + category: dev + optional: true +- name: bzip2 + version: 1.0.8 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda + hash: + md5: 51a19bba1b8ebfb60df25cde030b7ebc + category: main + optional: false +- name: c-ares + version: 1.34.5 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda + hash: + md5: f7f0d6cc2dc986d42ac2689ec88192be + category: dev + optional: true +- name: ca-certificates + version: 2025.10.5 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + url: https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda + hash: + md5: f9e5fbc24009179e8b0409624691758a + category: main + optional: false +- name: certifi + version: 2025.10.5 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda + hash: + md5: 257ae203f1d204107ba389607d375ded + category: dev + optional: true +- name: cffi + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libffi: '>=3.5.2,<3.6.0a0' + libgcc: '>=14' + pycparser: '' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda + hash: + md5: cf45f4278afd6f4e6d03eda0f435d527 + sha256: c6339858a0aaf5d939e00d345c98b99e4558f285942b27232ac098ad17ac7f8e + category: dev + optional: true +- name: cfgv + version: 3.3.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda + hash: + md5: 57df494053e17dce2ac3a0b33e1b2a2e + category: dev + optional: true +- name: charset-normalizer + version: 3.4.4 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda + hash: + md5: a22d1fd9bf98827e280a02875d9a007a + sha256: b32f8362e885f1b8417bac2b3da4db7323faa12d5db62b7fd6691c02d60d6f59 + category: dev + optional: true +- name: check-manifest + version: '0.51' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + python-build: '>=0.1' + setuptools: '' + toml: '' + url: https://conda.anaconda.org/conda-forge/noarch/check-manifest-0.51-pyhd8ed1ab_0.conda + hash: + md5: 7f4022a44e9fce926fc9eb0da40bcda2 + sha256: 18637560b1725c32680560566db00d3c16687a3b1adb8f628cbb251a19d9963d + category: dev + optional: true +- name: click + version: 8.3.0 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda + hash: + md5: e76c4ba9e1837847679421b8d549b784 + category: dev + optional: true +- name: cmarkgfm + version: 2024.11.20 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.0.0' + libgcc: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py314h5bd0f2a_1.conda + hash: + md5: 23985f6de5f68e3465807e1fbbc98f30 + sha256: c2420839a943580dece9c5857492d69732df2af6dac6cb8fd8dd92c20060beae + category: dev + optional: true +- name: colorama + version: 0.4.6 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda + hash: + md5: 962b9857ee8e7018c22f2776ffa0b2d7 + category: dev + optional: true +- name: coverage + version: 7.11.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + tomli: '' + url: https://conda.anaconda.org/conda-forge/linux-64/coverage-7.11.0-py314h67df5f8_0.conda + hash: + md5: 6ff84b39468623308dee97e5dfbafca0 + sha256: d928f6d0567807c8a09786e18966445b011ec2eb85c7e18382c0b4870cf12f17 + category: dev + optional: true +- name: cpp-expected + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/cpp-expected-1.3.1-h171cf75_0.conda + hash: + md5: d17488e343e4c5c0bd0db18b3934d517 + category: dev + optional: true +- name: cpython + version: 3.14.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.14,<3.15.0a0' + python_abi: '*' + url: https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.conda + hash: + md5: ff3061d315c4a988fa1c29c543800780 + sha256: 8e2a33b36d36820698840bf0c1ed50e5dd4bdeaa434c7b4f5e13d421225b0414 + category: dev + optional: true +- name: cryptography + version: 46.0.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.14' + libgcc: '>=14' + openssl: '>=3.5.4,<4.0a0' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.3-py314hb613cbf_0.conda + hash: + md5: f291630db5dc438b6ce37c2bb1a96516 + sha256: 4bf88483f944b5624269c926369002d58951627a369aeac1e2cd64a6aa00eb05 + category: dev + optional: true +- name: dbus + version: 1.16.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libexpat: '>=2.7.0,<3.0a0' + libgcc: '>=13' + libglib: '>=2.84.2,<3.0a0' + libstdcxx: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda + hash: + md5: 679616eb5ad4e521c83da4650860aba7 + category: dev + optional: true +- name: distlib + version: 0.4.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda + hash: + md5: 003b8ba0a94e2f1e117d0bd46aebc901 + category: dev + optional: true +- name: docker-py + version: 7.1.0 + manager: conda + platform: linux-64 + dependencies: + paramiko: '>=2.4.3' + python: '>=3.9' + pywin32-on-windows: '' + requests: '>=2.26.0' + urllib3: '>=1.26.0' + websocket-client: '>=0.32.0' + url: https://conda.anaconda.org/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda + hash: + md5: 07ce73ca6f6c1a1df5d498679fc52d9e + category: dev + optional: true +- name: doctr + version: 1.9.0 + manager: conda + platform: linux-64 + dependencies: + cryptography: '' + python: '>=3.5' + pyyaml: '' + requests: '' + url: https://conda.anaconda.org/conda-forge/noarch/doctr-1.9.0-pyhd8ed1ab_0.tar.bz2 + hash: + md5: f57b656502db0e45cc996ddbef2a9d25 + category: dev + optional: true +- name: docutils + version: 0.22.3 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda + hash: + md5: abbe8c85619c87c4f4f61b44173434af + sha256: ab77ee201665dc654248e3a250bd6fe05db0a1892716a6feb8da4a3162518624 + category: dev + optional: true +- name: exceptiongroup + version: 1.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + typing_extensions: '>=4.6.0' + url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda + hash: + md5: 72e42d28960d875c7654614f8b50939a + category: dev + optional: true +- name: execnet + version: 2.1.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda + hash: + md5: a71efeae2c160f6789900ba2631a2c90 + category: dev + optional: true +- name: filelock + version: 3.20.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda + hash: + md5: 66b8b26023b8efdf8fcb23bac4b6325d + category: dev + optional: true +- name: flaky + version: 3.8.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_1.conda + hash: + md5: 7e081d00fdcba21b76658c1649691836 + category: dev + optional: true +- name: fmt + version: 12.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/fmt-12.0.0-h2b0788b_0.conda + hash: + md5: d90bf58b03d9a958cb4f9d3de539af17 + sha256: b546c4eb5e11c2d8eab0685593e078fd0cd483e467d5d6e307d60d887488230f + category: dev + optional: true +- name: freezegun + version: 1.5.5 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + python-dateutil: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/freezegun-1.5.5-pyhd8ed1ab_0.conda + hash: + md5: 0fdb8ebc8dbdb62530ff73181ae63554 + category: dev + optional: true +- name: ghp-import + version: 2.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + python-dateutil: '>=2.8.1' + url: https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda + hash: + md5: 93f742fe078a7b34c29a182958d4d765 + category: dev + optional: true +- name: gitdb + version: 4.0.12 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + smmap: '>=3.0.1,<6' + url: https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda + hash: + md5: 7c14f3706e099f8fcd47af2d494616cc + category: dev + optional: true +- name: gitpython + version: 3.1.45 + manager: conda + platform: linux-64 + dependencies: + gitdb: '>=4.0.1,<5' + python: '>=3.9' + typing_extensions: '>=3.10.0.2' + url: https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda + hash: + md5: b91d463ea8be13bcbe644ae8bc99c39f + category: dev + optional: true +- name: h2 + version: 4.3.0 + manager: conda + platform: linux-64 + dependencies: + hpack: '>=4.1,<5' + hyperframe: '>=6.1,<7' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda + hash: + md5: 164fc43f0b53b6e3a7bc7dce5e4f1dc9 + category: dev + optional: true +- name: hpack + version: 4.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda + hash: + md5: 0a802cb9888dd14eeefc611f05c40b6e + category: dev + optional: true +- name: hyperframe + version: 6.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda + hash: + md5: 8e6923fc12f1fe8f8c4e5c9f343256ac + category: dev + optional: true +- name: icu + version: '75.1' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda + hash: + md5: 8b189310083baabfb622af68fd9d3ae3 + category: main + optional: false +- name: id + version: 1.5.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + requests: '' + url: https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda + hash: + md5: d37314c8f553e3b4b44d113a0ee10196 + sha256: 161e3eb5aba887d0329bb4099f72cb92eed9072cf63f551d08540480116e69a2 + category: dev + optional: true +- name: identify + version: 2.6.15 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + ukkonen: '' + url: https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda + hash: + md5: 25f954b7dae6dd7b0dc004dab74f1ce9 + sha256: 32d5007d12e5731867908cbf5345f5cd44a6c8755a2e8e63e15a184826a51f82 + category: dev + optional: true +- name: idna + version: '3.11' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda + hash: + md5: 53abe63df7e10a6ba605dc5f9f961d36 + sha256: ae89d0299ada2a3162c2614a9d26557a92aa6a77120ce142f8e0109bbf0342b0 + category: dev + optional: true +- name: importlib-metadata + version: 8.7.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + zipp: '>=3.20' + url: https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda + hash: + md5: 63ccfdc3a3ce25b027b8767eb722fca8 + category: dev + optional: true +- name: importlib_resources + version: 6.5.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + zipp: '>=3.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda + hash: + md5: c85c76dc67d75619a92f51dfbce06992 + category: dev + optional: true +- name: iniconfig + version: 2.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda + hash: + md5: 9614359868482abba1bd15ce465e3c42 + sha256: e1a9e3b1c8fe62dc3932a616c284b5d8cbe3124bbfbedcf4ce5c828cb166ee19 + category: dev + optional: true +- name: invoke + version: 2.2.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda + hash: + md5: 3a804714ed59be1969ffca10f703ec2a + sha256: 5a4e3a01f626c8de15ddada622d364e94ff28e8d6bdedf1665442ef03a4e0140 + category: dev + optional: true +- name: jaraco.classes + version: 3.4.0 + manager: conda + platform: linux-64 + dependencies: + more-itertools: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_2.conda + hash: + md5: ade6b25a6136661dadd1a43e4350b10b + category: dev + optional: true +- name: jaraco.context + version: 6.0.1 + manager: conda + platform: linux-64 + dependencies: + backports.tarfile: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.0.1-pyhd8ed1ab_0.conda + hash: + md5: bcc023a32ea1c44a790bbf1eae473486 + category: dev + optional: true +- name: jaraco.functools + version: 4.3.0 + manager: conda + platform: linux-64 + dependencies: + more-itertools: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.3.0-pyhd8ed1ab_0.conda + hash: + md5: b86839fa387a5b904846e77c84167e57 + category: dev + optional: true +- name: jeepney + version: 0.9.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda + hash: + md5: b4b91eb14fbe2f850dd2c5fc20676c0d + category: dev + optional: true +- name: jinja2 + version: 3.1.6 + manager: conda + platform: linux-64 + dependencies: + markupsafe: '>=2.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda + hash: + md5: 446bd6c8cb26050d528881df495ce646 + category: dev + optional: true +- name: keyring + version: 25.6.0 + manager: conda + platform: linux-64 + dependencies: + __linux: '' + importlib-metadata: '>=4.11.4' + importlib_resources: '' + jaraco.classes: '' + jaraco.context: '' + jaraco.functools: '' + jeepney: '>=0.4.2' + python: '>=3.9' + secretstorage: '>=3.2' + url: https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyha804496_0.conda + hash: + md5: cdd58ab99c214b55d56099108a914282 + category: dev + optional: true +- name: keyutils + version: 1.6.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda + hash: + md5: b38117a3c920364aff79f870c984b4a3 + category: dev + optional: true +- name: krb5 + version: 1.21.3 + manager: conda + platform: linux-64 + dependencies: + keyutils: '>=1.6.1,<2.0a0' + libedit: '>=3.1.20191231,<4.0a0' + libgcc-ng: '>=12' + libstdcxx-ng: '>=12' + openssl: '>=3.3.1,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda + hash: + md5: 3f43953b7d3fb3aaa1d0d0723d91e368 + category: dev + optional: true +- name: ld_impl_linux-64 + version: '2.44' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_4.conda + hash: + md5: c94ab6ff54ba5172cf1c58267005670f + sha256: 96b6900ca0489d9e5d0318a6b49f8eff43fd85fef6e07cb0c25344ee94cd7a3a + category: main + optional: false +- name: libarchive + version: 3.8.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + libgcc: '>=14' + liblzma: '>=5.8.1,<6.0a0' + libxml2: '' + libxml2-16: '>=2.14.6' + libzlib: '>=1.3.1,<2.0a0' + lz4-c: '>=1.10.0,<1.11.0a0' + lzo: '>=2.10,<3.0a0' + openssl: '>=3.5.4,<4.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.2-gpl_h7be2006_100.conda + hash: + md5: 9d0eaa26e3c5d7af747b3ddee928327b + sha256: 3fb3baf9f6ac39a4720f91dbb6fdace0208fd76500d362e8d6ae985a8bd42451 + category: dev + optional: true +- name: libcurl + version: 8.17.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + krb5: '>=1.21.3,<1.22.0a0' + libgcc: '>=14' + libnghttp2: '>=1.67.0,<2.0a0' + libssh2: '>=1.11.1,<2.0a0' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.5.4,<4.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda + hash: + md5: 01e149d4a53185622dc2e788281961f2 + sha256: 100e29ca864c32af15a5cc354f502d07b2600218740fdf2439fa7d66b50b3529 + category: dev + optional: true +- name: libedit + version: 3.1.20250104 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + ncurses: '>=6.5,<7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda + hash: + md5: c277e0a4d549b03ac1e9d6cbbe3d017b + category: dev + optional: true +- name: libev + version: '4.33' + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda + hash: + md5: 172bf1cd1ff8629f2b1179945ed45055 + category: dev + optional: true +- name: libexpat + version: 2.7.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda + hash: + md5: 4211416ecba1866fab0c6470986c22d6 + category: main + optional: false +- name: libffi + version: 3.5.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda + hash: + md5: 35f29eec58405aaf55e01cb470d8c26a + sha256: 25cbdfa65580cfab1b8d15ee90b4c9f1e0d72128f1661449c9a999d341377d54 + category: main + optional: false +- name: libgcc + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + _openmp_mutex: '>=4.5' + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda + hash: + md5: c0374badb3a5d4b1372db28d19462c53 + category: main + optional: false +- name: libgcc-ng + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + libgcc: 15.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda + hash: + md5: 280ea6eee9e2ddefde25ff799c4f0363 + category: main + optional: false +- name: libglib + version: 2.86.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libffi: '>=3.5.2,<3.6.0a0' + libgcc: '>=14' + libiconv: '>=1.18,<2.0a0' + libzlib: '>=1.3.1,<2.0a0' + pcre2: '>=10.46,<10.47.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.1-h32235b2_1.conda + hash: + md5: 8eef974130690cf385b569ecdeed2cf0 + sha256: 2421c8a9ac34a7406cff53b7cb96752177edbd245b0782ee88ef3fee5a732aa4 + category: dev + optional: true +- name: libgomp + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda + hash: + md5: f7b4d76975aac7e5d9e6ad13845f92fe + category: main + optional: false +- name: libiconv + version: '1.18' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda + hash: + md5: 915f5995e94f60e9a4826e0b0920ee88 + category: dev + optional: true +- name: liblzma + version: 5.8.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda + hash: + md5: 1a580f7796c7bf6393fddb8bbbde58dc + category: main + optional: false +- name: libmamba + version: 2.3.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cpp-expected: '>=1.3.1,<1.3.2.0a0' + fmt: '>=12.0.0,<12.1.0a0' + libarchive: '>=3.8.2,<3.9.0a0' + libcurl: '>=8.14.1,<9.0a0' + libgcc: '>=14' + libsolv: '>=0.7.35,<0.8.0a0' + libstdcxx: '>=14' + nlohmann_json-abi: 3.12.0 + openssl: '>=3.5.4,<4.0a0' + reproc: '>=14.2,<15.0a0' + reproc-cpp: '>=14.2,<15.0a0' + simdjson: '>=4.0.7,<4.1.0a0' + yaml-cpp: '>=0.8.0,<0.9.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libmamba-2.3.3-h09abcb8_2.conda + hash: + md5: afca7d1181d858718852e4d8402c05ac + sha256: fb32dac071b66a23afe866acf2174bf3fa911cb45a714027328232e86592368c + category: dev + optional: true +- name: libmpdec + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda + hash: + md5: c7e925f37e3b40d893459e625f6a53f1 + category: main + optional: false +- name: libnghttp2 + version: 1.67.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + c-ares: '>=1.34.5,<2.0a0' + libev: '>=4.33,<5.0a0' + libgcc: '>=14' + libstdcxx: '>=14' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.5.2,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda + hash: + md5: b499ce4b026493a13774bcf0f4c33849 + category: dev + optional: true +- name: libsodium + version: 1.0.20 + manager: conda + platform: linux-64 + dependencies: + libgcc-ng: '>=12' + url: https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda + hash: + md5: a587892d3c13b6621a6091be690dbca2 + category: dev + optional: true +- name: libsolv + version: 0.7.35 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.35-h9463b59_0.conda + hash: + md5: 21769ce326958ec230cdcbd0f2ad97eb + category: dev + optional: true +- name: libsqlite + version: 3.51.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' + libgcc: '>=14' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda + hash: + md5: 729a572a3ebb8c43933b30edcc628ceb + sha256: 4c992dcd0e34b68f843e75406f7f303b1b97c248d18f3c7c330bdc0bc26ae0b3 + category: main + optional: false +- name: libssh2 + version: 1.11.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libzlib: '>=1.3.1,<2.0a0' + openssl: '>=3.5.0,<4.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda + hash: + md5: eecce068c7e4eddeb169591baac20ac4 + category: dev + optional: true +- name: libstdcxx + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: 15.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda + hash: + md5: 5b767048b1b3ee9a954b06f4084f93dc + category: main + optional: false +- name: libstdcxx-ng + version: 15.2.0 + manager: conda + platform: linux-64 + dependencies: + libstdcxx: 15.2.0 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda + hash: + md5: f627678cf829bd70bccf141a19c3ad3e + category: main + optional: false +- name: libuuid + version: 2.41.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda + hash: + md5: 80c07c68d2f6870250959dcc95b209d1 + category: main + optional: false +- name: libxml2 + version: 2.15.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' + libgcc: '>=14' + libiconv: '>=1.18,<2.0a0' + liblzma: '>=5.8.1,<6.0a0' + libxml2-16: 2.15.1 + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda + hash: + md5: e512be7dc1f84966d50959e900ca121f + sha256: ec0735ae56c3549149eebd7dc22c0bed91fd50c02eaa77ff418613ddda190aa8 + category: dev + optional: true +- name: libxml2-16 + version: 2.15.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + icu: '>=75.1,<76.0a0' + libgcc: '>=14' + libiconv: '>=1.18,<2.0a0' + liblzma: '>=5.8.1,<6.0a0' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda + hash: + md5: e7733bc6785ec009e47a224a71917e84 + sha256: 71436e72a286ef8b57d6f4287626ff91991eb03c7bdbe835280521791efd1434 + category: dev + optional: true +- name: libzlib + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda + hash: + md5: edb0dca6bc32e4f4789199455a1dbeb8 + category: main + optional: false +- name: lz4-c + version: 1.10.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda + hash: + md5: 9de5350a85c4a20c685259b889aa6393 + category: dev + optional: true +- name: lzo + version: '2.10' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda + hash: + md5: 45161d96307e3a447cc3eb5896cf6f8c + category: dev + optional: true +- name: mamba + version: 2.3.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libmamba: '>=2.3.3,<2.4.0a0' + reproc: '>=14.2,<15.0a0' + reproc-cpp: '>=14.2,<15.0a0' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/mamba-2.3.3-h4396525_2.conda + hash: + md5: 7eb628c8e865dd6e33a46ade708de780 + sha256: 5b07dcfcaf67e2d843756cf79e7139ecdf13ee1f8c3734002aee729afb439393 + category: dev + optional: true +- name: markdown + version: '3.10' + manager: conda + platform: linux-64 + dependencies: + importlib-metadata: '>=4.4' + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhd8ed1ab_0.conda + hash: + md5: 1b9272ad4388efc264ff504384e2b578 + sha256: 2b889cd55574a4858955a8c517491948458a2c1c554ed3201d083319acf28a96 + category: dev + optional: true +- name: markdown-it-py + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + mdurl: '>=0.1,<1' + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda + hash: + md5: 5b5203189eb668f042ac2b0826244964 + sha256: 7b1da4b5c40385791dbc3cc85ceea9fad5da680a27d5d3cb8bfaa185e304a89e + category: dev + optional: true +- name: markupsafe + version: 3.0.3 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda + hash: + md5: fab1be106a50e20f10fe5228fd1d1651 + category: dev + optional: true +- name: mdurl + version: 0.1.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda + hash: + md5: 592132998493b3ff25fd7479396e8351 + sha256: 78c1bbe1723449c52b7a9df1af2ee5f005209f67e40b6e1d3c7619127c43b1c7 + category: dev + optional: true +- name: mergedeep + version: 1.3.4 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda + hash: + md5: d9a8fc1f01deae61735c88ec242e855c + category: dev + optional: true +- name: mkdocs + version: 1.6.1 + manager: conda + platform: linux-64 + dependencies: + click: '>=7.0' + colorama: '>=0.4' + ghp-import: '>=1.0' + importlib-metadata: '>=4.4' + jinja2: '>=2.11.1' + markdown: '>=3.3.6' + markupsafe: '>=2.0.1' + mergedeep: '>=1.3.4' + mkdocs-get-deps: '>=0.2.0' + packaging: '>=20.5' + pathspec: '>=0.11.1' + python: '>=3.9' + pyyaml: '>=5.1' + pyyaml-env-tag: '>=0.1' + watchdog: '>=2.0' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda + hash: + md5: 14661160be39d78f2b210f2cc2766059 + category: dev + optional: true +- name: mkdocs-click + version: 0.9.0 + manager: conda + platform: linux-64 + dependencies: + click: '>=8.1' + markdown: '>=3.3' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-click-0.9.0-pyh29332c3_0.conda + hash: + md5: 5fe524d35646dadfdc024c510d29330a + category: dev + optional: true +- name: mkdocs-get-deps + version: 0.2.0 + manager: conda + platform: linux-64 + dependencies: + importlib-metadata: '>=4.3' + mergedeep: '>=1.3.4' + platformdirs: '>=2.2.0' + python: '>=3.9' + pyyaml: '>=5.1' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda + hash: + md5: 84382acddb26c27c70f2de8d4c830830 + category: dev + optional: true +- name: mkdocs-include-markdown-plugin + version: 7.2.0 + manager: conda + platform: linux-64 + dependencies: + mkdocs: '>=1.4' + python: '>=3.10' + wcmatch: '' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-include-markdown-plugin-7.2.0-pyhd8ed1ab_0.conda + hash: + md5: 4e2463b17fc15bb0ce9f67a14e3846ed + sha256: 89bea7fadc8172b8084c85971a0d09004193f9f419705dc8fc67b3267a7fdf19 + category: dev + optional: true +- name: mkdocs-material + version: 9.6.23 + manager: conda + platform: linux-64 + dependencies: + babel: '>=2.10,<3.dev0' + backrefs: '>=5.7.post1,<6.dev0' + colorama: '>=0.4,<1.dev0' + jinja2: '>=3.0,<4.dev0' + markdown: '>=3.2,<4.dev0' + mkdocs: '>=1.6,<2.dev0' + mkdocs-material-extensions: '>=1.3,<2.dev0' + paginate: '>=0.5,<1.dev0' + pygments: '>=2.16,<3.dev0' + pymdown-extensions: '>=10.2,<11.dev0' + python: '' + requests: '>=2.26,<3.dev0' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.23-pyhcf101f3_0.conda + hash: + md5: b00890e53c4c652f55f3afc4290a814a + sha256: 86f84db5f028ba882546b56815fc62e03fa947e04f4933fa181d9bb29445d15e + category: dev + optional: true +- name: mkdocs-material-extensions + version: 1.3.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda + hash: + md5: de8af4000a4872e16fb784c649679c8e + category: dev + optional: true +- name: more-itertools + version: 10.8.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhd8ed1ab_0.conda + hash: + md5: d7620a15dc400b448e1c88a981b23ddd + category: dev + optional: true +- name: mypy + version: 1.18.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + mypy_extensions: '>=1.0.0' + pathspec: '>=0.9.0' + psutil: '>=4.0' + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + typing_extensions: '>=4.6.0' + url: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.18.2-py314h5bd0f2a_0.conda + hash: + md5: 1e87cabfdfea01d30e2ce1dd6152846f + category: dev + optional: true +- name: mypy_extensions + version: 1.1.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda + hash: + md5: e9c622e0d00fa24a6292279af3ab6d06 + category: dev + optional: true +- name: ncurses + version: '6.5' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda + hash: + md5: 47e340acb35de30501a76c7c799c41d7 + category: main + optional: false +- name: nh3 + version: 0.3.2 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + _python_abi3_support: 1.* + cpython: '>=3.10' + libgcc: '>=14' + python: '' + url: https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.2-py310h1570de5_0.conda + hash: + md5: 383616287311316d120b028aac89f6f4 + sha256: f6095c759df15baa9cccc20394b21667f4d0440f3c432e07539c3b47ef195c0b + category: dev + optional: true +- name: nlohmann_json-abi + version: 3.12.0 + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda + hash: + md5: 59659d0213082bc13be8500bab80c002 + category: dev + optional: true +- name: nodeenv + version: 1.9.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + setuptools: '' + url: https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda + hash: + md5: 7ba3f09fceae6a120d664217e58fe686 + category: dev + optional: true +- name: openssl + version: 3.5.4 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + ca-certificates: '' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda + hash: + md5: 14edad12b59ccbfa3910d42c72adc2a0 + category: main + optional: false +- name: packaging + version: '25.0' + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda + hash: + md5: 58335b26c38bf4a20f399384c33cbcf9 + category: dev + optional: true +- name: paginate + version: 0.5.7 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda + hash: + md5: c3f35453097faf911fd3f6023fc2ab24 + category: dev + optional: true +- name: paramiko + version: 4.0.0 + manager: conda + platform: linux-64 + dependencies: + bcrypt: '>=3.2' + cryptography: '>=3.3' + invoke: '>=2.0' + pynacl: '>=1.5' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda + hash: + md5: 1a884d2b1ea21abfb73911dcdb8342e4 + category: dev + optional: true +- name: pathspec + version: 0.12.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda + hash: + md5: 617f15191456cc6a13db418a275435e5 + category: dev + optional: true +- name: pcre2 + version: '10.46' + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + libgcc: '>=14' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda + hash: + md5: 7fa07cb0fb1b625a089ccc01218ee5b1 + category: dev + optional: true +- name: pip + version: '25.2' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.13.0a0' + url: https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh145f28c_0.conda + hash: + md5: e7ab34d5a93e0819b62563c78635d937 + category: main + optional: false +- name: platformdirs + version: 4.5.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda + hash: + md5: 5c7a868f8241e64e1cf5fdf4962f23e2 + category: dev + optional: true +- name: pluggy + version: 1.6.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda + hash: + md5: 7da7ccd349dbf6487a7778579d2bb971 + category: dev + optional: true +- name: pre-commit + version: 4.3.0 + manager: conda + platform: linux-64 + dependencies: + cfgv: '>=2.0.0' + identify: '>=1.0.0' + nodeenv: '>=0.11.1' + python: '>=3.9' + pyyaml: '>=5.1' + virtualenv: '>=20.10.0' + url: https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda + hash: + md5: bc6c44af2a9e6067dd7e949ef10cdfba + category: dev + optional: true +- name: psutil + version: 7.1.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.3-py314h0f05182_0.conda + hash: + md5: aee1c9aecc66339ea6fd89e6a143a282 + sha256: 7c5d69ad61fe4e0d3657185f51302075ef5b9e34686238c6b3bde102344d4390 + category: dev + optional: true +- name: pycparser + version: '2.22' + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda + hash: + md5: 12c566707c80111f9799308d9e265aef + category: dev + optional: true +- name: pygments + version: 2.19.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda + hash: + md5: 6b6ece66ebcae2d5f326c77ef2c5a066 + category: dev + optional: true +- name: pymdown-extensions + version: 10.16.1 + manager: conda + platform: linux-64 + dependencies: + markdown: '>=3.6' + python: '>=3.9' + pyyaml: '' + url: https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda + hash: + md5: 26e013bc453e643991cfa9b76911fb79 + category: dev + optional: true +- name: pynacl + version: 1.6.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.4.1' + libgcc: '>=14' + libsodium: '>=1.0.20,<1.0.21.0a0' + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + six: '' + url: https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.0-py314h5bd0f2a_0.conda + hash: + md5: 287eabdd0b0a176376968b84c2707bd8 + category: dev + optional: true +- name: pyproject_hooks + version: 1.2.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + tomli: '>=1.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda + hash: + md5: d4582021af437c931d7d77ec39007845 + category: dev + optional: true +- name: pysocks + version: 1.7.1 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda + hash: + md5: 461219d1a5bd61342293efa2c0c90eac + category: dev + optional: true +- name: pytest + version: 8.4.2 + manager: conda + platform: linux-64 + dependencies: + colorama: '>=0.4' + exceptiongroup: '>=1' + iniconfig: '>=1' + packaging: '>=20' + pluggy: '>=1.5,<2' + pygments: '>=2.7.2' + python: '' + tomli: '>=1' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda + hash: + md5: da0c42269086f5170e2b296878ec13a6 + sha256: 39f41a52eb6f927caf5cd42a2ff98a09bb850ce9758b432869374b6253826962 + category: dev + optional: true +- name: pytest-cov + version: 7.0.0 + manager: conda + platform: linux-64 + dependencies: + coverage: '>=7.10.6' + pluggy: '>=1.2' + pytest: '>=7' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda + hash: + md5: 6891acad5e136cb62a8c2ed2679d6528 + category: dev + optional: true +- name: pytest-split + version: 0.10.0 + manager: conda + platform: linux-64 + dependencies: + pytest: '>=5.0.0,<9.0.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-split-0.10.0-pyhff2d567_0.conda + hash: + md5: 3bd32c44526b455aa146d8fdb27a65b3 + category: dev + optional: true +- name: pytest-timeout + version: 2.4.0 + manager: conda + platform: linux-64 + dependencies: + pytest: '>=7.0.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda + hash: + md5: 52a50ca8ea1b3496fbd3261bea8c5722 + category: dev + optional: true +- name: pytest-xdist + version: 3.8.0 + manager: conda + platform: linux-64 + dependencies: + execnet: '>=2.1' + pytest: '>=7.0.0' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda + hash: + md5: 8375cfbda7c57fbceeda18229be10417 + category: dev + optional: true +- name: python + version: 3.14.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + bzip2: '>=1.0.8,<2.0a0' + ld_impl_linux-64: '>=2.36.1' + libexpat: '>=2.7.1,<3.0a0' + libffi: '>=3.5.2,<3.6.0a0' + libgcc: '>=14' + liblzma: '>=5.8.1,<6.0a0' + libmpdec: '>=4.0.0,<5.0a0' + libsqlite: '>=3.50.4,<4.0a0' + libuuid: '>=2.41.2,<3.0a0' + libzlib: '>=1.3.1,<2.0a0' + ncurses: '>=6.5,<7.0a0' + openssl: '>=3.5.4,<4.0a0' + pip: '' + python_abi: 3.14.* + readline: '>=8.2,<9.0a0' + tk: '>=8.6.13,<8.7.0a0' + tzdata: '' + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda + hash: + md5: 0a19d2cc6eb15881889b0c6fa7d6a78d + sha256: 76d750045b94fded676323bfd01975a26a474023635735773d0e4d80aaa72518 + category: main + optional: false +- name: python-build + version: 1.3.0 + manager: conda + platform: linux-64 + dependencies: + colorama: '' + importlib-metadata: '>=4.6' + packaging: '>=19.0' + pyproject_hooks: '' + python: '>=3.9' + tomli: '>=1.1.0' + url: https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda + hash: + md5: ed5d43e9ef92cc2a9872f9bdfe94b984 + category: dev + optional: true +- name: python-dateutil + version: 2.9.0.post0 + manager: conda + platform: linux-64 + dependencies: + python: '' + six: '>=1.5' + url: https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda + hash: + md5: 5b8d21249ff20967101ffa321cab24e8 + category: dev + optional: true +- name: python-gil + version: 3.14.0 + manager: conda + platform: linux-64 + dependencies: + cpython: 3.14.0.* + python_abi: '*' + url: https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda + hash: + md5: d152e423d80848fe95f0f4b43448030e + sha256: e68c9796fba0825ebc1338ceb94496683ab7d45dcd281b378ec2a56365d3c555 + category: dev + optional: true +- name: python_abi + version: '3.14' + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda + hash: + md5: 0539938c55b6b1a59b560e843ad864a4 + category: main + optional: false +- name: pytz + version: '2025.2' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda + hash: + md5: bc8e3267d44011051f2eb14d22fb0960 + category: dev + optional: true +- name: pywin32-on-windows + version: 0.1.0 + manager: conda + platform: linux-64 + dependencies: + __unix: '' + python: '>=2.7' + url: https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2 + hash: + md5: 2807a0becd1d986fe1ef9b7f8135f215 + category: dev + optional: true +- name: pyyaml + version: 6.0.3 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10.*' + yaml: '' + url: https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda + hash: + md5: b12f41c0d7fb5ab81709fcc86579688f + category: dev + optional: true +- name: pyyaml-env-tag + version: '1.1' + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + pyyaml: '' + url: https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda + hash: + md5: e8e53c4150a1bba3b160eacf9d53a51b + category: dev + optional: true +- name: readline + version: '8.2' + manager: conda + platform: linux-64 + dependencies: + libgcc: '>=13' + ncurses: '>=6.5,<7.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda + hash: + md5: 283b96675859b20a825f8fa30f311446 + category: main + optional: false +- name: readme_renderer + version: '44.0' + manager: conda + platform: linux-64 + dependencies: + cmarkgfm: '>=0.8.0' + docutils: '>=0.21.2' + nh3: '>=0.2.14' + pygments: '>=2.5.1' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda + hash: + md5: c58dd5d147492671866464405364c0f1 + sha256: 66f3adf6aaabf977cfcc22cb65607002b1de4a22bc9fac7be6bb774bc6f85a3a + category: dev + optional: true +- name: reproc + version: 14.2.5.post0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda + hash: + md5: 69fbc0a9e42eb5fe6733d2d60d818822 + category: dev + optional: true +- name: reproc-cpp + version: 14.2.5.post0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + reproc: 14.2.5.post0 + url: https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda + hash: + md5: 828302fca535f9cfeb598d5f7c204323 + category: dev + optional: true +- name: requests + version: 2.32.5 + manager: conda + platform: linux-64 + dependencies: + certifi: '>=2017.4.17' + charset-normalizer: '>=2,<4' + idna: '>=2.5,<4' + python: '>=3.9' + urllib3: '>=1.21.1,<3' + url: https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda + hash: + md5: db0c6b99149880c8ba515cf4abe93ee4 + category: dev + optional: true +- name: requests-mock + version: 1.12.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + requests: '>=2.22,<3' + url: https://conda.anaconda.org/conda-forge/noarch/requests-mock-1.12.1-pyhd8ed1ab_1.conda + hash: + md5: 8212b70c509aaa0fa6c8fa974f784b2e + category: dev + optional: true +- name: requests-toolbelt + version: 1.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + requests: '>=2.0.1,<3.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda + hash: + md5: 66de8645e324fda0ea6ef28c2f99a2ab + category: dev + optional: true +- name: rfc3986 + version: 2.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda + hash: + md5: 43e14f832d7551e5a8910672bfc3d8c6 + sha256: d617373ba1a5108336cb87754d030b9e384dcf91796d143fa60fe61e76e5cfb0 + category: dev + optional: true +- name: rich + version: 14.2.0 + manager: conda + platform: linux-64 + dependencies: + markdown-it-py: '>=2.2.0' + pygments: '>=2.13.0,<3.0.0' + python: '' + typing_extensions: '>=4.0.0,<5.0.0' + url: https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda + hash: + md5: a247579d8a59931091b16a1e932bbed6 + sha256: edfb44d0b6468a8dfced728534c755101f06f1a9870a7ad329ec51389f16b086 + category: dev + optional: true +- name: ruff + version: 0.14.3 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '' + url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.3-h813ae00_1.conda + hash: + md5: 57df47ec0ca6c4ab8f46865a8933f0cd + sha256: 05a2d6a1123d31573163629ae5d47c02c2576b4d2c5110320d063ccd09f97c12 + category: dev + optional: true +- name: secretstorage + version: 3.4.0 + manager: conda + platform: linux-64 + dependencies: + cryptography: '>=2.0' + dbus: '' + jeepney: '>=0.6' + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.0-py314hdafbbf9_0.conda + hash: + md5: a804c54ce3a1aed268b13657b79825b8 + category: dev + optional: true +- name: setuptools + version: 80.9.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda + hash: + md5: 4de79c071274a53dcaf2a8c749d1499e + category: dev + optional: true +- name: simdjson + version: 4.0.7 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + libstdcxx: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/simdjson-4.0.7-hb700be7_0.conda + hash: + md5: cc9c262a71dd584aa5a3a22fc963255c + category: dev + optional: true +- name: six + version: 1.17.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda + hash: + md5: 3339e3b65d58accf4ca4fb8748ab16b3 + category: dev + optional: true +- name: smmap + version: 5.0.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda + hash: + md5: 87f47a78808baf2fa1ea9c315a1e48f1 + category: dev + optional: true +- name: tk + version: 8.6.13 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda + hash: + md5: a0116df4f4ed05c303811a837d5b39d8 + category: main + optional: false +- name: toml + version: 0.10.2 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda + hash: + md5: b0dd904de08b7db706167240bf37b164 + category: dev + optional: true +- name: tomli + version: 2.3.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda + hash: + md5: d2732eb636c264dc9aa4cbee404b1a53 + category: dev + optional: true +- name: twine + version: 6.2.0 + manager: conda + platform: linux-64 + dependencies: + id: '' + importlib-metadata: '>=3.6' + keyring: '>=21.2.0' + packaging: '>=24.0' + python: '' + readme_renderer: '>=35.0' + requests: '>=2.20' + requests-toolbelt: '>=0.8.0,!=0.9.0' + rfc3986: '>=1.4.0' + rich: '>=12.0.0' + urllib3: '>=1.26.0' + url: https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda + hash: + md5: 901a86453fa6183e914b937643619a03 + sha256: 0370098cab22773e33755026bf78539c2f05645fce7dcc9713d01e21950756bb + category: dev + optional: true +- name: types-click + version: 7.1.8 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-click-7.1.8-pyhd8ed1ab_1.conda + hash: + md5: 08ed65e279de69322843b075679567ea + category: dev + optional: true +- name: types-click-default-group + version: 1.2.0.20250513 + manager: conda + platform: linux-64 + dependencies: + click: '>=8.0.0' + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/types-click-default-group-1.2.0.20250513-pyhe01879c_0.conda + hash: + md5: 335926a07f57d325d0d6966bf36eee0b + category: dev + optional: true +- name: types-filelock + version: 3.2.7 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-filelock-3.2.7-pyhd8ed1ab_1.conda + hash: + md5: 3f1356104d409d6deba0c689f3b2c602 + category: dev + optional: true +- name: types-freezegun + version: 1.1.10 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-freezegun-1.1.10-pyhd8ed1ab_1.conda + hash: + md5: 0b609b66e56bbe70d97cd52ad24058fb + category: dev + optional: true +- name: types-pyyaml + version: 6.0.12.20250915 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_0.conda + hash: + md5: 3c9919ecee97547fa14fea57e2a9bb54 + category: dev + optional: true +- name: types-requests + version: 2.32.4.20250913 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + urllib3: '>=2' + url: https://conda.anaconda.org/conda-forge/noarch/types-requests-2.32.4.20250913-pyhd8ed1ab_0.conda + hash: + md5: 829c891bfd4147c25b030455d3a57a3a + category: dev + optional: true +- name: types-setuptools + version: 80.9.0.20250822 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/types-setuptools-80.9.0.20250822-pyhcf101f3_0.conda + hash: + md5: 6404dcec3d8f8b8fe540516837aa08ec + category: dev + optional: true +- name: types-toml + version: 0.10.8.20240310 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda + hash: + md5: 353b9704e4851a6f210e641d3595755f + category: dev + optional: true +- name: typing_extensions + version: 4.15.0 + manager: conda + platform: linux-64 + dependencies: + python: '' + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda + hash: + md5: 0caa1af407ecff61170c9437a808404d + category: dev + optional: true +- name: tzdata + version: 2025b + manager: conda + platform: linux-64 + dependencies: {} + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda + hash: + md5: 4222072737ccff51314b5ece9c7d6f5a + category: main + optional: false +- name: ukkonen + version: 1.0.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '' + libgcc: '>=14' + libstdcxx: '>=14' + python: '>=3.14,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py314h9891dd4_6.conda + hash: + md5: 28303a78c48916ab07b95ffdbffdfd6c + sha256: ef6753f6febaa74d35253e4e0dd09dc9497af8e370893bd97c479f59346daa57 + category: dev + optional: true +- name: urllib3 + version: 2.5.0 + manager: conda + platform: linux-64 + dependencies: + brotli-python: '>=1.0.9' + h2: '>=4,<5' + pysocks: '>=1.5.6,<2.0,!=1.5.7' + python: '>=3.9' + zstandard: '>=0.18.0' + url: https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda + hash: + md5: 436c165519e140cb08d246a4472a9d6a + category: dev + optional: true +- name: virtualenv + version: 20.35.4 + manager: conda + platform: linux-64 + dependencies: + distlib: '>=0.3.7,<1' + filelock: '>=3.12.2,<4' + platformdirs: '>=3.9.1,<5' + python: '>=3.10' + typing_extensions: '>=4.13.2' + url: https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda + hash: + md5: cfccfd4e8d9de82ed75c8e2c91cab375 + sha256: 77193c99c6626c58446168d3700f9643d8c0dab1f6deb6b9dd039e6872781bfb + category: dev + optional: true +- name: watchdog + version: 6.0.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.14.0rc2,<3.15.0a0' + python_abi: 3.14.* + pyyaml: '>=3.10' + url: https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py314hdafbbf9_1.conda + hash: + md5: 099125fcb130e9fe134c6b610f33b0e1 + category: dev + optional: true +- name: wcmatch + version: '10.1' + manager: conda + platform: linux-64 + dependencies: + bracex: '>=2.1.1' + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/wcmatch-10.1-pyhd8ed1ab_0.conda + hash: + md5: b045a877087e3bbdd36fe460e7f5cc55 + category: dev + optional: true +- name: websocket-client + version: 1.9.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.10' + url: https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda + hash: + md5: 2f1ed718fcd829c184a6d4f0f2e07409 + category: dev + optional: true +- name: wheel + version: 0.45.1 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda + hash: + md5: 75cb7132eb58d97896e173ef12ac9986 + category: dev + optional: true +- name: yaml + version: 0.2.5 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + url: https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda + hash: + md5: a77f85f77be52ff59391544bfe73390a + category: dev + optional: true +- name: yaml-cpp + version: 0.8.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + url: https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda + hash: + md5: 92b90f5f7a322e74468bb4909c7354b5 + category: dev + optional: true +- name: zipp + version: 3.23.0 + manager: conda + platform: linux-64 + dependencies: + python: '>=3.9' + url: https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda + hash: + md5: df5e78d904988eb55042c0c97446079f + category: dev + optional: true +- name: zizmor + version: 1.14.1 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=14' + python: '>=3.14.0rc3,<3.15.0a0' + python_abi: 3.14.* + url: https://conda.anaconda.org/conda-forge/linux-64/zizmor-1.14.1-py314ha5689aa_0.conda + hash: + md5: 1f0180642729883f29c47e11d857e786 + category: dev + optional: true +- name: zstandard + version: 0.25.0 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + cffi: '>=1.11' + libgcc: '>=14' + python: '' + python_abi: 3.14.* + zstd: '>=1.5.7,<1.6.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h31f8a6b_0.conda + hash: + md5: 68bd13651618354987763f746ee1fadc + category: dev + optional: true +- name: zstd + version: 1.5.7 + manager: conda + platform: linux-64 + dependencies: + __glibc: '>=2.17,<3.0.a0' + libgcc: '>=13' + libstdcxx: '>=13' + libzlib: '>=1.3.1,<2.0a0' + url: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda + hash: + md5: 6432cb5d4ac0046c3ac0a8a0f95842f9 + category: main + optional: false +- name: ty + version: 0.0.1a25 + manager: pip + platform: linux-64 + dependencies: {} + url: https://files.pythonhosted.org/packages/57/d3/01ecc23bbd8f3e0dfbcf9172d06d84e88155c5f416f1491137e8066fd859/ty-0.0.1a25-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl + hash: + sha256: 0a90d897a7c1a5ae9b41a4c7b0a42262a06361476ad88d783dbedd7913edadbc + category: dev + optional: true From b6aeaf98490cc1bbb07aa6f10de8b689bb92dd2f Mon Sep 17 00:00:00 2001 From: Ben Mares Date: Thu, 6 Nov 2025 22:04:28 +0100 Subject: [PATCH 05/10] Generate lockfiles with both conda and mamba --- .../04-run-conda-lock.sh | 29 +++++-- .../04-test-conda-lock-with-pkgs.py | 81 +++++++++++++------ tests/test-corrupt-repodata/04.Dockerfile | 2 +- tests/test-corrupt-repodata/README.md | 56 +++++++++---- 4 files changed, 121 insertions(+), 47 deletions(-) diff --git a/tests/test-corrupt-repodata/04-run-conda-lock.sh b/tests/test-corrupt-repodata/04-run-conda-lock.sh index d65cb416e..f0f34a71f 100644 --- a/tests/test-corrupt-repodata/04-run-conda-lock.sh +++ b/tests/test-corrupt-repodata/04-run-conda-lock.sh @@ -31,15 +31,30 @@ echo "" echo "Copying pkgs directory to writable location..." cp -r /custom-pkgs-ro/. ~/custom-pkgs-writeable/ -# Run conda-lock to generate the lockfile -# It will now read from the populated cache which has corrupt repodata_record.json files -echo "Running conda-lock..." +# Run conda-lock to generate lockfiles with both conda and mamba +echo "Running conda-lock with conda executable..." micromamba run -n base conda-lock lock \ --micromamba \ - -f /workspace/dev-environment.yaml \ - -p linux-64 \ - --lockfile /tmp/lockfile.yml + --file=/workspace/dev-environment.yaml \ + --platform=linux-64 \ + --conda=/opt/conda/standalone_conda/conda.exe \ + --lockfile=/tmp/lockfile-conda.yml echo "" -echo "Lockfile generated at /tmp/lockfile.yml" +echo "Recopying pkgs directory to ensure corrupt metadata for second run..." +cp -r /custom-pkgs-ro/. ~/custom-pkgs-writeable/ + +echo "" +echo "Running conda-lock with mamba executable..." +micromamba run -n base conda-lock lock \ + --micromamba \ + --file=/workspace/dev-environment.yaml \ + --platform=linux-64 \ + --conda=/opt/conda/bin/mamba \ + --lockfile=/tmp/lockfile-mamba.yml + +echo "" +echo "Lockfiles generated:" +echo " /tmp/lockfile-conda.yml" +echo " /tmp/lockfile-mamba.yml" diff --git a/tests/test-corrupt-repodata/04-test-conda-lock-with-pkgs.py b/tests/test-corrupt-repodata/04-test-conda-lock-with-pkgs.py index 31c25971a..31320006f 100755 --- a/tests/test-corrupt-repodata/04-test-conda-lock-with-pkgs.py +++ b/tests/test-corrupt-repodata/04-test-conda-lock-with-pkgs.py @@ -78,27 +78,32 @@ def remove_container_if_exists(container_name: str) -> None: ) -def generate_lockfile_with_pkgs( +def generate_lockfiles_with_pkgs( image_tag: str, pkgs_dir: Path, - output_name: str, -) -> Path: - """Generate a conda-lock lockfile using a specific pkgs directory. + pkgs_name: str, +) -> tuple[Path, Path]: + """Generate conda-lock lockfiles using a specific pkgs directory. The conda-lock source from the repo is mounted and installed in editable mode at runtime, so changes to the source code are immediately reflected. + This function generates two lockfiles: one using conda and one using mamba. + Args: image_tag: Docker image tag to use pkgs_dir: Path to the pkgs directory to mount as cache - output_name: Name for the output lockfile (without extension) + pkgs_name: Name of the pkgs directory (e.g., "2.1.0-pkgs") Returns: - Path to the generated lockfile + Tuple of (conda_lockfile_path, mamba_lockfile_path) """ - output_file = SCRIPT_DIR / f"{output_name}.yml" + output_conda = SCRIPT_DIR / f"lockfile-{pkgs_name}-lock-with-conda.yml" + output_mamba = SCRIPT_DIR / f"lockfile-{pkgs_name}-lock-with-mamba.yml" - print(f"Generating lockfile: {output_file}") + print("Generating lockfiles:") + print(f" {output_conda}") + print(f" {output_mamba}") print(f"Using pkgs directory: {pkgs_dir}") print("Using editable install from local source") print() @@ -109,9 +114,9 @@ def generate_lockfile_with_pkgs( # 1. Copy /custom-pkgs-ro to ~/custom-pkgs-writeable # 2. Configure micromamba to use ~/custom-pkgs-writeable # 3. Run explicit install to populate missing package files - # 4. Run conda-lock which reads from the now-populated corrupt cache - # We can't use --rm because we need to copy the file out after the container exits. - container_name = f"conda-lock-temp-{output_file.stem}" + # 4. Run conda-lock twice (once with conda, once with mamba) + # We can't use --rm because we need to copy the files out after the container exits. + container_name = f"conda-lock-temp-{pkgs_name}" # Ensure any prior container is removed to avoid name conflicts remove_container_if_exists(container_name) @@ -139,19 +144,35 @@ def generate_lockfile_with_pkgs( try: subprocess.run(cmd, check=True) - # Copy the lockfile out of the container - print("Copying lockfile from container...") + # Copy both lockfiles out of the container + print("Copying lockfiles from container...") + subprocess.run( + [ + "docker", + "cp", + f"{container_name}:/tmp/lockfile-conda.yml", + str(output_conda), + ], + check=True, + ) subprocess.run( - ["docker", "cp", f"{container_name}:/tmp/lockfile.yml", str(output_file)], + [ + "docker", + "cp", + f"{container_name}:/tmp/lockfile-mamba.yml", + str(output_mamba), + ], check=True, ) finally: # Clean up the container remove_container_if_exists(container_name) - print(f"Generated: {output_file}") + print("Generated:") + print(f" {output_conda}") + print(f" {output_mamba}") print() - return output_file + return output_conda, output_mamba def main() -> None: @@ -170,10 +191,6 @@ def main() -> None: default=DEFAULT_PKGS_ARCHIVE, help=f"Name of pkgs archive to use (default: {DEFAULT_PKGS_ARCHIVE})", ) - parser.add_argument( - "--output-name", - help="Name for output lockfile (default: lockfile-{pkgs_name})", - ) args = parser.parse_args() # Build the Docker image @@ -215,16 +232,30 @@ def main() -> None: tf.extractall(path=SCRIPT_DIR) print() - output_name = args.output_name or f"lockfile-{pkgs_name}" - lockfile = generate_lockfile_with_pkgs(image_tag, pkgs_dir, output_name) + # Generate lockfiles with both conda and mamba + lockfile_conda, lockfile_mamba = generate_lockfiles_with_pkgs( + image_tag, pkgs_dir, pkgs_name + ) print("=" * 60) print("Success!") - print(f"Generated lockfile: {lockfile}") + print("Generated lockfiles:") + print(f" {lockfile_conda} (using conda)") + print(f" {lockfile_mamba} (using mamba)") print() print("To compare lockfiles, run:") - print(" diff lockfile-2.1.0-pkgs.yml lockfile-2.1.1-pkgs.yml") - print(" diff lockfile-2.1.0-pkgs.yml lockfile-2.3.3-pkgs.yml") + print( + " diff lockfile-2.1.0-pkgs-lock-with-conda.yml lockfile-2.1.1-pkgs-lock-with-conda.yml" + ) + print( + " diff lockfile-2.1.0-pkgs-lock-with-mamba.yml lockfile-2.1.1-pkgs-lock-with-mamba.yml" + ) + print( + " diff lockfile-2.1.0-pkgs-lock-with-conda.yml lockfile-2.3.3-pkgs-lock-with-conda.yml" + ) + print( + " diff lockfile-2.1.0-pkgs-lock-with-mamba.yml lockfile-2.3.3-pkgs-lock-with-mamba.yml" + ) if __name__ == "__main__": diff --git a/tests/test-corrupt-repodata/04.Dockerfile b/tests/test-corrupt-repodata/04.Dockerfile index b8458ba34..db71bf05f 100644 --- a/tests/test-corrupt-repodata/04.Dockerfile +++ b/tests/test-corrupt-repodata/04.Dockerfile @@ -3,7 +3,7 @@ ARG MICROMAMBA_TAG=latest FROM mambaorg/micromamba:${MICROMAMBA_TAG} # Install Python and pip -RUN micromamba install -y -n base -c conda-forge python pip git mamba less nano +RUN micromamba install -y -n base -c conda-forge python pip git mamba less nano conda-standalone # Install conda-lock from PyPI as a base # This will be replaced with an editable install at runtime if desired diff --git a/tests/test-corrupt-repodata/README.md b/tests/test-corrupt-repodata/README.md index a10209c13..f611ea05c 100644 --- a/tests/test-corrupt-repodata/README.md +++ b/tests/test-corrupt-repodata/README.md @@ -9,6 +9,7 @@ The regression was partially fixed in [mamba-org/mamba#4071](https://github.com/ When installing packages from an explicit lockfile (e.g., `micromamba install -f 01-explicit.lock`), affected versions write incorrect metadata to `repodata_record.json` files in the package cache. ### 2.1.1–2.3.2 (full corruption) + The following fields are corrupted in `repodata_record.json`: - `depends` → `[]` (emptied) @@ -21,6 +22,7 @@ The following fields are corrupted in `repodata_record.json`: The corresponding `info/index.json` files remain correct; only `repodata_record.json` is corrupted. ### 2.3.3 (partial fix) + Upstream fixed how `depends` and `constrains` are populated: they are now copied from `info/index.json`. Other fields remain zeroed/emptied. - `depends` → copied exactly from `index.json` (key omitted if absent) @@ -86,6 +88,7 @@ diff -r 2.1.0-pkgs/ 2.3.3-pkgs/ ``` The corrupt versions will have different corruption patterns: + - **2.1.1–2.3.2**: Full corruption — `depends`/`constrains` emptied; `license`/`timestamp`/`build_number`/`track_features` zeroed/empty - **2.3.3**: Partial fix — `depends`/`constrains` copied from `index.json` (empty constrains omitted); other fields still zeroed/empty @@ -104,6 +107,7 @@ python 03-clobber-pkgs.py --corrupt-version=2.3.3 --pattern=2.3.3 ``` This script: + 1. Extracts the input and corrupt pkgs archives (always fresh) 2. Copies the good pkgs to `clobbered-{version}-pkgs/` 3. Applies the specified corruption pattern to all `repodata_record.json` files: @@ -121,38 +125,60 @@ The extracted directories are kept for inspection after the script completes. To test how conda-lock behaves when reading from different package caches, use the fourth script: ```bash -# Generate lockfile using the good 2.1.0 cache +# Generate lockfiles using the good 2.1.0 cache (tests both conda and mamba) python 04-test-conda-lock-with-pkgs.py --pkgs-archive 2.1.0-pkgs.tar.gz -# Generate lockfile using the corrupt 2.1.1 cache +# Generate lockfiles using the corrupt 2.1.1 cache python 04-test-conda-lock-with-pkgs.py --pkgs-archive 2.1.1-pkgs.tar.gz -# Generate lockfile using the corrupt 2.3.3 cache +# Generate lockfiles using the corrupt 2.3.3 cache python 04-test-conda-lock-with-pkgs.py --pkgs-archive 2.3.3-pkgs.tar.gz ``` This will: + 1. Build a Docker image with conda-lock installed from PyPI 2. Extract the specified `.tar.gz` archive (always fresh) 3. Mount the extracted pkgs directory as `/custom-pkgs-ro` (read-only) 4. Mount the explicit lockfile (`01-explicit.lock`) for populating the cache 5. Inside the container: + - Setup conda-lock in editable mode from the mounted source + - Configure micromamba to use `~/custom-pkgs-writeable/` as the first pkgs directory - Warm the default package cache with `micromamba create -n temp-populate -y -f /explicit.lock` - - Copy the pkgs directory to a writable location (`~/custom-pkgs-writeable`) - - Configure micromamba to use the writable pkgs directory first - - Run conda-lock which reads corrupt metadata from the custom pkgs and uses warmed files -6. Save the lockfile as `lockfile-{pkgs-dir}.yml` + - Copy the custom pkgs directory to `~/custom-pkgs-writeable/` (overwrites the warmed cache metadata) + - Run conda-lock with `--conda=/opt/conda/standalone_conda/conda.exe` → `lockfile-{pkgs-dir}-lock-with-conda.yml` + - Recopy the custom pkgs directory to ensure corrupt metadata for the second run + - Run conda-lock with `--conda=/opt/conda/bin/mamba` → `lockfile-{pkgs-dir}-lock-with-mamba.yml` +6. Copy both lockfiles out of the container **Why these steps are necessary:** -- The extracted archives only contain `index.json`/`repodata_record.json` (metadata) -- Warming the default cache ensures package files are available without touching the custom metadata -- Using the custom pkgs directory first makes micromamba/conda-lock read the corrupt metadata while finding files via the warmed cache + +- The extracted archives only contain `index.json`/`repodata_record.json` (metadata), not the actual package files +- Configuring the custom pkgs directory first ensures micromamba will check there before the default cache +- Warming the default cache populates it with all package files (including metadata) +- Copying the custom pkgs directory **after** warming overwrites the good metadata with corrupt metadata +- This creates a hybrid cache: corrupt metadata from custom pkgs, but complete package files from the warmed default cache +- conda-lock reads the corrupt metadata but can still access the package files it needs +- Recopying before the second run ensures any metadata repairs from the first run don't affect the second + +**Why test both conda and mamba:** + +- Different conda executables may handle corrupt metadata differently +- This helps identify whether the corruption affects all solvers or just specific ones Compare the generated lockfiles to see how corrupt metadata affects the output: ```bash -diff lockfile-2.1.0-pkgs.yml lockfile-2.1.1-pkgs.yml -diff lockfile-2.1.0-pkgs.yml lockfile-2.3.3-pkgs.yml +# Compare good vs corrupt cache (conda) +diff lockfile-2.1.0-pkgs-lock-with-conda.yml lockfile-2.1.1-pkgs-lock-with-conda.yml +diff lockfile-2.1.0-pkgs-lock-with-conda.yml lockfile-2.3.3-pkgs-lock-with-conda.yml + +# Compare good vs corrupt cache (mamba) +diff lockfile-2.1.0-pkgs-lock-with-mamba.yml lockfile-2.1.1-pkgs-lock-with-mamba.yml +diff lockfile-2.1.0-pkgs-lock-with-mamba.yml lockfile-2.3.3-pkgs-lock-with-mamba.yml + +# Compare conda vs mamba (same cache) +diff lockfile-2.1.0-pkgs-lock-with-conda.yml lockfile-2.1.0-pkgs-lock-with-mamba.yml ``` This allows us to verify whether corrupt `repodata_record.json` files lead to corrupt lockfile entries (missing dependencies, missing sha256, etc.). @@ -162,7 +188,7 @@ This allows us to verify whether corrupt `repodata_record.json` files lead to co The most reliable way to trigger corruption is through the `--update` code path, which reads from the cache when reconstructing unchanged packages: ```bash -# First, generate a base lockfile with good cache +# First, generate base lockfiles with good cache (if not already generated) python 04-test-conda-lock-with-pkgs.py --pkgs-archive 2.1.0-pkgs.tar.gz # Then test --update with both good and corrupt caches @@ -170,13 +196,15 @@ python 05-test-update-with-corrupt-cache.py --update-package pytest ``` This will: -1. Use `lockfile-2.1.0-pkgs.yml` as the base lockfile + +1. Use `lockfile-2.1.0-pkgs-lock-with-conda.yml` as the base lockfile 2. Run `conda-lock lock --update pytest` twice: - Once with `2.1.0-pkgs` (good cache) - Once with `2.1.1-pkgs` (corrupt cache) 3. Compare the results to detect corruption The `--update` path triggers corruption because: + - It creates a fake environment from the existing lockfile - Runs an update dry-run which may use cached packages - Calls `_reconstruct_fetch_actions()` to read from cache From 9f855703053d24d6cf784aa1e621c9d9216b9b94 Mon Sep 17 00:00:00 2001 From: Ben Mares Date: Fri, 7 Nov 2025 00:36:54 +0100 Subject: [PATCH 06/10] Render explicit lockfiles to demonstrate missing packages --- tests/test-corrupt-repodata/.gitignore | 1 + .../05-render-explicit-lockfiles.py | 93 ++++++ .../05-test-update-with-corrupt-cache.py | 296 ------------------ tests/test-corrupt-repodata/README.md | 42 +-- ...e-2.1.0-pkgs-lock-with-conda-explicit.lock | 183 +++++++++++ ...e-2.1.0-pkgs-lock-with-mamba-explicit.lock | 183 +++++++++++ ...e-2.1.1-pkgs-lock-with-conda-explicit.lock | 134 ++++++++ ...e-2.1.1-pkgs-lock-with-mamba-explicit.lock | 114 +++++++ ...e-2.3.3-pkgs-lock-with-conda-explicit.lock | 183 +++++++++++ ...e-2.3.3-pkgs-lock-with-mamba-explicit.lock | 183 +++++++++++ 10 files changed, 1097 insertions(+), 315 deletions(-) create mode 100644 tests/test-corrupt-repodata/05-render-explicit-lockfiles.py delete mode 100755 tests/test-corrupt-repodata/05-test-update-with-corrupt-cache.py create mode 100644 tests/test-corrupt-repodata/lockfile-2.1.0-pkgs-lock-with-conda-explicit.lock create mode 100644 tests/test-corrupt-repodata/lockfile-2.1.0-pkgs-lock-with-mamba-explicit.lock create mode 100644 tests/test-corrupt-repodata/lockfile-2.1.1-pkgs-lock-with-conda-explicit.lock create mode 100644 tests/test-corrupt-repodata/lockfile-2.1.1-pkgs-lock-with-mamba-explicit.lock create mode 100644 tests/test-corrupt-repodata/lockfile-2.3.3-pkgs-lock-with-conda-explicit.lock create mode 100644 tests/test-corrupt-repodata/lockfile-2.3.3-pkgs-lock-with-mamba-explicit.lock diff --git a/tests/test-corrupt-repodata/.gitignore b/tests/test-corrupt-repodata/.gitignore index 4b5a70510..908e5f1a5 100644 --- a/tests/test-corrupt-repodata/.gitignore +++ b/tests/test-corrupt-repodata/.gitignore @@ -1,4 +1,5 @@ *-pkgs/ lockfile-*.yml +lockfile-*-explicit.lock updated-*.yml outputs/ diff --git a/tests/test-corrupt-repodata/05-render-explicit-lockfiles.py b/tests/test-corrupt-repodata/05-render-explicit-lockfiles.py new file mode 100644 index 000000000..b5f89f90f --- /dev/null +++ b/tests/test-corrupt-repodata/05-render-explicit-lockfiles.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +"""Render explicit lockfiles from unified lockfiles. + +This script takes the unified lockfiles generated by 04-test-conda-lock-with-pkgs.py +and renders them to explicit format for comparison. + +For more context, see: + +""" + +import subprocess +import sys + +from pathlib import Path +from typing import Final + + +SCRIPT_DIR: Final[Path] = Path(__file__).resolve().parent +PLATFORM: Final[str] = "linux-64" + + +def render_explicit_lockfile(unified_lockfile: Path) -> Path: + """Render an explicit lockfile from a unified lockfile. + + Args: + unified_lockfile: Path to the unified lockfile + + Returns: + Path to the generated explicit lockfile + """ + # Determine output filename + # e.g., lockfile-2.1.0-pkgs-lock-with-conda.yml -> lockfile-2.1.0-pkgs-lock-with-conda-explicit.lock + stem = unified_lockfile.stem # Remove .yml + output_file = unified_lockfile.parent / f"{stem}-explicit.lock" + + cmd = [ + "conda-lock", + "render", + "--kind=explicit", + f"--platform={PLATFORM}", + f"--filename-template={output_file}", + unified_lockfile, + ] + + subprocess.run(cmd, check=True, capture_output=False) + + return output_file + + +def main() -> None: + """Render all unified lockfiles to explicit format.""" + # Find all unified lockfiles + pattern = "lockfile-*-lock-with-*.yml" + lockfiles = sorted(SCRIPT_DIR.glob(pattern)) + + if not lockfiles: + print(f"Error: No lockfiles found matching pattern: {pattern}", file=sys.stderr) + print("Run: python 04-test-conda-lock-with-pkgs.py first", file=sys.stderr) + sys.exit(1) + + print(f"Found {len(lockfiles)} unified lockfiles to render") + print() + + # Render all lockfiles to explicit format + explicit_lockfiles = [] + for lockfile in lockfiles: + print(f"Rendering: {lockfile.name}") + explicit_lockfile = render_explicit_lockfile(lockfile) + explicit_lockfiles.append(explicit_lockfile) + print(f" → {explicit_lockfile.name}") + + print() + print("=" * 60) + print("Success!") + print(f"Rendered {len(explicit_lockfiles)} explicit lockfiles") + print() + print("To compare explicit lockfiles, run:") + print( + " diff lockfile-2.1.0-pkgs-lock-with-conda-explicit.lock lockfile-2.1.1-pkgs-lock-with-conda-explicit.lock" + ) + print( + " diff lockfile-2.1.0-pkgs-lock-with-mamba-explicit.lock lockfile-2.1.1-pkgs-lock-with-mamba-explicit.lock" + ) + print( + " diff lockfile-2.1.0-pkgs-lock-with-conda-explicit.lock lockfile-2.3.3-pkgs-lock-with-conda-explicit.lock" + ) + print( + " diff lockfile-2.1.0-pkgs-lock-with-mamba-explicit.lock lockfile-2.3.3-pkgs-lock-with-mamba-explicit.lock" + ) + + +if __name__ == "__main__": + main() diff --git a/tests/test-corrupt-repodata/05-test-update-with-corrupt-cache.py b/tests/test-corrupt-repodata/05-test-update-with-corrupt-cache.py deleted file mode 100755 index f5eca392d..000000000 --- a/tests/test-corrupt-repodata/05-test-update-with-corrupt-cache.py +++ /dev/null @@ -1,296 +0,0 @@ -"""Test that --update with corrupt cache propagates corruption to lockfile. - -This script demonstrates that the corruption bug manifests during --update operations -when conda-lock reads from a corrupt package cache created by buggy micromamba versions. - -For more context, see: - -""" - -import argparse -import os -import shutil -import subprocess -import sys -import tarfile -import tempfile - -from pathlib import Path -from typing import Final - - -SCRIPT_DIR: Final[Path] = Path(__file__).resolve().parent -DOCKERFILE_PATH: Final[Path] = SCRIPT_DIR / "04.Dockerfile" -SOURCE_FILE: Final[Path] = SCRIPT_DIR / "../../environments/dev-environment.yaml" -DEFAULT_MICROMAMBA_VERSION: Final[str] = "2.1.0" - - -def build_conda_lock_image(_: str = DEFAULT_MICROMAMBA_VERSION) -> str: - """Deprecated: Docker build no longer used. Kept for CLI compatibility.""" - return "" - - -def test_update_with_cache( - base_lockfile: Path, - pkgs_dir: Path, - update_package: str, - output_name: str, -) -> Path: - """Test conda-lock --update with a specific pkgs cache. - - Args: - image_tag: Docker image tag to use - base_lockfile: Path to the base lockfile - pkgs_dir: Path to the pkgs directory to mount as cache - update_package: Package to update - output_name: Name for the output lockfile (without extension) - - Returns: - Path to the generated lockfile - """ - output_file = SCRIPT_DIR / f"{output_name}.yml" - - print("Testing --update with:") - print(f" Base lockfile: {base_lockfile}") - print(f" Pkgs cache: {pkgs_dir}") - print(f" Update: {update_package}") - print(f" Output: {output_file}") - print() - - # Run conda-lock locally using a temporary copy of the pkgs cache - with tempfile.TemporaryDirectory(prefix="conda-lock-update-") as tmpdir: - tmpdir_path = Path(tmpdir) - tmp_pkgs = tmpdir_path / "pkgs" - tmp_pkgs.mkdir(parents=True, exist_ok=True) - - # Copy pkgs cache to a temp location to avoid any accidental writes to repo - # Modern Python: use dirs_exist_ok to safely copy into an existing directory - shutil.copytree(pkgs_dir, tmp_pkgs, symlinks=True, dirs_exist_ok=True) - - tmp_lockfile = tmpdir_path / "lockfile.yml" - shutil.copy2(base_lockfile, tmp_lockfile) - - env = os.environ.copy() - env["CONDA_PKGS_DIRS"] = str(tmp_pkgs) - - cmd = [ - "micromamba", - "run", - "--name=conda-lock-dev", - "python", - "-m", - "conda_lock.conda_lock", - "lock", - "--log-level=DEBUG", - f"--file={SOURCE_FILE}", - "--platform=linux-64", - f"--lockfile={tmp_lockfile}", - f"--update={update_package}", - ] - - result = subprocess.run( - cmd, - capture_output=True, - text=True, - env=env, - cwd=str(SCRIPT_DIR.parent.parent), # Run from repo root - ) - - if result.returncode != 0: - print("STDERR:") - print(result.stderr) - print("STDOUT:") - print(result.stdout) - raise subprocess.CalledProcessError( - result.returncode, result.args, result.stdout, result.stderr - ) - - shutil.copy2(tmp_lockfile, output_file) - - print(f"Generated: {output_file}") - print() - return output_file - - -def check_for_corruption(lockfile: Path) -> dict[str, list[str]]: - """Check a lockfile for signs of corruption. - - Args: - lockfile: Path to the lockfile to check - - Returns: - Dict with corruption indicators: - - 'empty_depends': list of packages with no dependencies - - 'missing_sha256': list of packages missing sha256 - """ - import yaml - - with open(lockfile) as f: - data = yaml.safe_load(f) - - empty_depends = [] - missing_sha256 = [] - - for package in data.get("package", []): - if package.get("manager") != "conda": - continue - - # Check for empty depends (but allow packages that genuinely have no deps) - depends = package.get("dependencies", {}) - if isinstance(depends, dict) and len(depends) == 0: - # This might be suspicious, but some packages genuinely have no deps - pass - - # Check for missing sha256 (this is suspicious for non-cache entries) - hash_info = package.get("hash", {}) - if hash_info.get("md5") and not hash_info.get("sha256"): - missing_sha256.append(package["name"]) - - return { - "empty_depends": empty_depends, - "missing_sha256": missing_sha256, - } - - -def main() -> None: - """Test conda-lock --update with corrupt cache.""" - parser = argparse.ArgumentParser( - description="Test conda-lock --update with corrupt package cache" - ) - parser.add_argument( - "--micromamba-version", - default=DEFAULT_MICROMAMBA_VERSION, - help=f"Micromamba version for base image (default: {DEFAULT_MICROMAMBA_VERSION})", - ) - parser.add_argument( - "--base-lockfile", - default="lockfile-2.1.0-pkgs.yml", - help="Base lockfile to update from (default: lockfile-2.1.0-pkgs.yml)", - ) - parser.add_argument( - "--update-package", - default="pytest", - help="Package to update (default: pytest)", - ) - args = parser.parse_args() - - # Docker no longer required for this test - _ = build_conda_lock_image(args.micromamba_version) - - # Paths - base_lockfile = SCRIPT_DIR / args.base_lockfile - if not base_lockfile.exists(): - print(f"Error: Base lockfile not found: {base_lockfile}", file=sys.stderr) - print( - "Run: python 04-test-conda-lock-with-pkgs.py --pkgs-archive 2.1.0-pkgs.tar.gz", - file=sys.stderr, - ) - sys.exit(1) - - good_pkgs_archive = SCRIPT_DIR / "2.1.0-pkgs.tar.gz" - corrupt_pkgs_archive = SCRIPT_DIR / "2.1.1-pkgs.tar.gz" - - for pkgs_archive in [good_pkgs_archive, corrupt_pkgs_archive]: - if not pkgs_archive.exists(): - version = pkgs_archive.stem.split("-")[0] # Extract version from filename - print(f"Error: pkgs archive not found: {pkgs_archive}", file=sys.stderr) - print( - f"Run: python 02-reproduce-corrupt-repodata-via-upstream.py --version={version}", - file=sys.stderr, - ) - sys.exit(1) - - # Extract archives to persistent directories (for later inspection) - good_pkgs = SCRIPT_DIR / "2.1.0-pkgs" - corrupt_pkgs = SCRIPT_DIR / "2.1.1-pkgs" - - # Always delete and re-extract to ensure fresh state - if good_pkgs.exists(): - if not good_pkgs.name.endswith("-pkgs"): - raise ValueError( - f"Safety check failed: refusing to delete {good_pkgs} (does not end with '-pkgs')" - ) - shutil.rmtree(good_pkgs) - print(f"Extracting {good_pkgs_archive}...") - with tarfile.open(good_pkgs_archive, "r:gz") as tf: - tf.extractall(path=SCRIPT_DIR) - - if corrupt_pkgs.exists(): - if not corrupt_pkgs.name.endswith("-pkgs"): - raise ValueError( - f"Safety check failed: refusing to delete {corrupt_pkgs} (does not end with '-pkgs')" - ) - shutil.rmtree(corrupt_pkgs) - print(f"Extracting {corrupt_pkgs_archive}...") - with tarfile.open(corrupt_pkgs_archive, "r:gz") as tf: - tf.extractall(path=SCRIPT_DIR) - print() - - print("=" * 80) - print("TEST 1: Update with GOOD cache (2.1.0-pkgs)") - print("=" * 80) - print() - - lockfile_good = test_update_with_cache( - base_lockfile, - good_pkgs, - args.update_package, - f"updated-with-good-cache-{args.update_package}", - ) - - print("=" * 80) - print("TEST 2: Update with CORRUPT cache (2.1.1-pkgs)") - print("=" * 80) - print() - - lockfile_corrupt = test_update_with_cache( - base_lockfile, - corrupt_pkgs, - args.update_package, - f"updated-with-corrupt-cache-{args.update_package}", - ) - - print("=" * 80) - print("ANALYSIS") - print("=" * 80) - print() - - print("Checking for corruption indicators...") - print() - - good_check = check_for_corruption(lockfile_good) - corrupt_check = check_for_corruption(lockfile_corrupt) - - print(f"Good cache lockfile ({lockfile_good.name}):") - print(f" Packages missing sha256: {len(good_check['missing_sha256'])}") - print() - - print(f"Corrupt cache lockfile ({lockfile_corrupt.name}):") - print(f" Packages missing sha256: {len(corrupt_check['missing_sha256'])}") - print() - - if len(corrupt_check["missing_sha256"]) > len(good_check["missing_sha256"]): - print("⚠️ CORRUPTION DETECTED!") - print( - f" The corrupt cache resulted in {len(corrupt_check['missing_sha256']) - len(good_check['missing_sha256'])} more packages missing sha256" - ) - print() - print("Additional packages missing sha256 in corrupt version:") - for pkg in set(corrupt_check["missing_sha256"]) - set( - good_check["missing_sha256"] - ): - print(f" - {pkg}") - else: - print("✓ No additional corruption detected") - print(" (This might mean the update didn't trigger the reconstruction path)") - - print() - print("To compare lockfiles:") - print(f" diff {lockfile_good.name} {lockfile_corrupt.name}") - print() - print("To see detailed differences:") - print(f" diff -u {lockfile_good.name} {lockfile_corrupt.name} | less") - - -if __name__ == "__main__": - main() diff --git a/tests/test-corrupt-repodata/README.md b/tests/test-corrupt-repodata/README.md index f611ea05c..e85d64763 100644 --- a/tests/test-corrupt-repodata/README.md +++ b/tests/test-corrupt-repodata/README.md @@ -183,31 +183,35 @@ diff lockfile-2.1.0-pkgs-lock-with-conda.yml lockfile-2.1.0-pkgs-lock-with-mamba This allows us to verify whether corrupt `repodata_record.json` files lead to corrupt lockfile entries (missing dependencies, missing sha256, etc.). -## Testing the `--update` corruption path +## Rendering explicit lockfiles -The most reliable way to trigger corruption is through the `--update` code path, which reads from the cache when reconstructing unchanged packages: +The `conda-lock install` command internally renders the unified lockfile to an explicit lockfile before installing. Packages are missing from the resulting environment if and only if they are missing from the explicit lockfile. Therefore, comparing explicit lockfiles directly demonstrates the symptom of missing packages without needing to actually install environments. -```bash -# First, generate base lockfiles with good cache (if not already generated) -python 04-test-conda-lock-with-pkgs.py --pkgs-archive 2.1.0-pkgs.tar.gz +To render all unified lockfiles to explicit format for comparison: -# Then test --update with both good and corrupt caches -python 05-test-update-with-corrupt-cache.py --update-package pytest +```bash +python 05-render-explicit-lockfiles.py ``` -This will: +This will render all unified lockfiles to explicit format using `conda-lock render --kind=explicit`. + +Compare the explicit lockfiles to see which packages are missing due to corrupt metadata: -1. Use `lockfile-2.1.0-pkgs-lock-with-conda.yml` as the base lockfile -2. Run `conda-lock lock --update pytest` twice: - - Once with `2.1.0-pkgs` (good cache) - - Once with `2.1.1-pkgs` (corrupt cache) -3. Compare the results to detect corruption +```bash +# Compare good vs corrupt cache (conda) +diff lockfile-2.1.0-pkgs-lock-with-conda-explicit.lock lockfile-2.1.1-pkgs-lock-with-conda-explicit.lock +diff lockfile-2.1.0-pkgs-lock-with-conda-explicit.lock lockfile-2.3.3-pkgs-lock-with-conda-explicit.lock + +# Compare good vs corrupt cache (mamba) +diff lockfile-2.1.0-pkgs-lock-with-mamba-explicit.lock lockfile-2.1.1-pkgs-lock-with-mamba-explicit.lock +diff lockfile-2.1.0-pkgs-lock-with-mamba-explicit.lock lockfile-2.3.3-pkgs-lock-with-mamba-explicit.lock +``` -The `--update` path triggers corruption because: +**Expected behavior:** -- It creates a fake environment from the existing lockfile -- Runs an update dry-run which may use cached packages -- Calls `_reconstruct_fetch_actions()` to read from cache -- Corrupt cache → corrupt lockfile entries +- Lockfiles generated from good cache (2.1.0) should have complete package sets +- Lockfiles generated from corrupt cache (2.1.1) will have missing packages due to incomplete dependency information (empty `depends`/`constrains`) +- Lockfiles generated from partially fixed cache (2.3.3) should be complete, as the `depends`/`constrains` fields were restored from `index.json` +- The diff will show which package URLs are missing in the corrupt versions -This is the primary way the bug manifests in the wild! +This demonstrates the real-world symptom where lockfiles generated with corrupt metadata (2.1.1) are incomplete, leading to missing packages when users install from these explicit lockfiles. The 2.3.3 partial fix restored dependency information, so those lockfiles should match the baseline. diff --git a/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs-lock-with-conda-explicit.lock b/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs-lock-with-conda-explicit.lock new file mode 100644 index 000000000..103fe08ba --- /dev/null +++ b/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs-lock-with-conda-explicit.lock @@ -0,0 +1,183 @@ +# Generated by conda-lock. +# platform: linux-64 +# input_hash: 478bc8b4c815f08c094483870ca25bcd5452f8f76ab8d993b0d8a1b82429c488 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda#59659d0213082bc13be8500bab80c002 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda#c7e925f37e3b40d893459e625f6a53f1 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda#45161d96307e3a447cc3eb5896cf6f8c +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 +https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda#69fbc0a9e42eb5fe6733d2d60d818822 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a +https://conda.anaconda.org/conda-forge/linux-64/cpp-expected-1.3.1-h171cf75_0.conda#d17488e343e4c5c0bd0db18b3934d517 +https://conda.anaconda.org/conda-forge/linux-64/fmt-12.0.0-h2b0788b_0.conda#d90bf58b03d9a958cb4f9d3de539af17 +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 +https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 +https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.35-h9463b59_0.conda#21769ce326958ec230cdcbd0f2ad97eb +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda#7fa07cb0fb1b625a089ccc01218ee5b1 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 +https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda#828302fca535f9cfeb598d5f7c204323 +https://conda.anaconda.org/conda-forge/linux-64/simdjson-4.0.7-hb700be7_0.conda#cc9c262a71dd584aa5a3a22fc963255c +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 +https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda#92b90f5f7a322e74468bb4909c7354b5 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_4.conda#c94ab6ff54ba5172cf1c58267005670f +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.1-h32235b2_1.conda#8eef974130690cf385b569ecdeed2cf0 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 +https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda#679616eb5ad4e521c83da4650860aba7 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda#729a572a3ebb8c43933b30edcc628ceb +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda#e7733bc6785ec009e47a224a71917e84 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda#e512be7dc1f84966d50959e900ca121f +https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda#0a19d2cc6eb15881889b0c6fa7d6a78d +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda#767d508c1a67e02ae8f50e44cacfadb2 +https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda#b16e2595d3a9042aa9d570375978835f +https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py314h68536ef_0.conda#71d9c4f6a05a4b9da1b03b973e078db0 +https://conda.anaconda.org/conda-forge/noarch/bracex-2.2.1-pyhd8ed1ab_0.tar.bz2#586272349d7bef5b1ef527b56dca73cb +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314hdfeb8a1_0.conda#3ef9d2a701760467b9db2338b6cd926f +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded +https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a +https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda#e76c4ba9e1837847679421b8d549b784 +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.conda#ff3061d315c4a988fa1c29c543800780 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 +https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda#abbe8c85619c87c4f4f61b44173434af +https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda#66b8b26023b8efdf8fcb23bac4b6325d +https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_1.conda#7e081d00fdcba21b76658c1649691836 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 +https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda#3a804714ed59be1969ffca10f703ec2a +https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda#b4b91eb14fbe2f850dd2c5fc20676c0d +https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.2-gpl_h7be2006_100.conda#9d0eaa26e3c5d7af747b3ddee928327b +https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda#fab1be106a50e20f10fe5228fd1d1651 +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 +https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda#d9a8fc1f01deae61735c88ec242e855c +https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda#de8af4000a4872e16fb784c649679c8e +https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhd8ed1ab_0.conda#d7620a15dc400b448e1c88a981b23ddd +https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda#e9c622e0d00fa24a6292279af3ab6d06 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda#c3f35453097faf911fd3f6023fc2ab24 +https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda#617f15191456cc6a13db418a275435e5 +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh145f28c_0.conda#e7ab34d5a93e0819b62563c78635d937 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 +https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.3-py314h0f05182_0.conda#aee1c9aecc66339ea6fd89e6a143a282 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 +https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2#2807a0becd1d986fe1ef9b7f8135f215 +https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda#b12f41c0d7fb5ab81709fcc86579688f +https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda#43e14f832d7551e5a8910672bfc3d8c6 +https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.3-h813ae00_1.conda#57df47ec0ca6c4ab8f46865a8933f0cd +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 +https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda#87f47a78808baf2fa1ea9c315a1e48f1 +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/noarch/types-click-7.1.8-pyhd8ed1ab_1.conda#08ed65e279de69322843b075679567ea +https://conda.anaconda.org/conda-forge/noarch/types-filelock-3.2.7-pyhd8ed1ab_1.conda#3f1356104d409d6deba0c689f3b2c602 +https://conda.anaconda.org/conda-forge/noarch/types-freezegun-1.1.10-pyhd8ed1ab_1.conda#0b609b66e56bbe70d97cd52ad24058fb +https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_0.conda#3c9919ecee97547fa14fea57e2a9bb54 +https://conda.anaconda.org/conda-forge/noarch/types-setuptools-80.9.0.20250822-pyhcf101f3_0.conda#6404dcec3d8f8b8fe540516837aa08ec +https://conda.anaconda.org/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda#353b9704e4851a6f210e641d3595755f +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda#2f1ed718fcd829c184a6d4f0f2e07409 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/linux-64/zizmor-1.14.1-py314ha5689aa_0.conda#1f0180642729883f29c47e11d857e786 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhd8ed1ab_1.conda#df837d654933488220b454c6a3b0fad6 +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda#cf45f4278afd6f4e6d03eda0f435d527 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.11.0-py314h67df5f8_0.conda#6ff84b39468623308dee97e5dfbafca0 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda#7c14f3706e099f8fcd47af2d494616cc +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_2.conda#ade6b25a6136661dadd1a43e4350b10b +https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.3.0-pyhd8ed1ab_0.conda#b86839fa387a5b904846e77c84167e57 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/linux-64/libmamba-2.3.3-h09abcb8_2.conda#afca7d1181d858718852e4d8402c05ac +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda#5b5203189eb668f042ac2b0826244964 +https://conda.anaconda.org/conda-forge/linux-64/mypy-1.18.2-py314h5bd0f2a_0.conda#1e87cabfdfea01d30e2ce1dd6152846f +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 +https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda#d4582021af437c931d7d77ec39007845 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda#d152e423d80848fe95f0f4b43448030e +https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda#e8e53c4150a1bba3b160eacf9d53a51b +https://conda.anaconda.org/conda-forge/noarch/types-click-default-group-1.2.0.20250513-pyhe01879c_0.conda#335926a07f57d325d0d6966bf36eee0b +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 +https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py314hdafbbf9_1.conda#099125fcb130e9fe134c6b610f33b0e1 +https://conda.anaconda.org/conda-forge/noarch/wcmatch-10.1-pyhd8ed1ab_0.conda#b045a877087e3bbdd36fe460e7f5cc55 +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f +https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py314h5bd0f2a_1.conda#23985f6de5f68e3465807e1fbbc98f30 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.3-py314hb613cbf_0.conda#f291630db5dc438b6ce37c2bb1a96516 +https://conda.anaconda.org/conda-forge/noarch/freezegun-1.5.5-pyhd8ed1ab_0.conda#0fdb8ebc8dbdb62530ff73181ae63554 +https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda#93f742fe078a7b34c29a182958d4d765 +https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda#b91d463ea8be13bcbe644ae8bc99c39f +https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.0.1-pyhd8ed1ab_0.conda#bcc023a32ea1c44a790bbf1eae473486 +https://conda.anaconda.org/conda-forge/linux-64/mamba-2.3.3-h4396525_2.conda#7eb628c8e865dd6e33a46ade708de780 +https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhd8ed1ab_0.conda#1b9272ad4388efc264ff504384e2b578 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda#84382acddb26c27c70f2de8d4c830830 +https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.0-py314h5bd0f2a_0.conda#287eabdd0b0a176376968b84c2707bd8 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda#da0c42269086f5170e2b296878ec13a6 +https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda#ed5d43e9ef92cc2a9872f9bdfe94b984 +https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda#a247579d8a59931091b16a1e932bbed6 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py314h9891dd4_6.conda#28303a78c48916ab07b95ffdbffdfd6c +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h31f8a6b_0.conda#68bd13651618354987763f746ee1fadc +https://conda.anaconda.org/conda-forge/noarch/check-manifest-0.51-pyhd8ed1ab_0.conda#7f4022a44e9fce926fc9eb0da40bcda2 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda#25f954b7dae6dd7b0dc004dab74f1ce9 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda#14661160be39d78f2b210f2cc2766059 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-click-0.9.0-pyh29332c3_0.conda#5fe524d35646dadfdc024c510d29330a +https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.2-py310h1570de5_0.conda#383616287311316d120b028aac89f6f4 +https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda#1a884d2b1ea21abfb73911dcdb8342e4 +https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda#26e013bc453e643991cfa9b76911fb79 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 +https://conda.anaconda.org/conda-forge/noarch/pytest-split-0.10.0-pyhff2d567_0.conda#3bd32c44526b455aa146d8fdb27a65b3 +https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda#52a50ca8ea1b3496fbd3261bea8c5722 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda#8375cfbda7c57fbceeda18229be10417 +https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.0-py314hdafbbf9_0.conda#a804c54ce3a1aed268b13657b79825b8 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyha804496_0.conda#cdd58ab99c214b55d56099108a914282 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-include-markdown-plugin-7.2.0-pyhd8ed1ab_0.conda#4e2463b17fc15bb0ce9f67a14e3846ed +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba +https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda#c58dd5d147492671866464405364c0f1 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 +https://conda.anaconda.org/conda-forge/noarch/types-requests-2.32.4.20250913-pyhd8ed1ab_0.conda#829c891bfd4147c25b030455d3a57a3a +https://conda.anaconda.org/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda#07ce73ca6f6c1a1df5d498679fc52d9e +https://conda.anaconda.org/conda-forge/noarch/doctr-1.9.0-pyhd8ed1ab_0.tar.bz2#f57b656502db0e45cc996ddbef2a9d25 +https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda#d37314c8f553e3b4b44d113a0ee10196 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.23-pyhcf101f3_0.conda#b00890e53c4c652f55f3afc4290a814a +https://conda.anaconda.org/conda-forge/noarch/requests-mock-1.12.1-pyhd8ed1ab_1.conda#8212b70c509aaa0fa6c8fa974f784b2e +https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda#66de8645e324fda0ea6ef28c2f99a2ab +https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda#901a86453fa6183e914b937643619a03 +# pip ty @ https://files.pythonhosted.org/packages/57/d3/01ecc23bbd8f3e0dfbcf9172d06d84e88155c5f416f1491137e8066fd859/ty-0.0.1a25-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=0a90d897a7c1a5ae9b41a4c7b0a42262a06361476ad88d783dbedd7913edadbc diff --git a/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs-lock-with-mamba-explicit.lock b/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs-lock-with-mamba-explicit.lock new file mode 100644 index 000000000..103fe08ba --- /dev/null +++ b/tests/test-corrupt-repodata/lockfile-2.1.0-pkgs-lock-with-mamba-explicit.lock @@ -0,0 +1,183 @@ +# Generated by conda-lock. +# platform: linux-64 +# input_hash: 478bc8b4c815f08c094483870ca25bcd5452f8f76ab8d993b0d8a1b82429c488 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda#59659d0213082bc13be8500bab80c002 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda#c7e925f37e3b40d893459e625f6a53f1 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda#45161d96307e3a447cc3eb5896cf6f8c +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 +https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda#69fbc0a9e42eb5fe6733d2d60d818822 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a +https://conda.anaconda.org/conda-forge/linux-64/cpp-expected-1.3.1-h171cf75_0.conda#d17488e343e4c5c0bd0db18b3934d517 +https://conda.anaconda.org/conda-forge/linux-64/fmt-12.0.0-h2b0788b_0.conda#d90bf58b03d9a958cb4f9d3de539af17 +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 +https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 +https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.35-h9463b59_0.conda#21769ce326958ec230cdcbd0f2ad97eb +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda#7fa07cb0fb1b625a089ccc01218ee5b1 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 +https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda#828302fca535f9cfeb598d5f7c204323 +https://conda.anaconda.org/conda-forge/linux-64/simdjson-4.0.7-hb700be7_0.conda#cc9c262a71dd584aa5a3a22fc963255c +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 +https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda#92b90f5f7a322e74468bb4909c7354b5 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_4.conda#c94ab6ff54ba5172cf1c58267005670f +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.1-h32235b2_1.conda#8eef974130690cf385b569ecdeed2cf0 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 +https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda#679616eb5ad4e521c83da4650860aba7 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda#729a572a3ebb8c43933b30edcc628ceb +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda#e7733bc6785ec009e47a224a71917e84 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda#e512be7dc1f84966d50959e900ca121f +https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda#0a19d2cc6eb15881889b0c6fa7d6a78d +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda#767d508c1a67e02ae8f50e44cacfadb2 +https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda#b16e2595d3a9042aa9d570375978835f +https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py314h68536ef_0.conda#71d9c4f6a05a4b9da1b03b973e078db0 +https://conda.anaconda.org/conda-forge/noarch/bracex-2.2.1-pyhd8ed1ab_0.tar.bz2#586272349d7bef5b1ef527b56dca73cb +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314hdfeb8a1_0.conda#3ef9d2a701760467b9db2338b6cd926f +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded +https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a +https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda#e76c4ba9e1837847679421b8d549b784 +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.conda#ff3061d315c4a988fa1c29c543800780 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 +https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda#abbe8c85619c87c4f4f61b44173434af +https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda#66b8b26023b8efdf8fcb23bac4b6325d +https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_1.conda#7e081d00fdcba21b76658c1649691836 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 +https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda#3a804714ed59be1969ffca10f703ec2a +https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda#b4b91eb14fbe2f850dd2c5fc20676c0d +https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.2-gpl_h7be2006_100.conda#9d0eaa26e3c5d7af747b3ddee928327b +https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda#fab1be106a50e20f10fe5228fd1d1651 +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 +https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda#d9a8fc1f01deae61735c88ec242e855c +https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda#de8af4000a4872e16fb784c649679c8e +https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhd8ed1ab_0.conda#d7620a15dc400b448e1c88a981b23ddd +https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda#e9c622e0d00fa24a6292279af3ab6d06 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda#c3f35453097faf911fd3f6023fc2ab24 +https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda#617f15191456cc6a13db418a275435e5 +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh145f28c_0.conda#e7ab34d5a93e0819b62563c78635d937 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 +https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.3-py314h0f05182_0.conda#aee1c9aecc66339ea6fd89e6a143a282 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 +https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2#2807a0becd1d986fe1ef9b7f8135f215 +https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda#b12f41c0d7fb5ab81709fcc86579688f +https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda#43e14f832d7551e5a8910672bfc3d8c6 +https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.3-h813ae00_1.conda#57df47ec0ca6c4ab8f46865a8933f0cd +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 +https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda#87f47a78808baf2fa1ea9c315a1e48f1 +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/noarch/types-click-7.1.8-pyhd8ed1ab_1.conda#08ed65e279de69322843b075679567ea +https://conda.anaconda.org/conda-forge/noarch/types-filelock-3.2.7-pyhd8ed1ab_1.conda#3f1356104d409d6deba0c689f3b2c602 +https://conda.anaconda.org/conda-forge/noarch/types-freezegun-1.1.10-pyhd8ed1ab_1.conda#0b609b66e56bbe70d97cd52ad24058fb +https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_0.conda#3c9919ecee97547fa14fea57e2a9bb54 +https://conda.anaconda.org/conda-forge/noarch/types-setuptools-80.9.0.20250822-pyhcf101f3_0.conda#6404dcec3d8f8b8fe540516837aa08ec +https://conda.anaconda.org/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda#353b9704e4851a6f210e641d3595755f +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda#2f1ed718fcd829c184a6d4f0f2e07409 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/linux-64/zizmor-1.14.1-py314ha5689aa_0.conda#1f0180642729883f29c47e11d857e786 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhd8ed1ab_1.conda#df837d654933488220b454c6a3b0fad6 +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda#cf45f4278afd6f4e6d03eda0f435d527 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.11.0-py314h67df5f8_0.conda#6ff84b39468623308dee97e5dfbafca0 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda#7c14f3706e099f8fcd47af2d494616cc +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_2.conda#ade6b25a6136661dadd1a43e4350b10b +https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.3.0-pyhd8ed1ab_0.conda#b86839fa387a5b904846e77c84167e57 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/linux-64/libmamba-2.3.3-h09abcb8_2.conda#afca7d1181d858718852e4d8402c05ac +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda#5b5203189eb668f042ac2b0826244964 +https://conda.anaconda.org/conda-forge/linux-64/mypy-1.18.2-py314h5bd0f2a_0.conda#1e87cabfdfea01d30e2ce1dd6152846f +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 +https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda#d4582021af437c931d7d77ec39007845 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda#d152e423d80848fe95f0f4b43448030e +https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda#e8e53c4150a1bba3b160eacf9d53a51b +https://conda.anaconda.org/conda-forge/noarch/types-click-default-group-1.2.0.20250513-pyhe01879c_0.conda#335926a07f57d325d0d6966bf36eee0b +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 +https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py314hdafbbf9_1.conda#099125fcb130e9fe134c6b610f33b0e1 +https://conda.anaconda.org/conda-forge/noarch/wcmatch-10.1-pyhd8ed1ab_0.conda#b045a877087e3bbdd36fe460e7f5cc55 +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f +https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py314h5bd0f2a_1.conda#23985f6de5f68e3465807e1fbbc98f30 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.3-py314hb613cbf_0.conda#f291630db5dc438b6ce37c2bb1a96516 +https://conda.anaconda.org/conda-forge/noarch/freezegun-1.5.5-pyhd8ed1ab_0.conda#0fdb8ebc8dbdb62530ff73181ae63554 +https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda#93f742fe078a7b34c29a182958d4d765 +https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda#b91d463ea8be13bcbe644ae8bc99c39f +https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.0.1-pyhd8ed1ab_0.conda#bcc023a32ea1c44a790bbf1eae473486 +https://conda.anaconda.org/conda-forge/linux-64/mamba-2.3.3-h4396525_2.conda#7eb628c8e865dd6e33a46ade708de780 +https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhd8ed1ab_0.conda#1b9272ad4388efc264ff504384e2b578 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda#84382acddb26c27c70f2de8d4c830830 +https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.0-py314h5bd0f2a_0.conda#287eabdd0b0a176376968b84c2707bd8 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda#da0c42269086f5170e2b296878ec13a6 +https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda#ed5d43e9ef92cc2a9872f9bdfe94b984 +https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda#a247579d8a59931091b16a1e932bbed6 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py314h9891dd4_6.conda#28303a78c48916ab07b95ffdbffdfd6c +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h31f8a6b_0.conda#68bd13651618354987763f746ee1fadc +https://conda.anaconda.org/conda-forge/noarch/check-manifest-0.51-pyhd8ed1ab_0.conda#7f4022a44e9fce926fc9eb0da40bcda2 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda#25f954b7dae6dd7b0dc004dab74f1ce9 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda#14661160be39d78f2b210f2cc2766059 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-click-0.9.0-pyh29332c3_0.conda#5fe524d35646dadfdc024c510d29330a +https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.2-py310h1570de5_0.conda#383616287311316d120b028aac89f6f4 +https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda#1a884d2b1ea21abfb73911dcdb8342e4 +https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda#26e013bc453e643991cfa9b76911fb79 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 +https://conda.anaconda.org/conda-forge/noarch/pytest-split-0.10.0-pyhff2d567_0.conda#3bd32c44526b455aa146d8fdb27a65b3 +https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda#52a50ca8ea1b3496fbd3261bea8c5722 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda#8375cfbda7c57fbceeda18229be10417 +https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.0-py314hdafbbf9_0.conda#a804c54ce3a1aed268b13657b79825b8 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyha804496_0.conda#cdd58ab99c214b55d56099108a914282 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-include-markdown-plugin-7.2.0-pyhd8ed1ab_0.conda#4e2463b17fc15bb0ce9f67a14e3846ed +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba +https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda#c58dd5d147492671866464405364c0f1 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 +https://conda.anaconda.org/conda-forge/noarch/types-requests-2.32.4.20250913-pyhd8ed1ab_0.conda#829c891bfd4147c25b030455d3a57a3a +https://conda.anaconda.org/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda#07ce73ca6f6c1a1df5d498679fc52d9e +https://conda.anaconda.org/conda-forge/noarch/doctr-1.9.0-pyhd8ed1ab_0.tar.bz2#f57b656502db0e45cc996ddbef2a9d25 +https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda#d37314c8f553e3b4b44d113a0ee10196 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.23-pyhcf101f3_0.conda#b00890e53c4c652f55f3afc4290a814a +https://conda.anaconda.org/conda-forge/noarch/requests-mock-1.12.1-pyhd8ed1ab_1.conda#8212b70c509aaa0fa6c8fa974f784b2e +https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda#66de8645e324fda0ea6ef28c2f99a2ab +https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda#901a86453fa6183e914b937643619a03 +# pip ty @ https://files.pythonhosted.org/packages/57/d3/01ecc23bbd8f3e0dfbcf9172d06d84e88155c5f416f1491137e8066fd859/ty-0.0.1a25-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=0a90d897a7c1a5ae9b41a4c7b0a42262a06361476ad88d783dbedd7913edadbc diff --git a/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs-lock-with-conda-explicit.lock b/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs-lock-with-conda-explicit.lock new file mode 100644 index 000000000..f2ddf4637 --- /dev/null +++ b/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs-lock-with-conda-explicit.lock @@ -0,0 +1,134 @@ +# Generated by conda-lock. +# platform: linux-64 +# input_hash: 478bc8b4c815f08c094483870ca25bcd5452f8f76ab8d993b0d8a1b82429c488 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda#b16e2595d3a9042aa9d570375978835f +https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda#e76c4ba9e1837847679421b8d549b784 +https://conda.anaconda.org/conda-forge/linux-64/cpp-expected-1.3.1-h171cf75_0.conda#d17488e343e4c5c0bd0db18b3934d517 +https://conda.anaconda.org/conda-forge/noarch/doctr-1.9.0-pyhd8ed1ab_0.tar.bz2#f57b656502db0e45cc996ddbef2a9d25 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/freezegun-1.5.5-pyhd8ed1ab_0.conda#0fdb8ebc8dbdb62530ff73181ae63554 +https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda#b91d463ea8be13bcbe644ae8bc99c39f +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyha804496_0.conda#cdd58ab99c214b55d56099108a914282 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 +https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda#c7e925f37e3b40d893459e625f6a53f1 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 +https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.35-h9463b59_0.conda#21769ce326958ec230cdcbd0f2ad97eb +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 +https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda#fab1be106a50e20f10fe5228fd1d1651 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-click-0.9.0-pyh29332c3_0.conda#5fe524d35646dadfdc024c510d29330a +https://conda.anaconda.org/conda-forge/linux-64/mypy-1.18.2-py314h5bd0f2a_0.conda#1e87cabfdfea01d30e2ce1dd6152846f +https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda#59659d0213082bc13be8500bab80c002 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 +https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda#1a884d2b1ea21abfb73911dcdb8342e4 +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh145f28c_0.conda#e7ab34d5a93e0819b62563c78635d937 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 +https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda#26e013bc453e643991cfa9b76911fb79 +https://conda.anaconda.org/conda-forge/noarch/pytest-split-0.10.0-pyhff2d567_0.conda#3bd32c44526b455aa146d8fdb27a65b3 +https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda#52a50ca8ea1b3496fbd3261bea8c5722 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda#8375cfbda7c57fbceeda18229be10417 +https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda#ed5d43e9ef92cc2a9872f9bdfe94b984 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 +https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda#b12f41c0d7fb5ab81709fcc86579688f +https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda#e8e53c4150a1bba3b160eacf9d53a51b +https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda#69fbc0a9e42eb5fe6733d2d60d818822 +https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda#828302fca535f9cfeb598d5f7c204323 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/linux-64/simdjson-4.0.7-hb700be7_0.conda#cc9c262a71dd584aa5a3a22fc963255c +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/noarch/types-click-default-group-1.2.0.20250513-pyhe01879c_0.conda#335926a07f57d325d0d6966bf36eee0b +https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_0.conda#3c9919ecee97547fa14fea57e2a9bb54 +https://conda.anaconda.org/conda-forge/noarch/types-requests-2.32.4.20250913-pyhd8ed1ab_0.conda#829c891bfd4147c25b030455d3a57a3a +https://conda.anaconda.org/conda-forge/noarch/types-setuptools-80.9.0.20250822-pyhcf101f3_0.conda#6404dcec3d8f8b8fe540516837aa08ec +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/noarch/wcmatch-10.1-pyhd8ed1ab_0.conda#b045a877087e3bbdd36fe460e7f5cc55 +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda#2f1ed718fcd829c184a6d4f0f2e07409 +https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda#92b90f5f7a322e74468bb4909c7354b5 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/linux-64/zizmor-1.14.1-py314ha5689aa_0.conda#1f0180642729883f29c47e11d857e786 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda#45161d96307e3a447cc3eb5896cf6f8c +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/linux-64/fmt-12.0.0-h2b0788b_0.conda#d90bf58b03d9a958cb4f9d3de539af17 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda#729a572a3ebb8c43933b30edcc628ceb +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda#e7733bc6785ec009e47a224a71917e84 +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_4.conda#c94ab6ff54ba5172cf1c58267005670f +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda#e512be7dc1f84966d50959e900ca121f +https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.2-gpl_h7be2006_100.conda#9d0eaa26e3c5d7af747b3ddee928327b +https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda#0a19d2cc6eb15881889b0c6fa7d6a78d +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.11.0-py314h67df5f8_0.conda#6ff84b39468623308dee97e5dfbafca0 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.conda#ff3061d315c4a988fa1c29c543800780 +https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda#abbe8c85619c87c4f4f61b44173434af +https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_1.conda#7e081d00fdcba21b76658c1649691836 +https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda#d37314c8f553e3b4b44d113a0ee10196 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 +https://conda.anaconda.org/conda-forge/linux-64/libmamba-2.3.3-h09abcb8_2.conda#afca7d1181d858718852e4d8402c05ac +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 +https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda#d9a8fc1f01deae61735c88ec242e855c +https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda#de8af4000a4872e16fb784c649679c8e +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda#c3f35453097faf911fd3f6023fc2ab24 +https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda#617f15191456cc6a13db418a275435e5 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2#2807a0becd1d986fe1ef9b7f8135f215 +https://conda.anaconda.org/conda-forge/noarch/requests-mock-1.12.1-pyhd8ed1ab_1.conda#8212b70c509aaa0fa6c8fa974f784b2e +https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda#66de8645e324fda0ea6ef28c2f99a2ab +https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda#43e14f832d7551e5a8910672bfc3d8c6 +https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.3-h813ae00_1.conda#57df47ec0ca6c4ab8f46865a8933f0cd +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 +https://conda.anaconda.org/conda-forge/noarch/types-click-7.1.8-pyhd8ed1ab_1.conda#08ed65e279de69322843b075679567ea +https://conda.anaconda.org/conda-forge/noarch/types-filelock-3.2.7-pyhd8ed1ab_1.conda#3f1356104d409d6deba0c689f3b2c602 +https://conda.anaconda.org/conda-forge/noarch/types-freezegun-1.1.10-pyhd8ed1ab_1.conda#0b609b66e56bbe70d97cd52ad24058fb +https://conda.anaconda.org/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda#353b9704e4851a6f210e641d3595755f +https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py314hdafbbf9_1.conda#099125fcb130e9fe134c6b610f33b0e1 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda#cf45f4278afd6f4e6d03eda0f435d527 +https://conda.anaconda.org/conda-forge/noarch/check-manifest-0.51-pyhd8ed1ab_0.conda#7f4022a44e9fce926fc9eb0da40bcda2 +https://conda.anaconda.org/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda#07ce73ca6f6c1a1df5d498679fc52d9e +https://conda.anaconda.org/conda-forge/linux-64/mamba-2.3.3-h4396525_2.conda#7eb628c8e865dd6e33a46ade708de780 +https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhd8ed1ab_0.conda#1b9272ad4388efc264ff504384e2b578 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda#5b5203189eb668f042ac2b0826244964 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda#84382acddb26c27c70f2de8d4c830830 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda#da0c42269086f5170e2b296878ec13a6 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda#d152e423d80848fe95f0f4b43448030e +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f +https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py314h5bd0f2a_1.conda#23985f6de5f68e3465807e1fbbc98f30 +https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda#93f742fe078a7b34c29a182958d4d765 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 +https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda#a247579d8a59931091b16a1e932bbed6 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda#14661160be39d78f2b210f2cc2766059 +https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.2-py310h1570de5_0.conda#383616287311316d120b028aac89f6f4 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-include-markdown-plugin-7.2.0-pyhd8ed1ab_0.conda#4e2463b17fc15bb0ce9f67a14e3846ed +https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.23-pyhcf101f3_0.conda#b00890e53c4c652f55f3afc4290a814a +https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda#c58dd5d147492671866464405364c0f1 +https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda#901a86453fa6183e914b937643619a03 +# pip ty @ https://files.pythonhosted.org/packages/57/d3/01ecc23bbd8f3e0dfbcf9172d06d84e88155c5f416f1491137e8066fd859/ty-0.0.1a25-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=0a90d897a7c1a5ae9b41a4c7b0a42262a06361476ad88d783dbedd7913edadbc diff --git a/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs-lock-with-mamba-explicit.lock b/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs-lock-with-mamba-explicit.lock new file mode 100644 index 000000000..193c5b238 --- /dev/null +++ b/tests/test-corrupt-repodata/lockfile-2.1.1-pkgs-lock-with-mamba-explicit.lock @@ -0,0 +1,114 @@ +# Generated by conda-lock. +# platform: linux-64 +# input_hash: 478bc8b4c815f08c094483870ca25bcd5452f8f76ab8d993b0d8a1b82429c488 +@EXPLICIT +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda#b16e2595d3a9042aa9d570375978835f +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 +https://conda.anaconda.org/conda-forge/linux-64/cpp-expected-1.3.1-h171cf75_0.conda#d17488e343e4c5c0bd0db18b3934d517 +https://conda.anaconda.org/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda#07ce73ca6f6c1a1df5d498679fc52d9e +https://conda.anaconda.org/conda-forge/noarch/doctr-1.9.0-pyhd8ed1ab_0.tar.bz2#f57b656502db0e45cc996ddbef2a9d25 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_1.conda#7e081d00fdcba21b76658c1649691836 +https://conda.anaconda.org/conda-forge/noarch/freezegun-1.5.5-pyhd8ed1ab_0.conda#0fdb8ebc8dbdb62530ff73181ae63554 +https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda#b91d463ea8be13bcbe644ae8bc99c39f +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyha804496_0.conda#cdd58ab99c214b55d56099108a914282 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda#c7e925f37e3b40d893459e625f6a53f1 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 +https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.35-h9463b59_0.conda#21769ce326958ec230cdcbd0f2ad97eb +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 +https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda#45161d96307e3a447cc3eb5896cf6f8c +https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda#14661160be39d78f2b210f2cc2766059 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-click-0.9.0-pyh29332c3_0.conda#5fe524d35646dadfdc024c510d29330a +https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda#de8af4000a4872e16fb784c649679c8e +https://conda.anaconda.org/conda-forge/linux-64/mypy-1.18.2-py314h5bd0f2a_0.conda#1e87cabfdfea01d30e2ce1dd6152846f +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda#59659d0213082bc13be8500bab80c002 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda#c3f35453097faf911fd3f6023fc2ab24 +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh145f28c_0.conda#e7ab34d5a93e0819b62563c78635d937 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 +https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda#26e013bc453e643991cfa9b76911fb79 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 +https://conda.anaconda.org/conda-forge/noarch/pytest-split-0.10.0-pyhff2d567_0.conda#3bd32c44526b455aa146d8fdb27a65b3 +https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda#52a50ca8ea1b3496fbd3261bea8c5722 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda#8375cfbda7c57fbceeda18229be10417 +https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda#ed5d43e9ef92cc2a9872f9bdfe94b984 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 +https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda#69fbc0a9e42eb5fe6733d2d60d818822 +https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda#828302fca535f9cfeb598d5f7c204323 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 +https://conda.anaconda.org/conda-forge/noarch/requests-mock-1.12.1-pyhd8ed1ab_1.conda#8212b70c509aaa0fa6c8fa974f784b2e +https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda#66de8645e324fda0ea6ef28c2f99a2ab +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/linux-64/simdjson-4.0.7-hb700be7_0.conda#cc9c262a71dd584aa5a3a22fc963255c +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/noarch/types-click-7.1.8-pyhd8ed1ab_1.conda#08ed65e279de69322843b075679567ea +https://conda.anaconda.org/conda-forge/noarch/types-click-default-group-1.2.0.20250513-pyhe01879c_0.conda#335926a07f57d325d0d6966bf36eee0b +https://conda.anaconda.org/conda-forge/noarch/types-filelock-3.2.7-pyhd8ed1ab_1.conda#3f1356104d409d6deba0c689f3b2c602 +https://conda.anaconda.org/conda-forge/noarch/types-freezegun-1.1.10-pyhd8ed1ab_1.conda#0b609b66e56bbe70d97cd52ad24058fb +https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_0.conda#3c9919ecee97547fa14fea57e2a9bb54 +https://conda.anaconda.org/conda-forge/noarch/types-requests-2.32.4.20250913-pyhd8ed1ab_0.conda#829c891bfd4147c25b030455d3a57a3a +https://conda.anaconda.org/conda-forge/noarch/types-setuptools-80.9.0.20250822-pyhcf101f3_0.conda#6404dcec3d8f8b8fe540516837aa08ec +https://conda.anaconda.org/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda#353b9704e4851a6f210e641d3595755f +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/noarch/wcmatch-10.1-pyhd8ed1ab_0.conda#b045a877087e3bbdd36fe460e7f5cc55 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda#92b90f5f7a322e74468bb4909c7354b5 +https://conda.anaconda.org/conda-forge/linux-64/zizmor-1.14.1-py314ha5689aa_0.conda#1f0180642729883f29c47e11d857e786 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 +https://conda.anaconda.org/conda-forge/linux-64/fmt-12.0.0-h2b0788b_0.conda#d90bf58b03d9a958cb4f9d3de539af17 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_4.conda#c94ab6ff54ba5172cf1c58267005670f +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda#729a572a3ebb8c43933b30edcc628ceb +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda#e7733bc6785ec009e47a224a71917e84 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda#e512be7dc1f84966d50959e900ca121f +https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda#0a19d2cc6eb15881889b0c6fa7d6a78d +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda#cf45f4278afd6f4e6d03eda0f435d527 +https://conda.anaconda.org/conda-forge/noarch/check-manifest-0.51-pyhd8ed1ab_0.conda#7f4022a44e9fce926fc9eb0da40bcda2 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.conda#ff3061d315c4a988fa1c29c543800780 +https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda#abbe8c85619c87c4f4f61b44173434af +https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda#d37314c8f553e3b4b44d113a0ee10196 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 +https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.2-gpl_h7be2006_100.conda#9d0eaa26e3c5d7af747b3ddee928327b +https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhd8ed1ab_0.conda#1b9272ad4388efc264ff504384e2b578 +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-include-markdown-plugin-7.2.0-pyhd8ed1ab_0.conda#4e2463b17fc15bb0ce9f67a14e3846ed +https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda#43e14f832d7551e5a8910672bfc3d8c6 +https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.3-h813ae00_1.conda#57df47ec0ca6c4ab8f46865a8933f0cd +https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py314h5bd0f2a_1.conda#23985f6de5f68e3465807e1fbbc98f30 +https://conda.anaconda.org/conda-forge/linux-64/libmamba-2.3.3-h09abcb8_2.conda#afca7d1181d858718852e4d8402c05ac +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda#5b5203189eb668f042ac2b0826244964 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.23-pyhcf101f3_0.conda#b00890e53c4c652f55f3afc4290a814a +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda#da0c42269086f5170e2b296878ec13a6 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda#d152e423d80848fe95f0f4b43448030e +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f +https://conda.anaconda.org/conda-forge/linux-64/mamba-2.3.3-h4396525_2.conda#7eb628c8e865dd6e33a46ade708de780 +https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda#a247579d8a59931091b16a1e932bbed6 +https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.2-py310h1570de5_0.conda#383616287311316d120b028aac89f6f4 +https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda#c58dd5d147492671866464405364c0f1 +https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda#901a86453fa6183e914b937643619a03 +# pip ty @ https://files.pythonhosted.org/packages/57/d3/01ecc23bbd8f3e0dfbcf9172d06d84e88155c5f416f1491137e8066fd859/ty-0.0.1a25-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=0a90d897a7c1a5ae9b41a4c7b0a42262a06361476ad88d783dbedd7913edadbc diff --git a/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs-lock-with-conda-explicit.lock b/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs-lock-with-conda-explicit.lock new file mode 100644 index 000000000..103fe08ba --- /dev/null +++ b/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs-lock-with-conda-explicit.lock @@ -0,0 +1,183 @@ +# Generated by conda-lock. +# platform: linux-64 +# input_hash: 478bc8b4c815f08c094483870ca25bcd5452f8f76ab8d993b0d8a1b82429c488 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda#59659d0213082bc13be8500bab80c002 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda#c7e925f37e3b40d893459e625f6a53f1 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda#45161d96307e3a447cc3eb5896cf6f8c +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 +https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda#69fbc0a9e42eb5fe6733d2d60d818822 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a +https://conda.anaconda.org/conda-forge/linux-64/cpp-expected-1.3.1-h171cf75_0.conda#d17488e343e4c5c0bd0db18b3934d517 +https://conda.anaconda.org/conda-forge/linux-64/fmt-12.0.0-h2b0788b_0.conda#d90bf58b03d9a958cb4f9d3de539af17 +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 +https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 +https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.35-h9463b59_0.conda#21769ce326958ec230cdcbd0f2ad97eb +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda#7fa07cb0fb1b625a089ccc01218ee5b1 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 +https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda#828302fca535f9cfeb598d5f7c204323 +https://conda.anaconda.org/conda-forge/linux-64/simdjson-4.0.7-hb700be7_0.conda#cc9c262a71dd584aa5a3a22fc963255c +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 +https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda#92b90f5f7a322e74468bb4909c7354b5 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_4.conda#c94ab6ff54ba5172cf1c58267005670f +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.1-h32235b2_1.conda#8eef974130690cf385b569ecdeed2cf0 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 +https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda#679616eb5ad4e521c83da4650860aba7 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda#729a572a3ebb8c43933b30edcc628ceb +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda#e7733bc6785ec009e47a224a71917e84 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda#e512be7dc1f84966d50959e900ca121f +https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda#0a19d2cc6eb15881889b0c6fa7d6a78d +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda#767d508c1a67e02ae8f50e44cacfadb2 +https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda#b16e2595d3a9042aa9d570375978835f +https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py314h68536ef_0.conda#71d9c4f6a05a4b9da1b03b973e078db0 +https://conda.anaconda.org/conda-forge/noarch/bracex-2.2.1-pyhd8ed1ab_0.tar.bz2#586272349d7bef5b1ef527b56dca73cb +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314hdfeb8a1_0.conda#3ef9d2a701760467b9db2338b6cd926f +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded +https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a +https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda#e76c4ba9e1837847679421b8d549b784 +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.conda#ff3061d315c4a988fa1c29c543800780 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 +https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda#abbe8c85619c87c4f4f61b44173434af +https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda#66b8b26023b8efdf8fcb23bac4b6325d +https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_1.conda#7e081d00fdcba21b76658c1649691836 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 +https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda#3a804714ed59be1969ffca10f703ec2a +https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda#b4b91eb14fbe2f850dd2c5fc20676c0d +https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.2-gpl_h7be2006_100.conda#9d0eaa26e3c5d7af747b3ddee928327b +https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda#fab1be106a50e20f10fe5228fd1d1651 +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 +https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda#d9a8fc1f01deae61735c88ec242e855c +https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda#de8af4000a4872e16fb784c649679c8e +https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhd8ed1ab_0.conda#d7620a15dc400b448e1c88a981b23ddd +https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda#e9c622e0d00fa24a6292279af3ab6d06 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda#c3f35453097faf911fd3f6023fc2ab24 +https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda#617f15191456cc6a13db418a275435e5 +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh145f28c_0.conda#e7ab34d5a93e0819b62563c78635d937 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 +https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.3-py314h0f05182_0.conda#aee1c9aecc66339ea6fd89e6a143a282 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 +https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2#2807a0becd1d986fe1ef9b7f8135f215 +https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda#b12f41c0d7fb5ab81709fcc86579688f +https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda#43e14f832d7551e5a8910672bfc3d8c6 +https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.3-h813ae00_1.conda#57df47ec0ca6c4ab8f46865a8933f0cd +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 +https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda#87f47a78808baf2fa1ea9c315a1e48f1 +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/noarch/types-click-7.1.8-pyhd8ed1ab_1.conda#08ed65e279de69322843b075679567ea +https://conda.anaconda.org/conda-forge/noarch/types-filelock-3.2.7-pyhd8ed1ab_1.conda#3f1356104d409d6deba0c689f3b2c602 +https://conda.anaconda.org/conda-forge/noarch/types-freezegun-1.1.10-pyhd8ed1ab_1.conda#0b609b66e56bbe70d97cd52ad24058fb +https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_0.conda#3c9919ecee97547fa14fea57e2a9bb54 +https://conda.anaconda.org/conda-forge/noarch/types-setuptools-80.9.0.20250822-pyhcf101f3_0.conda#6404dcec3d8f8b8fe540516837aa08ec +https://conda.anaconda.org/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda#353b9704e4851a6f210e641d3595755f +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda#2f1ed718fcd829c184a6d4f0f2e07409 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/linux-64/zizmor-1.14.1-py314ha5689aa_0.conda#1f0180642729883f29c47e11d857e786 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhd8ed1ab_1.conda#df837d654933488220b454c6a3b0fad6 +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda#cf45f4278afd6f4e6d03eda0f435d527 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.11.0-py314h67df5f8_0.conda#6ff84b39468623308dee97e5dfbafca0 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda#7c14f3706e099f8fcd47af2d494616cc +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_2.conda#ade6b25a6136661dadd1a43e4350b10b +https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.3.0-pyhd8ed1ab_0.conda#b86839fa387a5b904846e77c84167e57 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/linux-64/libmamba-2.3.3-h09abcb8_2.conda#afca7d1181d858718852e4d8402c05ac +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda#5b5203189eb668f042ac2b0826244964 +https://conda.anaconda.org/conda-forge/linux-64/mypy-1.18.2-py314h5bd0f2a_0.conda#1e87cabfdfea01d30e2ce1dd6152846f +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 +https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda#d4582021af437c931d7d77ec39007845 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda#d152e423d80848fe95f0f4b43448030e +https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda#e8e53c4150a1bba3b160eacf9d53a51b +https://conda.anaconda.org/conda-forge/noarch/types-click-default-group-1.2.0.20250513-pyhe01879c_0.conda#335926a07f57d325d0d6966bf36eee0b +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 +https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py314hdafbbf9_1.conda#099125fcb130e9fe134c6b610f33b0e1 +https://conda.anaconda.org/conda-forge/noarch/wcmatch-10.1-pyhd8ed1ab_0.conda#b045a877087e3bbdd36fe460e7f5cc55 +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f +https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py314h5bd0f2a_1.conda#23985f6de5f68e3465807e1fbbc98f30 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.3-py314hb613cbf_0.conda#f291630db5dc438b6ce37c2bb1a96516 +https://conda.anaconda.org/conda-forge/noarch/freezegun-1.5.5-pyhd8ed1ab_0.conda#0fdb8ebc8dbdb62530ff73181ae63554 +https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda#93f742fe078a7b34c29a182958d4d765 +https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda#b91d463ea8be13bcbe644ae8bc99c39f +https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.0.1-pyhd8ed1ab_0.conda#bcc023a32ea1c44a790bbf1eae473486 +https://conda.anaconda.org/conda-forge/linux-64/mamba-2.3.3-h4396525_2.conda#7eb628c8e865dd6e33a46ade708de780 +https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhd8ed1ab_0.conda#1b9272ad4388efc264ff504384e2b578 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda#84382acddb26c27c70f2de8d4c830830 +https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.0-py314h5bd0f2a_0.conda#287eabdd0b0a176376968b84c2707bd8 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda#da0c42269086f5170e2b296878ec13a6 +https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda#ed5d43e9ef92cc2a9872f9bdfe94b984 +https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda#a247579d8a59931091b16a1e932bbed6 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py314h9891dd4_6.conda#28303a78c48916ab07b95ffdbffdfd6c +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h31f8a6b_0.conda#68bd13651618354987763f746ee1fadc +https://conda.anaconda.org/conda-forge/noarch/check-manifest-0.51-pyhd8ed1ab_0.conda#7f4022a44e9fce926fc9eb0da40bcda2 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda#25f954b7dae6dd7b0dc004dab74f1ce9 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda#14661160be39d78f2b210f2cc2766059 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-click-0.9.0-pyh29332c3_0.conda#5fe524d35646dadfdc024c510d29330a +https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.2-py310h1570de5_0.conda#383616287311316d120b028aac89f6f4 +https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda#1a884d2b1ea21abfb73911dcdb8342e4 +https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda#26e013bc453e643991cfa9b76911fb79 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 +https://conda.anaconda.org/conda-forge/noarch/pytest-split-0.10.0-pyhff2d567_0.conda#3bd32c44526b455aa146d8fdb27a65b3 +https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda#52a50ca8ea1b3496fbd3261bea8c5722 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda#8375cfbda7c57fbceeda18229be10417 +https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.0-py314hdafbbf9_0.conda#a804c54ce3a1aed268b13657b79825b8 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyha804496_0.conda#cdd58ab99c214b55d56099108a914282 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-include-markdown-plugin-7.2.0-pyhd8ed1ab_0.conda#4e2463b17fc15bb0ce9f67a14e3846ed +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba +https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda#c58dd5d147492671866464405364c0f1 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 +https://conda.anaconda.org/conda-forge/noarch/types-requests-2.32.4.20250913-pyhd8ed1ab_0.conda#829c891bfd4147c25b030455d3a57a3a +https://conda.anaconda.org/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda#07ce73ca6f6c1a1df5d498679fc52d9e +https://conda.anaconda.org/conda-forge/noarch/doctr-1.9.0-pyhd8ed1ab_0.tar.bz2#f57b656502db0e45cc996ddbef2a9d25 +https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda#d37314c8f553e3b4b44d113a0ee10196 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.23-pyhcf101f3_0.conda#b00890e53c4c652f55f3afc4290a814a +https://conda.anaconda.org/conda-forge/noarch/requests-mock-1.12.1-pyhd8ed1ab_1.conda#8212b70c509aaa0fa6c8fa974f784b2e +https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda#66de8645e324fda0ea6ef28c2f99a2ab +https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda#901a86453fa6183e914b937643619a03 +# pip ty @ https://files.pythonhosted.org/packages/57/d3/01ecc23bbd8f3e0dfbcf9172d06d84e88155c5f416f1491137e8066fd859/ty-0.0.1a25-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=0a90d897a7c1a5ae9b41a4c7b0a42262a06361476ad88d783dbedd7913edadbc diff --git a/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs-lock-with-mamba-explicit.lock b/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs-lock-with-mamba-explicit.lock new file mode 100644 index 000000000..103fe08ba --- /dev/null +++ b/tests/test-corrupt-repodata/lockfile-2.3.3-pkgs-lock-with-mamba-explicit.lock @@ -0,0 +1,183 @@ +# Generated by conda-lock. +# platform: linux-64 +# input_hash: 478bc8b4c815f08c094483870ca25bcd5452f8f76ab8d993b0d8a1b82429c488 +@EXPLICIT +https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 +https://conda.anaconda.org/conda-forge/noarch/nlohmann_json-abi-3.12.0-h0f90c79_1.conda#59659d0213082bc13be8500bab80c002 +https://conda.anaconda.org/conda-forge/noarch/python_abi-3.14-8_cp314.conda#0539938c55b6b1a59b560e843ad864a4 +https://conda.anaconda.org/conda-forge/noarch/tzdata-2025b-h78e105d_0.conda#4222072737ccff51314b5ece9c7d6f5a +https://conda.anaconda.org/conda-forge/noarch/ca-certificates-2025.10.5-hbd8a1cb_0.conda#f9e5fbc24009179e8b0409624691758a +https://conda.anaconda.org/conda-forge/linux-64/libgomp-15.2.0-h767d61c_7.conda#f7b4d76975aac7e5d9e6ad13845f92fe +https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d +https://conda.anaconda.org/conda-forge/linux-64/libgcc-15.2.0-h767d61c_7.conda#c0374badb3a5d4b1372db28d19462c53 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hda65f42_8.conda#51a19bba1b8ebfb60df25cde030b7ebc +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.34.5-hb9d3cd8_0.conda#f7f0d6cc2dc986d42ac2689ec88192be +https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.3-hb9d3cd8_0.conda#b38117a3c920364aff79f870c984b4a3 +https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.7.1-hecca717_0.conda#4211416ecba1866fab0c6470986c22d6 +https://conda.anaconda.org/conda-forge/linux-64/libffi-3.5.2-h9ec8514_0.conda#35f29eec58405aaf55e01cb470d8c26a +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_7.conda#280ea6eee9e2ddefde25ff799c4f0363 +https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.18-h3b78370_2.conda#915f5995e94f60e9a4826e0b0920ee88 +https://conda.anaconda.org/conda-forge/linux-64/liblzma-5.8.1-hb9d3cd8_2.conda#1a580f7796c7bf6393fddb8bbbde58dc +https://conda.anaconda.org/conda-forge/linux-64/libmpdec-4.0.0-hb9d3cd8_0.conda#c7e925f37e3b40d893459e625f6a53f1 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-15.2.0-h8f9b012_7.conda#5b767048b1b3ee9a954b06f4084f93dc +https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.41.2-he9a06e4_0.conda#80c07c68d2f6870250959dcc95b209d1 +https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-hb9d3cd8_2.conda#edb0dca6bc32e4f4789199455a1dbeb8 +https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h280c20c_1002.conda#45161d96307e3a447cc3eb5896cf6f8c +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h2d0b736_3.conda#47e340acb35de30501a76c7c799c41d7 +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.5.4-h26f9b46_0.conda#14edad12b59ccbfa3910d42c72adc2a0 +https://conda.anaconda.org/conda-forge/linux-64/reproc-14.2.5.post0-hb9d3cd8_0.conda#69fbc0a9e42eb5fe6733d2d60d818822 +https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda#a77f85f77be52ff59391544bfe73390a +https://conda.anaconda.org/conda-forge/linux-64/cpp-expected-1.3.1-h171cf75_0.conda#d17488e343e4c5c0bd0db18b3934d517 +https://conda.anaconda.org/conda-forge/linux-64/fmt-12.0.0-h2b0788b_0.conda#d90bf58b03d9a958cb4f9d3de539af17 +https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20250104-pl5321h7949ede_0.conda#c277e0a4d549b03ac1e9d6cbbe3d017b +https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 +https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.20-h4ab18f5_0.conda#a587892d3c13b6621a6091be690dbca2 +https://conda.anaconda.org/conda-forge/linux-64/libsolv-0.7.35-h9463b59_0.conda#21769ce326958ec230cdcbd0f2ad97eb +https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.1-hcf80075_0.conda#eecce068c7e4eddeb169591baac20ac4 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-15.2.0-h4852527_7.conda#f627678cf829bd70bccf141a19c3ad3e +https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.10.0-h5888daf_1.conda#9de5350a85c4a20c685259b889aa6393 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.46-h1321c63_0.conda#7fa07cb0fb1b625a089ccc01218ee5b1 +https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8c095d6_2.conda#283b96675859b20a825f8fa30f311446 +https://conda.anaconda.org/conda-forge/linux-64/reproc-cpp-14.2.5.post0-h5888daf_0.conda#828302fca535f9cfeb598d5f7c204323 +https://conda.anaconda.org/conda-forge/linux-64/simdjson-4.0.7-hb700be7_0.conda#cc9c262a71dd584aa5a3a22fc963255c +https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_hd72426e_102.conda#a0116df4f4ed05c303811a837d5b39d8 +https://conda.anaconda.org/conda-forge/linux-64/yaml-cpp-0.8.0-h3f2d84a_0.conda#92b90f5f7a322e74468bb4909c7354b5 +https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.7-hb8e6e7a_2.conda#6432cb5d4ac0046c3ac0a8a0f95842f9 +https://conda.anaconda.org/conda-forge/linux-64/icu-75.1-he02047a_0.conda#8b189310083baabfb622af68fd9d3ae3 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.44-h1aa0949_4.conda#c94ab6ff54ba5172cf1c58267005670f +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.86.1-h32235b2_1.conda#8eef974130690cf385b569ecdeed2cf0 +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.67.0-had1ee68_0.conda#b499ce4b026493a13774bcf0f4c33849 +https://conda.anaconda.org/conda-forge/linux-64/dbus-1.16.2-h3c4dab8_0.conda#679616eb5ad4e521c83da4650860aba7 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.17.0-h4e3cde8_0.conda#01e149d4a53185622dc2e788281961f2 +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.51.0-hee844dc_0.conda#729a572a3ebb8c43933b30edcc628ceb +https://conda.anaconda.org/conda-forge/linux-64/libxml2-16-2.15.1-ha9997c6_0.conda#e7733bc6785ec009e47a224a71917e84 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.15.1-h26afc86_0.conda#e512be7dc1f84966d50959e900ca121f +https://conda.anaconda.org/conda-forge/linux-64/python-3.14.0-h32b2ec7_102_cp314.conda#0a19d2cc6eb15881889b0c6fa7d6a78d +https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_5.conda#767d508c1a67e02ae8f50e44cacfadb2 +https://conda.anaconda.org/conda-forge/noarch/backrefs-5.8-pyhd8ed1ab_0.conda#b16e2595d3a9042aa9d570375978835f +https://conda.anaconda.org/conda-forge/linux-64/bcrypt-5.0.0-py314h68536ef_0.conda#71d9c4f6a05a4b9da1b03b973e078db0 +https://conda.anaconda.org/conda-forge/noarch/bracex-2.2.1-pyhd8ed1ab_0.tar.bz2#586272349d7bef5b1ef527b56dca73cb +https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.2.0-py314hdfeb8a1_0.conda#3ef9d2a701760467b9db2338b6cd926f +https://conda.anaconda.org/conda-forge/noarch/certifi-2025.10.5-pyhd8ed1ab_0.conda#257ae203f1d204107ba389607d375ded +https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_1.conda#57df494053e17dce2ac3a0b33e1b2a2e +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.4.4-pyhd8ed1ab_0.conda#a22d1fd9bf98827e280a02875d9a007a +https://conda.anaconda.org/conda-forge/noarch/click-8.3.0-pyh707e725_0.conda#e76c4ba9e1837847679421b8d549b784 +https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda#962b9857ee8e7018c22f2776ffa0b2d7 +https://conda.anaconda.org/conda-forge/noarch/cpython-3.14.0-py314hd8ed1ab_102.conda#ff3061d315c4a988fa1c29c543800780 +https://conda.anaconda.org/conda-forge/noarch/distlib-0.4.0-pyhd8ed1ab_0.conda#003b8ba0a94e2f1e117d0bd46aebc901 +https://conda.anaconda.org/conda-forge/noarch/docutils-0.22.3-pyhd8ed1ab_0.conda#abbe8c85619c87c4f4f61b44173434af +https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_1.conda#a71efeae2c160f6789900ba2631a2c90 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.20.0-pyhd8ed1ab_0.conda#66b8b26023b8efdf8fcb23bac4b6325d +https://conda.anaconda.org/conda-forge/noarch/flaky-3.8.1-pyhd8ed1ab_1.conda#7e081d00fdcba21b76658c1649691836 +https://conda.anaconda.org/conda-forge/noarch/hpack-4.1.0-pyhd8ed1ab_0.conda#0a802cb9888dd14eeefc611f05c40b6e +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.1.0-pyhd8ed1ab_0.conda#8e6923fc12f1fe8f8c4e5c9f343256ac +https://conda.anaconda.org/conda-forge/noarch/idna-3.11-pyhd8ed1ab_0.conda#53abe63df7e10a6ba605dc5f9f961d36 +https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda#9614359868482abba1bd15ce465e3c42 +https://conda.anaconda.org/conda-forge/noarch/invoke-2.2.1-pyhd8ed1ab_0.conda#3a804714ed59be1969ffca10f703ec2a +https://conda.anaconda.org/conda-forge/noarch/jeepney-0.9.0-pyhd8ed1ab_0.conda#b4b91eb14fbe2f850dd2c5fc20676c0d +https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.8.2-gpl_h7be2006_100.conda#9d0eaa26e3c5d7af747b3ddee928327b +https://conda.anaconda.org/conda-forge/noarch/markupsafe-3.0.3-pyh7db6752_0.conda#fab1be106a50e20f10fe5228fd1d1651 +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_1.conda#592132998493b3ff25fd7479396e8351 +https://conda.anaconda.org/conda-forge/noarch/mergedeep-1.3.4-pyhd8ed1ab_1.conda#d9a8fc1f01deae61735c88ec242e855c +https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-extensions-1.3.1-pyhd8ed1ab_1.conda#de8af4000a4872e16fb784c649679c8e +https://conda.anaconda.org/conda-forge/noarch/more-itertools-10.8.0-pyhd8ed1ab_0.conda#d7620a15dc400b448e1c88a981b23ddd +https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.1.0-pyha770c72_0.conda#e9c622e0d00fa24a6292279af3ab6d06 +https://conda.anaconda.org/conda-forge/noarch/packaging-25.0-pyh29332c3_1.conda#58335b26c38bf4a20f399384c33cbcf9 +https://conda.anaconda.org/conda-forge/noarch/paginate-0.5.7-pyhd8ed1ab_1.conda#c3f35453097faf911fd3f6023fc2ab24 +https://conda.anaconda.org/conda-forge/noarch/pathspec-0.12.1-pyhd8ed1ab_1.conda#617f15191456cc6a13db418a275435e5 +https://conda.anaconda.org/conda-forge/noarch/pip-25.2-pyh145f28c_0.conda#e7ab34d5a93e0819b62563c78635d937 +https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.5.0-pyhcf101f3_0.conda#5c7a868f8241e64e1cf5fdf4962f23e2 +https://conda.anaconda.org/conda-forge/noarch/pluggy-1.6.0-pyhd8ed1ab_0.conda#7da7ccd349dbf6487a7778579d2bb971 +https://conda.anaconda.org/conda-forge/linux-64/psutil-7.1.3-py314h0f05182_0.conda#aee1c9aecc66339ea6fd89e6a143a282 +https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyh29332c3_1.conda#12c566707c80111f9799308d9e265aef +https://conda.anaconda.org/conda-forge/noarch/pygments-2.19.2-pyhd8ed1ab_0.conda#6b6ece66ebcae2d5f326c77ef2c5a066 +https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha55dd90_7.conda#461219d1a5bd61342293efa2c0c90eac +https://conda.anaconda.org/conda-forge/noarch/pytz-2025.2-pyhd8ed1ab_0.conda#bc8e3267d44011051f2eb14d22fb0960 +https://conda.anaconda.org/conda-forge/noarch/pywin32-on-windows-0.1.0-pyh1179c8e_3.tar.bz2#2807a0becd1d986fe1ef9b7f8135f215 +https://conda.anaconda.org/conda-forge/noarch/pyyaml-6.0.3-pyh7db6752_0.conda#b12f41c0d7fb5ab81709fcc86579688f +https://conda.anaconda.org/conda-forge/noarch/rfc3986-2.0.0-pyhd8ed1ab_1.conda#43e14f832d7551e5a8910672bfc3d8c6 +https://conda.anaconda.org/conda-forge/linux-64/ruff-0.14.3-h813ae00_1.conda#57df47ec0ca6c4ab8f46865a8933f0cd +https://conda.anaconda.org/conda-forge/noarch/setuptools-80.9.0-pyhff2d567_0.conda#4de79c071274a53dcaf2a8c749d1499e +https://conda.anaconda.org/conda-forge/noarch/six-1.17.0-pyhe01879c_1.conda#3339e3b65d58accf4ca4fb8748ab16b3 +https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.2-pyhd8ed1ab_0.conda#87f47a78808baf2fa1ea9c315a1e48f1 +https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_1.conda#b0dd904de08b7db706167240bf37b164 +https://conda.anaconda.org/conda-forge/noarch/tomli-2.3.0-pyhcf101f3_0.conda#d2732eb636c264dc9aa4cbee404b1a53 +https://conda.anaconda.org/conda-forge/noarch/types-click-7.1.8-pyhd8ed1ab_1.conda#08ed65e279de69322843b075679567ea +https://conda.anaconda.org/conda-forge/noarch/types-filelock-3.2.7-pyhd8ed1ab_1.conda#3f1356104d409d6deba0c689f3b2c602 +https://conda.anaconda.org/conda-forge/noarch/types-freezegun-1.1.10-pyhd8ed1ab_1.conda#0b609b66e56bbe70d97cd52ad24058fb +https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.20250915-pyhd8ed1ab_0.conda#3c9919ecee97547fa14fea57e2a9bb54 +https://conda.anaconda.org/conda-forge/noarch/types-setuptools-80.9.0.20250822-pyhcf101f3_0.conda#6404dcec3d8f8b8fe540516837aa08ec +https://conda.anaconda.org/conda-forge/noarch/types-toml-0.10.8.20240310-pyhd8ed1ab_1.conda#353b9704e4851a6f210e641d3595755f +https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda#0caa1af407ecff61170c9437a808404d +https://conda.anaconda.org/conda-forge/noarch/websocket-client-1.9.0-pyhd8ed1ab_0.conda#2f1ed718fcd829c184a6d4f0f2e07409 +https://conda.anaconda.org/conda-forge/noarch/wheel-0.45.1-pyhd8ed1ab_1.conda#75cb7132eb58d97896e173ef12ac9986 +https://conda.anaconda.org/conda-forge/noarch/zipp-3.23.0-pyhd8ed1ab_0.conda#df5e78d904988eb55042c0c97446079f +https://conda.anaconda.org/conda-forge/linux-64/zizmor-1.14.1-py314ha5689aa_0.conda#1f0180642729883f29c47e11d857e786 +https://conda.anaconda.org/conda-forge/noarch/babel-2.17.0-pyhd8ed1ab_0.conda#0a01c169f0ab0f91b26e77a3301fbfe4 +https://conda.anaconda.org/conda-forge/noarch/backports.tarfile-1.2.0-pyhd8ed1ab_1.conda#df837d654933488220b454c6a3b0fad6 +https://conda.anaconda.org/conda-forge/linux-64/cffi-2.0.0-py314h4a8dc5f_1.conda#cf45f4278afd6f4e6d03eda0f435d527 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.11.0-py314h67df5f8_0.conda#6ff84b39468623308dee97e5dfbafca0 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.3.0-pyhd8ed1ab_0.conda#72e42d28960d875c7654614f8b50939a +https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.12-pyhd8ed1ab_0.conda#7c14f3706e099f8fcd47af2d494616cc +https://conda.anaconda.org/conda-forge/noarch/h2-4.3.0-pyhcf101f3_0.conda#164fc43f0b53b6e3a7bc7dce5e4f1dc9 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.7.0-pyhe01879c_1.conda#63ccfdc3a3ce25b027b8767eb722fca8 +https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.5.2-pyhd8ed1ab_0.conda#c85c76dc67d75619a92f51dfbce06992 +https://conda.anaconda.org/conda-forge/noarch/jaraco.classes-3.4.0-pyhd8ed1ab_2.conda#ade6b25a6136661dadd1a43e4350b10b +https://conda.anaconda.org/conda-forge/noarch/jaraco.functools-4.3.0-pyhd8ed1ab_0.conda#b86839fa387a5b904846e77c84167e57 +https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.6-pyhd8ed1ab_0.conda#446bd6c8cb26050d528881df495ce646 +https://conda.anaconda.org/conda-forge/linux-64/libmamba-2.3.3-h09abcb8_2.conda#afca7d1181d858718852e4d8402c05ac +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-4.0.0-pyhd8ed1ab_0.conda#5b5203189eb668f042ac2b0826244964 +https://conda.anaconda.org/conda-forge/linux-64/mypy-1.18.2-py314h5bd0f2a_0.conda#1e87cabfdfea01d30e2ce1dd6152846f +https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.9.1-pyhd8ed1ab_1.conda#7ba3f09fceae6a120d664217e58fe686 +https://conda.anaconda.org/conda-forge/noarch/pyproject_hooks-1.2.0-pyhd8ed1ab_1.conda#d4582021af437c931d7d77ec39007845 +https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0.post0-pyhe01879c_2.conda#5b8d21249ff20967101ffa321cab24e8 +https://conda.anaconda.org/conda-forge/noarch/python-gil-3.14.0-h4df99d1_102.conda#d152e423d80848fe95f0f4b43448030e +https://conda.anaconda.org/conda-forge/noarch/pyyaml-env-tag-1.1-pyhd8ed1ab_0.conda#e8e53c4150a1bba3b160eacf9d53a51b +https://conda.anaconda.org/conda-forge/noarch/types-click-default-group-1.2.0.20250513-pyhe01879c_0.conda#335926a07f57d325d0d6966bf36eee0b +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.35.4-pyhd8ed1ab_0.conda#cfccfd4e8d9de82ed75c8e2c91cab375 +https://conda.anaconda.org/conda-forge/linux-64/watchdog-6.0.0-py314hdafbbf9_1.conda#099125fcb130e9fe134c6b610f33b0e1 +https://conda.anaconda.org/conda-forge/noarch/wcmatch-10.1-pyhd8ed1ab_0.conda#b045a877087e3bbdd36fe460e7f5cc55 +https://conda.anaconda.org/conda-forge/noarch/_python_abi3_support-1.0-hd8ed1ab_2.conda#aaa2a381ccc56eac91d63b6c1240312f +https://conda.anaconda.org/conda-forge/linux-64/cmarkgfm-2024.11.20-py314h5bd0f2a_1.conda#23985f6de5f68e3465807e1fbbc98f30 +https://conda.anaconda.org/conda-forge/linux-64/cryptography-46.0.3-py314hb613cbf_0.conda#f291630db5dc438b6ce37c2bb1a96516 +https://conda.anaconda.org/conda-forge/noarch/freezegun-1.5.5-pyhd8ed1ab_0.conda#0fdb8ebc8dbdb62530ff73181ae63554 +https://conda.anaconda.org/conda-forge/noarch/ghp-import-2.1.0-pyhd8ed1ab_2.conda#93f742fe078a7b34c29a182958d4d765 +https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.45-pyhff2d567_0.conda#b91d463ea8be13bcbe644ae8bc99c39f +https://conda.anaconda.org/conda-forge/noarch/jaraco.context-6.0.1-pyhd8ed1ab_0.conda#bcc023a32ea1c44a790bbf1eae473486 +https://conda.anaconda.org/conda-forge/linux-64/mamba-2.3.3-h4396525_2.conda#7eb628c8e865dd6e33a46ade708de780 +https://conda.anaconda.org/conda-forge/noarch/markdown-3.10-pyhd8ed1ab_0.conda#1b9272ad4388efc264ff504384e2b578 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-get-deps-0.2.0-pyhd8ed1ab_1.conda#84382acddb26c27c70f2de8d4c830830 +https://conda.anaconda.org/conda-forge/linux-64/pynacl-1.6.0-py314h5bd0f2a_0.conda#287eabdd0b0a176376968b84c2707bd8 +https://conda.anaconda.org/conda-forge/noarch/pytest-8.4.2-pyhcf101f3_1.conda#da0c42269086f5170e2b296878ec13a6 +https://conda.anaconda.org/conda-forge/noarch/python-build-1.3.0-pyhff2d567_0.conda#ed5d43e9ef92cc2a9872f9bdfe94b984 +https://conda.anaconda.org/conda-forge/noarch/rich-14.2.0-pyhcf101f3_0.conda#a247579d8a59931091b16a1e932bbed6 +https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py314h9891dd4_6.conda#28303a78c48916ab07b95ffdbffdfd6c +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.25.0-py314h31f8a6b_0.conda#68bd13651618354987763f746ee1fadc +https://conda.anaconda.org/conda-forge/noarch/check-manifest-0.51-pyhd8ed1ab_0.conda#7f4022a44e9fce926fc9eb0da40bcda2 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.15-pyhd8ed1ab_0.conda#25f954b7dae6dd7b0dc004dab74f1ce9 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-1.6.1-pyhd8ed1ab_1.conda#14661160be39d78f2b210f2cc2766059 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-click-0.9.0-pyh29332c3_0.conda#5fe524d35646dadfdc024c510d29330a +https://conda.anaconda.org/conda-forge/linux-64/nh3-0.3.2-py310h1570de5_0.conda#383616287311316d120b028aac89f6f4 +https://conda.anaconda.org/conda-forge/noarch/paramiko-4.0.0-pyhd8ed1ab_0.conda#1a884d2b1ea21abfb73911dcdb8342e4 +https://conda.anaconda.org/conda-forge/noarch/pymdown-extensions-10.16.1-pyhd8ed1ab_0.conda#26e013bc453e643991cfa9b76911fb79 +https://conda.anaconda.org/conda-forge/noarch/pytest-cov-7.0.0-pyhcf101f3_1.conda#6891acad5e136cb62a8c2ed2679d6528 +https://conda.anaconda.org/conda-forge/noarch/pytest-split-0.10.0-pyhff2d567_0.conda#3bd32c44526b455aa146d8fdb27a65b3 +https://conda.anaconda.org/conda-forge/noarch/pytest-timeout-2.4.0-pyhd8ed1ab_0.conda#52a50ca8ea1b3496fbd3261bea8c5722 +https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.8.0-pyhd8ed1ab_0.conda#8375cfbda7c57fbceeda18229be10417 +https://conda.anaconda.org/conda-forge/linux-64/secretstorage-3.4.0-py314hdafbbf9_0.conda#a804c54ce3a1aed268b13657b79825b8 +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.5.0-pyhd8ed1ab_0.conda#436c165519e140cb08d246a4472a9d6a +https://conda.anaconda.org/conda-forge/noarch/keyring-25.6.0-pyha804496_0.conda#cdd58ab99c214b55d56099108a914282 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-include-markdown-plugin-7.2.0-pyhd8ed1ab_0.conda#4e2463b17fc15bb0ce9f67a14e3846ed +https://conda.anaconda.org/conda-forge/noarch/pre-commit-4.3.0-pyha770c72_0.conda#bc6c44af2a9e6067dd7e949ef10cdfba +https://conda.anaconda.org/conda-forge/noarch/readme_renderer-44.0-pyhd8ed1ab_1.conda#c58dd5d147492671866464405364c0f1 +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.5-pyhd8ed1ab_0.conda#db0c6b99149880c8ba515cf4abe93ee4 +https://conda.anaconda.org/conda-forge/noarch/types-requests-2.32.4.20250913-pyhd8ed1ab_0.conda#829c891bfd4147c25b030455d3a57a3a +https://conda.anaconda.org/conda-forge/noarch/docker-py-7.1.0-pyhd8ed1ab_1.conda#07ce73ca6f6c1a1df5d498679fc52d9e +https://conda.anaconda.org/conda-forge/noarch/doctr-1.9.0-pyhd8ed1ab_0.tar.bz2#f57b656502db0e45cc996ddbef2a9d25 +https://conda.anaconda.org/conda-forge/noarch/id-1.5.0-pyh29332c3_0.conda#d37314c8f553e3b4b44d113a0ee10196 +https://conda.anaconda.org/conda-forge/noarch/mkdocs-material-9.6.23-pyhcf101f3_0.conda#b00890e53c4c652f55f3afc4290a814a +https://conda.anaconda.org/conda-forge/noarch/requests-mock-1.12.1-pyhd8ed1ab_1.conda#8212b70c509aaa0fa6c8fa974f784b2e +https://conda.anaconda.org/conda-forge/noarch/requests-toolbelt-1.0.0-pyhd8ed1ab_1.conda#66de8645e324fda0ea6ef28c2f99a2ab +https://conda.anaconda.org/conda-forge/noarch/twine-6.2.0-pyhcf101f3_0.conda#901a86453fa6183e914b937643619a03 +# pip ty @ https://files.pythonhosted.org/packages/57/d3/01ecc23bbd8f3e0dfbcf9172d06d84e88155c5f416f1491137e8066fd859/ty-0.0.1a25-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=0a90d897a7c1a5ae9b41a4c7b0a42262a06361476ad88d783dbedd7913edadbc From 42cc21c4b615fe400f99629efc00d699f1709dfc Mon Sep 17 00:00:00 2001 From: Ben Mares Date: Fri, 7 Nov 2025 00:53:21 +0100 Subject: [PATCH 07/10] tests(test-corrupt-repodata): add complete stage-organized manifest documenting scripts, prerequisites, and outputs --- tests/test-corrupt-repodata/README.md | 64 +++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/tests/test-corrupt-repodata/README.md b/tests/test-corrupt-repodata/README.md index e85d64763..934967f41 100644 --- a/tests/test-corrupt-repodata/README.md +++ b/tests/test-corrupt-repodata/README.md @@ -47,6 +47,70 @@ This means 2.3.3 still differs from a good cache, but only in the four metadata See upstream fix PR `mamba-org/mamba#4071` for details. +## Manifest + +This suite is organized into five stages. Each stage lists the scripts, prerequisite files, and the output artifacts it produces. The focus is on what files are used and generated, and what they are for. + +### Stage 01 — Generate a sample explicit lockfile + +- Scripts + - `01-generate-sample-explicit-lockfile.py`: Generates a baseline explicit lockfile used by later stages. +- Prerequisites + - `environments/conda-lock.yml` (repository root): Source environment specification from which the explicit lockfile is produced. + - `conda-lock` available on PATH. +- Outputs + - `01-explicit.lock`: Explicit lockfile for `linux-64`. Used to populate caches in Stage 02/04 and as a baseline for reproducibility. + +### Stage 02 — Reproduce corrupt repodata via upstream (per micromamba version) + +- Scripts + - `02-reproduce-corrupt-repodata-via-upstream.py`: Builds and runs a Docker container to install from `01-explicit.lock` using a specific micromamba version, then extracts only package metadata. +- Supporting files + - `02.Dockerfile`: Minimal image definition used by Stage 02 to perform an explicit install and extract metadata. +- Prerequisites + - `01-explicit.lock` (from Stage 01). + - Docker installed and running. +- Outputs + - `{version}-pkgs.tar.gz`: Compressed archive containing only `info/index.json` and `info/repodata_record.json` for each package installed by that micromamba version. This file is committed and serves as the source of truth for comparisons. + - `{version}-pkgs/`: Extracted directory for inspection when running scripts. This directory is ignored by git and can be regenerated from the `.tar.gz`. + +### Stage 03 — Simulate corruption by clobbering (optional verification) + +- Scripts + - `03-clobber-pkgs.py`: Applies the known corruption patterns to a copy of a good cache and verifies the result matches a target corrupt version exactly. +- Prerequisites + - `{input-version}-pkgs.tar.gz`: The baseline metadata archive to corrupt (e.g., `2.1.0-pkgs.tar.gz`). + - `{corrupt-version}-pkgs.tar.gz`: The target corrupt reference archive (e.g., `2.1.1-pkgs.tar.gz` or `2.3.3-pkgs.tar.gz`) used for verification. +- Outputs + - `clobbered-{input-version}-pkgs/`: Directory containing simulated corruption. Used for verification and inspection; ignored by git. + +### Stage 04 — Generate unified lockfiles with different caches and solvers + +- Scripts + - `04-test-conda-lock-with-pkgs.py`: Orchestrates Docker build and execution to generate unified lockfiles using different package caches (good vs. corrupt). + - `04-run-conda-lock.sh`: Runs inside the container. Warms caches, copies corrupt metadata into place, runs `conda-lock` twice (once with `conda.exe`, once with `mamba`), and recopies the corrupt metadata between runs to keep it intact. +- Supporting files + - `04.Dockerfile`: Image providing micromamba, mamba, conda-standalone, Python, git, and `conda-lock`. + - `04-setup-editable.sh`: Sets up an editable install of `conda-lock` from the mounted repository inside the container. +- Prerequisites + - `{version}-pkgs.tar.gz` (from Stage 02): Metadata archive for the selected micromamba version. + - `01-explicit.lock` (from Stage 01): Used to populate and warm the default package cache in the container. + - `environments/dev-environment.yaml` (repository root): Source file used by `conda-lock` to produce unified lockfiles. +- Outputs + - `lockfile-{pkgs-name}-lock-with-conda.yml`: Unified lockfile produced using `--conda=/opt/conda/standalone_conda/conda.exe`. + - `lockfile-{pkgs-name}-lock-with-mamba.yml`: Unified lockfile produced using `--conda=/opt/conda/bin/mamba`. + - `{pkgs-name}/`: Extracted metadata directory mounted into the container (regenerated as needed); ignored by git. + +### Stage 05 — Render explicit lockfiles from unified lockfiles + +- Scripts + - `05-render-explicit-lockfiles.py`: Renders all unified lockfiles to explicit format using `conda-lock render --kind=explicit`. +- Prerequisites + - Unified lockfiles matching `lockfile-*-lock-with-*.yml` (from Stage 04). + - `conda-lock` available on PATH. +- Outputs + - `lockfile-{pkgs-name}-lock-with-{solver}-explicit.lock`: Explicit lockfiles (one per unified lockfile) used for direct comparison. These are the exact artifacts `conda-lock install` consumes prior to installation. + ## Reproducing the issue This directory contains scripts to reproduce the corrupt repodata issue by running different micromamba versions in Docker. From 1b2083a4999e9311297a70660d2bec06bf8631dc Mon Sep 17 00:00:00 2001 From: Ben Mares Date: Fri, 7 Nov 2025 10:52:49 +0100 Subject: [PATCH 08/10] Clean up .gitignore --- tests/test-corrupt-repodata/.gitignore | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test-corrupt-repodata/.gitignore b/tests/test-corrupt-repodata/.gitignore index 908e5f1a5..dc42c118e 100644 --- a/tests/test-corrupt-repodata/.gitignore +++ b/tests/test-corrupt-repodata/.gitignore @@ -1,5 +1,3 @@ *-pkgs/ lockfile-*.yml lockfile-*-explicit.lock -updated-*.yml -outputs/ From bde80525c2dcb4b199be789cad3445dcd2c99033 Mon Sep 17 00:00:00 2001 From: Ben Mares Date: Fri, 7 Nov 2025 10:53:10 +0100 Subject: [PATCH 09/10] Add command summary to README --- tests/test-corrupt-repodata/README.md | 54 +++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/tests/test-corrupt-repodata/README.md b/tests/test-corrupt-repodata/README.md index 934967f41..cac12c970 100644 --- a/tests/test-corrupt-repodata/README.md +++ b/tests/test-corrupt-repodata/README.md @@ -279,3 +279,57 @@ diff lockfile-2.1.0-pkgs-lock-with-mamba-explicit.lock lockfile-2.3.3-pkgs-lock- - The diff will show which package URLs are missing in the corrupt versions This demonstrates the real-world symptom where lockfiles generated with corrupt metadata (2.1.1) are incomplete, leading to missing packages when users install from these explicit lockfiles. The 2.3.3 partial fix restored dependency information, so those lockfiles should match the baseline. + +## Command summary + +### Remove all artifacts + +Delete artifacts in chronological creation order (Stages 01 → 05). This removes everything, including previously committed reference archives. + +```bash +cd tests/test-corrupt-repodata + +# Stage 01: baseline explicit lockfile +rm -f 01-explicit.lock + +# Stage 02: extracted directories and reference archives +rm -rf -- *-pkgs/ +rm -f *-pkgs.tar.gz + +# Stage 03: simulated corrupt directories +rm -rf -- clobbered-*-pkgs/ + +# Stage 04: unified lockfiles +rm -f lockfile-*-lock-with-*.yml + +# Stage 05: explicit lockfiles +rm -f lockfile-*-lock-with-*-explicit.lock +``` + +### Generate all artifacts + +This reproduces the entire flow across all stages and versions. + +```bash +cd tests/test-corrupt-repodata + +# Stage 01: generate baseline explicit lockfile +python 01-generate-sample-explicit-lockfile.py + +# Stage 02: extract metadata from upstream micromamba versions +python 02-reproduce-corrupt-repodata-via-upstream.py --version 2.1.0 +python 02-reproduce-corrupt-repodata-via-upstream.py --version 2.1.1 +python 02-reproduce-corrupt-repodata-via-upstream.py --version 2.3.3 + +# Stage 03: simulate corruption to verify patterns match corrupt baselines +python 03-clobber-pkgs.py --input-version 2.1.0 --corrupt-version 2.1.1 --pattern 2.1.1 +python 03-clobber-pkgs.py --input-version 2.1.0 --corrupt-version 2.3.3 --pattern 2.3.3 + +# Stage 04: generate unified lockfiles (conda and mamba) for each cache +python 04-test-conda-lock-with-pkgs.py --pkgs-archive 2.1.0-pkgs.tar.gz +python 04-test-conda-lock-with-pkgs.py --pkgs-archive 2.1.1-pkgs.tar.gz +python 04-test-conda-lock-with-pkgs.py --pkgs-archive 2.3.3-pkgs.tar.gz + +# Stage 05: render explicit lockfiles from unified lockfiles +python 05-render-explicit-lockfiles.py +``` From 3c8ac6e8edc31a9039d6a4379974d868eb5e43b8 Mon Sep 17 00:00:00 2001 From: Ben Mares Date: Fri, 7 Nov 2025 20:46:33 +0100 Subject: [PATCH 10/10] Add context about index.json vs repodata_record.json --- tests/test-corrupt-repodata/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/test-corrupt-repodata/README.md b/tests/test-corrupt-repodata/README.md index cac12c970..24bb634dc 100644 --- a/tests/test-corrupt-repodata/README.md +++ b/tests/test-corrupt-repodata/README.md @@ -4,6 +4,15 @@ An upstream [regression in libmamba](https://github.com/mamba-org/mamba/issues/4 The affected mamba/micromamba versions are 2.1.1 through 2.3.2. The regression was partially fixed in [mamba-org/mamba#4071](https://github.com/mamba-org/mamba/pull/4071) and released as version 2.3.3. +## Metadata overview + +Conda packages cached under the package cache contain metadata under `info/`: + +- **`info/index.json`** is written at build time by `conda-build`. It describes the package as shipped in the artifact (name, version, build, depends, constrains, ...). This is the "as-built" view. Since the SHA256 and MD5 checksums of the build archive can only be computed once the build is complete, it is impossible to include them within `index.json`. + +- **`info/repodata_record.json`** is written (or backfilled) at install/extract time by conda/mamba. Its purpose is to store the channel-style record that the solver actually used — i.e. the entry from the channel’s `repodata.json`, which may include later fixes (repodata patches, e.g. [from conda-forge](https://github.com/conda-forge/conda-forge-repodata-patches)) and therefore can differ from index.json. +If the package didn’t already have such a file, conda will synthesize one from index.json to make the cache uniform. That means the file usually represents “the channel’s view at install time,” but on older/broken installs it can be only “the best local reconstruction” — or, in the presence of bugs, even a degraded record. + ## The corruption pattern When installing packages from an explicit lockfile (e.g., `micromamba install -f 01-explicit.lock`), affected versions write incorrect metadata to `repodata_record.json` files in the package cache.