Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

V6.7.3 Release #252

Merged
merged 22 commits into from
Jan 9, 2024
Merged
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
a928393
adds OPERA-S1 PRODUCT_TYPE constants
Dec 19, 2023
3b7f3bb
harmonizes search/geo_search/search_count params
Dec 19, 2023
245caa7
changes instances of list validators to work with iterables in general
Dec 21, 2023
0a345f9
changes instance check to check for Iterable instance instead of just…
Dec 21, 2023
ed18378
updates parser test cases from _list to _iterable
Dec 21, 2023
47185b0
checks if iterable is sting in validator
Dec 21, 2023
b6b350a
update changelog
Dec 22, 2023
a2fc3c4
Merge pull request #249 from asfadmin/search-param-harmonization
SpicyGarlicAlbacoreRoll Dec 22, 2023
3eff6dd
Merge branch 'master' into bugfix_iterator_parsing_tuples
SpicyGarlicAlbacoreRoll Dec 22, 2023
164f29f
Merge pull request #251 from asfadmin/bugfix_iterator_parsing_tuples
SpicyGarlicAlbacoreRoll Dec 22, 2023
baeaa3c
Merge branch 'master' into opera-PRODUCT_TYPE-constants
SpicyGarlicAlbacoreRoll Dec 22, 2023
85d1521
Merge pull request #250 from asfadmin/opera-PRODUCT_TYPE-constants
SpicyGarlicAlbacoreRoll Dec 22, 2023
43541fd
Merge branch 'stable' into master
SpicyGarlicAlbacoreRoll Dec 22, 2023
a0a19bb
fixes List return typing, updates python min version, update CHANGELOG
Jan 8, 2024
c5193fd
removes 3.7 and below from classifiers in setup.py
Jan 8, 2024
78fa28f
changes instances of Iterable type hinting to Sequence
Jan 9, 2024
d410a29
update changelog
Jan 9, 2024
939b626
optimizes range() when step=1, allows ranges in lists
Jan 9, 2024
fec73b9
moves range object parser logic into method, adds valueError exception
Jan 9, 2024
2c914f5
updates type hinting with range for certain search params
Jan 9, 2024
efea8b4
simplifies range validation, removes unecessary if statement
Jan 9, 2024
a5f017e
Merge pull request #254 from asfadmin/range-object-validator-support
SpicyGarlicAlbacoreRoll Jan 9, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,18 @@ and uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-

-->
------
## [v6.7.3](https://github.com/asfadmin/Discovery-asf_search/compare/v6.7.2...v6.7.3)
### Added
- Adds OPERA-S1 constants `RTC`, `RTC_STATIC` (RTC-STATIC), `CSLC`, `CSLC_STATIC` (CSLC-STATIC) to `PRODUCT_TYPE.py`

### Fixed
- search method params with `Iterable` type hinting now actually accept iterables
- Harmonizes `search()`, `geo_search()`, and `search_count()` parameters

------
## [v6.7.2](https://github.com/asfadmin/Discovery-asf_search/compare/v6.7.1...v6.7.2)
### Adds
### Added
- Adds constants for `dataset` keyword, under `asf_search.DATASET`
- Adds CALVAL concept-ids to 'OPERA-S1' dataset
- Adds `validityStartDate` for applicable OPERA-S1 products
Expand Down
46 changes: 23 additions & 23 deletions asf_search/ASFSearchOptions/validator_map.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

from .validators import (
parse_string, parse_float, parse_wkt, parse_date,
parse_string_list, parse_int_list, parse_int_or_range_list,
parse_float_or_range_list,
parse_string_iterator, parse_int_iterator, parse_int_or_range_iterator,
parse_float_or_range_iterator,
SpicyGarlicAlbacoreRoll marked this conversation as resolved.
Show resolved Hide resolved
parse_session
)

Expand All @@ -27,41 +27,41 @@ def validate(key, value):
validator_map = {
# Search parameters Parser
'maxResults': int,
'absoluteOrbit': parse_int_or_range_list,
'asfFrame': parse_int_or_range_list,
'beamMode': parse_string_list,
'beamSwath': parse_string_list,
'absoluteOrbit': parse_int_or_range_iterator,
'asfFrame': parse_int_or_range_iterator,
'beamMode': parse_string_iterator,
'beamSwath': parse_string_iterator,
'campaign': parse_string,
'maxDoppler': parse_float,
'minDoppler': parse_float,
'maxFaradayRotation': parse_float,
'minFaradayRotation': parse_float,
'flightDirection': parse_string,
'flightLine': parse_string,
'frame': parse_int_or_range_list,
'granule_list': parse_string_list,
'product_list': parse_string_list,
'frame': parse_int_or_range_iterator,
'granule_list': parse_string_iterator,
'product_list': parse_string_iterator,
'intersectsWith': parse_wkt,
'lookDirection': parse_string,
'offNadirAngle': parse_float_or_range_list,
'platform': parse_string_list,
'polarization': parse_string_list,
'processingLevel': parse_string_list,
'relativeOrbit': parse_int_or_range_list,
'offNadirAngle': parse_float_or_range_iterator,
'platform': parse_string_iterator,
'polarization': parse_string_iterator,
'processingLevel': parse_string_iterator,
'relativeOrbit': parse_int_or_range_iterator,
'processingDate': parse_date,
'start': parse_date,
'end': parse_date,
'season': parse_int_list,
'groupID': parse_string_list,
'season': parse_int_iterator,
'groupID': parse_string_iterator,
'insarStackId': parse_string,
'instrument': parse_string,
'collections': parse_string_list,
'temporalBaselineDays': parse_string_list,
'operaBurstID': parse_string_list,
'absoluteBurstID': parse_int_list,
'relativeBurstID': parse_int_list,
'fullBurstID': parse_string_list,
'dataset': parse_string_list,
'collections': parse_string_iterator,
'temporalBaselineDays': parse_string_iterator,
'operaBurstID': parse_string_iterator,
'absoluteBurstID': parse_int_iterator,
'relativeBurstID': parse_int_iterator,
'fullBurstID': parse_string_iterator,
'dataset': parse_string_iterator,

# Config parameters Parser
'session': parse_session,
Expand Down
64 changes: 32 additions & 32 deletions asf_search/ASFSearchOptions/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import datetime

import requests
from typing import Union, Tuple, TypeVar, Callable, List, Type
from typing import Iterable, Union, Tuple, TypeVar, Callable, List, Type

import math
from shapely import wkt, errors
Expand Down Expand Up @@ -93,31 +93,31 @@ def parse_float_range(value: Tuple[float, float]) -> Tuple[float, float]:
return parse_range(value, float)


# Parse and validate a list of values, using h() to validate each value: "a,b,c", "1,2,3", "1.1,2.3"
def parse_list(value: list, h) -> list:
if not isinstance(value, list):
# Parse and validate an iterable of values, using h() to validate each value: "a,b,c", "1,2,3", "1.1,2.3"
def parse_iterator(value: Iterable, h) -> list:
if not isinstance(value, Iterable) or isinstance(value, str):
value = [value]
try:
return [h(a) for a in value]
except ValueError as exc:
raise ValueError(f'Invalid {h.__name__} list: {exc}') from exc

# Parse and validate a list of strings: "foo,bar,baz"
def parse_string_list(value: List[str]) -> List[str]:
return parse_list(value, str)
# Parse and validate an iterable of strings: "foo,bar,baz"
def parse_string_iterator(value: Iterable[str]) -> List[str]:
return parse_iterator(value, str)


# Parse and validate a list of integers: "1,2,3"
def parse_int_list(value: List[int]) -> List[int]:
return parse_list(value, int)
# Parse and validate an iterable of integers: "1,2,3"
def parse_int_iterator(value: Iterable[int]) -> List[int]:
return parse_iterator(value, int)


# Parse and validate a list of floats: "1.1,2.3,4.5"
def parse_float_list(value: List[float]) -> List[float]:
return parse_list(value, float)
# Parse and validate an iterable of floats: "1.1,2.3,4.5"
def parse_float_iterator(value: Iterable[float]) -> List[float]:
return parse_iterator(value, float)


def parse_number_or_range(value: Union[list, Tuple[number, number]], h):
def parse_number_or_range(value: Union[List, Tuple[number, number]], h):
SpicyGarlicAlbacoreRoll marked this conversation as resolved.
Show resolved Hide resolved
try:
if isinstance(value, tuple):
return parse_range(value, h)
Expand All @@ -126,27 +126,27 @@ def parse_number_or_range(value: Union[list, Tuple[number, number]], h):
raise ValueError(f'Invalid {h.__name__} or range: {exc}') from exc


# Parse and validate a list of numbers or number ranges, using h() to validate each value: "1,2,3-5", "1.1,1.4,5.1-6.7"
def parse_number_or_range_list(value: list, h) -> list:
if not isinstance(value, list):
# Parse and validate an iterable of numbers or number ranges, using h() to validate each value: "1,2,3-5", "1.1,1.4,5.1-6.7"
def parse_number_or_range_iterator(value: Iterable, h) -> list:
if not isinstance(value, Iterable):
value = [value]
return [parse_number_or_range(x, h) for x in value]


# Parse and validate a list of integers or integer ranges: "1,2,3-5"
def parse_int_or_range_list(value: list) -> list:
return parse_number_or_range_list(value, int)
# Parse and validate an iterable of integers or integer ranges: "1,2,3-5"
def parse_int_or_range_iterator(value: Iterable) -> list:
return parse_number_or_range_iterator(value, int)


# Parse and validate a list of float or float ranges: "1.0,2.0,3.0-5.0"
def parse_float_or_range_list(value: list) -> list:
return parse_number_or_range_list(value, parse_float)
# Parse and validate an iterable of float or float ranges: "1.0,2.0,3.0-5.0"
def parse_float_or_range_iterator(value: Iterable) -> list:
SpicyGarlicAlbacoreRoll marked this conversation as resolved.
Show resolved Hide resolved
return parse_number_or_range_iterator(value, parse_float)


# Parse and validate a coordinate list
def parse_coord_list(value: List[float]) -> List[float]:
if not isinstance(value, list):
raise ValueError(f'Invalid coord list list: Must pass in a list. Got {type(value)}.')
def parse_coord_iterator(value: Iterable[float]) -> List[float]:
if not isinstance(value, Iterable):
raise ValueError(f'Invalid coord list list: Must pass in an iterable. Got {type(value)}.')
for coord in value:
try:
float(coord)
Expand All @@ -158,10 +158,10 @@ def parse_coord_list(value: List[float]) -> List[float]:


# Parse and validate a bbox coordinate list
def parse_bbox_list(value: List[float]) -> List[float]:
def parse_bbox_iterator(value: Iterable[float]) -> List[float]:
try:
# This also makes sure v is a list:
value = parse_coord_list(value)
# This also makes sure v is an iterable:
value = parse_coord_iterator(value)
except ValueError as exc:
raise ValueError(f'Invalid bbox: {exc}') from exc
if len(value) != 4:
Expand All @@ -170,10 +170,10 @@ def parse_bbox_list(value: List[float]) -> List[float]:


# Parse and validate a point coordinate list
def parse_point_list(value: List[float]) -> List[float]:
def parse_point_iterator(value: Iterable[float]) -> List[float]:
try:
# This also makes sure v is a list:
value = parse_coord_list(value)
# This also makes sure v is an iterable:
value = parse_coord_iterator(value)
except ValueError as exc:
raise ValueError(f'Invalid point: {exc}') from exc
if len(value) != 2:
Expand Down
6 changes: 6 additions & 0 deletions asf_search/constants/PRODUCT_TYPE.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,3 +94,9 @@
# SEASAT
GEOTIFF = 'GEOTIFF'
# L1 provided by RADARSAT

# OPERA-S1
RTC = 'RTC'
CSLC = 'CSLC'
RTC_STATIC = 'RTC-STATIC'
CSLS_STATIC = 'CSLC-STATIC'
44 changes: 31 additions & 13 deletions asf_search/search/geo_search.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Union, Iterable
from typing import Tuple, Union, Iterable
import datetime
from copy import copy

Expand All @@ -9,24 +9,42 @@

def geo_search(
intersectsWith: str,
absoluteOrbit: Iterable[Union[int, range]] = None,
asfFrame: Iterable[Union[int, range]] = None,
beamMode: Iterable[str] = None,
absoluteOrbit: Union[int, Tuple[int, int], Iterable[Union[int, Tuple[int, int]]]] = None,
asfFrame: Union[int, Tuple[int, int], Iterable[Union[int, Tuple[int, int]]]] = None,
beamMode: Union[str, Iterable[str]] = None,
beamSwath: Union[str, Iterable[str]] = None,
campaign: Union[str, Iterable[str]] = None,
maxDoppler: float = None,
minDoppler: float = None,
end: Union[datetime.datetime, str] = None,
flightDirection: Iterable[str] = None,
frame: Iterable[Union[int, range]] = None,
instrument: Iterable[str] = None,
lookDirection: Iterable[str] = None,
platform: Iterable[str] = None,
polarization: Iterable[str] = None,
maxFaradayRotation: float = None,
minFaradayRotation: float = None,
flightDirection: str = None,
flightLine: str = None,
frame: Union[int, Tuple[int, int], Iterable[Union[int, Tuple[int, int]]]] = None,
granule_list: Union[str, Iterable[str]] = None,
groupID: Union[str, Iterable[str]] = None,
insarStackId: str = None,
instrument: Union[str, Iterable[str]] = None,
lookDirection: Union[str, Iterable[str]] = None,
offNadirAngle: Union[float, Tuple[float, float], Iterable[Union[float, Tuple[float, float]]]] = None,
platform: Union[str, Iterable[str]] = None,
polarization: Union[str, Iterable[str]] = None,
processingDate: Union[datetime.datetime, str] = None,
processingLevel: Iterable[str] = None,
relativeOrbit: Iterable[Union[int, range]] = None,
processingLevel: Union[str, Iterable[str]] = None,
product_list: Union[str, Iterable[str]] = None,
relativeOrbit: Union[int, Tuple[int, int], Iterable[Union[int, Tuple[int, int]]]] = None,
season: Tuple[int, int] = None,
start: Union[datetime.datetime, str] = None,
absoluteBurstID: Union[int, Iterable[int]] = None,
relativeBurstID: Union[int, Iterable[int]] = None,
fullBurstID: Union[str, Iterable[str]] = None,
collections: Union[str, Iterable[str]] = None,
temporalBaselineDays: Union[str, Iterable[str]] = None,
operaBurstID: Union[str, Iterable[str]] = None,
dataset: Union[str, Iterable[str]] = None,
maxResults: int = None,
opts: ASFSearchOptions = None
opts: ASFSearchOptions = None,
) -> ASFSearchResults:
"""
Performs a geographic search using the ASF SearchAPI
Expand Down
7 changes: 7 additions & 0 deletions asf_search/search/search_count.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,13 @@ def search_count(
relativeOrbit: Union[int, Tuple[int, int], Iterable[Union[int, Tuple[int, int]]]] = None,
season: Tuple[int, int] = None,
start: Union[datetime.datetime, str] = None,
absoluteBurstID: Union[int, Iterable[int]] = None,
relativeBurstID: Union[int, Iterable[int]] = None,
fullBurstID: Union[str, Iterable[str]] = None,
collections: Union[str, Iterable[str]] = None,
temporalBaselineDays: Union[str, Iterable[str]] = None,
operaBurstID: Union[str, Iterable[str]] = None,
dataset: Union[str, Iterable[str]] = None,
maxResults: int = None,
opts: ASFSearchOptions = None,
) -> int:
Expand Down
24 changes: 12 additions & 12 deletions tests/yml_tests/test_ASFSearchOptions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,38 +63,38 @@ tests:
output: { tuple: [123.5, 125.5] }
error: null

- test-validators parse_string_list strings:
validator: parse_string_list
- test-validators parse_string_iterator strings:
validator: parse_string_iterator
input: ['asf', 'nasa']
output: ['asf', 'nasa']
error: null

- test-validators parse_string_list numbers:
validator: parse_string_list
- test-validators parse_string_iterator numbers:
validator: parse_string_iterator
input: [123, 0.123, 0.0]
output: ['123', '0.123', '0.0']
error: null

- test-validators parse_int_list strings:
validator: parse_int_list
- test-validators parse_int_iterator strings:
validator: parse_int_iterator
input: ['1', '2', '123']
output: [1, 2, 123]
error: null

- test-validators parse_int_list int:
validator: parse_int_list
- test-validators parse_int_iterator int:
validator: parse_int_iterator
input: [1, 2, 123]
output: [1, 2, 123]
error: null

- test-validators parse_int_list floats:
validator: parse_int_list
- test-validators parse_int_iterator floats:
validator: parse_int_iterator
input: [1.0, 2.0, 123.5]
output: [1, 2, 123]
error: null

- test-validators parse_int_list error strings:
validator: parse_int_list
- test-validators parse_int_iterator error strings:
validator: parse_int_iterator
input: ['asf', 'nasa']
output: null
error: Invalid int list
Expand Down
Loading