From f1f14e8c5fbf0fceb3de2b54c8976882e3f2d8ab Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Fri, 3 May 2024 16:09:00 +0200 Subject: [PATCH 1/4] Add post init checks to Annotation --- src/pysdmx/model/__base.py | 19 +++++++++++++++++++ tests/model/test_annotation.py | 14 ++++++-------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/pysdmx/model/__base.py b/src/pysdmx/model/__base.py index e2323d4..24e772d 100644 --- a/src/pysdmx/model/__base.py +++ b/src/pysdmx/model/__base.py @@ -3,6 +3,8 @@ from msgspec import Struct +from pysdmx.errors import ClientError + class Annotation(Struct, frozen=True, omit_defaults=True): """Annotation class. @@ -27,6 +29,23 @@ class Annotation(Struct, frozen=True, omit_defaults=True): url: Optional[str] = None type: Optional[str] = None + def __post_init__(self): + if ( + not self.id + and not self.title + and not self.text + and not self.url + and not self.type + ): + raise ClientError( + 422, + "Empty annotation", + ( + "All fields of the annotation have been left empty." + "Please set at least one." + ), + ) + def __str__(self) -> str: """Returns a human-friendly description.""" out = [] diff --git a/tests/model/test_annotation.py b/tests/model/test_annotation.py index 3fa8f1d..094c6e7 100644 --- a/tests/model/test_annotation.py +++ b/tests/model/test_annotation.py @@ -1,5 +1,6 @@ import pytest +from pysdmx.errors import Error from pysdmx.model.__base import Annotation @@ -60,14 +61,6 @@ def test_not_equal(id): assert a1 != a2 -def test_tostr_empty(): - a = Annotation() - - s = str(a) - - assert s == "" - - def test_tostr_id(id): a = Annotation(id) @@ -82,3 +75,8 @@ def test_tostr_all(id, title, text, url, type): s = str(a) assert s == f"id={id}, title={title}, text={text}, url={url}, type={type}" + + +def test_empty_annotation_not_allowed(): + with pytest.raises(Error, match="empty"): + Annotation() From 5d55845f821d0b8782adace0348a2002b57c509d Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Fri, 3 May 2024 16:12:27 +0200 Subject: [PATCH 2/4] Add documentation --- src/pysdmx/model/__base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pysdmx/model/__base.py b/src/pysdmx/model/__base.py index 24e772d..7b90f42 100644 --- a/src/pysdmx/model/__base.py +++ b/src/pysdmx/model/__base.py @@ -30,6 +30,7 @@ class Annotation(Struct, frozen=True, omit_defaults=True): type: Optional[str] = None def __post_init__(self): + """Additional validation checks for Annotation.""" if ( not self.id and not self.title From ceb5a29701ecfcef6f7f6adc7510107cdbae4c62 Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Fri, 3 May 2024 16:36:00 +0200 Subject: [PATCH 3/4] Add check for missing agency --- src/pysdmx/model/__base.py | 9 +++++++++ tests/model/test_maintainable.py | 9 +++++++++ 2 files changed, 18 insertions(+) create mode 100644 tests/model/test_maintainable.py diff --git a/src/pysdmx/model/__base.py b/src/pysdmx/model/__base.py index 7b90f42..522a6f4 100644 --- a/src/pysdmx/model/__base.py +++ b/src/pysdmx/model/__base.py @@ -216,6 +216,15 @@ class MaintainableArtefact( structure_url: Optional[str] = None agency: Union[str, Agency] = "" + def __post_init__(self): + """Additional validation checks for maintainable artefacts.""" + if not self.agency: + raise ClientError( + 422, + "Missing agency", + "Maintainable artefacts must reference an agency.", + ) + class ItemScheme(MaintainableArtefact, frozen=True, omit_defaults=True): """ItemScheme class. diff --git a/tests/model/test_maintainable.py b/tests/model/test_maintainable.py new file mode 100644 index 0000000..1c7ff82 --- /dev/null +++ b/tests/model/test_maintainable.py @@ -0,0 +1,9 @@ +import pytest + +from pysdmx.errors import Error +from pysdmx.model.__base import MaintainableArtefact + + +def test_empty_agency_not_allowed(): + with pytest.raises(Error, match="must reference an agency"): + MaintainableArtefact("ID") From 219cb7ca28ff3fe3701aefecbf9d6faadd77f2df Mon Sep 17 00:00:00 2001 From: Xavier Sosnovsky Date: Fri, 3 May 2024 16:38:24 +0200 Subject: [PATCH 4/4] Address mypy findings --- src/pysdmx/model/__base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pysdmx/model/__base.py b/src/pysdmx/model/__base.py index 522a6f4..9d28fea 100644 --- a/src/pysdmx/model/__base.py +++ b/src/pysdmx/model/__base.py @@ -29,7 +29,7 @@ class Annotation(Struct, frozen=True, omit_defaults=True): url: Optional[str] = None type: Optional[str] = None - def __post_init__(self): + def __post_init__(self) -> None: """Additional validation checks for Annotation.""" if ( not self.id @@ -216,7 +216,7 @@ class MaintainableArtefact( structure_url: Optional[str] = None agency: Union[str, Agency] = "" - def __post_init__(self): + def __post_init__(self) -> None: """Additional validation checks for maintainable artefacts.""" if not self.agency: raise ClientError(