From f1453aceb7bf0cd4ed86e3f8532201f672982f44 Mon Sep 17 00:00:00 2001 From: garciam Date: Mon, 8 Jan 2024 18:09:45 +0100 Subject: [PATCH 1/3] implement coords validation --- xarray_schema/dataset.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xarray_schema/dataset.py b/xarray_schema/dataset.py index 9be35ee..be73d9d 100644 --- a/xarray_schema/dataset.py +++ b/xarray_schema/dataset.py @@ -79,8 +79,8 @@ def validate(self, ds: xr.Dataset) -> None: else: da_schema.validate(ds.data_vars[key]) - if self.coords is not None: # pragma: no cover - raise NotImplementedError('coords schema not implemented yet') + if self.coords is not None: + self.coords.validate(self.coords) if self.attrs: self.attrs.validate(ds.attrs) From c79139cb10f44ebd2a94549d68ceede07ce89568 Mon Sep 17 00:00:00 2001 From: garciam Date: Tue, 9 Jan 2024 09:57:11 +0100 Subject: [PATCH 2/3] add tests for DatasetSchema coordinates from_json method has been fixed too. --- tests/test_core.py | 27 ++++++++++++++++++++------- xarray_schema/dataset.py | 6 +++--- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/tests/test_core.py b/tests/test_core.py index 688eca6..ba0d7d3 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -222,29 +222,42 @@ def test_dataset_empty_constructor(): def test_dataset_example(ds): ds_schema = DatasetSchema( - { + data_vars={ 'foo': DataArraySchema(name='foo', dtype=np.int32, dims=['x']), 'bar': DataArraySchema(name='bar', dtype=np.floating, dims=['x', 'y']), - } + }, + coords={'x': DataArraySchema(name='x', dtype=np.int64, dims=['x'])}, + attrs={} ) jsonschema.validate(ds_schema.json, ds_schema._json_schema) assert list(ds_schema.json['data_vars'].keys()) == ['foo', 'bar'] + assert list(ds_schema.json['coords']["coords"].keys()) == ['x'] ds_schema.validate(ds) - ds['foo'] = ds.foo.astype('float32') + ds2 = ds.copy() + ds2['foo'] = ds2.foo.astype('float32') with pytest.raises(SchemaError, match='dtype'): - ds_schema.validate(ds) + ds_schema.validate(ds2) - ds = ds.drop_vars('foo') + ds2 = ds2.drop_vars('foo') with pytest.raises(SchemaError, match='variable foo'): - ds_schema.validate(ds) + ds_schema.validate(ds2) + + ds3 = ds.copy() + ds3['x'] = ds3.x.astype('float32') + with pytest.raises(SchemaError, match='dtype'): + ds_schema.validate(ds3) + + ds3 = ds3.drop_vars('x') + with pytest.raises(SchemaError, match='coords has missing keys'): + ds_schema.validate(ds3) # json roundtrip rt_schema = DatasetSchema.from_json(ds_schema.json) assert isinstance(rt_schema, DatasetSchema) - rt_schema.json == ds_schema.json + assert rt_schema.json == ds_schema.json def test_checks_ds(ds): diff --git a/xarray_schema/dataset.py b/xarray_schema/dataset.py index be73d9d..4ab7c0a 100644 --- a/xarray_schema/dataset.py +++ b/xarray_schema/dataset.py @@ -47,9 +47,9 @@ def from_json(cls, obj: dict): k: DataArraySchema.from_json(v) for k, v in obj['data_vars'].items() } if 'coords' in obj: - kwargs['coords'] = {k: CoordsSchema.from_json(v) for k, v in obj['coords'].items()} + kwargs['coords'] = CoordsSchema.from_json(obj["coords"]) if 'attrs' in obj: - kwargs['attrs'] = {k: AttrsSchema.from_json(v) for k, v in obj['attrs'].items()} + kwargs['attrs'] = AttrsSchema.from_json(obj["attrs"]) return cls(**kwargs) @@ -80,7 +80,7 @@ def validate(self, ds: xr.Dataset) -> None: da_schema.validate(ds.data_vars[key]) if self.coords is not None: - self.coords.validate(self.coords) + self.coords.validate(ds.coords) if self.attrs: self.attrs.validate(ds.attrs) From d3ba8807e2b69a26a98521c8ee927a13df0f0a5a Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 9 Jan 2024 08:59:35 +0000 Subject: [PATCH 3/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- tests/test_core.py | 4 ++-- xarray_schema/dataset.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_core.py b/tests/test_core.py index ba0d7d3..5261e9b 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -227,13 +227,13 @@ def test_dataset_example(ds): 'bar': DataArraySchema(name='bar', dtype=np.floating, dims=['x', 'y']), }, coords={'x': DataArraySchema(name='x', dtype=np.int64, dims=['x'])}, - attrs={} + attrs={}, ) jsonschema.validate(ds_schema.json, ds_schema._json_schema) assert list(ds_schema.json['data_vars'].keys()) == ['foo', 'bar'] - assert list(ds_schema.json['coords']["coords"].keys()) == ['x'] + assert list(ds_schema.json['coords']['coords'].keys()) == ['x'] ds_schema.validate(ds) ds2 = ds.copy() diff --git a/xarray_schema/dataset.py b/xarray_schema/dataset.py index 4ab7c0a..a7d2289 100644 --- a/xarray_schema/dataset.py +++ b/xarray_schema/dataset.py @@ -47,9 +47,9 @@ def from_json(cls, obj: dict): k: DataArraySchema.from_json(v) for k, v in obj['data_vars'].items() } if 'coords' in obj: - kwargs['coords'] = CoordsSchema.from_json(obj["coords"]) + kwargs['coords'] = CoordsSchema.from_json(obj['coords']) if 'attrs' in obj: - kwargs['attrs'] = AttrsSchema.from_json(obj["attrs"]) + kwargs['attrs'] = AttrsSchema.from_json(obj['attrs']) return cls(**kwargs)