anemoi-utils 0.4.6__tar.gz → 0.4.8__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 (79) hide show
  1. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/PKG-INFO +1 -1
  2. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/_version.py +2 -2
  3. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/config.py +1 -1
  4. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/remote/__init__.py +4 -2
  5. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/remote/s3.py +3 -0
  6. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/remote/ssh.py +6 -2
  7. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi_utils.egg-info/PKG-INFO +1 -1
  8. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/tests/test_remote.py +1 -1
  9. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/.gitattributes +0 -0
  10. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/.github/CODEOWNERS +0 -0
  11. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/.github/ci-hpc-config.yml +0 -0
  12. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/.github/workflows/changelog-pr-update.yml +0 -0
  13. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/.github/workflows/changelog-release-update.yml +0 -0
  14. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/.github/workflows/ci.yml +0 -0
  15. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/.github/workflows/label-public-pr.yml +0 -0
  16. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/.github/workflows/python-publish.yml +0 -0
  17. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/.github/workflows/python-pull-request.yml +0 -0
  18. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/.github/workflows/readthedocs-pr-update.yml +0 -0
  19. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/.gitignore +0 -0
  20. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/.pre-commit-config.yaml +0 -0
  21. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/.readthedocs.yaml +0 -0
  22. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/CHANGELOG.md +0 -0
  23. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/CONTRIBUTORS.md +0 -0
  24. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/LICENSE +0 -0
  25. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/README.md +0 -0
  26. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/docs/Makefile +0 -0
  27. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/docs/_static/logo.png +0 -0
  28. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/docs/_static/style.css +0 -0
  29. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/docs/_templates/.gitkeep +0 -0
  30. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/docs/conf.py +0 -0
  31. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/docs/index.rst +0 -0
  32. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/docs/installing.rst +0 -0
  33. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/docs/modules/checkpoints.rst +0 -0
  34. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/docs/modules/config.rst +0 -0
  35. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/docs/modules/dates.rst +0 -0
  36. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/docs/modules/grib.rst +0 -0
  37. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/docs/modules/humanize.rst +0 -0
  38. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/docs/modules/provenance.rst +0 -0
  39. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/docs/modules/s3.rst +0 -0
  40. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/docs/modules/text.rst +0 -0
  41. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/pyproject.toml +0 -0
  42. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/setup.cfg +0 -0
  43. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/__init__.py +0 -0
  44. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/__main__.py +0 -0
  45. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/caching.py +0 -0
  46. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/checkpoints.py +0 -0
  47. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/cli.py +0 -0
  48. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/commands/__init__.py +0 -0
  49. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/commands/config.py +0 -0
  50. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/compatibility.py +0 -0
  51. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/dates.py +0 -0
  52. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/grib.py +0 -0
  53. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/hindcasts.py +0 -0
  54. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/humanize.py +0 -0
  55. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/mars/__init__.py +0 -0
  56. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/mars/mars.yaml +0 -0
  57. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/provenance.py +0 -0
  58. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/registry.py +0 -0
  59. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/s3.py +0 -0
  60. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/sanitise.py +0 -0
  61. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/sanitize.py +0 -0
  62. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/text.py +0 -0
  63. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi/utils/timer.py +0 -0
  64. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi_utils.egg-info/SOURCES.txt +0 -0
  65. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi_utils.egg-info/dependency_links.txt +0 -0
  66. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi_utils.egg-info/entry_points.txt +0 -0
  67. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi_utils.egg-info/requires.txt +0 -0
  68. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/src/anemoi_utils.egg-info/top_level.txt +0 -0
  69. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/tests/test-transfer-data/directory/b/c/x +0 -0
  70. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/tests/test-transfer-data/directory/b/y +0 -0
  71. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/tests/test-transfer-data/directory/exotic filename ;^/"'[=.,#]()/303/252/303/274/303/247/303/262/342/234/205.txt" +0 -0
  72. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/tests/test-transfer-data/directory/z +0 -0
  73. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/tests/test-transfer-data/file +0 -0
  74. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/tests/test_compatibility.py +0 -0
  75. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/tests/test_dates.py +0 -0
  76. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/tests/test_frequency.py +0 -0
  77. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/tests/test_provenance.py +0 -0
  78. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/tests/test_sanetise.py +0 -0
  79. {anemoi_utils-0.4.6 → anemoi_utils-0.4.8}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: anemoi-utils
3
- Version: 0.4.6
3
+ Version: 0.4.8
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
@@ -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.6'
16
- __version_tuple__ = version_tuple = (0, 4, 6)
15
+ __version__ = version = '0.4.8'
16
+ __version_tuple__ = version_tuple = (0, 4, 8)
@@ -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
- return ValueError(f"Failed to parse config file {path} [{e}]")
210
+ raise ValueError(f"Failed to parse config file {path} [{e}]")
211
211
 
212
212
  return open(path).read()
213
213
 
@@ -138,6 +138,8 @@ class BaseDownload(Loader):
138
138
  raise NotImplementedError
139
139
 
140
140
  def get_temporary_target(self, target, pattern):
141
+ if pattern is None:
142
+ return target
141
143
  dirname, basename = os.path.split(target)
142
144
  return pattern.format(dirname=dirname, basename=basename)
143
145
 
@@ -199,13 +201,13 @@ class Transfer:
199
201
  target = os.path.basename(source)
200
202
 
201
203
  temporary_target = {
202
- False: "{dirname}/{basename}",
204
+ False: None,
203
205
  True: "{dirname}-downloading/{basename}",
204
206
  "-tmp/*": "{dirname}-tmp/{basename}",
205
207
  "*-tmp": "{dirname}/{basename}-tmp",
206
208
  "tmp-*": "{dirname}/tmp-{basename}",
207
209
  }.get(temporary_target, temporary_target)
208
- assert isinstance(temporary_target, str), (type(temporary_target), temporary_target)
210
+ assert temporary_target is None or isinstance(temporary_target, str), (type(temporary_target), temporary_target)
209
211
 
210
212
  self.source = source
211
213
  self.target = target
@@ -192,6 +192,9 @@ class S3Download(BaseDownload):
192
192
  _, _, bucket, key = source.split("/", 3)
193
193
  s3 = s3_client(bucket)
194
194
 
195
+ if key.endswith("/"):
196
+ return 0
197
+
195
198
  try:
196
199
  response = s3.head_object(Bucket=bucket, Key=key)
197
200
  except s3.exceptions.ClientError as e:
@@ -44,12 +44,16 @@ 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):
50
53
  hostname, path = self._parse_target(target)
51
- dirname, basename = os.path.split(path)
52
- path = pattern.format(dirname=dirname, basename=basename)
54
+ if pattern is not None:
55
+ dirname, basename = os.path.split(path)
56
+ path = pattern.format(dirname=dirname, basename=basename)
53
57
  return f"ssh://{hostname}:{path}"
54
58
 
55
59
  def rename_target(self, target, new_target):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: anemoi-utils
3
- Version: 0.4.6
3
+ Version: 0.4.8
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
@@ -151,7 +151,7 @@ def test_transfer_local_to_s3_to_local(path):
151
151
 
152
152
 
153
153
  @pytest.mark.skipif(IN_CI, reason="Test requires ssh access to localhost")
154
- @pytest.mark.parametrize("path", ["directory", "directory/", "file"])
154
+ @pytest.mark.parametrize("path", ["directory", "file"])
155
155
  @pytest.mark.parametrize("temporary_target", [True, False])
156
156
  def test_transfer_local_to_ssh(path, temporary_target):
157
157
  local = LOCAL_TEST_DATA + "/" + path
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes