11from __future__ import annotations
22
3+ import functools
34import logging
45import warnings
56from typing import Any , Callable , Dict , List , NamedTuple , Optional , Set , Tuple , Union
@@ -637,7 +638,7 @@ def get_bands_from_eo_bands(self, eo_bands: List[Union[dict, pystac.extensions.e
637638 return [self ._get_band_from_eo_bands_item (band ) for band in eo_bands ]
638639
639640 def _get_bands_from_item_asset (
640- self , item_asset : pystac .extensions .item_assets .AssetDefinition
641+ self , item_asset : pystac .extensions .item_assets .AssetDefinition , * , _warn : Callable [[ str ], None ] = _log . warning
641642 ) -> Union [List [Band ], None ]:
642643 """Get bands from a STAC 'item_assets' asset definition."""
643644 if _PYSTAC_1_9_EXTENSION_INTERFACE and item_asset .ext .has ("eo" ):
@@ -646,7 +647,7 @@ def _get_bands_from_item_asset(
646647 elif "eo:bands" in item_asset .properties :
647648 # TODO: skip this in strict mode?
648649 if _PYSTAC_1_9_EXTENSION_INTERFACE :
649- _log . warning ("Extracting band info from 'eo:bands' metadata, but 'eo' STAC extension was not declared." )
650+ _warn ("Extracting band info from 'eo:bands' metadata, but 'eo' STAC extension was not declared." )
650651 return self .get_bands_from_eo_bands (item_asset .properties ["eo:bands" ])
651652
652653 def get_bands_from_item_assets (
@@ -662,8 +663,10 @@ def get_bands_from_item_assets(
662663 :param item_assets: a STAC `item_assets` mapping
663664 """
664665 bands = set ()
666+ # Trick to just warn once per collection
667+ _warn = functools .lru_cache ()(_log .warning )
665668 for item_asset in item_assets .values ():
666- asset_bands = self ._get_bands_from_item_asset (item_asset )
669+ asset_bands = self ._get_bands_from_item_asset (item_asset , _warn = _warn )
667670 if asset_bands :
668671 bands .update (asset_bands )
669672 return bands
0 commit comments