From d290d850f8c1d473f357f5c8d8e4e660bb183023 Mon Sep 17 00:00:00 2001 From: Ben Barton Date: Mon, 20 Apr 2026 18:24:48 -0800 Subject: [PATCH 1/3] Implement horizontal_spatial_domain factory --- mandible/umm_classes/factory.py | 13 +++++++++++++ mandible/umm_classes/types.py | 3 +-- pyproject.toml | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/mandible/umm_classes/factory.py b/mandible/umm_classes/factory.py index 4cdd67a..39e3ee4 100644 --- a/mandible/umm_classes/factory.py +++ b/mandible/umm_classes/factory.py @@ -8,6 +8,7 @@ ArchiveAndDistributionInformation, CollectionReference, DataGranule, + Geometry, HorizontalSpatialDomain, Identifier, Instrument, @@ -58,6 +59,18 @@ def data_granule( return obj +def horizontal_spatial_domain( + geometry: Optional[Geometry] = None, + zone_identifier: Optional[str] = None, +) -> HorizontalSpatialDomain: + obj: HorizontalSpatialDomain = {} + if geometry is not None: + obj["Geometry"] = geometry + if zone_identifier is not None: + obj["ZoneIdentifier"] = zone_identifier + return obj + + def identifier( type: str, identifier: str, diff --git a/mandible/umm_classes/types.py b/mandible/umm_classes/types.py index 9b43c58..8f958c1 100644 --- a/mandible/umm_classes/types.py +++ b/mandible/umm_classes/types.py @@ -183,8 +183,7 @@ class HorizontalSpatialDomain(TypedDict): https://git.earthdata.nasa.gov/projects/EMFD/repos/unified-metadata-model/browse/granule/v1.6.5/umm-g-json-schema.json#497 """ - # TODO(reweeden): Implement - ZoneIdentifier: NotRequired[dict[str, Any]] + ZoneIdentifier: NotRequired[str] Geometry: NotRequired[Geometry] # TODO(reweeden): Implement Orbit: NotRequired[dict[str, Any]] diff --git a/pyproject.toml b/pyproject.toml index 0aeddce..fa22745 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "mandible" -version = "0.10.3" +version = "0.10.4" description = "A generic framework for writing satellite data ingest systems" authors = ["Rohan Weeden ", "Matt Perry "] license = "APACHE-2" From 89062b3aa3aa4e6f450def7036b123b84f095f15 Mon Sep 17 00:00:00 2001 From: benbart Date: Tue, 21 Apr 2026 13:08:46 -0800 Subject: [PATCH 2/3] Update mandible/umm_classes/factory.py Co-authored-by: Rohan Weeden --- mandible/umm_classes/factory.py | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/mandible/umm_classes/factory.py b/mandible/umm_classes/factory.py index 39e3ee4..111390c 100644 --- a/mandible/umm_classes/factory.py +++ b/mandible/umm_classes/factory.py @@ -60,14 +60,28 @@ def data_granule( def horizontal_spatial_domain( - geometry: Optional[Geometry] = None, zone_identifier: Optional[str] = None, + geometry: Optional[Geometry] = None, + # TODO(reweeden): Implement typing + orbit: Optional[dict[str, Any]] = None, + # TODO(reweeden): Implement typing + track: Optional[dict[str, Any]] = None, ) -> HorizontalSpatialDomain: obj: HorizontalSpatialDomain = {} - if geometry is not None: - obj["Geometry"] = geometry if zone_identifier is not None: obj["ZoneIdentifier"] = zone_identifier + if geometry is not None: + obj["Geometry"] = geometry + if orbit is not None: + obj["Orbit"] = orbit + if track is not None: + obj["Track"] = track + + if orbit is None and track is None: + raise ValueError( + "one of 'orbit' or 'track' is required", + ) + return obj From c26b1808b5ed067fdfdbf25c7ab32fc33cced04e Mon Sep 17 00:00:00 2001 From: Ben Barton Date: Tue, 21 Apr 2026 14:07:08 -0800 Subject: [PATCH 3/3] Remove whitespace --- mandible/umm_classes/factory.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mandible/umm_classes/factory.py b/mandible/umm_classes/factory.py index 111390c..a140257 100644 --- a/mandible/umm_classes/factory.py +++ b/mandible/umm_classes/factory.py @@ -76,12 +76,12 @@ def horizontal_spatial_domain( obj["Orbit"] = orbit if track is not None: obj["Track"] = track - + if orbit is None and track is None: raise ValueError( "one of 'orbit' or 'track' is required", ) - + return obj