Skip to content
This repository was archived by the owner on Nov 19, 2024. It is now read-only.

Commit 09a771b

Browse files
Make status check possible outside infinite loop (#101)
* make status check possible outside infinite loop * results_ready property and tests --------- Co-authored-by: malmans2 <[email protected]>
1 parent ba1d384 commit 09a771b

File tree

3 files changed

+31
-16
lines changed

3 files changed

+31
-16
lines changed

cads_api_client/processing.py

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,7 @@ class Remote:
387387

388388
def __attrs_post_init__(self) -> None:
389389
self.log_start_time = None
390+
self.last_status = None
390391
self.info(f"Request ID is {self.request_uid}")
391392

392393
@property
@@ -466,7 +467,12 @@ def status(self) -> str:
466467
"""
467468
reply = self.json
468469
self._log_metadata(reply.get("metadata", {}))
469-
return str(reply["status"])
470+
471+
status = reply["status"]
472+
if self.last_status != status:
473+
self.info(f"status has been updated to {status}")
474+
self.last_status = status
475+
return str(status)
470476

471477
@property
472478
def creation_datetime(self) -> datetime.datetime:
@@ -502,23 +508,30 @@ def end_datetime(self) -> datetime.datetime | None:
502508

503509
def _wait_on_results(self) -> None:
504510
sleep = 1.0
505-
status = None
506-
while True:
507-
if status != (status := self.status):
508-
self.info(f"status has been updated to {status}")
509-
if status == "successful":
510-
break
511-
elif status == "failed":
512-
results = self.make_results(wait=False)
513-
raise ProcessingFailedError(error_json_to_message(results.json))
514-
elif status in ("accepted", "running"):
515-
sleep = min(sleep * 1.5, self.sleep_max)
516-
elif status in ("dismissed", "deleted"):
517-
raise ProcessingFailedError(f"API state {status!r}")
518-
else:
519-
raise ProcessingFailedError(f"Unknown API state {status!r}")
511+
while not self.results_ready:
520512
self.debug(f"results not ready, waiting for {sleep} seconds")
521513
time.sleep(sleep)
514+
sleep = min(sleep * 1.5, self.sleep_max)
515+
516+
@property
517+
def results_ready(self) -> bool:
518+
"""Check if results are ready.
519+
520+
Returns
521+
-------
522+
bool
523+
"""
524+
status = self.status
525+
if status == "successful":
526+
return True
527+
if status in ("accepted", "running"):
528+
return False
529+
if status == "failed":
530+
results = self.make_results(wait=False)
531+
raise ProcessingFailedError(error_json_to_message(results.json))
532+
if status in ("dismissed", "deleted"):
533+
raise ProcessingFailedError(f"API state {status!r}")
534+
raise ProcessingFailedError(f"Unknown API state {status!r}")
522535

523536
def make_results(self, wait: bool = True) -> Results:
524537
if wait:

tests/integration_test_30_remote.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ def test_remote_datetimes(api_anon_client: ApiClient) -> None:
9595
elapsed=1,
9696
_timestamp=datetime.datetime.now().isoformat(),
9797
)
98+
assert remote.results_ready is False
9899
assert isinstance(remote.creation_datetime, datetime.datetime)
99100
assert remote.end_datetime is None
100101

tests/test_10_processing.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,7 @@ def test_submit(cat: catalogue.Catalogue) -> None:
379379
remote = collection.submit(variable="temperature", year="2022")
380380
assert remote.url == JOB_SUCCESSFUL_URL
381381
assert remote.status == "successful"
382+
assert remote.results_ready is True
382383

383384
assert remote.creation_datetime.isoformat() == "2022-09-02T17:30:48.201213"
384385
assert remote.start_datetime is not None

0 commit comments

Comments
 (0)