Skip to content
This repository was archived by the owner on May 12, 2025. It is now read-only.

Commit a9e413c

Browse files
authored
COPDS-2567: add timezone when missing (#22)
1 parent 92207f3 commit a9e413c

File tree

4 files changed

+31
-24
lines changed

4 files changed

+31
-24
lines changed

datapi/catalogue.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323

2424
import datapi
2525

26-
from . import config
26+
from . import config, utils
2727
from .processing import ApiResponse, ApiResponsePaginated, RequestKwargs
2828

2929

@@ -46,28 +46,24 @@ def begin_datetime(self) -> datetime.datetime | None:
4646
"""Begin datetime of the collection."""
4747
if (value := self._json_dict["extent"]["temporal"]["interval"][0][0]) is None:
4848
return value
49-
return datetime.datetime.fromisoformat(value.replace("Z", "+00:00"))
49+
return utils.string_to_datetime(value)
5050

5151
@property
5252
def end_datetime(self) -> datetime.datetime | None:
5353
"""End datetime of the collection."""
5454
if (value := self._json_dict["extent"]["temporal"]["interval"][0][1]) is None:
5555
return value
56-
return datetime.datetime.fromisoformat(value.replace("Z", "+00:00"))
56+
return utils.string_to_datetime(value)
5757

5858
@property
5959
def published_at(self) -> datetime.datetime:
6060
"""When the collection was first published."""
61-
return datetime.datetime.fromisoformat(
62-
self._json_dict["published"].replace("Z", "+00:00")
63-
)
61+
return utils.string_to_datetime(self._json_dict["published"])
6462

6563
@property
6664
def updated_at(self) -> datetime.datetime:
6765
"""When the collection was last updated."""
68-
return datetime.datetime.fromisoformat(
69-
self._json_dict["updated"].replace("Z", "+00:00")
70-
)
66+
return utils.string_to_datetime(self._json_dict["updated"])
7167

7268
@property
7369
def title(self) -> str:

datapi/processing.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535
import datapi
3636

37-
from . import config
37+
from . import config, utils
3838

3939
T_ApiResponse = TypeVar("T_ApiResponse", bound="ApiResponse")
4040

@@ -444,12 +444,12 @@ def status(self) -> str:
444444
@property
445445
def updated_at(self) -> datetime.datetime:
446446
"""When the job was last updated."""
447-
return datetime.datetime.fromisoformat(self.json["updated"])
447+
return utils.string_to_datetime(self.json["updated"])
448448

449449
@property
450450
def created_at(self) -> datetime.datetime:
451451
"""When the job was created."""
452-
return datetime.datetime.fromisoformat(self.json["created"])
452+
return utils.string_to_datetime(self.json["created"])
453453

454454
@property
455455
def creation_datetime(self) -> datetime.datetime:
@@ -465,7 +465,7 @@ def creation_datetime(self) -> datetime.datetime:
465465
def started_at(self) -> datetime.datetime | None:
466466
"""When the job started. If None, the job has not started."""
467467
value = self.json.get("started")
468-
return value if value is None else datetime.datetime.fromisoformat(value)
468+
return value if value is None else utils.string_to_datetime(value)
469469

470470
@property
471471
def start_datetime(self) -> datetime.datetime | None:
@@ -481,7 +481,7 @@ def start_datetime(self) -> datetime.datetime | None:
481481
def finished_at(self) -> datetime.datetime | None:
482482
"""When the job finished. If None, the job has not finished."""
483483
value = self.json.get("finished")
484-
return value if value is None else datetime.datetime.fromisoformat(value)
484+
return value if value is None else utils.string_to_datetime(value)
485485

486486
@property
487487
def end_datetime(self) -> datetime.datetime | None:

datapi/utils.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import datetime
2+
3+
4+
def string_to_datetime(string: str) -> datetime.datetime:
5+
string = string.replace("Z", "+00:00") # Support python<3.11
6+
date_time = datetime.datetime.fromisoformat(string)
7+
if date_time.tzinfo is None:
8+
date_time = date_time.replace(tzinfo=datetime.timezone.utc)
9+
return date_time

tests/test_20_processing.py

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -381,12 +381,12 @@ def test_submit(cat: catalogue.Catalogue) -> None:
381381
assert remote.status == "successful"
382382
assert remote.results_ready is True
383383

384-
assert remote.created_at.isoformat() == "2022-09-02T17:30:48.201213"
385-
assert remote.updated_at.isoformat() == "2022-09-02T17:32:54.308116"
384+
assert remote.created_at.isoformat() == "2022-09-02T17:30:48.201213+00:00"
385+
assert remote.updated_at.isoformat() == "2022-09-02T17:32:54.308116+00:00"
386386
assert remote.started_at is not None
387-
assert remote.started_at.isoformat() == "2022-09-02T17:32:43.890617"
387+
assert remote.started_at.isoformat() == "2022-09-02T17:32:43.890617+00:00"
388388
assert remote.finished_at is not None
389-
assert remote.finished_at.isoformat() == "2022-09-02T17:32:54.308120"
389+
assert remote.finished_at.isoformat() == "2022-09-02T17:32:54.308120+00:00"
390390

391391

392392
@responses.activate
@@ -403,15 +403,17 @@ def test_depracations(cat: catalogue.Catalogue) -> None:
403403
with pytest.warns(
404404
DeprecationWarning, match="`creation_datetime` has been deprecated"
405405
):
406-
assert remote.creation_datetime.isoformat() == "2022-09-02T17:30:48.201213"
406+
assert (
407+
remote.creation_datetime.isoformat() == "2022-09-02T17:30:48.201213+00:00"
408+
)
407409

408410
with pytest.warns(DeprecationWarning, match="`start_datetime` has been deprecated"):
409411
assert remote.start_datetime is not None
410-
assert remote.start_datetime.isoformat() == "2022-09-02T17:32:43.890617"
412+
assert remote.start_datetime.isoformat() == "2022-09-02T17:32:43.890617+00:00"
411413

412414
with pytest.warns(DeprecationWarning, match="`end_datetime` has been deprecated"):
413415
assert remote.end_datetime is not None
414-
assert remote.end_datetime.isoformat() == "2022-09-02T17:32:54.308120"
416+
assert remote.end_datetime.isoformat() == "2022-09-02T17:32:54.308120+00:00"
415417

416418

417419
@responses.activate
@@ -449,11 +451,11 @@ def test_wait_on_result_failed(cat: catalogue.Catalogue) -> None:
449451
):
450452
remote._wait_on_results()
451453

452-
assert remote.created_at.isoformat() == "2022-09-02T17:30:48.201213"
454+
assert remote.created_at.isoformat() == "2022-09-02T17:30:48.201213+00:00"
453455
assert remote.started_at is not None
454-
assert remote.started_at.isoformat() == "2022-09-02T17:32:43.890617"
456+
assert remote.started_at.isoformat() == "2022-09-02T17:32:43.890617+00:00"
455457
assert remote.finished_at is not None
456-
assert remote.finished_at.isoformat() == "2022-09-02T17:32:54.308120"
458+
assert remote.finished_at.isoformat() == "2022-09-02T17:32:54.308120+00:00"
457459

458460

459461
@responses.activate

0 commit comments

Comments
 (0)