anemoi-utils 0.4.32__tar.gz → 0.4.33__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 (110) hide show
  1. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.pre-commit-config.yaml +2 -2
  2. anemoi_utils-0.4.33/.release-please-manifest.json +3 -0
  3. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/CHANGELOG.md +7 -0
  4. {anemoi_utils-0.4.32/src/anemoi_utils.egg-info → anemoi_utils-0.4.33}/PKG-INFO +1 -1
  5. anemoi_utils-0.4.33/docs/modules/config.rst +17 -0
  6. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/__init__.py +7 -0
  7. anemoi_utils-0.4.33/src/anemoi/utils/_environment.py +37 -0
  8. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/_version.py +2 -2
  9. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/config.py +6 -1
  10. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33/src/anemoi_utils.egg-info}/PKG-INFO +1 -1
  11. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi_utils.egg-info/SOURCES.txt +1 -0
  12. anemoi_utils-0.4.32/.release-please-manifest.json +0 -3
  13. anemoi_utils-0.4.32/docs/modules/config.rst +0 -8
  14. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.gitattributes +0 -0
  15. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.github/CODEOWNERS +0 -0
  16. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.github/ci-hpc-config.yml +0 -0
  17. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.github/dependabot.yml +0 -0
  18. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.github/labeler.yml +0 -0
  19. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.github/pull_request_template.md +0 -0
  20. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.github/workflows/downstream-ci-hpc.yml +0 -0
  21. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.github/workflows/pr-conventional-commit.yml +0 -0
  22. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.github/workflows/pr-label-conventional-commits.yml +0 -0
  23. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.github/workflows/pr-label-file-based.yml +0 -0
  24. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.github/workflows/pr-label-public.yml +0 -0
  25. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.github/workflows/python-publish.yml +0 -0
  26. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.github/workflows/python-pull-request.yml +0 -0
  27. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.github/workflows/readthedocs-pr-update.yml +0 -0
  28. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.github/workflows/release-please.yml +0 -0
  29. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.gitignore +0 -0
  30. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.readthedocs.yaml +0 -0
  31. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/.release-please-config.json +0 -0
  32. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/CONTRIBUTORS.md +0 -0
  33. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/LICENSE +0 -0
  34. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/README.md +0 -0
  35. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/docs/Makefile +0 -0
  36. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/docs/_static/logo.png +0 -0
  37. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/docs/_static/style.css +0 -0
  38. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/docs/_templates/.gitkeep +0 -0
  39. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/docs/_templates/apidoc/package.rst.jinja +0 -0
  40. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/docs/conf.py +0 -0
  41. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/docs/index.rst +0 -0
  42. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/docs/installing.rst +0 -0
  43. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/docs/modules/checkpoints.rst +0 -0
  44. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/docs/modules/dates.rst +0 -0
  45. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/docs/modules/grib.rst +0 -0
  46. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/docs/modules/humanize.rst +0 -0
  47. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/docs/modules/provenance.rst +0 -0
  48. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/docs/modules/s3.rst +0 -0
  49. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/docs/modules/testing.rst +0 -0
  50. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/docs/modules/text.rst +0 -0
  51. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/docs/scripts/api_build.sh +0 -0
  52. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/pyproject.toml +0 -0
  53. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/setup.cfg +0 -0
  54. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/__main__.py +0 -0
  55. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/caching.py +0 -0
  56. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/checkpoints.py +0 -0
  57. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/cli.py +0 -0
  58. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/commands/__init__.py +0 -0
  59. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/commands/config.py +0 -0
  60. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/commands/metadata.py +0 -0
  61. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/commands/requests.py +0 -0
  62. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/commands/transfer.py +0 -0
  63. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/compatibility.py +0 -0
  64. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/dates.py +0 -0
  65. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/devtools.py +0 -0
  66. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/grib.py +0 -0
  67. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/grids.py +0 -0
  68. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/hindcasts.py +0 -0
  69. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/humanize.py +0 -0
  70. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/logs.py +0 -0
  71. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/mars/__init__.py +0 -0
  72. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/mars/mars.yaml +0 -0
  73. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/mars/requests.py +0 -0
  74. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/mlflow/__init__.py +0 -0
  75. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/mlflow/auth.py +0 -0
  76. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/mlflow/client.py +0 -0
  77. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/mlflow/utils.py +0 -0
  78. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/provenance.py +0 -0
  79. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/registry.py +0 -0
  80. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/remote/__init__.py +0 -0
  81. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/remote/s3.py +0 -0
  82. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/remote/ssh.py +0 -0
  83. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/rules.py +0 -0
  84. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/s3.py +0 -0
  85. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/sanitise.py +0 -0
  86. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/sanitize.py +0 -0
  87. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/schemas/__init__.py +0 -0
  88. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/schemas/errors.py +0 -0
  89. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/testing.py +0 -0
  90. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/text.py +0 -0
  91. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi/utils/timer.py +0 -0
  92. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi_utils.egg-info/dependency_links.txt +0 -0
  93. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi_utils.egg-info/entry_points.txt +0 -0
  94. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi_utils.egg-info/requires.txt +0 -0
  95. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/src/anemoi_utils.egg-info/top_level.txt +0 -0
  96. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/tests/test-transfer-data/directory/b/c/x +0 -0
  97. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/tests/test-transfer-data/directory/b/y +0 -0
  98. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/tests/test-transfer-data/directory/exotic filename ;^/"'[=.,#]()/303/252/303/274/303/247/303/262/342/234/205.txt" +0 -0
  99. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/tests/test-transfer-data/directory/z +0 -0
  100. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/tests/test-transfer-data/file +0 -0
  101. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/tests/test_caching.py +0 -0
  102. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/tests/test_compatibility.py +0 -0
  103. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/tests/test_dates.py +0 -0
  104. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/tests/test_frequency.py +0 -0
  105. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/tests/test_mlflow_auth.py +0 -0
  106. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/tests/test_mlflow_client.py +0 -0
  107. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/tests/test_provenance.py +0 -0
  108. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/tests/test_remote.py +0 -0
  109. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/tests/test_sanitise.py +0 -0
  110. {anemoi_utils-0.4.32 → anemoi_utils-0.4.33}/tests/test_utils.py +0 -0
@@ -41,7 +41,7 @@ repos:
41
41
  - --profile black
42
42
  - --project anemoi
43
43
  - repo: https://github.com/astral-sh/ruff-pre-commit
44
- rev: v0.12.2
44
+ rev: v0.12.7
45
45
  hooks:
46
46
  - id: ruff
47
47
  args:
@@ -69,7 +69,7 @@ repos:
69
69
  hooks:
70
70
  - id: pyproject-fmt
71
71
  - repo: https://github.com/jshwi/docsig # Check docstrings against function sig
72
- rev: v0.70.0
72
+ rev: v0.71.0
73
73
  hooks:
74
74
  - id: docsig
75
75
  args:
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.4.33"
3
+ }
@@ -8,6 +8,13 @@ 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.33](https://github.com/ecmwf/anemoi-utils/compare/0.4.32...0.4.33) (2025-08-07)
12
+
13
+
14
+ ### Features
15
+
16
+ * **config:** Expand environment var recognition for the use of config override ([#197](https://github.com/ecmwf/anemoi-utils/issues/197)) ([9bd9170](https://github.com/ecmwf/anemoi-utils/commit/9bd9170478857cf129fa6b8042bc22d1a3940156))
17
+
11
18
  ## [0.4.32](https://github.com/ecmwf/anemoi-utils/compare/0.4.31...0.4.32) (2025-08-05)
12
19
 
13
20
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: anemoi-utils
3
- Version: 0.4.32
3
+ Version: 0.4.33
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,17 @@
1
+ ########
2
+ config
3
+ ########
4
+
5
+ This module provides utilities for managing configuration settings in
6
+ Anemoi. It includes functions to load, merge, and access configurations.
7
+
8
+ By default configuration files are loaded from
9
+ ``~/.config/anemoi/settings.toml``.
10
+
11
+ An override path can be specified using the environment variable
12
+ ``ANEMOI_CONFIG_OVERRIDE_PATH``.
13
+
14
+ .. automodule:: anemoi.utils.config
15
+ :members:
16
+ :no-undoc-members:
17
+ :show-inheritance:
@@ -9,6 +9,8 @@
9
9
 
10
10
  """Anemoi Utils package."""
11
11
 
12
+ from ._environment import ENV
13
+
12
14
  try:
13
15
  # NOTE: the `_version.py` file must not be present in the git repository
14
16
  # as it is generated by setuptools at install time
@@ -16,3 +18,8 @@ try:
16
18
  except ImportError: # pragma: no cover
17
19
  # Local copy or not installed with setuptools
18
20
  __version__ = "999"
21
+
22
+ __all__ = [
23
+ "ENV",
24
+ "__version__",
25
+ ]
@@ -0,0 +1,37 @@
1
+ # (C) Copyright 2025- Anemoi contributors.
2
+ #
3
+ # This software is licensed under the terms of the Apache Licence Version 2.0
4
+ # which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
5
+ #
6
+ # In applying this licence, ECMWF does not waive the privileges and immunities
7
+ # granted to it by virtue of its status as an intergovernmental organisation
8
+ # nor does it submit to any jurisdiction.
9
+
10
+ import os
11
+ from typing import Any
12
+
13
+
14
+ class Environment:
15
+ """Environment variables for Anemoi."""
16
+
17
+ ANEMOI_CONFIG_OVERRIDE_PATH: str
18
+ """Path to the configuration override file for Anemoi."""
19
+
20
+ def __setattr__(self, name: str, value: Any) -> None:
21
+ raise AttributeError("Cannot set attributes on Environment class. Use environment variables instead.")
22
+
23
+ def __getattr__(self, name: str) -> str | None:
24
+ if name in self.__class__.__annotations__:
25
+ if (env_var := os.getenv(name)) is None:
26
+ return env_var
27
+ try:
28
+ return self.__class__.__annotations__[name](env_var) # Auto cast
29
+ except Exception as e:
30
+ e.add_note(
31
+ f"Environment variable {name!r} must be of type {self.__class__.__annotations__[name].__name__}"
32
+ )
33
+ raise e
34
+ raise AttributeError(f"{name} is not a valid environment variable for {self.__class__.__name__}")
35
+
36
+
37
+ ENV = Environment()
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '0.4.32'
21
- __version_tuple__ = version_tuple = (0, 4, 32)
20
+ __version__ = version = '0.4.33'
21
+ __version_tuple__ = version_tuple = (0, 4, 33)
@@ -20,6 +20,8 @@ from typing import Any
20
20
 
21
21
  import yaml
22
22
 
23
+ from anemoi.utils import ENV
24
+
23
25
  try:
24
26
  import tomllib # Only available since 3.11
25
27
  except ImportError:
@@ -61,7 +63,7 @@ class DotDict(dict):
61
63
  super().__init__(*args, **kwargs)
62
64
 
63
65
  for k, v in self.items():
64
- self[k] = self.convert_to_nested_dot_dict(v)
66
+ super().__setitem__(k, self.convert_to_nested_dot_dict(v))
65
67
 
66
68
  @staticmethod
67
69
  def convert_to_nested_dot_dict(value):
@@ -576,6 +578,9 @@ def load_config(
576
578
 
577
579
  with CONFIG_LOCK:
578
580
  config = _load_config(name, secrets, defaults)
581
+ if ENV.ANEMOI_CONFIG_OVERRIDE_PATH is not None:
582
+ override_config = _load_config(os.path.abspath(ENV.ANEMOI_CONFIG_OVERRIDE_PATH))
583
+ merge_configs(config, override_config)
579
584
  if CONFIG_PATCH is not None:
580
585
  config = CONFIG_PATCH(config)
581
586
  return config
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: anemoi-utils
3
- Version: 0.4.32
3
+ Version: 0.4.33
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
@@ -43,6 +43,7 @@ docs/modules/text.rst
43
43
  docs/scripts/api_build.sh
44
44
  src/anemoi/utils/__init__.py
45
45
  src/anemoi/utils/__main__.py
46
+ src/anemoi/utils/_environment.py
46
47
  src/anemoi/utils/_version.py
47
48
  src/anemoi/utils/caching.py
48
49
  src/anemoi/utils/checkpoints.py
@@ -1,3 +0,0 @@
1
- {
2
- ".": "0.4.32"
3
- }
@@ -1,8 +0,0 @@
1
- ########
2
- config
3
- ########
4
-
5
- .. automodule:: anemoi.utils.config
6
- :members:
7
- :no-undoc-members:
8
- :show-inheritance:
File without changes
File without changes
File without changes
File without changes