[Git][debian-gis-team/asf-search][upstream] New upstream version 14.0.0

Antonio Valentino (@antonio.valentino) gitlab at salsa.debian.org
Wed Sep 16 20:55:08 BST 2026



Antonio Valentino pushed to branch upstream at Debian GIS Project / asf-search


Commits:
ec8f66ac by Antonio Valentino at 2026-09-16T19:48:09+00:00
New upstream version 14.0.0
- - - - -


17 changed files:

- CHANGELOG.md
- asf_search/ASFProduct.py
- asf_search/ASFSearchOptions/validator_map.py
- asf_search/CMR/datasets.py
- asf_search/CMR/field_map.py
- asf_search/CMR/translate.py
- asf_search/Products/ALOSProduct.py
- asf_search/Products/SMAPProduct.py
- asf_search/Products/UAVSARProduct.py
- asf_search/constants/POLARIZATION.py
- asf_search/constants/PRODUCT_TYPE.py
- asf_search/export/json.py
- asf_search/export/jsonlite.py
- asf_search/search/geo_search.py
- asf_search/search/search.py
- asf_search/search/search_generator.py
- tests/yml_tests/test_search.yml


Changes:

=====================================
CHANGELOG.md
=====================================
@@ -27,6 +27,46 @@ and uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 -->
 
 ---
+## [v14.0.0](https://github.com/asfadmin/Discovery-asf_search/compare/v13.1.1...v14.0.0)
+### Changed
+- Breaking: `UAVSAR` umm metadata has been changed in CMR. All `UAVSAR`/`G-III` scenes have been consolidated into two collections `UAVSAR_POLSAR` and `UAVSAR_RPI` with updated metadata.
+    - To find urls for previously searchable product types use `find_urls()` method on search results lists and individual results.
+        - examples:
+            - Find gif urls for individual scene: `response[0].find_urls(extension='.gif')`
+            - Find urls for all `.slope` files from results: `response.find_url(extension='.slope')`
+            - Find urls for 1st amplitude kmz files from results: `response.find_urls(extension='.kmz', pattern=r'.*amp1.*')`
+    - `UAVSAR` no longer uses `campaign` keyword, use `siteDescription` instead
+
+
+### Removed
+- The following `UAVSAR` related constants in `PRODUCT_TYPE.py` have been removed:
+    - `AMPLITUDE`
+    - `STOKES`
+    - `AMPLITUDE_GRD`
+    - `PROJECTED`
+    - `PROJECTED_ML5X5`
+    - `PROJECTED_ML3X3`
+    - `INTERFEROMETRY_GRD`
+    - `INTERFEROMETRY`
+    - `COMPLEX`
+    - `INC`
+    - `SLOPE`
+    - `DEM_TIFF`
+    - `PAULI`
+    - `METADATA`
+
+### Added
+- `POLSAR` and `RPI` added to `PRODUCT_TYPE` constants
+
+------
+## [v13.1.1](https://github.com/asfadmin/Discovery-asf_search/compare/v13.1.0...v13.1.1)
+
+### Fixed
+
+- Handle "NOT AVAILABLE" when attempting to parse floats from UMM
+- SMAP additional metadata filled in
+- SMAP and ALOS export `additionalUrls` in jsonlite
+
 ## [v13.1.0](https://github.com/asfadmin/Discovery-asf_search/compare/v13.0.1...v13.1.0)
 
 ### Added


=====================================
asf_search/ASFProduct.py
=====================================
@@ -466,6 +466,11 @@ class ASFProduct:
             entry["Name"]: entry.get("Checksum", {"Value": None})["Value"] for entry in bytes_temp
         }
 
+        if size_format == "SizeUnit" and bytes_temp[0].get(size_format) == "MB":
+            for key, val in bytes_mapping.items():
+                if val.get("bytes") is not None:
+                    bytes_mapping[key]["bytes"] = val["bytes"] * 1**-6
+
         return FileSizeInfo(bytes_mapping, md5sum_mapping)
 
     def _set_additional_metadata(self):
@@ -593,7 +598,7 @@ class ASFProduct:
                     return None
             if item is None:
                 return None
-        if item in [None, "NA", "N/A", ""]:
+        if item in [None, "NA", "N/A", "", "NOT AVAILABLE"]:
             item = None
         return item
 


=====================================
asf_search/ASFSearchOptions/validator_map.py
=====================================
@@ -46,6 +46,7 @@ validator_map = {
     'beamSwath': parse_string_list,
     'dataMaturity': parse_string_list,
     'campaign': parse_string,
+    'siteDescription': parse_string,
     'circle': parse_circle,
     'linestring': parse_linestring,
     'point': parse_point,


=====================================
asf_search/CMR/datasets.py
=====================================
@@ -276,24 +276,26 @@ dataset_collections = {
         "SMAP_L1C_S0_V3",
     },
     "UAVSAR": {
-        "UAVSAR_INSAR_AMP",
-        "UAVSAR_INSAR_AMP_GRD",
-        "UAVSAR_INSAR_DEM",
-        "UAVSAR_INSAR_INT",
-        "UAVSAR_INSAR_INT_GRD",
-        "UAVSAR_INSAR_KMZ",
-        "UAVSAR_INSAR_META",
-        "UAVSAR_POL_DEM",
-        "UAVSAR_POL_INC",
-        "UAVSAR_POL_KMZ",
         "UAVSAR_POL_META",
+        "UAVSAR_INSAR_META",
+        "UAVSAR_INSAR_INT",
         "UAVSAR_POL_ML_CMPLX_GRD",
-        "UAVSAR_POL_ML_CMPLX_GRD_3X3",
-        "UAVSAR_POL_ML_CMPLX_GRD_5X5",
         "UAVSAR_POL_ML_CMPLX_SLANT",
-        "UAVSAR_POL_PAULI",
+        "UAVSAR_POL_INC",
+        "UAVSAR_POL_KMZ",
+        "UAVSAR_POL_DEM",
         "UAVSAR_POL_SLOPE",
+        "UAVSAR_POL_ML_CMPLX_GRD_3X3",
         "UAVSAR_POL_STOKES",
+        "UAVSAR_INSAR_INT_GRD",
+        "UAVSAR_POL_PAULI",
+        "UAVSAR_POL_ML_CMPLX_GRD_5X5",
+        "UAVSAR_INSAR_KMZ",
+        "UAVSAR_INSAR_AMP_GRD",
+        "UAVSAR_INSAR_AMP",
+        "UAVSAR_INSAR_DEM",
+        "UAVSAR_POLSAR",
+        "UAVSAR_RPI",
     },
     "RADARSAT-1": {
         "RSAT-1_L0",
@@ -465,6 +467,8 @@ collections_per_platform = {
         "UAVSAR_INSAR_AMP_GRD",
         "UAVSAR_INSAR_AMP",
         "UAVSAR_INSAR_DEM",
+        "UAVSAR_POLSAR",
+        "UAVSAR_RPI",
     },
     "NISAR": {
         "NISAR_L1_RIFG_BETA_V1",
@@ -593,7 +597,11 @@ collections_by_processing_level = {
     "RTC_HI_RES": {"ALOS_PSR_RTC_HIGH"},
     "RTC_LOW_RES": {"ALOS_PSR_RTC_LOW"},
     "L1.5": {"ALOS_PSR_L1.5"},
-    "KMZ": {"ALOS_PSR_KMZ", "UAVSAR_INSAR_KMZ", "UAVSAR_POL_KMZ"},
+    "KMZ": {
+        "ALOS_PSR_KMZ",
+        "UAVSAR_POLSAR",
+        "UAVSAR_RPI",
+    },
     "L1.0": {"ALOS_PSR_L1.0"},
     "L1.1": {"ALOS_PSR_L1.1"},
     "L2.2": {"ALOS_PSR_L2.2"},
@@ -619,34 +627,36 @@ collections_by_processing_level = {
     "L1A_Radar_ISO_XML": {"SPL1A_METADATA_001", "SPL1A_METADATA_002"},
     "L1A_Radar_QA": {"SPL1A_QA_001", "SPL1A_QA_002"},
     "L1A_Radar_RO_HDF5": {"SPL1A_RO_001", "SPL1A_RO_002", "SPL1A_RO_003"},
-    "L1B_S0_LoRes_HDF5": {"SPL1B_SO_LoRes_001", "SPL1B_SO_LoRes_002", "SPL1B_SO_LoRes_003"},
+    "L1B_S0_LoRes_HDF5": {
+        "SPL1B_SO_LoRes_001",
+        "SPL1B_SO_LoRes_002",
+        "SPL1B_SO_LoRes_003",
+    },
     "L1B_S0_LoRes_ISO_XML": {
         "SPL1B_SO_LoRes_METADATA_001",
         "SPL1B_SO_LoRes_METADATA_002",
         "SPL1B_SO_LoRes_METADATA_003",
     },
-    "L1B_S0_LoRes_QA": {"SPL1B_SO_LoRes_QA_001", "SPL1B_SO_LoRes_QA_002", "SPL1B_SO_LoRes_QA_003"},
-    "L1C_S0_HiRes_HDF5": {"SPL1C_S0_HiRes_001", "SPL1C_S0_HiRes_002", "SPL1C_S0_HiRes_003"},
+    "L1B_S0_LoRes_QA": {
+        "SPL1B_SO_LoRes_QA_001",
+        "SPL1B_SO_LoRes_QA_002",
+        "SPL1B_SO_LoRes_QA_003",
+    },
+    "L1C_S0_HiRes_HDF5": {
+        "SPL1C_S0_HiRes_001",
+        "SPL1C_S0_HiRes_002",
+        "SPL1C_S0_HiRes_003",
+    },
     "L1C_S0_HiRes_ISO_XML": {
         "SPL1C_S0_HiRes_METADATA_001",
         "SPL1C_S0_HiRes_METADATA_002",
         "SPL1C_S0_HiRes_METADATA_003",
     },
-    "L1C_S0_HiRes_QA": {"SPL1C_S0_HiRes_QA_001", "SPL1C_S0_HiRes_QA_002", "SPL1C_S0_HiRes_QA_003"},
-    "METADATA": {"UAVSAR_INSAR_META", "UAVSAR_POL_META"},
-    "INTERFEROMETRY": {"UAVSAR_INSAR_INT"},
-    "AMPLITUDE": {"UAVSAR_INSAR_AMP"},
-    "AMPLITUDE_GRD": {"UAVSAR_INSAR_AMP_GRD"},
-    "DEM_TIFF": {"UAVSAR_INSAR_DEM", "UAVSAR_POL_DEM"},
-    "INTERFEROMETRY_GRD": {"UAVSAR_INSAR_INT_GRD"},
-    "INC": {"UAVSAR_POL_INC"},
-    "PROJECTED": {"UAVSAR_POL_ML_CMPLX_GRD"},
-    "PROJECTED_ML3X3": {"UAVSAR_POL_ML_CMPLX_GRD_3X3"},
-    "PROJECTED_ML5X5": {"UAVSAR_POL_ML_CMPLX_GRD_5X5"},
-    "COMPLEX": {"UAVSAR_POL_ML_CMPLX_SLANT"},
-    "PAULI": {"UAVSAR_POL_PAULI"},
-    "SLOPE": {"UAVSAR_POL_SLOPE"},
-    "STOKES": {"UAVSAR_POL_STOKES"},
+    "L1C_S0_HiRes_QA": {
+        "SPL1C_S0_HiRes_QA_001",
+        "SPL1C_S0_HiRes_QA_002",
+        "SPL1C_S0_HiRes_QA_003",
+    },
     "L0B": {
         "NISAR_L0B_RRSD_BETA_V1",
         "NISAR_L0B_RRSD_PROVISIONAL_V1",
@@ -659,6 +669,8 @@ collections_by_processing_level = {
         "NISAR_L0B_RRSD_V1",
         "NISAR_UR_L0B_RRSD",
     },
+    "POLSAR": {"UAVSAR_POLSAR"},
+    "RPI": {"UAVSAR_RPI"},
     "RSLC": {"NISAR_L1_RSLC_BETA_V1", "NISAR_L1_RSLC_PROVISIONAL_V1", "NISAR_L1_RSLC_V1"},
     "RIFG": {"NISAR_L1_RIFG_BETA_V1", "NISAR_L1_RIFG_PROVISIONAL_V1", "NISAR_L1_RIFG_V1"},
     "RUNW": {"NISAR_L1_RUNW_BETA_V1", "NISAR_L1_RUNW_PROVISIONAL_V1", "NISAR_L1_RUNW_V1"},


=====================================
asf_search/CMR/field_map.py
=====================================
@@ -8,6 +8,7 @@ field_map = {
     'beamMode':                     {'key': 'attribute[]',              'fmt': 'string,BEAM_MODE,{0}'},
     'beamSwath':                    {'key': 'attribute[]',              'fmt': 'string,BEAM_MODE_TYPE,{0}'},
     'campaign':                     {'key': 'attribute[]',              'fmt': 'string,MISSION_NAME,{0}'},
+    'siteDescription':              {'key': 'attribute[]',              'fmt': 'string,SITE_DESCRIPTION,{0}'},
     'circle':                       {'key': 'circle',                   'fmt': '{0}'},
     'maxDoppler':                   {'key': 'attribute[]',              'fmt': 'float,DOPPLER,,{0}'},
     'minDoppler':                   {'key': 'attribute[]',              'fmt': 'float,DOPPLER,{0},'},


=====================================
asf_search/CMR/translate.py
=====================================
@@ -37,7 +37,7 @@ def translate_opts(opts: ASFSearchOptions) -> List:
 
     # Escape commas for each key in the list.
     # intersectsWith, temporal, and other keys you don't want to escape, so keep whitelist instead
-    for escape_commas in ["campaign"]:
+    for escape_commas in ["campaign", "siteDescription"]:
         if escape_commas in dict_opts:
             dict_opts[escape_commas] = dict_opts[escape_commas].replace(",", "\\,")
 


=====================================
asf_search/Products/ALOSProduct.py
=====================================
@@ -32,6 +32,9 @@ class ALOSProduct(ASFStackableProduct):
         "insarStackId": {"path": ["AdditionalAttributes", ("Name", "INSAR_STACK_ID"), "Values", 0]},
         "beamModeType": {"path": ["AdditionalAttributes", ("Name", "BEAM_MODE"), "Values", 0]},
         "polarization": {"path": ["AdditionalAttributes", ("Name", "POLARIZATION"), "Values"]},
+        "siteDescription": {
+            "path": ["AdditionalAttributes", ("Name", "SITE_DESCRIPTION"), "Values", 0]
+        },
     }
 
     def __init__(self, args: Dict = {}, session: ASFSession = ASFSession()):


=====================================
asf_search/Products/SMAPProduct.py
=====================================
@@ -20,7 +20,7 @@ class SMAPProduct(ASFProduct):
 
     def __init__(self, args: Dict = {}, session: ASFSession = ASFSession()):
         super().__init__(args, session)
-        if self.properties["md5sum"] is None:
+        if self.properties.get("md5sum") is None:
             self._set_additional_metadata()
 
         if self.properties.get("groupID") is None:


=====================================
asf_search/Products/UAVSARProduct.py
=====================================
@@ -9,10 +9,20 @@ class UAVSARProduct(ASFProduct):
 
     _base_properties = {
         **ASFProduct._base_properties,
-        'groupID': {'path': ['AdditionalAttributes', ('Name', 'GROUP_ID'), 'Values', 0]},
-        'insarStackId': {'path': ['AdditionalAttributes', ('Name', 'INSAR_STACK_ID'), 'Values', 0]},
-        'md5sum': {'path': ['AdditionalAttributes', ('Name', 'MD5SUM'), 'Values', 0]},
+        "groupID": {"path": ["AdditionalAttributes", ("Name", "GROUP_ID"), "Values", 0]},
+        "insarStackId": {"path": ["AdditionalAttributes", ("Name", "INSAR_STACK_ID"), "Values", 0]},
+        "md5sum": {"path": ["AdditionalAttributes", ("Name", "MD5SUM"), "Values", 0]},
+        "processingLevel": {
+            "path": ["AdditionalAttributes", ("Name", "PRODUCT_TYPE"), "Values", 0]
+        },
+        "polarization": {"path": ["AdditionalAttributes", ("Name", "POLARIZATION"), "Values"]},
     }
 
+    _default_browse_extensions = (".png", ".jpg", ".jpeg", ".gif")
+
     def __init__(self, args: Dict = {}, session: ASFSession = ASFSession()):
         super().__init__(args, session)
+
+        if self.properties["bytes"] is None:
+            self._set_additional_metadata()
+            self.properties["platform"] = "UAVSAR"


=====================================
asf_search/constants/POLARIZATION.py
=====================================
@@ -12,8 +12,7 @@ HH_5SCAN = 'HH 5SCAN'
 QUAD = 'quadrature'
 HH_VV = 'HH+VV'
 HH_HV_VH_VV = 'HH+HV+VH+VV'
-FULL = 'full'
 UNKNOWN = 'UNKNOWN'
 # NISAR
-LH_LV="LH+LV"
-RH_RV="RH+RV"
+LH_LV = 'LH+LV'
+RH_RV = 'RH+RV'


=====================================
asf_search/constants/PRODUCT_TYPE.py
=====================================
@@ -56,21 +56,37 @@ L1B_S0_LOW_RES_ISO_XML = "L1B_S0_LoRes_ISO_XML"
 L1C_S0_HIGH_RES_ISO_XML = "L1C_S0_HiRes_ISO_XML"
 
 # UAVSAR
+POLSAR = "POLSAR"
+RPI = "RPI"
+
 AMPLITUDE = "AMPLITUDE"
+"""[Deprecated] UAVSAR product file types are now consolidated under `POLSAR` and `RPI`"""
 STOKES = "STOKES"
+"""[Deprecated] UAVSAR product file types are now consolidated under `POLSAR` and `RPI`"""
 AMPLITUDE_GRD = "AMPLITUDE_GRD"
+"""[Deprecated] UAVSAR product file types are now consolidated under `POLSAR` and `RPI`"""
 PROJECTED = "PROJECTED"
+"""[Deprecated] UAVSAR product file types are now consolidated under `POLSAR` and `RPI`"""
 PROJECTED_ML5X5 = "PROJECTED_ML5X5"
+"""[Deprecated] UAVSAR product file types are now consolidated under `POLSAR` and `RPI`"""
 PROJECTED_ML3X3 = "PROJECTED_ML3X3"
+"""[Deprecated] UAVSAR product file types are now consolidated under `POLSAR` and `RPI`"""
 INTERFEROMETRY_GRD = "INTERFEROMETRY_GRD"
+"""[Deprecated] UAVSAR product file types are now consolidated under `POLSAR` and `RPI`"""
 INTERFEROMETRY = "INTERFEROMETRY"
+"""[Deprecated] UAVSAR product file types are now consolidated under `POLSAR` and `RPI`"""
 COMPLEX = "COMPLEX"
-# KMZ provided by ALOS PALSAR
+"""[Deprecated] UAVSAR product file types are now consolidated under `POLSAR` and `RPI`"""
 INC = "INC"
+"""[Deprecated] UAVSAR product file types are now consolidated under `POLSAR` and `RPI`"""
 SLOPE = "SLOPE"
+"""[Deprecated] UAVSAR product file types are now consolidated under `POLSAR` and `RPI`"""
 DEM_TIFF = "DEM_TIFF"
+"""[Deprecated] UAVSAR product file types are now consolidated under `POLSAR` and `RPI`"""
 PAULI = "PAULI"
+"""[Deprecated] UAVSAR product file types are now consolidated under `POLSAR` and `RPI`"""
 METADATA = "METADATA"
+"""[Deprecated] UAVSAR product file types are now consolidated under `POLSAR` and `RPI`"""
 
 # RADARSAT
 L0 = "L0"


=====================================
asf_search/export/json.py
=====================================
@@ -26,6 +26,7 @@ extra_json_fields = [
     ('sizeMB', ['DataGranule', 'ArchiveAndDistributionInformation', 0, 'Size']),
     ('flightLine', ['AdditionalAttributes', ('Name', 'FLIGHT_LINE'), 'Values', 0]),
     ('missionName', ['AdditionalAttributes', ('Name', 'MISSION_NAME'), 'Values', 0]),
+    ('siteDescription', ['AdditionalAttributes', ('Name', 'SITE_DESCRIPTION'), 'Values', 0]),
     ('centerLat', ['AdditionalAttributes', ('Name', 'CENTER_LAT'), 'Values', 0]),
     ('centerLon', ['AdditionalAttributes', ('Name', 'CENTER_LON'), 'Values', 0]),
     ('configurationName', ['AdditionalAttributes', ('Name', 'BEAM_MODE_DESC'), 'Values', 0]),


=====================================
asf_search/export/jsonlite.py
=====================================
@@ -9,6 +9,7 @@ from shapely.ops import transform
 from asf_search import ASF_LOGGER
 from asf_search.export.export_translators import ASFSearchResults_to_properties_list
 from asf_search.constants import PRODUCT_TYPE
+
 _MB = 1048576
 
 extra_jsonlite_fields = [
@@ -24,12 +25,16 @@ extra_jsonlite_fields = [
     ("sizeMB", ["DataGranule", "ArchiveAndDistributionInformation", 0, "Size"]),
     ("flightLine", ["AdditionalAttributes", ("Name", "FLIGHT_LINE"), "Values", 0]),
     ("missionName", ["AdditionalAttributes", ("Name", "MISSION_NAME"), "Values", 0]),
+    ("siteDescription", ["AdditionalAttributes", ("Name", "SITE_DESCRIPTION"), "Values", 0]),
 ]
 
+_MIGRATED_DATASETS = ["SEASAT 1", "SMAP", "ALOS", "UAVSAR"]
+
+
 def results_to_jsonlite(results):
-    ASF_LOGGER.info('started translating results to jsonlite format')
+    ASF_LOGGER.info("started translating results to jsonlite format")
     if len(results) == 0:
-        yield from json.JSONEncoder(indent=2, sort_keys=True).iterencode({'results': []})
+        yield from json.JSONEncoder(indent=2, sort_keys=True).iterencode({"results": []})
         return
 
     if not inspect.isgeneratorfunction(results) and not isinstance(results, GeneratorType):
@@ -169,7 +174,7 @@ class JSONLiteStreamArray(list):
             pass
 
         try:
-            p['frameNumber'] = int(p.get('frameNumber'))
+            p["frameNumber"] = int(p.get("frameNumber"))
         except TypeError:
             pass
 
@@ -205,9 +210,7 @@ class JSONLiteStreamArray(list):
             "productType": p.get("processingLevel"),
             "productTypeDisplay": p.get("processingTypeDisplay"),
             "sizeMB": p.get("sizeMB"),
-            "stackSize": p.get(
-                "insarStackSize"
-            ),  # Used for datasets with precalculated stacks
+            "stackSize": p.get("insarStackSize"),  # Used for datasets with precalculated stacks
             "startTime": p.get("startTime"),
             "stopTime": p.get("stopTime"),
             "thumb": p.get("thumb"),
@@ -229,57 +232,64 @@ class JSONLiteStreamArray(list):
             result["burst"] = p["burst"]
             result["sizeMB"] = float(p["bytes"]) / 1024000
 
-        elif result.get('productType', None) in [PRODUCT_TYPE.TROPO_ZENITH, PRODUCT_TYPE.ECMWF_TROPO]:
-            result['sizeMB'] = p.get('bytes', {})
-            result['s3Urls'] = p.get('s3Urls', [])
-            result['additionalUrls'] = p.get('additionalUrls')
+        elif result.get("productType", None) in [
+            PRODUCT_TYPE.TROPO_ZENITH,
+            PRODUCT_TYPE.ECMWF_TROPO,
+        ]:
+            result["sizeMB"] = p.get("bytes", {})
+            result["s3Urls"] = p.get("s3Urls", [])
+            result["additionalUrls"] = p.get("additionalUrls")
             result["collectionName"] = p.get("collectionName")
             result["conceptID"] = p.get("conceptID")
-        elif p.get('operaBurstID') is not None or result['productID'].startswith('OPERA'):
-            result['opera'] = {
-                'operaBurstID': p.get('operaBurstID'),
-                's3Urls': p.get('s3Urls', []),
-                'additionalUrls': p.get('additionalUrls'),
-                'tileID': p.get('tileID'),
-                'productVersion': p.get('productVersion'),
-                'bytes': p.get('bytes', {})
+        elif p.get("operaBurstID") is not None or result["productID"].startswith("OPERA"):
+            result["opera"] = {
+                "operaBurstID": p.get("operaBurstID"),
+                "s3Urls": p.get("s3Urls", []),
+                "additionalUrls": p.get("additionalUrls"),
+                "tileID": p.get("tileID"),
+                "productVersion": p.get("productVersion"),
+                "bytes": p.get("bytes", {}),
             }
-            if p.get('validityStartDate'):
-                result['opera']['validityStartDate'] = p.get('validityStartDate')
-        elif p.get('platform') == 'NISAR':
-            result['nisar'] = {
-                'additionalUrls': p.get('additionalUrls', []),
-                's3Urls': p.get('s3Urls', []),
-                'pgeVersion':  p.get('pgeVersion'),
-                'crid': p.get('crid'),
-                'mainBandPolarization':  p.get('mainBandPolarization'),
-                'sideBandPolarization':  p.get('sideBandPolarization'),
-                'frameCoverage':  p.get('frameCoverage'),
-                'jointObservation':  p.get('jointObservation'),
-                'rangeBandwidth':  p.get('rangeBandwidth'),
-                'sizeMB': p.get('bytes'),
-                'orbitType': p.get('orbitType'),
+            if p.get("validityStartDate"):
+                result["opera"]["validityStartDate"] = p.get("validityStartDate")
+        elif p.get("platform") == "NISAR":
+            result["nisar"] = {
+                "additionalUrls": p.get("additionalUrls", []),
+                "s3Urls": p.get("s3Urls", []),
+                "pgeVersion": p.get("pgeVersion"),
+                "crid": p.get("crid"),
+                "mainBandPolarization": p.get("mainBandPolarization"),
+                "sideBandPolarization": p.get("sideBandPolarization"),
+                "frameCoverage": p.get("frameCoverage"),
+                "jointObservation": p.get("jointObservation"),
+                "rangeBandwidth": p.get("rangeBandwidth"),
+                "sizeMB": p.get("bytes"),
+                "orbitType": p.get("orbitType"),
             }
             result["collectionName"] = p.get("collectionName")
             result["conceptID"] = p.get("conceptID")
-        elif p.get('platform') == 'SEASAT 1':
-            result['additionalUrls'] = p.get('additionalUrls', [])
-            result['s3Urls'] = p.get('s3Urls', [])
-            result['sizeMB'] = p.get('bytes', {})
-
-        elif result.get('productID', result.get('fileName', '')).startswith('S1-GUNW'):
+        elif p.get("platform") in _MIGRATED_DATASETS:
+            result["additionalUrls"] = p.get("additionalUrls", [])
+            result["s3Urls"] = p.get("s3Urls", [])
+            result["sizeMB"] = p.get("bytes", {})
+            if p.get("platform") == "UAVSAR" and result.get("missionName") is None:
+                result["missionName"] = p.get("siteDescription", {})
+
+        elif result.get("productID", result.get("fileName", "")).startswith("S1-GUNW"):
             result.pop("perpendicularBaseline", None)
-            if p.get('ariaVersion') is None:
-                version_unformatted = result.get('productID').split('v')[-1]
-                result['ariaVersion'] = re.sub(r'[^0-9\.]', '', version_unformatted.replace("_", '.'))
+            if p.get("ariaVersion") is None:
+                version_unformatted = result.get("productID").split("v")[-1]
+                result["ariaVersion"] = re.sub(
+                    r"[^0-9\.]", "", version_unformatted.replace("_", ".")
+                )
             else:
-                result['ariaVersion'] = p.get('ariaVersion')
-                result['productTypeDisplay'] = 'Standard Product, NetCDF'
-            
-            if result['sizeMB'] is None:
+                result["ariaVersion"] = p.get("ariaVersion")
+                result["productTypeDisplay"] = "Standard Product, NetCDF"
+
+            if result["sizeMB"] is None:
                 result["sizeMB"] = float(p["bytes"]) / _MB
                 pass
-        
+
         return result
 
     def getOutputType(self) -> str:


=====================================
asf_search/search/geo_search.py
=====================================
@@ -17,6 +17,7 @@ def geo_search(
     beamMode: Union[str, Sequence[str]] = None,
     beamSwath: Union[str, Sequence[str]] = None,
     campaign: Union[str, Sequence[str]] = None,
+    siteDescription: Union[str, Sequence[str]] = None,
     dataMaturity: Union[Literal['BETA', 'PROVISIONAL', 'VALIDATED'], Sequence[Literal['BETA', 'PROVISIONAL', 'VALIDATED']]] = None,
     maxDoppler: float = None,
     minDoppler: float = None,


=====================================
asf_search/search/search.py
=====================================
@@ -19,6 +19,7 @@ def search(
     beamMode: Union[str, Sequence[str]] = None,
     beamSwath: Union[str, Sequence[str]] = None,
     campaign: Union[str, Sequence[str]] = None,
+    siteDescription: Union[str, Sequence[str]] = None,
     dataMaturity: Union[Literal['BETA', 'PROVISIONAL', 'VALIDATED'], Sequence[Literal['BETA', 'PROVISIONAL', 'VALIDATED']]] = None,
     maxDoppler: float = None,
     minDoppler: float = None,


=====================================
asf_search/search/search_generator.py
=====================================
@@ -44,6 +44,7 @@ def search_generator(
     beamMode: Union[str, Sequence[str]] = None,
     beamSwath: Union[str, Sequence[str]] = None,
     campaign: Union[str, Sequence[str]] = None,
+    siteDescription: Union[str, Sequence[str]] = None,
     dataMaturity: Union[
         Literal["BETA", "PROVISIONAL", "VALIDATED"],
         Sequence[Literal["BETA", "PROVISIONAL", "VALIDATED"]],


=====================================
tests/yml_tests/test_search.yml
=====================================
@@ -207,17 +207,17 @@ tests:
             - "SENTINEL-1B_SLC"
             - "SENTINEL-1C_SLC"
             - "SENTINEL-1D_SLC"
-  - test-search-build_subquery INTERFEROMETRY:
+  - test-search-build_subquery UAVSAR POLSAR:
       params:
         processingLevel:
-          - INTERFEROMETRY
+          - POLSAR
       expected:
         - shortName:
-            - UAVSAR_INSAR_INT
-  - test-search-build_subquery INTERFEROMETRY & SLC Collection:
+            - UAVSAR_POLSAR
+  - test-search-build_subquery POLSAR & SLC Collection:
       params:
         processingLevel:
-          - INTERFEROMETRY
+          - POLSAR
         collections:
           - C1214470488-ASF
           - C1205428742-ASF
@@ -228,7 +228,7 @@ tests:
       expected:
         [
           {
-            shortName: UAVSAR_INSAR_INT,
+            shortName: UAVSAR_POLSAR,
             collections:
               [
                 C1214470488-ASF,
@@ -240,10 +240,10 @@ tests:
               ],
           },
         ]
-  - test-search-build_subquery INTERFEROMETRY & SLC Collection with duplicate INTERFEROMETRY collection:
+  - test-search-build_subquery POLSAR & SLC Collection with duplicate INTERFEROMETRY collection:
       params:
         processingLevel:
-          - INTERFEROMETRY
+          - POLSAR
         collections:
           - C1214470488-ASF
           - C1205428742-ASF
@@ -255,7 +255,7 @@ tests:
       expected:
         [
           {
-            shortName: UAVSAR_INSAR_INT,
+            shortName: UAVSAR_POLSAR,
             collections:
               [
                 C1212001698-ASF,
@@ -303,14 +303,14 @@ tests:
         ]
   - test-search-build_subquery mismatched processingLevel for platform:
       params:
-        processingLevel: METADATA
+        processingLevel: POLSAR
         platform: NISAR
-      expected: [{ processingLevel: [METADATA], platform: [NISAR] }]
+      expected: [{ processingLevel: [POLSAR], platform: [NISAR] }]
   - test-search-build_subquery mismatched processingLevel for platform CSLC and S1A:
       params:
-        processingLevel: METADATA
+        processingLevel: POLSAR
         platform: SENTINEL-1A
-      expected: [{ processingLevel: [METADATA], platform: [SENTINEL-1A] }]
+      expected: [{ processingLevel: [POLSAR], platform: [SENTINEL-1A] }]
   - test-search-build_subquery UNKNOWN_PROCESSING_TYPE with platform, SLC, & collection (skip set difference with unknown processing level):
       params:
         platform:
@@ -354,24 +354,26 @@ tests:
                 "SENTINEL-1B_META_RAW",
                 "SENTINEL-1B_META_SLC",
                 "SENTINEL-1B_SLC",
-                "UAVSAR_POL_META",
+                "UAVSAR_POLSAR",
+                "UAVSAR_RPI",
                 "UAVSAR_INSAR_META",
-                "UAVSAR_INSAR_INT",
                 "UAVSAR_POL_ML_CMPLX_GRD",
-                "UAVSAR_POL_ML_CMPLX_SLANT",
-                "UAVSAR_POL_INC",
+                "UAVSAR_POL_SLOPE",
+                "UAVSAR_INSAR_AMP",
                 "UAVSAR_POL_KMZ",
+                "UAVSAR_INSAR_INT",
                 "UAVSAR_POL_DEM",
-                "UAVSAR_POL_SLOPE",
-                "UAVSAR_POL_ML_CMPLX_GRD_3X3",
-                "UAVSAR_POL_STOKES",
+                "UAVSAR_POL_ML_CMPLX_SLANT",
                 "UAVSAR_INSAR_INT_GRD",
-                "UAVSAR_POL_PAULI",
+                "UAVSAR_INSAR_DEM",
+                "UAVSAR_POL_META",
+                "UAVSAR_INSAR_AMP_GRD",
+                "UAVSAR_POL_INC",
                 "UAVSAR_POL_ML_CMPLX_GRD_5X5",
+                "UAVSAR_POL_STOKES",
                 "UAVSAR_INSAR_KMZ",
-                "UAVSAR_INSAR_AMP_GRD",
-                "UAVSAR_INSAR_AMP",
-                "UAVSAR_INSAR_DEM",
+                "UAVSAR_POL_ML_CMPLX_GRD_3X3",
+                "UAVSAR_POL_PAULI",
               ],
           },
         ]
@@ -559,7 +561,7 @@ tests:
       params:
         platform: UAVSAR
 
-  - test-aliasing-search-against-api UAVSAR AMPLITUDE:
+  - test-aliasing-search-against-api UAVSAR RPI:
       params:
         platform: UAVSAR
-        processingLevel: AMPLITUDE
+        processingLevel: UAVSAR_RPI



View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/commit/ec8f66ac5c713de630461dd01dc26eb9eead7f8c

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/asf-search/-/commit/ec8f66ac5c713de630461dd01dc26eb9eead7f8c
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20260916/cc5483a8/attachment-0001.htm>


More information about the Pkg-grass-devel mailing list