diff --git a/.github/workflows/run-tests-comment.yml b/.github/workflows/run-tests-comment.yml deleted file mode 100644 index ccae9db0ee..0000000000 --- a/.github/workflows/run-tests-comment.yml +++ /dev/null @@ -1,77 +0,0 @@ -name: Test via PR Comment -on: - issue_comment: - types: - - created - -# Required shell entrypoint to have properly configured bash shell -defaults: - run: - shell: bash -l {0} - -jobs: - linux: - runs-on: "ubuntu-latest" - strategy: - matrix: - python-version: ["3.9", "3.10", "3.11"] - fail-fast: false - name: Linux Python ${{ matrix.python-version }} - if: ${{ github.event.issue.pull_request && github.event.comment.body == '@runGAtests' }} - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - uses: conda-incubator/setup-miniconda@v2 - with: - activate-environment: esmvalcore - environment-file: environment.yml - python-version: ${{ matrix.python-version }} - miniforge-version: "latest" - miniforge-variant: Mambaforge - use-mamba: true - - run: mkdir -p test_linux_artifacts_python_${{ matrix.python-version }} - - run: conda --version 2>&1 | tee test_linux_artifacts_python_${{ matrix.python-version }}/conda_version.txt - - run: python -V 2>&1 | tee test_linux_artifacts_python_${{ matrix.python-version }}/python_version.txt - - run: pip install -e .[develop] 2>&1 | tee test_linux_artifacts_python_${{ matrix.python-version }}/install.txt - - run: flake8 - - run: pytest -n 2 -m "not installation" 2>&1 | tee test_linux_artifacts_python_${{ matrix.python-version }}/test_report.txt - - name: Upload artifacts - if: ${{ always() }} # upload artifacts even if fail - uses: actions/upload-artifact@v2 - with: - name: Test_Linux_python_${{ matrix.python-version }} - path: test_linux_artifacts_python_${{ matrix.python-version }} - - osx: - runs-on: "macos-latest" - strategy: - matrix: - python-version: ["3.9", "3.10", "3.11"] - fail-fast: false - name: OSX Python ${{ matrix.python-version }} - if: ${{ github.event.issue.pull_request && github.event.comment.body == '@runGAtests' }} - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - uses: conda-incubator/setup-miniconda@v2 - with: - activate-environment: esmvalcore - environment-file: environment.yml - python-version: ${{ matrix.python-version }} - miniforge-version: "latest" - miniforge-variant: Mambaforge - use-mamba: true - - run: mkdir -p test_osx_artifacts_python_${{ matrix.python-version }} - - run: conda --version 2>&1 | tee test_osx_artifacts_python_${{ matrix.python-version }}/conda_version.txt - - run: python -V 2>&1 | tee test_osx_artifacts_python_${{ matrix.python-version }}/python_version.txt - - run: pip install -e .[develop] 2>&1 | tee test_osx_artifacts_python_${{ matrix.python-version }}/install.txt - - run: flake8 - - run: pytest -n 2 -m "not installation" 2>&1 | tee test_osx_artifacts_python_${{ matrix.python-version }}/test_report.txt - - name: Upload artifacts - if: ${{ always() }} # upload artifacts even if fail - uses: actions/upload-artifact@v2 - with: - name: Test_OSX_python_${{ matrix.python-version }} - path: test_osx_artifacts_python_${{ matrix.python-version }} diff --git a/CITATION.cff b/CITATION.cff index 1f5a31582f..70cf872768 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -201,11 +201,11 @@ authors: given-names: Joerg cff-version: 1.2.0 -date-released: 2023-07-04 +date-released: 2023-11-01 doi: "10.5281/zenodo.3387139" license: "Apache-2.0" message: "If you use this software, please cite it using these metadata." repository-code: "https://github.com/ESMValGroup/ESMValCore/" title: ESMValCore -version: "v2.9.0" +version: "v2.10.0rc1" ... diff --git a/README.md b/README.md index d0e5e02e36..20d13f1637 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ [![codecov](https://codecov.io/gh/ESMValGroup/ESMValCore/branch/main/graph/badge.svg?token=wQnDzguwq6)](https://codecov.io/gh/ESMValGroup/ESMValCore) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/5d496dea9ef64ec68e448a6df5a65783)](https://www.codacy.com/gh/ESMValGroup/ESMValCore?utm_source=github.com&utm_medium=referral&utm_content=ESMValGroup/ESMValCore&utm_campaign=Badge_Grade) [![Docker Build Status](https://img.shields.io/docker/cloud/build/esmvalgroup/esmvalcore)](https://hub.docker.com/r/esmvalgroup/esmvalcore/) -[![Anaconda-Server Badge](https://anaconda.org/conda-forge/esmvalcore/badges/version.svg)](https://anaconda.org/conda-forge/esmvalcore) +[![Anaconda-Server Badge](https://img.shields.io/badge/Anaconda.org-2.9.0-blue.svg)](https://anaconda.org/conda-forge/esmvalcore) [![Github Actions Test](https://github.com/ESMValGroup/ESMValCore/actions/workflows/run-tests.yml/badge.svg)](https://github.com/ESMValGroup/ESMValCore/actions/workflows/run-tests.yml) ![esmvaltoollogo](https://raw.githubusercontent.com/ESMValGroup/ESMValCore/main/doc/figures/ESMValTool-logo-2.png) diff --git a/conda-linux-64.lock b/conda-linux-64.lock index e1b497c584..69c8d6ab36 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 2b5ce1d2957de54bf44f92cef302051df5f4407ef5d8d75d24f94604e083413f +# input_hash: 55d83fc9b0296f7958ba5243657df8702c78bc2ffca2c410e5ded6c9b712abdf @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.7.22-hbcca054_0.conda#a73ecd2988327ad4c8f2c331482917f2 @@ -26,9 +26,9 @@ https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2# https://conda.anaconda.org/conda-forge/linux-64/binutils-2.40-hdd6e379_0.conda#ccc940fddbc3fcd3d79cd4c654c4b5c4 https://conda.anaconda.org/conda-forge/linux-64/binutils_linux-64-2.40-hbdbef99_2.conda#adfebae9fdc63a598495dfe3b006973a https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h807b86a_2.conda#c28003b0be0494f9a7664389146716ff -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.3-hd590300_0.conda#434466e97a4174b0c4de114eb7100550 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.4-hd590300_0.conda#8dacaf703f8e57aa0c4f0c5c8f4be39b https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h7f98852_4.tar.bz2#a1fd65c7ccbf10880423d82bca54eb54 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.20.1-hd590300_0.conda#6642e4faa4804be3a0e7edfefbd16595 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.20.1-hd590300_1.conda#2facbaf5ee1a56967aecaee89799160e https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 @@ -50,8 +50,8 @@ https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.5.0-hcb278e6_1.conda# https://conda.anaconda.org/conda-forge/linux-64/libffi-3.4.2-h7f98852_5.tar.bz2#d645c6d2ac96843a2bfaccd2d62b3ac3 https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-13.2.0-ha4646dd_2.conda#78fdab09d9138851dde2b5fe2a11019e https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-h166bdaf_0.tar.bz2#b62b52da46c39ee2bc3c162ac7f1804d -https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-2.1.5.1-hd590300_1.conda#323e90742f0f48fc22bea908735f55e6 -https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.0-hd590300_1.conda#854e3e1623b39777140f199c5f9ab952 +https://conda.anaconda.org/conda-forge/linux-64/libjpeg-turbo-3.0.0-hd590300_1.conda#ea25936bb4080d843790b586850f82b8 +https://conda.anaconda.org/conda-forge/linux-64/libnsl-2.0.1-hd590300_0.conda#30fd6e37fe21f86f4bd26d6ee73eeec7 https://conda.anaconda.org/conda-forge/linux-64/libnuma-2.0.16-h0b41bf4_1.conda#28bfe2cb11357ccc5be21101a6b7ce86 https://conda.anaconda.org/conda-forge/linux-64/libsanitizer-12.3.0-h0f45ef3_2.conda#4655db64eca78a6fcc4fb654fc1f8d57 https://conda.anaconda.org/conda-forge/linux-64/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d @@ -62,13 +62,12 @@ https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.3.2-hd590300_0.co https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.2.13-hd590300_5.conda#f36c115f1ee199da648e0597ec2047ad https://conda.anaconda.org/conda-forge/linux-64/lz4-c-1.9.4-hcb278e6_0.conda#318b08df404f9c9be5712aaa5a6f0bb0 https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-h516909a_1000.tar.bz2#bb14fcb13341b81d5eb386423b9d2bac -https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-hcb278e6_0.conda#681105bccc2a3f7f1a837d47d39c9179 +https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.4-h59595ed_2.conda#7dbaa197d7ba6032caf7ae7f32c1efa0 https://conda.anaconda.org/conda-forge/linux-64/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.3-hd590300_0.conda#7bb88ce04c8deb9f7d763ae04a1da72f +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.1.4-hd590300_0.conda#412ba6938c3e2abaca8b1129ea82e238 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.42.2-h59595ed_0.conda#700edd63ccd5fc66b70b1c028cea9a68 https://conda.anaconda.org/conda-forge/linux-64/pthread-stubs-0.4-h36c2ea0_1001.tar.bz2#22dad4df6e8630e8dff2428f6f6a7036 https://conda.anaconda.org/conda-forge/linux-64/rdma-core-28.9-h59595ed_1.conda#aeffb7c06b5f65e55e6c637408dc4100 -https://conda.anaconda.org/conda-forge/linux-64/re2-2023.03.02-h8c504da_0.conda#206f8fa808748f6e90599c3368a1114e https://conda.anaconda.org/conda-forge/linux-64/snappy-1.1.10-h9fff704_0.conda#e6d228cd0bb74a51dd18f5bfce0b4115 https://conda.anaconda.org/conda-forge/linux-64/tzcode-2023c-h0b41bf4_0.conda#0c0533894f21c3d35697cb8378d390e2 https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.7-hcb278e6_1.conda#2c46deb08ba9b10e90d0a6401ad65deb @@ -82,25 +81,26 @@ https://conda.anaconda.org/conda-forge/linux-64/xorg-xproto-7.0.31-h7f98852_1007 https://conda.anaconda.org/conda-forge/linux-64/xxhash-0.8.2-hd590300_0.conda#f08fb5c89edfc4aadee1c81d4cfb1fa1 https://conda.anaconda.org/conda-forge/linux-64/xz-5.2.6-h166bdaf_0.tar.bz2#2161070d867d1b1204ea749c8eec4ef0 https://conda.anaconda.org/conda-forge/linux-64/yaml-0.2.5-h7f98852_2.tar.bz2#4cb3ad778ec2d5a7acbdf254eb1c42ae -https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.2-h09139f6_2.conda#29c3112841eee851f6f5451f6d705782 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h184a658_3.conda#c62775b5028b5a4eda25037f9af7f5b3 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.12-h184a658_2.conda#ba06d81b81ec3eaf4ee83cd47f808134 -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.17-h184a658_2.conda#10fcdbd02ba7fa0827fb8f7d94f8375b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.6.7-h6e18cf3_0.conda#cdbd44927a53a313d69f3c206a418dd2 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.17-h037bafe_4.conda#72cb3661f349a95ea48b0ddcdc4c0f18 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.12-h037bafe_3.conda#6c2ea725535e0f2a18f645a0bf03a8f6 +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.17-h037bafe_3.conda#ac1b0e60de127cc46a04e76a907434a1 https://conda.anaconda.org/conda-forge/linux-64/expat-2.5.0-hcb278e6_1.conda#8b9b5aca60558d02ddaa09d599e55920 https://conda.anaconda.org/conda-forge/linux-64/gcc_impl_linux-64-12.3.0-he2b93b0_2.conda#2f4d8677dc7dd87f93e9abfb2ce86808 https://conda.anaconda.org/conda-forge/linux-64/glog-0.6.0-h6f12383_0.tar.bz2#b31f3565cb84435407594e548a2fb7b2 -https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h501b40f_6.conda#c3e9338e15d90106f467377017352b97 +https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/libbrotlidec-1.1.0-hd590300_1.conda#f07002e225d7a60a694d42a7bf5ff53f https://conda.anaconda.org/conda-forge/linux-64/libbrotlienc-1.1.0-hd590300_1.conda#5fc11c6020d421960607d821310fcd4d https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2.tar.bz2#4d331e44109e3f0e19b4cb8f9b82f3e1 https://conda.anaconda.org/conda-forge/linux-64/libevent-2.1.12-hf998b51_1.conda#a1cfcc585f0c42bf8d5546bb1dfb668d https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_2.conda#e75a75a6eaf6f318dae2631158c46575 https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-h01aab08_1018.conda#3eb5f16bcc8a02892199aa63555c731f -https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.52.0-h61bc06f_0.conda#613955a50485812985c059e7b269f42e +https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.55.1-h47da74e_0.conda#a802251d1eaeeae041c867faf0f94fa8 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 -https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.24.3-hf27288f_0.conda#f2877435606cb6069201c6dceab9ac45 +https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.24.3-hf27288f_1.conda#5097789a2bc83e697d7509df57f25bfd +https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.06.02-h7a70373_0.conda#c0e7eacd9694db3ef5ef2979a7deea70 https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hb58d41b_14.conda#264f9a3a4ea52c8f4d3e8ae1213a3335 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.43.2-h2797004_0.conda#4b441a1ee22397d5a27dc1126b849edd +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.0-h2797004_0.conda#b58e6816d137f3aabf77d341dd5d732b https://conda.anaconda.org/conda-forge/linux-64/libssh2-1.11.0-h0841786_0.conda#1f5a58e686b13bcfde88b93f547d23fe https://conda.anaconda.org/conda-forge/linux-64/libudunits2-2.2.28-h40f5838_3.conda#4bdace082e911a3e1f1f0b721bed5b56 https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.15-h0b41bf4_0.conda#33277193f5b92bad9fdd230eb700929c @@ -108,14 +108,14 @@ https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.11.5-h232c23b_1.conda# https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.40-hc3806b6_0.tar.bz2#69e2c796349cd9b273890bee0febfe1b https://conda.anaconda.org/conda-forge/linux-64/readline-8.2-h8228510_1.conda#47d31b792659ce70f470b5c82fdfb7a4 -https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.54-h06160fa_0.conda#149520612b92991a7de6f17550a19739 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.3.55-h06160fa_0.conda#8cdfb7d58bdfd543717eeacc0801f3c0 https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-h2797004_0.conda#513336054f884f95d9fd925748f41ef3 https://conda.anaconda.org/conda-forge/linux-64/ucx-1.15.0-h64cca9d_0.conda#b35b1f1a9fdbf93266c91f297dc9060e https://conda.anaconda.org/conda-forge/linux-64/xorg-libsm-1.2.4-h7391055_0.conda#93ee23f12bc2e684548181256edd2cf6 -https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.4-h9c3ff4c_1.tar.bz2#21743a8d2ea0c8cfbbf8fe489b0347df +https://conda.anaconda.org/conda-forge/linux-64/zeromq-4.3.5-h59595ed_0.conda#8851084c192dbc56215ac4e3c9aa30fa https://conda.anaconda.org/conda-forge/linux-64/zlib-1.2.13-hd590300_5.conda#68c34ec6149623be41a1933ab996a209 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.5-hfc55251_0.conda#04b88013080254850d6c01ed54810589 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.32-h161b759_6.conda#26c909c7fc3fddc015a9ab4ebfcaed41 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.13.35-hd1885a1_4.conda#a0728c6591063bee78f037741d1da83b https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-h0f2a231_0.conda#009521b7ed97cca25f8f997f9e745976 https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.conda#39f910d205726805a958da408ca194ba https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb @@ -126,27 +126,25 @@ https://conda.anaconda.org/conda-forge/linux-64/gxx_impl_linux-64-12.3.0-he2b93b https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.2-h039dbb9_0.conda#611d6c83d1130ea60c916531adfb11db https://conda.anaconda.org/conda-forge/linux-64/libglib-2.78.0-hebfc3b9_0.conda#e618003da3547216310088478e475945 -https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.58.1-h30d5116_0.conda#56e42a3f59383f1cf4e454cfc57dd79e https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 https://conda.anaconda.org/conda-forge/linux-64/libthrift-0.19.0-hb90f79a_1.conda#8cdb7d41faa0260875ba92414c487e2d -https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-h29866fb_1.conda#4e9afd30f4ccb2f98645e51005f82236 +https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.37-h0054252_1.conda#f27960e8873abb5476e96ef33bdbdccd -https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.1-h0ab5242_5.conda#2f0f7031d8f0f9f6520093009eb3628f +https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.2-h0ab5242_0.conda#c6eafb51b60db59fd2132f6bbaada9b3 https://conda.anaconda.org/conda-forge/linux-64/nss-3.94-h1d7d5a4_0.conda#7caef74bbfa730e014b20f0852068509 https://conda.anaconda.org/conda-forge/linux-64/orc-1.9.0-h208142c_3.conda#f983ae19192439116ca5b5589560f167 https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.1.3-h32600fe_0.conda#8287aeb8462e2d4b235eff788e75919d https://conda.anaconda.org/conda-forge/linux-64/python-3.11.6-hab00c5b_0_cpython.conda#b0dfbe2fcbfdb097d321bfd50ecddab1 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.43.2-h2c6b66d_0.conda#c37b95bcd6c6833dacfd5df0ae2f4303 +https://conda.anaconda.org/conda-forge/linux-64/re2-2023.06.02-h2873b5e_0.conda#bb2d5e593ef13fe4aff0bc9440f945ae +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.0-h2c6b66d_0.conda#df56c636df4a98990462d66ac7be2330 https://conda.anaconda.org/conda-forge/linux-64/udunits2-2.2.28-h40f5838_3.conda#6bb8deb138f87c9d48320ac21b87e7a1 -https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.6-h8ee46fc_0.conda#7590b76c3d11d21caa44f3fc38ac584a +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.13-pyhd8ed1ab_0.conda#06006184e203b61d3525f90de394471e -https://conda.anaconda.org/conda-forge/linux-64/antlr-python-runtime-4.7.2-py311h38be061_1003.tar.bz2#0ab8f8f0cae99343907fe68cda11baea -https://conda.anaconda.org/conda-forge/linux-64/astroid-3.0.0-py311h38be061_1.conda#ddef045db01d69489c6d74b7e577859b +https://conda.anaconda.org/conda-forge/noarch/antlr-python-runtime-4.11.1-pyhd8ed1ab_0.tar.bz2#15109c4977d39ad7aa3423f57243e286 https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-hd4edc92_1.tar.bz2#6c72ec3e660a51736913ef6ea68c454b https://conda.anaconda.org/conda-forge/noarch/attrs-23.1.0-pyh71513ae_1.conda#3edfead7cedd1ab4400a6c588f3e75f8 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.2-hd6ebb48_1.conda#ef9692e74f437004ef47a4363552bcb6 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.13-hc690213_1.conda#c912831e92c565598072243266073161 -https://conda.anaconda.org/conda-forge/noarch/backcall-0.2.0-pyh9f0ad1d_0.tar.bz2#6006a6d08a3fa99268a2681c7fb55213 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.3.2-he4fbe49_4.conda#38da036c9d74d4d44f35e05474135f77 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.7.13-hbbfb9a7_7.conda#2c4c47d83a0e111799dda4059c88621d https://conda.anaconda.org/conda-forge/noarch/backports-1.0-pyhd8ed1ab_3.conda#54ca2e08b3220c148a1d8329c2678e02 https://conda.anaconda.org/conda-forge/linux-64/backports.zoneinfo-0.2.1-py311h38be061_8.conda#5384590f14dfe6ccd02811236afc9f8e https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f @@ -154,13 +152,13 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py311hb755f6 https://conda.anaconda.org/conda-forge/linux-64/c-compiler-1.6.0-hd590300_0.conda#ea6c792f792bdd7ae6e7e2dee32f0a48 https://conda.anaconda.org/conda-forge/noarch/certifi-2023.7.22-pyhd8ed1ab_0.conda#7f3dbc9179b4dde7da98dfb151d0ad22 https://conda.anaconda.org/conda-forge/noarch/cfgv-3.3.1-pyhd8ed1ab_0.tar.bz2#ebb5f5f7dc4f1a3780ef7ea7738db08c -https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.0-pyhd8ed1ab_0.conda#fef8ef5f0a54546b9efee39468229917 +https://conda.anaconda.org/conda-forge/noarch/charset-normalizer-3.3.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca -https://conda.anaconda.org/conda-forge/noarch/cloudpickle-2.2.1-pyhd8ed1ab_0.conda#b325bfc4cff7d7f8a868f1f7ecc4ed16 +https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.conda#753d29fe41bb881e4b9c004f0abf973f https://conda.anaconda.org/conda-forge/noarch/codespell-2.2.6-pyhd8ed1ab_0.conda#a206349b7bb7475ae580f987cb425bdd https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99 https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 -https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.3-py311hb755f60_0.conda#c54d71e8031a10d08f2e87ff81821588 +https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.5-py311hb755f60_0.conda#25b42509a68f96e612534af3fe2cf033 https://conda.anaconda.org/conda-forge/noarch/decorator-5.1.1-pyhd8ed1ab_0.tar.bz2#43afe5ab04e35e17ba28649471dd7364 https://conda.anaconda.org/conda-forge/noarch/defusedxml-0.7.1-pyhd8ed1ab_0.tar.bz2#961b3a227b437d82ad7054484cfa71b2 https://conda.anaconda.org/conda-forge/noarch/dill-0.3.7-pyhd8ed1ab_0.conda#5e4f3466526c52bc9af2d2353a1460bd @@ -170,12 +168,12 @@ https://conda.anaconda.org/conda-forge/noarch/dodgy-0.2.1-py_0.tar.bz2#62a69d073 https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.3-pyhd8ed1ab_0.conda#e6518222753f519e911e83136d2158d9 https://conda.anaconda.org/conda-forge/noarch/execnet-2.0.2-pyhd8ed1ab_0.conda#67de0d8241e1060a479e3c37793e26f9 -https://conda.anaconda.org/conda-forge/noarch/executing-1.2.0-pyhd8ed1ab_0.tar.bz2#4c1bc140e2be5c8ba6e3acab99e25c50 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.12.4-pyhd8ed1ab_0.conda#5173d4b8267a0699a43d73231e0b6596 +https://conda.anaconda.org/conda-forge/noarch/executing-2.0.1-pyhd8ed1ab_0.conda#e16be50e378d8a4533b989035b196ab8 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/linux-64/freexl-2.0.0-h743c826_0.conda#12e6988845706b2cfbc3bc35c9a61a95 -https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.9.2-pyh1a96a4e_0.conda#9d15cd3a0e944594ab528da37dc72ecc -https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h6c15284_3.conda#06f97c8b69157d91993af0c4f2e16bdc +https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.10.0-pyhca7485f_0.conda#5b86cf1ceaaa9be2ec4627377e538db1 +https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.10-h829c605_4.conda#252a696860674caf7a855e16f680d63a https://conda.anaconda.org/conda-forge/noarch/geographiclib-1.52-pyhd8ed1ab_0.tar.bz2#6880e7100ebae550a33ce26663316d85 https://conda.anaconda.org/conda-forge/linux-64/gfortran-12.3.0-h499e0f7_2.conda#0558a8c44eb7a18e6682bd3a8ae6dcab https://conda.anaconda.org/conda-forge/linux-64/gfortran_linux-64-12.3.0-h7fe76b4_2.conda#3a749210487c0358b6f135a648cbbf60 @@ -188,11 +186,13 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/noarch/itsdangerous-2.1.2-pyhd8ed1ab_0.tar.bz2#3c3de74912f11d2b590184f03c7cd09b https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f -https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-h7f713cb_2.conda#9ab79924a3760f85a799f21bc99bd655 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-18_linux64_openblas.conda#bcddbb497582ece559465b9cd11042e7 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.3.0-hca28451_0.conda#4ab41bee09a2d2e08de5f09d6f1eef62 +https://conda.anaconda.org/conda-forge/linux-64/lazy-object-proxy-1.9.0-py311h459d7ec_1.conda#7cc99d87755a9e64586a6004c5f0f534 +https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hb7c19ff_3.conda#e96637dd92c5f340215c753a5c9a22d7 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-19_linux64_openblas.conda#420f4e9be59d0dc9133a0f43f7bab3f3 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.4.0-hca28451_0.conda#1158ac1d2613b28685644931f11ee807 +https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.58.2-he06187c_0.conda#1eec35ecc7bd34e4ec2f2b4eccb8816e https://conda.anaconda.org/conda-forge/linux-64/libpq-16.0-hfc447b1_1.conda#e4a9a5ba40123477db33e02a78dffb01 -https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-hdffd6e0_0.conda#a8661c87c873d8c8f90479318ebf0a17 +https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda#0ebb65e8d86843865796c7c95a941f34 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/lxml-4.9.3-py311h1a07684_1.conda#aab51e50d994e58efdfa5382139b0468 https://conda.anaconda.org/conda-forge/linux-64/lz4-4.3.2-py311h38e4bf4_1.conda#f8e0b648d77bbe44d1fe8af8cc56a590 @@ -203,7 +203,7 @@ https://conda.anaconda.org/conda-forge/linux-64/msgpack-python-1.0.6-py311h9547e https://conda.anaconda.org/conda-forge/noarch/munch-4.0.0-pyhd8ed1ab_0.conda#376b32e8f9d3eacbd625f37d39bd507d https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda#4eccaeba205f0aed9ac3a9ea58568ca3 -https://conda.anaconda.org/conda-forge/noarch/networkx-3.1-pyhd8ed1ab_0.conda#254f787d5068bc89f578bf63893ce8b4 +https://conda.anaconda.org/conda-forge/noarch/networkx-3.2.1-pyhd8ed1ab_0.conda#425fce3b531bed6ec3c74fab3e5f0a1c https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 https://conda.anaconda.org/conda-forge/noarch/packaging-23.2-pyhd8ed1ab_0.conda#79002079284aa895f883c6b7f3f88fd6 https://conda.anaconda.org/conda-forge/noarch/pandocfilters-1.5.0-pyhd8ed1ab_0.tar.bz2#457c2c8c08e54905d6954e79cb5b5db9 @@ -228,13 +228,13 @@ https://conda.anaconda.org/conda-forge/noarch/python-tzdata-2023.3-pyhd8ed1ab_0. https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7ec_0.conda#60b5332b3989fda37884b92c7afd6a91 https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3.post1-pyhd8ed1ab_0.conda#c93346b446cd08c169d843ae5fc0da97 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a -https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.1-py311h75c88c4_1.conda#b858421f6a3052950c33aecd44a905cb -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.10.4-py311h46250e7_0.conda#fd2b9bb72eeb3d90187a6d77c46a228e +https://conda.anaconda.org/conda-forge/linux-64/pyzmq-25.1.1-py311h34ded2d_2.conda#ea365280db99687905b4d76cf6a3568c +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.10.6-py311h46250e7_0.conda#b7237977dbca779aaaab65f42f5558d9 https://conda.anaconda.org/conda-forge/noarch/semver-3.0.2-pyhd8ed1ab_0.conda#5efb3fccda53974aed800b6d575f72ed https://conda.anaconda.org/conda-forge/noarch/setoptconf-tmp-0.3.1-pyhd8ed1ab_0.tar.bz2#af3e36d4effb85b9b9f93cd1db0963df https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 -https://conda.anaconda.org/conda-forge/noarch/smmap-3.0.5-pyh44b312d_0.tar.bz2#3a8dc70789709aa315325d5df06fb7e4 +https://conda.anaconda.org/conda-forge/noarch/smmap-5.0.0-pyhd8ed1ab_0.tar.bz2#62f26a3d1387acee31322208f0cfa3e0 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e https://conda.anaconda.org/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_0.tar.bz2#6d6552722448103793743dabfbda532d https://conda.anaconda.org/conda-forge/noarch/soupsieve-2.5-pyhd8ed1ab_1.conda#3f144b2c34f8cb5a9abd9ed23a39c561 @@ -247,29 +247,31 @@ https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5 https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.1-pyha770c72_0.conda#62f5b331c53d73e2f6c4c130b53518a0 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.0-pyhd8ed1ab_0.tar.bz2#92facfec94bc02d6ccf42e7173831a36 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.3.3-py311h459d7ec_1.conda#a700fcb5cedd3e72d0c75d095c7a6eda -https://conda.anaconda.org/conda-forge/noarch/traitlets-5.11.2-pyhd8ed1ab_0.conda#bd3f90f7551e1cffb1f402880eb2cef1 +https://conda.anaconda.org/conda-forge/noarch/traitlets-5.13.0-pyhd8ed1ab_0.conda#8a9953c15e1e5a7c1baddbbf4511a567 https://conda.anaconda.org/conda-forge/noarch/types-pyyaml-6.0.12.12-pyhd8ed1ab_0.conda#0cb14c80f66937df894d60626dd1921f https://conda.anaconda.org/conda-forge/noarch/typing_extensions-4.8.0-pyha770c72_0.conda#5b1be40a26d10a06f6d4f1f9e19fa0c7 https://conda.anaconda.org/conda-forge/linux-64/ujson-5.8.0-py311hb755f60_0.conda#91e67c62c48444e4efc08fb61835abe8 https://conda.anaconda.org/conda-forge/noarch/untokenize-0.1.1-py_0.tar.bz2#1447ead40f2a01733a9c8dfc32988375 https://conda.anaconda.org/conda-forge/noarch/webencodings-0.5.1-pyhd8ed1ab_2.conda#daf5160ff9cde3a468556965329085b9 https://conda.anaconda.org/conda-forge/noarch/webob-1.8.7-pyhd8ed1ab_0.tar.bz2#a8192f3585f341ea66c60c189580ac67 -https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.2-pyhd8ed1ab_0.conda#1ccd092478b3e0ee10d7a891adbf8a4f +https://conda.anaconda.org/conda-forge/noarch/wheel-0.41.3-pyhd8ed1ab_0.conda#3fc026b9c87d091c4b34a6c997324ae8 +https://conda.anaconda.org/conda-forge/linux-64/wrapt-1.15.0-py311h459d7ec_1.conda#f4d770a09066aaa313b5cc22c0f6e9d1 https://conda.anaconda.org/conda-forge/linux-64/xorg-libxext-1.3.4-h0b41bf4_2.conda#82b6df12252e6f32402b96dacc656fec https://conda.anaconda.org/conda-forge/linux-64/xorg-libxrender-0.9.11-hd590300_0.conda#ed67c36f215b310412b2af935bf3e530 -https://conda.anaconda.org/conda-forge/noarch/xyzservices-2023.10.0-pyhd8ed1ab_0.conda#9c6fe7db9c9133ade38b9a5011103243 +https://conda.anaconda.org/conda-forge/noarch/xyzservices-2023.10.1-pyhd8ed1ab_0.conda#1e0d85c0e2fef9539218da185b285f54 https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30c2c15b82aacb07f9c09e28ff2275 https://conda.anaconda.org/conda-forge/noarch/zipp-3.17.0-pyhd8ed1ab_0.conda#2e4d6bc0b14e10f895fc6791a7d9b26a https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.4-pyhd8ed1ab_0.conda#46a2e6e3dfa718ce3492018d5a110dd6 https://conda.anaconda.org/conda-forge/noarch/asgiref-3.7.2-pyhd8ed1ab_0.conda#596932155bf88bb6837141550cb721b0 -https://conda.anaconda.org/conda-forge/noarch/asttokens-2.4.0-pyhd8ed1ab_0.conda#056f04e51dd63337e8d7c425c18c86f1 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.4-hc8144f4_1.conda#81b00630260ff8c9388ee3913465b208 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.9.6-h32970c0_2.conda#21dd1cb1e73b0ce2ea31e9f9f692e051 -https://conda.anaconda.org/conda-forge/noarch/babel-2.13.0-pyhd8ed1ab_0.conda#22541af7a9eb59fc6afcadb7ecdf9219 +https://conda.anaconda.org/conda-forge/linux-64/astroid-2.15.8-py311h38be061_0.conda#46d70fcb74472aab178991f0231ee3c6 +https://conda.anaconda.org/conda-forge/noarch/asttokens-2.4.1-pyhd8ed1ab_0.conda#5f25798dcefd8252ce5f9dc494d5f571 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.5-h1a24852_0.conda#02305820d0dbfe542c6e4d67ddb0f13b +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.9.8-h31a96f8_0.conda#cf4834799534b9fcb7bca1c136bcd7a9 +https://conda.anaconda.org/conda-forge/noarch/babel-2.13.1-pyhd8ed1ab_0.conda#3ccff479c246692468f604df9c85ef26 https://conda.anaconda.org/conda-forge/noarch/backports.functools_lru_cache-1.6.5-pyhd8ed1ab_0.conda#6b1b907661838a75d067a22f87996b2e https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0.conda#a362ff7d976217f8fa78c0f1c4f59717 https://conda.anaconda.org/conda-forge/noarch/bleach-6.1.0-pyhd8ed1ab_0.conda#0ed9d7c0e9afa7c025807a9a8136ea3e -https://conda.anaconda.org/conda-forge/linux-64/cairo-1.16.0-h0c91306_1017.conda#3db543896d34fc6804ddfb9239dcb125 +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e https://conda.anaconda.org/conda-forge/noarch/cattrs-23.1.2-pyhd8ed1ab_0.conda#e554f60477143949704bf470f66a81e7 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.3.0-hbdc6101_0.conda#797554b8b7603011e8677884381fbcc5 @@ -283,7 +285,7 @@ https://conda.anaconda.org/conda-forge/noarch/fire-0.5.0-pyhd8ed1ab_0.conda#9fd2 https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.43.1-py311h459d7ec_0.conda#ac995b680de3bdce2531c553b27dfe7e https://conda.anaconda.org/conda-forge/linux-64/fortran-compiler-1.6.0-heb67821_0.conda#b65c49dda97ae497abcbdf3a8ba0018f https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.0-pyhd8ed1ab_0.conda#90faaa7eaeba3cc877074c0916efe30c -https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.10-pyhd8ed1ab_0.conda#3706d2f3d7cb5dae600c833345a76132 +https://conda.anaconda.org/conda-forge/noarch/gitdb-4.0.11-pyhd8ed1ab_0.conda#623b19f616f2ca0c261441067e18ae40 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.0-pyhd8ed1ab_0.conda#48b0d98e0c0ec810d3ccc2a0926c8c0e @@ -293,40 +295,39 @@ https://conda.anaconda.org/conda-forge/noarch/jedi-0.19.1-pyhd8ed1ab_0.conda#81a https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.2.2-pyhd8ed1ab_0.tar.bz2#243f63592c8e449f40cd42eb5cf32f40 https://conda.anaconda.org/conda-forge/noarch/latexcodec-2.0.1-pyh9f0ad1d_0.tar.bz2#8d67904973263afd2985ba56aa2d6bb4 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-18_linux64_openblas.conda#93dd9ab275ad888ed8113953769af78c -https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-he9388d3_8.conda#f3abc6e6ab60fa404c23094f5a03ec9b +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-19_linux64_openblas.conda#d12374af44575413fbbd4a217d46ea33 +https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.12.0-h19a6dae_3.conda#cb26f6b7184480053106ea4713a52daf -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-18_linux64_openblas.conda#a1244707531e5b143c420c70573c8ec5 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-19_linux64_openblas.conda#9f100edf65436e3eabc2a51fc00b2c37 https://conda.anaconda.org/conda-forge/noarch/logilab-common-1.7.3-py_0.tar.bz2#6eafcdf39a7eb90b6d951cfff59e8d3b https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.6-pyhd8ed1ab_0.tar.bz2#b21613793fcc81d944c76c9f2864a7de -https://conda.anaconda.org/conda-forge/linux-64/mypy-1.6.0-py311h459d7ec_0.conda#bf8a68aae89d5ff65e9006f586fefffe +https://conda.anaconda.org/conda-forge/linux-64/mypy-1.6.1-py311h459d7ec_0.conda#d3e5072b7ff746e9f9b44f0f52de6727 https://conda.anaconda.org/conda-forge/noarch/nested-lookup-0.2.25-pyhd8ed1ab_1.tar.bz2#2f59daeb14581d41b1e2dda0895933b2 https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/noarch/pexpect-4.8.0-pyh1a96a4e_2.tar.bz2#330448ce4403cc74990ac07c555942a1 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.0.1-py311h8aef010_1.conda#4d66ee2081a7cd444ff6f30d95873eef -https://conda.anaconda.org/conda-forge/noarch/pip-23.2.1-pyhd8ed1ab_0.conda#e2783aa3f9235225eec92f9081c5b801 +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.1.0-py311ha6c5da5_0.conda#83a988daf5c49e57f7d2086fb6781fe8 +https://conda.anaconda.org/conda-forge/noarch/pip-23.3.1-pyhd8ed1ab_0.conda#2400c0b86889f43aa52067161e1fb108 https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.0-h8972f4a_1.conda#6ce1ab5480d3aa4308654971ac5f731b -https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_1.conda#900fd11ac61d4415d515583fcb570207 +https://conda.anaconda.org/conda-forge/linux-64/proj-9.3.0-h1d62c97_2.conda#b5e57a0c643da391bef850922963eece https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda#7e23a61a7fbaedfef6eb0e1ac775c8e5 -https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.2-pyhd8ed1ab_0.conda#6dd662ff5ac9a783e5c940ce9f3fe649 +https://conda.anaconda.org/conda-forge/noarch/pytest-7.4.3-pyhd8ed1ab_0.conda#5bdca0aca30b0ee62bb84854e027eae0 https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.8.2-pyhd8ed1ab_0.tar.bz2#dd999d1cc9f79e67dbb855c8924c7984 https://conda.anaconda.org/conda-forge/noarch/referencing-0.30.2-pyhd8ed1ab_0.conda#a33161b983172ba6ef69d5fc850650cd -https://conda.anaconda.org/conda-forge/noarch/requirements-detector-1.2.2-pyhd8ed1ab_0.conda#6626918380d99292df110f3c91b6e5ec https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.2.1-pyhd8ed1ab_0.tar.bz2#7234c9eefff659501cd2fe0d2ede4d48 https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.8.0-hd8ed1ab_0.conda#384462e63262a527bda564fa2d9126c0 https://conda.anaconda.org/conda-forge/noarch/url-normalize-1.4.3-pyhd8ed1ab_0.tar.bz2#7c4076e494f0efe76705154ac9302ba6 -https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.6-pyhd8ed1ab_0.conda#d5f8944ff9ab24a292511c83dce33dea +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.0.7-pyhd8ed1ab_0.conda#270e71c14d37074b1d066ee21cf0c4a6 https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.4-hac6953d_3.conda#297e6a75dc1b6a440cd341a85eab8a00 https://conda.anaconda.org/conda-forge/noarch/yamale-4.0.4-pyh6c4a22f_0.tar.bz2#cc9f59f147740d88679bf1bd94dbe588 https://conda.anaconda.org/conda-forge/noarch/yamllint-1.32.0-pyhd8ed1ab_0.conda#6d2425548b0293a225ca4febd80feaa3 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.17-hb5e3142_3.conda#f0eeadc3f7fc9a29b7ce416897056826 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.3.20-he249171_1.conda#e7b72928833ea245d8bfb89a35ae7d5e https://conda.anaconda.org/conda-forge/linux-64/compilers-1.6.0-ha770c72_0.conda#e2259de4640a51a28c21931ae98e4975 -https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.4-py311h63ff55d_0.conda#2b14cd05541532521196b0d2e0291ecf -https://conda.anaconda.org/conda-forge/noarch/django-4.2.6-pyhd8ed1ab_0.conda#bebc7fbd0b86a4e28a931c306cd5324e +https://conda.anaconda.org/conda-forge/linux-64/cryptography-41.0.5-py311h63ff55d_0.conda#22584e5c97ed8f1a6b63a0ff43dba827 +https://conda.anaconda.org/conda-forge/noarch/django-4.2.7-pyhd8ed1ab_0.conda#107fbbd296283091c717acd51a3a87fd https://conda.anaconda.org/conda-forge/noarch/flake8-5.0.4-pyhd8ed1ab_0.tar.bz2#8079ea7dec0a917dd0cb6c257f7ea9ea -https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.1-hee599c5_13.conda#8c55dacddd589be64b2bd6a5d4264be6 -https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.37-pyhd8ed1ab_0.conda#8b94c329190fa6814f412adf2ab0f0a2 +https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.1-hf074850_14.conda#1d53ee057d8481bd2b4c2c34c8e92aac +https://conda.anaconda.org/conda-forge/noarch/gitpython-3.1.40-pyhd8ed1ab_0.conda#6bf74c3b7c13079a91d4bd3da51cefcf https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.2.1-h3d44ed6_0.conda#98db5f8813f45e2b29766aff0e4a499c https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-6.8.0-hd8ed1ab_0.conda#b279b07ce18058034e5b3606ba103a8b https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.7.1-pyhd8ed1ab_0.conda#7c27ea1bdbe520bb830dcadd59f55cbf @@ -335,91 +336,92 @@ https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h80fb2b6_1 https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h090f1da_0.conda#c4360eaa543bb3bcbb9cd135eb6fb0fc https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.0-py311h64a7726_0.conda#bf16a9f625126e378302f08e7ed67517 https://conda.anaconda.org/conda-forge/noarch/platformdirs-3.11.0-pyhd8ed1ab_0.conda#8f567c0a74aa44cf732f15773b4083b0 -https://conda.anaconda.org/conda-forge/linux-64/poppler-23.08.0-hf2349cb_2.conda#fb75401ae7e2e3f354dff72e9da95cae +https://conda.anaconda.org/conda-forge/linux-64/poppler-23.10.0-h590f24d_0.conda#06b4a80e2cc3974e55f83e2115e2e90a https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2#2099b86a7399c44c0c61cdb6de6915ba -https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311h1facc83_2.conda#8298afb85a731b02dac82e02b6e13ae0 +https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py311h1facc83_3.conda#fee8c3c4404e37e724f08c2983eb484c https://conda.anaconda.org/conda-forge/noarch/pytest-cov-4.1.0-pyhd8ed1ab_0.conda#06eb685a3a0b146347a58dda979485da -https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.0.1-pyhd8ed1ab_0.conda#9da651d84c73bac482cae51613a4d4d6 +https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.1-pyhd8ed1ab_0.conda#0a4d7e888fae7b7d75243414b15d0c50 https://conda.anaconda.org/conda-forge/noarch/pytest-metadata-3.0.0-pyhd8ed1ab_1.conda#8bdcc0f401561213821bf67513abeeff -https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.11.1-pyhd8ed1ab_0.conda#fcd2531bc3e492657aeb042349aeaf8a +https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.12.0-pyhd8ed1ab_0.conda#ac9fedc9a0c397f2318e82525491dd83 https://conda.anaconda.org/conda-forge/noarch/pytest-mypy-0.8.0-pyhd8ed1ab_0.tar.bz2#4e81c96e5f875c09e5b9f999035b9d8e https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.3.1-pyhd8ed1ab_0.conda#816073bb54ef59f33f0f26c14f88311b https://conda.anaconda.org/conda-forge/noarch/rdflib-7.0.0-pyhd8ed1ab_0.conda#44d14ef95495b3d4438f28998e0296a9 https://conda.anaconda.org/conda-forge/noarch/requests-2.31.0-pyhd8ed1ab_0.conda#a30144e4156cdbb236f99ebb49828f8b +https://conda.anaconda.org/conda-forge/noarch/requirements-detector-1.2.2-pyhd8ed1ab_0.conda#6626918380d99292df110f3c91b6e5ec https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.16.3-h8c794c1_3.conda#7de728789b0aba16018f726dc5ddbec2 -https://conda.anaconda.org/conda-forge/noarch/types-requests-2.31.0.8-pyhd8ed1ab_0.conda#f6126ba51bdb5c539af53cbdc37fe7a8 +https://conda.anaconda.org/conda-forge/noarch/types-requests-2.31.0.10-pyhd8ed1ab_0.conda#84dca7318667fa091bbfd8724d22ea99 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.conda#586da7df03b68640de14dc3e8bcbf76f -https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.8-pyhd8ed1ab_0.conda#367386d2575a0e62412448eda1012efd -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.24.2-h94c364a_0.conda#98d1e593cdf87647e51f9d54c7d5ef7a -https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.2-py311h1f0f07a_2.conda#571c0c47e8dbcf03577935ac818b6696 +https://conda.anaconda.org/conda-forge/noarch/wcwidth-0.2.9-pyhd8ed1ab_0.conda#8e8280dec091763dfdc29e066de52270 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.24.4-h28e6ea9_2.conda#12fcf00d22c16ae8663d2f0fe0068d0e +https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3 https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.1.1-py311h9547e67_1.conda#52d3de443952d33c5cee6b24b172ce96 -https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.9.3-pyhd8ed1ab_0.conda#a7155483171dbc27a7385d1c26e779de +https://conda.anaconda.org/conda-forge/noarch/dask-core-2023.10.1-pyhd8ed1ab_0.conda#cf1f26a9e21311f10cfe9dbf0e0d99bc https://conda.anaconda.org/conda-forge/noarch/flake8-polyfill-1.0.2-py_0.tar.bz2#a53db35e3d07f0af2eccd59c2a00bffe -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.30-pyhd8ed1ab_0.conda#b7a2e3bb89bda8c69839485c20aabadf -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.19.1-pyhd8ed1ab_0.conda#78aff5d2af74e6537c1ca73017f01f4f -https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.4.0-py311h38be061_0.conda#eb4ab2a92a2cc9715226382abb8ebaee -https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.7.2-h6238fc3_5.conda#2fef4283b2bb45a66f8b81099d36721e +https://conda.anaconda.org/conda-forge/noarch/identify-2.5.31-pyhd8ed1ab_0.conda#fea10604a45e974b110ea15a88913ebc +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.19.2-pyhd8ed1ab_0.conda#24d41c2f9cc199d0a180ecf7ef54739c +https://conda.anaconda.org/conda-forge/linux-64/jupyter_core-5.5.0-py311h38be061_0.conda#cee83be29258275f75029125e186ab6d +https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.7.2-h6f3d308_7.conda#f9555eada0412c9f3dd4b34f5afecf5b https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_hacb5139_102.conda#487a1c19dd3eacfd055ad614e9acde87 -https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.1-py311h320fe9a_1.conda#a4371a95a8ae703a22949af28467b93d +https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.2-py311h320fe9a_0.conda#c36a53056129665b34db419b6af3d230 https://conda.anaconda.org/conda-forge/linux-64/pango-1.50.14-ha41ecd1_2.conda#1a66c10f6a0da3dbd2f3a68127e7f6a0 -https://conda.anaconda.org/conda-forge/noarch/pooch-1.7.0-pyhd8ed1ab_4.conda#3cdaf7af08850933662b1e228bc6b5bc +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.0-pyhd8ed1ab_0.conda#134b2b57b7865d2316a7cce1915a51ed https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.39-pyha770c72_0.conda#a4986c6bb5b0d05a38855b0880a5f425 -https://conda.anaconda.org/conda-forge/noarch/pylint-3.0.1-pyhd8ed1ab_0.conda#c4c66338865d295a213e8c1e473a072f -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.2.0-pyhd8ed1ab_1.conda#34f7d568bf59d18e3fef8c405cbece21 +https://conda.anaconda.org/conda-forge/noarch/pylint-2.17.7-pyhd8ed1ab_0.conda#3cab6aee60038b3f621bce3e50f52bed +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-23.3.0-pyhd8ed1ab_0.conda#7819533e674dbbc51468f3228b9b1bb6 https://conda.anaconda.org/conda-forge/noarch/pytest-html-3.2.0-pyhd8ed1ab_1.tar.bz2#d5c7a941dfbceaab4b172a56d7918eb0 https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.1.0-pyhd8ed1ab_0.conda#57b89064c125bb9d0e533e018c3eb17a https://conda.anaconda.org/conda-forge/linux-64/scipy-1.11.3-py311h64a7726_1.conda#e4b4d3b764e2d029477d0db88248a8b5 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.1-py311he06c224_3.conda#0494ca2b1c365390d014b1295d79e9a3 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.24.4-pyhd8ed1ab_0.conda#c3feaf947264a59a125e8c26e98c3c5a +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.2-py311he06c224_0.conda#c90e2469d7512f3bba893533a82d7a02 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.24.6-pyhd8ed1ab_0.conda#fb1fc875719e217ed799a7aae11d3be4 https://conda.anaconda.org/conda-forge/noarch/yapf-0.40.1-pyhd8ed1ab_0.conda#f269942e802d5e148632143d4c37acc9 -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.156-h314d761_4.conda#5e41eee446cb42a53090c2c46922f4dd -https://conda.anaconda.org/conda-forge/noarch/bokeh-3.2.2-pyhd8ed1ab_0.conda#30488151f591379db656250b3f5fc0c6 -https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_0.conda#43a71a823583d75308eaf3a06c8f150b -https://conda.anaconda.org/conda-forge/noarch/distributed-2023.9.3-pyhd8ed1ab_0.conda#543fafdd7b325bf16199235ee5f20622 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.182-hb97d603_2.conda#4b28dbada9459f1d89c77939b9284388 +https://conda.anaconda.org/conda-forge/noarch/bokeh-3.3.0-pyhd8ed1ab_0.conda#5d6ff9d18f0b611a7dc131f4a7444c2e +https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b +https://conda.anaconda.org/conda-forge/noarch/distributed-2023.10.1-pyhd8ed1ab_0.conda#9fc9e3eacf6e23f902408d38198880de https://conda.anaconda.org/conda-forge/linux-64/esmf-8.4.2-nompi_h9e768e6_3.conda#c330e87e698bae8e7381c0315cf25dd0 -https://conda.anaconda.org/conda-forge/linux-64/gdal-3.7.2-py311h815a124_5.conda#84a14fd830b72b09ef886a23de557a16 +https://conda.anaconda.org/conda-forge/linux-64/gdal-3.7.2-py311h815a124_7.conda#e68c90c9490e1621ff4a7871849f03b2 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 -https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.3.1-pyhd8ed1ab_0.conda#b7cc0981484fcb6390e6d341e55618b3 +https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.5.0-pyhd8ed1ab_0.conda#77e442cb7c382d01c916f91a8652811a https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-h98fae49_0.conda#620e754f4344f4c27259ff460a2b9c50 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.0-py311h54ef318_1.conda#20d79e2fe53b49b399f3d36977b05abb +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.1-py311h54ef318_0.conda#201fdabdb86bb8fb6e99fa3f0dab8122 https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.0-pyhd8ed1ab_2.tar.bz2#363b0816e411feb0df925d4f224f026a https://conda.anaconda.org/conda-forge/noarch/nbformat-5.9.2-pyhd8ed1ab_0.conda#61ba076de6530d9301a0053b02f093d2 -https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.4-nompi_py311he8ad708_103.conda#97b45ba4ff4e46a07dd6c60040256538 +https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311he8ad708_100.conda#597b1ad6cb7011b7561c20ea30295cae https://conda.anaconda.org/conda-forge/noarch/pep8-naming-0.10.0-pyh9f0ad1d_0.tar.bz2#b3c5536e4f9f58a4b16adb6f1e11732d -https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.4.0-pyha770c72_2.conda#09cd3006f61e7a7054405f81362e0a5f +https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.5.0-pyha770c72_0.conda#964e3d762e427661c59263435a14c492 https://conda.anaconda.org/conda-forge/noarch/prompt_toolkit-3.0.39-hd8ed1ab_0.conda#4bbbe67d5df19db30f04b8e344dc9976 https://conda.anaconda.org/conda-forge/noarch/pylint-plugin-utils-0.7-pyhd8ed1ab_0.tar.bz2#1657976383aee04dbb3ae3bdf654bb58 https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py311h1f0f07a_1.conda#cd36a89a048ad2bcc6d8b43f648fb1d0 -https://conda.anaconda.org/conda-forge/noarch/xarray-2023.8.0-pyhd8ed1ab_0.conda#a8104cede521616573e228c27f9edc97 -https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_0.conda#1271b2375735e2aaa6d6770dbe2ad087 +https://conda.anaconda.org/conda-forge/noarch/xarray-2023.10.1-pyhd8ed1ab_0.conda#9b20e5d68eea6878a0a6fc57a3043889 +https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.conda#10d1806e20da040c58c36deddf51c70c https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.8.4-pyhd8ed1ab_0.conda#18472f8f9452f962fe0bcb1b8134b494 https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.8.2-pyhd8ed1ab_0.conda#cc344a296a41369bcb05f7216661cec8 https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyh1a96a4e_2.tar.bz2#64068564a9c2932bf30e9b4ec567927d https://conda.anaconda.org/conda-forge/noarch/esmpy-8.4.2-pyhc1e730c_4.conda#ddcf387719b2e44df0cc4dd467643951 -https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.4-py311hbac4ec9_0.conda#1d3445f5f7fa002a1c149c405376f012 +https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.5-py311hbac4ec9_0.conda#786d3808394b1bdfd3f41f2e2c67279e https://conda.anaconda.org/conda-forge/linux-64/graphviz-8.1.0-h28d9a01_0.conda#33628e0e3de7afd2c8172f76439894cb -https://conda.anaconda.org/conda-forge/noarch/ipython-8.16.1-pyh0d859eb_0.conda#7e52cb0dbf01b90365bfe433ec8bd3c0 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-13.0.0-h75f0d2f_8_cpu.conda#ddd12e48bae5a9b5a5da4debadc00f58 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.17.2-pyh41d4057_0.conda#f39d0b60e268fe547f1367edbab457d4 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-13.0.0-hecbb4c5_13_cpu.conda#71172fd3f165406793843c3211248169 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.8.0-pyhd8ed1ab_0.conda#e78da91cf428faaf05701ce8cc8f2f9b https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 https://conda.anaconda.org/conda-forge/noarch/pylint-celery-0.3-py_1.tar.bz2#e29456a611a62d3f26105a2f9c68f759 https://conda.anaconda.org/conda-forge/noarch/pylint-django-2.5.3-pyhd8ed1ab_0.tar.bz2#00d8853fb1f87195722ea6a582cc9b56 https://conda.anaconda.org/conda-forge/noarch/pylint-flask-0.6-py_0.tar.bz2#5a9afd3d0a61b08d59eed70fab859c1b https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.9.2-pyhd8ed1ab_0.conda#01e4314c780ca73759c694ce3ece281f -https://conda.anaconda.org/conda-forge/noarch/prospector-1.10.2-pyhd8ed1ab_0.conda#2c536985982f7e531df8d640f554008a -https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.6.4-pyhd8ed1ab_0.conda#a30ffe78645b5777aa21d3e0f2d2a015 -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-13.0.0-py311h39c9aba_8_cpu.conda#e98686af1af8faa05601af03a7d8bdd5 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.10.0-pyhd8ed1ab_0.conda#56c421c936a17bbc7fd4b36c9bd3b236 +https://conda.anaconda.org/conda-forge/noarch/prospector-1.10.3-pyhd8ed1ab_0.conda#f551d4d859a1d70c6abff8310a655481 +https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.6.5-pyhd8ed1ab_0.conda#28c3e17587c80297c4d9b1bc4cbba917 +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-13.0.0-py311h39c9aba_13_cpu.conda#9b9c895aa2414d8c27e2e7818d13bef7 https://conda.anaconda.org/conda-forge/linux-64/pydot-1.4.2-py311h38be061_4.conda#5c223cb0d9c05552bf9d1586a92720b2 -https://conda.anaconda.org/conda-forge/noarch/dask-2023.9.3-pyhd8ed1ab_0.conda#5b32dc4eb1f5e3097cc33fb0e331b3a4 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.9.2-pyhd8ed1ab_0.conda#1ad46253f2eb46fb8c9b2c22b7ca012f +https://conda.anaconda.org/conda-forge/noarch/dask-2023.10.1-pyhd8ed1ab_0.conda#5b5af2efa7659441a9967734d046fecf +https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.10.0-pyhd8ed1ab_0.conda#2307d9331078c3097631ac2129d4f3cf https://conda.anaconda.org/conda-forge/noarch/prov-2.0.0-pyhd3deb0d_0.tar.bz2#aa9b3ad140f6c0668c646f32e20ccf82 https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.8.0-pyhd8ed1ab_0.conda#56e85460d22fa7d4fb06300f785dd1e1 -https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.9.2-pyhd8ed1ab_0.conda#16ccaddfcfa0a1a606a9ecf6a52d6c11 +https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.10.0-pyhd8ed1ab_0.conda#800568b9c39cfd87a2a6a9a0488ea265 https://conda.anaconda.org/conda-forge/noarch/autodocsumm-0.2.6-pyhd8ed1ab_0.tar.bz2#4409dd7e06a62c3b2aa9e96782c49c6d https://conda.anaconda.org/conda-forge/noarch/nbsphinx-0.9.3-pyhd8ed1ab_0.conda#0dbaa7d08d3d79b2a1a4dd6a02cc4581 -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.14.1-pyhd8ed1ab_0.conda#78153addf629c51fab775ef360012ca3 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.14.3-pyhd8ed1ab_0.conda#3a52e29fde69705040bcbe74cbdcbd5c https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.7-pyhd8ed1ab_0.conda#aebfabcb60c33a89c1f9290cab49bc93 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.5-pyhd8ed1ab_0.conda#ebf08f5184d8eaa486697bc060031953 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.4-pyhd8ed1ab_0.conda#a9a89000dfd19656ad004b937eeb6828 diff --git a/doc/changelog.rst b/doc/changelog.rst index b8718686c7..daa5dae664 100644 --- a/doc/changelog.rst +++ b/doc/changelog.rst @@ -3,6 +3,144 @@ Changelog ========= +.. _changelog-v2-10-0: + +v2.10.0 +------- +Highlights + +TODO: add highlights + +This release includes + +Backwards incompatible changes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Remove the deprecated option ``use_legacy_supplementaries`` (`#2202 `__) `Bouwe Andela `__ + + - The recommended upgrade procedure is to remove ``use_legacy_supplementaries`` from config-user.yml + (if it was there) and remove any mention of ``fx_variables`` from the recipe. If automatically defining + the required supplementary variables does not work, define them in the variable or + (``additional_``) ``datasets`` section as described in :ref:`supplementary_variables`. + +- Use smarter (units-aware) weights (`#2139 `__) `Manuel Schlund `__ + + - Some preprocessors handle units better. For details, see the pull request. + +- Removed deprecated configuration option ``offline`` (`#2213 `__) `Manuel Schlund `__ + + - In :ref:`changelog-v2-8-0`, we replaced the old ``offline`` configuration option. From this version on, it stops working. + Please refer to :ref:`changelog-v2-8-0` for upgrade instructions. + +- Fix issue with CORDEX datasets requiring different dataset tags for downloads and fixes (`#2066 `__) `Joakim Löw `__ + + - Due to the different facets for CORDEX datasets, there was an inconsistency in the fixing mechanism. + This change requires changes to existing recipes that use CORDEX datasets. Please refer to the pull request for detailed update instructions. + +- Added new operators for statistics preprocessor (e.g., ``'percentile'``) and allowed passing additional arguments (`#2191 `__) `Manuel Schlund `__ + + - This harmonizes the operators for all statistics preprocessors. From this version, the new names can be used; the old arguments will stop working from + version 2.12.0. Please refer to :ref:`stat_preprocs` for a detailed description. + +- For the following changes, no user change is necessary + + - Remove deprecated way of calling :func:`~esmvalcore.cmor.table.read_cmor_tables` (`#2201 `__) `Bouwe Andela `__ + + - Remove deprecated callback argument from preprocessor ``load`` function (`#2207 `__) `Bouwe Andela `__ + + - Remove deprecated preprocessor function `cleanup` (`#2215 `__) `Bouwe Andela `__ + + +Deprecations +~~~~~~~~~~~~ + +- Clearly separate fixes and CMOR checks (`#2157 `__) `Manuel Schlund `__ + +Bug fixes +~~~~~~~~~ + +- Re-add correctly region-extracted cell measures and ancillary variables after :ref:`extract_region` (`#2166 `__) `Valeriu Predoi `__, `Manuel Schlund `__ +- Fix sorting of datasets + + - Fix sorting of ensemble members in :func:`~esmvalcore.dataset.datasets_to_recipe` (`#2095 `__) `Bouwe Andela `__ + - Fix a problem with sorting datasets that have a mix of facet types (`#2238 `__) `Bouwe Andela `__ + - Avoid a crash if dataset has supplementary variables (`#2198 `__) `Bouwe Andela `__ + +CMOR standard +~~~~~~~~~~~~~ + +- ERA5 on-the-fly CMORizer: changed sign of variables ``evspsbl`` and ``evspsblpot`` (`#2115 `__) `katjaweigel `__ +- Add ``ch4`` surface custom cmor table entry (`#2168 `__) `Birgit Hassler `__ +- Add CMIP3 institutes names used at NCI (`#2152 `__) `Romain Beucher `__ +- Added :func:`~esmvalcore.cmor.fixes.get_time_bounds` and :func:`~esmvalcore.cmor.fixes.get_next_month` to public API (`#2214 `__) `Manuel Schlund `__ +- Improve concatenation checks + + - Relax concatenation checks for ``--check_level=relax`` and ``--check_level=ignore`` (`#2144 `__) `sloosvel `__ + - Fix ``concatenate`` preprocessor function (`#2240 `__) `Bouwe Andela `__ + - Fix time overlap handling in concatenation (`#2247 `__) `Klaus Zimmermann `__ + +Computational performance improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Make :ref:`threshold_masking` preprocessors lazy (`#2169 `__) `Jörg Benke `__ + + - Restored usage of numpy in `_mask_with_shp` (`#2209 `__) `Jörg Benke `__ +- Call coord.core_bounds() instead of coord.bounds in ``check.py`` (`#2146 `__) `sloosvel `__ +- Rechunk between preprocessor steps (`#2205 `__) `Bouwe Andela `__ +- Reduce the size of the dask graph created by the ``anomalies`` preprocessor function (`#2200 `__) `Bouwe Andela `__ + +Documentation +~~~~~~~~~~~~~ + +- Add reference to release v2.9.0 in the changelog (`#2130 `__) `Rémi Kazeroni `__ +- Add merge instructions to release instructions (`#2131 `__) `Klaus Zimmermann `__ +- Update `mamba` before building environment during Readthedocs build (`#2149 `__) `Valeriu Predoi `__ +- Ensure compatible zstandard and zstd versions for .conda support (`#2204 `__) `Klaus Zimmermann `__ +- Remove outdated documentation (`#2210 `__) `Bouwe Andela `__ +- Remove meercode badge from README because their API is broken (`#2224 `__) `Valeriu Predoi `__ +- Correct usage help text of version command (`#2232 `__) `James Frost `__ +- Add ``navigation_with_keys: False`` to ``html_theme_options`` in Readthedocs ``conf.py`` (`#2245 `__) `Valeriu Predoi `__ +- Replace squarey badge with roundy shield for Anaconda sticker in README (`#2233 `__) `Valeriu Predoi `__ + +Fixes for datasets +~~~~~~~~~~~~~~~~~~ + +- Updated doc about fixes and added type hints to fix functions (`#2160 `__) `Manuel Schlund `__ + +Installation +~~~~~~~~~~~~ + +- Clean-up how pins are written in conda environment file (`#2125 `__) `Valeriu Predoi `__ +- Use importlib.metadata instead of deprecated pkg_resources (`#2096 `__) `Bouwe Andela `__ +- Pin shapely to >=2.0 (`#2075 `__) `Valeriu Predoi `__ + +Preprocessor +~~~~~~~~~~~~ + +- Improve preprocessor output sorting code (`#2111 `__) `Bouwe Andela `__ +- Preprocess datasets in the same order as they are listed in the recipe (`#2103 `__) `Bouwe Andela `__ + +Automatic testing +~~~~~~~~~~~~~~~~~ + +- [Github Actions] Compress all bash shell setters into one default option per workflow (`#2126 `__) `Valeriu Predoi `__ +- [Github Actions] Fix Monitor Tests Github Action (`#2135 `__) `Valeriu Predoi `__ +- [condalock] update conda lock file (`#2141 `__) `Valeriu Predoi `__ +- [Condalock] make sure mamba/conda are at latest version by forcing a pinned mamba install (`#2136 `__) `Valeriu Predoi `__ +- Update code coverage orbs (`#2206 `__) `Bouwe Andela `__ +- Revisit the comment-triggered Github Actions test (`#2243 `__) `Valeriu Predoi `__ +- Remove workflow that runs Github Actions tests from PR comment (`#2244 `__) `Valeriu Predoi `__ + +Improvements +~~~~~~~~~~~~ + +- Merge v2.9.x into main (`#2128 `__) `Manuel Schlund `__ +- Fix typo in citation file (`#2182 `__) `Bouwe Andela `__ +- Cleaned and extended function that extracts datetimes from paths (`#2181 `__) `Manuel Schlund `__ +- Add file encoding (and some read modes) at open file step (`#2219 `__) `Valeriu Predoi `__ +- Check type of argument passed to :func:`~esmvalcore.cmor.table.read_cmor_tables` (`#2217 `__) `Valeriu Predoi `__ +- Dynamic HTML output for monitoring (`#2062 `__) `Brei Soliño `__ + .. _changelog-v2-9-0: diff --git a/doc/conf.py b/doc/conf.py index a71f331378..1613a0133b 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -152,7 +152,19 @@ # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. -# html_theme_options = {} +# +# Avoid the following warning issued by pydata_sphinx_theme: +# +# "WARNING: The default value for `navigation_with_keys` will change to `False` +# in the next release. If you wish to preserve the old behavior for your site, +# set `navigation_with_keys=True` in the `html_theme_options` dict in your +# `conf.py` file.Be aware that `navigation_with_keys = True` has negative +# accessibility implications: +# https://github.com/pydata/pydata-sphinx-theme/issues/1492" +# Short synopsis of said issue: as of now, left/right keys take one +# to the previous/next page instead of scrolling horizontally; this +# should be fixed upstream, then we can set again navigation with keys True +html_theme_options = {"navigation_with_keys": False} # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [] diff --git a/doc/contributing.rst b/doc/contributing.rst index 8201fac707..814ab79263 100644 --- a/doc/contributing.rst +++ b/doc/contributing.rst @@ -550,18 +550,6 @@ and the result of the tests ran by GitHub Actions can be viewed on the of the repository (to learn more about the Github-hosted runners, please have a look the `documentation `__). -When opening a pull request, if you wish to run the Github Actions `Test `__ test, -you can activate it via a simple comment containing the @runGAtests tag -(e.g. "@runGAtests" or "@runGAtests please run" - in effect, tagging the runGAtests -bot that will start the test automatically). This is useful -to check if a certain feature that you included in the Pull Request, and can be tested -for via the test suite, works across the supported Python versions, and both on Linux and OSX. -The test is currently deactivated, so before triggering the test via comment, make sure you activate -the test in the main `Actions page `__ -(click on Test via PR Comment and activate it); also and be sure to deactivate it afterwards -(the Github API still needs a bit more development, and currently it triggers -the test for **each comment** irrespective of PR, that's why this needs to be activated/decativated). - The configuration of the tests run by CircleCI can be found in the directory `.circleci `__, while the configuration of the tests run by GitHub Actions can be found in the diff --git a/doc/recipe/preprocessor.rst b/doc/recipe/preprocessor.rst index 8f22cacb3d..c2b4c9438c 100644 --- a/doc/recipe/preprocessor.rst +++ b/doc/recipe/preprocessor.rst @@ -744,6 +744,8 @@ After ``mask_multimodel``, all involved datasets have an identical mask. See also :func:`esmvalcore.preprocessor.mask_multimodel`. +.. _threshold_masking: + Minimum, maximum and interval masking ------------------------------------- @@ -1697,6 +1699,7 @@ Examples: See also :func:`esmvalcore.preprocessor.extract_coordinate_points`. +.. _extract_region: ``extract_region`` ------------------ diff --git a/esmvalcore/_main.py b/esmvalcore/_main.py index c802dafad3..afb0cc0476 100755 --- a/esmvalcore/_main.py +++ b/esmvalcore/_main.py @@ -319,7 +319,7 @@ def __init__(self): self.__setattr__(entry_point.name, entry_point.load()()) def version(self): - """Show versions of all packages that conform ESMValTool. + """Show versions of all packages that form ESMValTool. In particular, this command will show the version ESMValCore and any other package that adds a subcommand to 'esmvaltool' diff --git a/esmvalcore/_recipe/from_datasets.py b/esmvalcore/_recipe/from_datasets.py index 0e454c7350..8bd33fd5e9 100644 --- a/esmvalcore/_recipe/from_datasets.py +++ b/esmvalcore/_recipe/from_datasets.py @@ -160,23 +160,6 @@ def _group_identical_facets(variable: Mapping[str, Any]) -> Recipe: return result -class _SortableDict(dict): - """A `dict` class that can be sorted.""" - - def __lt__(self, other): - return tuple(self.items()) < tuple(other.items()) - - -def _change_dict_type(item, dict_type): - """Change the dict type in a nested structure.""" - change_dict_type = partial(_change_dict_type, dict_type=dict_type) - if isinstance(item, dict): - return dict_type((k, change_dict_type(v)) for k, v in item.items()) - if isinstance(item, (list, tuple, set)): - return type(item)(change_dict_type(elem) for elem in item) - return item - - def _group_ensemble_members(dataset_facets: Iterable[Facets]) -> list[Facets]: """Group ensemble members. @@ -185,13 +168,15 @@ def _group_ensemble_members(dataset_facets: Iterable[Facets]) -> list[Facets]: """ def grouper(facets): - return tuple((k, facets[k]) for k in sorted(facets) if k != 'ensemble') + return sorted( + (f, str(v)) for f, v in facets.items() if f != 'ensemble') result = [] - dataset_facets = _change_dict_type(dataset_facets, _SortableDict) dataset_facets = sorted(dataset_facets, key=grouper) - for group_facets, group in itertools.groupby(dataset_facets, key=grouper): + for _, group_iter in itertools.groupby(dataset_facets, key=grouper): + group = list(group_iter) ensembles = [f['ensemble'] for f in group if 'ensemble' in f] + group_facets = group[0] if not ensembles: result.append(dict(group_facets)) else: @@ -199,7 +184,6 @@ def grouper(facets): facets = dict(group_facets) facets['ensemble'] = ensemble result.append(facets) - result = _change_dict_type(result, dict) return result diff --git a/esmvalcore/preprocessor/_io.py b/esmvalcore/preprocessor/_io.py index a6b2ccdd94..f1586a9f17 100644 --- a/esmvalcore/preprocessor/_io.py +++ b/esmvalcore/preprocessor/_io.py @@ -6,13 +6,13 @@ import os from itertools import groupby from pathlib import Path -from typing import Optional +from typing import Optional, NamedTuple from warnings import catch_warnings, filterwarnings +import cftime import iris import iris.aux_factory import iris.exceptions -import isodate import numpy as np import yaml from cf_units import suppress_errors @@ -22,7 +22,6 @@ from esmvalcore.iris_helpers import merge_cube_attributes from .._task import write_ncl_settings -from ._time import clip_timerange logger = logging.getLogger(__name__) @@ -206,70 +205,96 @@ def _concatenate_cubes(cubes, check_level): return concatenated -def _check_time_overlaps(cubes): - """Handle time overlaps.""" - times = [cube.coord('time').core_points() for cube in cubes] - for index, _ in enumerate(times[:-1]): - overlap = np.intersect1d(times[index], times[index + 1]) - if overlap.size != 0: - overlapping_cubes = cubes[index:index + 2] - time_1 = overlapping_cubes[0].coord('time').core_points() - time_2 = overlapping_cubes[1].coord('time').core_points() - - # case 1: both cubes start at the same time -> return longer cube - if time_1[0] == time_2[0]: - if time_1[-1] <= time_2[-1]: - cubes.pop(index) - discarded_cube_index = 0 - used_cube_index = 1 - else: - cubes.pop(index + 1) - discarded_cube_index = 1 - used_cube_index = 0 - logger.debug( - "Both cubes start at the same time but cube %s " - "ends before %s", - overlapping_cubes[discarded_cube_index], - overlapping_cubes[used_cube_index], - ) - logger.debug( - "Cube %s contains all needed data so using it fully", - overlapping_cubes[used_cube_index], - ) - - # case 2: cube1 starts before cube2 - # case 2.1: cube1 ends after cube2 -> return cube1 - elif time_1[-1] > time_2[-1]: - cubes.pop(index + 1) - logger.debug("Using only data from %s", overlapping_cubes[0]) - - # case 2.2: cube1 ends before cube2 -> use full cube2 - # and shorten cube1 - else: - new_time = np.delete( - time_1, - np.argwhere(np.in1d(time_1, overlap)), - ) - new_dates = overlapping_cubes[0].coord('time').units.num2date( - new_time) - logger.debug( - "Extracting time slice between %s and %s from cube %s " - "to use it for concatenation with cube %s", - new_dates[0], - new_dates[-1], - overlapping_cubes[0], - overlapping_cubes[1], - ) - - start_point = isodate.date_isoformat( - new_dates[0], format=isodate.isostrf.DATE_BAS_COMPLETE) - end_point = isodate.date_isoformat( - new_dates[-1], format=isodate.isostrf.DATE_BAS_COMPLETE) - new_cube = clip_timerange(overlapping_cubes[0], - f'{start_point}/{end_point}') - - cubes[index] = new_cube - return cubes +class _TimesHelper: + + def __init__(self, time): + self.times = time.core_points() + self.units = str(time.units) + + def __getattr__(self, name): + return getattr(self.times, name) + + def __len__(self): + return len(self.times) + + def __getitem__(self, key): + return self.times[key] + + +def _check_time_overlaps(cubes: iris.cube.CubeList) -> iris.cube.CubeList: + """Handle time overlaps. + + Parameters + ---------- + cubes : iris.cube.CubeList + A list of cubes belonging to a single timeseries, + ordered by starting point with possible overlaps. + + Returns + ------- + iris.cube.CubeList + A list of cubes belonging to a single timeseries, + ordered by starting point with no overlaps. + """ + if len(cubes) < 2: + return cubes + + class _TrackedCube(NamedTuple): + cube: iris.cube.Cube + times: iris.coords.DimCoord + start: float + end: float + + @classmethod + def from_cube(cls, cube): + """Construct tracked cube.""" + times = cube.coord("time") + start, end = times.core_points()[[0, -1]] + return cls(cube, times, start, end) + + new_cubes = iris.cube.CubeList() + current_cube = _TrackedCube.from_cube(cubes[0]) + for new_cube in map(_TrackedCube.from_cube, cubes[1:]): + if new_cube.start > current_cube.end: + # no overlap, use current cube and start again from new cube + logger.debug("Using %s", current_cube.cube) + new_cubes.append(current_cube.cube) + current_cube = new_cube + continue + # overlap + if current_cube.end > new_cube.end: + # current cube ends after new one, just forget new cube + logger.debug( + "Discarding %s because the time range " + "is already covered by %s", new_cube.cube, current_cube.cube) + continue + if new_cube.start == current_cube.start: + # new cube completely covers current one + # forget current cube + current_cube = new_cube + logger.debug( + "Discarding %s because the time range is covered by %s", + current_cube.cube, new_cube.cube) + continue + # new cube ends after current one, + # use all of new cube, and shorten current cube to + # eliminate overlap with new cube + cut_index = cftime.time2index( + new_cube.start, + _TimesHelper(current_cube.times), + current_cube.times.units.calendar, + select="before", + ) + 1 + logger.debug("Using %s shortened to %s due to overlap", + current_cube.cube, + current_cube.times.cell(cut_index).point) + new_cubes.append(current_cube.cube[:cut_index]) + current_cube = new_cube + + logger.debug("Using %s", current_cube.cube) + new_cubes.append(current_cube.cube) + + return new_cubes def _fix_calendars(cubes): diff --git a/tests/unit/recipe/test_from_datasets.py b/tests/unit/recipe/test_from_datasets.py index c2032724a4..aacca5117d 100644 --- a/tests/unit/recipe/test_from_datasets.py +++ b/tests/unit/recipe/test_from_datasets.py @@ -8,7 +8,6 @@ _group_ensemble_names, _group_identical_facets, _move_one_level_up, - _SortableDict, _to_frozen, datasets_to_recipe, ) @@ -137,12 +136,6 @@ def test_supplementary_datasets_to_recipe(): assert datasets_to_recipe([dataset]) == recipe -def test_sortable_dict(): - assert _SortableDict({'a': 1}) < _SortableDict({'a': 2}) - assert _SortableDict({'a': 1}) < _SortableDict({'a': 1, 'b': 1}) - assert _SortableDict({'a': 1}) < _SortableDict({'b': 1}) - - def test_datasets_to_recipe_group_ensembles(): datasets = [ Dataset( @@ -253,6 +246,45 @@ def test_group_ensemble_members(): ] +def test_group_ensemble_members_mix_of_versions(): + datasets = [ + Dataset( + dataset='dataset1', + ensemble='r1i1p1f1', + exp=['historical', 'ssp585'], + version='v1', + ), + Dataset( + dataset='dataset1', + ensemble='r2i1p1f1', + exp=['historical', 'ssp585'], + version='v1', + ), + Dataset( + dataset='dataset1', + ensemble='r3i1p1f1', + exp=['historical', 'ssp585'], + version=['v1', 'v2'], + ), + ] + result = _group_ensemble_members(ds.facets for ds in datasets) + print(result) + assert result == [ + { + 'dataset': 'dataset1', + 'ensemble': 'r3i1p1f1', + 'exp': ['historical', 'ssp585'], + 'version': ['v1', 'v2'], + }, + { + 'dataset': 'dataset1', + 'ensemble': 'r(1:2)i1p1f1', + 'exp': ['historical', 'ssp585'], + 'version': 'v1', + }, + ] + + def test_group_ensembles_cmip5(): ensembles = [ "r1i1p1",