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.
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/CHANGELOG.md +14 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/PKG-INFO +2 -2
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/dim_constants.py +1 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/main.py +1 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_varinterval_validator.py +2 -8
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/variables/variables_validator.py +4 -2
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/variables/varinterval_validator.py +41 -21
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/pyproject.toml +2 -2
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/uv.lock +2 -2
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/workflows/ci-conventional-commit-linter.yml +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/workflows/ci-cov-comment.yml +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/workflows/ci-doctest.yml +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/workflows/ci-lint-pr.yml +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/workflows/ci-test-pr.yml +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/workflows/ci-trufflehog-scan.yml +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/workflows/pypi-publisher.yml +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.github/workflows/release-please.yml +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.gitignore +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.pre-commit-config.yaml +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.vscode/extensions.json +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/.vscode/settings.json +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/LICENSE +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/README.md +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/SECURITY.md +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/__init__.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/__main__.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/convert_ascii/__init__.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/convert_ascii/attrs_to_meta.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/convert_ascii/df_to_nc.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/convert_ascii/main.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/convert_ascii/measurement_metadata_to_schema.json +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/convert_ascii/parsers.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/convert_ascii/utils.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/__init__.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/classification_level.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/data_usability_level.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/data_usability_levels.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/installation_type.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/installation_types.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/instrument_type.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/instrument_types.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/metadata.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/parameter_config.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/parameter_configs.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/qc_tests.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/tests/__init__.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/tests/test_classification_level.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/tests/test_parameter_configs.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/tests/test_unique_configs.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/__init__.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/date_helper.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_date.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_metadata.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_names.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_parameter_info.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_parameter_info_list.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_parser.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_position.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/main.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/result_file.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/row_parser.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/utils.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/validate_result.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/__init__.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/__init__.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_blacklisted_globals.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_data_usability_validation.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_dimvars_validator.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_file_attributes.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_final_reports_validation.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_height_depth_validation.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_height_longname_validator.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_installation_types_validation.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_lat_lon_validator.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_main.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_sig_digs.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_spatial_validators.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_time_validator.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_util.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/test_varattrs_validation.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/utils.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validation_logger.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validation_settings.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/__init__.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/dims/__init__.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/dims/dims_validator.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/dims/dimvars_validator.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/dims/spatial_validators.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/dims/time_validator.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/file_attributes.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/root_validator.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/tests/__init__.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/variables/__init__.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/variables/sig_dig_validator.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/variables/varattrs_validator.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/validators/variables/vardims_validator.py +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/docs/ascii_format.md +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/docs/conventions.md +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/docs/run.md +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/examples/example_ascii_measurement.dat +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/examples/example_netcdf_measurement.nc +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/examples/hindcast_example/example_hindcast_20160101_20160131_T744.nc +0 -0
- {atmos_validation-2.0.2 → atmos_validation-2.0.4}/examples/hindcast_example/example_hindcast_20160201_20160229_T696.nc +0 -0
- {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.
|
|
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.
|
|
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
|
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
60
|
+
ds: xr.Dataset, actual: xr.DataArray, rand: random.Random
|
|
46
61
|
) -> Tuple[Union[int, slice], ...]:
|
|
47
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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: {
|
|
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
|
|
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
|
|
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(
|
|
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.
|
|
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.
|
|
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 = "
|
|
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.
|
|
53
|
+
{ name = "requests", specifier = ">=2.32.4,<3" },
|
|
54
54
|
{ name = "xarray", specifier = ">=2025.0.0,<2026" },
|
|
55
55
|
]
|
|
56
56
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/convert_ascii/__init__.py
RENAMED
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/convert_ascii/attrs_to_meta.py
RENAMED
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/convert_ascii/df_to_nc.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/classification_level.py
RENAMED
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/data_usability_level.py
RENAMED
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/data_usability_levels.py
RENAMED
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/installation_type.py
RENAMED
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/installation_types.py
RENAMED
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/instrument_type.py
RENAMED
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/instrument_types.py
RENAMED
|
File without changes
|
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/parameter_config.py
RENAMED
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/parameter_configs.py
RENAMED
|
File without changes
|
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/schemas/tests/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/__init__.py
RENAMED
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/date_helper.py
RENAMED
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_date.py
RENAMED
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_metadata.py
RENAMED
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_names.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_parser.py
RENAMED
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/header_position.py
RENAMED
|
File without changes
|
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/result_file.py
RENAMED
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/row_parser.py
RENAMED
|
File without changes
|
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_ascii/validate_result.py
RENAMED
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/__init__.py
RENAMED
|
File without changes
|
{atmos_validation-2.0.2 → atmos_validation-2.0.4}/atmos_validation/validate_netcdf/tests/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|