Skip to content

Commit

Permalink
revamped tests for conjunction searches
Browse files Browse the repository at this point in the history
  • Loading branch information
dchaddock committed Feb 5, 2025
1 parent 381763d commit 5a63ca4
Show file tree
Hide file tree
Showing 13 changed files with 987 additions and 466 deletions.
12 changes: 6 additions & 6 deletions COVERAGE.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,13 @@ pyaurorax/search/api/classes/response.py 9 0 10
pyaurorax/search/availability/__init__.py 14 0 100%
pyaurorax/search/availability/_availability.py 21 0 100%
pyaurorax/search/availability/classes/availability_result.py 8 0 100%
pyaurorax/search/conjunctions/__init__.py 29 0 100%
pyaurorax/search/conjunctions/__init__.py 31 0 100%
pyaurorax/search/conjunctions/_conjunctions.py 91 0 100%
pyaurorax/search/conjunctions/classes/conjunction.py 39 0 100%
pyaurorax/search/conjunctions/classes/criteria_block.py 84 51 39% 51, 54, 66-76, 114, 117, 130-141, 144-147, 166-168, 171, 174, 185-194, 209, 212, 215, 221-222, 225-233
pyaurorax/search/conjunctions/classes/search.py 215 29 87% 40, 173, 175, 179, 184, 186, 190, 319, 333, 343-349, 358-359, 377, 419, 423, 445-446, 457-458, 530-535
pyaurorax/search/conjunctions/classes/criteria_block.py 67 0 100%
pyaurorax/search/conjunctions/classes/search.py 215 3 99% 366, 471-472
pyaurorax/search/conjunctions/swarmaurora/__init__.py 15 0 100%
pyaurorax/search/conjunctions/swarmaurora/_swarmaurora.py 25 4 84% 33-35, 47
pyaurorax/search/conjunctions/swarmaurora/_swarmaurora.py 24 0 100%
pyaurorax/search/data_products/__init__.py 33 2 94% 124, 234
pyaurorax/search/data_products/_data_products.py 100 27 73% 40-44, 86, 92, 96, 101, 128, 143-145, 154, 169, 177-204, 211-214
pyaurorax/search/data_products/classes/data_product.py 47 1 98% 130
Expand All @@ -47,7 +47,7 @@ pyaurorax/search/ephemeris/classes/search.py 129 47 6
pyaurorax/search/location.py 29 6 79% 52-55, 63-66
pyaurorax/search/metadata/__init__.py 14 0 100%
pyaurorax/search/metadata/_metadata.py 20 5 75% 29-31, 45, 54
pyaurorax/search/metadata_filters.py 61 39 36% 53-55, 59, 63-66, 69, 73-78, 86-89, 95, 126-127, 131, 135-137, 140, 144-152, 159-169, 175
pyaurorax/search/metadata_filters.py 61 25 59% 63-66, 69, 73-78, 86-89, 135-137, 145, 147, 159-169
pyaurorax/search/requests/__init__.py 28 2 93% 144, 207
pyaurorax/search/requests/_requests.py 100 25 75% 49-50, 54, 88, 115, 122-125, 129, 136-139, 144, 152, 154, 156, 158, 167, 169, 177-184
pyaurorax/search/sources/__init__.py 59 26 56% 183-240
Expand Down Expand Up @@ -94,7 +94,7 @@ pyaurorax/tools/mosaic/_prep_skymaps.py 119 112
pyaurorax/tools/spectra/__init__.py 10 1 90% 129
pyaurorax/tools/spectra/_plot.py 114 108 5% 42-233
--------------------------------------------------------------------------------------------
TOTAL 6084 2679 56%
TOTAL 6068 2584 57%
13 empty files skipped.
```
4 changes: 4 additions & 0 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,14 @@ Version 1.13.0
- issue when changing matplotlib theme back to 'default'
- CLI `sources get --format` bugfix for full record format
- improve handling of conjunction/ephemeris/data product searches that return no results when retrieving data
- improve handling of conjunction/ephemeris/data product searches which receive incorrect criteria blocks
- issue when ordering by 'owner' for `aurorax.search.sources.list()` and `aurorax.search.sources.search()` functions
- removed `aurorax-cli search sources get_stats` command (`aurorax-cli search sources get --include-stats` flag covers this functionality)
- removed `aurorax-cli search util ground_to_nbtrace` and `aurorax-cli search util ground_to_sbtrace` commands (use library functions instead)
- removed setter class for `api_headers` and `srs_obj` in `PyAurorax()` objects
- changed the `distance` parameter for `aurorax.search.conjunctions.create_advanced_distance_combos()` function to be optional, defaulting to None
- added the `aurorax.search.conjunctions.create_response_format_template()` function to assist with specifying the `response_format` parameter to a conjunction search
- changed `aurorax.search.conjunctions.swarmaurora.open_in_browser()` function to raise a ValueError instead of a AuroraXError when the 'browser' parameter was an unsupport choice
- bump PyUCalgarySRS dependency to latest


Expand Down
143 changes: 142 additions & 1 deletion pyaurorax/search/conjunctions/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ def get_request_url(self, request_id: str) -> str:

def create_advanced_distance_combos(
self,
distance: int,
distance: Optional[int] = None,
ground: int = 0,
space: int = 0,
events: int = 0,
Expand Down Expand Up @@ -256,3 +256,144 @@ def create_advanced_distance_combos(
The advanced distances combinations
"""
return func_create_advanced_distance_combos(distance, ground, space, events, custom)

def create_response_format_template(self, default: bool = False) -> Dict:
"""
Generate a template dictionary that can be used as the response_format parameter
in a conjunction search.
Args:
default (bool):
The default value to set for every parameter that can be returned, defaults
to False.
Returns:
A template dictionary for the response format
"""
return {
"conjunction_type": default,
"start": default,
"end": default,
"min_distance": default,
"max_distance": default,
"closest_epoch": default,
"farthest_epoch": default,
"data_sources": {
"identifier": default,
"program": default,
"platform": default,
"instrument_type": default,
"source_type": default,
"display_name": default,
"ephemeris_metadata_schema": {
"field_name": default,
"description": default,
"data_type": default,
"allowed_values": default,
"additional_description": default
},
"data_product_metadata_schema": {
"field_name": default,
"description": default,
"data_type": default,
"allowed_values": default,
"additional_description": default
},
"owner": default,
"maintainers": default,
"metadata": default
},
"events": {
"conjunction_type": default,
"e1_source": {
"identifier": default,
"program": default,
"platform": default,
"instrument_type": default,
"source_type": default,
"display_name": default,
"ephemeris_metadata_schema": {
"field_name": default,
"description": default,
"data_type": default,
"allowed_values": default,
"additional_description": default
},
"data_product_metadata_schema": {
"field_name": default,
"description": default,
"data_type": default,
"allowed_values": default,
"additional_description": default
},
"owner": default,
"maintainers": default,
"metadata": default
},
"e2_source": {
"identifier": default,
"program": default,
"platform": default,
"instrument_type": default,
"source_type": default,
"display_name": default,
"ephemeris_metadata_schema": {
"field_name": default,
"description": default,
"data_type": default,
"allowed_values": default,
"additional_description": default
},
"data_product_metadata_schema": {
"field_name": default,
"description": default,
"data_type": default,
"allowed_values": default,
"additional_description": default
},
"owner": default,
"maintainers": default,
"metadata": default
},
"start": default,
"end": default,
"min_distance": default,
"max_distance": default,
"generated_e1_ephemeris_query": {
"request_id": default,
"data_sources": {
"programs": default,
"platforms": default,
"instrument_types": default,
"ephemeris_metadata_filters": {
"logicalOperator": default,
"expressions": {
"key": default,
"operator": default,
"values": default
}
}
},
"start": default,
"end": default
},
"generated_e2_ephemeris_query": {
"request_id": default,
"data_sources": {
"programs": default,
"platforms": default,
"instrument_types": default,
"ephemeris_metadata_filters": {
"logicalOperator": default,
"expressions": {
"key": default,
"operator": default,
"values": default
}
}
},
"start": default,
"end": default
}
}
}
30 changes: 3 additions & 27 deletions pyaurorax/search/conjunctions/classes/criteria_block.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,18 +62,12 @@ def pretty_print(self):
"""
A special print output for this class.
"""
# set special strings
max_len = 80
metadata_filters_str = str(self.metadata_filters)
if (len(metadata_filters_str) > max_len):
metadata_filters_str = "%s...)" % (metadata_filters_str[0:max_len])

# print
print("GroundCriteriaBlock:")
print(" %-18s: %s" % ("programs", self.programs))
print(" %-18s: %s" % ("platforms", self.platforms))
print(" %-18s: %s" % ("instrument_types", self.instrument_types))
print(" %-18s: %s" % ("metadata_filters", metadata_filters_str))
print(" %-18s: %s" % ("metadata_filters", self.metadata_filters))


class SpaceCriteriaBlock:
Expand Down Expand Up @@ -126,25 +120,13 @@ def pretty_print(self):
"""
A special print output for this class.
"""
# set special strings
max_len = 80
metadata_filters_str = str(self.metadata_filters)
if (len(metadata_filters_str) > max_len):
metadata_filters_str = "%s...)" % (metadata_filters_str[0:max_len])

# print
print("SpaceCriteriaBlock:")
print(" %-18s: %s" % ("programs", self.programs))
print(" %-18s: %s" % ("platforms", self.platforms))
print(" %-18s: %s" % ("instrument_types", self.instrument_types))
print(" %-18s: %s" % ("hemisphere", self.hemisphere))
print(" %-18s: %s" % ("metadata_filters", metadata_filters_str))

def to_search_query_dict(self):
query_dict = self.__dict__
query_dict["ephemeris_metadata_filters"] = None if self.metadata_filters is None else self.metadata_filters.__dict__
del query_dict["metadata_filters"]
return query_dict
print(" %-18s: %s" % ("metadata_filters", self.metadata_filters))


class EventsCriteriaBlock:
Expand Down Expand Up @@ -181,17 +163,11 @@ def pretty_print(self):
"""
A special print output for this class.
"""
# set special strings
max_len = 80
metadata_filters_str = str(self.metadata_filters)
if (len(metadata_filters_str) > max_len):
metadata_filters_str = "%s...)" % (metadata_filters_str[0:max_len])

# print
print("EventsCriteriaBlock:")
print(" %-18s: %s" % ("platforms", self.platforms))
print(" %-18s: %s" % ("instrument_types", self.instrument_types))
print(" %-18s: %s" % ("metadata_filters", metadata_filters_str))
print(" %-18s: %s" % ("metadata_filters", self.metadata_filters))


class CustomLocationsCriteriaBlock:
Expand Down
42 changes: 28 additions & 14 deletions pyaurorax/search/conjunctions/classes/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
get_status as requests_get_status,
)
if TYPE_CHECKING:
from ....pyaurorax import PyAuroraX
from ....pyaurorax import PyAuroraX # pragma: nocover


class ConjunctionSearch:
Expand Down Expand Up @@ -99,8 +99,9 @@ class ConjunctionSearch:
status (Dict):
The status of the query
data (List[Conjunction]):
The conjunctions found
data (List[Conjunction, Dict]):
A list of the conjunctions found. The results will be dictionaries only if the
response_format parameter was supplied.
logs (List[Dict]):
All log messages outputted by the AuroraX API for this request
Expand All @@ -120,6 +121,27 @@ def __init__(self,
conjunction_types: Sequence[Union[str, Literal["nbtrace", "sbtrace", "geographic"]]] = ["nbtrace"],
response_format: Optional[Dict] = None):

# some verification
for item in ground:
if (isinstance(item, dict) is False and isinstance(item, GroundCriteriaBlock) is False):
raise ValueError(
"A %s object was found in the 'ground' parameter. Only GroundCriteriaBlock objects are allowed in the ground parameter." %
(item.__class__.__name__))
for item in space:
if (isinstance(item, dict) is False and isinstance(item, SpaceCriteriaBlock) is False):
raise ValueError(
"A %s object was found in the 'space' parameter. Only SpaceCriteriaBlock objects are allowed in the ground parameter." %
(item.__class__.__name__))
for item in events:
if (isinstance(item, dict) is False and isinstance(item, EventsCriteriaBlock) is False):
raise ValueError(
"A %s object was found in the 'events' parameter. Only EventsCriteriaBlock objects are allowed in the ground parameter." %
(item.__class__.__name__))
for item in custom_locations:
if (isinstance(item, dict) is False and isinstance(item, CustomLocationsCriteriaBlock) is False):
raise ValueError(("A %s object was found in the 'custom_locations' parameter. Only CustomLocationsCriteriaBlock objects " +
"are allowed in the ground parameter.") % (item.__class__.__name__))

# set variables using passed in args
self.__aurorax_obj = aurorax_obj
self.start = start
Expand Down Expand Up @@ -169,9 +191,7 @@ def pretty_print(self):

# set results string
if (self.executed is True):
if (len(self.data) == 0):
data_str = "[0 conjunction results]"
elif (len(self.data) == 1):
if (len(self.data) == 1):
data_str = "[1 conjunction result]"
else:
data_str = "[%d conjunction results]" % (len(self.data))
Expand All @@ -180,9 +200,7 @@ def pretty_print(self):

# set logs string
if (self.executed is True):
if (len(self.logs) == 0):
logs_str = "[0 log messages]"
elif (len(self.logs) == 1):
if (len(self.logs) == 1): # pragma: nocover
logs_str = "[1 log message]"
else:
logs_str = "[%d log messages]" % (len(self.logs))
Expand Down Expand Up @@ -372,10 +390,6 @@ def query(self) -> Dict:
}
return self.__query

@query.setter
def query(self, query: Dict) -> None:
self.__query = query

def execute(self) -> None:
"""
Initiate a conjunction search request
Expand Down Expand Up @@ -419,7 +433,7 @@ def update_status(self, status: Optional[Dict] = None) -> None:
status = requests_get_status(self.__aurorax_obj, self.request_url)

# check response
if (status is None):
if (status is None): # pragma: nocover
raise AuroraXAPIError("Could not retrieve status for this request")

# update request status by checking if data URI is set
Expand Down
4 changes: 2 additions & 2 deletions pyaurorax/search/conjunctions/swarmaurora/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,13 @@ def open_in_browser(self, search_obj: ConjunctionSearch, browser: Optional[str]
A conjunction search object, must be a completed search with
the 'request_id' value populated
browser (str)):
browser (str):
The browser type to load using. Default is your default browser. Some common other
options are "google-chrome", "firefox", or "safari". For all available options, refer
to https://docs.python.org/3/library/webbrowser.html#webbrowser.get
Raises:
pyaurorax.exceptions.AuroraXError: Unsupported browser specified
ValueError: Unsupported browser specified
"""
return func_open_in_browser(search_obj, browser)

Expand Down
5 changes: 2 additions & 3 deletions pyaurorax/search/conjunctions/swarmaurora/_swarmaurora.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
import webbrowser
import json
from ...api import AuroraXAPIRequest
from ....exceptions import AuroraXError


def get_url(search_obj):
Expand All @@ -32,8 +31,8 @@ def open_in_browser(search_obj, browser):
w.open_new_tab(url)
except Exception as e:
if ("could not locate runnable browser" in str(e)):
raise AuroraXError(("Error: selected browser '%s' not found, please try another. For the list of options, refer to "
"https://docs.python.org/3/library/webbrowser.html#webbrowser.get") % (browser)) from e
raise ValueError(("Error: selected browser '%s' not found, please try another. For the list of options, refer to "
"https://docs.python.org/3/library/webbrowser.html#webbrowser.get") % (browser)) from e


def create_custom_import_file(aurorax_obj, search_obj, filename, return_dict):
Expand Down
Loading

0 comments on commit 5a63ca4

Please sign in to comment.