@@ -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+
702718class _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