From b8631cd47f9db6e17ff386b859142a0497d6db2e Mon Sep 17 00:00:00 2001 From: Bas Zalmstra Date: Tue, 30 Jan 2024 14:07:27 +0100 Subject: [PATCH 1/4] feat: run tasks in correct env --- examples/cpp-sdl/pixi.lock | 1100 ++----------------------------- examples/cpp-sdl/pixi.toml | 22 +- src/activation.rs | 4 +- src/cli/run.rs | 120 +++- src/environment.rs | 2 +- src/project/environment.rs | 5 + src/project/manifest/feature.rs | 5 + src/task/error.rs | 9 + src/task/executable_task.rs | 3 + src/task/task_graph.rs | 203 +++++- 10 files changed, 351 insertions(+), 1122 deletions(-) diff --git a/examples/cpp-sdl/pixi.lock b/examples/cpp-sdl/pixi.lock index 7e4fdbe96..2f6aa1c1c 100644 --- a/examples/cpp-sdl/pixi.lock +++ b/examples/cpp-sdl/pixi.lock @@ -44,20 +44,16 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/libgpg-error-1.47-h71f35ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.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/libogg-1.3.4-h7f98852_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-11.4.0-h4dcbe23_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.2-h2797004_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_4.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_0.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/libuv-1.46.0-hd590300_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-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/linux-64/lz4-c-1.9.4-hcb278e6_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.4-h59595ed_0.conda @@ -67,11 +63,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.42-hcad00b1_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-hb77b528_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.13-hd12c33a_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/rhash-1.4.3-hd590300_2.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2-2.26.5-h949db6a_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/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda @@ -86,17 +79,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/noarch/libgcc-devel_linux-64-11.4.0-h922705a_104.conda - conda: https://conda.anaconda.org/conda-forge/noarch/libstdcxx-devel_linux-64-11.4.0-h922705a_104.conda - conda: https://conda.anaconda.org/conda-forge/noarch/sysroot_linux-64-2.12-he073ed8_16.conda - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_0.conda - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/36/2a/fab302636634e1f770a26aac212e44cff25522ed3c9189bd8afc9ae2effd/MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/bd/0e/63738e88e981ae57c23bad6c499898314a1110a4141f77d7bd929b552fb4/flask-3.0.1-py3-none-any.whl#sha256=ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 osx-64: - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-64-14.0.6-hab78ec2_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h10d778d_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-ares-1.26.0-h10d778d_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/c-compiler-1.5.2-hbf74d83_0.conda @@ -121,10 +105,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/libedit-3.1.20191231-h0678c8f_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libev-4.33-h10d778d_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libexpat-2.5.0-hf0c8a7f_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/libllvm14-14.0.6-hc8e404f_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libnghttp2-1.58.0-h64cf6d3_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.44.2-h92b6c6a_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libssh2-1.11.0-hd019ec5_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libuv-1.46.0-h0c2f820_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda @@ -133,26 +115,15 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4-h93d8f39_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/ninja-1.11.1-hb8565cd_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.2.0-hd75f5a5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.10.13-h00d2728_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/rhash-1.4.3-h0dc2134_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sdl2-2.26.5-hf0c8a7f_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/sigtool-0.1.3-h88f4db0_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/tapi-1100.0.11-h9ce4665_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-64/zlib-1.2.13-h8a1eda9_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-64/zstd-1.5.5-h829000d_0.conda - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/a9/14/f6111644d89fcd98bb6378eed02f3919fa797745c61a9b01e0cc1f57a737/MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl#sha256=e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b - - pypi: https://files.pythonhosted.org/packages/bd/0e/63738e88e981ae57c23bad6c499898314a1110a4141f77d7bd929b552fb4/flask-3.0.1-py3-none-any.whl#sha256=ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 osx-arm64: - conda: https://conda.anaconda.org/conda-forge/noarch/compiler-rt_osx-arm64-14.0.6-h48302dc_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_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/c-ares-1.26.0-h93a5062_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/c-compiler-1.5.2-h5008568_0.conda @@ -177,10 +148,8 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libedit-3.1.20191231-hc8eb9b7_2.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libev-4.33-h93a5062_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libexpat-2.5.0-hb7217d7_1.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/libllvm14-14.0.6-hd1a9a77_4.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libnghttp2-1.58.0-ha4dd798_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.44.2-h091b4b1_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libssh2-1.11.0-h7a5bd25_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libuv-1.46.0-hb547adb_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libzlib-1.2.13-h53f4e23_5.conda @@ -189,52 +158,24 @@ environments: - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ncurses-6.4-h463b476_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/ninja-1.11.1-hffc8910_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.2.0-h0d3ecfb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.13-h2469fbe_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/rhash-1.4.3-hb547adb_2.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl2-2.26.5-hb7217d7_0.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sigtool-0.1.3-h44b9a77_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tapi-1100.0.11-he4954df_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zlib-1.2.13-h53f4e23_5.conda - conda: https://conda.anaconda.org/conda-forge/osx-arm64/zstd-1.5.5-h4f39d0f_0.conda - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/b9/25/ed4be94e9c147d6939a708b94c55dfb6dfc8d9865618cf6896e34d7990aa/MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl#sha256=de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84 - - pypi: https://files.pythonhosted.org/packages/bd/0e/63738e88e981ae57c23bad6c499898314a1110a4141f77d7bd929b552fb4/flask-3.0.1-py3-none-any.whl#sha256=ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_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-2023.11.17-h56e8100_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cmake-3.26.4-h1537add_0.conda - conda: https://conda.anaconda.org/conda-forge/win-64/cxx-compiler-1.5.2-h91493d7_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.44.2-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda - conda: https://conda.anaconda.org/conda-forge/win-64/ninja-1.11.1-h91493d7_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.10.13-h4de0772_1_cpython.conda - conda: https://conda.anaconda.org/conda-forge/win-64/sdl2-2.26.5-h63175ca_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/win-64/ucrt-10.0.22621.0-h57928b3_0.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/win-64/vc-14.3-hcf57466_18.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vs2019_win-64-19.29.30139-he1865b1_18.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vswhere-3.1.4-h57928b3_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/04/94/90fa2d1a40ef244f9cd3cc7275df22a65a3978a50afb42603eac6555108b/MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl#sha256=a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2 - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/bd/0e/63738e88e981ae57c23bad6c499898314a1110a4141f77d7bd929b552fb4/flask-3.0.1-py3-none-any.whl#sha256=ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl#sha256=4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 default: channels: - url: https://conda.anaconda.org/conda-forge/ @@ -242,308 +183,57 @@ environments: 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/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2 - 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-2023.11.17-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_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-h807b86a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_4.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.44.2-h2797004_0.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/linux-64/ncurses-6.4-h59595ed_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.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/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_0.conda - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/1a/3c/ca3094664ce3126145cc28b61bb37253d9f1614c9d8bbfa358ac7fc472c0/MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4 - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/bd/0e/63738e88e981ae57c23bad6c499898314a1110a4141f77d7bd929b552fb4/flask-3.0.1-py3-none-any.whl#sha256=ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 - - pypi: https://files.pythonhosted.org/packages/c0/8b/d8427f023c081a8303e6ac7209c16e6878f2765d5b59667f3903fbcfd365/importlib_metadata-7.0.1-py3-none-any.whl#sha256=4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/d9/66/48866fc6b158c81cc2bfecc04c480f105c6040e8b077bc54c634b4a67926/zipp-3.17.0-py3-none-any.whl#sha256=0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 - osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h10d778d_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2023.11.17-h8857fd0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.44.2-h92b6c6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4-h93d8f39_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.2.0-hd75f5a5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.9.18-h7a9c478_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/1e/89/74dc2b42028ae15c934fc17a8fb91ffcd77b31176dd870a6ad521f28d878/MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl#sha256=21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411 - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/bd/0e/63738e88e981ae57c23bad6c499898314a1110a4141f77d7bd929b552fb4/flask-3.0.1-py3-none-any.whl#sha256=ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 - - pypi: https://files.pythonhosted.org/packages/c0/8b/d8427f023c081a8303e6ac7209c16e6878f2765d5b59667f3903fbcfd365/importlib_metadata-7.0.1-py3-none-any.whl#sha256=4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/d9/66/48866fc6b158c81cc2bfecc04c480f105c6040e8b077bc54c634b4a67926/zipp-3.17.0-py3-none-any.whl#sha256=0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 - osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_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-2023.11.17-hf0a4a13_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.44.2-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/osx-arm64/ncurses-6.4-h463b476_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.2.0-h0d3ecfb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.9.18-hd7ebdb9_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/bd/0e/63738e88e981ae57c23bad6c499898314a1110a4141f77d7bd929b552fb4/flask-3.0.1-py3-none-any.whl#sha256=ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 - - pypi: https://files.pythonhosted.org/packages/c0/8b/d8427f023c081a8303e6ac7209c16e6878f2765d5b59667f3903fbcfd365/importlib_metadata-7.0.1-py3-none-any.whl#sha256=4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/d9/66/48866fc6b158c81cc2bfecc04c480f105c6040e8b077bc54c634b4a67926/zipp-3.17.0-py3-none-any.whl#sha256=0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 - - pypi: https://files.pythonhosted.org/packages/df/f2/22f860f2dfa7d8c862801f7d91b7da53d3187c7dbeb88c00d28a799788bf/MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl#sha256=765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 - win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_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-2023.11.17-h56e8100_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.44.2-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.9.18-h4de0772_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.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/vc-14.3-hcf57466_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/bd/0e/63738e88e981ae57c23bad6c499898314a1110a4141f77d7bd929b552fb4/flask-3.0.1-py3-none-any.whl#sha256=ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 - - pypi: https://files.pythonhosted.org/packages/c0/8b/d8427f023c081a8303e6ac7209c16e6878f2765d5b59667f3903fbcfd365/importlib_metadata-7.0.1-py3-none-any.whl#sha256=4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl#sha256=4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 - - pypi: https://files.pythonhosted.org/packages/d9/66/48866fc6b158c81cc2bfecc04c480f105c6040e8b077bc54c634b4a67926/zipp-3.17.0-py3-none-any.whl#sha256=0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 - - pypi: https://files.pythonhosted.org/packages/ec/e7/fa4d3a4957a2c3675a716d40f6fe803fc7e7046a50110324adc5a3628207/MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl#sha256=8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959 - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 - flask-py310: - 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/linux-64/bzip2-1.0.8-hd590300_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.11.17-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_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-h807b86a_4.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_4.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.44.2-h2797004_0.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/linux-64/ncurses-6.4-h59595ed_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.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/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_0.conda - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/1a/3c/ca3094664ce3126145cc28b61bb37253d9f1614c9d8bbfa358ac7fc472c0/MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4 - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/bd/0e/63738e88e981ae57c23bad6c499898314a1110a4141f77d7bd929b552fb4/flask-3.0.1-py3-none-any.whl#sha256=ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 - - pypi: https://files.pythonhosted.org/packages/c0/8b/d8427f023c081a8303e6ac7209c16e6878f2765d5b59667f3903fbcfd365/importlib_metadata-7.0.1-py3-none-any.whl#sha256=4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/d9/66/48866fc6b158c81cc2bfecc04c480f105c6040e8b077bc54c634b4a67926/zipp-3.17.0-py3-none-any.whl#sha256=0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 - osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h10d778d_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2023.11.17-h8857fd0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.44.2-h92b6c6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4-h93d8f39_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.2.0-hd75f5a5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.9.18-h7a9c478_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/1e/89/74dc2b42028ae15c934fc17a8fb91ffcd77b31176dd870a6ad521f28d878/MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl#sha256=21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411 - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/bd/0e/63738e88e981ae57c23bad6c499898314a1110a4141f77d7bd929b552fb4/flask-3.0.1-py3-none-any.whl#sha256=ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 - - pypi: https://files.pythonhosted.org/packages/c0/8b/d8427f023c081a8303e6ac7209c16e6878f2765d5b59667f3903fbcfd365/importlib_metadata-7.0.1-py3-none-any.whl#sha256=4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/d9/66/48866fc6b158c81cc2bfecc04c480f105c6040e8b077bc54c634b4a67926/zipp-3.17.0-py3-none-any.whl#sha256=0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 - osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_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-2023.11.17-hf0a4a13_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.44.2-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/osx-arm64/ncurses-6.4-h463b476_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.2.0-h0d3ecfb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.9.18-hd7ebdb9_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/bd/0e/63738e88e981ae57c23bad6c499898314a1110a4141f77d7bd929b552fb4/flask-3.0.1-py3-none-any.whl#sha256=ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 - - pypi: https://files.pythonhosted.org/packages/c0/8b/d8427f023c081a8303e6ac7209c16e6878f2765d5b59667f3903fbcfd365/importlib_metadata-7.0.1-py3-none-any.whl#sha256=4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/d9/66/48866fc6b158c81cc2bfecc04c480f105c6040e8b077bc54c634b4a67926/zipp-3.17.0-py3-none-any.whl#sha256=0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 - - pypi: https://files.pythonhosted.org/packages/df/f2/22f860f2dfa7d8c862801f7d91b7da53d3187c7dbeb88c00d28a799788bf/MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl#sha256=765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 - win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_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-2023.11.17-h56e8100_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.44.2-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.9.18-h4de0772_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.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/vc-14.3-hcf57466_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/bd/0e/63738e88e981ae57c23bad6c499898314a1110a4141f77d7bd929b552fb4/flask-3.0.1-py3-none-any.whl#sha256=ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 - - pypi: https://files.pythonhosted.org/packages/c0/8b/d8427f023c081a8303e6ac7209c16e6878f2765d5b59667f3903fbcfd365/importlib_metadata-7.0.1-py3-none-any.whl#sha256=4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl#sha256=4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 - - pypi: https://files.pythonhosted.org/packages/d9/66/48866fc6b158c81cc2bfecc04c480f105c6040e8b077bc54c634b4a67926/zipp-3.17.0-py3-none-any.whl#sha256=0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 - - pypi: https://files.pythonhosted.org/packages/ec/e7/fa4d3a4957a2c3675a716d40f6fe803fc7e7046a50110324adc5a3628207/MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl#sha256=8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959 - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 - flask-py39: - 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/linux-64/bzip2-1.0.8-hd590300_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.11.17-hbcca054_0.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-h41732ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/lame-3.100-h166bdaf_1003.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libcap-2.69-h0f662aa_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.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/libflac-1.4.3-h59595ed_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libgcrypt-1.10.3-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.3-h783c2da_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h807b86a_4.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.44.2-h2797004_0.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/libgpg-error-1.47-h71f35ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libogg-1.3.4-h7f98852_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libopus-1.3.1-h7f98852_1.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsndfile-1.2.2-hc60ed4a_1.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-h7e041cc_4.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libsystemd0-255-h3516f8a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/libvorbis-1.3.7-h9c3ff4c_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda - conda: https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/openssl-3.2.0-hd590300_1.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.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/linux-64/lz4-c-1.9.4-hcb278e6_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/mpg123-1.32.4-h59595ed_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.42-hcad00b1_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/pulseaudio-client-16.1-hb77b528_5.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/sdl2-2.26.5-h949db6a_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-kbproto-1.0.7-h7f98852_1002.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxau-1.0.11-hd590300_0.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxdmcp-1.1.3-h7f98852_0.tar.bz2 + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xextproto-7.3.0-h0b41bf4_1003.conda + - conda: https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007.tar.bz2 - conda: https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_0.conda - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/1a/3c/ca3094664ce3126145cc28b61bb37253d9f1614c9d8bbfa358ac7fc472c0/MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4 - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/bd/0e/63738e88e981ae57c23bad6c499898314a1110a4141f77d7bd929b552fb4/flask-3.0.1-py3-none-any.whl#sha256=ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 - - pypi: https://files.pythonhosted.org/packages/c0/8b/d8427f023c081a8303e6ac7209c16e6878f2765d5b59667f3903fbcfd365/importlib_metadata-7.0.1-py3-none-any.whl#sha256=4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/d9/66/48866fc6b158c81cc2bfecc04c480f105c6040e8b077bc54c634b4a67926/zipp-3.17.0-py3-none-any.whl#sha256=0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 + - conda: https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda osx-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/bzip2-1.0.8-h10d778d_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ca-certificates-2023.11.17-h8857fd0_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - - conda: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.44.2-h92b6c6a_0.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/libzlib-1.2.13-h8a1eda9_5.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/ncurses-6.4-h93d8f39_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/openssl-3.2.0-hd75f5a5_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/python-3.9.18-h7a9c478_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-64/xz-5.2.6-h775f41a_0.tar.bz2 - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/1e/89/74dc2b42028ae15c934fc17a8fb91ffcd77b31176dd870a6ad521f28d878/MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl#sha256=21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411 - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/bd/0e/63738e88e981ae57c23bad6c499898314a1110a4141f77d7bd929b552fb4/flask-3.0.1-py3-none-any.whl#sha256=ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 - - pypi: https://files.pythonhosted.org/packages/c0/8b/d8427f023c081a8303e6ac7209c16e6878f2765d5b59667f3903fbcfd365/importlib_metadata-7.0.1-py3-none-any.whl#sha256=4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/d9/66/48866fc6b158c81cc2bfecc04c480f105c6040e8b077bc54c634b4a67926/zipp-3.17.0-py3-none-any.whl#sha256=0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 + - conda: https://conda.anaconda.org/conda-forge/osx-64/libcxx-16.0.6-hd57cbcb_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-64/sdl2-2.26.5-hf0c8a7f_0.conda osx-arm64: - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_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-2023.11.17-hf0a4a13_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.44.2-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/osx-arm64/ncurses-6.4-h463b476_2.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/openssl-3.2.0-h0d3ecfb_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.9.18-hd7ebdb9_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/readline-8.2-h92ec313_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/tk-8.6.13-h5083fa2_1.conda - - conda: https://conda.anaconda.org/conda-forge/osx-arm64/xz-5.2.6-h57fd34a_0.tar.bz2 - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/bd/0e/63738e88e981ae57c23bad6c499898314a1110a4141f77d7bd929b552fb4/flask-3.0.1-py3-none-any.whl#sha256=ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 - - pypi: https://files.pythonhosted.org/packages/c0/8b/d8427f023c081a8303e6ac7209c16e6878f2765d5b59667f3903fbcfd365/importlib_metadata-7.0.1-py3-none-any.whl#sha256=4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/d9/66/48866fc6b158c81cc2bfecc04c480f105c6040e8b077bc54c634b4a67926/zipp-3.17.0-py3-none-any.whl#sha256=0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 - - pypi: https://files.pythonhosted.org/packages/df/f2/22f860f2dfa7d8c862801f7d91b7da53d3187c7dbeb88c00d28a799788bf/MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl#sha256=765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/libcxx-16.0.6-h4653b0c_0.conda + - conda: https://conda.anaconda.org/conda-forge/osx-arm64/sdl2-2.26.5-hb7217d7_0.conda win-64: - - conda: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_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-2023.11.17-h56e8100_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.44.2-hcfcfb64_0.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.0-hcfcfb64_1.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/python-3.9.18-h4de0772_1_cpython.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/tk-8.6.13-h5226925_1.conda + - conda: https://conda.anaconda.org/conda-forge/win-64/sdl2-2.26.5-h63175ca_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/vc-14.3-hcf57466_18.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vc14_runtime-14.38.33130-h82b7239_18.conda - conda: https://conda.anaconda.org/conda-forge/win-64/vs2015_runtime-14.38.33130-hcb4865c_18.conda - - conda: https://conda.anaconda.org/conda-forge/win-64/xz-5.2.6-h8d14728_0.tar.bz2 - - pypi: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - - pypi: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - - pypi: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - - pypi: https://files.pythonhosted.org/packages/bd/0e/63738e88e981ae57c23bad6c499898314a1110a4141f77d7bd929b552fb4/flask-3.0.1-py3-none-any.whl#sha256=ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 - - pypi: https://files.pythonhosted.org/packages/c0/8b/d8427f023c081a8303e6ac7209c16e6878f2765d5b59667f3903fbcfd365/importlib_metadata-7.0.1-py3-none-any.whl#sha256=4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e - - pypi: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - - pypi: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl#sha256=4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 - - pypi: https://files.pythonhosted.org/packages/d9/66/48866fc6b158c81cc2bfecc04c480f105c6040e8b077bc54c634b4a67926/zipp-3.17.0-py3-none-any.whl#sha256=0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 - - pypi: https://files.pythonhosted.org/packages/ec/e7/fa4d3a4957a2c3675a716d40f6fe803fc7e7046a50110324adc5a3628207/MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl#sha256=8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959 - - pypi: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 packages: - kind: conda name: _libgcc_mutex @@ -634,12 +324,6 @@ packages: license_family: BSD size: 28178 timestamp: 1694604071236 -- kind: pypi - name: blinker - version: 1.7.0 - url: https://files.pythonhosted.org/packages/fa/2a/7f3714cbc6356a0efec525ce7a0613d581072ed6eb53eb7b9754f33db807/blinker-1.7.0-py3-none-any.whl#sha256=c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 - sha256: c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9 - requires_python: '>=3.8' - kind: conda name: bzip2 version: 1.0.8 @@ -666,23 +350,6 @@ packages: license_family: BSD 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 @@ -783,17 +450,6 @@ packages: license: BSD size: 5660 timestamp: 1670951603925 -- kind: conda - name: ca-certificates - version: 2023.11.17 - build: h56e8100_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/ca-certificates-2023.11.17-h56e8100_0.conda - sha256: c6177e2a4967db7a4e929c6ecd2fafde36e489dbeda23ceda640f4915cb0e877 - md5: 1163114b483f26761f993c709e65271f - license: ISC - size: 154700 - timestamp: 1700281021312 - kind: conda name: ca-certificates version: 2023.11.17 @@ -1095,15 +751,6 @@ packages: license_family: BSD size: 19398 timestamp: 1679865337838 -- kind: pypi - name: click - version: 8.1.7 - url: https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl#sha256=ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - sha256: ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 - requires_dist: - - colorama ; platform_system == 'Windows' - - importlib-metadata ; python_version < '3.8' - requires_python: '>=3.7' - kind: conda name: cmake version: 3.26.4 @@ -1196,12 +843,6 @@ packages: license_family: BSD size: 14420122 timestamp: 1684462885897 -- kind: pypi - name: colorama - version: 0.4.6 - url: https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl#sha256=4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 - sha256: 4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 - requires_python: '!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7' - kind: conda name: compiler-rt version: 14.0.6 @@ -1389,21 +1030,6 @@ packages: license_family: MIT size: 120323 timestamp: 1680191057827 -- kind: pypi - name: flask - version: 3.0.1 - url: https://files.pythonhosted.org/packages/bd/0e/63738e88e981ae57c23bad6c499898314a1110a4141f77d7bd929b552fb4/flask-3.0.1-py3-none-any.whl#sha256=ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 - sha256: ca631a507f6dfe6c278ae20112cea3ff54ff2216390bf8880f6b035a5354af13 - requires_dist: - - Werkzeug >=3.0.0 - - Jinja2 >=3.1.2 - - itsdangerous >=2.1.2 - - click >=8.1.3 - - blinker >=1.6.2 - - importlib-metadata >=3.6.0 ; python_version < '3.10' - - asgiref >=3.2 ; extra == 'async' - - python-dotenv ; extra == 'dotenv' - requires_python: '>=3.8' - kind: conda name: gcc version: 11.4.0 @@ -1521,50 +1147,6 @@ packages: license_family: BSD size: 28603 timestamp: 1694604450609 -- kind: pypi - name: importlib-metadata - version: 7.0.1 - url: https://files.pythonhosted.org/packages/c0/8b/d8427f023c081a8303e6ac7209c16e6878f2765d5b59667f3903fbcfd365/importlib_metadata-7.0.1-py3-none-any.whl#sha256=4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e - sha256: 4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e - requires_dist: - - zipp >=0.5 - - typing-extensions >=3.6.4 ; python_version < '3.8' - - sphinx >=3.5 ; extra == 'docs' - - sphinx <7.2.5 ; extra == 'docs' - - jaraco.packaging >=9.3 ; extra == 'docs' - - rst.linker >=1.9 ; extra == 'docs' - - furo ; extra == 'docs' - - sphinx-lint ; extra == 'docs' - - jaraco.tidelift >=1.4 ; extra == 'docs' - - ipython ; extra == 'perf' - - pytest >=6 ; extra == 'testing' - - pytest-checkdocs >=2.4 ; extra == 'testing' - - pytest-cov ; extra == 'testing' - - pytest-enabler >=2.2 ; extra == 'testing' - - pytest-ruff ; extra == 'testing' - - packaging ; extra == 'testing' - - pyfakefs ; extra == 'testing' - - flufl.flake8 ; extra == 'testing' - - pytest-perf >=0.9.2 ; extra == 'testing' - - pytest-black >=0.3.7 ; platform_python_implementation != 'PyPy' and extra == 'testing' - - pytest-mypy >=0.9.1 ; platform_python_implementation != 'PyPy' and extra == 'testing' - - importlib-resources >=1.3 ; python_version < '3.9' and extra == 'testing' - requires_python: '>=3.8' -- kind: pypi - name: itsdangerous - version: 2.1.2 - url: https://files.pythonhosted.org/packages/68/5f/447e04e828f47465eeab35b5d408b7ebaaaee207f48b7136c5a7267a30ae/itsdangerous-2.1.2-py3-none-any.whl#sha256=2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - sha256: 2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44 - requires_python: '>=3.7' -- kind: pypi - name: jinja2 - version: 3.1.3 - url: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl#sha256=7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - sha256: 7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa - requires_dist: - - MarkupSafe >=2.0 - - Babel >=2.7 ; extra == 'i18n' - requires_python: '>=3.7' - kind: conda name: kernel-headers_linux-64 version: 2.6.32 @@ -2023,32 +1605,6 @@ packages: license_family: MIT size: 69602 timestamp: 1680191040160 -- kind: conda - name: libffi - version: 3.4.2 - build: h0d85af4_5 - build_number: 5 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libffi-3.4.2-h0d85af4_5.tar.bz2 - sha256: 7a2d27a936ceee6942ea4d397f9c7d136f12549d86f7617e8b6bad51e01a941f - md5: ccb34fb14960ad8b125962d3d79b31a9 - license: MIT - license_family: MIT - size: 51348 - timestamp: 1636488394370 -- 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 - size: 39020 - timestamp: 1636488587153 - kind: conda name: libffi version: 3.4.2 @@ -2064,22 +1620,6 @@ packages: license_family: MIT 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: libflac version: 1.4.3 @@ -2306,20 +1846,6 @@ packages: license_family: MIT size: 565451 timestamp: 1702130473930 -- 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 - size: 33408 - timestamp: 1697359010159 - kind: conda name: libogg version: 1.3.4 @@ -2387,61 +1913,6 @@ packages: license_family: LGPL size: 354372 timestamp: 1695747735668 -- kind: conda - name: libsqlite - version: 3.44.2 - build: h091b4b1_0 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/libsqlite-3.44.2-h091b4b1_0.conda - sha256: f0dc2fe69eddb4bab72ff6bb0da51d689294f466ee1b01e80ced1e7878a21aa5 - md5: d7e1af696cfadec251a0abdd7b79ed77 - depends: - - libzlib >=1.2.13,<1.3.0a0 - license: Unlicense - size: 815254 - timestamp: 1700863572318 -- kind: conda - name: libsqlite - version: 3.44.2 - build: h2797004_0 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.2-h2797004_0.conda - sha256: ee2c4d724a3ed60d5b458864d66122fb84c6ce1df62f735f90d8db17b66cd88a - md5: 3b6a9f225c3dbe0d24f4fedd4625c5bf - depends: - - libgcc-ng >=12 - - libzlib >=1.2.13,<1.3.0a0 - license: Unlicense - size: 845830 - timestamp: 1700863204572 -- kind: conda - name: libsqlite - version: 3.44.2 - build: h92b6c6a_0 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/libsqlite-3.44.2-h92b6c6a_0.conda - sha256: 8a317d2aa6352feba951ca09d5bf34f565f9dd10bb14ff842b8650baa321d781 - md5: d4419f90019e6a2b152cd4d32f73a82f - depends: - - libzlib >=1.2.13,<1.3.0a0 - license: Unlicense - size: 891089 - timestamp: 1700863475542 -- kind: conda - name: libsqlite - version: 3.44.2 - build: hcfcfb64_0 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libsqlite-3.44.2-hcfcfb64_0.conda - sha256: 25bfcf79ec863c2c0f0b3599981e2eac57efc5302faf2bb84f68c3f0faa55d1c - md5: 4a5f5ab56cbf3ccd08d71a1168061213 - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - license: Unlicense - size: 853171 - timestamp: 1700863704859 - kind: conda name: libssh2 version: 1.11.0 @@ -2534,20 +2005,6 @@ packages: license: LGPL-2.1-or-later size: 404326 timestamp: 1701982703751 -- 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 - size: 33601 - timestamp: 1680112270483 - kind: conda name: libuv version: 1.46.0 @@ -2619,20 +2076,6 @@ packages: license_family: MIT size: 384238 timestamp: 1682082368177 -- 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 - size: 100393 - timestamp: 1702724383534 - kind: conda name: libzlib version: 1.2.13 @@ -2663,25 +2106,6 @@ packages: license_family: Other size: 59404 timestamp: 1686575566695 -- kind: conda - name: libzlib - version: 1.2.13 - build: hcfcfb64_5 - build_number: 5 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/libzlib-1.2.13-hcfcfb64_5.conda - sha256: c161822ee8130b71e08b6d282b9919c1de2c5274b29921a867bca0f7d30cad26 - md5: 5fdb9c6a113b6b6cb5e517fd972d5f41 - depends: - - ucrt >=10.0.20348.0 - - vc >=14.2,<15 - - vc14_runtime >=14.29.30139 - constrains: - - zlib 1.2.13 *_5 - license: Zlib - license_family: Other - size: 55800 - timestamp: 1686575452215 - kind: conda name: libzlib version: 1.2.13 @@ -2784,54 +2208,6 @@ packages: license_family: BSD size: 143402 timestamp: 1674727076728 -- kind: pypi - name: markupsafe - version: 2.1.4 - url: https://files.pythonhosted.org/packages/1a/3c/ca3094664ce3126145cc28b61bb37253d9f1614c9d8bbfa358ac7fc472c0/MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4 - sha256: 7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4 - requires_python: '>=3.7' -- kind: pypi - name: markupsafe - version: 2.1.4 - url: https://files.pythonhosted.org/packages/ec/e7/fa4d3a4957a2c3675a716d40f6fe803fc7e7046a50110324adc5a3628207/MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl#sha256=8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959 - sha256: 8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959 - requires_python: '>=3.7' -- kind: pypi - name: markupsafe - version: 2.1.4 - url: https://files.pythonhosted.org/packages/df/f2/22f860f2dfa7d8c862801f7d91b7da53d3187c7dbeb88c00d28a799788bf/MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl#sha256=765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb - sha256: 765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb - requires_python: '>=3.7' -- kind: pypi - name: markupsafe - version: 2.1.4 - url: https://files.pythonhosted.org/packages/1e/89/74dc2b42028ae15c934fc17a8fb91ffcd77b31176dd870a6ad521f28d878/MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl#sha256=21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411 - sha256: 21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411 - requires_python: '>=3.7' -- kind: pypi - name: markupsafe - version: 2.1.4 - url: https://files.pythonhosted.org/packages/a9/14/f6111644d89fcd98bb6378eed02f3919fa797745c61a9b01e0cc1f57a737/MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl#sha256=e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b - sha256: e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b - requires_python: '>=3.7' -- kind: pypi - name: markupsafe - version: 2.1.4 - url: https://files.pythonhosted.org/packages/b9/25/ed4be94e9c147d6939a708b94c55dfb6dfc8d9865618cf6896e34d7990aa/MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl#sha256=de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84 - sha256: de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84 - requires_python: '>=3.7' -- kind: pypi - name: markupsafe - version: 2.1.4 - url: https://files.pythonhosted.org/packages/36/2a/fab302636634e1f770a26aac212e44cff25522ed3c9189bd8afc9ae2effd/MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl#sha256=dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e - sha256: dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e - requires_python: '>=3.7' -- kind: pypi - name: markupsafe - version: 2.1.4 - url: https://files.pythonhosted.org/packages/04/94/90fa2d1a40ef244f9cd3cc7275df22a65a3978a50afb42603eac6555108b/MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl#sha256=a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2 - sha256: a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2 - requires_python: '>=3.7' - kind: conda name: mpg123 version: 1.32.4 @@ -2965,26 +2341,6 @@ packages: license_family: Apache size: 2856233 timestamp: 1701162541844 -- kind: conda - name: openssl - version: 3.2.0 - build: hcfcfb64_1 - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/openssl-3.2.0-hcfcfb64_1.conda - sha256: 373b9671173ef3413d2a95f3781176b818db904ba82298f8447b9658d71e2cc9 - md5: d10167022f99bad12ee07dea022d5830 - 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: 8248125 - timestamp: 1701164404616 - kind: conda name: openssl version: 3.2.0 @@ -3072,262 +2428,6 @@ packages: license_family: LGPL size: 754844 timestamp: 1693928953742 -- kind: conda - name: python - version: 3.9.18 - build: h0755675_1_cpython - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_1_cpython.conda - sha256: c0e800d255a771926007043d2859cbbbdb1387477ec813f085640c8887b391a2 - md5: 255a7002aeec7a067ff19b545aca6328 - depends: - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libffi >=3.4,<4.0a0 - - libgcc-ng >=12 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.44.2,<4.0a0 - - libuuid >=2.38.1,<3.0a0 - - libxcrypt >=4.4.36 - - libzlib >=1.2.13,<1.3.0a0 - - ncurses >=6.4,<7.0a0 - - openssl >=3.2.0,<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.9.* *_cp39 - license: Python-2.0 - size: 23818959 - timestamp: 1703350123942 -- kind: conda - name: python - version: 3.9.18 - build: h4de0772_1_cpython - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/python-3.9.18-h4de0772_1_cpython.conda - sha256: ec53171a734daf4f23cd466f50ee47ca40987154efdf02ce4f722201d7cc1011 - md5: c0bc0080c5ec044edae6dbfa97ab337f - depends: - - bzip2 >=1.0.8,<2.0a0 - - libffi >=3.4,<4.0a0 - - libsqlite >=3.44.2,<4.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - openssl >=3.2.0,<4.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - vc >=14.1,<15 - - vc14_runtime >=14.16.27033 - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.9.* *_cp39 - license: Python-2.0 - size: 16843644 - timestamp: 1703349253804 -- kind: conda - name: python - version: 3.9.18 - build: h7a9c478_1_cpython - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/python-3.9.18-h7a9c478_1_cpython.conda - sha256: 31f783f74be74f3015e4cb45f6ee6815ce665f33a1aa44ab7d5c4c78c2828dc1 - md5: 08260191ff879dbe1f236c9bac40d812 - depends: - - bzip2 >=1.0.8,<2.0a0 - - libffi >=3.4,<4.0a0 - - libsqlite >=3.44.2,<4.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - ncurses >=6.4,<7.0a0 - - openssl >=3.2.0,<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.9.* *_cp39 - license: Python-2.0 - size: 11422373 - timestamp: 1703350001159 -- kind: conda - name: python - version: 3.9.18 - build: hd7ebdb9_1_cpython - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.9.18-hd7ebdb9_1_cpython.conda - sha256: 7336d2cfefff2466f1f60144f10f5bf98f9d176a8c72ca85336baa5dc32299ef - md5: c48f67fd7147f37c941037de0a328560 - depends: - - bzip2 >=1.0.8,<2.0a0 - - libffi >=3.4,<4.0a0 - - libsqlite >=3.44.2,<4.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - ncurses >=6.4,<7.0a0 - - openssl >=3.2.0,<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.9.* *_cp39 - license: Python-2.0 - size: 11822452 - timestamp: 1703349662775 -- kind: conda - name: python - version: 3.10.13 - build: h00d2728_1_cpython - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/python-3.10.13-h00d2728_1_cpython.conda - sha256: a7ed0fb04ae2c031fd378a42421fee673983e9c2a2fd6734a609595f56349556 - md5: f33c836e5a8561cf1632a224f161470a - depends: - - bzip2 >=1.0.8,<2.0a0 - - libffi >=3.4,<4.0a0 - - libsqlite >=3.44.2,<4.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - ncurses >=6.4,<7.0a0 - - openssl >=3.2.0,<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.10.* *_cp310 - license: Python-2.0 - size: 13011373 - timestamp: 1703346424250 -- kind: conda - name: python - version: 3.10.13 - build: h2469fbe_1_cpython - build_number: 1 - subdir: osx-arm64 - url: https://conda.anaconda.org/conda-forge/osx-arm64/python-3.10.13-h2469fbe_1_cpython.conda - sha256: 042c0583165b2f58f2bcf0776fc421aab5be2dbb88380e3d8abfb3f1c716233a - md5: a90029d144e4acfc97be918fb3b2578e - depends: - - bzip2 >=1.0.8,<2.0a0 - - libffi >=3.4,<4.0a0 - - libsqlite >=3.44.2,<4.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - ncurses >=6.4,<7.0a0 - - openssl >=3.2.0,<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.10.* *_cp310 - license: Python-2.0 - size: 11604730 - timestamp: 1703346075266 -- kind: conda - name: python - version: 3.10.13 - build: h4de0772_1_cpython - build_number: 1 - subdir: win-64 - url: https://conda.anaconda.org/conda-forge/win-64/python-3.10.13-h4de0772_1_cpython.conda - sha256: 52e7c6569af0fc1fe63b7b5c23c0fb90d84dbff7a96224ea34c805ff1c5cf156 - md5: 2466ed12bf4a033d0ae05981d24b535e - depends: - - bzip2 >=1.0.8,<2.0a0 - - libffi >=3.4,<4.0a0 - - libsqlite >=3.44.2,<4.0a0 - - libzlib >=1.2.13,<1.3.0a0 - - openssl >=3.2.0,<4.0a0 - - tk >=8.6.13,<8.7.0a0 - - tzdata - - vc >=14.1,<15 - - vc14_runtime >=14.16.27033 - - xz >=5.2.6,<6.0a0 - constrains: - - python_abi 3.10.* *_cp310 - license: Python-2.0 - size: 15919030 - timestamp: 1703345531924 -- kind: conda - name: python - version: 3.10.13 - build: hd12c33a_1_cpython - build_number: 1 - subdir: linux-64 - url: https://conda.anaconda.org/conda-forge/linux-64/python-3.10.13-hd12c33a_1_cpython.conda - sha256: 4234c8e301737aa245d12c8fb44a4128005795e42883977c29cca3f34c71a1eb - md5: ed38140af93f81319ebc472fbcf16cca - depends: - - bzip2 >=1.0.8,<2.0a0 - - ld_impl_linux-64 >=2.36.1 - - libffi >=3.4,<4.0a0 - - libgcc-ng >=12 - - libnsl >=2.0.1,<2.1.0a0 - - libsqlite >=3.44.2,<4.0a0 - - libuuid >=2.38.1,<3.0a0 - - libxcrypt >=4.4.36 - - libzlib >=1.2.13,<1.3.0a0 - - ncurses >=6.4,<7.0a0 - - openssl >=3.2.0,<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.10.* *_cp310 - license: Python-2.0 - size: 25670919 - timestamp: 1703347014418 -- 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 - size: 281456 - timestamp: 1679532220005 -- 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 - size: 250351 - timestamp: 1679532511311 -- kind: conda - name: readline - version: '8.2' - build: h9e318b2_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/readline-8.2-h9e318b2_1.conda - sha256: 41e7d30a097d9b060037f0c6a2b1d4c4ae7e942c06c943d23f9d481548478568 - md5: f17f77f2acf4d344734bda76829ce14e - depends: - - ncurses >=6.3,<7.0a0 - license: GPL-3.0-only - license_family: GPL - size: 255870 - timestamp: 1679532707590 - kind: conda name: rhash version: 1.4.3 @@ -3499,81 +2599,6 @@ packages: license_family: MIT size: 191416 timestamp: 1602687595316 -- kind: conda - name: tk - version: 8.6.13 - build: h1abcd95_1 - build_number: 1 - subdir: osx-64 - url: https://conda.anaconda.org/conda-forge/osx-64/tk-8.6.13-h1abcd95_1.conda - sha256: 30412b2e9de4ff82d8c2a7e5d06a15f4f4fef1809a72138b6ccb53a33b26faf5 - md5: bf830ba5afc507c6232d4ef0fb1a882d - depends: - - libzlib >=1.2.13,<1.3.0a0 - license: TCL - license_family: BSD - size: 3270220 - timestamp: 1699202389792 -- 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 - 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 - size: 3318875 - timestamp: 1699202167581 -- kind: conda - name: tzdata - version: 2023d - build: h0c530f3_0 - subdir: noarch - noarch: generic - url: https://conda.anaconda.org/conda-forge/noarch/tzdata-2023d-h0c530f3_0.conda - sha256: 04f2ab3e36f2015841551415bf16bf62933bd94b7085d4be5493b388e95a9c3d - md5: 8dee24b8be2d9ff81e7bd4d7d97ff1b0 - license: LicenseRef-Public-Domain - size: 119639 - timestamp: 1703250910370 - kind: conda name: ucrt version: 10.0.22621.0 @@ -3666,15 +2691,6 @@ packages: license_family: MIT size: 218421 timestamp: 1682376911339 -- kind: pypi - name: werkzeug - version: 3.0.1 - url: https://files.pythonhosted.org/packages/c3/fc/254c3e9b5feb89ff5b9076a23218dafbc99c96ac5941e900b71206e6313b/werkzeug-3.0.1-py3-none-any.whl#sha256=90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - sha256: 90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10 - requires_dist: - - MarkupSafe >=2.1.1 - - watchdog >=2.3 ; extra == 'watchdog' - requires_python: '>=3.8' - kind: conda name: xorg-kbproto version: 1.0.7 @@ -3818,46 +2834,6 @@ packages: license: LGPL-2.1 and GPL-2.0 size: 238119 timestamp: 1660346964847 -- 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: pypi - name: zipp - version: 3.17.0 - url: https://files.pythonhosted.org/packages/d9/66/48866fc6b158c81cc2bfecc04c480f105c6040e8b077bc54c634b4a67926/zipp-3.17.0-py3-none-any.whl#sha256=0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 - sha256: 0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31 - requires_dist: - - sphinx >=3.5 ; extra == 'docs' - - sphinx <7.2.5 ; extra == 'docs' - - jaraco.packaging >=9.3 ; extra == 'docs' - - rst.linker >=1.9 ; extra == 'docs' - - furo ; extra == 'docs' - - sphinx-lint ; extra == 'docs' - - jaraco.tidelift >=1.4 ; extra == 'docs' - - pytest >=6 ; extra == 'testing' - - pytest-checkdocs >=2.4 ; extra == 'testing' - - pytest-cov ; extra == 'testing' - - pytest-enabler >=2.2 ; extra == 'testing' - - pytest-ruff ; extra == 'testing' - - jaraco.itertools ; extra == 'testing' - - jaraco.functools ; extra == 'testing' - - more-itertools ; extra == 'testing' - - big-O ; extra == 'testing' - - pytest-ignore-flaky ; extra == 'testing' - - pytest-black >=0.3.7 ; platform_python_implementation != 'PyPy' and extra == 'testing' - - pytest-mypy >=0.9.1 ; platform_python_implementation != 'PyPy' and extra == 'testing' - requires_python: '>=3.8' - kind: conda name: zlib version: 1.2.13 diff --git a/examples/cpp-sdl/pixi.toml b/examples/cpp-sdl/pixi.toml index 8c4cb9ab0..642938dd1 100644 --- a/examples/cpp-sdl/pixi.toml +++ b/examples/cpp-sdl/pixi.toml @@ -7,6 +7,18 @@ channels = ["conda-forge"] platforms = ["win-64", "linux-64", "osx-64", "osx-arm64"] [tasks] +# Start the built executable +start = { cmd = ".build/bin/sdl_example", depends_on = ["build"] } + +[dependencies] +sdl2 = "2.26.5.*" + +[feature.build.dependencies] +cmake = "3.26.4.*" +cxx-compiler = "1.5.2.*" +ninja = "1.11.1.*" + +[feature.build.tasks] # Configures CMake configure = { cmd = [ "cmake", @@ -24,11 +36,5 @@ configure = { cmd = [ # Build the executable but make sure CMake is configured first. build = { cmd = ["ninja", "-C", ".build"], depends_on = ["configure"] } -# Start the built executable -start = { cmd = ".build/bin/sdl_example", depends_on = ["build"] } - -[dependencies] -cmake = "3.26.4.*" -cxx-compiler = "1.5.2.*" -sdl2 = "2.26.5.*" -ninja = "1.11.1.*" +[environments] +build = ["build"] diff --git a/src/activation.rs b/src/activation.rs index a075b2c30..327357e8b 100644 --- a/src/activation.rs +++ b/src/activation.rs @@ -118,7 +118,9 @@ pub fn get_activator<'p>( } /// Runs and caches the activation script. -async fn run_activation(environment: &Environment<'_>) -> miette::Result> { +pub async fn run_activation( + environment: &Environment<'_>, +) -> miette::Result> { let activator = get_activator(environment, ShellEnum::default()).map_err(|e| { miette::miette!(format!( "failed to create activator for {:?}\n{}", diff --git a/src/cli/run.rs b/src/cli/run.rs index 4024bfd90..56babdbb9 100644 --- a/src/cli/run.rs +++ b/src/cli/run.rs @@ -1,17 +1,21 @@ use std::collections::hash_map::Entry; +use std::collections::HashSet; +use std::str::FromStr; use std::{collections::HashMap, path::PathBuf, string::String}; use clap::Parser; +use indexmap::IndexMap; use itertools::Itertools; use miette::{miette, Context, Diagnostic}; use rattler_conda_types::Platform; -use crate::activation::get_activation_env; +use crate::activation::get_environment_variables; use crate::project::errors::UnsupportedPlatformError; use crate::task::{ExecutableTask, FailedToParseShellScript, InvalidWorkingDirectory, TaskGraph}; use crate::Project; -use crate::environment::LockFileUsage; +use crate::environment::{ensure_up_to_date_lock_file, LockFileDerivedData}; +use crate::progress::await_in_progress; use crate::project::manifest::EnvironmentName; use crate::project::Environment; use thiserror::Error; @@ -38,13 +42,29 @@ pub struct Args { /// CLI entry point for `pixi run` /// When running the sigints are ignored and child can react to them. As it pleases. pub async fn execute(args: Args) -> miette::Result<()> { + // Load the project let project = Project::load_or_else_discover(args.manifest_path.as_deref())?; - let environment_name = args + + // Extract the passed in environment name. + let explicit_environment = args .environment - .map_or_else(|| EnvironmentName::Default, EnvironmentName::Named); - let environment = project - .environment(&environment_name) - .ok_or_else(|| miette::miette!("unknown environment '{environment_name}'"))?; + .map(|n| EnvironmentName::from_str(n.as_str())) + .transpose()? + .map(|n| { + project + .environment(&n) + .ok_or_else(|| miette::miette!("unknown environment '{n}'")) + }) + .transpose()?; + + // Ensure that the lock-file is up-to-date. + let mut lock_file = ensure_up_to_date_lock_file( + &project, + IndexMap::new(), + args.lock_file_usage.into(), + false, + ) + .await?; // Split 'task' into arguments if it's a single string, supporting commands like: // `"test 1 == 0 || echo failed"` or `"echo foo && echo bar"` or `"echo 'Hello World'"` @@ -59,8 +79,13 @@ pub async fn execute(args: Args) -> miette::Result<()> { tracing::debug!("Task parsed from run command: {:?}", task_args); // Construct a task graph from the input arguments - let task_graph = TaskGraph::from_cmd_args(&project, task_args, Some(Platform::current())) - .context("failed to construct task graph from command line arguments")?; + let task_graph = TaskGraph::from_cmd_args( + &project, + task_args, + Some(Platform::current()), + explicit_environment.clone(), + ) + .context("failed to construct task graph from command line arguments")?; // Traverse the task graph in topological order and execute each individual task. let mut task_idx = 0; @@ -81,18 +106,24 @@ pub async fn execute(args: Args) -> miette::Result<()> { eprintln!(); } eprintln!( - "{}{}", - console::style("✨ Pixi task: ").bold(), + "{}{}{}{}{}", + console::Emoji("✨ ", ""), + console::style("Pixi task (").bold(), + console::style(executable_task.run_environment.name()) + .bold() + .cyan(), + console::style("): ").bold(), executable_task.display_command(), ); } // If we don't have a command environment yet, we need to compute it. We lazily compute the // task environment because we only need the environment if a task is actually executed. - let task_env: &_ = match task_envs.entry(environment.clone()) { + let task_env: &_ = match task_envs.entry(executable_task.run_environment.clone()) { Entry::Occupied(env) => env.into_mut(), Entry::Vacant(entry) => { - let command_env = get_task_env(&environment, args.lock_file_usage.into()).await?; + let command_env = + get_task_env(&mut lock_file, &executable_task.run_environment).await?; entry.insert(command_env) } }; @@ -105,7 +136,7 @@ pub async fn execute(args: Args) -> miette::Result<()> { } Err(TaskExecutionError::NonZeroExitCode(code)) => { if code == 127 { - command_not_found(&project); + command_not_found(&project, explicit_environment); } std::process::exit(code); } @@ -117,34 +148,65 @@ pub async fn execute(args: Args) -> miette::Result<()> { } /// Called when a command was not found. -fn command_not_found(project: &Project) { - let available_tasks = project - .tasks(Some(Platform::current())) - .into_keys() - .sorted() - .collect_vec(); +fn command_not_found<'p>(project: &'p Project, explicit_environment: Option>) { + let available_tasks: HashSet = if let Some(explicit_environment) = explicit_environment + { + explicit_environment + .tasks(Some(Platform::current())) + .into_iter() + .flat_map(|tasks| tasks.into_keys()) + .map(ToOwned::to_owned) + .collect() + } else { + project + .environments() + .into_iter() + .flat_map(|env| { + env.tasks(Some(Platform::current())) + .into_iter() + .flat_map(|tasks| tasks.into_keys()) + .map(ToOwned::to_owned) + }) + .collect() + }; if !available_tasks.is_empty() { eprintln!( "\nAvailable tasks:\n{}", - available_tasks.into_iter().format_with("\n", |name, f| { - f(&format_args!("\t{}", console::style(name).bold())) - }) + available_tasks + .into_iter() + .sorted() + .format_with("\n", |name, f| { + f(&format_args!("\t{}", console::style(name).bold())) + }) ); } } /// Determine the environment variables to use when executing a command. The method combines the /// activation environment with the system environment variables. -pub async fn get_task_env( - environment: &Environment<'_>, - lock_file_usage: LockFileUsage, +pub async fn get_task_env<'p>( + lock_file_derived_data: &mut LockFileDerivedData<'p>, + environment: &Environment<'p>, ) -> miette::Result> { - // Activate the environment. - let activation_env = get_activation_env(environment, lock_file_usage).await?; + // Ensure there is a valid prefix + lock_file_derived_data.prefix(environment).await?; + + // Get environment variables from the activation + let activation_env = await_in_progress("activating environment", |_| { + crate::activation::run_activation(environment) + }) + .await + .wrap_err("failed to activate environment")?; + + // Get environments from pixi + let environment_variables = get_environment_variables(environment); // Concatenate with the system environment variables - Ok(std::env::vars().chain(activation_env).collect()) + Ok(std::env::vars() + .chain(activation_env) + .chain(environment_variables) + .collect()) } #[derive(Debug, Error, Diagnostic)] diff --git a/src/environment.rs b/src/environment.rs index 0f39577db..b7f76a049 100644 --- a/src/environment.rs +++ b/src/environment.rs @@ -684,7 +684,7 @@ impl<'p> UpdateContext<'p> { /// construct a task graph of all the work that needs to be done to update the lock-file. The tasks /// are awaited in a specific order to make sure that we can start instantiating prefixes as soon as /// possible. -async fn ensure_up_to_date_lock_file( +pub async fn ensure_up_to_date_lock_file( project: &Project, existing_repo_data: IndexMap<(Channel, Platform), SparseRepoData>, lock_file_usage: LockFileUsage, diff --git a/src/project/environment.rs b/src/project/environment.rs index 00747016b..e9288291d 100644 --- a/src/project/environment.rs +++ b/src/project/environment.rs @@ -46,6 +46,11 @@ impl Debug for Environment<'_> { } impl<'p> Environment<'p> { + /// Returns true if this environment is the default environment. + pub fn is_default(&self) -> bool { + self.environment.name == EnvironmentName::Default + } + /// Returns the project this environment belongs to. pub fn project(&self) -> &'p Project { self.project diff --git a/src/project/manifest/feature.rs b/src/project/manifest/feature.rs index 0e8906d65..12e170544 100644 --- a/src/project/manifest/feature.rs +++ b/src/project/manifest/feature.rs @@ -119,6 +119,11 @@ pub struct Feature { } impl Feature { + /// Returns true if this feature is the default feature. + pub fn is_default(&self) -> bool { + self.name == FeatureName::Default + } + /// Returns the dependencies of the feature for a given `spec_type` and `platform`. /// /// This function returns a [`Cow`]. If the dependencies are not combined or overwritten by diff --git a/src/task/error.rs b/src/task/error.rs index b2c494635..694af555d 100644 --- a/src/task/error.rs +++ b/src/task/error.rs @@ -1,3 +1,4 @@ +use crate::project::manifest::EnvironmentName; use miette::Diagnostic; use thiserror::Error; @@ -6,3 +7,11 @@ use thiserror::Error; pub struct MissingTaskError { pub task_name: String, } + +// TODO: We should make this error much better +#[derive(Debug, Error, Diagnostic)] +#[error("'{task_name}' is ambiguous")] +pub struct AmbiguousTaskError { + pub task_name: String, + pub environments: Vec, +} diff --git a/src/task/executable_task.rs b/src/task/executable_task.rs index 615244ede..821b282dd 100644 --- a/src/task/executable_task.rs +++ b/src/task/executable_task.rs @@ -1,3 +1,4 @@ +use crate::project::Environment; use crate::{ task::task_graph::{TaskGraph, TaskId}, task::{quote_arguments, Task}, @@ -52,6 +53,7 @@ pub struct ExecutableTask<'p> { pub project: &'p Project, pub name: Option, pub task: Cow<'p, Task>, + pub run_environment: Environment<'p>, pub additional_args: Vec, } @@ -63,6 +65,7 @@ impl<'p> ExecutableTask<'p> { project: task_graph.project(), name: node.name.clone(), task: node.task.clone(), + run_environment: node.run_environment.clone(), additional_args: node.additional_args.clone(), } } diff --git a/src/task/task_graph.rs b/src/task/task_graph.rs index e996ec940..b9666a512 100644 --- a/src/task/task_graph.rs +++ b/src/task/task_graph.rs @@ -1,3 +1,5 @@ +use crate::project::Environment; +use crate::task::error::AmbiguousTaskError; use crate::{ task::{error::MissingTaskError, CmdArgs, Custom, Task}, Project, @@ -23,6 +25,9 @@ pub struct TaskNode<'p> { /// The name of the task or `None` if the task is a custom task. pub name: Option, + /// The environment to run the task in + pub run_environment: Environment<'p>, + /// A reference to a project task, or a owned custom task. pub task: Cow<'p, Task>, @@ -69,6 +74,110 @@ impl<'p> Index for TaskGraph<'p> { } } +/// Defines where the task was defined when looking for a task. +#[derive(Debug, Copy, Clone, Eq, PartialEq)] +enum FindTaskSource { + CmdArgs, + DependsOn, +} + +/// An object to help with searching for tasks. +struct SearchEnvironments<'p> { + pub project: &'p Project, + pub explicit_environment: Option>, + pub platform: Option, +} + +#[derive(Debug, Diagnostic, Error)] +pub enum FindTaskError { + #[error(transparent)] + MissingTask(MissingTaskError), + + #[error(transparent)] + AmbiguousTask(AmbiguousTaskError), +} + +impl<'p> SearchEnvironments<'p> { + // Determine which environments we are allowed to check for tasks. + // + // If the user specified an environment, look for tasks in the main environment and the + // user specified environment. + // + // If the user did not specify an environment, look for tasks in any environment. + pub fn from_opt_env( + project: &'p Project, + explicit_environment: Option>, + platform: Option, + ) -> Self { + Self { + project, + explicit_environment, + platform, + } + } + + /// Finds the task with the given name or returns an error that explains why the task could not + /// be found. + pub fn find_task( + &self, + name: &str, + source: FindTaskSource, + ) -> Result<(Environment<'p>, &'p Task), FindTaskError> { + let mut tasks = Vec::new(); + + // If the task was specified on the command line and there is no explicit environment and + // there is a task with that name in the default feature, use the default environment. + if source == FindTaskSource::CmdArgs && self.explicit_environment.is_none() { + if let Some(task) = self + .project + .manifest + .default_feature() + .targets + .resolve(self.platform) + .find_map(|target| target.tasks.get(name)) + { + return Ok((self.project.default_environment(), task)); + } + } + + // If an explicit environment was specified, only look for tasks in that environment and + // the default environment. + let environments = if let Some(explicit_environment) = &self.explicit_environment { + vec![explicit_environment.clone()] + } else { + self.project.environments() + }; + + // Find all the task and environment combinations + for env in environments { + if let Some(task) = env + .tasks(self.platform) + .ok() + .and_then(|tasks| tasks.get(name).copied()) + { + tasks.push((env, task)); + } + } + + match tasks.len() { + 0 => Err(FindTaskError::MissingTask(MissingTaskError { + task_name: name.to_string(), + })), + 1 => { + let (env, task) = tasks.remove(0); + Ok((env.clone(), task)) + } + _ => Err(FindTaskError::AmbiguousTask(AmbiguousTaskError { + task_name: name.to_string(), + environments: tasks + .into_iter() + .map(|(env, _)| env.name().clone()) + .collect(), + })), + } + } +} + impl<'p> TaskGraph<'p> { pub fn project(&self) -> &'p Project { self.project @@ -79,30 +188,49 @@ impl<'p> TaskGraph<'p> { project: &'p Project, args: Vec, platform: Option, + environment: Option>, ) -> Result { let mut args = args; + let search_envs = SearchEnvironments::from_opt_env(project, environment, platform); + if let Some(name) = args.first() { - // Find the task in the project. First searches for platform specific tasks and falls - // back to looking for the task in the default tasks. - if let Some(task) = project.task_opt(name, platform) { - return Self::from_root( - project, - platform, - TaskNode { - name: Some(args.remove(0)), - task: Cow::Borrowed(task), - additional_args: args, - dependencies: vec![], - }, - ); + match search_envs.find_task(name, FindTaskSource::CmdArgs) { + Err(FindTaskError::MissingTask(_)) => {} + Err(FindTaskError::AmbiguousTask(err)) => { + return Err(TaskGraphError::AmbiguousTask(err)) + } + Ok((task_env, task)) => { + // If an explicit environment was specified and the task is from the default + // environment use the specified environment instead. + let run_env = match search_envs.explicit_environment.clone() { + Some(explicit_env) if task_env.is_default() => explicit_env, + _ => task_env, + }; + + return Self::from_root( + project, + search_envs, + TaskNode { + name: Some(args.remove(0)), + task: Cow::Borrowed(task), + run_environment: run_env, + additional_args: args, + dependencies: vec![], + }, + ); + } } } // When no task is found, just execute the command verbatim. + let run_environment = search_envs + .explicit_environment + .clone() + .unwrap_or_else(|| project.default_environment()); Self::from_root( project, - platform, + search_envs, TaskNode { name: None, task: Cow::Owned( @@ -112,6 +240,7 @@ impl<'p> TaskGraph<'p> { } .into(), ), + run_environment, additional_args: vec![], dependencies: vec![], }, @@ -121,7 +250,7 @@ impl<'p> TaskGraph<'p> { /// Constructs a new instance of a [`TaskGraph`] from a root task. fn from_root( project: &'p Project, - platform: Option, + search_environments: SearchEnvironments<'p>, root: TaskNode<'p>, ) -> Result { let mut task_name_to_node: HashMap = @@ -137,24 +266,30 @@ impl<'p> TaskGraph<'p> { // Iterate over all the dependencies of the node and add them to the graph. let mut node_dependencies = Vec::with_capacity(dependency_names.len()); for dependency in dependency_names { - // Check if we visisted this node before already. + // Check if we visited this node before already. if let Some(&task_id) = task_name_to_node.get(&dependency) { node_dependencies.push(task_id); continue; } // Find the task in the project - let Some(task_dependency) = project.task_opt(&dependency, platform) else { - return Err(TaskGraphError::MissingTask(MissingTaskError { - task_name: dependency, - })); - }; + let (task_env, task_dependency) = + match search_environments.find_task(&dependency, FindTaskSource::DependsOn) { + Err(FindTaskError::MissingTask(err)) => { + return Err(TaskGraphError::MissingTask(err)) + } + Err(FindTaskError::AmbiguousTask(err)) => { + return Err(TaskGraphError::AmbiguousTask(err)) + } + Ok(result) => result, + }; // Add the node to the graph let task_id = TaskId(nodes.len()); nodes.push(TaskNode { name: Some(dependency.clone()), task: Cow::Borrowed(task_dependency), + run_environment: task_env, additional_args: Vec::new(), dependencies: Vec::new(), }); @@ -210,6 +345,9 @@ impl<'p> TaskGraph<'p> { pub enum TaskGraphError { #[error(transparent)] MissingTask(#[from] MissingTaskError), + + #[error(transparent)] + AmbiguousTask(AmbiguousTaskError), } #[cfg(test)] @@ -325,4 +463,27 @@ mod test { vec![r#""echo bla""#] ); } + + #[test] + fn test_multi_env() { + assert_eq!( + commands_in_order( + r#" + [project] + name = "pixi" + channels = ["conda-forge"] + platforms = ["linux-64"] + + [feature.build.tasks] + build = "echo build" + + [environments] + build = ["build"] + "#, + &["build"], + None, + ), + vec![r#""echo build""#] + ); + } } From c573b3c562c2816f83196fda2a447071beaa676f Mon Sep 17 00:00:00 2001 From: Bas Zalmstra Date: Tue, 30 Jan 2024 14:23:13 +0100 Subject: [PATCH 2/4] fix: tests --- src/cli/run.rs | 18 ++++++++--------- src/environment.rs | 46 +++++++++++++++++++++++++++++++++++++----- src/lib.rs | 7 +++++-- src/task/task_graph.rs | 29 +++++++++++++++++++++++++- tests/common/mod.rs | 35 +++++++++++++++++++++++++++----- 5 files changed, 112 insertions(+), 23 deletions(-) diff --git a/src/cli/run.rs b/src/cli/run.rs index 56babdbb9..b379b0f37 100644 --- a/src/cli/run.rs +++ b/src/cli/run.rs @@ -4,7 +4,6 @@ use std::str::FromStr; use std::{collections::HashMap, path::PathBuf, string::String}; use clap::Parser; -use indexmap::IndexMap; use itertools::Itertools; use miette::{miette, Context, Diagnostic}; use rattler_conda_types::Platform; @@ -12,9 +11,9 @@ use rattler_conda_types::Platform; use crate::activation::get_environment_variables; use crate::project::errors::UnsupportedPlatformError; use crate::task::{ExecutableTask, FailedToParseShellScript, InvalidWorkingDirectory, TaskGraph}; -use crate::Project; +use crate::{Project, UpdateLockFileOptions}; -use crate::environment::{ensure_up_to_date_lock_file, LockFileDerivedData}; +use crate::environment::LockFileDerivedData; use crate::progress::await_in_progress; use crate::project::manifest::EnvironmentName; use crate::project::Environment; @@ -58,13 +57,12 @@ pub async fn execute(args: Args) -> miette::Result<()> { .transpose()?; // Ensure that the lock-file is up-to-date. - let mut lock_file = ensure_up_to_date_lock_file( - &project, - IndexMap::new(), - args.lock_file_usage.into(), - false, - ) - .await?; + let mut lock_file = project + .up_to_date_lock_file(UpdateLockFileOptions { + lock_file_usage: args.lock_file_usage.into(), + ..UpdateLockFileOptions::default() + }) + .await?; // Split 'task' into arguments if it's a single string, supporting commands like: // `"test 1 == 0 || echo failed"` or `"echo foo && echo bar"` or `"echo 'Hello World'"` diff --git a/src/environment.rs b/src/environment.rs index b7f76a049..8e28f4221 100644 --- a/src/environment.rs +++ b/src/environment.rs @@ -171,9 +171,13 @@ pub async fn get_up_to_date_prefix( sanity_check_project(project)?; // Ensure that the lock-file is up-to-date - let mut lock_file = - ensure_up_to_date_lock_file(project, existing_repo_data, lock_file_usage, no_install) - .await?; + let mut lock_file = project + .up_to_date_lock_file(UpdateLockFileOptions { + existing_repo_data, + lock_file_usage, + no_install, + }) + .await?; // Get the locked environment from the lock-file. if no_install { @@ -183,6 +187,38 @@ pub async fn get_up_to_date_prefix( } } +/// Options to pass to [`Project::up_to_date_lock_file`]. +#[derive(Default)] +pub struct UpdateLockFileOptions { + /// Defines what to do if the lock-file is out of date + pub lock_file_usage: LockFileUsage, + + /// Don't install anything to disk. + pub no_install: bool, + + /// Existing repodata that can be used to avoid downloading it again. + pub existing_repo_data: IndexMap<(Channel, Platform), SparseRepoData>, +} + +impl Project { + /// Ensures that the lock-file is up-to-date with the project information. + /// + /// Returns the lock-file and any potential derived data that was computed as part of this + /// operation. + pub async fn up_to_date_lock_file( + &self, + options: UpdateLockFileOptions, + ) -> miette::Result> { + ensure_up_to_date_lock_file( + self, + options.existing_repo_data, + options.lock_file_usage, + options.no_install, + ) + .await + } +} + #[allow(clippy::too_many_arguments)] // TODO: refactor args into struct pub async fn update_prefix_pypi( @@ -684,12 +720,12 @@ impl<'p> UpdateContext<'p> { /// construct a task graph of all the work that needs to be done to update the lock-file. The tasks /// are awaited in a specific order to make sure that we can start instantiating prefixes as soon as /// possible. -pub async fn ensure_up_to_date_lock_file( +async fn ensure_up_to_date_lock_file( project: &Project, existing_repo_data: IndexMap<(Channel, Platform), SparseRepoData>, lock_file_usage: LockFileUsage, no_install: bool, -) -> miette::Result { +) -> miette::Result> { let lock_file = load_lock_file(project).await?; let current_platform = Platform::current(); let package_cache = Arc::new(PackageCache::new(config::get_cache_dir()?.join("pkgs"))); diff --git a/src/lib.rs b/src/lib.rs index 89c7f0167..27b1bb26a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -21,9 +21,12 @@ mod pypi_marker_env; mod pypi_tags; pub use activation::get_activation_env; +pub use environment::UpdateLockFileOptions; pub use lock_file::load_lock_file; -pub use project::manifest::FeatureName; -pub use project::{DependencyType, Project, SpecType}; +pub use project::{ + manifest::{EnvironmentName, FeatureName}, + DependencyType, Project, SpecType, +}; pub use task::{ CmdArgs, ExecutableTask, RunOutput, Task, TaskExecutionError, TaskGraph, TaskGraphError, }; diff --git a/src/task/task_graph.rs b/src/task/task_graph.rs index b9666a512..90bde1581 100644 --- a/src/task/task_graph.rs +++ b/src/task/task_graph.rs @@ -368,6 +368,7 @@ mod test { &project, run_args.into_iter().map(|arg| arg.to_string()).collect(), platform, + None, ) .unwrap(); @@ -483,7 +484,33 @@ mod test { &["build"], None, ), - vec![r#""echo build""#] + vec![r#"echo build"#] + ); + } + + #[test] + fn test_multi_env_default() { + assert_eq!( + commands_in_order( + r#" + [project] + name = "pixi" + channels = ["conda-forge"] + platforms = ["linux-64"] + + [tasks] + start = "hello world" + + [feature.build.tasks] + build = "echo build" + + [environments] + build = ["build"] + "#, + &["start"], + None, + ), + vec![r#"hello world"#] ); } } diff --git a/tests/common/mod.rs b/tests/common/mod.rs index 2353cf88d..bce5b9e9b 100644 --- a/tests/common/mod.rs +++ b/tests/common/mod.rs @@ -14,7 +14,8 @@ use pixi::{ project, run, task::{self, AddArgs, AliasArgs}, }, - consts, ExecutableTask, Project, RunOutput, TaskGraph, TaskGraphError, + consts, EnvironmentName, ExecutableTask, Project, RunOutput, TaskGraph, TaskGraphError, + UpdateLockFileOptions, }; use rattler_conda_types::{MatchSpec, Platform}; @@ -224,11 +225,35 @@ impl PixiControl { // Load the project let project = self.project()?; - let environment = project.default_environment(); + + // Extract the passed in environment name. + let explicit_environment = args + .environment + .map(|n| EnvironmentName::from_str(n.as_str())) + .transpose()? + .map(|n| { + project + .environment(&n) + .ok_or_else(|| miette::miette!("unknown environment '{n}'")) + }) + .transpose()?; + + // Ensure the lock-file is up-to-date + let mut lock_file = project + .up_to_date_lock_file(UpdateLockFileOptions { + lock_file_usage: args.lock_file_usage.into(), + ..UpdateLockFileOptions::default() + }) + .await?; // Create a task graph from the command line arguments. - let task_graph = TaskGraph::from_cmd_args(&project, args.task, Some(Platform::current())) - .map_err(RunError::TaskGraphError)?; + let task_graph = TaskGraph::from_cmd_args( + &project, + args.task, + Some(Platform::current()), + explicit_environment, + ) + .map_err(RunError::TaskGraphError)?; // Iterate over all tasks in the graph and execute them. let mut task_env = None; @@ -239,7 +264,7 @@ impl PixiControl { // Construct the task environment if not already created. let task_env = match task_env.as_ref() { None => { - let env = get_task_env(&environment, args.lock_file_usage.into()).await?; + let env = get_task_env(&mut lock_file, &task.run_environment).await?; task_env.insert(env) as &_ } Some(task_env) => task_env, From e9ab215250be582e028234c183eecb49dfe73702 Mon Sep 17 00:00:00 2001 From: Bas Zalmstra Date: Tue, 30 Jan 2024 15:47:29 +0100 Subject: [PATCH 3/4] chore: improve ambigious error --- src/cli/info.rs | 4 +-- src/cli/run.rs | 7 +++-- src/cli/task.rs | 2 +- src/project/environment.rs | 55 ++++++++++++++++++++++---------------- src/project/mod.rs | 2 +- src/task/error.rs | 23 ++++++++++++++-- src/task/task_graph.rs | 23 ++++++++++++---- 7 files changed, 78 insertions(+), 38 deletions(-) diff --git a/src/cli/info.rs b/src/cli/info.rs index ebdcc1974..ff0894774 100644 --- a/src/cli/info.rs +++ b/src/cli/info.rs @@ -308,14 +308,14 @@ pub async fn execute(args: Args) -> miette::Result<()> { .iter() .map(|env| { let tasks = env - .tasks(None) + .tasks(None, true) .ok() .map(|t| t.into_keys().map(|k| k.to_string()).collect()) .unwrap_or_default(); EnvironmentInfo { name: env.name().as_str().to_string(), - features: env.features().map(|f| f.name.to_string()).collect(), + features: env.features(true).map(|f| f.name.to_string()).collect(), solve_group: env.manifest().solve_group.clone(), environment_size: None, dependencies: env diff --git a/src/cli/run.rs b/src/cli/run.rs index b379b0f37..e502d0bdf 100644 --- a/src/cli/run.rs +++ b/src/cli/run.rs @@ -82,8 +82,7 @@ pub async fn execute(args: Args) -> miette::Result<()> { task_args, Some(Platform::current()), explicit_environment.clone(), - ) - .context("failed to construct task graph from command line arguments")?; + )?; // Traverse the task graph in topological order and execute each individual task. let mut task_idx = 0; @@ -150,7 +149,7 @@ fn command_not_found<'p>(project: &'p Project, explicit_environment: Option = if let Some(explicit_environment) = explicit_environment { explicit_environment - .tasks(Some(Platform::current())) + .tasks(Some(Platform::current()), true) .into_iter() .flat_map(|tasks| tasks.into_keys()) .map(ToOwned::to_owned) @@ -160,7 +159,7 @@ fn command_not_found<'p>(project: &'p Project, explicit_environment: Option miette::Result<()> { let tasks = project .environment(&env) .ok_or(miette!("Environment `{}` not found in project", env))? - .tasks(Some(Platform::current()))? + .tasks(Some(Platform::current()), true)? .into_keys() .collect_vec(); if tasks.is_empty() { diff --git a/src/project/environment.rs b/src/project/environment.rs index e9288291d..668bcd077 100644 --- a/src/project/environment.rs +++ b/src/project/environment.rs @@ -77,19 +77,24 @@ impl<'p> Environment<'p> { /// Returns references to the features that make up this environment. The default feature is /// always added at the end. - pub fn features(&self) -> impl Iterator + DoubleEndedIterator + '_ { - self.environment - .features - .iter() - .map(|feature_name| { - self.project - .manifest - .parsed - .features - .get(&FeatureName::Named(feature_name.clone())) - .expect("feature usage should have been validated upfront") - }) - .chain([self.project.manifest.default_feature()]) + pub fn features( + &self, + include_default: bool, + ) -> impl Iterator + DoubleEndedIterator + '_ { + let environment_features = self.environment.features.iter().map(|feature_name| { + self.project + .manifest + .parsed + .features + .get(&FeatureName::Named(feature_name.clone())) + .expect("feature usage should have been validated upfront") + }); + + if include_default { + Either::Left(environment_features.chain([self.project.manifest.default_feature()])) + } else { + Either::Right(environment_features) + } } /// Returns the channels associated with this environment. @@ -102,7 +107,7 @@ impl<'p> Environment<'p> { /// used instead. However, these are not considered during deduplication. This means the default /// channels are always added to the end of the list. pub fn channels(&self) -> IndexSet<&'p Channel> { - self.features() + self.features(true) .filter_map(|feature| match feature.name { // Use the user-specified channels of each feature if the feature defines them. Only // for the default feature do we use the default channels from the project metadata @@ -135,7 +140,7 @@ impl<'p> Environment<'p> { /// Features can specify which platforms they support through the `platforms` key. If a feature /// does not specify any platforms the features defined by the project are used. pub fn platforms(&self) -> HashSet { - self.features() + self.features(true) .map(|feature| { match &feature.platforms { Some(platforms) => &platforms.value, @@ -160,10 +165,11 @@ impl<'p> Environment<'p> { pub fn tasks( &self, platform: Option, + include_default: bool, ) -> Result, UnsupportedPlatformError> { self.validate_platform_support(platform)?; let result = self - .features() + .features(include_default) .flat_map(|feature| feature.targets.resolve(platform)) .rev() // Reverse to get the most specific targets last. .flat_map(|target| target.tasks.iter()) @@ -175,7 +181,10 @@ impl<'p> Environment<'p> { /// Returns the task with the given `name` and for the specified `platform` or an `UnknownTask` /// which explains why the task was not available. pub fn task(&self, name: &str, platform: Option) -> Result<&'p Task, UnknownTask> { - match self.tasks(platform).map(|tasks| tasks.get(name).copied()) { + match self + .tasks(platform, true) + .map(|tasks| tasks.get(name).copied()) + { Err(_) | Ok(None) => Err(UnknownTask { project: self.project, environment: self.name().clone(), @@ -192,7 +201,7 @@ impl<'p> Environment<'p> { /// the features that make up the environment. If multiple features specify a requirement for /// the same system package, the highest is chosen. pub fn system_requirements(&self) -> SystemRequirements { - self.features() + self.features(true) .map(|feature| &feature.system_requirements) .fold(SystemRequirements::default(), |acc, req| { acc.union(req) @@ -206,7 +215,7 @@ impl<'p> Environment<'p> { /// requirement for the same package that both requirements are returned. The different /// requirements per package are sorted in the same order as the features they came from. pub fn dependencies(&self, kind: Option, platform: Option) -> Dependencies { - self.features() + self.features(true) .filter_map(|f| f.dependencies(kind, platform)) .map(|deps| Dependencies::from(deps.into_owned())) .reduce(|acc, deps| acc.union(&deps)) @@ -222,7 +231,7 @@ impl<'p> Environment<'p> { &self, platform: Option, ) -> IndexMap> { - self.features() + self.features(true) .filter_map(|f| f.pypi_dependencies(platform)) .fold(IndexMap::default(), |mut acc, deps| { // Either clone the values from the Cow or move the values from the owned map. @@ -249,7 +258,7 @@ impl<'p> Environment<'p> { /// The activation scripts of all features are combined in the order they are defined for the /// environment. pub fn activation_scripts(&self, platform: Option) -> Vec { - self.features() + self.features(true) .filter_map(|f| f.activation_scripts(platform)) .flatten() .cloned() @@ -276,7 +285,7 @@ impl<'p> Environment<'p> { /// Returns true if the environments contains any reference to a pypi dependency. pub fn has_pypi_dependencies(&self) -> bool { - self.features().any(|f| f.has_pypi_dependencies()) + self.features(true).any(|f| f.has_pypi_dependencies()) } } @@ -390,7 +399,7 @@ mod tests { assert!(manifest .default_environment() - .tasks(Some(Platform::Osx64)) + .tasks(Some(Platform::Osx64), true) .is_err()) } diff --git a/src/project/mod.rs b/src/project/mod.rs index 0ac65ca1f..173930e91 100644 --- a/src/project/mod.rs +++ b/src/project/mod.rs @@ -281,7 +281,7 @@ impl Project { /// TODO: Remove this function and use the tasks from the default environment instead. pub fn tasks(&self, platform: Option) -> HashMap<&str, &Task> { self.default_environment() - .tasks(platform) + .tasks(platform, true) .unwrap_or_default() } diff --git a/src/task/error.rs b/src/task/error.rs index 694af555d..15cb6e470 100644 --- a/src/task/error.rs +++ b/src/task/error.rs @@ -1,5 +1,7 @@ use crate::project::manifest::EnvironmentName; +use itertools::Itertools; use miette::Diagnostic; +use std::fmt::{Display, Formatter}; use thiserror::Error; #[derive(Debug, Error, Diagnostic)] @@ -9,9 +11,26 @@ pub struct MissingTaskError { } // TODO: We should make this error much better -#[derive(Debug, Error, Diagnostic)] -#[error("'{task_name}' is ambiguous")] +#[derive(Debug, Error)] pub struct AmbiguousTaskError { pub task_name: String, pub environments: Vec, } + +impl Display for AmbiguousTaskError { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + write!(f, "the task '{}' is ambiguous", &self.task_name) + } +} + +impl Diagnostic for AmbiguousTaskError { + fn help<'a>(&'a self) -> Option> { + Some(Box::new(format!( + "These environments provide the task '{task_name}': {}\n\nSpecify the '--environment' flag to run the task in a specific environment, e.g:.\n\n\t{} run --environment {} {task_name}", + self.environments.iter().map(|env| env.as_str()).format(", "), + env!("CARGO_PKG_NAME"), + self.environments.first().expect("there should be at least two environment"), + task_name=&self.task_name + ))) + } +} diff --git a/src/task/task_graph.rs b/src/task/task_graph.rs index 90bde1581..89c7ed55c 100644 --- a/src/task/task_graph.rs +++ b/src/task/task_graph.rs @@ -4,6 +4,7 @@ use crate::{ task::{error::MissingTaskError, CmdArgs, Custom, Task}, Project, }; +use itertools::Itertools; use miette::Diagnostic; use rattler_conda_types::Platform; use std::{ @@ -123,10 +124,8 @@ impl<'p> SearchEnvironments<'p> { name: &str, source: FindTaskSource, ) -> Result<(Environment<'p>, &'p Task), FindTaskError> { - let mut tasks = Vec::new(); - // If the task was specified on the command line and there is no explicit environment and - // there is a task with that name in the default feature, use the default environment. + // the task is only defined in the default feature, use the default environment. if source == FindTaskSource::CmdArgs && self.explicit_environment.is_none() { if let Some(task) = self .project @@ -136,7 +135,18 @@ impl<'p> SearchEnvironments<'p> { .resolve(self.platform) .find_map(|target| target.tasks.get(name)) { - return Ok((self.project.default_environment(), task)); + // None of the other environments can have this task. Otherwise, its still + // ambiguous. + if !self + .project + .environments() + .into_iter() + .flat_map(|env| env.features(false).collect_vec()) + .flat_map(|feature| feature.targets.resolve(self.platform)) + .any(|target| target.tasks.contains_key(name)) + { + return Ok((self.project.default_environment(), task)); + } } } @@ -149,9 +159,11 @@ impl<'p> SearchEnvironments<'p> { }; // Find all the task and environment combinations + let include_default_feature = true; + let mut tasks = Vec::new(); for env in environments { if let Some(task) = env - .tasks(self.platform) + .tasks(self.platform, include_default_feature) .ok() .and_then(|tasks| tasks.get(name).copied()) { @@ -347,6 +359,7 @@ pub enum TaskGraphError { MissingTask(#[from] MissingTaskError), #[error(transparent)] + #[diagnostic(transparent)] AmbiguousTask(AmbiguousTaskError), } From 9817fcb77889f8995f4301105ddd828357e00780 Mon Sep 17 00:00:00 2001 From: Bas Zalmstra Date: Tue, 30 Jan 2024 16:05:01 +0100 Subject: [PATCH 4/4] fix: tests --- tests/task_tests.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/task_tests.rs b/tests/task_tests.rs index c7d54f8aa..ead60d6a0 100644 --- a/tests/task_tests.rs +++ b/tests/task_tests.rs @@ -21,7 +21,7 @@ pub async fn add_remove_task() { .unwrap(); let project = pixi.project().unwrap(); - let tasks = project.default_environment().tasks(None).unwrap(); + let tasks = project.default_environment().tasks(None, true).unwrap(); let task = tasks.get("test").unwrap(); assert!(matches!(task, Task::Plain(s) if s == "echo hello")); @@ -31,7 +31,7 @@ pub async fn add_remove_task() { pixi.project() .unwrap() .default_environment() - .tasks(None) + .tasks(None, true) .unwrap() .len(), 0 @@ -57,7 +57,7 @@ pub async fn add_command_types() { .unwrap(); let project = pixi.project().unwrap(); - let tasks = project.default_environment().tasks(None).unwrap(); + let tasks = project.default_environment().tasks(None, true).unwrap(); let task2 = tasks.get("test2").unwrap(); let task = tasks.get("test").unwrap(); assert!(matches!(task2, Task::Execute(cmd) if matches!(cmd.cmd, CmdArgs::Single(_)))); @@ -76,7 +76,7 @@ pub async fn add_command_types() { .execute() .unwrap(); let project = pixi.project().unwrap(); - let tasks = project.default_environment().tasks(None).unwrap(); + let tasks = project.default_environment().tasks(None, true).unwrap(); let task = tasks.get("testing").unwrap(); assert!(matches!(task, Task::Alias(a) if a.depends_on.get(0).unwrap() == "test")); } @@ -134,7 +134,7 @@ pub async fn add_remove_target_specific_task() { let project = pixi.project().unwrap(); let task = *project .default_environment() - .tasks(Some(Platform::Win64)) + .tasks(Some(Platform::Win64), true) .unwrap() .get("test") .unwrap(); @@ -155,7 +155,7 @@ pub async fn add_remove_target_specific_task() { assert_eq!( project .default_environment() - .tasks(Some(Platform::Win64)) + .tasks(Some(Platform::Win64), true) .unwrap() .len(), // The default task is still there