atmos-validation 2.0.2__tar.gz → 2.0.4__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 (106) hide show
  1. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/CHANGELOG.md +14 -0
  2. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/PKG-INFO +2 -2
  3. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/dim_constants.py +1 -0
  4. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/main.py +1 -0
  5. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_varinterval_validator.py +2 -8
  6. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/variables/variables_validator.py +4 -2
  7. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/variables/varinterval_validator.py +41 -21
  8. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/pyproject.toml +2 -2
  9. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/uv.lock +2 -2
  10. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  11. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  12. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/workflows/ci-conventional-commit-linter.yml +0 -0
  13. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/workflows/ci-cov-comment.yml +0 -0
  14. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/workflows/ci-doctest.yml +0 -0
  15. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/workflows/ci-lint-pr.yml +0 -0
  16. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/workflows/ci-test-pr.yml +0 -0
  17. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/workflows/ci-trufflehog-scan.yml +0 -0
  18. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/workflows/pypi-publisher.yml +0 -0
  19. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/workflows/release-please.yml +0 -0
  20. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.gitignore +0 -0
  21. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.pre-commit-config.yaml +0 -0
  22. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.vscode/extensions.json +0 -0
  23. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.vscode/settings.json +0 -0
  24. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/LICENSE +0 -0
  25. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/README.md +0 -0
  26. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/SECURITY.md +0 -0
  27. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/__init__.py +0 -0
  28. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/__main__.py +0 -0
  29. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/convert_ascii/__init__.py +0 -0
  30. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/convert_ascii/attrs_to_meta.py +0 -0
  31. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/convert_ascii/df_to_nc.py +0 -0
  32. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/convert_ascii/main.py +0 -0
  33. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/convert_ascii/measurement_metadata_to_schema.json +0 -0
  34. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/convert_ascii/parsers.py +0 -0
  35. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/convert_ascii/utils.py +0 -0
  36. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/__init__.py +0 -0
  37. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/classification_level.py +0 -0
  38. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/data_usability_level.py +0 -0
  39. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/data_usability_levels.py +0 -0
  40. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/installation_type.py +0 -0
  41. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/installation_types.py +0 -0
  42. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/instrument_type.py +0 -0
  43. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/instrument_types.py +0 -0
  44. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/metadata.py +0 -0
  45. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/parameter_config.py +0 -0
  46. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/parameter_configs.py +0 -0
  47. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/qc_tests.py +0 -0
  48. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/tests/__init__.py +0 -0
  49. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/tests/test_classification_level.py +0 -0
  50. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/tests/test_parameter_configs.py +0 -0
  51. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/tests/test_unique_configs.py +0 -0
  52. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/__init__.py +0 -0
  53. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/date_helper.py +0 -0
  54. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_date.py +0 -0
  55. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_metadata.py +0 -0
  56. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_names.py +0 -0
  57. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_parameter_info.py +0 -0
  58. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_parameter_info_list.py +0 -0
  59. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_parser.py +0 -0
  60. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_position.py +0 -0
  61. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/main.py +0 -0
  62. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/result_file.py +0 -0
  63. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/row_parser.py +0 -0
  64. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/utils.py +0 -0
  65. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/validate_result.py +0 -0
  66. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/__init__.py +0 -0
  67. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/__init__.py +0 -0
  68. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_blacklisted_globals.py +0 -0
  69. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_data_usability_validation.py +0 -0
  70. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_dimvars_validator.py +0 -0
  71. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_file_attributes.py +0 -0
  72. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_final_reports_validation.py +0 -0
  73. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_height_depth_validation.py +0 -0
  74. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_height_longname_validator.py +0 -0
  75. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_installation_types_validation.py +0 -0
  76. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_lat_lon_validator.py +0 -0
  77. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_main.py +0 -0
  78. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_sig_digs.py +0 -0
  79. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_spatial_validators.py +0 -0
  80. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_time_validator.py +0 -0
  81. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_util.py +0 -0
  82. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_varattrs_validation.py +0 -0
  83. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/utils.py +0 -0
  84. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validation_logger.py +0 -0
  85. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validation_settings.py +0 -0
  86. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/__init__.py +0 -0
  87. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/dims/__init__.py +0 -0
  88. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/dims/dims_validator.py +0 -0
  89. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/dims/dimvars_validator.py +0 -0
  90. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/dims/spatial_validators.py +0 -0
  91. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/dims/time_validator.py +0 -0
  92. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/file_attributes.py +0 -0
  93. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/root_validator.py +0 -0
  94. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/tests/__init__.py +0 -0
  95. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/variables/__init__.py +0 -0
  96. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/variables/sig_dig_validator.py +0 -0
  97. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/variables/varattrs_validator.py +0 -0
  98. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/variables/vardims_validator.py +0 -0
  99. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/docs/ascii_format.md +0 -0
  100. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/docs/conventions.md +0 -0
  101. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/docs/run.md +0 -0
  102. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/examples/example_ascii_measurement.dat +0 -0
  103. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/examples/example_netcdf_measurement.nc +0 -0
  104. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/examples/hindcast_example/example_hindcast_20160101_20160131_T744.nc +0 -0
  105. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/examples/hindcast_example/example_hindcast_20160201_20160229_T696.nc +0 -0
  106. {atmos_validation-2.0.2 → atmos_validation-2.0.4}/examples/hindcast_example/example_hindcast_20160301_20160331_T744.nc +0 -0
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [2.0.4](https://github.com/equinor/atmos-validation/compare/v2.0.3...v2.0.4) (2025-09-23)
4
+
5
+
6
+ ### Optimization
7
+
8
+ * Increase 5d validation performance ([#71](https://github.com/equinor/atmos-validation/issues/71)) ([a19f180](https://github.com/equinor/atmos-validation/commit/a19f180e4a385d7b6ac4bcb9844a91c2c1be4b4a))
9
+
10
+ ## [2.0.3](https://github.com/equinor/atmos-validation/compare/v2.0.2...v2.0.3) (2025-09-12)
11
+
12
+
13
+ ### Other
14
+
15
+ * relax version requirement for requests ([#69](https://github.com/equinor/atmos-validation/issues/69)) ([3135386](https://github.com/equinor/atmos-validation/commit/3135386c8eff169e35c4b9c7430c8e4c71826df5))
16
+
3
17
  ## [2.0.2](https://github.com/equinor/atmos-validation/compare/v2.0.1...v2.0.2) (2025-09-10)
4
18
 
5
19
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atmos_validation
3
- Version: 2.0.2
3
+ Version: 2.0.4
4
4
  Summary: A python library containing automated data validation tools for the Atmos Data Service
5
5
  Project-URL: Repository, https://github.com/equinor/atmos-validation
6
6
  Project-URL: Documentation, https://github.com/equinor/atmos-validation/tree/main/docs
@@ -15,7 +15,7 @@ Requires-Dist: h5netcdf<2,>=1.6.4
15
15
  Requires-Dist: h5py<4,>=3.10.0
16
16
  Requires-Dist: numpy<3,>=2.0.0
17
17
  Requires-Dist: pydantic<3,>=2.8.2
18
- Requires-Dist: requests<3,>=2.32.5
18
+ Requires-Dist: requests<3,>=2.32.4
19
19
  Requires-Dist: xarray<2026,>=2025.0.0
20
20
  Description-Content-Type: text/markdown
21
21
 
@@ -6,6 +6,7 @@ TIME = "Time"
6
6
  HEIGHT_DIM_PREFIX = "height_"
7
7
  FREQUENCY = "frequency"
8
8
  DIRECTION = "direction"
9
+ GRID_POINT_MASK = "GRID_POINT_MASK"
9
10
 
10
11
 
11
12
  def get_height_dim_from_parameter_key(key: str) -> str:
@@ -49,6 +49,7 @@ def main():
49
49
  print(DOCSTRING)
50
50
  else:
51
51
  result = validate(sys.argv[2], additional_args=sys.argv[2:])
52
+ log.info("Validation finished")
52
53
  if isinstance(result, ValidationResult):
53
54
  if result.errors:
54
55
  pretty_print_result(
@@ -34,10 +34,7 @@ def test_over_max_interval():
34
34
  ds["P"][:, 1, 0, 4] = 2 # pylint: disable=unsupported-assignment-operation
35
35
  data_array = ds["P"]
36
36
 
37
- dims = ["Time", "height_P", "south_north", "west_east"]
38
- errors = _check_randomly_selected_intervals_min_max(
39
- data_array, test_config, dims
40
- ) # type: ignore
37
+ errors = _check_randomly_selected_intervals_min_max(ds, data_array, test_config) # type: ignore
41
38
  assert len(errors) == 1
42
39
  assert "overmax" in errors[0]
43
40
 
@@ -49,9 +46,6 @@ def test_under_min_interval():
49
46
  ds["P"][:, 2, 3, 2] = -1 # pylint: disable=unsupported-assignment-operation
50
47
  data_array = ds["P"]
51
48
 
52
- dims = ["Time", "height_P", "south_north", "west_east"]
53
- errors = _check_randomly_selected_intervals_min_max(
54
- data_array, test_config, dims
55
- ) # type: ignore
49
+ errors = _check_randomly_selected_intervals_min_max(ds, data_array, test_config) # type: ignore
56
50
  assert len(errors) == 1
57
51
  assert "undermin" in errors[0]
@@ -17,7 +17,7 @@ from .varattrs_validator import (
17
17
  var_required_attr_values_validator,
18
18
  )
19
19
  from .vardims_validator import vardims_validator
20
- from .varinterval_validator import varinterval_validator
20
+ from .varinterval_validator import SEED, varinterval_validator
21
21
 
22
22
 
23
23
  def load_parameter_config_from_endpoint():
@@ -33,6 +33,8 @@ def load_parameter_config_from_endpoint():
33
33
  def variables_validator(ds: xr.Dataset) -> List[str]:
34
34
  valids = load_parameter_config_from_endpoint().param_dict
35
35
  errors = []
36
+
37
+ log.info("using random seed: %s", SEED)
36
38
  for key in list(ds.keys()):
37
39
  if key not in valids:
38
40
  errors += [f"{key} is not a valid key"]
@@ -60,7 +62,7 @@ def variable_validator(
60
62
  + var_allowed_instruments_validator(
61
63
  key, ds, parameter_settings.allowed_instruments
62
64
  )
63
- + varinterval_validator(var, parameter_settings)
65
+ + varinterval_validator(ds, var, parameter_settings)
64
66
  + sig_dig_validator(var, parameter_settings)
65
67
  + var_height_longname_validator(key, ds)
66
68
  + var_height_depth_validator(key, ds, parameter_settings.parameter_category)
@@ -2,11 +2,12 @@ import random
2
2
  import sys
3
3
  from typing import List, Tuple, Union
4
4
 
5
+ import numpy as np
5
6
  import xarray as xr
6
7
 
7
8
  from ....schemas import (
8
- DIRECTION,
9
9
  FREQUENCY,
10
+ GRID_POINT_MASK,
10
11
  SOUTH_NORTH,
11
12
  TIME,
12
13
  WEST_EAST,
@@ -19,7 +20,6 @@ from ...utils import Severity, validation_node
19
20
  from ...validation_logger import log
20
21
 
21
22
  SEED = random.randrange(sys.maxsize)
22
- print(f"using random seed: {SEED}")
23
23
 
24
24
 
25
25
  def _get_random_time_slice(actual: xr.DataArray, rand: random.Random) -> slice:
@@ -41,13 +41,36 @@ def _get_random_time_slice(actual: xr.DataArray, rand: random.Random) -> slice:
41
41
  return time_slice
42
42
 
43
43
 
44
+ def _get_random_spatial_point(
45
+ ds: xr.Dataset, rand: random.Random
46
+ ) -> tuple[slice, slice]:
47
+ """To save processing time we check 1x1 random spatial point where GRID_POINT_MASK == 1"""
48
+ if GRID_POINT_MASK not in ds:
49
+ ds.assign({GRID_POINT_MASK: xr.DataArray(1, dims=(SOUTH_NORTH, WEST_EAST))})
50
+
51
+ mask = ds[GRID_POINT_MASK].values
52
+ valids = np.where(mask == 1)
53
+ indices = list(zip(valids[0], valids[1]))
54
+ sn_index, we_index = rand.choice(indices)
55
+
56
+ return (slice(sn_index, sn_index + 1), slice(we_index, we_index + 1))
57
+
58
+
44
59
  def _get_slice_tuple(
45
- dims: List[str], actual: xr.DataArray, rand: random.Random
60
+ ds: xr.Dataset, actual: xr.DataArray, rand: random.Random
46
61
  ) -> Tuple[Union[int, slice], ...]:
47
- result: Tuple[Union[int, slice], ...] = ()
62
+ if FREQUENCY in actual.dims and len(actual.dims) == 5:
63
+ result = ()
64
+ result += (_get_random_time_slice(actual, rand),)
65
+ result += _get_random_spatial_point(ds, rand)
66
+ result += (slice(None, None),)
67
+ result += (slice(None, None),)
68
+ return result
69
+
48
70
  key = str(actual.name)
49
71
  height_dim = get_height_dim_from_parameter_key(key)
50
- for dim in dims:
72
+ result = ()
73
+ for dim in actual.dims:
51
74
  if dim == TIME:
52
75
  result += (_get_random_time_slice(actual, rand),)
53
76
  elif dim == SOUTH_NORTH:
@@ -56,10 +79,6 @@ def _get_slice_tuple(
56
79
  result += (slice(None, None),)
57
80
  elif dim == height_dim:
58
81
  result += (slice(None, None),)
59
- elif dim == FREQUENCY:
60
- result += (slice(None, None),)
61
- elif dim == DIRECTION:
62
- result += (slice(None, None),)
63
82
  else:
64
83
  raise ValueError(
65
84
  f"Invalid dimension {dim}, cannot validate interval of {key}"
@@ -100,7 +119,9 @@ def none_larger_than_max_validator(
100
119
 
101
120
 
102
121
  @validation_node(severity=Severity.ERROR)
103
- def varinterval_validator(actual: xr.DataArray, expected: ParameterConfig) -> List[str]:
122
+ def varinterval_validator(
123
+ ds: xr.Dataset, actual: xr.DataArray, expected: ParameterConfig
124
+ ) -> List[str]:
104
125
  """
105
126
  Take a bunch of random intervals in
106
127
  time, height, south_north, west_east
@@ -109,37 +130,36 @@ def varinterval_validator(actual: xr.DataArray, expected: ParameterConfig) -> Li
109
130
  """
110
131
  log.info("validating interval for %s", actual.name)
111
132
  dims = [str(dim) for dim in actual.dims]
112
- accept = get_acceptable_dims_from_parameter_key(str(actual.name))
113
-
114
- result = []
115
- if dims not in accept:
133
+ accepted = get_acceptable_dims_from_parameter_key(str(actual.name))
134
+ if dims not in accepted:
116
135
  return [
117
136
  f"Unsupported dimensional layout {dims}. Cannot evaluate interval. Accepted dimensional"
118
- f" layouts: {accept}"
137
+ f" layouts: {accepted}"
119
138
  ]
139
+
140
+ result = []
120
141
  if validation_settings.should_check_min_max_full():
121
142
  # Long running operation, so have to explicitly request this in args
122
143
  result += none_less_than_min_validator(actual, expected)
123
144
  result += none_larger_than_max_validator(actual, expected)
124
145
  return result
125
- # Seed the randomizer. We want what is called here to be reproducible
126
146
  if validation_settings.should_skip_min_max_check():
127
147
  return []
128
- return _check_randomly_selected_intervals_min_max(actual, expected, dims)
148
+ return _check_randomly_selected_intervals_min_max(ds, actual, expected)
129
149
 
130
150
 
131
151
  def _check_randomly_selected_intervals_min_max(
132
- actual: xr.DataArray, expected: ParameterConfig, dims: List[str]
152
+ ds: xr.Dataset, actual: xr.DataArray, expected: ParameterConfig
133
153
  ):
134
154
  rand = random.Random(SEED)
135
- result = []
136
155
 
137
- slice_tuple = _get_slice_tuple(dims, actual, rand)
156
+ slice_tuple = _get_slice_tuple(ds, actual, rand)
138
157
  vals = actual[slice_tuple]
139
158
  vals.load()
159
+
160
+ result = []
140
161
  result += undermin_validator(actual, expected, slice_tuple, vals)
141
162
  result += overmax_validator(actual, expected, slice_tuple, vals)
142
-
143
163
  return result
144
164
 
145
165
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "atmos_validation"
3
- version = "2.0.2"
3
+ version = "2.0.4"
4
4
  description = "A python library containing automated data validation tools for the Atmos Data Service"
5
5
  authors = [{ name = "Team Atmos (Equinor)" }]
6
6
  requires-python = ">=3.10, <3.14"
@@ -13,7 +13,7 @@ dependencies = [
13
13
  "dask>=2025.7.0,<2026",
14
14
  "h5py>=3.10.0,<4",
15
15
  "h5netcdf>=1.6.4,<2",
16
- "requests>=2.32.5,<3",
16
+ "requests>=2.32.4,<3",
17
17
  ]
18
18
 
19
19
  [project.urls]
@@ -19,7 +19,7 @@ wheels = [
19
19
 
20
20
  [[package]]
21
21
  name = "atmos-validation"
22
- version = "1.10.0"
22
+ version = "2.0.2"
23
23
  source = { editable = "." }
24
24
  dependencies = [
25
25
  { name = "dask" },
@@ -50,7 +50,7 @@ requires-dist = [
50
50
  { name = "h5py", specifier = ">=3.10.0,<4" },
51
51
  { name = "numpy", specifier = ">=2.0.0,<3" },
52
52
  { name = "pydantic", specifier = ">=2.8.2,<3" },
53
- { name = "requests", specifier = ">=2.32.5,<3" },
53
+ { name = "requests", specifier = ">=2.32.4,<3" },
54
54
  { name = "xarray", specifier = ">=2025.0.0,<2026" },
55
55
  ]
56
56