From bbab2d9c18c34a7e29f891055b551ffbdf4cee0b Mon Sep 17 00:00:00 2001 From: Bela Stoyan Date: Wed, 5 Jun 2024 23:51:54 +0200 Subject: [PATCH] feat: create repodata based on lockfile and add `--inject` support (#10) Co-authored-by: Pavel Zwerschke Co-authored-by: Daniel Elsner --- Cargo.lock | 74 +- Cargo.toml | 15 +- examples/webserver/.gitignore | 3 + examples/webserver/README.md | 14 + .../my-webserver-0.1.0-pyh4616a5c_0.conda | Bin 0 -> 6485 bytes .../my-webserver-0.1.0-pyh4616a5c_0.tar.bz2 | Bin 0 -> 5997 bytes examples/webserver/my_webserver/__init__.py | 8 + examples/webserver/pixi.lock | 2924 +++++++++++++++++ examples/webserver/pixi.toml | 21 + examples/webserver/pyproject.toml | 16 + examples/webserver/recipe/recipe.yaml | 31 + src/main.rs | 12 +- src/pack.rs | 127 +- tests/integration_test.rs | 110 +- 14 files changed, 3279 insertions(+), 76 deletions(-) create mode 100644 examples/webserver/.gitignore create mode 100644 examples/webserver/README.md create mode 100644 examples/webserver/my-webserver-0.1.0-pyh4616a5c_0.conda create mode 100644 examples/webserver/my-webserver-0.1.0-pyh4616a5c_0.tar.bz2 create mode 100644 examples/webserver/my_webserver/__init__.py create mode 100644 examples/webserver/pixi.lock create mode 100644 examples/webserver/pixi.toml create mode 100644 examples/webserver/pyproject.toml create mode 100644 examples/webserver/recipe/recipe.yaml diff --git a/Cargo.lock b/Cargo.lock index 7ddbead..0bcdaa5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -861,12 +861,12 @@ checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" [[package]] name = "file_url" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd0e1a8a0c7a1829090615ebce07ebf31911031a08915ca869f1085f0e39032" +version = "0.1.2" +source = "git+https://github.com/mamba-org/rattler?rev=20c0951#20c0951f858e7d14f2ba24b23ffd47d79b21d78d" dependencies = [ "itertools", "percent-encoding", + "thiserror", "typed-path", "url", ] @@ -2191,6 +2191,7 @@ dependencies = [ "indicatif", "rattler", "rattler_conda_types", + "rattler_digest", "rattler_index", "rattler_lock", "rattler_networking", @@ -2351,9 +2352,8 @@ dependencies = [ [[package]] name = "rattler" -version = "0.26.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a1825842b88187ee73905b52b8eba8ca4d33a8a2d18bd3039f8bff7fccf8934" +version = "0.26.3" +source = "git+https://github.com/mamba-org/rattler?rev=20c0951#20c0951f858e7d14f2ba24b23ffd47d79b21d78d" dependencies = [ "anyhow", "bytes", @@ -2370,6 +2370,7 @@ dependencies = [ "memmap2", "once_cell", "parking_lot", + "rattler_cache", "rattler_conda_types", "rattler_digest", "rattler_networking", @@ -2390,11 +2391,34 @@ dependencies = [ "uuid", ] +[[package]] +name = "rattler_cache" +version = "0.1.0" +source = "git+https://github.com/mamba-org/rattler?rev=20c0951#20c0951f858e7d14f2ba24b23ffd47d79b21d78d" +dependencies = [ + "anyhow", + "chrono", + "digest", + "dirs", + "fxhash", + "itertools", + "parking_lot", + "rattler_conda_types", + "rattler_digest", + "rattler_networking", + "rattler_package_streaming", + "reqwest 0.12.4", + "reqwest-middleware", + "thiserror", + "tokio", + "tracing", + "url", +] + [[package]] name = "rattler_conda_types" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0581fd0ac9589965f5ef5b70e43c1a86844b36047b4f76395df429752341807" +version = "0.25.2" +source = "git+https://github.com/mamba-org/rattler?rev=20c0951#20c0951f858e7d14f2ba24b23ffd47d79b21d78d" dependencies = [ "chrono", "file_url", @@ -2423,8 +2447,7 @@ dependencies = [ [[package]] name = "rattler_digest" version = "0.19.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf69475918dd44152f7df690b13f2909f34cc762ae18a2e2c55824b546de161" +source = "git+https://github.com/mamba-org/rattler?rev=20c0951#20c0951f858e7d14f2ba24b23ffd47d79b21d78d" dependencies = [ "blake2", "digest", @@ -2438,9 +2461,8 @@ dependencies = [ [[package]] name = "rattler_index" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7281d9b78b3e0b3c46d8048977f2e6171fa6d5daded00e2799d03efed676c2" +version = "0.19.16" +source = "git+https://github.com/mamba-org/rattler?rev=20c0951#20c0951f858e7d14f2ba24b23ffd47d79b21d78d" dependencies = [ "fs-err", "rattler_conda_types", @@ -2453,9 +2475,8 @@ dependencies = [ [[package]] name = "rattler_lock" -version = "0.22.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49c0d58e71e2672f34e4097df5a4dba03687b1db759102c53a2270a3c1ddf7f1" +version = "0.22.11" +source = "git+https://github.com/mamba-org/rattler?rev=20c0951#20c0951f858e7d14f2ba24b23ffd47d79b21d78d" dependencies = [ "chrono", "file_url", @@ -2479,8 +2500,7 @@ dependencies = [ [[package]] name = "rattler_macros" version = "0.19.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cef20e8356ea6840294e5754c6a8663b0eb1b97f29d517642f0f99215a2483" +source = "git+https://github.com/mamba-org/rattler?rev=20c0951#20c0951f858e7d14f2ba24b23ffd47d79b21d78d" dependencies = [ "quote", "syn 2.0.66", @@ -2489,8 +2509,7 @@ dependencies = [ [[package]] name = "rattler_networking" version = "0.20.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c582ad6d82b397d1e1522910b34dc052bbed4dedc0eed7fb640024de0dc6f5f6" +source = "git+https://github.com/mamba-org/rattler?rev=20c0951#20c0951f858e7d14f2ba24b23ffd47d79b21d78d" dependencies = [ "anyhow", "async-trait", @@ -2519,9 +2538,8 @@ dependencies = [ [[package]] name = "rattler_package_streaming" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4592a083f590dc5c6e22c34ae6793998297569956fe15f4b0ec78052c12d24c2" +version = "0.21.3" +source = "git+https://github.com/mamba-org/rattler?rev=20c0951#20c0951f858e7d14f2ba24b23ffd47d79b21d78d" dependencies = [ "bzip2", "chrono", @@ -2545,9 +2563,8 @@ dependencies = [ [[package]] name = "rattler_shell" -version = "0.20.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfc42442e2d98ed16556e89e3db5d616e36873e0345820d97b6cacc847591c7" +version = "0.20.8" +source = "git+https://github.com/mamba-org/rattler?rev=20c0951#20c0951f858e7d14f2ba24b23ffd47d79b21d78d" dependencies = [ "enum_dispatch", "indexmap 2.2.6", @@ -3125,8 +3142,7 @@ dependencies = [ [[package]] name = "simple_spawn_blocking" version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b31ed96d1593e129cc76cb7aca364fb5c173558bfda922c15aac4e2f2f5844e" +source = "git+https://github.com/mamba-org/rattler?rev=20c0951#20c0951f858e7d14f2ba24b23ffd47d79b21d78d" dependencies = [ "tokio", ] diff --git a/Cargo.toml b/Cargo.toml index 09f4717..6470e1f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,13 +15,14 @@ clap = { version = "4.5.4", features = ["derive", "string"] } clap-verbosity-flag = "2.2.0" futures = "0.3.30" indicatif = "0.17.8" -rattler = "0.26.2" -rattler_conda_types = "0.25.0" -rattler_index = "0.19.15" -rattler_lock = "0.22.10" -rattler_networking = "0.20.8" -rattler_package_streaming = "0.21.1" -rattler_shell = "0.20.6" +rattler = { git = "https://github.com/mamba-org/rattler", rev = "20c0951" } +rattler_digest = { git = "https://github.com/mamba-org/rattler", rev = "20c0951" } +rattler_conda_types = { git = "https://github.com/mamba-org/rattler", rev = "20c0951" } +rattler_index = { git = "https://github.com/mamba-org/rattler", rev = "20c0951" } +rattler_lock = { git = "https://github.com/mamba-org/rattler", rev = "20c0951" } +rattler_networking = { git = "https://github.com/mamba-org/rattler", rev = "20c0951" } +rattler_package_streaming = { git = "https://github.com/mamba-org/rattler", rev = "20c0951" } +rattler_shell = { git = "https://github.com/mamba-org/rattler", rev = "20c0951" } reqwest = "0.12.4" reqwest-middleware = "0.3.1" serde = { version = "1.0.203", features = ["derive"] } diff --git a/examples/webserver/.gitignore b/examples/webserver/.gitignore new file mode 100644 index 0000000..21db2b6 --- /dev/null +++ b/examples/webserver/.gitignore @@ -0,0 +1,3 @@ +.pixi/ +output/ +__pycache__/ diff --git a/examples/webserver/README.md b/examples/webserver/README.md new file mode 100644 index 0000000..2750b53 --- /dev/null +++ b/examples/webserver/README.md @@ -0,0 +1,14 @@ +# Webserver + +This is a simple web server that runs FastAPI. + +## Run the server + +```bash +rattler-build build -r recipe/recipe.yaml +pixi-pack pack -e prod --platform win-64 --inject output/noarch/my-webserver-*.conda +``` + +> [!NOTE] +> The files `my-webserver-0.1.0-pyh4616a5c_0.conda` and `my-webserver-0.1.0-pyh4616a5c_0.tar.bz2` are only for testing, in a real scenario it would be in the `output/noarch` directory generated by `rattler-build`. +> They were generated using `rattler-build build -r recipe/recipe.yaml --package-format conda` and `rattler-build build -r recipe/recipe.yaml --package-format tar-bz2`. diff --git a/examples/webserver/my-webserver-0.1.0-pyh4616a5c_0.conda b/examples/webserver/my-webserver-0.1.0-pyh4616a5c_0.conda new file mode 100644 index 0000000000000000000000000000000000000000..d790735979809059b5a55980f1eee2e2b190ad1f GIT binary patch literal 6485 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 u|0e+;q$LlqP8}J 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 boL8M^oHlqcoq1%l literal 0 HcmV?d00001 diff --git a/examples/webserver/my_webserver/__init__.py b/examples/webserver/my_webserver/__init__.py new file mode 100644 index 0000000..52f0d71 --- /dev/null +++ b/examples/webserver/my_webserver/__init__.py @@ -0,0 +1,8 @@ +from fastapi import FastAPI + +app = FastAPI() + + +@app.get("/") +def hello(): + return "Hello, World!" diff --git a/examples/webserver/pixi.lock b/examples/webserver/pixi.lock new file mode 100644 index 0000000..ea15d29 --- /dev/null +++ b/examples/webserver/pixi.lock @@ -0,0 +1,2924 @@ +version: 5 +environments: + default: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.1.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.111.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h98912ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.10.0-py312h9a8786e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orjson-3.10.3-py312h4413252_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py312h98912ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.7.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.18.4-py312h4413252_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.3-hab00c5b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.4.7-py312h5715c7c_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.37.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.3-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ujson-5.10.0-py312h7070661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uvicorn-0.30.1-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h31becfc_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.6.2-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.1.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.111.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.40-h9fc2d93_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.2-h2f0025b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-13.2.0-he277a41_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-13.2.0-he277a41_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.45.3-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-13.2.0-h3f4de04_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h68df207_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-2.1.5-py312h9ef2f89_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.10.0-py312h396f95a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.0-h68df207_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orjson-3.10.3-py312h3dd116e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.8-py312hdd3e373_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.7.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.18.4-py312h3dd116e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.3-h43d1f9e_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-4_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ruff-0.4.7-py312h18b2cab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.37.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.3-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ujson-5.10.0-py312h7f10901_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uvicorn-0.30.1-py312h8025657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2 + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.1.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.111.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-17.0.6-h5f092b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-2.1.5-py312he37b823_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.10.0-py312h4a164c9_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-hfb2fe0b_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orjson-3.10.3-py312h552d48e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-5.9.8-py312he37b823_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.7.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.18.4-py312h552d48e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.3-h4a7b5fc_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-4_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.4.7-py312h3402d49_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.37.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.3-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ujson-5.10.0-py312h5c2e7bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvicorn-0.30.1-py312h81bd7bf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.6.2-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.1.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.111.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.3-hcfcfb64_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.5-py312he70551f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/mypy-1.10.0-py312h4389bb4_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.0-h2466b09_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/orjson-3.10.3-py312h426fad5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/psutil-5.9.8-py312he70551f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.7.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.18.4-py312h2615798_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.3-h2628c8c_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.12-4_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ruff-0.4.7-py312h7a6832a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.37.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.3-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/ujson-5.10.0-py312h275cf98_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/uvicorn-0.30.1-py312h2e8e312_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_20.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33135-h835141b_20.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33135-h22015db_20.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + prod: + channels: + - url: https://conda.anaconda.org/conda-forge/ + packages: + linux-64: + - conda: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.1.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.111.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h98912ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/orjson-3.10.3-py312h4413252_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.7.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.18.4-py312h4413252_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.3-hab00c5b_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.37.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.3-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/ujson-5.10.0-py312h7070661_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/uvicorn-0.30.1-py312h7900ff3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + linux-aarch64: + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h31becfc_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.6.2-hcefe29a_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.1.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.111.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.40-h9fc2d93_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.2-h2f0025b_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-13.2.0-he277a41_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-13.2.0-he277a41_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.45.3-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-13.2.0-h3f4de04_7.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h68df207_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-2.1.5-py312h9ef2f89_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.0-h68df207_3.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/orjson-3.10.3-py312h3dd116e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.7.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.18.4-py312h3dd116e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.3-h43d1f9e_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-4_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.37.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.3-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/ujson-5.10.0-py312h7f10901_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/uvicorn-0.30.1-py312h8025657_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2 + osx-arm64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.1.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.111.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-17.0.6-h5f092b4_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-2.1.5-py312he37b823_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-hfb2fe0b_3.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/orjson-3.10.3-py312h552d48e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.7.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.18.4-py312h552d48e_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.3-h4a7b5fc_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-4_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.37.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.3-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ujson-5.10.0-py312h5c2e7bc_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/uvicorn-0.30.1-py312h81bd7bf_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + win-64: + - conda: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/anyio-4.3.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.6.2-h56e8100_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.6.1-pyhd8ed1ab_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.1.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.1.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.111.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.3-hcfcfb64_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.5-py312he70551f_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.0-h2466b09_3.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/orjson-3.10.3-py312h426fad5_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.7.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.18.4-py312h2615798_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.12.3-h2628c8c_0_cpython.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.9-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.12-4_cp312.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/starlette-0.37.2-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.3-pyhd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.3-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.1-hd8ed1ab_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.1-pyha770c72_0.conda + - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/win-64/ujson-5.10.0-py312h275cf98_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/uvicorn-0.30.1-py312h2e8e312_0.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_20.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33135-h835141b_20.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33135-h22015db_20.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 +packages: +- kind: conda + name: _libgcc_mutex + version: '0.1' + build: conda_forge + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2 + sha256: fe51de6107f9edc7aa4f786a70f4a883943bc9d39b3bb7307c04c41410990726 + md5: d7c89558ba9fa0495403155b64376d81 + license: None + purls: [] + size: 2562 + timestamp: 1578324546067 +- kind: conda + name: _openmp_mutex + version: '4.5' + build: 2_gnu + build_number: 16 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2 + sha256: fbe2c5e56a653bebb982eda4876a9178aedfc2b545f25d0ce9c4c0b508253d22 + md5: 73aaf86a425cc6e73fcf236a5a46396d + depends: + - _libgcc_mutex 0.1 conda_forge + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 23621 + timestamp: 1650670423406 +- kind: conda + name: _openmp_mutex + version: '4.5' + build: 2_gnu + build_number: 16 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/_openmp_mutex-4.5-2_gnu.tar.bz2 + sha256: 3702bef2f0a4d38bd8288bbe54aace623602a1343c2cfbefd3fa188e015bebf0 + md5: 6168d71addc746e8f2b8d57dfd2edcea + depends: + - libgomp >=7.5.0 + constrains: + - openmp_impl 9999 + license: BSD-3-Clause + license_family: BSD + size: 23712 + timestamp: 1650670790230 +- kind: conda + name: annotated-types + version: 0.7.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/annotated-types-0.7.0-pyhd8ed1ab_0.conda + sha256: 668f0825b6c18e4012ca24a0070562b6ec801ebc7008228a428eb52b4038873f + md5: 7e9f4612544c8edbfd6afad17f1bd045 + depends: + - python >=3.7 + - typing-extensions >=4.0.0 + license: MIT + license_family: MIT + size: 18235 + timestamp: 1716290348421 +- kind: conda + name: anyio + version: 4.3.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/anyio-4.3.0-pyhd8ed1ab_0.conda + sha256: 86aca4a31c09f9b4dbdb332cd9a6a7dbab62ca734d3f832651c0ab59c6a7f52e + md5: ac95aa8ed65adfdde51132595c79aade + depends: + - exceptiongroup >=1.0.2 + - idna >=2.8 + - python >=3.8 + - sniffio >=1.1 + - typing_extensions >=4.1 + constrains: + - trio >=0.23 + - uvloop >=0.17 + license: MIT + license_family: MIT + size: 102331 + timestamp: 1708355504396 +- kind: conda + name: bzip2 + version: 1.0.8 + build: h31becfc_5 + build_number: 5 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/bzip2-1.0.8-h31becfc_5.conda + sha256: b9f170990625cb1eeefaca02e091dc009a64264b077166d8ed7aeb7a09e923b0 + md5: a64e35f01e0b7a2a152eca87d33b9c87 + depends: + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + size: 189668 + timestamp: 1699280060686 +- kind: conda + name: bzip2 + version: 1.0.8 + build: h93a5062_5 + build_number: 5 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/bzip2-1.0.8-h93a5062_5.conda + sha256: bfa84296a638bea78a8bb29abc493ee95f2a0218775642474a840411b950fe5f + md5: 1bbc659ca658bfd49a481b5ef7a0f40f + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 122325 + timestamp: 1699280294368 +- kind: conda + name: bzip2 + version: 1.0.8 + build: hcfcfb64_5 + build_number: 5 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/bzip2-1.0.8-hcfcfb64_5.conda + sha256: ae5f47a5c86fd6db822931255dcf017eb12f60c77f07dc782ccb477f7808aab2 + md5: 26eb8ca6ea332b675e11704cce84a3be + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: bzip2-1.0.6 + license_family: BSD + size: 124580 + timestamp: 1699280668742 +- kind: conda + name: bzip2 + version: 1.0.8 + build: hd590300_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda + sha256: 242c0c324507ee172c0e0dd2045814e746bb303d1eb78870d182ceb0abc726a8 + md5: 69b8b6202a07720f448be700e300ccf4 + depends: + - libgcc-ng >=12 + license: bzip2-1.0.6 + license_family: BSD + purls: [] + size: 254228 + timestamp: 1699279927352 +- kind: conda + name: ca-certificates + version: 2024.2.2 + build: hbcca054_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.2.2-hbcca054_0.conda + sha256: 91d81bfecdbb142c15066df70cc952590ae8991670198f92c66b62019b251aeb + md5: 2f4327a1cbe7f022401b236e915a5fef + license: ISC + purls: [] + size: 155432 + timestamp: 1706843687645 +- kind: conda + name: ca-certificates + version: 2024.2.2 + build: hf0a4a13_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ca-certificates-2024.2.2-hf0a4a13_0.conda + sha256: 49bc3439816ac72d0c0e0f144b8cc870fdcc4adec2e861407ec818d8116b2204 + md5: fb416a1795f18dcc5a038bc2dc54edf9 + license: ISC + purls: [] + size: 155725 + timestamp: 1706844034242 +- kind: conda + name: ca-certificates + version: 2024.6.2 + build: h56e8100_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2024.6.2-h56e8100_0.conda + sha256: d872d11558ebeaeb87bcf9086e97c075a1a2dfffed2d0e97570cf197ab29e3d8 + md5: 12a3a2b3a00a21bbb390d4de5ad8dd0f + license: ISC + size: 156530 + timestamp: 1717311907623 +- kind: conda + name: ca-certificates + version: 2024.6.2 + build: hcefe29a_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/ca-certificates-2024.6.2-hcefe29a_0.conda + sha256: d27b90ff1e00c34123c37a4c5332bb75c3c5cc6775c57ecfa9f430b629ad3108 + md5: 3ef6b1a30375f8a973a593698e317191 + license: ISC + size: 156128 + timestamp: 1717312862469 +- kind: conda + name: certifi + version: 2024.2.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/certifi-2024.2.2-pyhd8ed1ab_0.conda + sha256: f1faca020f988696e6b6ee47c82524c7806380b37cfdd1def32f92c326caca54 + md5: 0876280e409658fc6f9e75d035960333 + depends: + - python >=3.7 + license: ISC + size: 160559 + timestamp: 1707022289175 +- kind: conda + name: click + version: 8.1.7 + build: unix_pyh707e725_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda + sha256: f0016cbab6ac4138a429e28dbcb904a90305b34b3fe41a9b89d697c90401caec + md5: f3ad426304898027fc619827ff428eca + depends: + - __unix + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + size: 84437 + timestamp: 1692311973840 +- kind: conda + name: click + version: 8.1.7 + build: win_pyh7428d3b_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-win_pyh7428d3b_0.conda + sha256: 90236b113b9a20041736e80b80ee965167f9aac0468315c55e2bad902d673fb0 + md5: 3549ecbceb6cd77b91a105511b7d0786 + depends: + - __win + - colorama + - python >=3.8 + license: BSD-3-Clause + license_family: BSD + size: 85051 + timestamp: 1692312207348 +- kind: conda + name: colorama + version: 0.4.6 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2 + sha256: 2c1b2e9755ce3102bca8d69e8f26e4f087ece73f50418186aee7c74bef8e1698 + md5: 3faab06a954c2a04039983f2c4a50d99 + depends: + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + size: 25170 + timestamp: 1666700778190 +- kind: conda + name: dnspython + version: 2.6.1 + build: pyhd8ed1ab_1 + build_number: 1 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/dnspython-2.6.1-pyhd8ed1ab_1.conda + sha256: 0d52c878553e569bccfbd96472c1659fb873bc05e95911b457d35982827626fe + md5: 936e6aadb75534384d11d982fab74b61 + depends: + - python >=3.8.0,<4.0.0 + - sniffio + constrains: + - h2 >=4.1.0 + - httpcore >=1.0.0 + - wmi >=1.5.1 + - trio >=0.23 + - aioquic >=0.9.25 + - cryptography >=42 + - idna >=3.6 + - httpx >=0.26.0 + license: ISC + license_family: OTHER + size: 169434 + timestamp: 1709190848615 +- kind: conda + name: email-validator + version: 2.1.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/email-validator-2.1.1-pyhd8ed1ab_0.conda + sha256: b04dcb7f16d0b67b11988e060f5f9f3db175b6d461a39e06bd2e3730d8323bb2 + md5: d986a18f7b05189ab0990042310a1451 + depends: + - dnspython >=2.0.0 + - idna >=2.0.0 + - python >=3.7 + license: Unlicense + size: 40718 + timestamp: 1709024546069 +- kind: conda + name: email_validator + version: 2.1.1 + build: hd8ed1ab_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/email_validator-2.1.1-hd8ed1ab_0.conda + sha256: 6a13717a5f7c7e0d619d0675c562abff8d8b0993b22b5af5957b7b64b67cd606 + md5: 6b084a2de311de1ed0640e9ada01b4d2 + depends: + - email-validator >=2.1.1,<2.1.2.0a0 + license: Unlicense + size: 6616 + timestamp: 1709024550191 +- kind: conda + name: exceptiongroup + version: 1.2.0 + build: pyhd8ed1ab_2 + build_number: 2 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda + sha256: a6ae416383bda0e3ed14eaa187c653e22bec94ff2aa3b56970cdf0032761e80d + md5: 8d652ea2ee8eaee02ed8dc820bc794aa + depends: + - python >=3.7 + license: MIT and PSF-2.0 + size: 20551 + timestamp: 1704921321122 +- kind: conda + name: fastapi + version: 0.111.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/fastapi-0.111.0-pyhd8ed1ab_0.conda + sha256: 98cc823775b794b6ce45f02af5e4b711065ed0787c8eaec027434dabdb308bf7 + md5: 7d347962e391cffc68f922c344f7cb3c + depends: + - email_validator >=2.0.0 + - fastapi-cli >=0.0.2 + - httpx >=0.23.0 + - jinja2 >=2.11.2 + - orjson >=3.2.1 + - pydantic >=1.7.4,!=1.8,!=1.8.1,!=2.0.0,!=2.0.1,!=2.1.0,<3.0.0 + - python >=3.8 + - python-multipart >=0.0.7 + - starlette >=0.37.2,<0.38.0 + - typing-extensions >=4.8.0 + - ujson >=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0 + - uvicorn >=0.12.0 + license: MIT + license_family: MIT + size: 71107 + timestamp: 1715197099580 +- kind: conda + name: fastapi-cli + version: 0.0.4 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/fastapi-cli-0.0.4-pyhd8ed1ab_0.conda + sha256: 1b812ecef00b17b9b2714c4ea72de0272e817b95475b18af5400b26a6e571e71 + md5: 2581ef67574e5b5400c0c151cc1c8b15 + depends: + - fastapi + - python >=3.8 + - typer >=0.12.3 + - uvicorn >=0.15.0 + license: MIT + license_family: MIT + size: 14596 + timestamp: 1716205900682 +- kind: conda + name: h11 + version: 0.14.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/h11-0.14.0-pyhd8ed1ab_0.tar.bz2 + sha256: 817d2c77d53afe3f3d9cf7f6eb8745cdd8ea76c7adaa9d7ced75c455a2c2c085 + md5: b21ed0883505ba1910994f1df031a428 + depends: + - python >=3 + - typing_extensions + license: MIT + license_family: MIT + size: 48251 + timestamp: 1664132995560 +- kind: conda + name: h2 + version: 4.1.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2 + sha256: bfc6a23849953647f4e255c782e74a0e18fe16f7e25c7bb0bc57b83bb6762c7a + md5: b748fbf7060927a6e82df7cb5ee8f097 + depends: + - hpack >=4.0,<5 + - hyperframe >=6.0,<7 + - python >=3.6.1 + license: MIT + license_family: MIT + size: 46754 + timestamp: 1634280590080 +- kind: conda + name: hpack + version: 4.0.0 + build: pyh9f0ad1d_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2 + sha256: 5dec948932c4f740674b1afb551223ada0c55103f4c7bf86a110454da3d27cb8 + md5: 914d6646c4dbb1fd3ff539830a12fd71 + depends: + - python + license: MIT + license_family: MIT + size: 25341 + timestamp: 1598856368685 +- kind: conda + name: httpcore + version: 1.0.5 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/httpcore-1.0.5-pyhd8ed1ab_0.conda + sha256: 4025644200eefa0598e4600a66fd4804a57d9fd7054a5c8c45e508fd875e0b84 + md5: a6b9a0158301e697e4d0a36a3d60e133 + depends: + - anyio >=3.0,<5.0 + - certifi + - h11 >=0.13,<0.15 + - h2 >=3,<5 + - python >=3.8 + - sniffio 1.* + license: BSD-3-Clause + license_family: BSD + size: 45816 + timestamp: 1711597091407 +- kind: conda + name: httpx + version: 0.27.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/httpx-0.27.0-pyhd8ed1ab_0.conda + sha256: fdaf341fb2630b7afe8238315448fc93947f77ebfa4da68bb349e1bcf820af58 + md5: 9f359af5a886fd6ca6b2b6ea02e58332 + depends: + - anyio + - certifi + - httpcore 1.* + - idna + - python >=3.8 + - sniffio + license: BSD-3-Clause + license_family: BSD + size: 64651 + timestamp: 1708531043505 +- kind: conda + name: hyperframe + version: 6.0.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2 + sha256: e374a9d0f53149328134a8d86f5d72bca4c6dcebed3c0ecfa968c02996289330 + md5: 9f765cbfab6870c8435b9eefecd7a1f4 + depends: + - python >=3.6 + license: MIT + license_family: MIT + size: 14646 + timestamp: 1619110249723 +- kind: conda + name: idna + version: '3.7' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda + sha256: 9687ee909ed46169395d4f99a0ee94b80a52f87bed69cd454bb6d37ffeb0ec7b + md5: c0cc1420498b17414d8617d0b9f506ca + depends: + - python >=3.6 + license: BSD-3-Clause + license_family: BSD + size: 52718 + timestamp: 1713279497047 +- kind: conda + name: iniconfig + version: 2.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda + sha256: 38740c939b668b36a50ef455b077e8015b8c9cf89860d421b3fff86048f49666 + md5: f800d2da156d08e289b14e87e43c1ae5 + depends: + - python >=3.7 + license: MIT + license_family: MIT + size: 11101 + timestamp: 1673103208955 +- kind: conda + name: jinja2 + version: 3.1.4 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.4-pyhd8ed1ab_0.conda + sha256: 27380d870d42d00350d2d52598cddaf02f9505fb24be09488da0c9b8d1428f2d + md5: 7b86ecb7d3557821c649b3c31e3eb9f2 + depends: + - markupsafe >=2.0 + - python >=3.7 + license: BSD-3-Clause + license_family: BSD + size: 111565 + timestamp: 1715127275924 +- kind: conda + name: ld_impl_linux-64 + version: '2.40' + build: hf3520f5_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_1.conda + sha256: cb54a873c1c84c47f7174093889686b626946b8143905ec0f76a56785b26a304 + md5: 33b7851c39c25da14f6a233a8ccbeeca + constrains: + - binutils_impl_linux-64 2.40 + license: GPL-3.0-only + purls: [] + size: 707934 + timestamp: 1716583433869 +- kind: conda + name: ld_impl_linux-aarch64 + version: '2.40' + build: h9fc2d93_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/ld_impl_linux-aarch64-2.40-h9fc2d93_1.conda + sha256: 437f035978cf10db4db41991e66d2d02f19acd36d4d88e740cac130b38a45015 + md5: 8a90b17a5d12ba55b7d90534f38579d0 + constrains: + - binutils_impl_linux-aarch64 2.40 + license: GPL-3.0-only + license_family: GPL + size: 735216 + timestamp: 1716583633752 +- kind: conda + name: libcxx + version: 17.0.6 + build: h5f092b4_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-17.0.6-h5f092b4_0.conda + sha256: 119d3d9306f537d4c89dc99ed99b94c396d262f0b06f7833243646f68884f2c2 + md5: a96fd5dda8ce56c86a971e0fa02751d0 + depends: + - __osx >=11.0 + license: Apache-2.0 WITH LLVM-exception + license_family: Apache + size: 1248885 + timestamp: 1715020154867 +- kind: conda + name: libexpat + version: 2.6.2 + build: h2f0025b_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libexpat-2.6.2-h2f0025b_0.conda + sha256: 07453df3232a649f39fb4d1e68cfe1c78c3457764f85225f6f3ccd1bdd9818a4 + md5: 1b9f46b804a2c3c5d7fd6a80b77c35f9 + depends: + - libgcc-ng >=12 + constrains: + - expat 2.6.2.* + license: MIT + license_family: MIT + size: 72544 + timestamp: 1710362309065 +- kind: conda + name: libexpat + version: 2.6.2 + build: h59595ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda + sha256: 331bb7c7c05025343ebd79f86ae612b9e1e74d2687b8f3179faec234f986ce19 + md5: e7ba12deb7020dd080c6c70e7b6f6a3d + depends: + - libgcc-ng >=12 + constrains: + - expat 2.6.2.* + license: MIT + license_family: MIT + purls: [] + size: 73730 + timestamp: 1710362120304 +- kind: conda + name: libexpat + version: 2.6.2 + build: h63175ca_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libexpat-2.6.2-h63175ca_0.conda + sha256: 79f612f75108f3e16bbdc127d4885bb74729cf66a8702fca0373dad89d40c4b7 + md5: bc592d03f62779511d392c175dcece64 + constrains: + - expat 2.6.2.* + license: MIT + license_family: MIT + size: 139224 + timestamp: 1710362609641 +- kind: conda + name: libexpat + version: 2.6.2 + build: hebf3989_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.6.2-hebf3989_0.conda + sha256: ba7173ac30064ea901a4c9fb5a51846dcc25512ceb565759be7d18cbf3e5415e + md5: e3cde7cfa87f82f7cb13d482d5e0ad09 + constrains: + - expat 2.6.2.* + license: MIT + license_family: MIT + purls: [] + size: 63655 + timestamp: 1710362424980 +- kind: conda + name: libffi + version: 3.4.2 + build: h3422bc3_5 + build_number: 5 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libffi-3.4.2-h3422bc3_5.tar.bz2 + sha256: 41b3d13efb775e340e4dba549ab5c029611ea6918703096b2eaa9c015c0750ca + md5: 086914b672be056eb70fd4285b6783b6 + license: MIT + license_family: MIT + purls: [] + size: 39020 + timestamp: 1636488587153 +- kind: conda + name: libffi + version: 3.4.2 + build: h3557bc0_5 + build_number: 5 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libffi-3.4.2-h3557bc0_5.tar.bz2 + sha256: 7e9258a102480757fe3faeb225a3ca04dffd10fecd2a958c65cdb4cdf75f2c3c + md5: dddd85f4d52121fab0a8b099c5e06501 + depends: + - libgcc-ng >=9.4.0 + license: MIT + license_family: MIT + size: 59450 + timestamp: 1636488255090 +- kind: conda + name: libffi + version: 3.4.2 + build: h7f98852_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2 + sha256: ab6e9856c21709b7b517e940ae7028ae0737546122f83c2aa5d692860c3b149e + md5: d645c6d2ac96843a2bfaccd2d62b3ac3 + depends: + - libgcc-ng >=9.4.0 + license: MIT + license_family: MIT + purls: [] + size: 58292 + timestamp: 1636488182923 +- kind: conda + name: libffi + version: 3.4.2 + build: h8ffe710_5 + build_number: 5 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libffi-3.4.2-h8ffe710_5.tar.bz2 + sha256: 1951ab740f80660e9bc07d2ed3aefb874d78c107264fd810f24a1a6211d4b1a5 + md5: 2c96d1b6915b408893f9472569dee135 + depends: + - vc >=14.1,<15.0a0 + - vs2015_runtime >=14.16.27012 + license: MIT + license_family: MIT + size: 42063 + timestamp: 1636489106777 +- kind: conda + name: libgcc-ng + version: 13.2.0 + build: h77fa898_7 + build_number: 7 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_7.conda + sha256: 62af2b89acbe74a21606c8410c276e57309c0a2ab8a9e8639e3c8131c0b60c92 + md5: 72ec1b1b04c4d15d4204ece1ecea5978 + depends: + - _libgcc_mutex 0.1 conda_forge + - _openmp_mutex >=4.5 + constrains: + - libgomp 13.2.0 h77fa898_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 775806 + timestamp: 1715016057793 +- kind: conda + name: libgcc-ng + version: 13.2.0 + build: he277a41_7 + build_number: 7 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgcc-ng-13.2.0-he277a41_7.conda + sha256: ef2f338b3342b51700e6cda10831d27bb2983fe64d7e75e30e9ffb7f9cf76571 + md5: 01c5b27ce46f50abab2dc8454842c792 + depends: + - _openmp_mutex >=4.5 + constrains: + - libgomp 13.2.0 he277a41_7 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 458977 + timestamp: 1715017703433 +- kind: conda + name: libgomp + version: 13.2.0 + build: h77fa898_7 + build_number: 7 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_7.conda + sha256: 781444fa069d3b50e8ed667b750571cacda785761c7fc2a89ece1ac49693d4ad + md5: abf3fec87c2563697defa759dec3d639 + depends: + - _libgcc_mutex 0.1 conda_forge + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + purls: [] + size: 422336 + timestamp: 1715015995979 +- kind: conda + name: libgomp + version: 13.2.0 + build: he277a41_7 + build_number: 7 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libgomp-13.2.0-he277a41_7.conda + sha256: bb3bc7e03f1add861884d8bad79b359ad991025570625e1f979964e82f1f8d9e + md5: 1d1691ec9e5be799f86310fa38f00b9f + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 424004 + timestamp: 1715017599237 +- kind: conda + name: libnsl + version: 2.0.1 + build: h31becfc_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libnsl-2.0.1-h31becfc_0.conda + sha256: fd18c2b75d7411096428d36a70b36b1a17e31f7b8956b6905d145792d49e97f8 + md5: c14f32510f694e3185704d89967ec422 + depends: + - libgcc-ng >=12 + license: LGPL-2.1-only + license_family: GPL + size: 34501 + timestamp: 1697358973269 +- kind: conda + name: libnsl + version: 2.0.1 + build: hd590300_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda + sha256: 26d77a3bb4dceeedc2a41bd688564fe71bf2d149fdcf117049970bc02ff1add6 + md5: 30fd6e37fe21f86f4bd26d6ee73eeec7 + depends: + - libgcc-ng >=12 + license: LGPL-2.1-only + license_family: GPL + purls: [] + size: 33408 + timestamp: 1697359010159 +- kind: conda + name: libsqlite + version: 3.45.3 + build: h091b4b1_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.45.3-h091b4b1_0.conda + sha256: 4337f466eb55bbdc74e168b52ec8c38f598e3664244ec7a2536009036e2066cc + md5: c8c1186c7f3351f6ffddb97b1f54fc58 + depends: + - libzlib >=1.2.13,<1.3.0a0 + license: Unlicense + purls: [] + size: 824794 + timestamp: 1713367748819 +- kind: conda + name: libsqlite + version: 3.45.3 + build: h194ca79_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libsqlite-3.45.3-h194ca79_0.conda + sha256: be87d8b67bdf892665c709d82c48011991fbf2fa15c19b006379b03ed494b070 + md5: fb35b8afbe9e92467ac7b5608d60b775 + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: Unlicense + size: 1036705 + timestamp: 1713367400740 +- kind: conda + name: libsqlite + version: 3.45.3 + build: h2797004_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.45.3-h2797004_0.conda + sha256: e2273d6860eadcf714a759ffb6dc24a69cfd01f2a0ea9d6c20f86049b9334e0c + md5: b3316cbe90249da4f8e84cd66e1cc55b + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<1.3.0a0 + license: Unlicense + purls: [] + size: 859858 + timestamp: 1713367435849 +- kind: conda + name: libsqlite + version: 3.45.3 + build: hcfcfb64_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.45.3-hcfcfb64_0.conda + sha256: 06ec75faa51d7ec6d5db98889e869b579a9df19d7d3d9baff8359627da4a3b7e + md5: 73f5dc8e2d55d9a1e14b11f49c3b4a28 + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: Unlicense + size: 870518 + timestamp: 1713367888406 +- kind: conda + name: libstdcxx-ng + version: 13.2.0 + build: h3f4de04_7 + build_number: 7 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libstdcxx-ng-13.2.0-h3f4de04_7.conda + sha256: ed58d37fde428858e0efa4022c758beb2ea5ae7be93ccfb548f95ef9b60c2ef5 + md5: 2a54872c7fab2db99b0074212d8efe64 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3750765 + timestamp: 1715017787940 +- kind: conda + name: libstdcxx-ng + version: 13.2.0 + build: hc0a3c3a_7 + build_number: 7 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_7.conda + sha256: 35f1e08be0a84810c9075f5bd008495ac94e6c5fe306dfe4b34546f11fed850f + md5: 53ebd4c833fa01cb2c6353e99f905406 + license: GPL-3.0-only WITH GCC-exception-3.1 + license_family: GPL + size: 3837704 + timestamp: 1715016117360 +- kind: conda + name: libuuid + version: 2.38.1 + build: h0b41bf4_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda + sha256: 787eb542f055a2b3de553614b25f09eefb0a0931b0c87dbcce6efdfd92f04f18 + md5: 40b61aab5c7ba9ff276c41cfffe6b80b + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 33601 + timestamp: 1680112270483 +- kind: conda + name: libuuid + version: 2.38.1 + build: hb4cce97_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libuuid-2.38.1-hb4cce97_0.conda + sha256: 616277b0c5f7616c2cdf36f6c316ea3f9aa5bb35f2d4476a349ab58b9b91675f + md5: 000e30b09db0b7c775b21695dff30969 + depends: + - libgcc-ng >=12 + license: BSD-3-Clause + license_family: BSD + size: 35720 + timestamp: 1680113474501 +- kind: conda + name: libxcrypt + version: 4.4.36 + build: h31becfc_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libxcrypt-4.4.36-h31becfc_1.conda + sha256: 6b46c397644091b8a26a3048636d10b989b1bf266d4be5e9474bf763f828f41f + md5: b4df5d7d4b63579d081fd3a4cf99740e + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + size: 114269 + timestamp: 1702724369203 +- kind: conda + name: libxcrypt + version: 4.4.36 + build: hd590300_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda + sha256: 6ae68e0b86423ef188196fff6207ed0c8195dd84273cb5623b85aa08033a410c + md5: 5aa797f8787fe7a17d1b0821485b5adc + depends: + - libgcc-ng >=12 + license: LGPL-2.1-or-later + purls: [] + size: 100393 + timestamp: 1702724383534 +- kind: conda + name: libzlib + version: 1.2.13 + build: h53f4e23_5 + build_number: 5 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda + sha256: ab1c8aefa2d54322a63aaeeefe9cf877411851738616c4068e0dccc66b9c758a + md5: 1a47f5236db2e06a320ffa0392f81bd8 + constrains: + - zlib 1.2.13 *_5 + license: Zlib + license_family: Other + purls: [] + size: 48102 + timestamp: 1686575426584 +- kind: conda + name: libzlib + version: 1.2.13 + build: hd590300_5 + build_number: 5 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda + sha256: 370c7c5893b737596fd6ca0d9190c9715d89d888b8c88537ae1ef168c25e82e4 + md5: f36c115f1ee199da648e0597ec2047ad + depends: + - libgcc-ng >=12 + constrains: + - zlib 1.2.13 *_5 + license: Zlib + license_family: Other + purls: [] + size: 61588 + timestamp: 1686575217516 +- kind: conda + name: libzlib + version: 1.3.1 + build: h2466b09_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.3.1-h2466b09_1.conda + sha256: b13846a54a15243e15f96fec06b526d8155adc6a1ac2b6ed47a88f6a71a94b68 + md5: d4483ca8afc57ddf1f6dded53b36c17f + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - zlib 1.3.1 *_1 + license: Zlib + license_family: Other + size: 56186 + timestamp: 1716874730539 +- kind: conda + name: libzlib + version: 1.3.1 + build: h68df207_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/libzlib-1.3.1-h68df207_1.conda + sha256: 0d6dfd1e36e10c205ff1fdcf42d42289ff0f50be7a4eaa7b34f086a5e22a0734 + md5: b13fb82f88902e34dd0638cd7d378c21 + depends: + - libgcc-ng >=12 + constrains: + - zlib 1.3.1 *_1 + license: Zlib + license_family: Other + size: 67199 + timestamp: 1716874136348 +- kind: conda + name: markdown-it-py + version: 3.0.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda + sha256: c041b0eaf7a6af3344d5dd452815cdc148d6284fec25a4fa3f4263b3a021e962 + md5: 93a8e71256479c62074356ef6ebf501b + depends: + - mdurl >=0.1,<1 + - python >=3.8 + license: MIT + license_family: MIT + size: 64356 + timestamp: 1686175179621 +- kind: conda + name: markupsafe + version: 2.1.5 + build: py312h98912ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.5-py312h98912ed_0.conda + sha256: 273d8efd6c089c534ccbede566394c0ac1e265bfe5d89fe76e80332f3d75a636 + md5: 6ff0b9582da2d4a74a1f9ae1f9ce2af6 + depends: + - libgcc-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=conda-forge-mapping + size: 26685 + timestamp: 1706900070330 +- kind: conda + name: markupsafe + version: 2.1.5 + build: py312h9ef2f89_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/markupsafe-2.1.5-py312h9ef2f89_0.conda + sha256: dbd85f5230b69165fe9d1e66ed60ae697da314ed041f485be09b8c1fbcc7af3a + md5: a00135adde3dfe19b9962c3c767c2129 + depends: + - libgcc-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + size: 27435 + timestamp: 1706901498578 +- kind: conda + name: markupsafe + version: 2.1.5 + build: py312he37b823_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/markupsafe-2.1.5-py312he37b823_0.conda + sha256: 61480b725490f68856dd14e646f51ffc34f77f2c985bd33e3b77c04b2856d97d + md5: ba3a8f8cf8bbdb81394275b1e1d271da + depends: + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + purls: + - pkg:pypi/markupsafe?source=conda-forge-mapping + size: 26382 + timestamp: 1706900495057 +- kind: conda + name: markupsafe + version: 2.1.5 + build: py312he70551f_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/markupsafe-2.1.5-py312he70551f_0.conda + sha256: f8690a3c87e2e96cebd434a829bb95cac43afe6c439530b336dc3452fe4ce4af + md5: 4950a739b19edaac1ed29ca9474e49ac + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - jinja2 >=3.0.0 + license: BSD-3-Clause + license_family: BSD + size: 29060 + timestamp: 1706900374745 +- kind: conda + name: mdurl + version: 0.1.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.2-pyhd8ed1ab_0.conda + sha256: 64073dfb6bb429d52fff30891877b48c7ec0f89625b1bf844905b66a81cce6e1 + md5: 776a8dd9e824f77abac30e6ef43a8f7a + depends: + - python >=3.6 + license: MIT + license_family: MIT + size: 14680 + timestamp: 1704317789138 +- kind: conda + name: mypy + version: 1.10.0 + build: py312h396f95a_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/mypy-1.10.0-py312h396f95a_0.conda + sha256: 2ddcff3817b2e96bcc22b9da312b246b5932f2b1ea5d6d7a9390c876aaf3747e + md5: c0586acc6ed5864bfbeb015d9554659e + depends: + - libgcc-ng >=12 + - mypy_extensions >=1.0.0 + - psutil >=4.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - typing_extensions >=4.1.0 + license: MIT + license_family: MIT + size: 15461991 + timestamp: 1714002287106 +- kind: conda + name: mypy + version: 1.10.0 + build: py312h4389bb4_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/mypy-1.10.0-py312h4389bb4_0.conda + sha256: ebcbd3487698e9e4356dbf7a94eb3bb582c5421098862bc6d9fd8887a6949fb7 + md5: 31efeca32ad254e43198a0ce37156ce6 + depends: + - mypy_extensions >=1.0.0 + - psutil >=4.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - typing_extensions >=4.1.0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 8388614 + timestamp: 1714002079609 +- kind: conda + name: mypy + version: 1.10.0 + build: py312h4a164c9_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/mypy-1.10.0-py312h4a164c9_0.conda + sha256: 3d6f618f8c366ff766686a36467c81068f2583696a23f63366641a50f2133082 + md5: 35bf371fb16eed1be04831c597f91870 + depends: + - __osx >=11.0 + - mypy_extensions >=1.0.0 + - psutil >=4.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - typing_extensions >=4.1.0 + license: MIT + license_family: MIT + size: 9636672 + timestamp: 1714003119958 +- kind: conda + name: mypy + version: 1.10.0 + build: py312h9a8786e_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/mypy-1.10.0-py312h9a8786e_0.conda + sha256: 202a1223ab7b6d78a553a8a6768a0088166f482e48b736afd2c6a6d65f466b99 + md5: 644f1c538810d1f250ef0fc844f3822d + depends: + - libgcc-ng >=12 + - mypy_extensions >=1.0.0 + - psutil >=4.0 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - typing_extensions >=4.1.0 + license: MIT + license_family: MIT + size: 16580238 + timestamp: 1714002375040 +- kind: conda + name: mypy_extensions + version: 1.0.0 + build: pyha770c72_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda + sha256: f240217476e148e825420c6bc3a0c0efb08c0718b7042fae960400c02af858a3 + md5: 4eccaeba205f0aed9ac3a9ea58568ca3 + depends: + - python >=3.5 + license: MIT + license_family: MIT + size: 10492 + timestamp: 1675543414256 +- kind: conda + name: ncurses + version: '6.5' + build: h0425590_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/ncurses-6.5-h0425590_0.conda + sha256: f8002feaa9e0eb929cd123f1275d8c0b3c6ffb7fd9269b192927009df19dc89e + md5: 38362af7bfac0efef69675acee564458 + depends: + - libgcc-ng >=12 + license: X11 AND BSD-3-Clause + size: 925099 + timestamp: 1715194843316 +- kind: conda + name: ncurses + version: '6.5' + build: h59595ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda + sha256: 4fc3b384f4072b68853a0013ea83bdfd3d66b0126e2238e1d6e1560747aa7586 + md5: fcea371545eda051b6deafb24889fc69 + depends: + - libgcc-ng >=12 + license: X11 AND BSD-3-Clause + purls: [] + size: 887465 + timestamp: 1715194722503 +- kind: conda + name: ncurses + version: '6.5' + build: hb89a1cb_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.5-hb89a1cb_0.conda + sha256: 87d7cf716d9d930dab682cb57b3b8d3a61940b47d6703f3529a155c938a6990a + md5: b13ad5724ac9ae98b6b4fd87e4500ba4 + license: X11 AND BSD-3-Clause + purls: [] + size: 795131 + timestamp: 1715194898402 +- kind: conda + name: openssl + version: 3.3.0 + build: h2466b09_3 + build_number: 3 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/openssl-3.3.0-h2466b09_3.conda + sha256: 11b2513fceb20102bdc7f7656a59005acb9ecd0886b7cbfb9c13c2c953f2429b + md5: d7fec5d3bb8fc0c8e266bf1ad350cec5 + depends: + - ca-certificates + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + constrains: + - pyopenssl >=22.1 + license: Apache-2.0 + license_family: Apache + size: 8368468 + timestamp: 1716471282135 +- kind: conda + name: openssl + version: 3.3.0 + build: h4ab18f5_3 + build_number: 3 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.0-h4ab18f5_3.conda + sha256: 33dcea0ed3a61b2de6b66661cdd55278640eb99d676cd129fbff3e53641fa125 + md5: 12ea6d0d4ed54530eaed18e4835c1f7c + depends: + - ca-certificates + - libgcc-ng >=12 + constrains: + - pyopenssl >=22.1 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2891147 + timestamp: 1716468354865 +- kind: conda + name: openssl + version: 3.3.0 + build: h68df207_3 + build_number: 3 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/openssl-3.3.0-h68df207_3.conda + sha256: f9e595c35fe111aca838233b5d553cac61f9041c445b770458749ddd995e32a4 + md5: f2dec4814ac9649cd3d3e474cd0b9a58 + depends: + - ca-certificates + - libgcc-ng >=12 + constrains: + - pyopenssl >=22.1 + license: Apache-2.0 + license_family: Apache + size: 3425119 + timestamp: 1716468294988 +- kind: conda + name: openssl + version: 3.3.0 + build: hfb2fe0b_3 + build_number: 3 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.3.0-hfb2fe0b_3.conda + sha256: 6f41c163ab57e7499dff092be4498614651f0f6432e12c2b9f06859a8bc39b75 + md5: 730f618b008b3c13c1e3f973408ddd67 + depends: + - __osx >=11.0 + - ca-certificates + constrains: + - pyopenssl >=22.1 + license: Apache-2.0 + license_family: Apache + purls: [] + size: 2893954 + timestamp: 1716468329572 +- kind: conda + name: orjson + version: 3.10.3 + build: py312h3dd116e_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/orjson-3.10.3-py312h3dd116e_0.conda + sha256: 5c2e4934e177e7d9c65345b6df5ebe674ad4fec81757a6794412d8a3b7ccf3a6 + md5: 6704b2fd85dd08a7f4d135601c5ae298 + depends: + - libgcc-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + size: 272429 + timestamp: 1714769702351 +- kind: conda + name: orjson + version: 3.10.3 + build: py312h426fad5_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/orjson-3.10.3-py312h426fad5_0.conda + sha256: 2f7097ba826d65aebc1f2bab7173d8b8dfd9e80ee4188a989bd92e297a1aae2e + md5: ac1c29c4712b79045e8adb05f7745d48 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + size: 191946 + timestamp: 1714770616126 +- kind: conda + name: orjson + version: 3.10.3 + build: py312h4413252_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/orjson-3.10.3-py312h4413252_0.conda + sha256: 80c3e05a1657a38050b4c5f72fc5a8fbd7e0d49d6ec1e70edb50261d8657874c + md5: 1789656ceb161e848a385c7c61af3e91 + depends: + - libgcc-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: Apache-2.0 + license_family: Apache + size: 281227 + timestamp: 1714769674509 +- kind: conda + name: orjson + version: 3.10.3 + build: py312h552d48e_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/orjson-3.10.3-py312h552d48e_0.conda + sha256: 040c5aabedfadd76486dbc198b10283c0fedab94d8bab2f2ba9077e0e08b9c85 + md5: 6759d0211d0dcabbee121d916d1421a0 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + license: Apache-2.0 + license_family: Apache + size: 241130 + timestamp: 1714770289818 +- kind: conda + name: packaging + version: '24.0' + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda + sha256: a390182d74c31dfd713c16db888c92c277feeb6d1fe96ff9d9c105f9564be48a + md5: 248f521b64ce055e7feae3105e7abeb8 + depends: + - python >=3.8 + license: Apache-2.0 + license_family: APACHE + size: 49832 + timestamp: 1710076089469 +- kind: conda + name: pluggy + version: 1.5.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda + sha256: 33eaa3359948a260ebccf9cdc2fd862cea5a6029783289e13602d8e634cd9a26 + md5: d3483c8fc2dc2cc3f5cf43e26d60cabf + depends: + - python >=3.8 + license: MIT + license_family: MIT + size: 23815 + timestamp: 1713667175451 +- kind: conda + name: psutil + version: 5.9.8 + build: py312h98912ed_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py312h98912ed_0.conda + sha256: 27e7f8f5d30c74439f39d61e21ac14c0cd03b5d55f7bf9f946fb619016f73c61 + md5: 3facaca6cc0f7988df3250efccd32da3 + depends: + - libgcc-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 486243 + timestamp: 1705722547420 +- kind: conda + name: psutil + version: 5.9.8 + build: py312hdd3e373_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/psutil-5.9.8-py312hdd3e373_0.conda + sha256: 21466ab2102ee041dc11805e0d8e7354782beccf49df2bfa366758e3ceae6c70 + md5: 1a87f588762a48fb42311b0c40fa1920 + depends: + - libgcc-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 489623 + timestamp: 1705722741120 +- kind: conda + name: psutil + version: 5.9.8 + build: py312he37b823_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/psutil-5.9.8-py312he37b823_0.conda + sha256: a996bd5f878da264d1d3ba7fde717b0a2c158a86645efb1e899d087cca74832d + md5: cd6e99b9c5a623735161973b5f693a86 + depends: + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 499490 + timestamp: 1705722767772 +- kind: conda + name: psutil + version: 5.9.8 + build: py312he70551f_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/psutil-5.9.8-py312he70551f_0.conda + sha256: 36f8addb327f80da4d6bd421170ff4cf8fb570d9ee8df39372427a4e33298dca + md5: 5f2998851564bea33a159bd00e6249e8 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + size: 503677 + timestamp: 1705722843679 +- kind: conda + name: pydantic + version: 2.7.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pydantic-2.7.3-pyhd8ed1ab_0.conda + sha256: d51b017cf844c9d681d10bd1c2d38143a5d9cd027e39475104f580e3e258b4f5 + md5: a883413646e6a5b60e738769f58f0850 + depends: + - annotated-types >=0.4.0 + - pydantic-core 2.18.4 + - python >=3.7 + - typing-extensions >=4.6.1 + license: MIT + license_family: MIT + size: 282630 + timestamp: 1717481478569 +- kind: conda + name: pydantic-core + version: 2.18.4 + build: py312h2615798_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/pydantic-core-2.18.4-py312h2615798_0.conda + sha256: 5f5d1ef69f84fa460958ded4b6a581de371efe31817d2ca072d36e974702e8cb + md5: 6eea75ff6b18cac79f9a984c2c37f476 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6.0,!=4.7.0 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 1596376 + timestamp: 1717464102802 +- kind: conda + name: pydantic-core + version: 2.18.4 + build: py312h3dd116e_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/pydantic-core-2.18.4-py312h3dd116e_0.conda + sha256: f06e0466e26a0b44c202f2e581195e4b598c675bc1512d802be2dd7df78f447c + md5: 8b3a8b41a74aad414ecc2e39dd4e89f4 + depends: + - libgcc-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6.0,!=4.7.0 + license: MIT + license_family: MIT + size: 1509266 + timestamp: 1717463155870 +- kind: conda + name: pydantic-core + version: 2.18.4 + build: py312h4413252_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/pydantic-core-2.18.4-py312h4413252_0.conda + sha256: d7af4fa02992b9f883a4c4be4db75321e82b0f77fac15a7abd5f2ca9917d1cb1 + md5: 760628de5ba09598d4ab4cd9d021228b + depends: + - libgcc-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6.0,!=4.7.0 + license: MIT + license_family: MIT + size: 1634127 + timestamp: 1717463219555 +- kind: conda + name: pydantic-core + version: 2.18.4 + build: py312h552d48e_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/pydantic-core-2.18.4-py312h552d48e_0.conda + sha256: e04c996152d48f3d977896802c0b0064f20502fbffb3c5006e26c36bbe56823c + md5: 210e1615b7cb7c7246dc81cc6cdf9858 + depends: + - __osx >=11.0 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + - typing-extensions >=4.6.0,!=4.7.0 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 1455466 + timestamp: 1717463426978 +- kind: conda + name: pygments + version: 2.18.0 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pygments-2.18.0-pyhd8ed1ab_0.conda + sha256: 78267adf4e76d0d64ea2ffab008c501156c108bb08fecb703816fb63e279780b + md5: b7f5c092b8f9800150d998a71b76d5a1 + depends: + - python >=3.8 + license: BSD-2-Clause + license_family: BSD + size: 879295 + timestamp: 1714846885370 +- kind: conda + name: pytest + version: 8.2.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.1-pyhd8ed1ab_0.conda + sha256: b48cbecf03f26b4a50a5852b12ff6b24e8d35ffc3562ef484db0efb38d504b25 + md5: e4418e8bdbaa8eea28e047531e6763c8 + depends: + - colorama + - exceptiongroup >=1.0.0rc8 + - iniconfig + - packaging + - pluggy <2.0,>=1.5 + - python >=3.8 + - tomli >=1 + constrains: + - pytest-faulthandler >=2 + license: MIT + license_family: MIT + size: 257189 + timestamp: 1716221414386 +- kind: conda + name: python + version: 3.12.3 + build: h2628c8c_0_cpython + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/python-3.12.3-h2628c8c_0_cpython.conda + sha256: 1a95494abe572a8819c933f978df89f00bde72ea9432d46a70632599e8029ea4 + md5: f07c8c5dd98767f9a652de5d039b284e + depends: + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.2,<3.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.45.2,<4.0a0 + - libzlib >=1.2.13,<2.0.0a0 + - openssl >=3.2.1,<4.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + size: 16179248 + timestamp: 1713205644673 +- kind: conda + name: python + version: 3.12.3 + build: h43d1f9e_0_cpython + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/python-3.12.3-h43d1f9e_0_cpython.conda + sha256: e186f3ee570464241c844adff6a3ba8f395cef15c5d46c0a8f784cfd97b3bdca + md5: dc93ad1d2ba17ebc948bf5434ffa864b + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-aarch64 >=2.36.1 + - libexpat >=2.6.2,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc-ng >=12 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.45.2,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.2.13,<2.0.0a0 + - ncurses >=6.4.20240210,<7.0a0 + - openssl >=3.2.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + size: 14051797 + timestamp: 1713205211165 +- kind: conda + name: python + version: 3.12.3 + build: h4a7b5fc_0_cpython + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.12.3-h4a7b5fc_0_cpython.conda + sha256: c761fb3713ea66bce3889b33b6f400afb2dd192d1fc2686446e9d8166cfcec6b + md5: 8643ab37bece6ae8f112464068d9df9c + depends: + - __osx >=11.0 + - bzip2 >=1.0.8,<2.0a0 + - libexpat >=2.6.2,<3.0a0 + - libffi >=3.4,<4.0a0 + - libsqlite >=3.45.2,<4.0a0 + - libzlib >=1.2.13,<1.3.0a0 + - ncurses >=6.4.20240210,<7.0a0 + - openssl >=3.2.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 13207557 + timestamp: 1713206576646 +- kind: conda + name: python + version: 3.12.3 + build: hab00c5b_0_cpython + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/python-3.12.3-hab00c5b_0_cpython.conda + sha256: f9865bcbff69f15fd89a33a2da12ad616e98d65ce7c83c644b92e66e5016b227 + md5: 2540b74d304f71d3e89c81209db4db84 + depends: + - bzip2 >=1.0.8,<2.0a0 + - ld_impl_linux-64 >=2.36.1 + - libexpat >=2.6.2,<3.0a0 + - libffi >=3.4,<4.0a0 + - libgcc-ng >=12 + - libnsl >=2.0.1,<2.1.0a0 + - libsqlite >=3.45.2,<4.0a0 + - libuuid >=2.38.1,<3.0a0 + - libxcrypt >=4.4.36 + - libzlib >=1.2.13,<1.3.0a0 + - ncurses >=6.4.20240210,<7.0a0 + - openssl >=3.2.1,<4.0a0 + - readline >=8.2,<9.0a0 + - tk >=8.6.13,<8.7.0a0 + - tzdata + - xz >=5.2.6,<6.0a0 + constrains: + - python_abi 3.12.* *_cp312 + license: Python-2.0 + purls: [] + size: 31991381 + timestamp: 1713208036041 +- kind: conda + name: python-multipart + version: 0.0.9 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/python-multipart-0.0.9-pyhd8ed1ab_0.conda + sha256: 026467128031bd667c4a32555ae07e922d5caed257e4815c44e7338887bbd56a + md5: 0eef653965f0fed2013924d08089f371 + depends: + - python >=3.7 + license: Apache-2.0 + license_family: Apache + size: 26439 + timestamp: 1707760278735 +- kind: conda + name: python_abi + version: '3.12' + build: 4_cp312 + build_number: 4 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda + sha256: 182a329de10a4165f6e8a3804caf751f918f6ea6176dd4e5abcdae1ed3095bf6 + md5: dccc2d142812964fcc6abdc97b672dff + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6385 + timestamp: 1695147396604 +- kind: conda + name: python_abi + version: '3.12' + build: 4_cp312 + build_number: 4 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/python_abi-3.12-4_cp312.conda + sha256: 4f4c3389b722cac9bf39183221332ab69e468351030ec5359042b50c5d975a15 + md5: 6c09f8e580146d88f649780cebed01de + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD + size: 6417 + timestamp: 1695147418374 +- kind: conda + name: python_abi + version: '3.12' + build: 4_cp312 + build_number: 4 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/python_abi-3.12-4_cp312.conda + sha256: db25428e4f24f8693ffa39f3ff6dfbb8fd53bc298764b775b57edab1c697560f + md5: bbb3a02c78b2d8219d7213f76d644a2a + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD + purls: [] + size: 6508 + timestamp: 1695147497048 +- kind: conda + name: python_abi + version: '3.12' + build: 4_cp312 + build_number: 4 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/python_abi-3.12-4_cp312.conda + sha256: 488f8519d04b48f59bd6fde21ebe2d7a527718ff28aac86a8b53aa63658bdef6 + md5: 17f4ccf6be9ded08bd0a376f489ac1a6 + constrains: + - python 3.12.* *_cpython + license: BSD-3-Clause + license_family: BSD + size: 6785 + timestamp: 1695147430513 +- kind: conda + name: readline + version: '8.2' + build: h8228510_1 + build_number: 1 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda + sha256: 5435cf39d039387fbdc977b0a762357ea909a7694d9528ab40f005e9208744d7 + md5: 47d31b792659ce70f470b5c82fdfb7a4 + depends: + - libgcc-ng >=12 + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 281456 + timestamp: 1679532220005 +- kind: conda + name: readline + version: '8.2' + build: h8fc344f_1 + build_number: 1 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/readline-8.2-h8fc344f_1.conda + sha256: 4c99f7417419734e3797d45bc355e61c26520e111893b0d7087a01a7fbfbe3dd + md5: 105eb1e16bf83bfb2eb380a48032b655 + depends: + - libgcc-ng >=12 + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + size: 294092 + timestamp: 1679532238805 +- kind: conda + name: readline + version: '8.2' + build: h92ec313_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda + sha256: a1dfa679ac3f6007362386576a704ad2d0d7a02e98f5d0b115f207a2da63e884 + md5: 8cbb776a2f641b943d413b3e19df71f4 + depends: + - ncurses >=6.3,<7.0a0 + license: GPL-3.0-only + license_family: GPL + purls: [] + size: 250351 + timestamp: 1679532511311 +- kind: conda + name: rich + version: 13.7.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/rich-13.7.1-pyhd8ed1ab_0.conda + sha256: 2b26d58aa59e46f933c3126367348651b0dab6e0bf88014e857415bb184a4667 + md5: ba445bf767ae6f0d959ff2b40c20912b + depends: + - markdown-it-py >=2.2.0 + - pygments >=2.13.0,<3.0.0 + - python >=3.7.0 + - typing_extensions >=4.0.0,<5.0.0 + license: MIT + license_family: MIT + size: 184347 + timestamp: 1709150578093 +- kind: conda + name: ruff + version: 0.4.7 + build: py312h18b2cab_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/ruff-0.4.7-py312h18b2cab_0.conda + sha256: b343a4a9a75577e3de4ef065d8623df2e60c88c4836ef753c721b3f707f04f2c + md5: 31556e8ffed0323151a5ed5ff617242e + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + size: 6059595 + timestamp: 1717204440228 +- kind: conda + name: ruff + version: 0.4.7 + build: py312h3402d49_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ruff-0.4.7-py312h3402d49_0.conda + sha256: 3cf446d8f28c70086239b42557cbc6ee404370eaf4b486eb1e8c074dfe5c06e8 + md5: ef3f0cb45c949058407c117336006246 + depends: + - __osx >=11.0 + - libcxx >=16 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + size: 5881301 + timestamp: 1717204590051 +- kind: conda + name: ruff + version: 0.4.7 + build: py312h5715c7c_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ruff-0.4.7-py312h5715c7c_0.conda + sha256: e01b1b755998e736762dad982547b93d8b782a7260ab90e45f473295ba7a2616 + md5: dc0bd65bc77bf9ff2c94ca06987f8b8e + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: MIT + license_family: MIT + size: 6385798 + timestamp: 1717204372484 +- kind: conda + name: ruff + version: 0.4.7 + build: py312h7a6832a_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ruff-0.4.7-py312h7a6832a_0.conda + sha256: 354181f9d47c0bfdcc5be4a5d27948232de413b63eea2825a9cfeb90c0a0c452 + md5: 0df84752030f4b37bc4a8c2a96ad7283 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: MIT + license_family: MIT + size: 6302622 + timestamp: 1717205226169 +- kind: conda + name: shellingham + version: 1.5.4 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/shellingham-1.5.4-pyhd8ed1ab_0.conda + sha256: 3c49a0a101c41b7cf6ac05a1872d7a1f91f1b6d02eecb4a36b605a19517862bb + md5: d08db09a552699ee9e7eec56b4eb3899 + depends: + - python >=3.7 + license: MIT + license_family: MIT + size: 14568 + timestamp: 1698144516278 +- kind: conda + name: sniffio + version: 1.3.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/sniffio-1.3.1-pyhd8ed1ab_0.conda + sha256: bc12100b2d8836b93c55068b463190505b8064d0fc7d025e89f20ebf22fe6c2b + md5: 490730480d76cf9c8f8f2849719c6e2b + depends: + - python >=3.7 + license: Apache-2.0 + license_family: Apache + size: 15064 + timestamp: 1708953086199 +- kind: conda + name: starlette + version: 0.37.2 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/starlette-0.37.2-pyhd8ed1ab_0.conda + sha256: de3c43075fdc33c90cd8034e440638904268c46023dc2b14921a8355415dc40e + md5: 7e5550dfa3ed2c2019988cbb9f8302ea + depends: + - anyio <5,>=3.4.0 + - python >=3.8 + - typing_extensions >=3.10.0 + license: BSD-3-Clause + license_family: BSD + size: 57620 + timestamp: 1709667193131 +- kind: conda + name: tk + version: 8.6.13 + build: h194ca79_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/tk-8.6.13-h194ca79_0.conda + sha256: 7fa27cc512d3a783f38bd16bbbffc008807372499d5b65d089a8e43bde9db267 + md5: f75105e0585851f818e0009dd1dde4dc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<2.0.0a0 + license: TCL + license_family: BSD + size: 3351802 + timestamp: 1695506242997 +- kind: conda + name: tk + version: 8.6.13 + build: h5083fa2_1 + build_number: 1 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda + sha256: 72457ad031b4c048e5891f3f6cb27a53cb479db68a52d965f796910e71a403a8 + md5: b50a57ba89c32b62428b71a875291c9b + depends: + - libzlib >=1.2.13,<1.3.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3145523 + timestamp: 1699202432999 +- kind: conda + name: tk + version: 8.6.13 + build: h5226925_1 + build_number: 1 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + sha256: 2c4e914f521ccb2718946645108c9bd3fc3216ba69aea20c2c3cedbd8db32bb1 + md5: fc048363eb8f03cd1737600a5d08aafe + depends: + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: TCL + license_family: BSD + size: 3503410 + timestamp: 1699202577803 +- kind: conda + name: tk + version: 8.6.13 + build: noxft_h4845f30_101 + build_number: 101 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda + sha256: e0569c9caa68bf476bead1bed3d79650bb080b532c64a4af7d8ca286c08dea4e + md5: d453b98d9c83e71da0741bb0ff4d76bc + depends: + - libgcc-ng >=12 + - libzlib >=1.2.13,<1.3.0a0 + license: TCL + license_family: BSD + purls: [] + size: 3318875 + timestamp: 1699202167581 +- kind: conda + name: tomli + version: 2.0.1 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2 + sha256: 4cd48aba7cd026d17e86886af48d0d2ebc67ed36f87f6534f4b67138f5a5a58f + md5: 5844808ffab9ebdb694585b50ba02a96 + depends: + - python >=3.7 + license: MIT + license_family: MIT + size: 15940 + timestamp: 1644342331069 +- kind: conda + name: typer + version: 0.12.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/typer-0.12.3-pyhd8ed1ab_0.conda + sha256: b8b182303858c512fa04f38a3123c892958f708d2ae90afd35246da7c4829485 + md5: 10efd02b22c39c0a46312ef7cb16d237 + depends: + - python >=3.7 + - typer-slim-standard 0.12.3 hd8ed1ab_0 + license: MIT + license_family: MIT + size: 52670 + timestamp: 1712702716762 +- kind: conda + name: typer-slim + version: 0.12.3 + build: pyhd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-0.12.3-pyhd8ed1ab_0.conda + sha256: 01dcb54375c8eae54d13374ed3d5823635401c552340b87e67fdbbb507760596 + md5: cf2c3a89f89644c53cadbfeb124914e9 + depends: + - click >=8.0.0 + - python >=3.7 + - typing_extensions >=3.7.4.3 + constrains: + - shellingham >=1.3.0,<2.0.0 + - rich >=10.11.0,<14.0.0 + - typer >=0.12.3,<0.12.4.0a0 + license: MIT + license_family: MIT + size: 45674 + timestamp: 1712702684668 +- kind: conda + name: typer-slim-standard + version: 0.12.3 + build: hd8ed1ab_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/typer-slim-standard-0.12.3-hd8ed1ab_0.conda + sha256: 06e2f8ca7e3f7168a39d3d2cc62ee1e220928e1e5a4370f4ade2566342c4a459 + md5: 8e56b98837d17e6ace4dc455d905709a + depends: + - rich + - shellingham + - typer-slim 0.12.3 pyhd8ed1ab_0 + license: MIT + license_family: MIT + size: 46047 + timestamp: 1712702688759 +- kind: conda + name: typing-extensions + version: 4.12.1 + build: hd8ed1ab_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.1-hd8ed1ab_0.conda + sha256: bbfed919c23f45e0937176260e6d3275bc46d7d41b7df8bbcf72f5b649b171e3 + md5: 474ea8ffc0a68a93dd5fcb23f7e09e5d + depends: + - typing_extensions 4.12.1 pyha770c72_0 + license: PSF-2.0 + license_family: PSF + size: 10132 + timestamp: 1717287867504 +- kind: conda + name: typing_extensions + version: 4.12.1 + build: pyha770c72_0 + subdir: noarch + noarch: python + url: https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.12.1-pyha770c72_0.conda + sha256: c50d61fe29cd2752943358037ee1107a60b44b8d32c464d18308d668b6494573 + md5: 26d7ee34132362115093717c706c384c + depends: + - python >=3.8 + license: PSF-2.0 + license_family: PSF + size: 39706 + timestamp: 1717287863652 +- kind: conda + name: tzdata + version: 2024a + build: h0c530f3_0 + subdir: noarch + noarch: generic + url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda + sha256: 7b2b69c54ec62a243eb6fba2391b5e443421608c3ae5dbff938ad33ca8db5122 + md5: 161081fc7cec0bfda0d86d7cb595f8d8 + license: LicenseRef-Public-Domain + size: 119815 + timestamp: 1706886945727 +- kind: conda + name: ucrt + version: 10.0.22621.0 + build: h57928b3_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 + sha256: f29cdaf8712008f6b419b8b1a403923b00ab2504bfe0fb2ba8eb60e72d4f14c6 + md5: 72608f6cd3e5898229c3ea16deb1ac43 + constrains: + - vs2015_runtime >=14.29.30037 + license: LicenseRef-Proprietary + license_family: PROPRIETARY + size: 1283972 + timestamp: 1666630199266 +- kind: conda + name: ujson + version: 5.10.0 + build: py312h275cf98_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/ujson-5.10.0-py312h275cf98_0.conda + sha256: 6f9816ea6b6eda967ec5281209247ef70523ccc86d285b04b6798d6d177250f6 + md5: 35a1651bf4c5d1208547ee033aaaff99 + depends: + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + - ucrt >=10.0.20348.0 + - vc >=14.2,<15 + - vc14_runtime >=14.29.30139 + license: BSD-3-Clause + license_family: BSD + size: 47873 + timestamp: 1715783719526 +- kind: conda + name: ujson + version: 5.10.0 + build: py312h5c2e7bc_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/ujson-5.10.0-py312h5c2e7bc_0.conda + sha256: 98a9502fa621ebf08c60717bf74773e2dbf13a833cad74a7f21c6a5c3186d424 + md5: 5180bca1279b8de7e757e5028db96300 + depends: + - __osx >=11.0 + - libcxx >=16 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 51458 + timestamp: 1715783480785 +- kind: conda + name: ujson + version: 5.10.0 + build: py312h7070661_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/ujson-5.10.0-py312h7070661_0.conda + sha256: 36c39df244b96e501300ff9f11fb9648e9d82ea8a33ebb9afa17795e08875c0d + md5: dd19f5820a3fd57aea70aaf88e6dd191 + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 52337 + timestamp: 1715783243655 +- kind: conda + name: ujson + version: 5.10.0 + build: py312h7f10901_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/ujson-5.10.0-py312h7f10901_0.conda + sha256: 5a97fad913b02baed5e5fcda5252b5fc7b15285c147703015f1d9068c2004d20 + md5: db39fd30e9a4a37790c1198e87d5601e + depends: + - libgcc-ng >=12 + - libstdcxx-ng >=12 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 52140 + timestamp: 1715783359421 +- kind: conda + name: uvicorn + version: 0.30.1 + build: py312h2e8e312_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/uvicorn-0.30.1-py312h2e8e312_0.conda + sha256: f10419c416f09851f1c87a3e95085bcc85c565c79d263379b501199e8db6b6b4 + md5: 8aac5432b1144710a4575b1d57ef5a55 + depends: + - click >=7.0 + - h11 >=0.8 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 157029 + timestamp: 1717405633391 +- kind: conda + name: uvicorn + version: 0.30.1 + build: py312h7900ff3_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/uvicorn-0.30.1-py312h7900ff3_0.conda + sha256: 36eafb2f2c03eb543a0c5d9bfe60061b91e59844bef00bbf643bd4c47b8e576d + md5: 5bfc9003c6fbaa658f513f9c41bd2446 + depends: + - click >=7.0 + - h11 >=0.8 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 132249 + timestamp: 1717405078297 +- kind: conda + name: uvicorn + version: 0.30.1 + build: py312h8025657_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/uvicorn-0.30.1-py312h8025657_0.conda + sha256: 360a9f72687d575aa88ea258eb3d507ff2d57b44cca53e260ebdf66900121f99 + md5: 4504115000fc190ced2df4deb3e89886 + depends: + - click >=7.0 + - h11 >=0.8 + - python >=3.12,<3.13.0a0 + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 132340 + timestamp: 1717406010912 +- kind: conda + name: uvicorn + version: 0.30.1 + build: py312h81bd7bf_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/uvicorn-0.30.1-py312h81bd7bf_0.conda + sha256: 0da65fdde5e5c02def9dc2b436f947b283cf43f00204571b328f23a7c29a4e0c + md5: 965eeb87bab4d71d9d653bf09f073b73 + depends: + - click >=7.0 + - h11 >=0.8 + - python >=3.12,<3.13.0a0 + - python >=3.12,<3.13.0a0 *_cpython + - python_abi 3.12.* *_cp312 + license: BSD-3-Clause + license_family: BSD + size: 132618 + timestamp: 1717405326203 +- kind: conda + name: vc + version: '14.3' + build: ha32ba9b_20 + build_number: 20 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-ha32ba9b_20.conda + sha256: 16cb562ce210ee089060f4aa52f3225a571c83885632a870ea2297d460e3bb00 + md5: 2abfb5cb1b9d41a50f765d60f0be563d + depends: + - vc14_runtime >=14.38.33135 + track_features: + - vc14 + license: BSD-3-Clause + license_family: BSD + size: 17122 + timestamp: 1716231244564 +- kind: conda + name: vc14_runtime + version: 14.38.33135 + build: h835141b_20 + build_number: 20 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33135-h835141b_20.conda + sha256: 05b07e0dd3fd49dcc98a365ff661ed6b65e2f0266b4bb03d273131ffdba663be + md5: e971b35a5765862fabc4ba6e5ddf9470 + depends: + - ucrt >=10.0.20348.0 + constrains: + - vs2015_runtime 14.38.33135.* *_20 + license: LicenseRef-ProprietaryMicrosoft + license_family: Proprietary + size: 744189 + timestamp: 1716231234745 +- kind: conda + name: vs2015_runtime + version: 14.38.33135 + build: h22015db_20 + build_number: 20 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33135-h22015db_20.conda + sha256: 2cebabc39766ea051e577762d813ad4151e9d0ff96f3ff3374d575a272951416 + md5: bb4f5ab332e46e1b022d8842e72905b1 + depends: + - vc14_runtime >=14.38.33135 + license: BSD-3-Clause + license_family: BSD + size: 17124 + timestamp: 1716231247457 +- kind: conda + name: xz + version: 5.2.6 + build: h166bdaf_0 + subdir: linux-64 + url: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 + sha256: 03a6d28ded42af8a347345f82f3eebdd6807a08526d47899a42d62d319609162 + md5: 2161070d867d1b1204ea749c8eec4ef0 + depends: + - libgcc-ng >=12 + license: LGPL-2.1 and GPL-2.0 + purls: [] + size: 418368 + timestamp: 1660346797927 +- kind: conda + name: xz + version: 5.2.6 + build: h57fd34a_0 + subdir: osx-arm64 + url: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 + sha256: 59d78af0c3e071021cfe82dc40134c19dab8cdf804324b62940f5c8cd71803ec + md5: 39c6b54e94014701dd157f4f576ed211 + license: LGPL-2.1 and GPL-2.0 + purls: [] + size: 235693 + timestamp: 1660346961024 +- kind: conda + name: xz + version: 5.2.6 + build: h8d14728_0 + subdir: win-64 + url: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 + sha256: 54d9778f75a02723784dc63aff4126ff6e6749ba21d11a6d03c1f4775f269fe0 + md5: 515d77642eaa3639413c6b1bc3f94219 + depends: + - vc >=14.1,<15 + - vs2015_runtime >=14.16.27033 + license: LGPL-2.1 and GPL-2.0 + size: 217804 + timestamp: 1660346976440 +- kind: conda + name: xz + version: 5.2.6 + build: h9cdd2b7_0 + subdir: linux-aarch64 + url: https://conda.anaconda.org/conda-forge/linux-aarch64/xz-5.2.6-h9cdd2b7_0.tar.bz2 + sha256: 93f58a7b393adf41fa007ac8c55978765e957e90cd31877ece1e5a343cb98220 + md5: 83baad393a31d59c20b63ba4da6592df + depends: + - libgcc-ng >=12 + license: LGPL-2.1 and GPL-2.0 + size: 440555 + timestamp: 1660348056328 diff --git a/examples/webserver/pixi.toml b/examples/webserver/pixi.toml new file mode 100644 index 0000000..1632789 --- /dev/null +++ b/examples/webserver/pixi.toml @@ -0,0 +1,21 @@ +[project] +name = "pixi-docker-example" +channels = ["conda-forge"] +platforms = ["osx-arm64", "linux-64", "linux-aarch64", "win-64"] + +[tasks] +dev = "uvicorn my_project:app --reload" +start = "uvicorn my_project:app --host 0.0.0.0" + +[dependencies] +fastapi = "*" +uvicorn = "*" + +[feature.dev.dependencies] +pytest = "*" +ruff = "*" +mypy = "*" + +[environments] +default = { features = ["dev"], solve-group = "prod" } +prod = { features = [], solve-group = "prod" } diff --git a/examples/webserver/pyproject.toml b/examples/webserver/pyproject.toml new file mode 100644 index 0000000..20425b8 --- /dev/null +++ b/examples/webserver/pyproject.toml @@ -0,0 +1,16 @@ +[build-system] +requires = ["hatchling"] +build-backend = "hatchling.build" + +[project] +name = "my-webserver" +description = "Example web server" +version = "0.1.0" +classifiers = [ + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.12", +] +requires-python = ">=3.12" +# pixi handles the dependencies +# since we don't want to distribute this to pypi, we don't need to specify them here +dependencies = [] diff --git a/examples/webserver/recipe/recipe.yaml b/examples/webserver/recipe/recipe.yaml new file mode 100644 index 0000000..c6f6622 --- /dev/null +++ b/examples/webserver/recipe/recipe.yaml @@ -0,0 +1,31 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/prefix-dev/recipe-format/main/schema.json + +package: + name: my-webserver + version: "0.1.0" + +source: + path: ../ + +build: + number: 0 + noarch: python + script: + - python -m pip install . --no-deps --ignore-installed -vv --no-build-isolation --disable-pip-version-check + +requirements: + host: + - python >=3.12 + - pip + - hatchling + run: + - python >=3.12 + - fastapi + +tests: + - python: + imports: + - my_webserver + - package_contents: + site_packages: + - my_webserver/__init__.py diff --git a/src/main.rs b/src/main.rs index 9caf43a..c96b923 100644 --- a/src/main.rs +++ b/src/main.rs @@ -42,20 +42,24 @@ enum Commands { platform: Platform, /// Authentication file for fetching packages - #[arg(short, long)] // TODO: Read from environment variable? + #[arg(long)] // TODO: Read from environment variable? auth_file: Option, /// The path to 'pixi.toml' or 'pyproject.toml' - #[arg(short, long, default_value = cwd().join("pixi.toml").into_os_string())] + #[arg(required = true, default_value = cwd().join("pixi.toml").into_os_string())] manifest_path: PathBuf, /// Output file to write the pack to #[arg(short, long, default_value = cwd().join("environment.tar.zstd").into_os_string())] output_file: PathBuf, + /// Inject an additional conda package into the final prefix + #[arg(short, long, num_args(0..))] + inject: Vec, + /// PyPI dependencies are not supported. /// This flag allows packing even if PyPI dependencies are present. - #[arg(short, long, default_value = "false")] + #[arg(long, default_value = "false")] ignore_pypi_errors: bool, }, @@ -97,6 +101,7 @@ async fn main() -> Result<()> { auth_file, manifest_path, output_file, + inject, ignore_pypi_errors, } => { let options = PackOptions { @@ -110,6 +115,7 @@ async fn main() -> Result<()> { platform, }, level: None, + injected_packages: inject, ignore_pypi_errors, }; tracing::debug!("Running pack command with options: {:?}", options); diff --git a/src/pack.rs b/src/pack.rs index 917b83f..fc6f8c7 100644 --- a/src/pack.rs +++ b/src/pack.rs @@ -1,8 +1,11 @@ use std::{ + collections::{HashMap, HashSet}, path::{Path, PathBuf}, sync::Arc, }; +use fxhash::FxHashMap; +use rattler_index::{package_record_from_conda, package_record_from_tar_bz2}; use tokio::{ fs::{self, create_dir_all, File}, io::AsyncWriteExt, @@ -10,12 +13,9 @@ use tokio::{ use anyhow::Result; use async_compression::{tokio::write::ZstdEncoder, Level}; -use futures::{ - stream::{self}, - StreamExt, TryStreamExt, -}; +use futures::{stream, StreamExt, TryFutureExt, TryStreamExt}; use indicatif::ProgressStyle; -use rattler_conda_types::{PackageRecord, Platform}; +use rattler_conda_types::{package::ArchiveType, ChannelInfo, PackageRecord, Platform, RepoData}; use rattler_lock::{CondaPackage, LockFile, Package}; use rattler_networking::{AuthenticationMiddleware, AuthenticationStorage}; use reqwest_middleware::ClientWithMiddleware; @@ -34,6 +34,7 @@ pub struct PackOptions { pub manifest_path: PathBuf, pub metadata: PixiPackMetadata, pub level: Option, + pub injected_packages: Vec, pub ignore_pypi_errors: bool, } @@ -66,11 +67,16 @@ pub async fn pack(options: PackOptions) -> Result<()> { options.platform.as_str() ))?; - let mut conda_packages = Vec::new(); + let output_folder = + tempfile::tempdir().map_err(|e| anyhow!("could not create temporary directory: {}", e))?; + + let channel_dir = output_folder.path().join(CHANNEL_DIRECTORY_NAME); + + let mut conda_packages_from_lockfile: Vec = Vec::new(); for package in packages { match package { - Package::Conda(p) => conda_packages.push(p), + Package::Conda(p) => conda_packages_from_lockfile.push(p), Package::Pypi(_) => { if options.ignore_pypi_errors { tracing::warn!( @@ -84,8 +90,11 @@ pub async fn pack(options: PackOptions) -> Result<()> { } // Download packages to temporary directory. - tracing::info!("Downloading {} packages", conda_packages.len()); - let bar = indicatif::ProgressBar::new(conda_packages.len() as u64); + tracing::info!( + "Downloading {} packages", + conda_packages_from_lockfile.len() + ); + let bar = indicatif::ProgressBar::new(conda_packages_from_lockfile.len() as u64); bar.set_style( ProgressStyle::with_template( "[{elapsed_precise}] {bar:40.cyan/blue} {pos:>7}/{len:7} {msg}", @@ -94,12 +103,7 @@ pub async fn pack(options: PackOptions) -> Result<()> { .progress_chars("##-"), ); - let output_folder = - tempfile::tempdir().map_err(|e| anyhow!("could not create temporary directory: {}", e))?; - - let channel_dir = output_folder.path().join(CHANNEL_DIRECTORY_NAME); - - stream::iter(conda_packages.iter()) + stream::iter(conda_packages_from_lockfile.iter()) .map(Ok) .try_for_each_concurrent(50, |package| async { download_package(&client, package, &channel_dir).await?; @@ -113,8 +117,49 @@ pub async fn pack(options: PackOptions) -> Result<()> { bar.finish(); + let mut conda_packages: Vec<(String, PackageRecord)> = Vec::new(); + + for package in conda_packages_from_lockfile { + let filename = package + .file_name() + .ok_or(anyhow!("could not get file name"))? + .to_string(); + conda_packages.push((filename, package.package_record().clone())); + } + + let injected_packages: Vec<(PathBuf, ArchiveType)> = options + .injected_packages + .iter() + .filter_map(|e| { + ArchiveType::split_str(e.as_path().to_string_lossy().as_ref()) + .map(|(p, t)| (PathBuf::from(format!("{}{}", p, t.extension())), t)) + }) + .collect(); + for (path, archive_type) in injected_packages { + // step 1: Derive PackageRecord from index.json inside the package + let package_record = match archive_type { + ArchiveType::TarBz2 => package_record_from_tar_bz2(&path), + ArchiveType::Conda => package_record_from_conda(&path), + }?; + + // step 2: copy file into channel dir + let subdir = &package_record.subdir; + let filename = path + .file_name() + .ok_or(anyhow!("could not get file name"))? + .to_str() + .ok_or(anyhow!("could not convert filename to string"))? + .to_string(); + + fs::copy(&path, channel_dir.join(subdir).join(&filename)) + .await + .map_err(|e| anyhow!("could not copy file to channel directory: {}", e))?; + + conda_packages.push((filename, package_record)); + } + // Create `repodata.json` files. - rattler_index::index(&channel_dir, None)?; + create_repodata_files(conda_packages.iter(), &channel_dir).await?; // Add pixi-pack.json containing metadata. let metadata_path = output_folder.path().join(PIXI_PACK_METADATA_PATH); @@ -124,11 +169,7 @@ pub async fn pack(options: PackOptions) -> Result<()> { metadata_file.write_all(metadata.as_bytes()).await?; // Create environment file. - create_environment_file( - output_folder.path(), - conda_packages.iter().map(|p| p.package_record()), - ) - .await?; + create_environment_file(output_folder.path(), conda_packages.iter().map(|(_, p)| p)).await?; // Pack = archive + compress the contents. archive_directory(output_folder.path(), &options.output_file, options.level) @@ -260,3 +301,47 @@ async fn create_environment_file( Ok(()) } + +async fn create_repodata_files( + packages: impl Iterator, + channel_dir: &Path, +) -> Result<()> { + let mut packages_per_subdir = HashMap::new(); + + for (filename, p) in packages { + let subdir = &p.subdir; + + let packages = packages_per_subdir + .entry(subdir) + .or_insert_with(HashMap::new); + packages.insert(filename, p); + } + + for (subdir, packages) in packages_per_subdir { + let repodata_path = channel_dir.join(subdir).join("repodata.json"); + + let conda_packages: FxHashMap<_, _> = packages + .into_iter() + .map(|(filename, p)| (filename.to_string(), p.clone())) + .collect(); + + let repodata = RepoData { + info: Some(ChannelInfo { + subdir: subdir.clone(), + base_url: None, + }), + packages: HashMap::default(), + conda_packages, + removed: HashSet::default(), + version: Some(2), + }; + + let repodata_json = serde_json::to_string_pretty(&repodata) + .map_err(|e| anyhow!("could not serialize repodata: {}", e))?; + fs::write(repodata_path, repodata_json) + .map_err(|e| anyhow!("could not write repodata: {}", e)) + .await?; + } + + Ok(()) +} diff --git a/tests/integration_test.rs b/tests/integration_test.rs index e9cb02a..c73bc37 100644 --- a/tests/integration_test.rs +++ b/tests/integration_test.rs @@ -5,9 +5,12 @@ use std::{path::PathBuf, process::Command}; use async_compression::Level; use pixi_pack::{unarchive, PackOptions, PixiPackMetadata, UnpackOptions}; use rattler_conda_types::Platform; +use rattler_conda_types::RepoData; use rattler_shell::shell::{Bash, ShellEnum}; use rstest::*; use tempfile::{tempdir, TempDir}; +use tokio::fs::File; +use tokio::io::AsyncReadExt; struct Options { pack_options: PackOptions, @@ -38,6 +41,7 @@ fn options( manifest_path, metadata, level, + injected_packages: vec![], ignore_pypi_errors, }, unpack_options: UnpackOptions { @@ -87,14 +91,12 @@ async fn test_simple_python(options: Options, required_fs_objects: Vec<&'static let pack_result = pixi_pack::pack(pack_options).await; assert!(pack_result.is_ok()); assert!(pack_file.is_file()); - assert!(pack_file.exists()); let env_dir = unpack_options.output_directory.join("env"); let activate_file = unpack_options.output_directory.join("activate.sh"); let unpack_result = pixi_pack::unpack(unpack_options).await; assert!(unpack_result.is_ok()); assert!(activate_file.is_file()); - assert!(activate_file.exists()); required_fs_objects .iter() @@ -104,7 +106,87 @@ async fn test_simple_python(options: Options, required_fs_objects: Vec<&'static }); } -#[cfg(not(target_os = "windows"))] // https://github.com/Quantco/pixi-pack/issues/8 +#[rstest] +#[case("conda")] +#[case("tar.bz2")] +#[tokio::test] +async fn test_inject( + #[case] package_format: &str, + options: Options, + mut required_fs_objects: Vec<&'static str>, +) { + let mut pack_options = options.pack_options; + let unpack_options = options.unpack_options; + let pack_file = unpack_options.pack_file.clone(); + + pack_options.injected_packages.push(PathBuf::from(format!( + "examples/webserver/my-webserver-0.1.0-pyh4616a5c_0.{package_format}" + ))); + + pack_options.manifest_path = PathBuf::from("examples/webserver/pixi.toml"); + + let pack_result = pixi_pack::pack(pack_options).await; + assert!(pack_result.is_ok()); + assert!(pack_file.is_file()); + + let env_dir = unpack_options.output_directory.join("env"); + let activate_file = unpack_options.output_directory.join("activate.sh"); + let unpack_result = pixi_pack::unpack(unpack_options).await; + assert!(unpack_result.is_ok()); + assert!(activate_file.is_file()); + + // output env should contain files from the injected package + required_fs_objects.push("conda-meta/my-webserver-0.1.0-pyh4616a5c_0.json"); + + required_fs_objects + .iter() + .map(|dir| env_dir.join(dir)) + .for_each(|dir| { + assert!(dir.exists(), "{:?} does not exist", dir); + }); +} + +#[rstest] +#[tokio::test] +async fn test_includes_repodata_patches(options: Options) { + let mut pack_options = options.pack_options; + pack_options.platform = Platform::Win64; + let pack_file = options.unpack_options.pack_file.clone(); + + let pack_result = pixi_pack::pack(pack_options).await; + assert!(pack_result.is_ok()); + + let unpack_dir = tempdir().expect("Couldn't create a temp dir for tests"); + let unpack_dir = unpack_dir.path(); + unarchive(pack_file.as_path(), unpack_dir) + .await + .expect("Failed to unarchive environment"); + + let mut repodata_raw = String::new(); + + File::open(unpack_dir.join("channel/win-64/repodata.json")) + .await + .expect("Failed to open repodata") + .read_to_string(&mut repodata_raw) + .await + .expect("could not read repodata.json"); + + let repodata: RepoData = serde_json::from_str(&repodata_raw).expect("cant parse repodata.json"); + + // in this example, the `libzlib` entry in the `python-3.12.3-h2628c8c_0_cpython.conda` + // package is `libzlib >=1.2.13,<1.3.0a0`, but the upstream repodata was patched to + // `libzlib >=1.2.13,<2.0.0a0` which is represented in the `pixi.lock` file + assert!( + repodata + .conda_packages + .get("python-3.12.3-h2628c8c_0_cpython.conda") + .expect("python not found in repodata") + .depends + .contains(&"libzlib >=1.2.13,<2.0.0a0".to_string()), + "'libzlib >=1.2.13,<2.0.0a0' not found in python dependencies" + ); +} + #[rstest] #[case("conda")] #[case("micromamba")] @@ -140,19 +222,15 @@ async fn test_compatibility( let prefix_str = create_prefix .to_str() .expect("Couldn't create conda prefix string"); - let args = if tool == "conda" { - vec![ - "env", - "create", - "-y", - "-p", - prefix_str, - "-f", - "environment.yml", - ] - } else { - vec!["create", "-y", "-p", prefix_str, "-f", "environment.yml"] - }; + let args = vec![ + "env", + "create", + "-y", + "-p", + prefix_str, + "-f", + "environment.yml", + ]; let output = Command::new(tool) .args(args) .current_dir(unpack_dir)