Skip to content

Commit 2c5debd

Browse files
committed
Issue #699 extract _BandList from _StacMetadataParser
to resolve lint issue about unresolved name
1 parent a6ee251 commit 2c5debd

File tree

1 file changed

+35
-32
lines changed

1 file changed

+35
-32
lines changed

openeo/metadata.py

Lines changed: 35 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -699,25 +699,28 @@ def metadata_from_stac(url: str) -> CubeMetadata:
699699
_PYSTAC_1_9_EXTENSION_INTERFACE = hasattr(pystac.Item, "ext")
700700

701701

702+
class _BandList(list):
703+
"""Internal wrapper for list of ``Band`` objects"""
704+
705+
def __init__(self, bands: Iterable[Band]):
706+
super().__init__(bands)
707+
708+
def band_names(self) -> List[str]:
709+
return [band.name for band in self]
710+
711+
@classmethod
712+
def merge(cls, band_lists: Iterable[_BandList]) -> _BandList:
713+
"""Merge multiple lists of bands into a single list (unique by name)."""
714+
all_bands = (band for bands in band_lists for band in bands)
715+
return cls(unique(all_bands, key=lambda b: b.name))
716+
717+
702718
class _StacMetadataParser:
703719
"""
704720
Helper to extract openEO metadata from STAC metadata resource
705721
"""
706722

707-
class _Bands(list):
708-
"""Internal wrapper for list of ``Band`` objects"""
709-
710-
def __init__(self, bands: Iterable[Band]):
711-
super().__init__(bands)
712-
713-
def band_names(self) -> List[str]:
714-
return [band.name for band in self]
715723

716-
@classmethod
717-
def merge(cls, band_lists: Iterable["_Bands"]) -> "_Bands":
718-
"""Merge multiple lists of bands into a single list (unique by name)."""
719-
all_bands = (band for bands in band_lists for band in bands)
720-
return cls(unique(all_bands, key=lambda b: b.name))
721724

722725
def __init__(self, *, logger=_log, log_level=logging.DEBUG):
723726
self._logger = logger
@@ -843,7 +846,7 @@ def _band_from_common_bands_metadata(self, data: dict) -> Band:
843846

844847
def bands_from_stac_object(
845848
self, obj: Union[pystac.Catalog, pystac.Collection, pystac.Item, pystac.Asset]
846-
) -> _Bands:
849+
) -> _BandList:
847850
# Note: first check for Collection, as it is a subclass of Catalog
848851
if isinstance(obj, pystac.Collection):
849852
return self.bands_from_stac_collection(collection=obj)
@@ -856,30 +859,30 @@ def bands_from_stac_object(
856859
else:
857860
raise ValueError(obj)
858861

859-
def bands_from_stac_catalog(self, catalog: pystac.Catalog) -> _Bands:
862+
def bands_from_stac_catalog(self, catalog: pystac.Catalog) -> _BandList:
860863
# TODO: "eo:bands" vs "bands" priority based on STAC and EO extension version information
861864
summaries = catalog.extra_fields.get("summaries", {})
862865
self._warn(f"bands_from_stac_catalog with {summaries.keys()=} (which is non-standard)")
863866
if "eo:bands" in summaries:
864-
return self._Bands(self._band_from_eo_bands_metadata(b) for b in summaries["eo:bands"])
867+
return _BandList(self._band_from_eo_bands_metadata(b) for b in summaries["eo:bands"])
865868
elif "bands" in summaries:
866-
return self._Bands(self._band_from_common_bands_metadata(b) for b in summaries["bands"])
869+
return _BandList(self._band_from_common_bands_metadata(b) for b in summaries["bands"])
867870

868871
# TODO: instead of warning: exception, or return None?
869872
self._warn("bands_from_stac_catalog: no band name source found")
870-
return self._Bands([])
873+
return _BandList([])
871874

872875
def bands_from_stac_collection(
873876
self, collection: pystac.Collection, *, consult_items: bool = True, consult_assets: bool = True
874-
) -> _Bands:
877+
) -> _BandList:
875878
# TODO: "eo:bands" vs "bands" priority based on STAC and EO extension version information
876879
self._log(f"bands_from_stac_collection with {collection.summaries.lists.keys()=}")
877880
if "eo:bands" in collection.summaries.lists:
878-
return self._Bands(self._band_from_eo_bands_metadata(b) for b in collection.summaries.lists["eo:bands"])
881+
return _BandList(self._band_from_eo_bands_metadata(b) for b in collection.summaries.lists["eo:bands"])
879882
elif "bands" in collection.summaries.lists:
880-
return self._Bands(self._band_from_common_bands_metadata(b) for b in collection.summaries.lists["bands"])
883+
return _BandList(self._band_from_common_bands_metadata(b) for b in collection.summaries.lists["bands"])
881884
elif consult_items:
882-
bands = self._Bands.merge(
885+
bands = _BandList.merge(
883886
self.bands_from_stac_item(item=i, consult_parent=False, consult_assets=consult_assets)
884887
for i in collection.get_items()
885888
)
@@ -888,37 +891,37 @@ def bands_from_stac_collection(
888891

889892
# TODO: instead of warning: exception, or return None?
890893
self._warn("bands_from_stac_collection: no band name source found")
891-
return self._Bands([])
894+
return _BandList([])
892895

893896
def bands_from_stac_item(
894897
self, item: pystac.Item, *, consult_parent: bool = True, consult_assets: bool = True
895-
) -> _Bands:
898+
) -> _BandList:
896899
# TODO: "eo:bands" vs "bands" priority based on STAC and EO extension version information
897900
self._log(f"bands_from_stac_item with {item.properties.keys()=}")
898901
if "eo:bands" in item.properties:
899-
return self._Bands(self._band_from_eo_bands_metadata(b) for b in item.properties["eo:bands"])
902+
return _BandList(self._band_from_eo_bands_metadata(b) for b in item.properties["eo:bands"])
900903
elif "bands" in item.properties:
901-
return self._Bands(self._band_from_common_bands_metadata(b) for b in item.properties["bands"])
904+
return _BandList(self._band_from_common_bands_metadata(b) for b in item.properties["bands"])
902905
elif consult_parent and (parent_collection := item.get_collection()) is not None:
903906
return self.bands_from_stac_collection(collection=parent_collection)
904907
elif consult_assets:
905-
bands = self._Bands.merge(self.bands_from_stac_asset(asset=a) for a in item.get_assets().values())
908+
bands = _BandList.merge(self.bands_from_stac_asset(asset=a) for a in item.get_assets().values())
906909
if bands:
907910
return bands
908911

909912
# TODO: instead of warning: exception, or return None?
910913
self._warn("bands_from_stac_item: no band name source found")
911-
return self._Bands([])
914+
return _BandList([])
912915

913-
def bands_from_stac_asset(self, asset: pystac.Asset) -> _Bands:
916+
def bands_from_stac_asset(self, asset: pystac.Asset) -> _BandList:
914917
# TODO: "eo:bands" vs "bands" priority based on STAC and EO extension version information
915918
self._log(f"bands_from_stac_asset with {asset.extra_fields.keys()=}")
916919
if "eo:bands" in asset.extra_fields:
917-
return self._Bands(self._band_from_eo_bands_metadata(b) for b in asset.extra_fields["eo:bands"])
920+
return _BandList(self._band_from_eo_bands_metadata(b) for b in asset.extra_fields["eo:bands"])
918921
elif "bands" in asset.extra_fields:
919922
# TODO: avoid extra_fields, but built-in "bands" support seems to be scheduled for pystac V2
920-
return self._Bands(self._band_from_common_bands_metadata(b) for b in asset.extra_fields["bands"])
923+
return _BandList(self._band_from_common_bands_metadata(b) for b in asset.extra_fields["bands"])
921924

922925
# TODO: instead of warning: exception, or return None?
923926
self._warn("bands_from_stac_asset: no band name source found")
924-
return self._Bands([])
927+
return _BandList([])

0 commit comments

Comments
 (0)