diff --git a/src/edr_pydantic/extent.py b/src/edr_pydantic/extent.py index cb5dfd6..3381e7c 100644 --- a/src/edr_pydantic/extent.py +++ b/src/edr_pydantic/extent.py @@ -2,7 +2,9 @@ from typing import Optional from typing import Union +from annotated_types import Len from pydantic import AwareDatetime +from typing_extensions import Annotated from .base_model import EdrBaseModel @@ -12,9 +14,11 @@ class Spatial(EdrBaseModel): crs: str +IntervalLen = Len(min_length=2, max_length=2) + + class Temporal(EdrBaseModel): - # TODO: Validate this list has two items (C.7. Temporal Object) - interval: List[List[AwareDatetime]] + interval: List[Annotated[List[AwareDatetime], IntervalLen]] # TODO: Validate this is a list of ISO 8601 single time, ISO 8601 time duration or ISO 8601 interval values: List[str] trs: str diff --git a/tests/test_data/temporal-interval.json b/tests/test_data/temporal-interval.json new file mode 100644 index 0000000..9e823f6 --- /dev/null +++ b/tests/test_data/temporal-interval.json @@ -0,0 +1,11 @@ +{ + "interval": [ + [ + "2020-04-19T11:00:00Z" + ] + ], + "values": [ + "2020-04-19T11:00:00Z/2020-06-30T09:00:00Z" + ], + "trs": "TIMECRS[\"DateTime\",TDATUM[\"Gregorian Calendar\"],CS[TemporalDateTime,1],AXIS[\"Time (T)\",future]]" +} diff --git a/tests/test_edr.py b/tests/test_edr.py index 7064a10..254a281 100644 --- a/tests/test_edr.py +++ b/tests/test_edr.py @@ -7,6 +7,7 @@ from edr_pydantic.collections import Collections from edr_pydantic.collections import Instance from edr_pydantic.extent import Extent +from edr_pydantic.extent import Temporal from edr_pydantic.parameter import Parameter from edr_pydantic.unit import Unit from pydantic import RootModel @@ -35,7 +36,10 @@ def test_happy_cases(file_name, object_type): assert object_type.model_validate_json(json_string).model_dump_json(exclude_none=True) == json_string -error_cases = [("label-or-symbol-unit.json", Unit, r"Either 'label' or 'symbol' should be set")] +error_cases = [ + ("label-or-symbol-unit.json", Unit, r"Either 'label' or 'symbol' should be set"), + ("temporal-interval.json", Temporal, r"List should have at least 2 items after validation"), +] @pytest.mark.parametrize("file_name, object_type, error_message", error_cases) diff --git a/tests/test_extent.py b/tests/test_extent.py new file mode 100644 index 0000000..c0663ea --- /dev/null +++ b/tests/test_extent.py @@ -0,0 +1,6 @@ +from edr_pydantic.extent import IntervalLen + + +def test_interval_len(): + assert IntervalLen.min_length == 2, "Temporal intervals must have at least 2 items" + assert IntervalLen.max_length == 2, "Temporal intervals must have at most 2 items"