Skip to content

Commit b36564e

Browse files
committed
refactor: replace datetime parsing with utility function for consistency across event handlers
1 parent cbadc1a commit b36564e

5 files changed

Lines changed: 12 additions & 52 deletions

File tree

src/firebase_functions/eventarc_fn.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
"""Cloud functions to handle Eventarc events."""
1515

1616
# pylint: disable=protected-access
17-
import datetime as _dt
1817
import functools as _functools
1918
import typing as _typing
2019

@@ -64,10 +63,7 @@ def on_custom_event_published_wrapped(raw: _ce.CloudEvent):
6463
source=event_dict["source"],
6564
specversion=event_dict["specversion"],
6665
subject=event_dict["subject"] if "subject" in event_dict else None,
67-
time=_dt.datetime.strptime(
68-
event_dict["time"],
69-
"%Y-%m-%dT%H:%M:%S.%f%z",
70-
),
66+
time=_util.timestamp_conversion(event_dict["time"]),
7167
type=event_dict["type"],
7268
)
7369
_with_init(func)(event)

src/firebase_functions/pubsub_fn.py

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
# pylint: disable=protected-access
1919
import base64 as _base64
2020
import dataclasses as _dataclasses
21-
import datetime as _dt
2221
import functools as _functools
2322
import json as _json
2423
import typing as _typing
@@ -105,25 +104,9 @@ def _message_handler(
105104
data = event_dict["data"]
106105
message_dict = data["message"]
107106

108-
# if no microseconds are present, we should set them to 0 to prevent parsing from failing
109-
if "." not in event_dict["time"]:
110-
event_dict["time"] = event_dict["time"].replace("Z", ".000000Z")
111-
if "." not in message_dict["publish_time"]:
112-
message_dict["publish_time"] = message_dict["publish_time"].replace("Z", ".000000Z")
113-
114-
time = _dt.datetime.strptime(
115-
event_dict["time"],
116-
"%Y-%m-%dT%H:%M:%S.%f%z",
117-
)
118-
119-
publish_time = _dt.datetime.strptime(
120-
message_dict["publish_time"],
121-
"%Y-%m-%dT%H:%M:%S.%f%z",
122-
)
123-
124107
# Convert the UTC string into a datetime object
125-
event_dict["time"] = time
126-
message_dict["publish_time"] = publish_time
108+
event_dict["time"] = _util.timestamp_conversion(event_dict["time"])
109+
message_dict["publish_time"] = _util.timestamp_conversion(message_dict["publish_time"])
127110

128111
# Pop unnecessary keys from the message data
129112
# (we get these keys from the snake case alternatives that are provided)

src/firebase_functions/remote_config_fn.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ def _config_handler(func: _C1, raw: _ce.CloudEvent) -> None:
164164

165165
config_data = ConfigUpdateData(
166166
version_number=event_data["versionNumber"],
167-
update_time=_dt.datetime.strptime(event_data["updateTime"], "%Y-%m-%dT%H:%M:%S.%f%z"),
167+
update_time=_util.timestamp_conversion(event_data["updateTime"]),
168168
update_user=ConfigUser(
169169
name=event_data["updateUser"]["name"],
170170
email=event_data["updateUser"]["email"],
@@ -182,10 +182,7 @@ def _config_handler(func: _C1, raw: _ce.CloudEvent) -> None:
182182
source=event_dict["source"],
183183
specversion=event_dict["specversion"],
184184
subject=event_dict["subject"] if "subject" in event_dict else None,
185-
time=_dt.datetime.strptime(
186-
event_dict["time"],
187-
"%Y-%m-%dT%H:%M:%S.%f%z",
188-
),
185+
time=_util.timestamp_conversion(event_dict["time"]),
189186
type=event_dict["type"],
190187
)
191188

src/firebase_functions/scheduler_fn.py

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -105,24 +105,11 @@ def on_schedule_wrapped(request: _Request) -> _Response:
105105
schedule_time = _dt.datetime.now(_timezone.utc)
106106
else:
107107
try:
108-
# Try to parse with the stdlib which supports fractional
109-
# seconds and offsets in Python 3.11+ via fromisoformat.
110-
# Normalize RFC3339 'Z' to '+00:00' for fromisoformat.
111-
iso_str = schedule_time_str
112-
if iso_str.endswith("Z"):
113-
iso_str = iso_str[:-1] + "+00:00"
114-
schedule_time = _dt.datetime.fromisoformat(iso_str)
115-
except ValueError:
116-
# Fallback to strict parsing without fractional seconds
117-
try:
118-
schedule_time = _dt.datetime.strptime(
119-
schedule_time_str,
120-
"%Y-%m-%dT%H:%M:%S%z",
121-
)
122-
except ValueError as e:
123-
# If all parsing fails, log and use current UTC time
124-
_logging.exception(e)
125-
schedule_time = _dt.datetime.now(_timezone.utc)
108+
schedule_time = _util.timestamp_conversion(schedule_time_str)
109+
except ValueError as e:
110+
# If parsing fails, log and use current UTC time.
111+
_logging.exception(e)
112+
schedule_time = _dt.datetime.now(_timezone.utc)
126113
event = ScheduledEvent(
127114
job_name=request.headers.get("X-CloudScheduler-JobName"),
128115
schedule_time=schedule_time,

src/firebase_functions/test_lab_fn.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ def _event_handler(func: _C1, raw: _ce.CloudEvent) -> None:
214214
event_dict = {**event_data, **event_attributes}
215215

216216
test_lab_data = TestMatrixCompletedData(
217-
create_time=_dt.datetime.strptime(event_data["createTime"], "%Y-%m-%dT%H:%M:%S.%f%z"),
217+
create_time=_util.timestamp_conversion(event_data["createTime"]),
218218
state=TestState(event_data["state"]),
219219
invalid_matrix_details=event_data.get("invalidMatrixDetails"),
220220
outcome_summary=OutcomeSummary(event_data["outcomeSummary"]),
@@ -237,10 +237,7 @@ def _event_handler(func: _C1, raw: _ce.CloudEvent) -> None:
237237
source=event_dict["source"],
238238
specversion=event_dict["specversion"],
239239
subject=event_dict["subject"] if "subject" in event_dict else None,
240-
time=_dt.datetime.strptime(
241-
event_dict["time"],
242-
"%Y-%m-%dT%H:%M:%S.%f%z",
243-
),
240+
time=_util.timestamp_conversion(event_dict["time"]),
244241
type=event_dict["type"],
245242
)
246243

0 commit comments

Comments
 (0)