anemoi-utils 0.4.11__tar.gz → 0.4.12__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.

Potentially problematic release.


This version of anemoi-utils might be problematic. Click here for more details.

Files changed (99) hide show
  1. anemoi_utils-0.4.12/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +46 -0
  2. anemoi_utils-0.4.12/.github/dependabot.yml +10 -0
  3. anemoi_utils-0.4.12/.github/labeler.yml +42 -0
  4. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/.github/release.yml +5 -2
  5. anemoi_utils-0.4.12/.github/workflows/downstream-ci-hpc.yml +54 -0
  6. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/.github/workflows/pr-conventional-commit.yml +2 -1
  7. anemoi_utils-0.4.12/.github/workflows/pr-label-conventional-commits.yml +45 -0
  8. anemoi_utils-0.4.12/.github/workflows/pr-label-file-based.yml +17 -0
  9. anemoi_utils-0.4.11/.github/workflows/label-public-pr.yml → anemoi_utils-0.4.12/.github/workflows/pr-label-public.yml +1 -1
  10. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/.github/workflows/python-publish.yml +1 -1
  11. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/.github/workflows/python-pull-request.yml +4 -7
  12. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/.github/workflows/readthedocs-pr-update.yml +2 -0
  13. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/.github/workflows/release-please.yml +7 -3
  14. anemoi_utils-0.4.12/.gitignore +135 -0
  15. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/.pre-commit-config.yaml +0 -2
  16. anemoi_utils-0.4.12/.release-please-config.json +19 -0
  17. anemoi_utils-0.4.12/.release-please-manifest.json +3 -0
  18. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/CHANGELOG.md +15 -0
  19. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/CONTRIBUTORS.md +2 -2
  20. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/LICENSE +1 -1
  21. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/PKG-INFO +2 -2
  22. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/README.md +2 -2
  23. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/_version.py +2 -2
  24. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/commands/requests.py +6 -2
  25. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/dates.py +13 -6
  26. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi_utils.egg-info/PKG-INFO +2 -2
  27. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi_utils.egg-info/SOURCES.txt +7 -3
  28. anemoi_utils-0.4.11/.github/workflows/ci.yml +0 -58
  29. anemoi_utils-0.4.11/.github/workflows/merge-main-into-develop.yml +0 -31
  30. anemoi_utils-0.4.11/.gitignore +0 -188
  31. anemoi_utils-0.4.11/.release-please-config.json +0 -19
  32. anemoi_utils-0.4.11/.release-please-manifest.json +0 -3
  33. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/.gitattributes +0 -0
  34. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/.github/CODEOWNERS +0 -0
  35. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/.github/ci-hpc-config.yml +0 -0
  36. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/.readthedocs.yaml +0 -0
  37. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/docs/Makefile +0 -0
  38. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/docs/_static/logo.png +0 -0
  39. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/docs/_static/style.css +0 -0
  40. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/docs/_templates/.gitkeep +0 -0
  41. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/docs/conf.py +0 -0
  42. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/docs/index.rst +0 -0
  43. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/docs/installing.rst +0 -0
  44. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/docs/modules/checkpoints.rst +0 -0
  45. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/docs/modules/config.rst +0 -0
  46. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/docs/modules/dates.rst +0 -0
  47. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/docs/modules/grib.rst +0 -0
  48. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/docs/modules/humanize.rst +0 -0
  49. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/docs/modules/provenance.rst +0 -0
  50. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/docs/modules/s3.rst +0 -0
  51. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/docs/modules/text.rst +0 -0
  52. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/pyproject.toml +0 -0
  53. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/setup.cfg +0 -0
  54. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/__init__.py +0 -0
  55. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/__main__.py +0 -0
  56. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/caching.py +0 -0
  57. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/checkpoints.py +0 -0
  58. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/cli.py +0 -0
  59. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/commands/__init__.py +0 -0
  60. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/commands/config.py +0 -0
  61. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/compatibility.py +0 -0
  62. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/config.py +0 -0
  63. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/devtools.py +0 -0
  64. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/grib.py +0 -0
  65. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/grids.py +0 -0
  66. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/hindcasts.py +0 -0
  67. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/humanize.py +0 -0
  68. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/logs.py +0 -0
  69. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/mars/__init__.py +0 -0
  70. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/mars/mars.yaml +0 -0
  71. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/mars/requests.py +0 -0
  72. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/provenance.py +0 -0
  73. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/registry.py +0 -0
  74. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/remote/__init__.py +0 -0
  75. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/remote/s3.py +0 -0
  76. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/remote/ssh.py +0 -0
  77. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/s3.py +0 -0
  78. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/sanitise.py +0 -0
  79. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/sanitize.py +0 -0
  80. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/text.py +0 -0
  81. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi/utils/timer.py +0 -0
  82. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi_utils.egg-info/dependency_links.txt +0 -0
  83. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi_utils.egg-info/entry_points.txt +0 -0
  84. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi_utils.egg-info/requires.txt +0 -0
  85. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/src/anemoi_utils.egg-info/top_level.txt +0 -0
  86. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/tests/test-transfer-data/directory/b/c/x +0 -0
  87. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/tests/test-transfer-data/directory/b/y +0 -0
  88. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/tests/test-transfer-data/directory/exotic filename ;^/"'[=.,#]()/303/252/303/274/303/247/303/262/342/234/205.txt" +0 -0
  89. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/tests/test-transfer-data/directory/z +0 -0
  90. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/tests/test-transfer-data/file +0 -0
  91. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/tests/test_caching.py +0 -0
  92. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/tests/test_compatibility.py +0 -0
  93. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/tests/test_dates.py +0 -0
  94. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/tests/test_frequency.py +0 -0
  95. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/tests/test_grids.py +0 -0
  96. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/tests/test_provenance.py +0 -0
  97. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/tests/test_remote.py +0 -0
  98. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/tests/test_sanetise.py +0 -0
  99. {anemoi_utils-0.4.11 → anemoi_utils-0.4.12}/tests/test_utils.py +0 -0
@@ -0,0 +1,46 @@
1
+ ## Description
2
+
3
+ <!-- Provide a brief summary of the changes introduced in this pull request. -->
4
+
5
+ ## Type of Change
6
+
7
+ - [ ] Bug fix (non-breaking change which fixes an issue)
8
+ - [ ] New feature (non-breaking change which adds functionality)
9
+ - [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
10
+ - [ ] Documentation update
11
+
12
+ ## Issue Number
13
+
14
+ <!-- Link the Issue number this change addresses, ideally in one of the "magic format" such as Closes #XYZ -->
15
+
16
+ <!-- Alternatively, explain the motivation behind the changes and the context in which they are being made. -->
17
+
18
+ ## Code Compatibility
19
+
20
+ - [ ] I have performed a self-review of my code
21
+
22
+ ### Code Performance and Testing
23
+
24
+ - [ ] I have added tests that prove my fix is effective or that my feature works
25
+ - [ ] I ran the [complete Pytest test](https://anemoi.readthedocs.io/projects/training/en/latest/dev/testing.html) suite locally, and they pass
26
+
27
+ <!-- In case this affects the model sharding or other specific components please describe these here. -->
28
+
29
+ ### Dependencies
30
+
31
+ - [ ] I have ensured that the code is still pip-installable after the changes and runs
32
+ - [ ] I have tested that new dependencies themselves are pip-installable.
33
+
34
+ <!-- List any new dependencies that are required for this change and the justification to add them. -->
35
+
36
+ ### Documentation
37
+
38
+ - [ ] My code follows the style guidelines of this project
39
+ - [ ] I have updated the documentation and docstrings to reflect the changes
40
+ - [ ] I have added comments to my code, particularly in hard-to-understand areas
41
+
42
+ <!-- Describe any major updates to the documentation -->
43
+
44
+ ## Additional Notes
45
+
46
+ <!-- Include any additional information, caveats, or considerations that the reviewer should be aware of. -->
@@ -0,0 +1,10 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "pip"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ - package-ecosystem: "github-actions"
8
+ directory: "/"
9
+ schedule:
10
+ interval: "monthly"
@@ -0,0 +1,42 @@
1
+ # This is the configuration file for the labeler action.
2
+ # It assigns labels to pull requests based on the files changed in the PR.
3
+ # See more here: https://github.com/actions/labeler
4
+ dependencies:
5
+ - changed-files:
6
+ - any-glob-to-any-file:
7
+ - "**/requirements.txt"
8
+ - "**/setup.py"
9
+ - "**/pyproject.toml"
10
+ - "**/Pipfile"
11
+ - "**/Pipfile.lock"
12
+ - "**/requirements/*.txt"
13
+ - "**/requirements/*.in"
14
+
15
+ documentation:
16
+ - changed-files:
17
+ - any-glob-to-any-file:
18
+ - "**/docs/**/*"
19
+ - "*.md"
20
+ - "*.rst"
21
+
22
+ config:
23
+ - changed-files:
24
+ - any-glob-to-any-file:
25
+ - "**/src/**/config/**/*"
26
+
27
+ CI/CD:
28
+ - changed-files:
29
+ - any-glob-to-any-file:
30
+ - "**/.pre-commit-config.yaml"
31
+ - ".github/**/*"
32
+ - "tox.ini"
33
+ - ".coveragerc"
34
+
35
+ tests:
36
+ - changed-files:
37
+ - any-glob-to-any-file:
38
+ - "**/tests/**/*"
39
+ - "**/test/**/*"
40
+ - "**/test_*.py"
41
+ - "**/test.py"
42
+ - "**/conftest.py"
@@ -11,10 +11,13 @@ changelog:
11
11
  categories:
12
12
  - title: Breaking Changes 🛠
13
13
  labels:
14
- - breaking-change
14
+ - "breaking change"
15
15
  - title: Exciting New Features 🎉
16
16
  labels:
17
17
  - enhancement
18
- - title: Other Changes
18
+ - title: Config Changes 📑
19
+ labels:
20
+ - config
21
+ - title: Other Changes 🔗
19
22
  labels:
20
23
  - "*"
@@ -0,0 +1,54 @@
1
+ # This workflow triggers tests on dependent packages.
2
+ # The dependency tree itself is defined in ecmwf-actions/downstream-ci/
3
+ name: Test downstream dependent packages on HPC
4
+
5
+ on:
6
+ # Trigger the workflow on push to main or develop, except tag creation
7
+ push:
8
+ branches:
9
+ - 'main'
10
+ - 'develop'
11
+ tags-ignore:
12
+ - '**'
13
+ paths-ignore:
14
+ - "docs/**"
15
+ - "CHANGELOG.md"
16
+ - "README.md"
17
+
18
+ # Trigger the workflow on pull request
19
+ pull_request:
20
+ paths-ignore:
21
+ - "docs/**"
22
+ - "CHANGELOG.md"
23
+ - "README.md"
24
+
25
+ # Trigger the workflow manually
26
+ workflow_dispatch: ~
27
+
28
+ # Trigger after public PR approved for CI
29
+ pull_request_target:
30
+ types: [labeled]
31
+ paths-ignore:
32
+ - "docs/**"
33
+ - "CHANGELOG.md"
34
+ - "README.md"
35
+
36
+ jobs:
37
+ # Run CI including downstream packages on self-hosted runners
38
+ downstream-ci:
39
+ name: downstream-ci
40
+ if: ${{ !github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci' }}
41
+ uses: ecmwf-actions/downstream-ci/.github/workflows/downstream-ci.yml@main
42
+ with:
43
+ anemoi-utils: ecmwf/anemoi-utils@${{ github.event.pull_request.head.sha || github.sha }}
44
+ codecov_upload: true
45
+ secrets: inherit
46
+
47
+ # Build downstream packages on HPC
48
+ downstream-ci-hpc:
49
+ name: downstream-ci-hpc
50
+ if: ${{ !github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci' }}
51
+ uses: ecmwf-actions/downstream-ci/.github/workflows/downstream-ci-hpc.yml@main
52
+ with:
53
+ anemoi-utils: ecmwf/anemoi-utils@${{ github.event.pull_request.head.sha || github.sha }}
54
+ secrets: inherit
@@ -1,4 +1,5 @@
1
- name: "Ensure Conventional Commit in PR title"
1
+ # This workflow ensures that the PR title follows the Conventional Commit format.
2
+ name: "[Pull Request] Ensure Conventional Commit in PR title"
2
3
 
3
4
  on:
4
5
  pull_request_target:
@@ -0,0 +1,45 @@
1
+ # This workflow assigns labels to a pull request based on the Conventional Commits format.
2
+ # This is necessary for release-please to work properly.
3
+ name: "[Pull Request] Label Conventional Commits"
4
+
5
+ on:
6
+ pull_request:
7
+ branches: [main]
8
+ types:
9
+ [opened, reopened, labeled, unlabeled]
10
+
11
+ jobs:
12
+ assign-labels:
13
+ runs-on: ubuntu-latest
14
+ name: Assign labels in pull request
15
+ if: github.event.pull_request.merged == false
16
+ steps:
17
+ - uses: actions/checkout@v3
18
+ - name: Assign labels from Conventional Commits
19
+ id: action-assign-labels
20
+ uses: mauroalderete/action-assign-labels@v1
21
+ with:
22
+ pull-request-number: ${{ github.event.pull_request.number }}
23
+ github-token: ${{ secrets.GITHUB_TOKEN }}
24
+ conventional-commits: |
25
+ conventional-commits:
26
+ - type: 'fix'
27
+ nouns: ['FIX', 'Fix', 'fix', 'FIXED', 'Fixed', 'fixed']
28
+ labels: ['bug']
29
+ - type: 'feature'
30
+ nouns: ['FEATURE', 'Feature', 'feature', 'FEAT', 'Feat', 'feat']
31
+ labels: ['enhancement']
32
+ - type: 'breaking_change'
33
+ nouns: ['BREAKING CHANGE', 'BREAKING', 'MAJOR']
34
+ labels: ['breaking change']
35
+ - type: 'documentation'
36
+ nouns: ['doc','docs','docu','document','documentation']
37
+ labels: ['documentation']
38
+ - type: 'build'
39
+ nouns: ['build','rebuild','ci']
40
+ labels: ['CI/CD']
41
+ - type: 'config'
42
+ nouns: ['config', 'conf', 'configuration']
43
+ labels: ['config']
44
+ maintain-labels-not-matched: false
45
+ apply-changes: true
@@ -0,0 +1,17 @@
1
+ # This workflow assigns labels to a pull request based on the files changed in the PR.
2
+ # The labels are defined in the `.github/labels.yml` file.
3
+ name: "[Pull Request] Label File-based"
4
+ on:
5
+ pull_request_target:
6
+ types: [opened, synchronize]
7
+
8
+ permissions:
9
+ contents: read
10
+ pull-requests: write
11
+
12
+ jobs:
13
+ labeler:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - name: Assign labels from file changes
17
+ uses: actions/labeler@v5
@@ -1,5 +1,5 @@
1
1
  # Manage labels of pull requests that originate from forks
2
- name: label-public-pr
2
+ name: "[Pull Request] Label PRs from public forks"
3
3
 
4
4
  on:
5
5
  pull_request_target:
@@ -1,7 +1,7 @@
1
1
  # This workflow will upload a Python Package using Twine when a release is created
2
2
  # For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries
3
3
 
4
- name: Upload Python Package
4
+ name: Upload Python Package to PyPI
5
5
 
6
6
  on:
7
7
  release:
@@ -1,18 +1,15 @@
1
- # This workflow will upload a Python Package using Twine when a release is created
2
- # For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries
3
-
4
- name: Test PR
1
+ # This workflow runs pre-commit checks and pytest tests against multiple platforms and Python versions.
2
+ name: Code Quality checks and Testing
5
3
 
6
4
  on:
7
5
  pull_request:
8
6
  types: [opened, synchronize, reopened]
9
7
  push:
10
8
  branches:
11
- - develop
9
+ - main
12
10
  schedule:
13
11
  - cron: "9 2 * * 0" # at 9:02 on sunday
14
12
 
15
-
16
13
  jobs:
17
14
  quality:
18
15
  uses: ecmwf-actions/reusable-workflows/.github/workflows/qa-precommit-run.yml@v2
@@ -22,7 +19,7 @@ jobs:
22
19
  checks:
23
20
  strategy:
24
21
  matrix:
25
- python-version: ["3.11"]
22
+ python-version: ["3.9", "3.10", "3.11", "3.12"]
26
23
  uses: ecmwf-actions/reusable-workflows/.github/workflows/qa-pytest-pyproject.yml@v2
27
24
  with:
28
25
  python-version: ${{ matrix.python-version }}
@@ -1,3 +1,5 @@
1
+ # This workflow adds a link to the experimental documentation build to the PR.
2
+ # This does NOT trigger a build of the documentation, this is handled through webhooks.
1
3
  name: Read the Docs PR Preview
2
4
  on:
3
5
  pull_request_target:
@@ -1,8 +1,12 @@
1
+ # This workflow uses an action to run Release Please to create a release PR.
2
+ # It is governed by the config and manifest in the root of the repo.
3
+ # For more information see: https://github.com/googleapis/release-please
1
4
  name: Run Release Please
2
5
  on:
3
6
  push:
4
7
  branches:
5
- - develop
8
+ - main
9
+ - hotfix/*
6
10
 
7
11
  permissions:
8
12
  contents: write
@@ -20,5 +24,5 @@ jobs:
20
24
  token: ${{ secrets.RELEASE_PLEASE_TOKEN }}
21
25
  # optional. customize path to .release-please-config.json
22
26
  config-file: .release-please-config.json
23
- # Currently releases are done "from main" to have a stable branch
24
- # target-branch: main
27
+ # Currently releases are done from main
28
+ target-branch: ${{ github.ref_name }}
@@ -0,0 +1,135 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ __pypackages__/
8
+
9
+ # Distribution / packaging
10
+ build/
11
+ develop-eggs/
12
+ dist/
13
+ downloads/
14
+ eggs/
15
+ .eggs/
16
+ lib/
17
+ lib64/
18
+ parts/
19
+ sdist/
20
+ var/
21
+ wheels/
22
+ share/python-wheels/
23
+ *.egg-info/
24
+ .installed.cfg
25
+ *.egg
26
+ MANIFEST
27
+
28
+ # Testing and coverage
29
+ htmlcov/
30
+ .tox/
31
+ .nox/
32
+ .coverage
33
+ .coverage.*
34
+ .cache
35
+ nosetests.xml
36
+ coverage.xml
37
+ *.cover
38
+ *.py,cover
39
+ .hypothesis/
40
+ .pytest_cache/
41
+ cover/
42
+
43
+ # Documentation
44
+ docs/_build/
45
+ /site
46
+ *.mo
47
+ *.pot
48
+
49
+ # Environments
50
+ .env
51
+ .envrc
52
+ .venv
53
+ env/
54
+ venv/
55
+ ENV/
56
+ env.bak/
57
+ venv.bak/
58
+
59
+ # IDEs
60
+ .idea/
61
+ .spyderproject
62
+ .spyproject
63
+ .ropeproject
64
+ .vscode/
65
+ *.code-workspace
66
+ *.sublime-project
67
+ *.sublime-workspace
68
+
69
+ # Jupyter Notebook
70
+ .ipynb_checkpoints
71
+
72
+ # Type checking
73
+ .mypy_cache/
74
+ .dmypy.json
75
+ dmypy.json
76
+ .pyre/
77
+ .pytype/
78
+
79
+ # Data files
80
+ *.grib
81
+ *.onnx
82
+ *.ckpt
83
+ *.npy
84
+ *.npz
85
+ *.zarr/
86
+ *.nc
87
+ *.h5
88
+ *.hdf5
89
+ *.pkl
90
+ *.parquet
91
+ *.csv
92
+ *.xlsx
93
+ *.xls
94
+
95
+ # ML artifacts
96
+ wandb/
97
+ mlruns/
98
+ lightning_logs/
99
+ *.ckpt
100
+ *.pt
101
+ *.pth
102
+ runs/
103
+ checkpoints/
104
+
105
+ # Temporary and system files
106
+ *.swp
107
+ *.download
108
+ *.out
109
+ *.sync
110
+ *.dot
111
+ *.tmp
112
+ *.log
113
+ *.log.*
114
+ .DS_Store
115
+ ~*
116
+ tmp/
117
+ temp/
118
+ logs/
119
+ _dev/
120
+ outputs/
121
+ *tmp_data/
122
+
123
+ # Project specific
124
+ ?
125
+ ?.*
126
+ foo
127
+ bar
128
+ ~$images.pptx
129
+ test.py
130
+ test.ipynb
131
+ cutout.png
132
+ _version.py
133
+ *.to_upload
134
+ tempCodeRunnerFile.python
135
+ Untitled-*.py
@@ -76,5 +76,3 @@ repos:
76
76
  - --disable=E113 # Disable empty docstrings
77
77
  ci:
78
78
  autoupdate_schedule: monthly
79
- ci:
80
- autoupdate_schedule: monthly
@@ -0,0 +1,19 @@
1
+ {
2
+ "release-type": "python",
3
+ "bump-minor-pre-major": true,
4
+ "bump-patch-for-minor-pre-major": true,
5
+ "separate-pull-requests": true,
6
+ "always-update": true,
7
+ "changelog-type": "github",
8
+ "include-component-in-tag": false,
9
+ "include-v-in-tag": false,
10
+ "pull-request-title-pattern": "chore${scope}: Preparing Next Release for ${component} ${version}",
11
+ "pull-request-header": ":robot: Automated Release PR\n\nThis PR was created by `release-please` to prepare the next release. Once merged:\n\n1. A new version tag will be created\n2. A GitHub release will be published\n3. The changelog will be updated\n\nChanges to be included in the next release:",
12
+ "pull-request-footer": "> [!IMPORTANT]\n> :warning: Merging this PR will:\n> - Create a new release\n> - Trigger deployment pipelines\n> - Update package versions\n\n **Before merging:**\n - Ensure all tests pass\n - Review the changelog carefully\n - Get required approvals\n\n [Release-please documentation](https://github.com/googleapis/release-please)",
13
+ "packages": {
14
+ ".": {
15
+ "package-name": "anemoi-utils"
16
+ }
17
+ },
18
+ "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json"
19
+ }
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.4.12"
3
+ }
@@ -8,6 +8,21 @@ 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
+ ## 0.4.12 (2025-01-30)
12
+
13
+ <!-- Release notes generated using configuration in .github/release.yml at main -->
14
+
15
+ ## What's Changed
16
+ ### Other Changes 🔗
17
+ * feat: better support for timedelta larger than 24h by @floriankrb in https://github.com/ecmwf/anemoi-utils/pull/81
18
+ * feat(requests): read input from stdin by @gmertes in https://github.com/ecmwf/anemoi-utils/pull/82
19
+ * chore: synced file(s) with ecmwf-actions/reusable-workflows by @DeployDuck in https://github.com/ecmwf/anemoi-utils/pull/80
20
+
21
+ ## New Contributors
22
+ * @DeployDuck made their first contribution in https://github.com/ecmwf/anemoi-utils/pull/80
23
+
24
+ **Full Changelog**: https://github.com/ecmwf/anemoi-utils/compare/0.4.11...0.4.12
25
+
11
26
  ## 0.4.11 (2025-01-17)
12
27
 
13
28
  <!-- Release notes generated using configuration in .github/release.yml at develop -->
@@ -1,6 +1,6 @@
1
1
  ## How to Contribute
2
2
 
3
- Please see the [read the docs](https://anemoi-training.readthedocs.io/en/latest/dev/contributing.html).
3
+ Please see the [read the docs](https://anemoi.readthedocs.io/en/latest/dev/contributing.html).
4
4
 
5
5
 
6
6
  ## Contributors
@@ -10,4 +10,4 @@ Thank you to all the wonderful people who have contributed to Anemoi. Contributi
10
10
 
11
11
  ## Contributing Organisations
12
12
 
13
- Significant contributions have been made by the following organisations: [DWD](https://www.dwd.de/), [MET Norway](https://www.met.no/), [MeteoSwiss](https://www.meteoswiss.admin.ch/), [RMI](https://www.meteo.be/) & [ECMWF](https://www.ecmwf.int/)
13
+ Significant contributions have been made by the following organisations: [DWD](https://www.dwd.de/), [FMI](https://www.ilmatieteenlaitos.fi/), [KNMI](https://www.knmi.nl), [MET Norway](https://www.met.no/), [MeteoSwiss](https://www.meteoswiss.admin.ch/), [RMI](https://www.meteo.be/) & [ECMWF](https://www.ecmwf.int/)
@@ -186,7 +186,7 @@
186
186
  same "printed page" as the copyright notice for easier
187
187
  identification within third-party archives.
188
188
 
189
- Copyright [yyyy] [name of copyright owner]
189
+ Copyright 2024-2025 Anemoi Contributors
190
190
 
191
191
  Licensed under the Apache License, Version 2.0 (the "License");
192
192
  you may not use this file except in compliance with the License.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: anemoi-utils
3
- Version: 0.4.11
3
+ Version: 0.4.12
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
@@ -191,7 +191,7 @@ License: Apache License
191
191
  same "printed page" as the copyright notice for easier
192
192
  identification within third-party archives.
193
193
 
194
- Copyright [yyyy] [name of copyright owner]
194
+ Copyright 2024-2025 Anemoi Contributors
195
195
 
196
196
  Licensed under the Apache License, Version 2.0 (the "License");
197
197
  you may not use this file except in compliance with the License.
@@ -5,7 +5,7 @@ This project is **BETA** and will be **Experimental** for the foreseeable future
5
5
  Interfaces and functionality are likely to change, and the project itself may be scrapped.
6
6
  **DO NOT** use this software in any project/software that is operational.
7
7
 
8
- Miscellanous tools for training data-driven weather forecasts.
8
+
9
9
 
10
10
  ## Documentation
11
11
 
@@ -22,7 +22,7 @@ $ pip install anemoi-utils
22
22
  ## License
23
23
 
24
24
  ```
25
- Copyright 2024, Anemoi contributors.
25
+ Copyright 2024-2025, Anemoi Contributors.
26
26
 
27
27
  Licensed under the Apache License, Version 2.0 (the "License");
28
28
  you may not use this file except in compliance with the License.
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.4.11'
16
- __version_tuple__ = version_tuple = (0, 4, 11)
15
+ __version__ = version = '0.4.12'
16
+ __version_tuple__ = version_tuple = (0, 4, 12)
@@ -6,6 +6,7 @@
6
6
  # nor does it submit to any jurisdiction.
7
7
 
8
8
  import json
9
+ import sys
9
10
 
10
11
  from anemoi.utils.mars.requests import print_request
11
12
 
@@ -22,8 +23,11 @@ class Requests(Command):
22
23
  command_parser.add_argument("--only-one-field", action="store_true")
23
24
 
24
25
  def run(self, args):
25
- with open(args.input) as f:
26
- requests = json.load(f)
26
+ if args.input == "-":
27
+ requests = json.load(sys.stdin)
28
+ else:
29
+ with open(args.input) as f:
30
+ requests = json.load(f)
27
31
 
28
32
  if args.only_one_field:
29
33
  for r in requests:
@@ -155,12 +155,19 @@ def as_timedelta(frequency) -> datetime.timedelta:
155
155
  unit = {"h": "hours", "d": "days", "s": "seconds", "m": "minutes"}[unit]
156
156
  return datetime.timedelta(**{unit: v})
157
157
 
158
- m = frequency.split(":")
159
- if len(m) == 2:
160
- return datetime.timedelta(hours=int(m[0]), minutes=int(m[1]))
161
-
162
- if len(m) == 3:
163
- return datetime.timedelta(hours=int(m[0]), minutes=int(m[1]), seconds=int(m[2]))
158
+ if re.match(r"^\d+:\d+(:\d+)?$", frequency):
159
+ m = frequency.split(":")
160
+ if len(m) == 2:
161
+ return datetime.timedelta(hours=int(m[0]), minutes=int(m[1]))
162
+
163
+ if len(m) == 3:
164
+ return datetime.timedelta(hours=int(m[0]), minutes=int(m[1]), seconds=int(m[2]))
165
+
166
+ if re.match(r"^\d+ days?, \d+:\d+:\d+$", frequency):
167
+ m = frequency.split(", ")
168
+ days = int(m[0].split()[0])
169
+ hms = m[1].split(":")
170
+ return datetime.timedelta(days=days, hours=int(hms[0]), minutes=int(hms[1]), seconds=int(hms[2]))
164
171
 
165
172
  # ISO8601
166
173
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: anemoi-utils
3
- Version: 0.4.11
3
+ Version: 0.4.12
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
@@ -191,7 +191,7 @@ License: Apache License
191
191
  same "printed page" as the copyright notice for easier
192
192
  identification within third-party archives.
193
193
 
194
- Copyright [yyyy] [name of copyright owner]
194
+ Copyright 2024-2025 Anemoi Contributors
195
195
 
196
196
  Licensed under the Apache License, Version 2.0 (the "License");
197
197
  you may not use this file except in compliance with the License.
@@ -11,11 +11,15 @@ README.md
11
11
  pyproject.toml
12
12
  .github/CODEOWNERS
13
13
  .github/ci-hpc-config.yml
14
+ .github/dependabot.yml
15
+ .github/labeler.yml
14
16
  .github/release.yml
15
- .github/workflows/ci.yml
16
- .github/workflows/label-public-pr.yml
17
- .github/workflows/merge-main-into-develop.yml
17
+ .github/PULL_REQUEST_TEMPLATE/pull_request_template.md
18
+ .github/workflows/downstream-ci-hpc.yml
18
19
  .github/workflows/pr-conventional-commit.yml
20
+ .github/workflows/pr-label-conventional-commits.yml
21
+ .github/workflows/pr-label-file-based.yml
22
+ .github/workflows/pr-label-public.yml
19
23
  .github/workflows/python-publish.yml
20
24
  .github/workflows/python-pull-request.yml
21
25
  .github/workflows/readthedocs-pr-update.yml
@@ -1,58 +0,0 @@
1
- name: ci
2
-
3
- on:
4
- # Trigger the workflow on push to master or develop, except tag creation
5
- push:
6
- branches:
7
- - 'main'
8
- - 'develop'
9
- tags-ignore:
10
- - '**'
11
- paths:
12
- - "src/**"
13
- - "tests/**"
14
-
15
- # Trigger the workflow on pull request
16
- pull_request: ~
17
-
18
- # Trigger the workflow manually installs
19
- workflow_dispatch: ~
20
-
21
- # Trigger after public PR approved for CI
22
- pull_request_target:
23
- types: [labeled]
24
-
25
- jobs:
26
- # Run CI including downstream packages on self-hosted runners
27
- downstream-ci:
28
- name: downstream-ci
29
- if: ${{ !github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci' }}
30
- uses: ecmwf-actions/downstream-ci/.github/workflows/downstream-ci.yml@main
31
- with:
32
- anemoi-utils: ecmwf/anemoi-utils@${{ github.event.pull_request.head.sha || github.sha }}
33
- codecov_upload: true
34
- skip_matrix_jobs: |
35
- gnu@debian-11
36
- clang@rocky-8.6
37
- gnu@debian-11
38
- gnu@rocky-8.6
39
- clang@rocky-8.6
40
- gnu@fedora-37
41
- secrets: inherit
42
-
43
- # # Build downstream packages on HPC
44
- # downstream-ci-hpc:
45
- # name: downstream-ci-hpc
46
- # if: ${{ !github.event.pull_request.head.repo.fork && github.event.action != 'labeled' || github.event.label.name == 'approved-for-ci' }}
47
- # uses: ecmwf-actions/downstream-ci/.github/workflows/downstream-ci.yml@main
48
- # with:
49
- # anemoi-utils: ecmwf/anemoi-utils@${{ github.event.pull_request.head.sha || github.sha }}
50
- # codecov_upload: true
51
- # skip_matrix_jobs: |
52
- # gnu@debian-11
53
- # clang@rocky-8.6
54
- # gnu@debian-11
55
- # gnu@rocky-8.6
56
- # clang@rocky-8.6
57
- # gnu@fedora-37
58
- # secrets: inherit
@@ -1,31 +0,0 @@
1
- name: Merge main into develop
2
- on:
3
- push:
4
- branches:
5
- - main
6
-
7
-
8
- permissions:
9
- # Needed to read branches
10
- contents: read
11
- # Needed to create PR's
12
- pull-requests: write
13
-
14
- jobs:
15
- sync-branches:
16
- runs-on: ubuntu-latest
17
- steps:
18
- - name: Checkout
19
- uses: actions/checkout@v4
20
- - name: Set up Node
21
- uses: actions/setup-node@v4
22
- with:
23
- node-version: 20
24
- - name: Opening pull request
25
- id: pull
26
- uses: jdtx0/branch-sync@1.5.1
27
- with:
28
- GITHUB_TOKEN: ${{ secrets.REPO_SYNC_ACTION_PAT }}
29
- FROM_BRANCH: "main"
30
- TO_BRANCH: "develop"
31
- PULL_REQUEST_AUTO_MERGE_METHOD: "merge"
@@ -1,188 +0,0 @@
1
- # Byte-compiled / optimized / DLL files
2
- __pycache__/
3
- *.py[cod]
4
- *$py.class
5
-
6
- # C extensions
7
- *.so
8
-
9
- # Distribution / packaging
10
- .Python
11
- build/
12
- develop-eggs/
13
- dist/
14
- downloads/
15
- eggs/
16
- .eggs/
17
- lib/
18
- lib64/
19
- parts/
20
- sdist/
21
- var/
22
- wheels/
23
- share/python-wheels/
24
- *.egg-info/
25
- .installed.cfg
26
- *.egg
27
- MANIFEST
28
-
29
- # PyInstaller
30
- # Usually these files are written by a python script from a template
31
- # before PyInstaller builds the exe, so as to inject date/other infos into it.
32
- *.manifest
33
- *.spec
34
-
35
- # Installer logs
36
- pip-log.txt
37
- pip-delete-this-directory.txt
38
-
39
- # Unit test / coverage reports
40
- htmlcov/
41
- .tox/
42
- .nox/
43
- .coverage
44
- .coverage.*
45
- .cache
46
- nosetests.xml
47
- coverage.xml
48
- *.cover
49
- *.py,cover
50
- .hypothesis/
51
- .pytest_cache/
52
- cover/
53
-
54
- # Translations
55
- *.mo
56
- *.pot
57
-
58
- # Django stuff:
59
- *.log
60
- local_settings.py
61
- db.sqlite3
62
- db.sqlite3-journal
63
-
64
- # Flask stuff:
65
- instance/
66
- .webassets-cache
67
-
68
- # Scrapy stuff:
69
- .scrapy
70
-
71
- # Sphinx documentation
72
- docs/_build/
73
-
74
- # PyBuilder
75
- .pybuilder/
76
- target/
77
-
78
- # Jupyter Notebook
79
- .ipynb_checkpoints
80
-
81
- # IPython
82
- profile_default/
83
- ipython_config.py
84
-
85
- # pyenv
86
- # For a library or package, you might want to ignore these files since the code is
87
- # intended to run in multiple environments; otherwise, check them in:
88
- # .python-version
89
-
90
- # pipenv
91
- # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92
- # However, in case of collaboration, if having platform-specific dependencies or dependencies
93
- # having no cross-platform support, pipenv may install dependencies that don't work, or not
94
- # install all needed dependencies.
95
- #Pipfile.lock
96
-
97
- # poetry
98
- # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
99
- # This is especially recommended for binary packages to ensure reproducibility, and is more
100
- # commonly ignored for libraries.
101
- # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
102
- #poetry.lock
103
-
104
- # pdm
105
- # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
106
- #pdm.lock
107
- # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
108
- # in version control.
109
- # https://pdm.fming.dev/#use-with-ide
110
- .pdm.toml
111
-
112
- # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
113
- __pypackages__/
114
-
115
- # Celery stuff
116
- celerybeat-schedule
117
- celerybeat.pid
118
-
119
- # SageMath parsed files
120
- *.sage.py
121
-
122
- # Environments
123
- .env
124
- .envrc
125
- .venv
126
- env/
127
- venv/
128
- ENV/
129
- env.bak/
130
- venv.bak/
131
-
132
- # Spyder project settings
133
- .spyderproject
134
- .spyproject
135
-
136
- # Rope project settings
137
- .ropeproject
138
-
139
- # mkdocs documentation
140
- /site
141
-
142
- # mypy
143
- .mypy_cache/
144
- .dmypy.json
145
- dmypy.json
146
-
147
- # Pyre type checker
148
- .pyre/
149
-
150
- # pytype static type analyzer
151
- .pytype/
152
-
153
- # Cython debug symbols
154
- cython_debug/
155
-
156
- # PyCharm
157
- # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
158
- # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
159
- # and can be added to the global gitignore or merged into this file. For a more nuclear
160
- # option (not recommended) you can uncomment the following to ignore the entire idea folder.
161
- #.idea/
162
-
163
- *.grib
164
- *.onnx
165
- *.ckpt
166
- *.swp
167
- *.npy
168
- *.download
169
- ?
170
- ?.*
171
- foo
172
- bar
173
- *.grib
174
- *.nc
175
- *.npz
176
- *.zarr/
177
- ~$images.pptx
178
- test.py
179
- cutout.png
180
- *.out
181
-
182
- _build/
183
- ?
184
- ?.*
185
- ~*
186
- *.sync
187
- _version.py
188
- *.code-workspace
@@ -1,19 +0,0 @@
1
- {
2
- "release-type": "python",
3
- "bump-minor-pre-major": true,
4
- "bump-patch-for-minor-pre-major": true,
5
- "separate-pull-requests": true,
6
- "always-update": true,
7
- "changelog-type": "github",
8
- "include-component-in-tag": false,
9
- "include-v-in-tag": false,
10
- "pull-request-title-pattern": "chore${scope}: Preparing Next Release for ${component} ${version}",
11
- "pull-request-header": ":robot:This is an automated PR using `release-please`.\n\nThe following changes will be included in the release, once the next version is triggered.\n\nContent of the next Release",
12
- "pull-request-footer": "> [!IMPORTANT]\n> Merging this PR creates a release. Please refer to the [documentation](https://github.com/googleapis/release-please) if you're unsure.",
13
- "packages": {
14
- ".": {
15
- "package-name": "anemoi-utils"
16
- }
17
- },
18
- "$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json"
19
- }
@@ -1,3 +0,0 @@
1
- {
2
- ".": "0.4.11"
3
- }
File without changes