diff --git a/.circleci/config.yml b/.circleci/config.yml index 975a1ae50a..c4c9208cd2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -2,8 +2,8 @@ version: 2.1 orbs: - coverage-reporter: codacy/coverage-reporter@13.16.5 - codecov: codecov/codecov@3.2.5 + coverage-reporter: codacy/coverage-reporter@14.0.0 + codecov: codecov/codecov@4.1.0 commands: check_changes: @@ -48,8 +48,15 @@ commands: test_installation_from_source: parameters: extra: + description: pip "extra"s to install type: string + default: "test" flags: + description: pip install flags + type: string + default: "" + upstream_packages: + description: List of packages that will be installed with pip. type: string default: "" steps: @@ -74,20 +81,25 @@ commands: - r-yaml - ncl " >> environment.yml + # Installation of development version of packages requires compilers + if [[ "<< parameters.upstream_packages >>" ]]; then + echo " - compilers" >> environment.yml + fi # Install . /opt/conda/etc/profile.d/conda.sh mkdir /logs - mamba env create >> /logs/conda.txt 2>&1 + mamba env create |& tee /logs/conda.txt + git stash # Restore repository state to get clean version number. conda activate esmvaltool - pip install << parameters.flags >> ".[<>]"> /logs/install.txt 2>&1 + pip install << parameters.flags >> ".[<>]" << parameters.upstream_packages >> |& tee /logs/install.txt - run: name: Log versions command: | . /opt/conda/etc/profile.d/conda.sh conda activate esmvaltool - dpkg -l > /logs/versions.txt - conda env export > /logs/environment.yml - pip freeze > /logs/requirements.txt + dpkg -l | tee /logs/versions.txt + conda env export | tee /logs/environment.yml + pip freeze | tee /logs/requirements.txt - test_and_report - save_cache: key: install-<< parameters.extra >>-{{ .Branch }}-{{ checksum "cache_key.txt" }} @@ -116,7 +128,7 @@ jobs: . /opt/conda/etc/profile.d/conda.sh mkdir /logs conda activate esmvaltool - pip install .[test] > /logs/install.txt 2>&1 + pip install .[test] |& tee -a /logs/install.txt - test_and_report - save_cache: key: test-{{ .Branch }}-{{ checksum "cache_key.txt" }} @@ -141,8 +153,7 @@ jobs: - image: condaforge/mambaforge resource_class: large steps: - - test_installation_from_source: - extra: test + - test_installation_from_source test_installation_from_source_develop_mode: # Test development installation @@ -154,6 +165,25 @@ jobs: extra: develop flags: "--editable" + test_with_upstream_developments: + # Test with development versions of upstream packages + docker: + - image: condaforge/mambaforge + resource_class: large + steps: + - test_installation_from_source: + upstream_packages: >- + git+https://github.com/esgf/esgf-pyclient + git+https://github.com/euro-cordex/py-cordex + git+https://github.com/SciTools/cartopy + git+https://github.com/SciTools/cf-units + git+https://github.com/SciTools/iris + git+https://github.com/SciTools/iris-grib + git+https://github.com/SciTools/nc-time-axis + git+https://github.com/SciTools-incubator/iris-esmf-regrid + git+https://github.com/SciTools-incubator/python-stratify + git+https://github.com/Toblerity/Fiona + test_installation_from_conda: # Test conda package installation working_directory: /esmvaltool @@ -167,14 +197,13 @@ jobs: set -x # Install prerequisites mkdir /logs - # conda update -y conda > /logs/conda.txt 2>&1 # Create and activate conda environment mamba create -y --name esmvaltool 'python=3.11' set +x; conda activate esmvaltool; set -x # Install mamba install -y esmvalcore # Log versions - conda env export > /logs/environment.yml + conda env export | tee /logs/environment.yml # Test installation esmvaltool version @@ -194,9 +223,9 @@ jobs: conda activate esmvaltool pip install .[doc] # Log versions - dpkg -l > /logs/versions.txt - conda env export > /logs/environment.yml - pip freeze > /logs/requirements.txt + dpkg -l | tee /logs/versions.txt + conda env export | tee /logs/environment.yml + pip freeze | tee /logs/requirements.txt # Test building documentation MPLBACKEND=Agg sphinx-build -W doc doc/build - store_artifacts: @@ -206,8 +235,9 @@ workflows: commit: jobs: - run_tests - - test_installation_from_source_test_mode - test_installation_from_source_develop_mode + - test_installation_from_source_test_mode + - test_with_upstream_developments nightly: triggers: @@ -218,8 +248,9 @@ workflows: only: - main jobs: - - run_tests - - test_installation_from_source_test_mode - build_documentation - - test_installation_from_source_develop_mode + - run_tests - test_installation_from_conda + - test_installation_from_source_develop_mode + - test_installation_from_source_test_mode + - test_with_upstream_developments diff --git a/.github/workflows/install-from-conda.yml b/.github/workflows/install-from-conda.yml index 951a91328a..88e78619ea 100644 --- a/.github/workflows/install-from-conda.yml +++ b/.github/workflows/install-from-conda.yml @@ -39,7 +39,7 @@ jobs: runs-on: "ubuntu-latest" strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12"] # fail-fast set to False allows all other tests # in the workflow to run regardless of any fail fail-fast: false @@ -75,7 +75,7 @@ jobs: runs-on: "macos-latest" strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12"] architecture: ["x64"] # need to force Intel, arm64 builds have issues fail-fast: false name: OSX Python ${{ matrix.python-version }} diff --git a/.github/workflows/install-from-condalock-file.yml b/.github/workflows/install-from-condalock-file.yml index 3838387fa8..fbc4a71903 100644 --- a/.github/workflows/install-from-condalock-file.yml +++ b/.github/workflows/install-from-condalock-file.yml @@ -29,7 +29,7 @@ jobs: runs-on: "ubuntu-latest" strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12"] fail-fast: false name: Linux Python ${{ matrix.python-version }} steps: diff --git a/.github/workflows/install-from-pypi.yml b/.github/workflows/install-from-pypi.yml index cd49eed089..1e326c89eb 100644 --- a/.github/workflows/install-from-pypi.yml +++ b/.github/workflows/install-from-pypi.yml @@ -39,7 +39,7 @@ jobs: runs-on: "ubuntu-latest" strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12"] # fail-fast set to False allows all other tests # in the workflow to run regardless of any fail fail-fast: false @@ -77,7 +77,7 @@ jobs: runs-on: "macos-latest" strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12"] architecture: ["x64"] # need to force Intel, arm64 builds have issues fail-fast: false name: OSX Python ${{ matrix.python-version }} diff --git a/.github/workflows/install-from-source.yml b/.github/workflows/install-from-source.yml index a4aa9b8e01..7cb8c7d629 100644 --- a/.github/workflows/install-from-source.yml +++ b/.github/workflows/install-from-source.yml @@ -37,7 +37,7 @@ jobs: runs-on: "ubuntu-latest" strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12"] fail-fast: false name: Linux Python ${{ matrix.python-version }} steps: @@ -74,7 +74,7 @@ jobs: runs-on: "macos-latest" strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12"] architecture: ["x64"] # need to force Intel, arm64 builds have issues fail-fast: false name: OSX Python ${{ matrix.python-version }} diff --git a/.github/workflows/run-tests-monitor.yml b/.github/workflows/run-tests-monitor.yml index 561516a3e2..160bdd2850 100644 --- a/.github/workflows/run-tests-monitor.yml +++ b/.github/workflows/run-tests-monitor.yml @@ -22,7 +22,7 @@ jobs: runs-on: "ubuntu-latest" strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12"] fail-fast: false name: Linux Python ${{ matrix.python-version }} steps: @@ -55,7 +55,7 @@ jobs: runs-on: "macos-latest" strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12"] architecture: ["x64"] # need to force Intel, arm64 builds have issues fail-fast: false name: OSX Python ${{ matrix.python-version }} diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 9cf1d6308b..ac294e9f44 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -39,7 +39,7 @@ jobs: runs-on: "ubuntu-latest" strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12"] fail-fast: false name: Linux Python ${{ matrix.python-version }} steps: @@ -73,7 +73,7 @@ jobs: runs-on: "macos-latest" strategy: matrix: - python-version: ["3.9", "3.10", "3.11", "3.12"] + python-version: ["3.10", "3.11", "3.12"] architecture: ["x64"] # need to force Intel, arm64 builds have issues fail-fast: false name: OSX Python ${{ matrix.python-version }} diff --git a/.zenodo.json b/.zenodo.json index bb00d5471d..f0997c6467 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -204,6 +204,11 @@ { "affiliation": "DLR, Germany", "name": "Cammarano, Diego" + }, + { + "affiliation": "ACCESS-NRI, Australia", + "name": "Yousong, Zeng", + "orcid": "0000-0002-8385-5367" } ], "description": "ESMValCore: A community tool for pre-processing data from Earth system models in CMIP and running analysis scripts.", diff --git a/CITATION.cff b/CITATION.cff index c226e7a27c..51f53cfb36 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -208,13 +208,18 @@ authors: affiliation: "DLR, Germany" family-names: Cammarano given-names: Diego + - + affiliation: "ACCESS-NRI, Australia" + family-names: Yousong + given-names: Zeng + orcid: "https://orcid.org/0000-0002-8385-5367" cff-version: 1.2.0 -date-released: 2024-06-20 +date-released: 2024-07-03 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.11.0rc2" +version: "v2.11.0" ... diff --git a/conda-linux-64.lock b/conda-linux-64.lock index 6a2af7b0f2..af632daa07 100644 --- a/conda-linux-64.lock +++ b/conda-linux-64.lock @@ -1,42 +1,41 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 33a7c92d8f54623244df62c65f8f69624e2d04349df5330379294383caba5271 +# input_hash: c195f9ab0e28f8ad6df204cf57ee02857a494fa81bb83c21ef04726616f06a9e @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-2024.6.2-hbcca054_0.conda#847c3c2905cc467cea52c24f9cfa8080 +https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2024.7.4-hbcca054_0.conda#23ab7665c5f63cfb9f1f6195256daac6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-dejavu-sans-mono-2.37-hab24e00_0.tar.bz2#0c96522c6bdaed4b1566d11387caaf45 https://conda.anaconda.org/conda-forge/noarch/font-ttf-inconsolata-3.000-h77eed37_0.tar.bz2#34893075a5c9e55cdafac56607368fc6 https://conda.anaconda.org/conda-forge/noarch/font-ttf-source-code-pro-2.038-h77eed37_0.tar.bz2#4d59c254e01d9cde7957100457e2d5fb https://conda.anaconda.org/conda-forge/noarch/font-ttf-ubuntu-0.83-h77eed37_2.conda#cbbe59391138ea5ad3658c76912e147f https://conda.anaconda.org/conda-forge/linux-64/ld_impl_linux-64-2.40-hf3520f5_7.conda#b80f2f396ca2c28b8c14c437a4ed1e74 -https://conda.anaconda.org/conda-forge/linux-64/libboost-headers-1.85.0-ha770c72_1.conda#012455a6eddcbf487ef0ddd1715f0b80 -https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.2-ha770c72_0.conda#8c924f0b7f3e064b1c954a08e7c32fba +https://conda.anaconda.org/conda-forge/linux-64/pandoc-3.2.1-ha770c72_0.conda#b39b12d3809e4042f832b76192e0e7e8 https://conda.anaconda.org/conda-forge/noarch/poppler-data-0.4.12-hd8ed1ab_0.conda#d8d7293c5b37f39b2ac32940621c6592 https://conda.anaconda.org/conda-forge/linux-64/python_abi-3.12-4_cp312.conda#dccc2d142812964fcc6abdc97b672dff https://conda.anaconda.org/conda-forge/noarch/tzdata-2024a-h0c530f3_0.conda#161081fc7cec0bfda0d86d7cb595f8d8 https://conda.anaconda.org/conda-forge/noarch/fonts-conda-forge-1-0.tar.bz2#f766549260d6815b0c52253f1fb1bb29 -https://conda.anaconda.org/conda-forge/linux-64/libgomp-13.2.0-h77fa898_11.conda#8c462ced2af33648195dc9459f331f31 +https://conda.anaconda.org/conda-forge/linux-64/libgomp-14.1.0-h77fa898_0.conda#ae061a5ed5f05818acdf9adab72c146d https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2#73aaf86a425cc6e73fcf236a5a46396d https://conda.anaconda.org/conda-forge/noarch/fonts-conda-ecosystem-1-0.tar.bz2#fee5683a3f04bd15cbd8318b096a27ab -https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-13.2.0-h77fa898_11.conda#0b3b218a596bb4c3854cc9ee799f94e5 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.19-h4ab18f5_0.conda#c6dedd5eab2236f4abb59ade9fb7fd44 -https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4 -https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f +https://conda.anaconda.org/conda-forge/linux-64/libgcc-ng-14.1.0-h77fa898_0.conda#ca0fad6a41ddaef54a153b78eccb5037 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-common-0.9.23-h4ab18f5_0.conda#94d61ae2b2b701008a9d52ce6bbead27 +https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-h4bc722e_7.conda#62ee74e96c5ebb0af99386de58cf9553 +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.32.2-h4bc722e_0.conda#8024af1ee7078e37fa3101c0a0296af2 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/giflib-5.2.2-hd590300_0.conda#3bf7b9fd5a7136126e0234db4b87c8b6 -https://conda.anaconda.org/conda-forge/linux-64/json-c-0.17-h7ab15ed_0.conda#9961b1f100c3b6852bd97c9233d06979 +https://conda.anaconda.org/conda-forge/linux-64/json-c-0.17-h1220068_1.conda#f8f0f0c4338bad5c34a4e9e11460481d https://conda.anaconda.org/conda-forge/linux-64/keyutils-1.6.1-h166bdaf_0.tar.bz2#30186d27e2c9fa62b45fb1476b7200e3 https://conda.anaconda.org/conda-forge/linux-64/libbrotlicommon-1.1.0-hd590300_1.conda#aec6c91c7371c26392a06708a73c70e5 https://conda.anaconda.org/conda-forge/linux-64/libdeflate-1.20-hd590300_0.conda#8e88f9389f1165d7c0936fe40d9a9a79 https://conda.anaconda.org/conda-forge/linux-64/libev-4.33-hd590300_2.conda#172bf1cd1ff8629f2b1179945ed45055 https://conda.anaconda.org/conda-forge/linux-64/libexpat-2.6.2-h59595ed_0.conda#e7ba12deb7020dd080c6c70e7b6f6a3d 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-h3d2ce59_11.conda#c485da4fdb454539f852a90ae06e9bb7 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran5-14.1.0-hc5f4f2c_0.conda#6456c2620c990cd8dde2428a27ba0bc5 https://conda.anaconda.org/conda-forge/linux-64/libiconv-1.17-hd590300_2.conda#d66573916ffcf376178462f1b61c941e 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/libsodium-1.0.18-h36c2ea0_1.tar.bz2#c3788462a6fbddafdb413a9f9053e58d -https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-13.2.0-hc0a3c3a_11.conda#eaa8ea74083fb4a78ae19e431e556003 +https://conda.anaconda.org/conda-forge/linux-64/libstdcxx-ng-14.1.0-hc0a3c3a_0.conda#1cb187a157136398ddbaae90713e2498 https://conda.anaconda.org/conda-forge/linux-64/libutf8proc-2.8.0-h166bdaf_0.tar.bz2#ede4266dc02e875fe1ea77b25dd43747 https://conda.anaconda.org/conda-forge/linux-64/libuuid-2.38.1-h0b41bf4_0.conda#40b61aab5c7ba9ff276c41cfffe6b80b https://conda.anaconda.org/conda-forge/linux-64/libwebp-base-1.4.0-hd590300_0.conda#b26e8aa824079e1be0294e7152ca4559 @@ -44,7 +43,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/libzlib-1.3.1-h4ab18f5_1.conda#57d7dc60e9325e3de37ff8dffd18e814 https://conda.anaconda.org/conda-forge/linux-64/lzo-2.10-hd590300_1001.conda#ec7398d21e2651e0dcb0044d03b9a339 https://conda.anaconda.org/conda-forge/linux-64/ncurses-6.5-h59595ed_0.conda#fcea371545eda051b6deafb24889fc69 -https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4ab18f5_0.conda#a41fa0e391cc9e0d6b78ac69ca047a6c +https://conda.anaconda.org/conda-forge/linux-64/openssl-3.3.1-h4bc722e_2.conda#e1b454497f9f7c1147fdde4b53f1b512 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/tzcode-2024a-h3f72095_0.conda#32146e34aaec3745a08b6f49af3f41b0 https://conda.anaconda.org/conda-forge/linux-64/xorg-inputproto-2.3.2-h7f98852_1002.tar.bz2#bcd1b3396ec6960cbc1d2855a9e60b2b @@ -58,78 +57,79 @@ 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.15-h88a6e22_0.conda#50eabf107100f8f929bc3246ea63fa08 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-h83b837d_6.conda#3e572eacd0ce99a59e1bb9c260ad5b20 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.16-h83b837d_2.conda#f40c698b4ea90f7fedd187c6639c818b -https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-h83b837d_6.conda#7995cb937bdac5913c8904fed6b3729d +https://conda.anaconda.org/conda-forge/linux-64/aws-c-cal-0.7.1-h87b94db_1.conda#2d76d2cfdcfe2d5c3883d33d8be919e7 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-compression-0.2.18-he027950_7.conda#11e5cb0b426772974f6416545baee0ce +https://conda.anaconda.org/conda-forge/linux-64/aws-c-sdkutils-0.1.16-he027950_3.conda#adbf0c44ca88a3cded175cd809a106b6 +https://conda.anaconda.org/conda-forge/linux-64/aws-checksums-0.1.18-he027950_7.conda#95611b325a9728ed68b8f7eef2dd3feb https://conda.anaconda.org/conda-forge/linux-64/expat-2.6.2-h59595ed_0.conda#53fb86322bdb89496d7579fe3f02fd61 https://conda.anaconda.org/conda-forge/linux-64/fmt-10.2.1-h00ab1b0_0.conda#35ef8bc24bd34074ebae3c943d551728 -https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.1-h59595ed_0.conda#8c0f4f71f5a59ceb0c6fa9f51501066d +https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.2-hac33072_0.conda#621d814955342209dc8e7f87c41f1ba0 https://conda.anaconda.org/conda-forge/linux-64/gflags-2.2.2-he1b5a44_1004.tar.bz2#cddaf2c63ea4a5901cf09524c490ecdc https://conda.anaconda.org/conda-forge/linux-64/graphite2-1.3.13-h59595ed_1003.conda#f87c7b7c2cb45f323ffbce941c78ab7c https://conda.anaconda.org/conda-forge/linux-64/hdf4-4.2.15-h2a13503_7.conda#bd77f8da987968ec3927990495dc22e4 https://conda.anaconda.org/conda-forge/linux-64/icu-73.2-h59595ed_0.conda#cc47e1facc155f91abd89b11e48e72ff https://conda.anaconda.org/conda-forge/linux-64/lerc-4.0.0-h27087fc_0.tar.bz2#76bbff344f0134279f225174e9064c8f -https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_h59595ed_0.conda#682bdbe046a68f749769b492f3625c5c +https://conda.anaconda.org/conda-forge/linux-64/libabseil-20240116.2-cxx17_he02047a_1.conda#c48fc56ec03229f294176923c3265c05 https://conda.anaconda.org/conda-forge/linux-64/libaec-1.1.3-h59595ed_0.conda#5e97e271911b8b2001a8b71860c32faa 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/libcrc32c-1.1.2-h9c3ff4c_0.tar.bz2#c965a5aa0d5c1c37ffc62dff36e28400 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_11.conda#4c3e460d6acf8e43e4ce8bf405187eb7 +https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-14.1.0-h69a702a_0.conda#f4ca84fbd6d06b0a052fb2d5b96dde41 https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_1.conda#700ac6ea6d53d5510591c4344d5c989a https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.43-h2797004_0.conda#009981dd9cfcaa4dbfa25ffaed86bcae https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.46.0-hde9e2c9_0.conda#18aa975d2094c34aef978060ae7da7d8 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 +https://conda.anaconda.org/conda-forge/linux-64/libxcb-1.16-hd590300_0.conda#151cba22b85a989c2d6ef9633ffee1e4 https://conda.anaconda.org/conda-forge/linux-64/libzip-1.10.1-h2629f0a_3.conda#ac79812548e7e8cf61f7b0abdef01d3b 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/nspr-4.35-h27087fc_0.conda#da0ec11a6454ae19bff5b02ed881a2b1 -https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.43-hcad00b1_0.conda#8292dea9e022d9610a11fce5e0896ed8 +https://conda.anaconda.org/conda-forge/linux-64/pcre2-10.44-h0f59acf_0.conda#3914f7ac1761dce57102c72ca7c35d01 https://conda.anaconda.org/conda-forge/linux-64/pixman-0.43.2-h59595ed_0.conda#71004cbf7924e19c02746ccde9fd7123 +https://conda.anaconda.org/conda-forge/linux-64/qhull-2020.2-h434a139_5.conda#353823361b1d27eb3960efb076dfcaf6 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.4.16-he19d79f_0.conda#de1cf82e46578faf7de8c23efe5d7be4 -https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.0-hdb0a2a9_1.conda#843bbb8ace1d64ac50d64639ff38b014 +https://conda.anaconda.org/conda-forge/linux-64/s2n-1.4.17-he19d79f_0.conda#e25ac9bf10f8e6aa67727b1cdbe762ef +https://conda.anaconda.org/conda-forge/linux-64/snappy-1.2.1-ha2e4443_0.conda#6b7dcc7349efd123d493d2dbe85a045f https://conda.anaconda.org/conda-forge/linux-64/tk-8.6.13-noxft_h4845f30_101.conda#d453b98d9c83e71da0741bb0ff4d76bc https://conda.anaconda.org/conda-forge/linux-64/uriparser-0.9.8-hac33072_0.conda#d71d3a66528853c0a1ac2c02d79a0284 https://conda.anaconda.org/conda-forge/linux-64/xorg-fixesproto-5.0-h7f98852_1002.tar.bz2#65ad6e1eb4aed2b0611855aff05e04f6 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/zlib-1.3.1-h4ab18f5_1.conda#9653f1bf3766164d0e65fa723cabbc54 https://conda.anaconda.org/conda-forge/linux-64/zstd-1.5.6-ha6fb4c9_0.conda#4d056880988120e29d75bfff282e0f45 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.9-h2d549f9_2.conda#5a828631479163d88e419fd6841139c4 -https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.5-hc2324a3_1.conda#11d76bee958b1989bd1ac6ee7372ea6d +https://conda.anaconda.org/conda-forge/linux-64/aws-c-io-0.14.10-h826b7d6_1.conda#6961646dded770513a781de4cd5c1fe1 +https://conda.anaconda.org/conda-forge/linux-64/blosc-1.21.6-hef167b5_0.conda#54fe76ab3d0189acaef95156874db7f9 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 https://conda.anaconda.org/conda-forge/linux-64/glog-0.7.1-hbabe93e_0.conda#ff862eebdfeb2fd048ae9dc92510baca -https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.2-h659d440_0.conda#cd95826dbd331ed1be26bdf401432844 -https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.2-hf974151_0.conda#72724f6a78ecb15559396966226d5838 -https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-h01aab08_1018.conda#3eb5f16bcc8a02892199aa63555c731f -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_h413a1c8_0.conda#a356024784da6dfd4683dc5ecf45b155 +https://conda.anaconda.org/conda-forge/linux-64/krb5-1.21.3-h659f571_0.conda#3f43953b7d3fb3aaa1d0d0723d91e368 +https://conda.anaconda.org/conda-forge/linux-64/libglib-2.80.3-h8a4344b_1.conda#6ea440297aacee4893f02ad759e6ffbc +https://conda.anaconda.org/conda-forge/linux-64/libkml-1.3.0-hbbc8833_1020.conda#6d76c5822cb38bc1ab5a06565c6cf626 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.27-pthreads_hac2b453_1.conda#ae05ece66d3924ac3d48b4aa3fa96cec https://conda.anaconda.org/conda-forge/linux-64/libprotobuf-4.25.3-h08a7969_0.conda#6945825cebd2aeb16af4c69d97c32c13 https://conda.anaconda.org/conda-forge/linux-64/libre2-11-2023.09.01-h5a48ba9_2.conda#41c69fba59d495e8cf5ffda48a607e35 -https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-h8917695_15.conda#20c3c14bc491f30daecaa6f73e2223ae +https://conda.anaconda.org/conda-forge/linux-64/librttopo-1.1.0-hc670b87_16.conda#3d9f3a2e5d7213c34997e4464d2f938c 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-h1dd3fc0_3.conda#66f03896ffbe1a110ffda05c7a856504 -https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-hc051c1a_1.conda#340278ded8b0dc3a73f3660bbb0adbc6 +https://conda.anaconda.org/conda-forge/linux-64/libxml2-2.12.7-h4c95cb1_3.conda#0ac9aff6010a7751961c8e4b863a40e7 https://conda.anaconda.org/conda-forge/linux-64/minizip-4.0.7-h401b404_0.conda#4474532a312b2245c5c77f1176989b46 -https://conda.anaconda.org/conda-forge/linux-64/nss-3.101-h593d115_0.conda#b24ab6abea1bdc28d646336a03d15392 +https://conda.anaconda.org/conda-forge/linux-64/nss-3.102-h593d115_0.conda#40e5e48c55a45621c4399ca9236406b7 https://conda.anaconda.org/conda-forge/linux-64/python-3.12.4-h194c7f8_0_cpython.conda#d73490214f536cccb5819e9873048c92 https://conda.anaconda.org/conda-forge/linux-64/spdlog-1.13.0-hd2e6256_0.conda#18f9348f064632785d54dbd1db9344bb https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.46.0-h6d4b2fc_0.conda#77ea8dff5cf8550cc8f5629a6af56323 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.9-h8ee46fc_0.conda#077b6e8ad6a3ddb741fce2496dd01bec +https://conda.anaconda.org/conda-forge/linux-64/xorg-libx11-1.8.9-hb711507_1.conda#4a6d410296d7e39f00bacdee7df046e9 https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.16-pyhd8ed1ab_0.conda#def531a3ac77b7fb8c21d17bb5d0badb 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/astroid-3.2.2-py312h7900ff3_0.conda#2acaebd0ea2aeaf38e996bda79545c0b +https://conda.anaconda.org/conda-forge/linux-64/astroid-3.2.4-py312h7900ff3_0.conda#06f82f9dc65aa8ebd14bf3cf2b34dad2 https://conda.anaconda.org/conda-forge/linux-64/atk-1.0-2.38.0-h04ea711_2.conda#f730d54ba9cd543666d7220c9f7ed563 https://conda.anaconda.org/conda-forge/noarch/attrs-23.2.0-pyh71513ae_0.conda#5e4c0743c70186509d1412e03c2d8dfa -https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-h0cbf018_13.conda#15351eccac4eda2b5fd38bbbdae78bdf -https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.2-h360477d_2.conda#a820cb648906f7f30076c66dd46b1790 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-event-stream-0.4.2-h7671281_15.conda#3b45b0da170f515de8be68155e14955a +https://conda.anaconda.org/conda-forge/linux-64/aws-c-http-0.8.2-he17ee6b_6.conda#4e3d1bb2ade85619ac2163e695c2cc1b https://conda.anaconda.org/conda-forge/linux-64/brotli-1.1.0-hd590300_1.conda#f27a24d46e3ea7b70a1f98e50c62508f https://conda.anaconda.org/conda-forge/linux-64/brotli-python-1.1.0-py312h30efb56_1.conda#45801a89533d3336a365284d93298e36 -https://conda.anaconda.org/conda-forge/noarch/certifi-2024.6.2-pyhd8ed1ab_0.conda#8821ec1c8fcdc9e1d291d7b9f6e9968a +https://conda.anaconda.org/conda-forge/noarch/certifi-2024.7.4-pyhd8ed1ab_0.conda#24e7fd6ca65997938fff9e5ab6f653e4 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.2-pyhd8ed1ab_0.conda#7f4a9e3fcff3f6356ae99244a014da6a https://conda.anaconda.org/conda-forge/noarch/click-8.1.7-unix_pyh707e725_0.conda#f3ad426304898027fc619827ff428eca @@ -144,18 +144,20 @@ https://conda.anaconda.org/conda-forge/noarch/dill-0.3.8-pyhd8ed1ab_0.conda#7874 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52 https://conda.anaconda.org/conda-forge/noarch/docutils-0.21.2-pyhd8ed1ab_0.conda#e8cd5d629f65bdf0f3bb312cde14659e https://conda.anaconda.org/conda-forge/noarch/entrypoints-0.4-pyhd8ed1ab_0.tar.bz2#3cf04868fee0a029769bd41f4b2fbf2d -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_2.conda#8d652ea2ee8eaee02ed8dc820bc794aa +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.2-pyhd8ed1ab_0.conda#d02ae936e42063ca46af6cdad2dbd1e0 https://conda.anaconda.org/conda-forge/noarch/execnet-2.1.1-pyhd8ed1ab_0.conda#15dda3cdbf330abfe9f555d22f66db46 https://conda.anaconda.org/conda-forge/noarch/executing-2.0.1-pyhd8ed1ab_0.conda#e16be50e378d8a4533b989035b196ab8 -https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.3-pyhd8ed1ab_0.conda#eae681f708bd52d9d172bd5c9af23898 +https://conda.anaconda.org/conda-forge/noarch/filelock-3.15.4-pyhd8ed1ab_0.conda#0e7e4388e9d5283e22b35a9443bdbcc9 https://conda.anaconda.org/conda-forge/noarch/findlibs-0.0.5-pyhd8ed1ab_0.conda#8f325f63020af6f7acbe2c4cb4c920db 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-2024.6.0-pyhff2d567_0.conda#ad6af3f92e71b1579ac2362b6cf29105 +https://conda.anaconda.org/conda-forge/noarch/fsspec-2024.6.1-pyhff2d567_0.conda#996bf792cdb8c0ac38ff54b9fde56841 https://conda.anaconda.org/conda-forge/linux-64/gdk-pixbuf-2.42.12-hb9ae30d_0.conda#201db6c2d9a3c5e46573ac4cb2e92f4f https://conda.anaconda.org/conda-forge/noarch/geographiclib-2.0-pyhd8ed1ab_0.tar.bz2#6b1f32359fc5d2ab7b491d0029bfffeb https://conda.anaconda.org/conda-forge/linux-64/gts-0.7.6-h977cf35_4.conda#4d8df0b0db060d33c9a702ada998a8fe +https://conda.anaconda.org/conda-forge/noarch/hpack-4.0.0-pyh9f0ad1d_0.tar.bz2#914d6646c4dbb1fd3ff539830a12fd71 https://conda.anaconda.org/conda-forge/noarch/humanfriendly-10.0-pyhd8ed1ab_6.conda#2ed1fe4b9079da97c44cfe9c2e5078fd +https://conda.anaconda.org/conda-forge/noarch/hyperframe-6.0.1-pyhd8ed1ab_0.tar.bz2#9f765cbfab6870c8435b9eefecd7a1f4 https://conda.anaconda.org/conda-forge/noarch/idna-3.7-pyhd8ed1ab_0.conda#c0cc1420498b17414d8617d0b9f506ca https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.bz2#7de5386c8fea29e76b303f37dde4c352 https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 @@ -164,7 +166,7 @@ https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py312h8572e83_1 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.16-hb7c19ff_0.conda#51bb7010fc86f70eee639b4bb7a894f5 https://conda.anaconda.org/conda-forge/linux-64/libarchive-3.7.4-hfca40fe_0.conda#32ddb97f897740641d8d46a829ce1704 https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-22_linux64_openblas.conda#1a2a0cd3153464fee6646f3dd6dad9b8 -https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_0.conda#f21c27f076a07907e70c49bb57bd0f20 +https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.8.0-hca28451_1.conda#b8afb3e3cb3423cc445cf611ab95fdb0 https://conda.anaconda.org/conda-forge/linux-64/libpq-16.3-ha72fbe1_0.conda#bac737ae28b79cfbafd515258d97d29e https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.4.0-h2c329e2_0.conda#80030debaa84cfc31755d53742df3ca6 https://conda.anaconda.org/conda-forge/linux-64/libxslt-1.1.39-h76b75d6_0.conda#e71f31f8cfb0a91439f2086fc8aa0461 @@ -187,7 +189,7 @@ https://conda.anaconda.org/conda-forge/noarch/pickleshare-0.7.5-py_1003.tar.bz2# https://conda.anaconda.org/conda-forge/noarch/pkgutil-resolve-name-1.3.10-pyhd8ed1ab_1.conda#405678b942f2481cecdb3e010f4925d9 https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.2-pyhd8ed1ab_0.conda#6f6cf28bf8e021933869bae3f84b8fc9 https://conda.anaconda.org/conda-forge/noarch/pluggy-1.5.0-pyhd8ed1ab_0.conda#d3483c8fc2dc2cc3f5cf43e26d60cabf -https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py312h98912ed_0.conda#3facaca6cc0f7988df3250efccd32da3 +https://conda.anaconda.org/conda-forge/linux-64/psutil-6.0.0-py312h9a8786e_0.conda#1aeffa86c55972ca4e88ac843eccedf2 https://conda.anaconda.org/conda-forge/noarch/ptyprocess-0.7.0-pyhd3deb0d_0.tar.bz2#359eeb6536da0e687af562ed265ec263 https://conda.anaconda.org/conda-forge/noarch/pure_eval-0.2.2-pyhd8ed1ab_0.tar.bz2#6784285c7e55cb7212efabc79e4c2883 https://conda.anaconda.org/conda-forge/noarch/pycodestyle-2.12.0-pyhd8ed1ab_0.conda#b9cc97b824a995fb231c377f61881bf8 @@ -203,8 +205,8 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py312h98912e https://conda.anaconda.org/conda-forge/noarch/pytz-2024.1-pyhd8ed1ab_0.conda#3eeeeb9e4827ace8c0c1419c85d590ad https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py312h98912ed_1.conda#e3fd78d8d490af1d84763b9fe3f2e552 https://conda.anaconda.org/conda-forge/linux-64/re2-2023.09.01-h7f4b329_2.conda#8f70e36268dea8eb666ef14c29bd3cda -https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.18.1-py312h4413252_0.conda#73da42918aaeb87d5618f82e2ac18d1f -https://conda.anaconda.org/conda-forge/noarch/setuptools-70.1.0-pyhd8ed1ab_0.conda#258e66f95f814d51ada2a1fe9274039b +https://conda.anaconda.org/conda-forge/linux-64/rpds-py-0.19.0-py312hf008fa9_0.conda#66ebbe714bafd06ba298a0c6bc2f04ad +https://conda.anaconda.org/conda-forge/noarch/setuptools-71.0.4-pyhd8ed1ab_0.conda#ee78ac9c720d0d02fcfd420866b82ab1 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 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 @@ -214,7 +216,7 @@ https://conda.anaconda.org/conda-forge/noarch/tblib-3.0.0-pyhd8ed1ab_0.conda#04e https://conda.anaconda.org/conda-forge/noarch/termcolor-2.4.0-pyhd8ed1ab_0.conda#a5033708ad9283907c3b1bc1f90d0d0d https://conda.anaconda.org/conda-forge/noarch/toml-0.10.2-pyhd8ed1ab_0.tar.bz2#f832c45a477c78bebd107098db465095 https://conda.anaconda.org/conda-forge/noarch/tomli-2.0.1-pyhd8ed1ab_0.tar.bz2#5844808ffab9ebdb694585b50ba02a96 -https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.12.5-pyha770c72_0.conda#e5dde5caf905e9d95895e05f94967e14 +https://conda.anaconda.org/conda-forge/noarch/tomlkit-0.13.0-pyha770c72_0.conda#810ba6f354ddef812d0ddc4669cc8de6 https://conda.anaconda.org/conda-forge/noarch/toolz-0.12.1-pyhd8ed1ab_0.conda#2fcb582444635e2c402e8569bb94e039 https://conda.anaconda.org/conda-forge/linux-64/tornado-6.4.1-py312h9a8786e_0.conda#fd9c83fde763b494f07acee1404c280e https://conda.anaconda.org/conda-forge/noarch/traitlets-5.14.3-pyhd8ed1ab_0.conda#3df84416a021220d8b5700c613af2dc5 @@ -235,26 +237,27 @@ https://conda.anaconda.org/conda-forge/noarch/zict-3.0.0-pyhd8ed1ab_0.conda#cf30 https://conda.anaconda.org/conda-forge/noarch/zipp-3.19.2-pyhd8ed1ab_0.conda#49808e59df5535116f6878b2a820d6f4 https://conda.anaconda.org/conda-forge/noarch/accessible-pygments-0.0.5-pyhd8ed1ab_0.conda#1bb1ef9806a9a20872434f58b3e7fc1a 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.22-h9137712_5.conda#ea86de440f848596543ff58030e5272d -https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-hf85b563_6.conda#845ddce9934691f5c34ad13d7313ba29 -https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.11.1-h91d86a7_1.conda#2dbab1d281b7e1da05eee544cbdc8af6 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-auth-0.7.22-hbd3ac97_10.conda#7ca4abcc98c7521c02f4e8809bbe40df +https://conda.anaconda.org/conda-forge/linux-64/aws-c-mqtt-0.10.4-hcd6a914_8.conda#b81c45867558446640306507498b2c6b +https://conda.anaconda.org/conda-forge/linux-64/azure-core-cpp-1.12.0-h830ed8b_0.conda#320d066f9cad598854f4af32c7c82931 https://conda.anaconda.org/conda-forge/noarch/babel-2.14.0-pyhd8ed1ab_0.conda#9669586875baeced8fc30c0826c3270e https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.3-pyha770c72_0.conda#332493000404d8411859539a5a630865 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.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e +https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-hbb29018_2.conda#b6d90276c5aee9b4407dd94eb0cd40a8 https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py312hf06ca03_0.conda#56b0ca764ce23cc54f3f7e2a7b970f6d -https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.4.0-hbdc6101_1.conda#0ba5a427a51923dcdfe1121115ac8293 +https://conda.anaconda.org/conda-forge/linux-64/cfitsio-4.4.1-hf8ad068_0.conda#1b7a01fd02d11efe0eb5a676842a7b7d https://conda.anaconda.org/conda-forge/noarch/click-plugins-1.1.1-py_0.tar.bz2#4fd2c6b53934bd7d96d1f3fdaf99b79f https://conda.anaconda.org/conda-forge/noarch/cligj-0.7.2-pyhd8ed1ab_1.tar.bz2#a29b7c141d6b2de4bb67788a5f107734 -https://conda.anaconda.org/conda-forge/linux-64/coverage-7.5.3-py312h9a8786e_0.conda#f01930d0afe8ac5f8062c98e6b8d1fd0 +https://conda.anaconda.org/conda-forge/linux-64/coverage-7.6.0-py312h41a817b_0.conda#66c68c204a3eaabc3b4221f1c4bcebbe https://conda.anaconda.org/conda-forge/linux-64/cytoolz-0.12.3-py312h98912ed_0.conda#a4fbffb84a54767266c69e3699078a00 https://conda.anaconda.org/conda-forge/noarch/docformatter-1.7.5-pyhd8ed1ab_0.conda#3a941b6083e945aa87e739a9b85c82e9 https://conda.anaconda.org/conda-forge/noarch/fire-0.6.0-pyhd8ed1ab_0.conda#e9ed10aa8fa1dd6782940b95c942a6ae https://conda.anaconda.org/conda-forge/noarch/flake8-7.1.0-pyhd8ed1ab_0.conda#2bae9d19ae945a79d8bb32d3cab9109b -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.0-py312h9a8786e_0.conda#8490346e9d5efd7a6869582aa0c95b25 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.53.1-py312h41a817b_0.conda#da921c56bcf69a8b97216ecec0cc4015 https://conda.anaconda.org/conda-forge/noarch/geopy-2.4.1-pyhd8ed1ab_1.conda#358c17429c97883b2cb9ab5f64bc161b +https://conda.anaconda.org/conda-forge/noarch/h2-4.1.0-pyhd8ed1ab_0.tar.bz2#b748fbf7060927a6e82df7cb5ee8f097 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.3-nompi_hdf9ad27_105.conda#7e1729554e209627636a0f6fabcdd115 -https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-7.2.0-pyha770c72_0.conda#e1d9f6dc77209defc283bdf61588e968 +https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-8.0.0-pyha770c72_0.conda#3286556cdd99048d198f72c3f6f69103 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.4.0-pyhd8ed1ab_0.conda#c5d3907ad8bd7bf557521a1833cf7e6d https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2#4a62c93c1b5c0b920508ae3fd285eaf5 https://conda.anaconda.org/conda-forge/noarch/isort-5.13.2-pyhd8ed1ab_0.conda#1d25ed2b95b92b026aaa795eabec8d91 @@ -265,53 +268,52 @@ https://conda.anaconda.org/conda-forge/noarch/jupyterlab_pygments-0.3.0-pyhd8ed1 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-22_linux64_openblas.conda#4b31699e0ec5de64d5896e580389c9a1 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 -https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-hac7e632_1003.conda#50c389a09b6b7babaef531eb7cb5e0ca +https://conda.anaconda.org/conda-forge/linux-64/libglu-9.0.0-ha6d2627_1004.conda#df069bea331c8486ac21814969301c1f https://conda.anaconda.org/conda-forge/linux-64/libgrpc-1.62.2-h15f2491_0.conda#8dabe607748cb3d7002ad73cd06f1325 https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-22_linux64_openblas.conda#b083767b6c877e24ee597d93b87ab838 https://conda.anaconda.org/conda-forge/linux-64/lxml-5.2.2-py312hb90d8a5_0.conda#da3e0a20f8eb75072ad036198c37be61 https://conda.anaconda.org/conda-forge/noarch/matplotlib-inline-0.1.7-pyhd8ed1ab_0.conda#779345c95648be40d22aaa89de7d4254 -https://conda.anaconda.org/conda-forge/linux-64/mypy-1.10.0-py312h9a8786e_0.conda#644f1c538810d1f250ef0fc844f3822d +https://conda.anaconda.org/conda-forge/linux-64/mypy-1.10.1-py312h9a8786e_0.conda#35504aad41d76808fa379bee8cd6882e 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.9.1-pyhd8ed1ab_0.conda#dfe0528d0f1c16c1f7c528ea5536ab30 https://conda.anaconda.org/conda-forge/noarch/partd-1.4.2-pyhd8ed1ab_0.conda#0badf9c54e24cecfb0ad2f99d680c163 https://conda.anaconda.org/conda-forge/noarch/pexpect-4.9.0-pyhd8ed1ab_0.conda#629f3203c99b32e0988910c93e77f3b6 -https://conda.anaconda.org/conda-forge/linux-64/pillow-10.3.0-py312hdcec9eb_0.conda#425bb325f970e57a047ac57c4586489d +https://conda.anaconda.org/conda-forge/linux-64/pillow-10.4.0-py312h287a98d_0.conda#59ea71eed98aee0bebbbdd3b118167c7 https://conda.anaconda.org/conda-forge/noarch/pip-24.0-pyhd8ed1ab_0.conda#f586ac1e56c8638b64f9c8122a7b8a67 https://conda.anaconda.org/conda-forge/linux-64/postgresql-16.3-h8e811e2_0.conda#e4d52462da124ed3792472f95a36fc2a https://conda.anaconda.org/conda-forge/linux-64/proj-9.4.1-hb784bbd_0.conda#c38c5246d064ef16eba065d93c46f1c6 https://conda.anaconda.org/conda-forge/noarch/prompt-toolkit-3.0.47-pyha770c72_0.conda#1247c861065d227781231950e14fe817 https://conda.anaconda.org/conda-forge/noarch/pydocstyle-6.3.0-pyhd8ed1ab_0.conda#7e23a61a7fbaedfef6eb0e1ac775c8e5 -https://conda.anaconda.org/conda-forge/noarch/pytest-8.2.2-pyhd8ed1ab_0.conda#0f3f49c22c7ef3a1195fa61dad3c43be +https://conda.anaconda.org/conda-forge/noarch/pytest-8.3.1-pyhd8ed1ab_0.conda#b6a3ab8559a42070c6b6c3063faea1ed https://conda.anaconda.org/conda-forge/noarch/python-dateutil-2.9.0-pyhd8ed1ab_0.conda#2cf4264fffb9e6eff6031c5b6884d61c https://conda.anaconda.org/conda-forge/linux-64/pyzmq-26.0.3-py312h8fd38d8_0.conda#27efa6d21e98bcab4585a6b913df7625 https://conda.anaconda.org/conda-forge/noarch/referencing-0.35.1-pyhd8ed1ab_0.conda#0fc8b52192a8898627c3efae1003e9f6 https://conda.anaconda.org/conda-forge/noarch/tinycss2-1.3.0-pyhd8ed1ab_0.conda#8662629d9a05f9cff364e31ca106c1ac https://conda.anaconda.org/conda-forge/noarch/typing-extensions-4.12.2-hd8ed1ab_0.conda#52d648bd608f5737b123f510bb5514b5 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.2.2-pyhd8ed1ab_0.conda#92cdb6fe54b78739ad70637e4f0deb07 -https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.2-pyhd8ed1ab_0.conda#7d36e7a485ea2f5829408813bdbbfb38 +https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.26.3-pyhd8ed1ab_0.conda#284008712816c64c85bf2b7fa9f3b264 https://conda.anaconda.org/conda-forge/linux-64/xerces-c-3.2.5-hac6953d_0.conda#63b80ca78d29380fe69e69412dcbe4ac https://conda.anaconda.org/conda-forge/linux-64/xorg-libxi-1.7.10-h7f98852_0.tar.bz2#e77615e5141cad5a2acaa043d1cf0ca5 https://conda.anaconda.org/conda-forge/noarch/yamale-5.2.1-pyhca7485f_0.conda#c089f90a086b6214c5606368d0d3bad0 https://conda.anaconda.org/conda-forge/noarch/yamllint-1.35.1-pyhd8ed1ab_0.conda#a1240b99a7ccd953879dc63111823986 -https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.5.10-h679ed35_3.conda#8cb40f80d08389f6aaf68cf86581ed02 -https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.6.0-hf1915f5_1.conda#fd11ea65ceb397f9587b1d88a4329d73 -https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.5.0-h94269e2_4.conda#f364272cb4c2f4ce2341067107b82865 +https://conda.anaconda.org/conda-forge/linux-64/aws-c-s3-0.6.0-h365ddd8_2.conda#22339cf124753bafda336167f80e7860 +https://conda.anaconda.org/conda-forge/linux-64/azure-identity-cpp-1.8.0-hdb0d106_1.conda#a297ffb4b505f51d0f58352c5c13971b +https://conda.anaconda.org/conda-forge/linux-64/azure-storage-common-cpp-12.6.0-he3f277c_1.conda#8a10bb068b138dd473300b5fe34a1865 https://conda.anaconda.org/conda-forge/noarch/cattrs-23.2.3-pyhd8ed1ab_0.conda#91fc4700dcce4a46d439900a132fe4e5 https://conda.anaconda.org/conda-forge/linux-64/cryptography-42.0.8-py312hbcc2302_0.conda#d6cbf583b33e9473ca9129ad21936507 -https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-hac7e632_2.conda#6e553df297f6e64668efb54302e0f139 +https://conda.anaconda.org/conda-forge/linux-64/freeglut-3.2.2-ha6d2627_3.conda#84ec3f5b46f3076be49f2cf3f1cfbf02 https://conda.anaconda.org/conda-forge/linux-64/geotiff-1.7.3-hf7fa9e8_1.conda#8ff4fa3ab0b63dc5b214a68839499e41 -https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-8.5.0-hfac3d4d_0.conda#f5126317dd0ce0ba26945e411ecc6960 -https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-7.2.0-hd8ed1ab_0.conda#3de0087b2b86443cfae650dea6ecec6f +https://conda.anaconda.org/conda-forge/linux-64/harfbuzz-9.0.0-hfac3d4d_0.conda#c7b47c64af53e8ecee01d101eeab2342 +https://conda.anaconda.org/conda-forge/noarch/importlib_metadata-8.0.0-hd8ed1ab_0.conda#5f8c8ebbe6413a7838cf6ecf14d5d31b https://conda.anaconda.org/conda-forge/noarch/jsonschema-specifications-2023.12.1-pyhd8ed1ab_0.conda#a0e4efb5f35786a05af4809a2fb1f855 https://conda.anaconda.org/conda-forge/linux-64/kealib-1.5.3-hee9dde6_1.conda#c5b7b29e2b66107553d0366538257a51 -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.25.0-h2736e30_0.conda#1bbc13a65b92eafde06dbdf0ef3658cd +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-2.26.0-h26d7fe4_0.conda#7b9d4c93870fb2d644168071d4d76afb https://conda.anaconda.org/conda-forge/linux-64/libnetcdf-4.9.2-nompi_h135f659_114.conda#a908e463c710bd6b10a9eaa89fdf003c -https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h6fbd9c4_7.conda#e39bdbe437c74e43b534e21290ca3897 +https://conda.anaconda.org/conda-forge/linux-64/libspatialite-5.1.0-h15fa968_8.conda#48502f34f5ba86c1ce192cb30f959dc9 https://conda.anaconda.org/conda-forge/linux-64/numpy-1.26.4-py312heda63a1_0.conda#d8285bea2a350f63fab23bf460221f3f -https://conda.anaconda.org/conda-forge/linux-64/poppler-24.04.0-hb6cd0d7_0.conda#d19eed746748f1d44b575662f2bcfe95 +https://conda.anaconda.org/conda-forge/linux-64/poppler-24.07.0-hb0d391f_0.conda#561842bc59112340fa1f5f1ed06ae4a2 https://conda.anaconda.org/conda-forge/noarch/pybtex-0.24.0-pyhd8ed1ab_2.tar.bz2#2099b86a7399c44c0c61cdb6de6915ba -https://conda.anaconda.org/conda-forge/noarch/pylint-3.2.3-pyhd8ed1ab_0.conda#206e71eea41f956fd1bb606d6b0c87fd +https://conda.anaconda.org/conda-forge/noarch/pylint-3.2.5-pyhd8ed1ab_0.conda#40754d4950fb1567f358d635de8a5f19 https://conda.anaconda.org/conda-forge/linux-64/pyproj-3.6.1-py312h5d05ceb_7.conda#b53ddc25da04839cc62b0b158a7ecb38 https://conda.anaconda.org/conda-forge/noarch/pytest-cov-5.0.0-pyhd8ed1ab_0.conda#c54c0107057d67ddf077751339ec2c63 https://conda.anaconda.org/conda-forge/noarch/pytest-env-1.1.3-pyhd8ed1ab_0.conda#1dbdf019d740419852c4a7803fff49d9 @@ -320,86 +322,102 @@ https://conda.anaconda.org/conda-forge/noarch/pytest-mock-3.14.0-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/noarch/pytest-mypy-0.10.3-pyhd8ed1ab_0.conda#37fd5d5468805e017650a395ca779f38 https://conda.anaconda.org/conda-forge/noarch/pytest-xdist-3.6.1-pyhd8ed1ab_0.conda#b39568655c127a9c4a44d178ac99b6d0 https://conda.anaconda.org/conda-forge/noarch/rdflib-7.0.0-pyhd8ed1ab_0.conda#44d14ef95495b3d4438f28998e0296a9 -https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 https://conda.anaconda.org/conda-forge/noarch/stack_data-0.6.2-pyhd8ed1ab_0.conda#e7df0fdd404616638df5ece6e69ba7af -https://conda.anaconda.org/conda-forge/noarch/types-requests-2.32.0.20240602-pyhd8ed1ab_0.conda#de4dfa59fdd7513b1d69c2b2d9f1acc8 https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py312h8572e83_4.conda#52c9e25ee0a32485a102eeecdb7eef52 https://conda.anaconda.org/conda-forge/noarch/yapf-0.40.1-pyhd8ed1ab_0.conda#f269942e802d5e148632143d4c37acc9 -https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.26.12-h8bc9c4d_0.conda#ec9824a9e18425707af48d21820970f1 -https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.10.0-h00ab1b0_1.conda#1e63d3866554a4d2e3d1cba5f21a2841 +https://conda.anaconda.org/conda-forge/linux-64/zstandard-0.23.0-py312h3483029_0.conda#eab52e88c858d87cf5a069f79d10bb50 +https://conda.anaconda.org/conda-forge/linux-64/aws-crt-cpp-0.27.3-hda66527_2.conda#734875312c8196feecc91f89856da612 +https://conda.anaconda.org/conda-forge/linux-64/azure-storage-blobs-cpp-12.11.0-ha67cba7_1.conda#f03bba57b85a5b3ac443a871787fc429 https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.4-py312h085067d_0.conda#864d9e92f012bcc49650428d5343c98a https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.1-py312h8572e83_0.conda#12c6a831ef734f0b2dd4caff514cbb7f -https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.6.2-pyhd8ed1ab_0.conda#048ca0ec2cd1f3995d2d36dec0efd99a -https://conda.anaconda.org/conda-forge/noarch/identify-2.5.36-pyhd8ed1ab_0.conda#ba68cb5105760379432cebc82b45af40 -https://conda.anaconda.org/conda-forge/noarch/ipython-8.25.0-pyh707e725_0.conda#98466a37c08f3bdbb500786271859517 +https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.7.1-pyhd8ed1ab_0.conda#80f7ce024289c333fdc5ad54a194fc86 +https://conda.anaconda.org/conda-forge/noarch/identify-2.6.0-pyhd8ed1ab_0.conda#f80cc5989f445f23b1622d6c455896d9 +https://conda.anaconda.org/conda-forge/noarch/ipython-8.26.0-pyh707e725_0.conda#f64d3520d5d00321c10f4dabb5b903f3 https://conda.anaconda.org/conda-forge/linux-64/jasper-4.2.4-h536e39c_0.conda#9518ab7016cf4564778aef08b6bd8792 -https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.22.0-pyhd8ed1ab_0.conda#b9661a4b1200d6bc7d8a4cdafdc91468 +https://conda.anaconda.org/conda-forge/noarch/jsonschema-4.23.0-pyhd8ed1ab_0.conda#da304c192ad59975202859b367d0f6a2 https://conda.anaconda.org/conda-forge/noarch/jupyter_client-8.6.2-pyhd8ed1ab_0.conda#3cdbb2fa84490e5fd44c9f9806c0d292 -https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.25.0-h3d9a0c8_0.conda#5e3f7cfcfd74065847da8f8598ff81d3 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-core-3.9.1-h1d1841c_7.conda#85fcff96b59d3e3a812601d713931d4f +https://conda.anaconda.org/conda-forge/linux-64/libgoogle-cloud-storage-2.26.0-ha262f82_0.conda#89b53708fd67762b26c38c8ecc5d323d https://conda.anaconda.org/conda-forge/linux-64/netcdf-fortran-4.6.1-nompi_h228c76a_104.conda#91bc3ac73308181d55a09d9e4aeb4496 https://conda.anaconda.org/conda-forge/linux-64/pandas-2.1.4-py312hfb8ada1_0.conda#d0745ae74c2b26571b692ddde112eebb -https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h84a9a3c_0.conda#7c51e110b2f059c0843269d3324e4b22 -https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed -https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.0.0-pyhd8ed1ab_0.conda#b50aec2c744a5c493c09cce9e2e7533e +https://conda.anaconda.org/conda-forge/linux-64/pango-1.54.0-h4c5309f_1.conda#7df02e445367703cd87a574046e3a6f0 +https://conda.anaconda.org/conda-forge/noarch/pyopenssl-24.2.1-pyhd8ed1ab_0.conda#3af1942211bc9c25d0160a8975203254 https://conda.anaconda.org/conda-forge/noarch/pytest-html-4.1.1-pyhd8ed1ab_0.conda#4d2040212307d18392a2687772b3a96d -https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.1-pyhd8ed1ab_0.conda#c6089540fed51a9a829aa19590fa925b -https://conda.anaconda.org/conda-forge/linux-64/scipy-1.13.1-py312hc2bc53b_0.conda#864b2399a9c998e17d1a9a4e0c601285 -https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.4-py312ha5b4d35_1.conda#1248b799f811d8ea215de88f53ae7ffc -https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.329-hf74b5d1_5.conda#3d82493d6b434cc47fc9302f3cc11a09 -https://conda.anaconda.org/conda-forge/noarch/bokeh-3.4.1-pyhd8ed1ab_0.conda#0f8e0831bbf38d83973438ce9af9af9a +https://conda.anaconda.org/conda-forge/linux-64/scipy-1.14.0-py312hc2bc53b_1.conda#eae80145f63aa04a02dda456d4883b46 +https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.5-py312h8413631_0.conda#3e67354b24c7ee057ddee367f310ad3e +https://conda.anaconda.org/conda-forge/noarch/urllib3-2.2.2-pyhd8ed1ab_1.conda#e804c43f58255e977093a2298e442bb8 +https://conda.anaconda.org/conda-forge/linux-64/aws-sdk-cpp-1.11.329-h46c3b66_9.conda#c840f07ec58dc0b06041e7f36550a539 +https://conda.anaconda.org/conda-forge/linux-64/azure-storage-files-datalake-cpp-12.10.0-h29b5301_1.conda#bb35c23b178fc17b9e4458766f91da7f +https://conda.anaconda.org/conda-forge/noarch/bokeh-3.5.0-pyhd8ed1ab_0.conda#e49dc1da9805d8953e1326e58127c7bf https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312h085067d_5.conda#b40cdf87aee69ccf162022579cb99afb -https://conda.anaconda.org/conda-forge/noarch/distributed-2024.6.2-pyhd8ed1ab_0.conda#eecb4c188864376d2b45a5afc4bcb2fa -https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.35.0-he84ddb8_0.conda#2d01dfbe537478e7a1a495b9639edd45 +https://conda.anaconda.org/conda-forge/noarch/distributed-2024.7.1-pyhd8ed1ab_0.conda#0a8e18bb76f2dd6ce7e9b1fb9dbba78a +https://conda.anaconda.org/conda-forge/linux-64/eccodes-2.36.0-h762793a_0.conda#6d8c86d0368625b6503d696db70ea041 https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.1-nompi_h0a5817f_2.conda#e23c62f75f67166cf4ca137fc8bcdce7 -https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda#410f86e58e880dcc7b0e910a8e89c05c -https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.1-hadf69e7_0.conda#73fc255d740d23da4f554b58dc4909fd -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.4-py312h20ab3a6_2.conda#fbfe798f83f0d66410903ad8f40d5283 +https://conda.anaconda.org/conda-forge/linux-64/gdal-3.9.1-py312h3d1e6dc_7.conda#2a6b88dad299a75916628cc8ffef5019 +https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h6470451_5.conda#1483ba046164be27df7f6eddbcec3a12 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-fits-3.9.1-hdd6600c_7.conda#114cd0cf835b0b396ff90a7e428ec832 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-grib-3.9.1-h5f34788_7.conda#7a40a828cc1a4a24050b0ad76c603c21 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-hdf4-3.9.1-ha39a594_7.conda#1e84b86bbbcc9ba7bf978cd941fc96f1 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-hdf5-3.9.1-ha2ed5f0_7.conda#ffd276b53ef7fb95e0f391b1e21b7918 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-jp2openjpeg-3.9.1-h2ebfdf0_7.conda#59a91c96e5036c64413da8bacbd7537a +https://conda.anaconda.org/conda-forge/linux-64/libgdal-pdf-3.9.1-h562c687_7.conda#75b565ed397359019a106a51e6ad909e +https://conda.anaconda.org/conda-forge/linux-64/libgdal-pg-3.9.1-he047751_7.conda#1cd7a1b13dabf9cc8a6911679938345f +https://conda.anaconda.org/conda-forge/linux-64/libgdal-postgisraster-3.9.1-he047751_7.conda#8e7addc813d9499ed2b554925bcb655a +https://conda.anaconda.org/conda-forge/linux-64/libgdal-xls-3.9.1-h062f1c4_7.conda#443029b63038425649158dfa3678b54d +https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.58.2-h9564881_1.conda#c6a47e6f551890e82e92e4c1b84be353 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.9.1-py312h9201f00_0.conda#e1dc3a7d999666f5c58cbb391940e235 https://conda.anaconda.org/conda-forge/noarch/myproxyclient-2.1.1-pyhd8ed1ab_0.conda#bcdbeb2b693eba886583a907840c6421 https://conda.anaconda.org/conda-forge/noarch/nbformat-5.10.4-pyhd8ed1ab_0.conda#0b57b5368ab7fc7cdc9e3511fa867214 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.7.1-nompi_py312h1ef7fb6_101.conda#c67cc8e3a34c5cb8920c79918112e96f https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.7.1-pyha770c72_0.conda#724bc4489c1174fc8e3233b0624fa51f https://conda.anaconda.org/conda-forge/linux-64/python-stratify-0.3.0-py312h085067d_2.conda#1e88f5023d2af511e48e4489b45b9f9b +https://conda.anaconda.org/conda-forge/noarch/requests-2.32.3-pyhd8ed1ab_0.conda#5ede4753180c7a550a443c430dc8ab52 +https://conda.anaconda.org/conda-forge/noarch/types-requests-2.32.0.20240712-pyhd8ed1ab_1.conda#a0493fcf860b2ca37d1c1d0f2952d63b https://conda.anaconda.org/conda-forge/noarch/xarray-2024.6.0-pyhd8ed1ab_1.conda#a6775bba72ade3fd777ccac04902202c https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.23.0-py312h1d6d2e6_1.conda#6392d3ce615ab0f32bc39b07f8f4c300 -https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.9.1-pyhd8ed1ab_0.conda#9b1ddfcc35856fbd69e193b945b7d7f2 +https://conda.anaconda.org/conda-forge/noarch/cf_xarray-0.9.4-pyhd8ed1ab_0.conda#c8b6a3126f659e311d3b5c61be254d95 https://conda.anaconda.org/conda-forge/noarch/dask-jobqueue-0.8.5-pyhd8ed1ab_0.conda#abfb434fb6654f83d740428863ec85a8 -https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhca7485f_3.conda#1d43833138d38ad8324700ce45a7099a https://conda.anaconda.org/conda-forge/noarch/esmpy-8.6.1-pyhc1e730c_0.conda#25a9661177fd68bfdb4314fd658e5c3b https://conda.anaconda.org/conda-forge/linux-64/graphviz-11.0.0-hc68bbd7_0.conda#52a531ef95358086a56086c45d97ab75 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-16.1.0-h9102155_9_cpu.conda#b0b7ce228075d1411a2ccb7e21f1b122 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-16.1.0-h34456a7_14_cpu.conda#9f76c33cbcbacc87a9555da65713681c +https://conda.anaconda.org/conda-forge/linux-64/libgdal-kea-3.9.1-h2b45729_7.conda#ee8bf923231d382e59270912fe27c719 +https://conda.anaconda.org/conda-forge/linux-64/libgdal-netcdf-3.9.1-h94e7027_7.conda#1cfe8f3c7942f8054995b9071d8508b5 https://conda.anaconda.org/conda-forge/noarch/nbclient-0.10.0-pyhd8ed1ab_0.conda#15b51397e0fe8ea7d7da60d83eb76ebc https://conda.anaconda.org/conda-forge/noarch/nc-time-axis-1.4.1-pyhd8ed1ab_0.tar.bz2#281b58948bf60a2582de9e548bcc5369 -https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.0-py312h085067d_2.conda#158bdc63daac04bcc2991f6e4a5fec5e -https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.24.1-h73c5a7c_0.conda#edd614d10aede2a6e8643784992943e1 +https://conda.anaconda.org/conda-forge/noarch/pooch-1.8.2-pyhd8ed1ab_0.conda#8dab97d8a9616e07d779782995710aed +https://conda.anaconda.org/conda-forge/linux-64/python-eccodes-1.7.1-py312h085067d_0.conda#5f96475aa30552797f8099ccee24feaa +https://conda.anaconda.org/conda-forge/noarch/requests-cache-1.2.1-pyhd8ed1ab_0.conda#c6089540fed51a9a829aa19590fa925b +https://conda.anaconda.org/conda-forge/linux-64/tiledb-2.24.2-hc55ee95_2.conda#bc6b3a6693d53e33dea28c89e02745dd +https://conda.anaconda.org/conda-forge/noarch/esgf-pyclient-0.3.1-pyhca7485f_3.conda#1d43833138d38ad8324700ce45a7099a https://conda.anaconda.org/conda-forge/noarch/iris-3.9.0-pyha770c72_0.conda#efaf150eb009f04efa58f1401c767192 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-16.1.0-hac33072_9_cpu.conda#e5c246be982ab7cc133b93870b264a25 -https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.9.0-h471f4ab_7.conda#cc5204b282d79894ac8e441e2a82ebbd -https://conda.anaconda.org/conda-forge/linux-64/libparquet-16.1.0-h6a7eafb_9_cpu.conda#4b42538e4ec9092564866d22d1120bf4 +https://conda.anaconda.org/conda-forge/linux-64/libarrow-acero-16.1.0-he02047a_14_cpu.conda#491c2677e91ada55bfe283dbd14d1aac +https://conda.anaconda.org/conda-forge/linux-64/libgdal-tiledb-3.9.1-hfcb00c0_7.conda#d8f858536ce539f884b7eeff249a13b2 +https://conda.anaconda.org/conda-forge/linux-64/libparquet-16.1.0-h9e5060d_14_cpu.conda#9fc891cd8f6bd24ba3db2c12fd1528e9 https://conda.anaconda.org/conda-forge/noarch/nbconvert-core-7.16.4-pyhd8ed1ab_1.conda#e2d2abb421c13456a9a9f80272fdf543 -https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.7.1-pyhd8ed1ab_0.conda#447d61cb83a9c3a3916fba1bc3cff0bf -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-16.1.0-py312h70856f0_3_cpu.conda#7f93c5a99083e2a26a301db64f44acb8 -https://conda.anaconda.org/conda-forge/linux-64/pydot-2.0.0-py312h7900ff3_0.conda#a3628f9a0ca8573314dc6f94f40a0419 -https://conda.anaconda.org/conda-forge/linux-64/gdal-3.9.0-py312h86af8fa_7.conda#0ccfa8db498a5983d6081a454811e497 +https://conda.anaconda.org/conda-forge/noarch/py-cordex-0.8.0-pyhd8ed1ab_0.conda#fba377622e74ee0bbeb8ccae9fa593d3 +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-core-16.1.0-py312h70856f0_4_cpu.conda#6971b04df592bd625eebd5bfb1d9fc93 +https://conda.anaconda.org/conda-forge/linux-64/pydot-3.0.1-py312h7900ff3_0.conda#d09da44e1f00d5f99adadd5aa6244c2f https://conda.anaconda.org/conda-forge/noarch/iris-grib-0.19.0-pyhd8ed1ab_0.conda#6582121c3b731b3715cd021f6a42665e -https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-16.1.0-hac33072_9_cpu.conda#45960fd843ea7b95d907e8aa1f49337d +https://conda.anaconda.org/conda-forge/linux-64/libarrow-dataset-16.1.0-he02047a_14_cpu.conda#4381fff40c7bcf7ca0142ed4b0120dbc +https://conda.anaconda.org/conda-forge/linux-64/libgdal-3.9.1-ha770c72_7.conda#d077b243089f0bf40ce8d81981349cda https://conda.anaconda.org/conda-forge/noarch/nbconvert-pandoc-7.16.4-hd8ed1ab_1.conda#37cec2cf68f4c09563d8bc833791096b https://conda.anaconda.org/conda-forge/noarch/prov-2.0.0-pyhd3deb0d_0.tar.bz2#aa9b3ad140f6c0668c646f32e20ccf82 https://conda.anaconda.org/conda-forge/linux-64/fiona-1.9.6-py312h32ad294_3.conda#6da62c5c06a6416e0130220e4f418bb0 -https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-16.1.0-h7e0c224_9_cpu.conda#b1cebbb3160bbafc6cbf7eb79354f32a +https://conda.anaconda.org/conda-forge/linux-64/libarrow-substrait-16.1.0-hc9a23c6_14_cpu.conda#c35b4b76394d7414888fd4d66d7ae96a https://conda.anaconda.org/conda-forge/noarch/nbconvert-7.16.4-hd8ed1ab_1.conda#ab83e3b9ca2b111d8f332e9dc8b2170f -https://conda.anaconda.org/conda-forge/linux-64/pyarrow-16.1.0-py312h9cebb41_3.conda#185d19647c3f7ddbdad8331911042763 -https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.5-pyhd8ed1ab_0.conda#9181acab26040bf904cf2c6440ca2d19 +https://conda.anaconda.org/conda-forge/linux-64/pyarrow-16.1.0-py312h9cebb41_4.conda#2097b6ae7186e10c9aab1228636b804f +https://conda.anaconda.org/conda-forge/noarch/dask-expr-1.1.9-pyhd8ed1ab_0.conda#1fdd81b57dd1e4a38b6e57f1138f4e61 https://conda.anaconda.org/conda-forge/noarch/pyarrow-hotfix-0.6-pyhd8ed1ab_0.conda#ccc06e6ef2064ae129fab3286299abda -https://conda.anaconda.org/conda-forge/noarch/dask-2024.6.2-pyhd8ed1ab_0.conda#0af43d16240caf6aedefd7a4041ae64c +https://conda.anaconda.org/conda-forge/noarch/dask-2024.7.1-pyhd8ed1ab_0.conda#fa1908a0e13396792ff849a34171d90e https://conda.anaconda.org/conda-forge/noarch/iris-esmf-regrid-0.10.0-pyhd8ed1ab_0.conda#a5ccce1a87da81d6c690cd11ae0687a2 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.4-pyhd8ed1ab_0.conda#9dc80eaeff56fb67dbf4f871b81bc13a -https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.3-pyhd8ed1ab_0.conda#55e445f4fcb07f2471fb0e1102d36488 +https://conda.anaconda.org/conda-forge/noarch/pydata-sphinx-theme-0.15.4-pyhd8ed1ab_0.conda#c7c50dd5192caa58a05e6a4248a27acb https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.8-pyhd8ed1ab_0.conda#611a35a27914fac3aa37611a6fe40bb5 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-devhelp-1.0.6-pyhd8ed1ab_0.conda#d7e4954df0d3aea2eacc7835ad12671d -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.5-pyhd8ed1ab_0.conda#7e1e7437273682ada2ed5e9e9714b140 -https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.7-pyhd8ed1ab_0.conda#26acae54b06f178681bfb551760f5dd1 -https://conda.anaconda.org/conda-forge/noarch/sphinx-7.3.7-pyhd8ed1ab_0.conda#7b1465205e28d75d2c0e1a868ee00a67 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-htmlhelp-2.0.6-pyhd8ed1ab_0.conda#d6f4b617daa8c677f60c06a3a61e2743 +https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-qthelp-1.0.8-pyhd8ed1ab_0.conda#179912c661d6aa9fe794e81c854f8d9f +https://conda.anaconda.org/conda-forge/noarch/sphinx-7.4.7-pyhd8ed1ab_0.conda#c568e260463da2528ecfd7c5a0b41bbd https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-serializinghtml-1.1.10-pyhd8ed1ab_0.conda#e507335cb4ca9cff4c3d0fa9cdab255e # pip antlr4-python3-runtime @ https://files.pythonhosted.org/packages/29/14/8ac135ec7cc9db3f768e2d032776718c6b23f74e63543f0974b4873500b2/antlr4-python3-runtime-4.7.2.tar.gz#sha256=168cdcec8fb9152e84a87ca6fd261b3d54c8f6358f42ab3b813b14a7193bb50b # pip scitools-iris @ https://files.pythonhosted.org/packages/2a/4f/9929f74388dbc6334c3342ff5f45a862322ad1789e32d6ab292d99d81f51/scitools_iris-3.9.0-py3-none-any.whl#sha256=1a9acfb872b50554de269d403a79e01e169c9973d4ec30a46b824c8ec710a818 diff --git a/doc/conf.py b/doc/conf.py index 3f443ced03..b417b69640 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -81,6 +81,11 @@ # Show type hints in function signature AND docstring autodoc_typehints = 'both' +# See https://github.com/sphinx-doc/sphinx/issues/12589 +suppress_warnings = [ + 'autosummary.import_cycle', +] + # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] diff --git a/doc/quickstart/find_data.rst b/doc/quickstart/find_data.rst index 613e9c9631..91d9d06dfb 100644 --- a/doc/quickstart/find_data.rst +++ b/doc/quickstart/find_data.rst @@ -557,6 +557,64 @@ explained in :ref:`extra_facets`, and which content is :download:`available here `. These multi-variable files must also undergo some data selection. +.. _read_access-esm: + +ACCESS-ESM +^^^^^^^^^^ + +ESMValTool can read native `ACCESS-ESM `__ +model output. + +.. warning:: + + This is the first version of ACCESS-ESM CMORizer for ESMValCore. Currently, + Supported variables: ``pr``, ``ps``, ``psl``, ``rlds``, ``tas``, ``ta``, ``va``, + ``ua``, ``zg``, ``hus``, ``clt``, ``rsus``, ``rlus``. + +The default naming conventions for input directories and files for ACCESS output are + +* input directories: ``{institute}/{sub_dataset}/{exp}/{modeling_realm}/netCDF`` +* input files: ``{sub_dataset}.{special_attr}-*.nc`` + +.. hint:: + + We only provide one default `input_dir` since this is how ACCESS-ESM native data was + stored on NCI. Users can modify this path in the :ref:`config-developer` to match their local file structure. + + +Thus, example dataset entries could look like this: + +.. code-block:: yaml + + dataset: + - {project: ACCESS, mip: Amon, dataset:ACCESS_ESM1_5, sub_dataset: HI-CN-05, + exp: history, modeling_realm: atm, special_attr: pa, start_year: 1986, end_year: 1986} + + +Similar to any other fix, the ACCESS-ESM fix allows the use of :ref:`extra +facets`. +By default, the file :download:`access-mappings.yml +` is used for that +purpose. +For some variables, extra facets are necessary; otherwise ESMValCore cannot +read them properly. +Supported keys for extra facets are: + +==================== ====================================== ================================= +Key Description Default value if not specified +==================== ====================================== ================================= +``raw_name`` Variable name of the variable in the CMOR variable name of the + raw input file corresponding variable +``modeling_realm`` Realm attribute include `atm`, `ice` No default (needs to be + and `oce` specified in extra facets or + recipe if default DRS is used) +```special_attr`` A special attribute in the filename No default + `ACCESS-ESM` raw data, it's related to + frquency of raw data +``sub_dataset`` Part of the ACCESS-ESM raw dataset No default + root, need to specify if you want to + use the cmoriser +==================== ====================================== ================================= .. _data-retrieval: diff --git a/doc/quickstart/install.rst b/doc/quickstart/install.rst index 83e39b97c9..3e7478a952 100644 --- a/doc/quickstart/install.rst +++ b/doc/quickstart/install.rst @@ -22,7 +22,7 @@ and install ESMValCore into it with a single command: .. code-block:: bash - conda create --name esmvalcore -c conda-forge esmvalcore 'python=3.10' + conda create --name esmvalcore -c conda-forge esmvalcore Don't forget to activate the newly created environment after the installation: diff --git a/environment.yml b/environment.yml index 8796a8fa4e..6ccab6b155 100644 --- a/environment.yml +++ b/environment.yml @@ -18,7 +18,6 @@ dependencies: - fire - geopy - humanfriendly - - importlib_metadata # required for Python < 3.10 - iris >=3.9.0 - iris-esmf-regrid >=0.10.0 # github.com/SciTools-incubator/iris-esmf-regrid/pull/342 - iris-grib @@ -37,7 +36,7 @@ dependencies: - psutil - py-cordex - pybtex - - python >=3.9 + - python >=3.10 - python-stratify >=0.3 - pyyaml - requests diff --git a/esmvalcore/_task.py b/esmvalcore/_task.py index 2b785bc8d6..d8d074c47c 100644 --- a/esmvalcore/_task.py +++ b/esmvalcore/_task.py @@ -422,7 +422,7 @@ def write_settings(self): settings_copy.pop(sett, None) filename = run_dir / 'settings.yml' - filename.write_text(yaml.safe_dump(settings_copy)) + filename.write_text(yaml.safe_dump(settings_copy, sort_keys=False)) # If running an NCL script: if Path(self.script).suffix.lower() == '.ncl': diff --git a/esmvalcore/cmor/_fixes/access/__init__.py b/esmvalcore/cmor/_fixes/access/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/esmvalcore/cmor/_fixes/access/_base_fix.py b/esmvalcore/cmor/_fixes/access/_base_fix.py new file mode 100644 index 0000000000..659fffd364 --- /dev/null +++ b/esmvalcore/cmor/_fixes/access/_base_fix.py @@ -0,0 +1,29 @@ +"""Fix base classes for ACCESS-ESM on-the-fly CMORizer.""" + +import logging + +from iris.cube import CubeList + +from esmvalcore.cmor._fixes.native_datasets import NativeDatasetFix + +logger = logging.getLogger(__name__) + + +class AccessFix(NativeDatasetFix): + """Fixes functions.""" + + def fix_coord_system(self, cube): + """Delete coord_system to make CubeList able to merge.""" + for dim in cube.dim_coords: + if dim.coord_system is not None: + cube.coord(dim.standard_name).coord_system = None + + def get_cubes_from_multivar(self, cubes): + """Get cube before calculate from multiple variables.""" + name_list = self.extra_facets.get('raw_name', + self.vardef.short_name) + + data_list = [] + for name in name_list: + data_list.append(self.get_cube(cubes, name)) + return CubeList(data_list) diff --git a/esmvalcore/cmor/_fixes/access/access_esm1_5.py b/esmvalcore/cmor/_fixes/access/access_esm1_5.py new file mode 100644 index 0000000000..6b8bc662e7 --- /dev/null +++ b/esmvalcore/cmor/_fixes/access/access_esm1_5.py @@ -0,0 +1,127 @@ +"""On-the-fly CMORizer for ACCESS-ESM.""" +import logging + +from iris.cube import CubeList + +from ._base_fix import AccessFix + +logger = logging.getLogger(__name__) + + +class AllVars(AccessFix): + """Fixes for all variables.""" + + def fix_metadata(self, cubes): + """Fix metadata. + + Parameters + ---------- + cubes : iris.cube.CubeList + Input cubes. + + Returns + ------- + iris.cube.CubeList + """ + if len(cubes) == 1: + cube = cubes[0] + else: + cube = self.get_cube(cubes) + + # Fix coordinates + self.fix_scalar_coords(cube) + self.fix_var_metadata(cube) + self.fix_lon_metadata(cube) + self.fix_lat_metadata(cube) + + # Fix coordinate 'height' + if 'height_0' in [var.var_name for var in cube.coords()]: + self.fix_height_metadata(cube) + # Fix coordinate 'pressure' + if 'pressure' in [var.var_name for var in cube.coords()]: + self.fix_plev_metadata(cube, coord='pressure') + + # Fix coord system + self.fix_coord_system(cube) + + return CubeList([cube]) + + +class Rlus(AccessFix): + """Fixes for Rlus.""" + + def fix_rlus_data(self, cubes): + """Fix rlus data.""" + return cubes[0] - cubes[1] + cubes[2] - cubes[3] + + def fix_metadata(self, cubes): + """Fix metadata. + + Parameters + ---------- + cubes : iris.cube.CubeList + Input cubes. + + Returns + ------- + iris.cube.CubeList + """ + cubes = self.get_cubes_from_multivar(cubes) + + cube = self.fix_rlus_data(cubes) + + return CubeList([cube]) + + +class Rsus(AccessFix): + """Fixes for Rsus.""" + + def fix_rsus_data(self, cubes): + """Fix rsus data.""" + return cubes[0] - cubes[1] + + def fix_metadata(self, cubes): + """Fix metadata. + + Parameters + ---------- + cubes : iris.cube.CubeList + Input cubes. + + Returns + ------- + iris.cube.CubeList + """ + cubes = self.get_cubes_from_multivar(cubes) + + cube = self.fix_rsus_data(cubes) + + return CubeList([cube]) + + +class Tas(AccessFix): + """Fixes for Rsus.""" + + def fix_metadata(self, cubes): + """Fix metadata. + + Parameters + ---------- + cubes : iris.cube.CubeList + Input cubes. + + Returns + ------- + iris.cube.CubeList + """ + cube = self.get_cube(cubes) + + self.fix_height_metadata(cube) + self.fix_height_value(cube) + + return CubeList([cube]) + + def fix_height_value(self, cube): + """Fix height value to make it comparable to other dataset.""" + if cube.coord('height').points[0] != 2: + cube.coord('height').points = [2] diff --git a/esmvalcore/cmor/tables/custom/CMOR_tosStderr.dat b/esmvalcore/cmor/tables/custom/CMOR_tosStderr.dat new file mode 100644 index 0000000000..31756d4cde --- /dev/null +++ b/esmvalcore/cmor/tables/custom/CMOR_tosStderr.dat @@ -0,0 +1,26 @@ +SOURCE: CMIP5 +!============ +variable_entry: tosStderr +!============ +modeling_realm: ocean +!---------------------------------- +! Variable attributes: +!---------------------------------- +standard_name: +units: K +cell_methods: time: mean +cell_measures: area: areacello +long_name: Sea Surface Temperature Error +comment: +!---------------------------------- +! Additional variable information: +!---------------------------------- +dimensions: longitude latitude time +out_name: tosStderr +type: real +valid_min: 0 +valid_max: +ok_min_mean_abs: 0 +ok_max_mean_abs: +!---------------------------------- +! diff --git a/esmvalcore/config-developer.yml b/esmvalcore/config-developer.yml index 9d5f1bc62f..c81324142a 100644 --- a/esmvalcore/config-developer.yml +++ b/esmvalcore/config-developer.yml @@ -194,3 +194,14 @@ CESM: output_file: '{project}_{dataset}_{case}_{gcomp}_{scomp}_{type}_{mip}_{short_name}' cmor_type: 'CMIP6' cmor_default_table_prefix: 'CMIP6_' + +ACCESS: + cmor_strict: false + input_dir: + default: + - '{dataset}/{sub_dataset}/{exp}/{modeling_realm}/netCDF' + input_file: + default: '{sub_dataset}.{special_attr}-*.nc' + output_file: '{project}_{dataset}_{mip}_{exp}_{institute}_{sub_dataset}_{special_attr}_{short_name}' + cmor_type: 'CMIP6' + cmor_default_table_prefix: 'CMIP6_' diff --git a/esmvalcore/config/extra_facets/access-mappings.yml b/esmvalcore/config/extra_facets/access-mappings.yml new file mode 100644 index 0000000000..9d4eb0621b --- /dev/null +++ b/esmvalcore/config/extra_facets/access-mappings.yml @@ -0,0 +1,68 @@ +# Extra facets for native ACCESS model output + +# A complete list of supported keys is given in the documentation (see +# ESMValCore/doc/quickstart/find_data.rst). +--- + +ACCESS-ESM1-5: + + '*': + + tas: + raw_name: fld_s03i236 + modeling_realm: atm + + pr: + raw_name: fld_s05i216 + modeling_realm: atm + + ps: + raw_name: fld_s00i409 + modeling_realm: atm + + clt: + raw_name: fld_s02i204 + modeling_realm: atm + + psl: + raw_name: fld_s16i222 + modeling_realm: atm + + hus: + raw_name: fld_s30i205 + modeling_realm: atm + + zg: + raw_name: fld_s30i207 + modeling_realm: atm + + va: + raw_name: fld_s30i202 + modeling_realm: atm + + ua: + raw_name: fld_s30i201 + modeling_realm: atm + + ta: + raw_name: fld_s30i204 + modeling_realm: atm + + rlus: + raw_name: + - fld_s02i207 + - fld_s02i201 + - fld_s03i332 + - fld_s02i205 + modeling_realm: atm + + rlds: + raw_name: fld_s02i207 + modeling_realm: atm + + rsus: + raw_name: + - fld_s01i235 + - fld_s01i201 + modeling_realm: atm + diff --git a/esmvalcore/preprocessor/_derive/__init__.py b/esmvalcore/preprocessor/_derive/__init__.py index 27bffa38d7..42eac77aa3 100644 --- a/esmvalcore/preprocessor/_derive/__init__.py +++ b/esmvalcore/preprocessor/_derive/__init__.py @@ -7,6 +7,8 @@ import iris +from esmvalcore.preprocessor._units import convert_units + logger = logging.getLogger(__name__) @@ -18,7 +20,6 @@ def _get_all_derived_variables(): dict All derived variables with `short_name` (keys) and the associated python classes (values). - """ derivers = {} for path in Path(__file__).parent.glob('[a-z]*.py'): @@ -50,7 +51,6 @@ def get_required(short_name, project): ------- list List of dictionaries (including at least the key `short_name`). - """ if short_name.lower() not in ALL_DERIVED_VARIABLES: raise NotImplementedError( @@ -82,7 +82,6 @@ def derive(cubes, short_name, long_name, units, standard_name=None): ------- iris.cube.Cube The new derived variable. - """ if short_name == cubes[0].var_name: return cubes[0] @@ -116,11 +115,13 @@ def derive(cubes, short_name, long_name, units, standard_name=None): "'%s', automatically setting them to '%s'. This might lead to " "incorrect data", short_name, cube.units, units) cube.units = units - elif cube.units.is_convertible(units): - cube.convert_units(units) else: - raise ValueError( - f"Units '{cube.units}' after executing derivation script of " - f"'{short_name}' cannot be converted to target units '{units}'") + try: + convert_units(cube, units) + except ValueError as exc: + raise ValueError( + f"Units '{cube.units}' after executing derivation script of " + f"'{short_name}' cannot be converted to target units '{units}'" + ) from exc return cube diff --git a/setup.cfg b/setup.cfg index 3bf09d26f9..e558e6860e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -36,7 +36,7 @@ include_trailing_comma = true [mypy] # see mypy.readthedocs.io/en/stable/command_line.html -python_version = 3.9 +python_version = 3.12 ignore_missing_imports = True files = esmvalcore, tests diff --git a/setup.py b/setup.py index d1d6e49b55..1964fad345 100755 --- a/setup.py +++ b/setup.py @@ -39,7 +39,6 @@ 'fire', 'geopy', 'humanfriendly', - "importlib_metadata;python_version<'3.10'", 'iris-grib', 'isodate', 'jinja2', @@ -218,9 +217,9 @@ def read_description(filename): 'Natural Language :: English', 'Operating System :: POSIX :: Linux', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', 'Topic :: Scientific/Engineering', 'Topic :: Scientific/Engineering :: Atmospheric Science', 'Topic :: Scientific/Engineering :: GIS', diff --git a/tests/integration/cmor/_fixes/access/__init__.py b/tests/integration/cmor/_fixes/access/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/integration/cmor/_fixes/access/test_access_esm1_5.py b/tests/integration/cmor/_fixes/access/test_access_esm1_5.py new file mode 100644 index 0000000000..01fb0e0529 --- /dev/null +++ b/tests/integration/cmor/_fixes/access/test_access_esm1_5.py @@ -0,0 +1,412 @@ +"""Tests for the ACCESS-ESM on-the-fly CMORizer.""" + +import dask.array as da +import iris +import numpy as np +import pytest +from cf_units import Unit +from iris.coords import DimCoord +from iris.cube import Cube, CubeList + +import esmvalcore.cmor._fixes.access.access_esm1_5 +from esmvalcore.cmor._fixes.fix import GenericFix +from esmvalcore.cmor.fix import Fix +from esmvalcore.cmor.table import CoordinateInfo, get_var_info +from esmvalcore.config._config import get_extra_facets +from esmvalcore.dataset import Dataset + +time_coord = DimCoord( + [15, 45], + standard_name='time', + var_name='time', + units=Unit('days since 1851-01-01', calendar='noleap'), + attributes={ + 'test': 1, + 'time_origin': 'will_be_removed' + }, +) +lat_coord = DimCoord( + [0, 10], + standard_name='latitude', + var_name='lat', + units='degrees', +) +lon_coord = DimCoord( + [-180, 0], + standard_name='longitude', + var_name='lon', + units='degrees', +) +coord_spec_3d = [ + (time_coord, 0), + (lat_coord, 1), + (lon_coord, 2), +] + + +@pytest.fixture +def cubes_2d(test_data_path): + """2D sample cubes.""" + nc_path = test_data_path / 'access_native.nc' + return iris.load(str(nc_path)) + + +def _get_fix(mip, frequency, short_name, fix_name): + """Load a fix from :mod:`esmvalcore.cmor._fixes.access.access_esm1_5`.""" + dataset = Dataset( + project='ACCESS', + dataset='ACCESS-ESM1-5', + mip=mip, + short_name=short_name, + ) + extra_facets = get_extra_facets(dataset, ()) + extra_facets['frequency'] = frequency + extra_facets['exp'] = 'amip' + vardef = get_var_info(project='ACCESS', mip=mip, short_name=short_name) + cls = getattr(esmvalcore.cmor._fixes.access.access_esm1_5, fix_name) + fix = cls(vardef, extra_facets=extra_facets, session={}, frequency='') + return fix + + +def get_fix(mip, frequency, short_name): + """Load a variable fix from esmvalcore.cmor._fixes.access.access_esm1_5.""" + fix_name = short_name[0].upper() + short_name[1:] + return _get_fix(mip, frequency, short_name, fix_name) + + +def get_fix_allvar(mip, frequency, short_name): + """Load a AllVar fix from esmvalcore.cmor._fixes.access.access_esm1_5.""" + return _get_fix(mip, frequency, short_name, 'AllVars') + + +def fix_metadata(cubes, mip, frequency, short_name): + """Fix metadata of cubes.""" + fix = get_fix(mip, frequency, short_name) + cubes = fix.fix_metadata(cubes) + return cubes + + +def check_tas_metadata(cubes): + """Check tas metadata.""" + assert len(cubes) == 1 + cube = cubes[0] + assert cube.var_name == 'tas' + assert cube.standard_name == 'air_temperature' + assert cube.long_name == 'Near-Surface Air Temperature' + assert cube.units == 'K' + assert 'positive' not in cube.attributes + return cube + + +def check_pr_metadata(cubes): + """Check pr metadata.""" + assert len(cubes) == 1 + cube = cubes[0] + assert cube.var_name == 'pr' + assert cube.standard_name == 'precipitation_flux' + assert cube.long_name == 'Precipitation' + assert cube.units == 'kg m-2 s-1' + assert 'positive' not in cube.attributes + return cube + + +def check_time(cube): + """Check time coordinate of cube.""" + assert cube.coords('time', dim_coords=True) + time = cube.coord('time', dim_coords=True) + assert time.var_name == 'time' + assert time.standard_name == 'time' + assert time.bounds.shape == (1, 2) + assert time.attributes == {} + + +def check_lat(cube): + """Check latitude coordinate of cube.""" + assert cube.coords('latitude', dim_coords=True) + lat = cube.coord('latitude', dim_coords=True) + assert lat.var_name == 'lat' + assert lat.standard_name == 'latitude' + assert lat.units == 'degrees_north' + assert lat.attributes == {} + + +def check_lon(cube): + """Check longitude coordinate of cube.""" + assert cube.coords('longitude', dim_coords=True) + lon = cube.coord('longitude', dim_coords=True) + assert lon.var_name == 'lon' + assert lon.standard_name == 'longitude' + assert lon.units == 'degrees_east' + assert lon.attributes == {} + + +def check_heightxm(cube, height_value): + """Check scalar heightxm coordinate of cube.""" + assert cube.coords('height') + height = cube.coord('height') + assert height.var_name == 'height' + assert height.standard_name == 'height' + assert height.units == 'm' + assert height.attributes == {'positive': 'up'} + np.testing.assert_allclose(height.points, [height_value]) + assert height.bounds is None + + +def assert_plev_metadata(cube): + """Assert plev metadata is correct.""" + assert cube.coord('air_pressure').standard_name == 'air_pressure' + assert cube.coord('air_pressure').var_name == 'plev' + assert cube.coord('air_pressure').units == 'Pa' + assert cube.coord('air_pressure').attributes == {'positive': 'down'} + + +def test_only_time(monkeypatch, cubes_2d): + """Test fix.""" + fix = get_fix_allvar('Amon', 'mon', 'pr') + + coord_info = CoordinateInfo('time') + coord_info.standard_name = 'time' + monkeypatch.setattr(fix.vardef, 'coordinates', {'time': coord_info}) + + cubes = cubes_2d + fixed_cubes = fix.fix_metadata(cubes) + + # Check cube metadata + cube = check_pr_metadata(fixed_cubes) + + # Check cube data + assert cube.shape == (1, 145, 192) + + # Check time metadata + assert cube.coords('time') + new_time_coord = cube.coord('time', dim_coords=True) + assert new_time_coord.var_name == 'time' + assert new_time_coord.standard_name == 'time' + + +def test_only_latitude(monkeypatch, cubes_2d): + """Test fix.""" + fix = get_fix_allvar('Amon', 'mon', 'pr') + + coord_info = CoordinateInfo('latitude') + coord_info.standard_name = 'latitude' + monkeypatch.setattr(fix.vardef, 'coordinates', {'latitude': coord_info}) + + cubes = cubes_2d + fixed_cubes = fix.fix_metadata(cubes) + + # Check cube metadata + cube = check_pr_metadata(fixed_cubes) + + # Check cube data + assert cube.shape == (1, 145, 192) + + # Check latitude metadata + assert cube.coords('latitude', dim_coords=True) + new_lat_coord = cube.coord('latitude') + assert new_lat_coord.var_name == 'lat' + assert new_lat_coord.standard_name == 'latitude' + assert new_lat_coord.units == 'degrees_north' + + +def test_only_longitude(monkeypatch, cubes_2d): + """Test fix.""" + fix = get_fix_allvar('Amon', 'mon', 'pr') + + coord_info = CoordinateInfo('longitude') + coord_info.standard_name = 'longitude' + monkeypatch.setattr(fix.vardef, 'coordinates', {'longitude': coord_info}) + + cubes = cubes_2d + fixed_cubes = fix.fix_metadata(cubes) + + # Check cube metadata + cube = check_pr_metadata(fixed_cubes) + + # Check cube data + assert cube.shape == (1, 145, 192) + + # Check longitude metadata + assert cube.coords('longitude', dim_coords=True) + new_lon_coord = cube.coord('longitude') + assert new_lon_coord.var_name == 'lon' + assert new_lon_coord.standard_name == 'longitude' + assert new_lon_coord.units == 'degrees_east' + + +def test_get_tas_fix(): + """Test getting of fix 'tas'.""" + fix = Fix.get_fixes('ACCESS', 'ACCESS_ESM1_5', 'Amon', 'tas') + assert fix == [ + esmvalcore.cmor._fixes.access.access_esm1_5.Tas(vardef={}, + extra_facets={}, + session={}, + frequency=''), + esmvalcore.cmor._fixes.access.access_esm1_5.AllVars(vardef={}, + extra_facets={}, + session={}, + frequency=''), + GenericFix(None), + ] + + +def test_tas_fix(cubes_2d): + """Test fix 'tas'.""" + fix_tas = get_fix('Amon', 'mon', 'tas') + fix_allvar = get_fix_allvar('Amon', 'mon', 'tas') + fixed_cubes = fix_tas.fix_metadata(cubes_2d) + fixed_cubes = fix_allvar.fix_metadata(fixed_cubes) + fixed_cube = check_tas_metadata(fixed_cubes) + + check_time(fixed_cube) + check_lat(fixed_cube) + check_lon(fixed_cube) + check_heightxm(fixed_cube, 2) + + assert fixed_cube.shape == (1, 145, 192) + + +def test_hus_fix(): + """Test fix 'hus'.""" + time_coord = DimCoord( + [15, 45], + standard_name='time', + var_name='time', + units=Unit('days since 1851-01-01', calendar='noleap'), + attributes={ + 'test': 1, + 'time_origin': 'will_be_removed' + }, + ) + plev_coord_rev = DimCoord( + [250, 500, 850], + var_name='pressure', + units='Pa', + ) + lat_coord_rev = DimCoord( + [10, -10], + standard_name='latitude', + var_name='lat', + units='degrees', + ) + lon_coord = DimCoord( + [-180, 0], + standard_name='longitude', + var_name='lon', + units='degrees', + ) + coord_spec_4d = [ + (time_coord, 0), + (plev_coord_rev, 1), + (lat_coord_rev, 2), + (lon_coord, 3), + ] + cube_4d = Cube( + da.arange(2 * 3 * 2 * 2, dtype=np.float32).reshape(2, 3, 2, 2), + standard_name='specific_humidity', + long_name='Specific Humidity', + var_name='fld_s30i205', + units='1', + dim_coords_and_dims=coord_spec_4d, + attributes={}, + ) + cubes_4d = CubeList([cube_4d]) + + fix = get_fix_allvar('Amon', 'mon', 'hus') + fixed_cubes = fix.fix_metadata(cubes_4d) + fixed_cube = fixed_cubes[0] + assert_plev_metadata(fixed_cube) + + assert fixed_cube.shape == (2, 3, 2, 2) + + +def test_rsus_fix(): + """Test fix 'rsus'.""" + time_coord = DimCoord( + [15, 45], + standard_name='time', + var_name='time', + units=Unit('days since 1851-01-01', calendar='noleap'), + attributes={ + 'test': 1, + 'time_origin': 'will_be_removed' + }, + ) + lat_coord = DimCoord( + [0, 10], + standard_name='latitude', + var_name='lat', + units='degrees', + ) + lon_coord = DimCoord( + [-180, 0], + standard_name='longitude', + var_name='lon', + units='degrees', + ) + coord_spec_3d = [ + (time_coord, 0), + (lat_coord, 1), + (lon_coord, 2), + ] + cube_3d_1 = Cube( + da.arange(2 * 2 * 2, dtype=np.float32).reshape(2, 2, 2), + var_name='fld_s01i235', + units='W m-2', + dim_coords_and_dims=coord_spec_3d, + attributes={}, + ) + cube_3d_2 = Cube( + da.arange(2 * 2 * 2, dtype=np.float32).reshape(2, 2, 2), + var_name='fld_s01i201', + units='W m-2', + dim_coords_and_dims=coord_spec_3d, + attributes={}, + ) + cubes_3d = CubeList([cube_3d_1, cube_3d_2]) + + cube_result = cubes_3d[0] - cubes_3d[1] + + fix = get_fix('Amon', 'mon', 'rsus') + fixed_cubes = fix.fix_metadata(cubes_3d) + np.testing.assert_allclose(fixed_cubes[0].data, cube_result.data) + + +def test_rlus_fix(): + """Test fix 'rlus'.""" + cube_3d_1 = Cube( + da.arange(2 * 2 * 2, dtype=np.float32).reshape(2, 2, 2), + var_name='fld_s02i207', + units='W m-2', + dim_coords_and_dims=coord_spec_3d, + attributes={}, + ) + cube_3d_2 = Cube( + da.arange(2 * 2 * 2, dtype=np.float32).reshape(2, 2, 2), + var_name='fld_s02i201', + units='W m-2', + dim_coords_and_dims=coord_spec_3d, + attributes={}, + ) + cube_3d_3 = Cube( + da.arange(2 * 2 * 2, dtype=np.float32).reshape(2, 2, 2), + var_name='fld_s03i332', + units='W m-2', + dim_coords_and_dims=coord_spec_3d, + attributes={}, + ) + cube_3d_4 = Cube( + da.arange(2 * 2 * 2, dtype=np.float32).reshape(2, 2, 2), + var_name='fld_s02i205', + units='W m-2', + dim_coords_and_dims=coord_spec_3d, + attributes={}, + ) + + cubes_3d = CubeList([cube_3d_1, cube_3d_2, cube_3d_3, cube_3d_4]) + + cube_result = cubes_3d[0] - cubes_3d[1] + cubes_3d[2] - cubes_3d[3] + + fix = get_fix('Amon', 'mon', 'rlus') + fixed_cubes = fix.fix_metadata(cubes_3d) + np.testing.assert_allclose(fixed_cubes[0].data, cube_result.data) diff --git a/tests/integration/cmor/_fixes/test_data/access_native.nc b/tests/integration/cmor/_fixes/test_data/access_native.nc new file mode 100644 index 0000000000..7c0849db63 Binary files /dev/null and b/tests/integration/cmor/_fixes/test_data/access_native.nc differ diff --git a/tests/integration/cmor/test_table.py b/tests/integration/cmor/test_table.py index 385869bc5f..680e5b4c01 100644 --- a/tests/integration/cmor/test_table.py +++ b/tests/integration/cmor/test_table.py @@ -477,7 +477,7 @@ def test_get_variable_tasaga(self): self.assertEqual(var.units, 'K') def test_get_variable_ch4s(self): - """Get tas variable.""" + """Get ch4s variable.""" CustomInfo() var = self.variables_info.get_variable('Amon', 'ch4s') self.assertEqual(var.short_name, 'ch4s') @@ -485,6 +485,15 @@ def test_get_variable_ch4s(self): 'Atmosphere CH4 surface') self.assertEqual(var.units, '1e-09') + def test_get_variable_tosStderr(self): + """Get tosStderr variable.""" + CustomInfo() + var = self.variables_info.get_variable('Omon', 'tosStderr') + self.assertEqual(var.short_name, 'tosStderr') + self.assertEqual(var.long_name, + 'Sea Surface Temperature Error') + self.assertEqual(var.units, 'K') + @pytest.mark.parametrize( 'project,mip,short_name,frequency', diff --git a/tests/integration/preprocessor/_derive/test_interface.py b/tests/integration/preprocessor/_derive/test_interface.py index 14ea1d6c9a..5a466f6028 100644 --- a/tests/integration/preprocessor/_derive/test_interface.py +++ b/tests/integration/preprocessor/_derive/test_interface.py @@ -27,10 +27,12 @@ def patched_derive(mocker): mocker.patch.object(_derive, 'logger', autospec=True) -def mock_all_derived_variables(returned_units): +def mock_all_derived_variables(returned_units, fail_unit_conversion=False): """Mock the :obj:`dict` containing all derived variables accordingly.""" cube = mock.create_autospec(Cube, instance=True) cube.units = returned_units + if fail_unit_conversion: + cube.convert_units.side_effect = [ValueError] calculate_function = mock.Mock(return_value=cube) derived_var = mock.Mock(name='DerivedVariable') derived_var.return_value.calculate = calculate_function @@ -127,7 +129,7 @@ def test_check_units_convertible(mock_cubes): @pytest.mark.usefixtures("patched_derive") def test_check_units_fail(mock_cubes): """Test units after derivation if derivation scripts returns None.""" - mock_all_derived_variables(Unit('kg')) + mock_all_derived_variables(Unit('kg'), fail_unit_conversion=True) with pytest.raises(ValueError) as err: derive(mock_cubes, SHORT_NAME, mock.sentinel.long_name, 'm', standard_name=mock.sentinel.standard_name) diff --git a/tests/integration/test_task.py b/tests/integration/test_task.py index 7ea9964585..f96cdb534d 100644 --- a/tests/integration/test_task.py +++ b/tests/integration/test_task.py @@ -6,6 +6,7 @@ from multiprocessing.pool import ThreadPool import pytest +import yaml import esmvalcore from esmvalcore._task import ( @@ -245,6 +246,23 @@ def test_py_diagnostic_task_constructor(tmp_path): assert task.output_dir == tmp_path / 'mydiag' +def test_py_diagnostic_task_write_settings(tmp_path): + """Test DiagnosticTask writtes settings in the user's order.""" + diag_script = tmp_path / 'diag_cow.py' + task = _get_single_diagnostic_task(tmp_path, diag_script) + my_arg_dict = { + 'b': [1], + 'a': 3., + 'c': False + } + task.settings.update(my_arg_dict) + settings = task.write_settings() + with open(settings, 'r') as stream: + settings_data = yaml.safe_load(stream) + + assert list(settings_data) == ['run_dir', 'b', 'a', 'c'] + + def test_diagnostic_diag_script_none(tmp_path): """Test case when diagnostic script doesn't exist.""" diag_script = tmp_path / 'diag_cow.py' diff --git a/tests/unit/preprocessor/_regrid_esmpy/test_regrid_esmpy.py b/tests/unit/preprocessor/_regrid_esmpy/test_regrid_esmpy.py index 371ab49684..44f138d68a 100644 --- a/tests/unit/preprocessor/_regrid_esmpy/test_regrid_esmpy.py +++ b/tests/unit/preprocessor/_regrid_esmpy/test_regrid_esmpy.py @@ -1,5 +1,4 @@ """Unit tests for the esmvalcore.preprocessor._regrid_esmpy module.""" -import sys from unittest import mock import cf_units @@ -381,9 +380,6 @@ def test_coords_iris_to_esmpy_2d_non_circular(self): self.assert_array_equal(esmpy_lon_corners, self.expected_esmpy_lon_corners) - @pytest.mark.skipif(sys.version_info.major == 3 - and sys.version_info.minor == 9, - reason="bug in mock.py for Python 3.9.0 and 3.9.1") def test_get_grid_circular(self): """Test building of ESMF grid from iris cube circular longitude.""" expected_get_coords_calls = [ @@ -405,9 +401,6 @@ def test_get_grid_circular(self): mg.add_item.assert_called_once_with(mock.sentinel.gi_mask, mock.sentinel.sl_center) - @pytest.mark.skipif(sys.version_info.major == 3 - and sys.version_info.minor == 9, - reason="bug in mock.py for Python 3.9.0 and 3.9.1") def test_get_grid_non_circular(self): """Test building of ESMF grid from iris cube non circular longitude.""" expected_get_coords_calls = [ @@ -465,9 +458,6 @@ def test_is_lon_circular_2d_aux_coords_non_circ(self): @mock.patch('esmvalcore.preprocessor._regrid_esmpy.esmpy.Grid', MockGrid) @mock.patch('esmvalcore.preprocessor._regrid_esmpy.esmpy.Field') - @pytest.mark.skipif(sys.version_info.major == 3 - and sys.version_info.minor == 9, - reason="bug in mock.py for Python 3.9.0 and 3.9.1") def test_cube_to_empty_field(self, mock_field): """Test building of empty field from iris cube.""" field = cube_to_empty_field(self.cube)