anemoi-datasets 0.5.6__tar.gz → 0.5.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/.github/workflows/ci.yml +3 -2
  2. anemoi_datasets-0.5.7/.github/workflows/push-to-private.yml +33 -0
  3. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/.github/workflows/python-publish.yml +1 -0
  4. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/.pre-commit-config.yaml +4 -4
  5. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/CHANGELOG.md +14 -1
  6. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/PKG-INFO +1 -1
  7. anemoi_datasets-0.5.7/docs/building/filters/rename.rst +20 -0
  8. anemoi_datasets-0.5.7/docs/building/filters/yaml/rename.yaml +11 -0
  9. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/_version.py +2 -2
  10. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/inspect.py +4 -0
  11. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/__init__.py +4 -39
  12. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray/coordinates.py +2 -0
  13. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray/flavour.py +19 -14
  14. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray/grid.py +1 -0
  15. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray/time.py +37 -2
  16. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/result.py +37 -1
  17. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/persistent.py +4 -1
  18. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/statistics/__init__.py +4 -1
  19. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/zarr.py +5 -1
  20. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/forwards.py +4 -1
  21. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/join.py +13 -0
  22. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/select.py +11 -0
  23. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/stores.py +4 -0
  24. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/unchecked.py +5 -0
  25. anemoi_datasets-0.5.7/src/anemoi/datasets/testing.py +59 -0
  26. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi_datasets.egg-info/PKG-INFO +1 -1
  27. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi_datasets.egg-info/SOURCES.txt +4 -1
  28. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tests/create/test_create.py +7 -8
  29. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tests/xarray/test_netcdf.py +12 -6
  30. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tests/xarray/test_opendap.py +2 -4
  31. anemoi_datasets-0.5.7/tests/xarray/test_samples.py +65 -0
  32. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tests/xarray/test_zarr.py +4 -27
  33. anemoi_datasets-0.5.7/tools/make-sample-dataset.py +29 -0
  34. anemoi_datasets-0.5.6/docs/building/filters/rename.rst +0 -6
  35. anemoi_datasets-0.5.6/docs/building/filters/yaml/rename.yaml +0 -4
  36. anemoi_datasets-0.5.6/tests/create/data_sources.yaml +0 -28
  37. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/.gitattributes +0 -0
  38. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/.github/CODEOWNERS +0 -0
  39. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  40. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/.github/ci-config.yml +0 -0
  41. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/.github/ci-hpc-config.yml +0 -0
  42. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/.github/workflows/changelog-pr-update.yml +0 -0
  43. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/.github/workflows/changelog-release-update.yml +0 -0
  44. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/.github/workflows/label-public-pr.yml +0 -0
  45. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/.github/workflows/python-pull-request.yml +0 -0
  46. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/.github/workflows/readthedocs-pr-update.yml +0 -0
  47. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/.gitignore +0 -0
  48. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/.readthedocs.yaml +0 -0
  49. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/.vscode/spellright.dict +0 -0
  50. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/LICENSE +0 -0
  51. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/README.md +0 -0
  52. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/Makefile +0 -0
  53. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/_static/logo.png +0 -0
  54. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/_static/style.css +0 -0
  55. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/_templates/.gitkeep +0 -0
  56. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/apply-fmt.sh +0 -0
  57. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/advanced-options.rst +0 -0
  58. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/filters/empty.rst +0 -0
  59. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/filters/noop.rst +0 -0
  60. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/filters/rotate_winds.rst +0 -0
  61. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/filters/select.rst +0 -0
  62. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/filters/unrotate_winds.rst +0 -0
  63. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/filters.rst +0 -0
  64. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/handling-missing-dates.rst +0 -0
  65. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/handling-missing-values.rst +0 -0
  66. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/incremental.rst +0 -0
  67. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/introduction.rst +0 -0
  68. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/naming-variables.rst +0 -0
  69. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/operations.rst +0 -0
  70. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/accumulations.rst +0 -0
  71. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/forcings.rst +0 -0
  72. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/grib.rst +0 -0
  73. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/hindcasts.rst +0 -0
  74. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/mars.rst +0 -0
  75. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/netcdf.rst +0 -0
  76. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/opendap.rst +0 -0
  77. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/recentre.rst +0 -0
  78. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/repeated_dates.rst +0 -0
  79. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/xarray-based.rst +0 -0
  80. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/xarray-kerchunk.py +0 -0
  81. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/xarray-kerchunk.rst +0 -0
  82. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/xarray-zarr.rst +0 -0
  83. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/accumulations1.yaml +0 -0
  84. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/accumulations2.yaml +0 -0
  85. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/forcings.yaml +0 -0
  86. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/grib1.yaml +0 -0
  87. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/grib2.yaml +0 -0
  88. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/grib3.yaml +0 -0
  89. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/grib4.yaml +0 -0
  90. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/hindcasts.yaml +0 -0
  91. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/mars1.yaml +0 -0
  92. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/mars2.yaml +0 -0
  93. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/netcdf.yaml +0 -0
  94. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/opendap.yaml +0 -0
  95. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/recentre.yaml +0 -0
  96. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/repeated_dates1.yaml +0 -0
  97. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/repeated_dates2.yaml +0 -0
  98. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/repeated_dates3.yaml +0 -0
  99. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/repeated_dates4.yaml +0 -0
  100. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/xarray-based.yaml +0 -0
  101. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/xarray-kerchunk.yaml +0 -0
  102. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/xarray-zarr.yaml +0 -0
  103. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/yaml/zenodo.yaml +0 -0
  104. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources/zenodo.rst +0 -0
  105. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/sources.rst +0 -0
  106. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/statistics.rst +0 -0
  107. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/syntax.yaml +0 -0
  108. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/yaml/Makefile +0 -0
  109. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/yaml/building1.txt +0 -0
  110. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/yaml/building1.yaml +0 -0
  111. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/yaml/building2.txt +0 -0
  112. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/yaml/building2.yaml +0 -0
  113. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/yaml/building3.txt +0 -0
  114. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/yaml/building3.yaml +0 -0
  115. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/yaml/concat.yaml +0 -0
  116. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/yaml/hindcasts.yaml +0 -0
  117. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/yaml/input.yaml +0 -0
  118. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/yaml/missing_dates.yaml +0 -0
  119. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/yaml/nan.yaml +0 -0
  120. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/building/yaml/pipe.yaml +0 -0
  121. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/check-index.sh +0 -0
  122. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/cli/compare.rst +0 -0
  123. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/cli/copy.rst +0 -0
  124. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/cli/create.rst +0 -0
  125. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/cli/inspect.rst +0 -0
  126. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/cli/introduction.rst +0 -0
  127. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/cli/scan.rst +0 -0
  128. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/conf.py +0 -0
  129. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/images.pptx +0 -0
  130. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/index.rst +0 -0
  131. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/installing.rst +0 -0
  132. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/overview.rst +0 -0
  133. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/overview_.py +0 -0
  134. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/schemas/matrix.excalidraw +0 -0
  135. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/schemas/matrix.png +0 -0
  136. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/schemas/overview.excalidraw +0 -0
  137. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/schemas/overview.png +0 -0
  138. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/schemas/recipe.excalidraw +0 -0
  139. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/schemas/recipe.png +0 -0
  140. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/area1_.py +0 -0
  141. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/area2_.py +0 -0
  142. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/chain_.py +0 -0
  143. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/combine_example.py +0 -0
  144. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/concat1.py +0 -0
  145. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/cutout_.py +0 -0
  146. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/drop_.py +0 -0
  147. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/end_.py +0 -0
  148. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/ensembles1_.py +0 -0
  149. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/fill_missing_gaps_.py +0 -0
  150. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/frequency1_.py +0 -0
  151. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/frequency2_.py +0 -0
  152. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/grids1_.py +0 -0
  153. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/iterating_missing_dates1_.py +0 -0
  154. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/iterating_missing_dates2_.py +0 -0
  155. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/iterating_missing_dates3_.py +0 -0
  156. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/join1.py +0 -0
  157. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/matching0_.py +0 -0
  158. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/matching1_.py +0 -0
  159. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/matching2_.py +0 -0
  160. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/matching3_.py +0 -0
  161. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/matching4_.py +0 -0
  162. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/misc1.py +0 -0
  163. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/misc2.py +0 -0
  164. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/missing_.py +0 -0
  165. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/missing_dates_.py +0 -0
  166. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/open_cloud.py +0 -0
  167. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/open_combine1_.py +0 -0
  168. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/open_combine2_.py +0 -0
  169. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/open_complex.py +0 -0
  170. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/open_dict_.py +0 -0
  171. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/open_first_.py +0 -0
  172. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/open_list_.py +0 -0
  173. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/open_name.py +0 -0
  174. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/open_other.py +0 -0
  175. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/open_path.py +0 -0
  176. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/open_yaml_.py +0 -0
  177. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/rename_.py +0 -0
  178. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/reorder1_.py +0 -0
  179. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/reorder2_.py +0 -0
  180. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/rescale_.py +0 -0
  181. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/select1_.py +0 -0
  182. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/select2_.py +0 -0
  183. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/shuffle_.py +0 -0
  184. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/some_attributes_.py +0 -0
  185. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/start_.py +0 -0
  186. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/statistics_.py +0 -0
  187. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/subset_example.py +0 -0
  188. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/thinning_.py +0 -0
  189. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/xy1_.py +0 -0
  190. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/xy2_.py +0 -0
  191. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/zip1_.py +0 -0
  192. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/zip2_.py +0 -0
  193. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/code/zip_xy_.py +0 -0
  194. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/combining.rst +0 -0
  195. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/configuration.rst +0 -0
  196. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/configuration.toml +0 -0
  197. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/grids.rst +0 -0
  198. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/images/area-1.png +0 -0
  199. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/images/concat.png +0 -0
  200. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/images/cutout-1.png +0 -0
  201. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/images/cutout-2.png +0 -0
  202. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/images/cutout-3.png +0 -0
  203. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/images/cutout-4.png +0 -0
  204. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/images/cutout-5.png +0 -0
  205. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/images/cutout-6.png +0 -0
  206. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/images/join.png +0 -0
  207. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/images/overlay.png +0 -0
  208. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/images/skip-missing.png +0 -0
  209. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/images/thinning-after.png +0 -0
  210. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/images/thinning-before.png +0 -0
  211. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/introduction.rst +0 -0
  212. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/matching.rst +0 -0
  213. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/methods.rst +0 -0
  214. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/miscellaneous.rst +0 -0
  215. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/missing.rst +0 -0
  216. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/opening.rst +0 -0
  217. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/other.rst +0 -0
  218. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/selecting.rst +0 -0
  219. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/statistics.rst +0 -0
  220. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/subsetting.rst +0 -0
  221. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/docs/using/zip.rst +0 -0
  222. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/pyproject.toml +0 -0
  223. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/setup.cfg +0 -0
  224. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/__init__.py +0 -0
  225. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/__main__.py +0 -0
  226. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/__init__.py +0 -0
  227. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/cleanup.py +0 -0
  228. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/compare.py +0 -0
  229. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/copy.py +0 -0
  230. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/create.py +0 -0
  231. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/finalise-additions.py +0 -0
  232. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/finalise.py +0 -0
  233. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/init-additions.py +0 -0
  234. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/init.py +0 -0
  235. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/load-additions.py +0 -0
  236. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/load.py +0 -0
  237. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/patch.py +0 -0
  238. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/publish.py +0 -0
  239. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/commands/scan.py +0 -0
  240. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/compute/__init__.py +0 -0
  241. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/compute/recentre.py +0 -0
  242. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/check.py +0 -0
  243. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/chunks.py +0 -0
  244. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/config.py +0 -0
  245. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/__init__.py +0 -0
  246. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/__init__.py +0 -0
  247. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/empty.py +0 -0
  248. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/noop.py +0 -0
  249. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/pressure_level_relative_humidity_to_specific_humidity.py +0 -0
  250. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/pressure_level_specific_humidity_to_relative_humidity.py +0 -0
  251. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/rename.py +0 -0
  252. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/rotate_winds.py +0 -0
  253. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/single_level_dewpoint_to_relative_humidity.py +0 -0
  254. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/single_level_relative_humidity_to_dewpoint.py +0 -0
  255. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/single_level_relative_humidity_to_specific_humidity.py +0 -0
  256. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/single_level_specific_humidity_to_relative_humidity.py +0 -0
  257. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/speeddir_to_uv.py +0 -0
  258. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/unrotate_winds.py +0 -0
  259. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/filters/uv_to_speeddir.py +0 -0
  260. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/__init__.py +0 -0
  261. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/accumulations.py +0 -0
  262. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/constants.py +0 -0
  263. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/empty.py +0 -0
  264. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/forcings.py +0 -0
  265. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/grib.py +0 -0
  266. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/hindcasts.py +0 -0
  267. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/mars.py +0 -0
  268. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/netcdf.py +0 -0
  269. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/opendap.py +0 -0
  270. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/recentre.py +0 -0
  271. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/source.py +0 -0
  272. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/tendencies.py +0 -0
  273. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray/__init__.py +0 -0
  274. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray/field.py +0 -0
  275. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray/fieldlist.py +0 -0
  276. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray/metadata.py +0 -0
  277. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray/variable.py +0 -0
  278. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray_kerchunk.py +0 -0
  279. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/xarray_zarr.py +0 -0
  280. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/functions/sources/zenodo.py +0 -0
  281. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/__init__.py +0 -0
  282. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/action.py +0 -0
  283. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/concat.py +0 -0
  284. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/context.py +0 -0
  285. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/data_sources.py +0 -0
  286. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/empty.py +0 -0
  287. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/filter.py +0 -0
  288. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/function.py +0 -0
  289. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/join.py +0 -0
  290. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/misc.py +0 -0
  291. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/pipe.py +0 -0
  292. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/repeated_dates.py +0 -0
  293. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/step.py +0 -0
  294. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/template.py +0 -0
  295. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/input/trace.py +0 -0
  296. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/patch.py +0 -0
  297. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/size.py +0 -0
  298. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/statistics/summary.py +0 -0
  299. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/utils.py +0 -0
  300. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/create/writer.py +0 -0
  301. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/__init__.py +0 -0
  302. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/concat.py +0 -0
  303. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/dataset.py +0 -0
  304. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/debug.css +0 -0
  305. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/debug.py +0 -0
  306. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/ensemble.py +0 -0
  307. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/grids.py +0 -0
  308. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/indexing.py +0 -0
  309. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/interpolate.py +0 -0
  310. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/masked.py +0 -0
  311. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/misc.py +0 -0
  312. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/missing.py +0 -0
  313. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/rescale.py +0 -0
  314. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/statistics.py +0 -0
  315. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/subset.py +0 -0
  316. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/data/xy.py +0 -0
  317. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/dates/__init__.py +0 -0
  318. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/dates/groups.py +0 -0
  319. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/fields.py +0 -0
  320. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/grids.py +0 -0
  321. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/utils/__init__.py +0 -0
  322. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi/datasets/utils/fields.py +0 -0
  323. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi_datasets.egg-info/dependency_links.txt +0 -0
  324. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi_datasets.egg-info/entry_points.txt +0 -0
  325. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi_datasets.egg-info/requires.txt +0 -0
  326. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/src/anemoi_datasets.egg-info/top_level.txt +0 -0
  327. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tests/create/concat.yaml +0 -0
  328. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tests/create/join.yaml +0 -0
  329. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tests/create/missing.yaml +0 -0
  330. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tests/create/nan.yaml +0 -0
  331. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tests/create/pipe.yaml +0 -0
  332. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tests/create/recentre.yaml +0 -0
  333. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tests/create/run.sh +0 -0
  334. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tests/create-perturbations-full.yaml +0 -0
  335. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tests/create-shift.yaml +0 -0
  336. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tests/test_chunks.py +0 -0
  337. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tests/test_data.py +0 -0
  338. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tests/test_dates.py +0 -0
  339. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tests/test_indexing.py +0 -0
  340. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tests/xarray/test_kerchunk.py +0 -0
  341. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tools/.gitignore +0 -0
  342. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tools/examples/Makefile +0 -0
  343. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tools/examples/an-oper-2023-2023-2p5-6h-v1.yaml +0 -0
  344. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tools/grids/Makefile +0 -0
  345. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tools/grids/grids.ipynb +0 -0
  346. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tools/grids/grids1.yaml +0 -0
  347. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tools/grids/grids2.yaml +0 -0
  348. {anemoi_datasets-0.5.6 → anemoi_datasets-0.5.7}/tools/upload-sample-dataset.py +0 -0
@@ -35,8 +35,9 @@ on:
35
35
  jobs:
36
36
  # Run CI including downstream packages on self-hosted runners
37
37
  downstream-ci:
38
+
38
39
  name: downstream-ci
39
- if: ${{ !github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci' }}
40
+ if: ${{ !contains(github.repository, 'private') && (!github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci') }}
40
41
  uses: ecmwf-actions/downstream-ci/.github/workflows/downstream-ci.yml@main
41
42
  with:
42
43
  anemoi-datasets: ecmwf/anemoi-datasets@${{ github.event.pull_request.head.sha || github.sha }}
@@ -46,7 +47,7 @@ jobs:
46
47
  # Build downstream packages on HPC
47
48
  downstream-ci-hpc:
48
49
  name: downstream-ci-hpc
49
- if: ${{ !github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci' }}
50
+ if: ${{ !contains(github.repository, 'private') && (!github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci') }}
50
51
  uses: ecmwf-actions/downstream-ci/.github/workflows/downstream-ci-hpc.yml@main
51
52
  with:
52
53
  anemoi-datasets: ecmwf/anemoi-datasets@${{ github.event.pull_request.head.sha || github.sha }}
@@ -0,0 +1,33 @@
1
+ name: Push to private repository
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - develop
7
+
8
+ jobs:
9
+ push_changes:
10
+ if: ${{ !contains(github.repository, 'private') }}
11
+ runs-on: ubuntu-latest
12
+
13
+ steps:
14
+ - name: Checkout source repository
15
+ uses: actions/checkout@v3
16
+ with:
17
+ fetch-depth: 0
18
+ fetch-tags: true
19
+
20
+ - name: Set up Git configuration
21
+ run: |
22
+ git config user.name "github-actions[bot]"
23
+ git config user.email "github-actions[bot]@users.noreply.github.com"
24
+
25
+ - name: Setup SSH key
26
+ uses: webfactory/ssh-agent@v0.5.0
27
+ with:
28
+ ssh-private-key: ${{ secrets.KEY_TO_PRIVATE }}
29
+
30
+ - name: Push changes to private repository
31
+ run: |
32
+ git remote add private git@github.com:${{ github.repository }}-private.git
33
+ git push --set-upstream private develop
@@ -9,6 +9,7 @@ on:
9
9
 
10
10
  jobs:
11
11
  quality:
12
+ if: ${{ !contains(github.repository, 'private') }}
12
13
  uses: ecmwf-actions/reusable-workflows/.github/workflows/qa-precommit-run.yml@v2
13
14
  with:
14
15
  skip-hooks: "no-commit-to-branch"
@@ -5,12 +5,12 @@ repos:
5
5
  - id: clear-notebooks-output
6
6
  name: clear-notebooks-output
7
7
  files: tools/.*\.ipynb$
8
- stages: [commit]
8
+ stages: [pre-commit]
9
9
  language: python
10
10
  entry: jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace
11
11
  additional_dependencies: [jupyter]
12
12
  - repo: https://github.com/pre-commit/pre-commit-hooks
13
- rev: v4.6.0
13
+ rev: v5.0.0
14
14
  hooks:
15
15
  - id: check-yaml # Check YAML files for syntax errors only
16
16
  args: [--unsafe, --allow-multiple-documents]
@@ -40,7 +40,7 @@ repos:
40
40
  - --force-single-line-imports
41
41
  - --profile black
42
42
  - repo: https://github.com/astral-sh/ruff-pre-commit
43
- rev: v0.6.4
43
+ rev: v0.6.9
44
44
  hooks:
45
45
  - id: ruff
46
46
  # Next line if for documenation cod snippets
@@ -66,7 +66,7 @@ repos:
66
66
  - id: docconvert
67
67
  args: ["numpy"]
68
68
  - repo: https://github.com/tox-dev/pyproject-fmt
69
- rev: "2.2.3"
69
+ rev: "2.2.4"
70
70
  hooks:
71
71
  - id: pyproject-fmt
72
72
 
@@ -8,7 +8,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
8
8
  Please add your functional changes to the appropriate section in the PR.
9
9
  Keep it human-readable, your future self will thank you!
10
10
 
11
- ## [Unreleased](https://github.com/ecmwf/anemoi-datasets/compare/0.5.5...HEAD)
11
+ ## [Unreleased](https://github.com/ecmwf/anemoi-datasets/compare/0.5.6...HEAD)
12
+
13
+ ## [Allow for unknown CF coordinates](https://github.com/ecmwf/anemoi-datasets/compare/0.5.5...0.5.6) - 2024-10-04
14
+
15
+ - Update documentation
16
+
17
+ ### Changed
18
+
19
+ - Add `variables_metadata` entry in the dataset metadata
20
+
21
+ ### Changed
22
+
23
+ - Add `variables_metadata` entry in the dataset metadata
12
24
 
13
25
  ## [0.5.5](https://github.com/ecmwf/anemoi-datasets/compare/0.5.4...0.5.5) - 2024-10-04
14
26
 
@@ -49,6 +61,7 @@ Keep it human-readable, your future self will thank you!
49
61
  - Bug fix when creating dataset from zarr
50
62
  - Bug fix with area selection in cutout operation
51
63
  - add paths-ignore to ci workflow
64
+ - call provenance less often
52
65
 
53
66
  ### Removed
54
67
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: anemoi-datasets
3
- Version: 0.5.6
3
+ Version: 0.5.7
4
4
  Summary: A package to hold various functions to support training of ML models on ECMWF data.
5
5
  Author-email: "European Centre for Medium-Range Weather Forecasts (ECMWF)" <software.support@ecmwf.int>
6
6
  License: Apache License
@@ -0,0 +1,20 @@
1
+ ########
2
+ rename
3
+ ########
4
+
5
+ When combining several sources, it is common to have different values
6
+ for a given attribute to represents the same concept. For example,
7
+ ``temperature_850hPa`` and ``t_850`` are two different ways to represent
8
+ the temperature at 850 hPa. The ``rename`` filter allows to rename a key
9
+ to another key. It is a :ref:`filter <filters>` that needs to follow a
10
+ :ref:`source <sources>` or another filter in a :ref:`building-pipe`
11
+ operation.
12
+
13
+ .. literalinclude:: yaml/rename.yaml
14
+ :language: yaml
15
+
16
+ .. note::
17
+
18
+ The ``rename`` filter was mostly designed to rename the ``param``
19
+ attribute, but any key can be renamed. The ``rename`` filter can take
20
+ several renaming keys.
@@ -0,0 +1,11 @@
1
+ input:
2
+ pipe:
3
+ - source: # mars, grib, netcdf, etc.
4
+ # source attributes here
5
+ # ...
6
+
7
+ - rename:
8
+ param: # Map old `param` names to new ones
9
+ temperature_2m: 2t
10
+ temperature_850hPa: t_850
11
+ # ...
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.5.6'
16
- __version_tuple__ = version_tuple = (0, 5, 6)
15
+ __version__ = version = '0.5.7'
16
+ __version_tuple__ = version_tuple = (0, 5, 7)
@@ -506,6 +506,10 @@ class Version0_6(Version):
506
506
  def variables(self):
507
507
  return self.metadata["variables"]
508
508
 
509
+ @property
510
+ def variables_metadata(self):
511
+ return self.metadata.get("variables_metadata", {})
512
+
509
513
 
510
514
  class Version0_12(Version0_6):
511
515
  def details(self):
@@ -25,6 +25,7 @@ from anemoi.utils.dates import frequency_to_string
25
25
  from anemoi.utils.dates import frequency_to_timedelta
26
26
  from anemoi.utils.humanize import compress_dates
27
27
  from anemoi.utils.humanize import seconds_to_human
28
+ from anemoi.utils.sanitise import sanitise
28
29
  from earthkit.data.core.order import build_remapping
29
30
 
30
31
  from anemoi.datasets import MissingDateError
@@ -52,7 +53,7 @@ from .writer import ViewCacheArray
52
53
 
53
54
  LOG = logging.getLogger(__name__)
54
55
 
55
- VERSION = "0.20"
56
+ VERSION = "0.30"
56
57
 
57
58
 
58
59
  def json_tidy(o):
@@ -325,43 +326,6 @@ def build_input_(main_config, output_config):
325
326
  return builder
326
327
 
327
328
 
328
- def tidy_recipe(config: object):
329
- """Remove potentially private information in the config"""
330
- config = deepcopy(config)
331
- if isinstance(config, (tuple, list)):
332
- return [tidy_recipe(_) for _ in config]
333
- if isinstance(config, (dict, DotDict)):
334
- for k, v in config.items():
335
- if k.startswith("_"):
336
- config[k] = "*** REMOVED FOR SECURITY ***"
337
- else:
338
- config[k] = tidy_recipe(v)
339
- if isinstance(config, str):
340
- if config.startswith("_"):
341
- return "*** REMOVED FOR SECURITY ***"
342
- if config.startswith("s3://"):
343
- return "*** REMOVED FOR SECURITY ***"
344
- if config.startswith("gs://"):
345
- return "*** REMOVED FOR SECURITY ***"
346
- if config.startswith("http"):
347
- return "*** REMOVED FOR SECURITY ***"
348
- if config.startswith("ftp"):
349
- return "*** REMOVED FOR SECURITY ***"
350
- if config.startswith("file"):
351
- return "*** REMOVED FOR SECURITY ***"
352
- if config.startswith("ssh"):
353
- return "*** REMOVED FOR SECURITY ***"
354
- if config.startswith("scp"):
355
- return "*** REMOVED FOR SECURITY ***"
356
- if config.startswith("rsync"):
357
- return "*** REMOVED FOR SECURITY ***"
358
- if config.startswith("/"):
359
- return "*** REMOVED FOR SECURITY ***"
360
- if "@" in config:
361
- return "*** REMOVED FOR SECURITY ***"
362
- return config
363
-
364
-
365
329
  class Init(Actor, HasRegistryMixin, HasStatisticTempMixin, HasElementForDataMixin):
366
330
  dataset_class = NewDataset
367
331
  def __init__(self, path, config, check_name=False, overwrite=False, use_threads=False, statistics_temp_dir=None, progress=None, test=False, cache=None, **kwargs): # fmt: skip
@@ -448,7 +412,7 @@ class Init(Actor, HasRegistryMixin, HasStatisticTempMixin, HasElementForDataMixi
448
412
  metadata.update(self.main_config.get("add_metadata", {}))
449
413
 
450
414
  metadata["_create_yaml_config"] = self.main_config.get_serialisable_dict()
451
- metadata["recipe"] = tidy_recipe(self.main_config.get_serialisable_dict())
415
+ metadata["recipe"] = sanitise(self.main_config.get_serialisable_dict())
452
416
 
453
417
  metadata["description"] = self.main_config.description
454
418
  metadata["licence"] = self.main_config["licence"]
@@ -467,6 +431,7 @@ class Init(Actor, HasRegistryMixin, HasStatisticTempMixin, HasElementForDataMixi
467
431
  metadata["data_request"] = self.minimal_input.data_request
468
432
  metadata["field_shape"] = self.minimal_input.field_shape
469
433
  metadata["proj_string"] = self.minimal_input.proj_string
434
+ metadata["variables_metadata"] = self.minimal_input.variables_metadata
470
435
 
471
436
  metadata["start_date"] = dates[0].isoformat()
472
437
  metadata["end_date"] = dates[-1].isoformat()
@@ -30,6 +30,8 @@ def extract_single_value(variable):
30
30
  if np.issubdtype(variable.values.dtype, np.datetime64):
31
31
  if len(shape) == 0:
32
32
  return to_datetime(variable.values) # Convert to python datetime
33
+ if shape == (1,):
34
+ return to_datetime(variable.values[0])
33
35
  assert False, (shape, variable.values[:2])
34
36
 
35
37
  if np.issubdtype(variable.values.dtype, np.timedelta64):
@@ -228,20 +228,15 @@ class CoordinateGuesser:
228
228
  x = x[0]
229
229
  y = y[0]
230
230
 
231
- _, unstructured = self._check_dims(variable, x, y)
231
+ dim_vars, unstructured = self._check_dims(variable, x, y)
232
232
 
233
- if x.variable.dims != y.variable.dims:
234
- raise ValueError(f"Dimensions do not match {x.name}{x.variable.dims} != {y.name}{y.variable.dims}")
235
-
236
- if (x.name, y.name) in self._cache:
237
- return self._cache[(x.name, y.name)]
238
-
239
- if (x.name, y.name) in self._cache:
240
- return self._cache[(x.name, y.name)]
241
-
242
- assert len(x.variable.shape) == len(y.variable.shape), (x.variable.shape, y.variable.shape)
233
+ if (x.name, y.name, dim_vars) in self._cache:
234
+ return self._cache[(x.name, y.name, dim_vars)]
243
235
 
244
236
  grid_mapping = variable.attrs.get("grid_mapping", None)
237
+ if grid_mapping is not None:
238
+ print(f"grid_mapping: {grid_mapping}")
239
+ print(self.ds[grid_mapping])
245
240
 
246
241
  if grid_mapping is None:
247
242
  LOG.warning(f"No 'grid_mapping' attribute provided for '{variable.name}'")
@@ -288,11 +283,19 @@ class CoordinateGuesser:
288
283
  grid_mapping = self.ds.attrs["crs"]
289
284
  LOG.warning(f"Using CRS {grid_mapping} from global attributes")
290
285
 
286
+ grid = None
291
287
  if grid_mapping is not None:
288
+
289
+ grid_mapping = dict(self.ds[grid_mapping].attrs)
290
+
292
291
  if unstructured:
293
- return UnstructuredProjectionGrid(x, y, grid_mapping)
292
+ grid = UnstructuredProjectionGrid(x, y, grid_mapping)
294
293
  else:
295
- return MeshProjectionGrid(x, y, grid_mapping)
294
+ grid = MeshProjectionGrid(x, y, grid_mapping)
295
+
296
+ if grid is not None:
297
+ self._cache[(x.name, y.name, dim_vars)] = grid
298
+ return grid
296
299
 
297
300
  LOG.error("Could not fine a candidate for 'grid_mapping'")
298
301
  raise NotImplementedError(f"Unstructured grid {x.name} {y.name}")
@@ -340,12 +343,14 @@ class DefaultCoordinateGuesser(CoordinateGuesser):
340
343
  if standard_name == "time":
341
344
  return TimeCoordinate(c)
342
345
 
343
- if name == "time":
346
+ # That is the output of `cfgrib` for forecasts
347
+ if name == "time" and standard_name != "forecast_reference_time":
344
348
  return TimeCoordinate(c)
345
349
 
346
350
  def _is_date(self, c, *, axis, name, long_name, standard_name, units):
347
351
  if standard_name == "forecast_reference_time":
348
352
  return DateCoordinate(c)
353
+
349
354
  if name == "forecast_reference_time":
350
355
  return DateCoordinate(c)
351
356
 
@@ -100,6 +100,7 @@ class ProjectionGrid(XYGrid):
100
100
  data_crs = CRS.from_cf(self.projection)
101
101
  else:
102
102
  data_crs = self.projection
103
+
103
104
  wgs84_crs = CRS.from_epsg(4326) # WGS84
104
105
 
105
106
  return Transformer.from_crs(data_crs, wgs84_crs, always_xy=True)
@@ -9,9 +9,12 @@
9
9
 
10
10
 
11
11
  import datetime
12
+ import logging
12
13
 
13
14
  from anemoi.utils.dates import as_datetime
14
15
 
16
+ LOG = logging.getLogger(__name__)
17
+
15
18
 
16
19
  class Time:
17
20
 
@@ -36,7 +39,28 @@ class Time:
36
39
  if len(date_coordinate) == 1 and len(time_coordinate) == 0 and len(step_coordinate) == 1:
37
40
  return ForecastFromBaseTimeAndDate(date_coordinate[0], step_coordinate[0])
38
41
 
39
- raise NotImplementedError(f"{date_coordinate=} {time_coordinate=} {step_coordinate=}")
42
+ if len(date_coordinate) == 1 and len(time_coordinate) == 1 and len(step_coordinate) == 1:
43
+ return ForecastFromValidTimeAndStep(time_coordinate[0], step_coordinate[0], date_coordinate[0])
44
+
45
+ LOG.error("")
46
+ LOG.error(f"{len(date_coordinate)} date_coordinate")
47
+ for c in date_coordinate:
48
+ LOG.error(" %s %s %s %s", c, c.is_date, c.is_time, c.is_step)
49
+ # LOG.error(' %s', c.variable)
50
+
51
+ LOG.error("")
52
+ LOG.error(f"{len(time_coordinate)} time_coordinate")
53
+ for c in time_coordinate:
54
+ LOG.error(" %s %s %s %s", c, c.is_date, c.is_time, c.is_step)
55
+ # LOG.error(' %s', c.variable)
56
+
57
+ LOG.error("")
58
+ LOG.error(f"{len(step_coordinate)} step_coordinate")
59
+ for c in step_coordinate:
60
+ LOG.error(" %s %s %s %s", c, c.is_date, c.is_time, c.is_step)
61
+ # LOG.error(' %s', c.variable)
62
+
63
+ raise NotImplementedError(f"{len(date_coordinate)=} {len(time_coordinate)=} {len(step_coordinate)=}")
40
64
 
41
65
 
42
66
  class Constant(Time):
@@ -62,9 +86,10 @@ class Analysis(Time):
62
86
 
63
87
  class ForecastFromValidTimeAndStep(Time):
64
88
 
65
- def __init__(self, time_coordinate, step_coordinate):
89
+ def __init__(self, time_coordinate, step_coordinate, date_coordinate=None):
66
90
  self.time_coordinate_name = time_coordinate.variable.name
67
91
  self.step_coordinate_name = step_coordinate.variable.name
92
+ self.date_coordinate_name = date_coordinate.variable.name if date_coordinate else None
68
93
 
69
94
  def fill_time_metadata(self, coords_values, metadata):
70
95
  valid_datetime = coords_values[self.time_coordinate_name]
@@ -79,6 +104,16 @@ class ForecastFromValidTimeAndStep(Time):
79
104
  metadata["date"] = as_datetime(base_datetime).strftime("%Y%m%d")
80
105
  metadata["time"] = as_datetime(base_datetime).strftime("%H%M")
81
106
  metadata["step"] = int(hours)
107
+
108
+ # When date is present, it should be compatible with time and step
109
+
110
+ if self.date_coordinate_name is not None:
111
+ # Not sure that this is the correct assumption
112
+ assert coords_values[self.date_coordinate_name] == base_datetime, (
113
+ coords_values[self.date_coordinate_name],
114
+ base_datetime,
115
+ )
116
+
82
117
  return valid_datetime
83
118
 
84
119
 
@@ -30,6 +30,31 @@ from .trace import trace_datasource
30
30
  LOG = logging.getLogger(__name__)
31
31
 
32
32
 
33
+ def _fields_metatata(variables, cube):
34
+ assert isinstance(variables, tuple), variables
35
+
36
+ result = {}
37
+ for i, c in enumerate(cube.iterate_cubelets()):
38
+ assert c._coords_names[1] == variables[i], (c._coords_names[1], variables[i])
39
+ f = cube[c.coords]
40
+ md = f.metadata(namespace="mars")
41
+ if not md:
42
+ md = f.metadata(namespace="default")
43
+
44
+ if md.get("param") == "~":
45
+ md["param"] = f.metadata("param")
46
+ assert md["param"] not in ("~", "unknown"), (md, f.metadata("param"))
47
+
48
+ if md.get("param") == "unknown":
49
+ md["param"] = str(f.metadata("paramId", default="unknown"))
50
+ # assert md['param'] != 'unknown', (md, f.metadata('param'))
51
+
52
+ result[variables[i]] = md
53
+
54
+ assert i + 1 == len(variables), (i + 1, len(variables))
55
+ return result
56
+
57
+
33
58
  def _data_request(data):
34
59
  date = None
35
60
  params_levels = defaultdict(set)
@@ -312,7 +337,10 @@ class Result:
312
337
  def build_coords(self):
313
338
  if self._coords_already_built:
314
339
  return
315
- from_data = self.get_cube().user_coords
340
+
341
+ cube = self.get_cube()
342
+
343
+ from_data = cube.user_coords
316
344
  from_config = self.context.order_by
317
345
 
318
346
  keys_from_config = list(from_config.keys())
@@ -359,11 +387,19 @@ class Result:
359
387
  self._field_shape = first_field.shape
360
388
  self._proj_string = first_field.proj_string if hasattr(first_field, "proj_string") else None
361
389
 
390
+ self._cube = cube
391
+
392
+ self._coords_already_built = True
393
+
362
394
  @property
363
395
  def variables(self):
364
396
  self.build_coords()
365
397
  return self._variables
366
398
 
399
+ @property
400
+ def variables_metadata(self):
401
+ return _fields_metatata(self.variables, self._cube)
402
+
367
403
  @property
368
404
  def ensembles(self):
369
405
  self.build_coords()
@@ -56,8 +56,11 @@ class PersistentDict:
56
56
  yield pickle.load(f)
57
57
 
58
58
  def add_provenance(self, **kwargs):
59
+ path = os.path.join(self.dirname, "provenance.json")
60
+ if os.path.exists(path):
61
+ return
59
62
  out = dict(provenance=gather_provenance_info(), **kwargs)
60
- with open(os.path.join(self.dirname, "provenance.json"), "w") as f:
63
+ with open(path, "w") as f:
61
64
  json.dump(out, f)
62
65
 
63
66
  def add(self, elt, *, key):
@@ -187,8 +187,11 @@ class TmpStatistics:
187
187
 
188
188
  def add_provenance(self, **kwargs):
189
189
  self.create(exist_ok=True)
190
+ path = os.path.join(self.dirname, "provenance.json")
191
+ if os.path.exists(path):
192
+ return
190
193
  out = dict(provenance=gather_provenance_info(), **kwargs)
191
- with open(os.path.join(self.dirname, "provenance.json"), "w") as f:
194
+ with open(path, "w") as f:
192
195
  json.dump(out, f)
193
196
 
194
197
  def create(self, exist_ok):
@@ -168,7 +168,11 @@ class ZarrBuiltRegistry:
168
168
  return self.create(lengths, overwrite=True)
169
169
 
170
170
  def add_provenance(self, name):
171
+ z = self._open_write()
172
+
173
+ if name in z.attrs:
174
+ return
175
+
171
176
  from anemoi.utils.provenance import gather_provenance_info
172
177
 
173
- z = self._open_write()
174
178
  z.attrs[name] = gather_provenance_info()
@@ -63,6 +63,10 @@ class Forwards(Dataset):
63
63
  def variables(self):
64
64
  return self.forward.variables
65
65
 
66
+ @property
67
+ def variables_metadata(self):
68
+ return self.forward.variables_metadata
69
+
66
70
  @property
67
71
  def statistics(self):
68
72
  return self.forward.statistics
@@ -253,7 +257,6 @@ class GivenAxis(Combined):
253
257
  offset = 0
254
258
  result = set()
255
259
  for d in self.datasets:
256
- print("--->", d.missing, d)
257
260
  result.update(offset + m for m in d.missing)
258
261
  if self.axis == 0: # Advance if axis is time
259
262
  offset += len(d)
@@ -111,6 +111,19 @@ class Join(Combined):
111
111
 
112
112
  return result
113
113
 
114
+ @cached_property
115
+ def variables_metadata(self):
116
+ seen = set()
117
+ result = {}
118
+ for d in reversed(self.datasets):
119
+ for v in reversed(d.variables):
120
+ while v in seen:
121
+ v = f"({v})"
122
+ seen.add(v)
123
+ result[v] = d.variables_metadata[v]
124
+
125
+ return result
126
+
114
127
  @cached_property
115
128
  def name_to_index(self):
116
129
  return {k: i for i, k in enumerate(self.variables)}
@@ -76,6 +76,10 @@ class Select(Forwards):
76
76
  def variables(self):
77
77
  return [self.dataset.variables[i] for i in self.indices]
78
78
 
79
+ @cached_property
80
+ def variables_metadata(self):
81
+ return {k: v for k, v in self.dataset.variables_metadata.items() if k in self.variables}
82
+
79
83
  @cached_property
80
84
  def name_to_index(self):
81
85
  return {k: i for i, k in enumerate(self.variables)}
@@ -108,13 +112,20 @@ class Rename(Forwards):
108
112
  super().__init__(dataset)
109
113
  for n in rename:
110
114
  assert n in dataset.variables, n
115
+
111
116
  self._variables = [rename.get(v, v) for v in dataset.variables]
117
+ self._variables_metadata = {rename.get(k, k): v for k, v in dataset.variables_metadata.items()}
118
+
112
119
  self.rename = rename
113
120
 
114
121
  @property
115
122
  def variables(self):
116
123
  return self._variables
117
124
 
125
+ @property
126
+ def variables_metadata(self):
127
+ return self._variables_metadata
128
+
118
129
  @cached_property
119
130
  def name_to_index(self):
120
131
  return {k: i for i, k in enumerate(self.variables)}
@@ -302,6 +302,10 @@ class Zarr(Dataset):
302
302
  )
303
303
  ]
304
304
 
305
+ @property
306
+ def variables_metadata(self):
307
+ return self.z.attrs.get("variables_metadata", {})
308
+
305
309
  def __repr__(self):
306
310
  return self.path
307
311
 
@@ -91,6 +91,11 @@ class Unchecked(Combined):
91
91
  def variables(self):
92
92
  raise NotImplementedError()
93
93
 
94
+ @property
95
+ @check("check_same_variables")
96
+ def variables_metadata(self):
97
+ raise NotImplementedError()
98
+
94
99
  @property
95
100
  @check("check_same_variables")
96
101
  def statistics(self):