diff --git a/docs/source/reference/cli.rst b/docs/source/reference/cli.rst index eb907eed1..f9a1dba31 100644 --- a/docs/source/reference/cli.rst +++ b/docs/source/reference/cli.rst @@ -19,7 +19,7 @@ contain the YAML text that you want executed. positional arguments: input_file input file to read - output_file output file to write + output_dir directory to write output recipe_file recipe file to execute. If omitted reads from CSET_RECIPE environment variable options: diff --git a/docs/source/reference/recipe-format.rst b/docs/source/reference/recipe-format.rst index d4e975ea0..729aa9733 100644 --- a/docs/source/reference/recipe-format.rst +++ b/docs/source/reference/recipe-format.rst @@ -27,8 +27,7 @@ commented example recipe: - operator: write.write_cube_to_nc # Specify the name of the argument, and its value. - file_path: CSET_OUTPUT_PATH - # "CSET_OUTPUT_PATH" is special and becomes the runtime output file path. + filename: processed_data.nc The name and description keys provide a human readable description of what the recipe does. They are currently not used anywhere, but it is good practice to diff --git a/pyproject.toml b/pyproject.toml index 90b0a9917..3f37f5994 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,9 @@ dependencies = [ "scitools-iris >= 3.6", "ruamel.yaml >= 0.17", "pygraphviz >= 1.11", + "mo_pack >= 0.3.0", "isodate", + "markdown-it-py >= 3.0", ] [project.urls] diff --git a/requirements/environment.yml b/requirements/environment.yml index 7085481e4..6560c5dfb 100644 --- a/requirements/environment.yml +++ b/requirements/environment.yml @@ -9,6 +9,7 @@ dependencies: - mo_pack # For handling pp files. - pygraphviz - isodate + - markdown-it-py >= 3.0 # Build dependencies - setuptools>=61.0 @@ -17,6 +18,7 @@ dependencies: # Development dependencies - pre-commit - black + - ruff # Testing dependencies - tox < 4.0 diff --git a/requirements/locks/py310-lock-linux-64.txt b/requirements/locks/py310-lock-linux-64.txt index 85a68ef67..5e68029d4 100644 --- a/requirements/locks/py310-lock-linux-64.txt +++ b/requirements/locks/py310-lock-linux-64.txt @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 5d0d2545ac3255e4f9045616cbc9dac927012f154808af7d295721558d507c73 +# input_hash: 842904ffd08b0703e4cfc17991e80b01b831ab882fcd7de15d2c7f8c546c57ac @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.11.17-hbcca054_0.conda#01ffc8d36f9eba0ce0b3c1955fa780ee @@ -18,7 +18,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2# 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-h807b86a_3.conda#23fdf1fef05baeb7eadc2aed5fb0011f 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.21.0-hd590300_0.conda#c06fa0440048270817b9e3142cc661bf +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.22.1-hd590300_0.conda#8430bd266c7b2cfbda403f7585d5ee86 https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 @@ -66,7 +66,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2. https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_3.conda#73031c79546ad06f1fe62e57fdd021bc https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_0.conda#9b13d5ee90fc9f09d54fd403247342b4 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.0-h2797004_0.conda#b58e6816d137f3aabf77d341dd5d732b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.1-h2797004_0.conda#b4ad86d2527b890e43ff2efc68b239f4 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 @@ -83,10 +83,10 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb 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.78.1-h783c2da_1.conda#70052d6c1e84643e30ffefb21ab6950f -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 https://conda.anaconda.org/conda-forge/linux-64/python-3.10.13-hd12c33a_0_cpython.conda#f3a8c32aa764c3e7188b4b810fc9d6ce -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.0-h2c6b66d_0.conda#df56c636df4a98990462d66ac7be2330 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.1-h2c6b66d_0.conda#cf535736bb0de7bf388dbfd2d6a50f53 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.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.13-pyhd8ed1ab_0.conda#06006184e203b61d3525f90de394471e @@ -103,7 +103,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.7-pyhd8ed1ab_0.conda#12d8aae6994f342618443a8f05c652a0 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py310hff52083_2.conda#ac157d9b464d15fac78b13fcabc0f845 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.3-pyhd8ed1ab_0.conda#e6518222753f519e911e83136d2158d9 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_0.conda#f6c211fee3c98229652b60a9a42ef363 https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.10.0-pyhca7485f_0.conda#5b86cf1ceaaa9be2ec4627377e538db1 @@ -114,11 +114,12 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py310hd41b1e2_1.conda#b8d67603d43b23ce7e988a5d81a7ab79 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hb7c19ff_3.conda#e96637dd92c5f340215c753a5c9a22d7 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-19_linux64_openblas.conda#420f4e9be59d0dc9133a0f43f7bab3f3 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.4.0-hca28451_0.conda#1158ac1d2613b28685644931f11ee807 https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda#0ebb65e8d86843865796c7c95a941f34 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py310h2372a71_1.conda#b74e07a054c479e45a83a83fc5be713c +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.0-pyhd8ed1ab_0.tar.bz2#f8dab71fdc13b1bf29a01248b156d268 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda#4eccaeba205f0aed9ac3a9ea58568ca3 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 @@ -127,7 +128,7 @@ https://conda.anaconda.org/conda-forge/noarch/pathspec-0.11.2-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pluggy-1.3.0-pyhd8ed1ab_0.conda#2390bd10bed1f3fdc7a537fb5a447d8d https://conda.anaconda.org/conda-forge/noarch/py-1.11.0-pyh6c4a22f_0.tar.bz2#b4613d7e7a493916d867842a6a148054 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.0-pyhd8ed1ab_0.conda#33598684e190a91fa5b4ec82b546778d +https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 @@ -135,6 +136,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py310h2372a7 https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3.post1-pyhd8ed1ab_0.conda#c93346b446cd08c169d843ae5fc0da97 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py310h2372a71_1.conda#bb010e368de4940771368bc3dc4c63e7 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py310h2372a71_2.conda#7c9da9721ee545d57ad759f020172853 +https://conda.anaconda.org/conda-forge/linux-64/ruff-0.1.6-py310h3d77a66_0.conda#6e9f417149948f5d623cc650f4537be9 https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e @@ -154,14 +156,15 @@ https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py310h2fee648_0.conda#45846a970e71ac98fd327da5d40a0a2c https://conda.anaconda.org/conda-forge/linux-64/coverage-7.3.2-py310h2372a71_0.conda#33c03cd5711885c920ddff676fb84f98 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.44.3-py310h2372a71_0.conda#b4bfb11c034c257e20159e9001cd8e28 +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.45.1-py310h2372a71_0.conda#c2dcff257e040bcda00e2a30a9d85333 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2#4a62c93c1b5c0b920508ae3fd285eaf5 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-19_linux64_openblas.conda#d12374af44575413fbbd4a217d46ea33 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-19_linux64_openblas.conda#9f100edf65436e3eabc2a51fc00b2c37 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda#93a8e71256479c62074356ef6ebf501b https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.1.0-py310h01dd4db_0.conda#95d87a906d88b5824d7d36eeef091dba @@ -194,15 +197,15 @@ https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.24.6-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_4.conda#0ca55ca20891d393846695354b32ebc5 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-h98fae49_0.conda#620e754f4344f4c27259ff460a2b9c50 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.1-py310h62c0568_0.conda#e650bd952e5618050ccb088bc0c6dfb4 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py310h62c0568_0.conda#3cbbc7d0b54df02c9a006d3de14911d9 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py310hba70d50_100.conda#e19392760c7e4da3b9cb0ee5bf61bc4b https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.5.0-pyha770c72_0.conda#964e3d762e427661c59263435a14c492 https://conda.anaconda.org/conda-forge/noarch/tox-3.27.1-pyhd8ed1ab_0.tar.bz2#62b743e1030b17163c70654601afb60d https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py310hcc13569_1.conda#31ef447724fb19066a9d00a660dab1bd -https://conda.anaconda.org/conda-forge/linux-64/graphviz-8.1.0-h28d9a01_0.conda#33628e0e3de7afd2c8172f76439894cb +https://conda.anaconda.org/conda-forge/linux-64/graphviz-9.0.0-h28d9a01_0.conda#32cde7a2ac1ca255ed2a926d548b9d6c https://conda.anaconda.org/conda-forge/noarch/tox-conda-0.9.2-pyhd8ed1ab_0.tar.bz2#8494c2ad4bef7bfe2e2d8603b4c2a185 https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 -https://conda.anaconda.org/conda-forge/linux-64/pygraphviz-1.11-py310h91ff30a_1.conda#bfd594dcd60b78ce03e65103144567c3 +https://conda.anaconda.org/conda-forge/linux-64/pygraphviz-1.11-py310h31db22a_2.conda#9cb14eb945de9ffe216b547f90d08f64 https://conda.anaconda.org/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_1.conda#a631f5c7b7f5045448f966ad71aa2881 https://conda.anaconda.org/conda-forge/noarch/furo-2023.9.10-pyhd8ed1ab_0.conda#0dcfacf6d3e49f2957c69c81356cf892 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.7-pyhd8ed1ab_0.conda#aebfabcb60c33a89c1f9290cab49bc93 diff --git a/requirements/locks/py311-lock-linux-64.txt b/requirements/locks/py311-lock-linux-64.txt index 6cce013ef..e32296391 100644 --- a/requirements/locks/py311-lock-linux-64.txt +++ b/requirements/locks/py311-lock-linux-64.txt @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: f3aa8893be8cc1034fdf84686e12a938785cec12a99d28fd52635533b3992809 +# input_hash: b5f29690e8746320e50397c7a8ed926e7b30f205758cbb1bd91edd0aa75daf2f @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.11.17-hbcca054_0.conda#01ffc8d36f9eba0ce0b3c1955fa780ee @@ -18,7 +18,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2# 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-h807b86a_3.conda#23fdf1fef05baeb7eadc2aed5fb0011f 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.21.0-hd590300_0.conda#c06fa0440048270817b9e3142cc661bf +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.22.1-hd590300_0.conda#8430bd266c7b2cfbda403f7585d5ee86 https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 @@ -66,7 +66,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2. https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_3.conda#73031c79546ad06f1fe62e57fdd021bc https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_0.conda#9b13d5ee90fc9f09d54fd403247342b4 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.0-h2797004_0.conda#b58e6816d137f3aabf77d341dd5d732b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.1-h2797004_0.conda#b4ad86d2527b890e43ff2efc68b239f4 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 @@ -83,10 +83,10 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb 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.78.1-h783c2da_1.conda#70052d6c1e84643e30ffefb21ab6950f -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 https://conda.anaconda.org/conda-forge/linux-64/python-3.11.6-hab00c5b_0_cpython.conda#b0dfbe2fcbfdb097d321bfd50ecddab1 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.0-h2c6b66d_0.conda#df56c636df4a98990462d66ac7be2330 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.1-h2c6b66d_0.conda#cf535736bb0de7bf388dbfd2d6a50f53 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.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.13-pyhd8ed1ab_0.conda#06006184e203b61d3525f90de394471e @@ -103,7 +103,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.7-pyhd8ed1ab_0.conda#12d8aae6994f342618443a8f05c652a0 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py311h38be061_2.conda#33f8066e53679dd4be2355fec849bf01 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.3-pyhd8ed1ab_0.conda#e6518222753f519e911e83136d2158d9 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_0.conda#f6c211fee3c98229652b60a9a42ef363 https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.10.0-pyhca7485f_0.conda#5b86cf1ceaaa9be2ec4627377e538db1 @@ -114,11 +114,12 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py311h9547e67_1.conda#2c65bdf442b0d37aad080c8a4e0d452f https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hb7c19ff_3.conda#e96637dd92c5f340215c753a5c9a22d7 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-19_linux64_openblas.conda#420f4e9be59d0dc9133a0f43f7bab3f3 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.4.0-hca28451_0.conda#1158ac1d2613b28685644931f11ee807 https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda#0ebb65e8d86843865796c7c95a941f34 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py311h459d7ec_1.conda#71120b5155a0c500826cf81536721a15 +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.0-pyhd8ed1ab_0.tar.bz2#f8dab71fdc13b1bf29a01248b156d268 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda#4eccaeba205f0aed9ac3a9ea58568ca3 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 @@ -127,7 +128,7 @@ https://conda.anaconda.org/conda-forge/noarch/pathspec-0.11.2-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pluggy-1.3.0-pyhd8ed1ab_0.conda#2390bd10bed1f3fdc7a537fb5a447d8d https://conda.anaconda.org/conda-forge/noarch/py-1.11.0-pyh6c4a22f_0.tar.bz2#b4613d7e7a493916d867842a6a148054 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.0-pyhd8ed1ab_0.conda#33598684e190a91fa5b4ec82b546778d +https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 @@ -135,6 +136,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py311h459d7e https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3.post1-pyhd8ed1ab_0.conda#c93346b446cd08c169d843ae5fc0da97 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py311h459d7ec_1.conda#52719a74ad130de8fb5d047dc91f247a https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py311h459d7ec_2.conda#56bc3fe5180c0b23e05c7a5708153ac7 +https://conda.anaconda.org/conda-forge/linux-64/ruff-0.1.6-py311h7145743_0.conda#aff8387edd5157da054c4b46cc38ffdc https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e @@ -153,14 +155,15 @@ https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py311hb3a22ac_0.conda#b3469563ac5e808b0cd92810d0697043 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.3.2-py311h459d7ec_0.conda#7b3145fed7adc7c63a0e08f6f29f5480 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.44.3-py311h459d7ec_0.conda#a811af88d3c522cf36f4674ef699021d +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.45.1-py311h459d7ec_0.conda#5b24692ece82f89e5cb9a469d9619731 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2#4a62c93c1b5c0b920508ae3fd285eaf5 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-19_linux64_openblas.conda#d12374af44575413fbbd4a217d46ea33 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-19_linux64_openblas.conda#9f100edf65436e3eabc2a51fc00b2c37 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda#93a8e71256479c62074356ef6ebf501b https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.1.0-py311ha6c5da5_0.conda#83a988daf5c49e57f7d2086fb6781fe8 @@ -193,15 +196,15 @@ https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.24.6-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-h98fae49_0.conda#620e754f4344f4c27259ff460a2b9c50 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.1-py311h54ef318_0.conda#201fdabdb86bb8fb6e99fa3f0dab8122 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py311h54ef318_0.conda#9f80753bc008bfc9b95f39d9ff9f1694 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py311he8ad708_100.conda#597b1ad6cb7011b7561c20ea30295cae https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.5.0-pyha770c72_0.conda#964e3d762e427661c59263435a14c492 https://conda.anaconda.org/conda-forge/noarch/tox-3.27.1-pyhd8ed1ab_0.tar.bz2#62b743e1030b17163c70654601afb60d https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py311h320fe9a_1.conda#10d1806e20da040c58c36deddf51c70c -https://conda.anaconda.org/conda-forge/linux-64/graphviz-8.1.0-h28d9a01_0.conda#33628e0e3de7afd2c8172f76439894cb +https://conda.anaconda.org/conda-forge/linux-64/graphviz-9.0.0-h28d9a01_0.conda#32cde7a2ac1ca255ed2a926d548b9d6c https://conda.anaconda.org/conda-forge/noarch/tox-conda-0.9.2-pyhd8ed1ab_0.tar.bz2#8494c2ad4bef7bfe2e2d8603b4c2a185 https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 -https://conda.anaconda.org/conda-forge/linux-64/pygraphviz-1.11-py311h72a77b7_1.conda#7044cd923985abb6e3b976e5ac0542b8 +https://conda.anaconda.org/conda-forge/linux-64/pygraphviz-1.11-py311hbf5cbc9_2.conda#e2cc4c8cc7e6fdb322315f71276e6bab https://conda.anaconda.org/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_1.conda#a631f5c7b7f5045448f966ad71aa2881 https://conda.anaconda.org/conda-forge/noarch/furo-2023.9.10-pyhd8ed1ab_0.conda#0dcfacf6d3e49f2957c69c81356cf892 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.7-pyhd8ed1ab_0.conda#aebfabcb60c33a89c1f9290cab49bc93 diff --git a/requirements/locks/py312-lock-linux-64.txt b/requirements/locks/py312-lock-linux-64.txt index a1226bbf7..b735011f9 100644 --- a/requirements/locks/py312-lock-linux-64.txt +++ b/requirements/locks/py312-lock-linux-64.txt @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: 3188d91717c24356904e95603e2116e940c1ea0f420715e05d754e4577f7c24b +# input_hash: aab05fa0c24defb4081c76d8726ac62442f235d55b6bffd06bf50dcc102865c4 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.11.17-hbcca054_0.conda#01ffc8d36f9eba0ce0b3c1955fa780ee @@ -18,7 +18,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2# 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-h807b86a_3.conda#23fdf1fef05baeb7eadc2aed5fb0011f 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.21.0-hd590300_0.conda#c06fa0440048270817b9e3142cc661bf +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.22.1-hd590300_0.conda#8430bd266c7b2cfbda403f7585d5ee86 https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 @@ -66,7 +66,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2. https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_3.conda#73031c79546ad06f1fe62e57fdd021bc https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_0.conda#9b13d5ee90fc9f09d54fd403247342b4 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.0-h2797004_0.conda#b58e6816d137f3aabf77d341dd5d732b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.1-h2797004_0.conda#b4ad86d2527b890e43ff2efc68b239f4 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 @@ -83,10 +83,10 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb 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.78.1-h783c2da_1.conda#70052d6c1e84643e30ffefb21ab6950f -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 https://conda.anaconda.org/conda-forge/linux-64/python-3.12.0-hab00c5b_0_cpython.conda#7f97faab5bebcc2580f4f299285323da -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.0-h2c6b66d_0.conda#df56c636df4a98990462d66ac7be2330 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.1-h2c6b66d_0.conda#cf535736bb0de7bf388dbfd2d6a50f53 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.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.13-pyhd8ed1ab_0.conda#06006184e203b61d3525f90de394471e @@ -103,7 +103,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.7-pyhd8ed1ab_0.conda#12d8aae6994f342618443a8f05c652a0 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py312h7900ff3_2.conda#5e9bf8f7126528bea5c31f42ceebc06c -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.3-pyhd8ed1ab_0.conda#e6518222753f519e911e83136d2158d9 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_0.conda#f6c211fee3c98229652b60a9a42ef363 https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.10.0-pyhca7485f_0.conda#5b86cf1ceaaa9be2ec4627377e538db1 @@ -114,11 +114,12 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py312h8572e83_1.conda#c1e71f2bc05d8e8e033aefac2c490d05 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hb7c19ff_3.conda#e96637dd92c5f340215c753a5c9a22d7 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-19_linux64_openblas.conda#420f4e9be59d0dc9133a0f43f7bab3f3 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.4.0-hca28451_0.conda#1158ac1d2613b28685644931f11ee807 https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda#0ebb65e8d86843865796c7c95a941f34 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py312h98912ed_1.conda#79d118a8f1da01773dd5b334af5ce8d4 +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.0-pyhd8ed1ab_0.tar.bz2#f8dab71fdc13b1bf29a01248b156d268 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda#4eccaeba205f0aed9ac3a9ea58568ca3 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 @@ -127,7 +128,7 @@ https://conda.anaconda.org/conda-forge/noarch/pathspec-0.11.2-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pluggy-1.3.0-pyhd8ed1ab_0.conda#2390bd10bed1f3fdc7a537fb5a447d8d https://conda.anaconda.org/conda-forge/noarch/py-1.11.0-pyh6c4a22f_0.tar.bz2#b4613d7e7a493916d867842a6a148054 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.0-pyhd8ed1ab_0.conda#33598684e190a91fa5b4ec82b546778d +https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 @@ -135,6 +136,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py312h98912e https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3.post1-pyhd8ed1ab_0.conda#c93346b446cd08c169d843ae5fc0da97 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py312h98912ed_1.conda#e3fd78d8d490af1d84763b9fe3f2e552 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py312h98912ed_2.conda#17591efb6a03e1dea6567cb15c619d1c +https://conda.anaconda.org/conda-forge/linux-64/ruff-0.1.6-py312h9118e91_0.conda#c708eafa346ff11e7db95e8a840235cb https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e @@ -153,14 +155,15 @@ https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py312hf06ca03_0.conda#56b0ca764ce23cc54f3f7e2a7b970f6d https://conda.anaconda.org/conda-forge/linux-64/coverage-7.3.2-py312h98912ed_0.conda#b248b512221477e79e600c3b9368c7d0 -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.44.3-py312h98912ed_0.conda#ceae07376754cd9cccc54719999df20c +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.45.1-py312h98912ed_0.conda#c7fc51c5a349dc323012bdce734b88a0 https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2#4a62c93c1b5c0b920508ae3fd285eaf5 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-19_linux64_openblas.conda#d12374af44575413fbbd4a217d46ea33 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-19_linux64_openblas.conda#9f100edf65436e3eabc2a51fc00b2c37 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda#93a8e71256479c62074356ef6ebf501b https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.1.0-py312hf3581a9_0.conda#c04d3de9d831a69a5fdfab1413ec2fb6 @@ -193,15 +196,15 @@ https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.24.6-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py312hc7c0aa3_4.conda#d9c9fa64fdf4e57d7f8957b957d784a0 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-h98fae49_0.conda#620e754f4344f4c27259ff460a2b9c50 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.1-py312he5832f3_0.conda#8c5aef130bf0c6590202719cff450402 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py312he5832f3_0.conda#1bf345f8df6896b5a8016f16188946ba https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py312h26027e0_100.conda#2d7b4954dc5a090796e0ba89c325d09b https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.5.0-pyha770c72_0.conda#964e3d762e427661c59263435a14c492 https://conda.anaconda.org/conda-forge/noarch/tox-3.27.1-pyhd8ed1ab_0.tar.bz2#62b743e1030b17163c70654601afb60d https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py312hfb8ada1_1.conda#17e09fffccc807ef2d2644f21883d64f -https://conda.anaconda.org/conda-forge/linux-64/graphviz-8.1.0-h28d9a01_0.conda#33628e0e3de7afd2c8172f76439894cb +https://conda.anaconda.org/conda-forge/linux-64/graphviz-9.0.0-h28d9a01_0.conda#32cde7a2ac1ca255ed2a926d548b9d6c https://conda.anaconda.org/conda-forge/noarch/tox-conda-0.9.2-pyhd8ed1ab_0.tar.bz2#8494c2ad4bef7bfe2e2d8603b4c2a185 https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 -https://conda.anaconda.org/conda-forge/linux-64/pygraphviz-1.11-py312h9d4395f_1.conda#6c802bdc9975d2f01f3b441116f87f42 +https://conda.anaconda.org/conda-forge/linux-64/pygraphviz-1.11-py312h7a1eb4d_2.conda#d68cf48ff74d75294900253fd9aa0c07 https://conda.anaconda.org/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_1.conda#a631f5c7b7f5045448f966ad71aa2881 https://conda.anaconda.org/conda-forge/noarch/furo-2023.9.10-pyhd8ed1ab_0.conda#0dcfacf6d3e49f2957c69c81356cf892 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.7-pyhd8ed1ab_0.conda#aebfabcb60c33a89c1f9290cab49bc93 diff --git a/requirements/locks/py39-lock-linux-64.txt b/requirements/locks/py39-lock-linux-64.txt index d493495a8..1f1d15386 100644 --- a/requirements/locks/py39-lock-linux-64.txt +++ b/requirements/locks/py39-lock-linux-64.txt @@ -1,6 +1,6 @@ # Generated by conda-lock. # platform: linux-64 -# input_hash: c2c4394ff39079ce37d87cd0a1a80aa5baa62993d86e1d8b3c4cf4d2b67e67ba +# input_hash: 8619f0bb2bd1b8f699af028d948f8949ff093da00d1a294e59e6564c5ed70e24 @EXPLICIT https://conda.anaconda.org/conda-forge/linux-64/_libgcc_mutex-0.1-conda_forge.tar.bz2#d7c89558ba9fa0495403155b64376d81 https://conda.anaconda.org/conda-forge/linux-64/ca-certificates-2023.11.17-hbcca054_0.conda#01ffc8d36f9eba0ce0b3c1955fa780ee @@ -18,7 +18,7 @@ https://conda.anaconda.org/conda-forge/linux-64/_openmp_mutex-4.5-2_gnu.tar.bz2# 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-h807b86a_3.conda#23fdf1fef05baeb7eadc2aed5fb0011f 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.21.0-hd590300_0.conda#c06fa0440048270817b9e3142cc661bf +https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.22.1-hd590300_0.conda#8430bd266c7b2cfbda403f7585d5ee86 https://conda.anaconda.org/conda-forge/linux-64/fribidi-1.0.10-h36c2ea0_0.tar.bz2#ac7bc6a654f8f41b352b38f4051135f8 https://conda.anaconda.org/conda-forge/linux-64/geos-3.12.0-h59595ed_0.conda#3fdf79ef322c8379ae83be491d805369 https://conda.anaconda.org/conda-forge/linux-64/gettext-0.21.1-h27087fc_0.tar.bz2#14947d8770185e5153fdd04d4673ed37 @@ -66,7 +66,7 @@ https://conda.anaconda.org/conda-forge/linux-64/libedit-3.1.20191231-he28a2e2_2. https://conda.anaconda.org/conda-forge/linux-64/libgfortran-ng-13.2.0-h69a702a_3.conda#73031c79546ad06f1fe62e57fdd021bc https://conda.anaconda.org/conda-forge/linux-64/libnghttp2-1.58.0-h47da74e_0.conda#9b13d5ee90fc9f09d54fd403247342b4 https://conda.anaconda.org/conda-forge/linux-64/libpng-1.6.39-h753d276_0.conda#e1c890aebdebbfbf87e2c917187b4416 -https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.0-h2797004_0.conda#b58e6816d137f3aabf77d341dd5d732b +https://conda.anaconda.org/conda-forge/linux-64/libsqlite-3.44.1-h2797004_0.conda#b4ad86d2527b890e43ff2efc68b239f4 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 @@ -83,10 +83,10 @@ https://conda.anaconda.org/conda-forge/linux-64/brotli-bin-1.1.0-hd590300_1.cond https://conda.anaconda.org/conda-forge/linux-64/freetype-2.12.1-h267a509_2.conda#9ae35c3d96db2c94ce0cef86efdfa2cb 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.78.1-h783c2da_1.conda#70052d6c1e84643e30ffefb21ab6950f -https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.24-pthreads_h413a1c8_0.conda#6e4ef6ca28655124dcde9bd500e44c32 +https://conda.anaconda.org/conda-forge/linux-64/libopenblas-0.3.25-pthreads_h413a1c8_0.conda#d172b34a443b95f86089e8229ddc9a17 https://conda.anaconda.org/conda-forge/linux-64/libtiff-4.6.0-ha9c0a0a_2.conda#55ed21669b2015f77c180feb1dd41930 https://conda.anaconda.org/conda-forge/linux-64/python-3.9.18-h0755675_0_cpython.conda#3ede353bc605068d9677e700b1847382 -https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.0-h2c6b66d_0.conda#df56c636df4a98990462d66ac7be2330 +https://conda.anaconda.org/conda-forge/linux-64/sqlite-3.44.1-h2c6b66d_0.conda#cf535736bb0de7bf388dbfd2d6a50f53 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.7-h8ee46fc_0.conda#49e482d882669206653b095f5206c05b https://conda.anaconda.org/conda-forge/noarch/alabaster-0.7.13-pyhd8ed1ab_0.conda#06006184e203b61d3525f90de394471e @@ -103,7 +103,7 @@ https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441 https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.7-pyhd8ed1ab_0.conda#12d8aae6994f342618443a8f05c652a0 https://conda.anaconda.org/conda-forge/linux-64/docutils-0.20.1-py39hf3d152e_2.conda#8effc3913cfe3a29f2a89cda29bbff04 -https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.1.3-pyhd8ed1ab_0.conda#e6518222753f519e911e83136d2158d9 +https://conda.anaconda.org/conda-forge/noarch/exceptiongroup-1.2.0-pyhd8ed1ab_0.conda#f6c211fee3c98229652b60a9a42ef363 https://conda.anaconda.org/conda-forge/noarch/filelock-3.13.1-pyhd8ed1ab_0.conda#0c1729b74a8152fde6a38ba0a2ab9f45 https://conda.anaconda.org/conda-forge/linux-64/fontconfig-2.14.2-h14ed4e7_0.conda#0f69b688f52ff6da70bccb7ff7001d1d https://conda.anaconda.org/conda-forge/noarch/fsspec-2023.10.0-pyhca7485f_0.conda#5b86cf1ceaaa9be2ec4627377e538db1 @@ -114,11 +114,12 @@ https://conda.anaconda.org/conda-forge/noarch/imagesize-1.4.1-pyhd8ed1ab_0.tar.b https://conda.anaconda.org/conda-forge/noarch/iniconfig-2.0.0-pyhd8ed1ab_0.conda#f800d2da156d08e289b14e87e43c1ae5 https://conda.anaconda.org/conda-forge/linux-64/kiwisolver-1.4.5-py39h7633fee_1.conda#c9f74d717e5a2847a9f8b779c54130f2 https://conda.anaconda.org/conda-forge/linux-64/lcms2-2.15-hb7c19ff_3.conda#e96637dd92c5f340215c753a5c9a22d7 -https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-19_linux64_openblas.conda#420f4e9be59d0dc9133a0f43f7bab3f3 +https://conda.anaconda.org/conda-forge/linux-64/libblas-3.9.0-20_linux64_openblas.conda#2b7bb4f7562c8cf334fc2e20c2d28abc https://conda.anaconda.org/conda-forge/linux-64/libcurl-8.4.0-hca28451_0.conda#1158ac1d2613b28685644931f11ee807 https://conda.anaconda.org/conda-forge/linux-64/libwebp-1.3.2-h658648e_1.conda#0ebb65e8d86843865796c7c95a941f34 https://conda.anaconda.org/conda-forge/noarch/locket-1.0.0-pyhd8ed1ab_0.tar.bz2#91e27ef3d05cc772ce627e51cff111c4 https://conda.anaconda.org/conda-forge/linux-64/markupsafe-2.1.3-py39hd1e30aa_1.conda#ee2b4665b852ec6ff2758f3c1b91233d +https://conda.anaconda.org/conda-forge/noarch/mdurl-0.1.0-pyhd8ed1ab_0.tar.bz2#f8dab71fdc13b1bf29a01248b156d268 https://conda.anaconda.org/conda-forge/noarch/munkres-1.1.4-pyh9f0ad1d_0.tar.bz2#2ba8498c1018c1e9c61eb99b973dfe19 https://conda.anaconda.org/conda-forge/noarch/mypy_extensions-1.0.0-pyha770c72_0.conda#4eccaeba205f0aed9ac3a9ea58568ca3 https://conda.anaconda.org/conda-forge/linux-64/openjpeg-2.5.0-h488ebb8_3.conda#128c25b7fe6a25286a48f3a6a9b5b6f3 @@ -127,7 +128,7 @@ https://conda.anaconda.org/conda-forge/noarch/pathspec-0.11.2-pyhd8ed1ab_0.conda https://conda.anaconda.org/conda-forge/noarch/pluggy-1.3.0-pyhd8ed1ab_0.conda#2390bd10bed1f3fdc7a537fb5a447d8d https://conda.anaconda.org/conda-forge/noarch/py-1.11.0-pyh6c4a22f_0.tar.bz2#b4613d7e7a493916d867842a6a148054 https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff -https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.0-pyhd8ed1ab_0.conda#33598684e190a91fa5b4ec82b546778d +https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.1-pyhd8ed1ab_0.conda#176f7d56f0cfe9008bdf1bccd7de02fb https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174 https://conda.anaconda.org/conda-forge/noarch/pysocks-1.7.1-pyha2e5f31_6.tar.bz2#2a7de29fb590ca14b5243c4c812c8025 @@ -135,6 +136,7 @@ https://conda.anaconda.org/conda-forge/linux-64/python-xxhash-3.4.1-py39hd1e30aa https://conda.anaconda.org/conda-forge/noarch/pytz-2023.3.post1-pyhd8ed1ab_0.conda#c93346b446cd08c169d843ae5fc0da97 https://conda.anaconda.org/conda-forge/linux-64/pyyaml-6.0.1-py39hd1e30aa_1.conda#37218233bcdc310e4fde6453bc1b40d8 https://conda.anaconda.org/conda-forge/linux-64/ruamel.yaml.clib-0.2.7-py39hd1e30aa_2.conda#743d996a1af8502f27770fadfd418434 +https://conda.anaconda.org/conda-forge/linux-64/ruff-0.1.6-py39h7efa1f9_0.conda#aa75a9e12a4a4b8f217f121cd733bf71 https://conda.anaconda.org/conda-forge/noarch/setuptools-68.2.2-pyhd8ed1ab_0.conda#fc2166155db840c634a1291a5c35a709 https://conda.anaconda.org/conda-forge/noarch/six-1.16.0-pyh6c4a22f_0.tar.bz2#e5f25f8dbc060e9a8d912e432202afc2 https://conda.anaconda.org/conda-forge/noarch/snowballstemmer-2.2.0-pyhd8ed1ab_0.tar.bz2#4d22a9315e78c6827f806065957d566e @@ -154,15 +156,16 @@ https://conda.anaconda.org/conda-forge/noarch/beautifulsoup4-4.12.2-pyha770c72_0 https://conda.anaconda.org/conda-forge/linux-64/cairo-1.18.0-h3faef2a_0.conda#f907bb958910dc404647326ca80c263e https://conda.anaconda.org/conda-forge/linux-64/cffi-1.16.0-py39h7a31438_0.conda#ac992767d7f8ed2cb27e71e78f0fb2d7 https://conda.anaconda.org/conda-forge/linux-64/coverage-7.3.2-py39hd1e30aa_0.conda#247a02e7fdc7049c6d1babdb7bca4aaa -https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.44.3-py39hd1e30aa_0.conda#873fb1d81f9e9220d605c6b05a96544c +https://conda.anaconda.org/conda-forge/linux-64/fonttools-4.45.1-py39hd1e30aa_0.conda#616bc0b442acefebdbe97c7b885d771e https://conda.anaconda.org/conda-forge/linux-64/hdf5-1.14.2-nompi_h4f84152_100.conda#2de6a9bc8083b49f09b2f6eb28d3ba3c https://conda.anaconda.org/conda-forge/noarch/importlib-metadata-6.8.0-pyha770c72_0.conda#4e9f59a060c3be52bc4ddc46ee9b6946 https://conda.anaconda.org/conda-forge/noarch/importlib_resources-6.1.1-pyhd8ed1ab_0.conda#3d5fa25cf42f3f32a12b2d874ace8574 https://conda.anaconda.org/conda-forge/noarch/isodate-0.6.1-pyhd8ed1ab_0.tar.bz2#4a62c93c1b5c0b920508ae3fd285eaf5 https://conda.anaconda.org/conda-forge/noarch/jinja2-3.1.2-pyhd8ed1ab_1.tar.bz2#c8490ed5c70966d232fdd389d0dbed37 -https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-19_linux64_openblas.conda#d12374af44575413fbbd4a217d46ea33 +https://conda.anaconda.org/conda-forge/linux-64/libcblas-3.9.0-20_linux64_openblas.conda#36d486d72ab64ffea932329a1d3729a3 https://conda.anaconda.org/conda-forge/linux-64/libgd-2.3.3-h119a65a_9.conda#cfebc557e54905dadc355c0e9f003004 -https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-19_linux64_openblas.conda#9f100edf65436e3eabc2a51fc00b2c37 +https://conda.anaconda.org/conda-forge/linux-64/liblapack-3.9.0-20_linux64_openblas.conda#6fabc51f5e647d09cc010c40061557e0 +https://conda.anaconda.org/conda-forge/noarch/markdown-it-py-3.0.0-pyhd8ed1ab_0.conda#93a8e71256479c62074356ef6ebf501b https://conda.anaconda.org/conda-forge/noarch/nodeenv-1.8.0-pyhd8ed1ab_0.conda#2a75b296096adabbabadd5e9782e5fcc https://conda.anaconda.org/conda-forge/noarch/partd-1.4.1-pyhd8ed1ab_0.conda#acf4b7c0bcd5fa3b0e05801c4d2accd6 https://conda.anaconda.org/conda-forge/linux-64/pillow-10.1.0-py39had0adad_0.conda#eeaa413fddccecb2ab7f747bdb55b07f @@ -196,15 +199,15 @@ https://conda.anaconda.org/conda-forge/noarch/virtualenv-20.24.6-pyhd8ed1ab_0.co https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py39h44dd56e_4.conda#81310d21bf9d91754c1220c585bb72d6 https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h90689f9_2.tar.bz2#957a0255ab58aaf394a91725d73ab422 https://conda.anaconda.org/conda-forge/linux-64/librsvg-2.56.3-h98fae49_0.conda#620e754f4344f4c27259ff460a2b9c50 -https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.1-py39he9076e7_0.conda#89615b866cb3b0d8ad4e2a11e2bcf9a0 +https://conda.anaconda.org/conda-forge/linux-64/matplotlib-base-3.8.2-py39he9076e7_0.conda#6085411aa2f0b2b801d3b46e1d3b83c5 https://conda.anaconda.org/conda-forge/linux-64/netcdf4-1.6.5-nompi_py39h4282601_100.conda#d2809fbf0d8ae7b8ca92c456cb44a7d4 https://conda.anaconda.org/conda-forge/noarch/pre-commit-3.5.0-pyha770c72_0.conda#964e3d762e427661c59263435a14c492 https://conda.anaconda.org/conda-forge/noarch/tox-3.27.1-pyhd8ed1ab_0.tar.bz2#62b743e1030b17163c70654601afb60d https://conda.anaconda.org/conda-forge/linux-64/cartopy-0.22.0-py39hddac248_1.conda#8dd2eb1e7aa9a33a92a75bdcea3f0dd0 -https://conda.anaconda.org/conda-forge/linux-64/graphviz-8.1.0-h28d9a01_0.conda#33628e0e3de7afd2c8172f76439894cb +https://conda.anaconda.org/conda-forge/linux-64/graphviz-9.0.0-h28d9a01_0.conda#32cde7a2ac1ca255ed2a926d548b9d6c https://conda.anaconda.org/conda-forge/noarch/tox-conda-0.9.2-pyhd8ed1ab_0.tar.bz2#8494c2ad4bef7bfe2e2d8603b4c2a185 https://conda.anaconda.org/conda-forge/noarch/iris-3.7.0-pyha770c72_0.conda#dccc1f660bf455c239adaabf56b91dc9 -https://conda.anaconda.org/conda-forge/linux-64/pygraphviz-1.11-py39hfb1e1f0_1.conda#e5b670d58e3006e8a03bd6a56098c44d +https://conda.anaconda.org/conda-forge/linux-64/pygraphviz-1.11-py39h7ef11f9_2.conda#0eab4d12fd2bab26e0ca5aec2d822c0a https://conda.anaconda.org/conda-forge/noarch/sphinx-basic-ng-1.0.0b2-pyhd8ed1ab_1.conda#a631f5c7b7f5045448f966ad71aa2881 https://conda.anaconda.org/conda-forge/noarch/furo-2023.9.10-pyhd8ed1ab_0.conda#0dcfacf6d3e49f2957c69c81356cf892 https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-applehelp-1.0.7-pyhd8ed1ab_0.conda#aebfabcb60c33a89c1f9290cab49bc93 diff --git a/src/CSET/__init__.py b/src/CSET/__init__.py index 5cfa76462..0df82db82 100644 --- a/src/CSET/__init__.py +++ b/src/CSET/__init__.py @@ -43,7 +43,7 @@ def main(): # Run operator chain parser_bake = subparsers.add_parser("bake", help="run a recipe file") parser_bake.add_argument("input_file", type=Path, help="input file to read") - parser_bake.add_argument("output_file", type=Path, help="output file to write") + parser_bake.add_argument("output_dir", type=Path, help="directory to write output") parser_bake.add_argument( "recipe_file", type=Path, @@ -109,7 +109,7 @@ def _bake_command(args): if not args.recipe_file: args.recipe_file = os.getenv("CSET_RECIPE") - execute_recipe(args.recipe_file, args.input_file, args.output_file) + execute_recipe(args.recipe_file, args.input_file, args.output_dir) def _graph_command(args): diff --git a/src/CSET/_common.py b/src/CSET/_common.py index f38a4218e..4f320be70 100644 --- a/src/CSET/_common.py +++ b/src/CSET/_common.py @@ -15,7 +15,9 @@ """Common functionality used across CSET.""" import io +import json import logging +import re from pathlib import Path from typing import Union @@ -80,3 +82,18 @@ def parse_recipe(recipe_yaml: Union[Path, str]): raise err # pragma: no cover return recipe + + +def slugify(s: str) -> str: + """Turn a string into a version that can be used everywhere. + + The resultant string will only consist of a-z, 0-9, dots, dashes, and + underscores. + """ + return re.sub(r"[^a-z0-9\._-]+", "_", s.casefold()).strip("_") + + +def get_recipe_metadata() -> dict: + """Get the metadata of the running recipe.""" + with open("meta.json", "rt", encoding="UTF-8") as fp: + return json.load(fp) diff --git a/src/CSET/operators/__init__.py b/src/CSET/operators/__init__.py index 3b03bfc37..5a5637410 100644 --- a/src/CSET/operators/__init__.py +++ b/src/CSET/operators/__init__.py @@ -15,7 +15,9 @@ """Subpackage contains all of CSET's operators.""" import inspect +import json import logging +import os from pathlib import Path from typing import Union @@ -76,8 +78,19 @@ def get_operator(name: str): raise ValueError(f"Unknown operator: {name}") from err +def _write_metadata(recipe: dict): + """Write a meta.json file in the CWD, with all recipe keys except steps.""" + metadata = recipe.copy() + del metadata["steps"] + with open("meta.json", "wt", encoding="UTF-8") as fp: + json.dump(metadata, fp) + os.sync() + # Stat directory to force NFS to synchronise metadata. + os.stat(Path.cwd()) + + def execute_recipe( - recipe_yaml: Union[Path, str], input_file: Path, output_file: Path + recipe_yaml: Union[Path, str], input_file: Path, output_directory: Path ) -> None: """Parse and executes a recipe file. @@ -92,7 +105,7 @@ def execute_recipe( Pathlike to netCDF (or something else that iris read) file to be used as input. - output_file: Path + output_directory: Path Pathlike indicating desired location of output. Raises @@ -107,7 +120,7 @@ def execute_recipe( The provided recipe is not a stream or Path. """ - def step_parser(step: dict, step_input: any, output_file_path: Path) -> str: + def step_parser(step: dict, step_input: any) -> str: """Execute a recipe step, recursively executing any sub-steps.""" logging.debug(f"Executing step: {step}") kwargs = {} @@ -117,9 +130,7 @@ def step_parser(step: dict, step_input: any, output_file_path: Path) -> str: logging.info(f"operator: {step['operator']}") elif isinstance(step[key], dict) and "operator" in step[key]: logging.debug(f"Recursing into argument: {key}") - kwargs[key] = step_parser(step[key], step_input, output_file_path) - elif step[key] == "CSET_OUTPUT_PATH": - kwargs[key] = output_file_path + kwargs[key] = step_parser(step[key], step_input) else: kwargs[key] = step[key] logging.debug("args: %s", kwargs) @@ -134,13 +145,24 @@ def step_parser(step: dict, step_input: any, output_file_path: Path) -> str: return operator(**kwargs) recipe = parse_recipe(recipe_yaml) - - # Execute the recipe. - step_input = input_file - for step in recipe["steps"]: - step_input = step_parser(step, step_input, output_file) - - logging.info("Recipe output: %s", step_input) + step_input = Path(input_file).absolute() + try: + output_directory.mkdir(parents=True, exist_ok=True) + except FileExistsError as err: + logging.error("Output directory is a file. %s", output_directory) + raise err + + original_working_directory = Path.cwd() + os.chdir(output_directory) + # Create metadata file used by some steps. + _write_metadata(recipe) + try: + # Execute the recipe. + for step in recipe["steps"]: + step_input = step_parser(step, step_input) + logging.info("Recipe output: %s", step_input) + finally: + os.chdir(original_working_directory) __all__ = [ diff --git a/src/CSET/operators/constraints.py b/src/CSET/operators/constraints.py index 012c2c629..cc2819ef5 100644 --- a/src/CSET/operators/constraints.py +++ b/src/CSET/operators/constraints.py @@ -155,7 +155,7 @@ def combine_constraints( Arguments --------- constraint: iris.Constraint - First constraint to combine. This must be named "constraint". + First constraint to combine. additional_constraint_1: iris.Constraint Second constraint to combine. This must be a named argument. additional_constraint_2: iris.Constraint diff --git a/src/CSET/operators/plot.py b/src/CSET/operators/plot.py index 3c270068d..19de19e7a 100644 --- a/src/CSET/operators/plot.py +++ b/src/CSET/operators/plot.py @@ -25,6 +25,69 @@ import iris.plot as iplt import iris.quickplot as qplt import matplotlib.pyplot as plt +from markdown_it import MarkdownIt + +from CSET._common import get_recipe_metadata, slugify + + +def _make_plot_html_page(plot_filename: str) -> None: + """Create a HTML page to display a plot image.""" + meta = get_recipe_metadata() + title = meta.get("title", "Untitled") + description = MarkdownIt().render(meta.get("description", "")) + + # Template stylesheet so we don't have to escape the {}. + stylesheet = """body { + font-family: sans-serif; + display: flex; + flex-wrap: wrap; + justify-content: space-around; + margin: 0; +} +.hidden { + display: none; +} +.plot-container { + width: min(95vw, 95vh); +} +.plot-container>img { + width: 100%; +} +#description-container { + flex: 30ch; + max-height: 90vh; + max-width: 80ch; + margin: min(1em, 5vh); + padding: 0 1em; + background-color: whitesmoke; + box-shadow: 4px 4px 4px grey; + outline: darkgrey solid 1px; + overflow: auto; +} +""" + + html = rf""" + + + + + {title} + + + +
+ plot +
+ + +""" + with open("index.html", "wt", encoding="UTF-8") as fp: + fp.write(html) def _check_single_cube( @@ -59,22 +122,21 @@ def _check_single_cube( def spatial_contour_plot( - cube: iris.cube.Cube, file_path: Path, **kwargs + cube: iris.cube.Cube, filename: Path = None, **kwargs ) -> iris.cube.Cube: - """ - Plot a spatial variable onto a map. + """Plot a spatial variable onto a map. Parameters ---------- cube: Cube An iris cube of the data to plot. It should be 2 dimensional (lat and lon). - file_path: pathlike - The path of the plot to write. + filename: pathlike, optional + The path of the plot to write. Defaults to the recipe name. Returns ------- Cube - The inputted cube (so further operations can be applied) + The original cube (so further operations can be applied) Raises ------ @@ -83,16 +145,22 @@ def spatial_contour_plot( TypeError If cube isn't a Cube. """ + if not filename: + filename = slugify(get_recipe_metadata().get("title", "Untitled")) + filename = Path(filename).with_suffix(".svg") cube = _check_single_cube(cube) qplt.contourf(cube) - file_path = Path(file_path).with_suffix(".svg") - plt.savefig(file_path) - logging.info("Saved contour plot to %s", file_path) + plt.savefig(filename) + logging.info("Saved contour plot to %s", filename) + _make_plot_html_page(filename) return cube def postage_stamp_contour_plot( - cube: iris.cube.Cube, file_path: Path, coordinate: str = "realization", **kwargs + cube: iris.cube.Cube, + filename: Path = None, + coordinate: str = "realization", + **kwargs, ) -> iris.cube.Cube: """Plot postage stamp contour plots from an ensemble. @@ -100,15 +168,15 @@ def postage_stamp_contour_plot( ---------- cube: Cube Iris cube of data to be plotted. It must have a realization coordinate. - file_path: pathlike - The path of the plot to write. + filename: pathlike, optional + The path of the plot to write. Defaults to the recipe name. coordinate: str The coordinate that becomes different plots. Defaults to "realization". Returns ------- Cube - The inputted cube (so further operations can be applied) + The original cube (so further operations can be applied) Raises ------ @@ -117,6 +185,10 @@ def postage_stamp_contour_plot( TypeError If cube isn't a Cube. """ + if not filename: + filename = slugify(get_recipe_metadata().get("title", "Untitled")) + filename = Path(filename).with_suffix(".svg") + # Validate input is in the right form. cube = _check_single_cube(cube) try: @@ -142,8 +214,39 @@ def postage_stamp_contour_plot( colorbar = plt.colorbar(plot, colorbar_axes, orientation="horizontal") colorbar.set_label(f"{cube.name()} / {cube.units}") - file_path = Path(file_path).with_suffix(".svg") - plt.savefig(file_path) - logging.info("Saved contour postage stamp plot to %s", file_path) - + plt.savefig(filename) + logging.info("Saved contour postage stamp plot to %s", filename) + _make_plot_html_page(filename) return cube + + +def time_series_contour_plot( + cube: iris.cube.Cube, filename: Path = None, **kwargs +) -> iris.cube.Cube: + """Plot a spatial variable for all time values. + + The files are named sequentially, e.g. 1.svg, 2.svg, ... + + Parameters + ---------- + cube: Cube + An iris cube of the data to plot. It should be 2 dimensional (lat and + lon). + filename: pathlike, optional + Common component of the plot filenames. Defaults to the recipe name. + + Returns + ------- + Cube + The original cube (so further operations can be applied) + + Raises + ------ + ValueError + If the cube doesn't have the right dimensions. + TypeError + If cube isn't a Cube. + """ + if not filename: + filename = slugify(get_recipe_metadata().get("title", "Untitled")) + raise NotImplementedError diff --git a/src/CSET/operators/write.py b/src/CSET/operators/write.py index 24970acd6..6052f01b9 100644 --- a/src/CSET/operators/write.py +++ b/src/CSET/operators/write.py @@ -20,9 +20,11 @@ import iris import iris.cube +from CSET._common import get_recipe_metadata, slugify + def write_cube_to_nc( - cube: Union[iris.cube.Cube, iris.cube.CubeList], file_path: Path, **kwargs + cube: Union[iris.cube.Cube, iris.cube.CubeList], filename: Path = None, **kwargs ) -> str: """Write a cube to a NetCDF file. @@ -32,17 +34,19 @@ def write_cube_to_nc( Arguments --------- cube: iris.cube.Cube | iris.cube.CubeList - Data to save - file_path: Path - Path to save the cubes too + Data to save. + filename: Path, optional + Path to save the cubes too. Defaults to the recipe title + .nc Returns ------- Cube | CubeList The inputted cube(list) (so further operations can be applied) """ - # Ensure that output_file_path is a Path with a .nc suffix - file_path = Path(file_path).with_suffix(".nc") + if not filename: + filename = slugify(get_recipe_metadata().get("title", "Untitled")) + # Ensure that output filename is a Path with a .nc suffix + filename = Path(filename).with_suffix(".nc") # Save the file as nc compliant (iris should handle this) - iris.save(cube, file_path) + iris.save(cube, filename, zlib=True) return cube diff --git a/src/CSET/recipes/aggregate_precipitation.yaml b/src/CSET/recipes/aggregate_precipitation.yaml index 1384d3741..3e7759d1d 100644 --- a/src/CSET/recipes/aggregate_precipitation.yaml +++ b/src/CSET/recipes/aggregate_precipitation.yaml @@ -23,8 +23,5 @@ steps: interval_iso: PT2H - operator: plot.spatial_contour_plot - file_path: CSET_OUTPUT_PATH - operator: write.write_cube_to_nc - # This is a magic value that becomes the runtime output file path. - file_path: CSET_OUTPUT_PATH diff --git a/src/CSET/recipes/ensemble_3_hour_air_temp.yaml b/src/CSET/recipes/ensemble_3_hour_air_temp.yaml deleted file mode 100644 index 3bef95a37..000000000 --- a/src/CSET/recipes/ensemble_3_hour_air_temp.yaml +++ /dev/null @@ -1,30 +0,0 @@ -steps: - - operator: read.read_cubes - filename_pattern: "*_em*.nc" - constraint: - operator: constraints.generate_stash_constraint - stash: m01s03i236 - - # - operator: aggregate.aggregate - # dimension: time - # method: mean - # interval: PT3H - - # - operator: aggregate.aggregate - # dimension: lat - # method: iris.analysis.weighted_mean - # interval: 0.5 # degrees - - # - operator: write.write_cube_to_nc - # # This is a magic value that becomes the runtime output file path. - # file_path: CSET_OUTPUT_PATH - - - operator: plot.postage_stamp_contour_plot - file_path: CSET_OUTPUT_PATH - - # - operator: aggregate.aggregate - # dimension: realization - # method: iris.analysis.mean - - # - operator: plot.spatial_plot - # file_path: CSET_OUTPUT_PATH diff --git a/src/CSET/recipes/extract_instant_air_temp.yaml b/src/CSET/recipes/extract_instant_air_temp.yaml index 144d2d495..28cc60c1a 100644 --- a/src/CSET/recipes/extract_instant_air_temp.yaml +++ b/src/CSET/recipes/extract_instant_air_temp.yaml @@ -23,5 +23,4 @@ steps: cell_methods: [] - operator: write.write_cube_to_nc - # This is a magic value that becomes the runtime output file path. - file_path: CSET_OUTPUT_PATH + filename: processed_data.nc diff --git a/src/CSET/recipes/initial_time-step_surface_air_temperature_ensemble_postage_stamp_plot.yaml b/src/CSET/recipes/initial_time-step_surface_air_temperature_ensemble_postage_stamp_plot.yaml new file mode 100644 index 000000000..51686f1a9 --- /dev/null +++ b/src/CSET/recipes/initial_time-step_surface_air_temperature_ensemble_postage_stamp_plot.yaml @@ -0,0 +1,20 @@ +title: Initial Time-step Surface Air Temperature Ensemble Postage Stamp Plot +description: | + Plots the first time-step from a set of ensemble air temperature files with a + filename containing the ensemble member in the form `\*_em\*.nc`. + +steps: + - operator: read.read_cubes + filename_pattern: "*_em*.nc" + constraint: + operator: constraints.generate_stash_constraint + stash: m01s03i236 + + - operator: collapse.collapse + coordinate: time + method: MIN + + - operator: plot.postage_stamp_contour_plot + filename: plot.svg + + - operator: write.write_cube_to_nc diff --git a/tests/operators/test_plots.py b/tests/operators/test_plots.py index 86338734b..865180ed8 100644 --- a/tests/operators/test_plots.py +++ b/tests/operators/test_plots.py @@ -26,21 +26,20 @@ def test_spatial_plot(tmp_path: Path): """Plot spatial contour plot of instant air temp.""" input_file = Path("tests/test_data/air_temp.nc") - output_file = tmp_path / f"{uuid4()}" + output_dir = tmp_path / f"{uuid4()}" recipe_file = Path("tests/test_data/plot_instant_air_temp.yaml") - CSET.operators.execute_recipe(recipe_file, input_file, output_file) - actual_output_file = output_file.with_suffix(".svg") - assert actual_output_file.exists() - actual_output_file.unlink() + CSET.operators.execute_recipe(recipe_file, input_file, output_dir) + actual_output_file = output_dir / "plot.svg" + assert actual_output_file.is_file() def test_postage_stamp_plots(tmp_path: Path): """Plot postage stamp plots of ensemble data.""" input_file = Path("tests/test_data/") - output_file = tmp_path / f"{uuid4()}.svg" + output_dir = tmp_path / f"{uuid4()}" recipe_file = Path("tests/test_data/ensemble_air_temp.yaml") - CSET.operators.execute_recipe(recipe_file, input_file, output_file) - assert output_file.exists() + CSET.operators.execute_recipe(recipe_file, input_file, output_dir) + assert output_dir.joinpath("plot.svg").is_file() def test_postage_stamp_realization_check(tmp_path: Path): diff --git a/tests/test_cli.py b/tests/test_cli.py index 1326db47e..1f3fbe066 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -20,6 +20,7 @@ import os import shutil import subprocess +import tempfile from pathlib import Path from uuid import uuid4 @@ -27,7 +28,7 @@ def test_command_line_help(): """Check that help commands work.""" subprocess.run(["cset", "--help"], check=True) - # test verbose options. This is really just to up the coverage number. + # Test verbose options. This is really just to up the coverage number. subprocess.run(["cset", "-v"], check=True) subprocess.run(["cset", "-vv"], check=True) subprocess.run(["cset", "--version"], check=True) @@ -42,7 +43,7 @@ def test_recipe_execution(): "cset", "bake", os.devnull, - os.devnull, + tempfile.gettempdir(), "tests/test_data/noop_recipe.yaml", ], check=True, @@ -62,7 +63,7 @@ def test_environ_var_recipe(): "cset", "bake", os.devnull, - os.devnull, + tempfile.gettempdir(), ], check=True, ) @@ -80,7 +81,7 @@ def test_graph_creation(tmp_path: Path): ("cset", "graph", "-o", str(output_file), "tests/test_data/noop_recipe.yaml"), check=True, ) - assert output_file.exists() + assert output_file.is_file() output_file.unlink() @@ -95,7 +96,7 @@ def test_graph_creation_env_var(tmp_path: Path): # Run with output path specified output_file = tmp_path / f"{uuid4()}.svg" subprocess.run(("cset", "graph", "-o", str(output_file)), check=True) - assert output_file.exists() + assert output_file.is_file() output_file.unlink() @@ -113,18 +114,17 @@ def test_graph_details(tmp_path: Path): ), check=True, ) - assert output_file.exists() - output_file.unlink() + assert output_file.is_file() def test_cookbook_cwd(): """Unpacking the recipes into the current working directory.""" subprocess.run(["cset", "cookbook"], check=True) - assert Path.cwd().joinpath("recipes/extract_instant_air_temp.yaml").exists() + assert Path.cwd().joinpath("recipes/extract_instant_air_temp.yaml").is_file() shutil.rmtree(Path.cwd().joinpath("recipes")) def test_cookbook_path(tmp_path: Path): """Unpacking the recipes into a specified directory.""" subprocess.run(["cset", "cookbook", tmp_path], check=True) - assert (tmp_path / "extract_instant_air_temp.yaml").exists() + assert (tmp_path / "extract_instant_air_temp.yaml").is_file() diff --git a/tests/test_common.py b/tests/test_common.py index 004e0c61f..f3b146033 100644 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -90,3 +90,17 @@ def test_parse_recipe_exception_non_dict(): """Test exception for recipe that parses to a non-dict.""" with pytest.raises(ValueError): common.parse_recipe("[]") + + +def test_slugify(): + """Test slugify removes special characters.""" + assert common.slugify("Test") == "test" + assert ( + common.slugify("Mean Surface Air Temperature Spatial Plot") + == "mean_surface_air_temperature_spatial_plot" + ) + assert common.slugify("file-name.yaml") == "file-name.yaml" + assert common.slugify("First Line\nSecond Line") == "first_line_second_line" + assert common.slugify("greekαβγδchars") == "greek_chars" + assert common.slugify(" ABC ") == "abc" + assert common.slugify("あいうえお") == "" diff --git a/tests/test_data/ensemble_air_temp.yaml b/tests/test_data/ensemble_air_temp.yaml index b9d948866..028302f5b 100644 --- a/tests/test_data/ensemble_air_temp.yaml +++ b/tests/test_data/ensemble_air_temp.yaml @@ -6,4 +6,4 @@ steps: stash: m01s03i236 - operator: plot.postage_stamp_contour_plot - file_path: CSET_OUTPUT_PATH + filename: plot.svg diff --git a/tests/test_data/plot_instant_air_temp.yaml b/tests/test_data/plot_instant_air_temp.yaml index 3aa635d82..01603d993 100644 --- a/tests/test_data/plot_instant_air_temp.yaml +++ b/tests/test_data/plot_instant_air_temp.yaml @@ -24,8 +24,7 @@ steps: time_end: 2022-09-21T03:30:00 - operator: write.write_cube_to_nc - # This is a magic value that becomes the runtime output file path. - file_path: CSET_OUTPUT_PATH - plot_data_as_well: - operator: plot.spatial_contour_plot - file_path: CSET_OUTPUT_PATH + filename: processed_data.nc + + - operator: plot.spatial_contour_plot + filename: plot.svg diff --git a/tests/test_data/plot_instant_air_temp_collapse.yaml b/tests/test_data/plot_instant_air_temp_collapse.yaml index 35a19e431..29209694a 100644 --- a/tests/test_data/plot_instant_air_temp_collapse.yaml +++ b/tests/test_data/plot_instant_air_temp_collapse.yaml @@ -24,8 +24,5 @@ steps: additional_percent: 90 - operator: write.write_cube_to_nc - # This is a magic value that becomes the runtime output file path. - file_path: CSET_OUTPUT_PATH - plot_data_as_well: - operator: plot.spatial_contour_plot - file_path: CSET_OUTPUT_PATH + + - operator: plot.spatial_contour_plot diff --git a/tests/test_recipes.py b/tests/test_recipes.py index 8a0427140..25186ec13 100644 --- a/tests/test_recipes.py +++ b/tests/test_recipes.py @@ -24,7 +24,7 @@ def test_unpack(tmp_path: Path): """Unpack directory containing sub-directories.""" CSET.recipes._unpack_recipes_from_dir(Path("tests"), tmp_path) - assert Path(tmp_path, "test_data/noop_recipe.yaml").exists() + assert Path(tmp_path, "test_data/noop_recipe.yaml").is_file() # Run again to check that warnings are produced when files collide. CSET.recipes._unpack_recipes_from_dir(Path("tests"), tmp_path) diff --git a/tests/test_run_recipes.py b/tests/test_run_recipes.py index e83024868..6651a055e 100644 --- a/tests/test_run_recipes.py +++ b/tests/test_run_recipes.py @@ -49,16 +49,14 @@ def test_get_operator_exception_not_callable(): def test_execute_recipe(tmp_path: Path): """Execute recipe to test happy case (this is really an integration test).""" input_file = Path("tests/test_data/air_temp.nc") - output_file = tmp_path / f"{uuid4()}.nc" + output_dir = tmp_path / f"{uuid4()}" recipe_file = Path("tests/test_data/plot_instant_air_temp.yaml") - CSET.operators.execute_recipe(recipe_file, input_file, output_file) - output_file.unlink() + CSET.operators.execute_recipe(recipe_file, input_file, output_dir) def test_execute_recipe_edge_cases(tmp_path: Path): """Test weird edge cases. Also tests data paths not being pathlib Paths.""" input_file = "tests/test_data/air_temp.nc" - output_file = tmp_path / f"{uuid4()}.nc" + output_dir = tmp_path / f"{uuid4()}" recipe = Path("tests/test_data/noop_recipe.yaml") - CSET.operators.execute_recipe(recipe, input_file, output_file) - # The output_file doesn't actually get written, so doesn't need removing. + CSET.operators.execute_recipe(recipe, input_file, output_dir)