anemoi-utils 0.4.5__py3-none-any.whl → 0.4.7__py3-none-any.whl
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.
- anemoi/utils/_version.py +2 -2
- anemoi/utils/config.py +1 -1
- anemoi/utils/hindcasts.py +9 -9
- anemoi/utils/registry.py +21 -4
- anemoi/utils/remote/ssh.py +3 -0
- {anemoi_utils-0.4.5.dist-info → anemoi_utils-0.4.7.dist-info}/METADATA +1 -1
- {anemoi_utils-0.4.5.dist-info → anemoi_utils-0.4.7.dist-info}/RECORD +11 -11
- {anemoi_utils-0.4.5.dist-info → anemoi_utils-0.4.7.dist-info}/WHEEL +1 -1
- {anemoi_utils-0.4.5.dist-info → anemoi_utils-0.4.7.dist-info}/LICENSE +0 -0
- {anemoi_utils-0.4.5.dist-info → anemoi_utils-0.4.7.dist-info}/entry_points.txt +0 -0
- {anemoi_utils-0.4.5.dist-info → anemoi_utils-0.4.7.dist-info}/top_level.txt +0 -0
anemoi/utils/_version.py
CHANGED
anemoi/utils/config.py
CHANGED
|
@@ -207,7 +207,7 @@ def load_any_dict_format(path) -> dict:
|
|
|
207
207
|
return tomllib.load(f)
|
|
208
208
|
except (json.JSONDecodeError, yaml.YAMLError, tomllib.TOMLDecodeError) as e:
|
|
209
209
|
LOG.warning(f"Failed to parse config file {path}", exc_info=e)
|
|
210
|
-
|
|
210
|
+
raise ValueError(f"Failed to parse config file {path} [{e}]")
|
|
211
211
|
|
|
212
212
|
return open(path).read()
|
|
213
213
|
|
anemoi/utils/hindcasts.py
CHANGED
|
@@ -27,16 +27,16 @@ class HindcastDatesTimes:
|
|
|
27
27
|
|
|
28
28
|
self.reference_dates = reference_dates
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
self.years = range(1, years + 1)
|
|
30
|
+
assert isinstance(years, int), f"years must be an integer, got {years}"
|
|
31
|
+
assert years > 0, f"years must be greater than 0, got {years}"
|
|
32
|
+
self.years = years
|
|
34
33
|
|
|
35
34
|
def __iter__(self):
|
|
36
35
|
for reference_date in self.reference_dates:
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
year, month, day = reference_date.year, reference_date.month, reference_date.day
|
|
37
|
+
if (month, day) == (2, 29):
|
|
38
|
+
day = 28
|
|
39
|
+
|
|
40
|
+
for i in range(1, self.years + 1):
|
|
41
|
+
date = datetime.datetime(year - i, month, day)
|
|
42
42
|
yield (date, reference_date)
|
anemoi/utils/registry.py
CHANGED
|
@@ -30,6 +30,9 @@ class Wrapper:
|
|
|
30
30
|
return factory
|
|
31
31
|
|
|
32
32
|
|
|
33
|
+
_BY_KIND = {}
|
|
34
|
+
|
|
35
|
+
|
|
33
36
|
class Registry:
|
|
34
37
|
"""A registry of factories"""
|
|
35
38
|
|
|
@@ -39,6 +42,11 @@ class Registry:
|
|
|
39
42
|
self.registered = {}
|
|
40
43
|
self.kind = package.split(".")[-1]
|
|
41
44
|
self.key = key
|
|
45
|
+
_BY_KIND[self.kind] = self
|
|
46
|
+
|
|
47
|
+
@classmethod
|
|
48
|
+
def lookup_kind(cls, kind: str):
|
|
49
|
+
return _BY_KIND.get(kind)
|
|
42
50
|
|
|
43
51
|
def register(self, name: str, factory: callable = None):
|
|
44
52
|
|
|
@@ -47,6 +55,9 @@ class Registry:
|
|
|
47
55
|
|
|
48
56
|
self.registered[name] = factory
|
|
49
57
|
|
|
58
|
+
# def registered(self, name: str):
|
|
59
|
+
# return name in self.registered
|
|
60
|
+
|
|
50
61
|
def _load(self, file):
|
|
51
62
|
name, _ = os.path.splitext(file)
|
|
52
63
|
try:
|
|
@@ -54,7 +65,9 @@ class Registry:
|
|
|
54
65
|
except Exception:
|
|
55
66
|
LOG.warning(f"Error loading filter '{self.package}.{name}'", exc_info=True)
|
|
56
67
|
|
|
57
|
-
def lookup(self, name: str) -> callable:
|
|
68
|
+
def lookup(self, name: str, *, return_none=False) -> callable:
|
|
69
|
+
|
|
70
|
+
# print('✅✅✅✅✅✅✅✅✅✅✅✅✅', name, self.registered)
|
|
58
71
|
if name in self.registered:
|
|
59
72
|
return self.registered[name]
|
|
60
73
|
|
|
@@ -87,8 +100,12 @@ class Registry:
|
|
|
87
100
|
self.registered[name] = entry_point.load()
|
|
88
101
|
|
|
89
102
|
if name not in self.registered:
|
|
103
|
+
if return_none:
|
|
104
|
+
return None
|
|
105
|
+
|
|
90
106
|
for e in self.registered:
|
|
91
107
|
LOG.info(f"Registered: {e}")
|
|
108
|
+
|
|
92
109
|
raise ValueError(f"Cannot load '{name}' from {self.package}")
|
|
93
110
|
|
|
94
111
|
return self.registered[name]
|
|
@@ -97,8 +114,8 @@ class Registry:
|
|
|
97
114
|
factory = self.lookup(name)
|
|
98
115
|
return factory(*args, **kwargs)
|
|
99
116
|
|
|
100
|
-
def __call__(self, name: str, *args, **kwargs):
|
|
101
|
-
|
|
117
|
+
# def __call__(self, name: str, *args, **kwargs):
|
|
118
|
+
# return self.create(name, *args, **kwargs)
|
|
102
119
|
|
|
103
120
|
def from_config(self, config, *args, **kwargs):
|
|
104
121
|
if isinstance(config, str):
|
|
@@ -125,5 +142,5 @@ class Registry:
|
|
|
125
142
|
return self.create(key, *args, value, **kwargs)
|
|
126
143
|
|
|
127
144
|
raise ValueError(
|
|
128
|
-
f"Entry '{config}' must either be a string, a
|
|
145
|
+
f"Entry '{config}' must either be a string, a dictionary with a single entry, or a dictionary with a '{self.key}' key"
|
|
129
146
|
)
|
anemoi/utils/remote/ssh.py
CHANGED
|
@@ -44,6 +44,9 @@ class SshBaseUpload(BaseUpload):
|
|
|
44
44
|
hostnames = hostname.split("+")
|
|
45
45
|
hostname = hostnames[random.randint(0, len(hostnames) - 1)]
|
|
46
46
|
|
|
47
|
+
if ".." in path.split("/"):
|
|
48
|
+
raise Exception("Path contains suspicious '..' : {target}")
|
|
49
|
+
|
|
47
50
|
return hostname, path
|
|
48
51
|
|
|
49
52
|
def get_temporary_target(self, target, pattern):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: anemoi-utils
|
|
3
|
-
Version: 0.4.
|
|
3
|
+
Version: 0.4.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
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
anemoi/utils/__init__.py,sha256=0u0eIdu5-H1frf6V4KHpNmlh_SS-bJnxjzIejlsLqdw,702
|
|
2
2
|
anemoi/utils/__main__.py,sha256=5NW2A3OgTimB4ptwYThivIRSeCrvabMuvnr8mmnVx0E,715
|
|
3
|
-
anemoi/utils/_version.py,sha256=
|
|
3
|
+
anemoi/utils/_version.py,sha256=aiv6B46XdwSU0l915ePx2JQG3yol6FO4m6wTlI4ZKN0,411
|
|
4
4
|
anemoi/utils/caching.py,sha256=0cznpvaaox14NSVi-Q3PqumfuGtXo0YNcEFwDPxvMZw,1948
|
|
5
5
|
anemoi/utils/checkpoints.py,sha256=q8QqKlZ6qChjzEfq7KM1gVXuyqgsVRGIb4dJFtkGk58,7774
|
|
6
6
|
anemoi/utils/cli.py,sha256=rmMP60VY3em99rQP6TCrKibMngWwVe5h_0GDcf16c5U,4117
|
|
7
7
|
anemoi/utils/compatibility.py,sha256=0_nIcbdQbNMrS6AkqrBgJGJlSJXW8R23ncaZaDwdJ4c,2190
|
|
8
|
-
anemoi/utils/config.py,sha256=
|
|
8
|
+
anemoi/utils/config.py,sha256=At0k_NtbJ74S72sEZIYgdEaLf5KCEvxIJi9FGLcUwrE,9872
|
|
9
9
|
anemoi/utils/dates.py,sha256=wwYD5_QI7EWY_jhpENNYtL5O7fjwYkzmqHkNoayvmrY,12452
|
|
10
10
|
anemoi/utils/grib.py,sha256=zBICyOsYtR_9px1C5UDT6wL_D6kiIhUi_00kjFmas5c,3047
|
|
11
|
-
anemoi/utils/hindcasts.py,sha256=
|
|
11
|
+
anemoi/utils/hindcasts.py,sha256=TEYDmrZUajuhp_dfWeg6z5c6XfntE-mwugUQJyAgUco,1419
|
|
12
12
|
anemoi/utils/humanize.py,sha256=tSQkiUHiDj3VYk-DeruHp9P79sJO1b0whsPBphqy9qA,16627
|
|
13
13
|
anemoi/utils/provenance.py,sha256=SqOiNoY1y36Zec83Pjt7OhihbwxMyknscfmogHCuriA,10894
|
|
14
|
-
anemoi/utils/registry.py,sha256=
|
|
14
|
+
anemoi/utils/registry.py,sha256=Iit_CfTGuoVffXkZA2A5mUXb4AdGIUX9TpnUqWT4HJ0,4291
|
|
15
15
|
anemoi/utils/s3.py,sha256=UOEETko08hnIXeFy8u10eQbqpcape9d-L6IgsjFMe18,2473
|
|
16
16
|
anemoi/utils/sanitise.py,sha256=MqEMLwVZ1jSemLDBoQXuJyXKIfyR0gzYi7DoITBcir8,2866
|
|
17
17
|
anemoi/utils/sanitize.py,sha256=43ZKDcfVpeXSsJ9TFEc9aZnD6oe2cUh151XnDspM98M,462
|
|
@@ -23,10 +23,10 @@ anemoi/utils/mars/__init__.py,sha256=kvbu-gSaYI9jSNEzfQltrtHPVIameYGoLjOJKwI7x_U
|
|
|
23
23
|
anemoi/utils/mars/mars.yaml,sha256=R0dujp75lLA4wCWhPeOQnzJ45WZAYLT8gpx509cBFlc,66
|
|
24
24
|
anemoi/utils/remote/__init__.py,sha256=nLoXHj0Jp3YrGSwb0xkGyeuquDolWiiSBtGPJJX8gbM,11481
|
|
25
25
|
anemoi/utils/remote/s3.py,sha256=CNEYq8P7o7lSB1acUp_GPU8c-WrEa7Cduv3rGw4Kba0,11924
|
|
26
|
-
anemoi/utils/remote/ssh.py,sha256=
|
|
27
|
-
anemoi_utils-0.4.
|
|
28
|
-
anemoi_utils-0.4.
|
|
29
|
-
anemoi_utils-0.4.
|
|
30
|
-
anemoi_utils-0.4.
|
|
31
|
-
anemoi_utils-0.4.
|
|
32
|
-
anemoi_utils-0.4.
|
|
26
|
+
anemoi/utils/remote/ssh.py,sha256=zKya93KOMXTXgiVodb31BUuSapjY_I4yrzULO4NDOZ4,4655
|
|
27
|
+
anemoi_utils-0.4.7.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
28
|
+
anemoi_utils-0.4.7.dist-info/METADATA,sha256=lIwSwWWpOJ14abGtqR4emsi5cjgIcZDLUzT5UHr5Ong,15222
|
|
29
|
+
anemoi_utils-0.4.7.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
|
|
30
|
+
anemoi_utils-0.4.7.dist-info/entry_points.txt,sha256=LENOkn88xzFQo-V59AKoA_F_cfYQTJYtrNTtf37YgHY,60
|
|
31
|
+
anemoi_utils-0.4.7.dist-info/top_level.txt,sha256=DYn8VPs-fNwr7fNH9XIBqeXIwiYYd2E2k5-dUFFqUz0,7
|
|
32
|
+
anemoi_utils-0.4.7.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|