Skip to content

Commit 2343312

Browse files
committed
refactor(event): separate name and ID arguments
No longer use ID as name to reduce ambiguity
1 parent 4aea168 commit 2343312

File tree

2 files changed

+40
-22
lines changed

2 files changed

+40
-22
lines changed

cryosparc/controllers/job.py

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@
5757
Input and output result groups may only contain, letters, numbers and underscores.
5858
"""
5959

60+
LogLevel = Literal["text", "warning", "error"]
61+
"""
62+
Severity level for job event logs.
63+
"""
64+
6065

6166
class JobController(Controller[Job]):
6267
"""
@@ -536,19 +541,27 @@ def load_output(self, name: str, slots: LoadableSlots = "all", version: Union[in
536541
"""
537542
return self.cs.api.jobs.load_output(self.project_uid, self.uid, name, slots=slots, version=version)
538543

539-
def log(self, text: str, *, level: Literal["text", "warning", "error"] = "text", name: Optional[str] = None):
544+
@overload
545+
def log(self, text: str, *, level: LogLevel = ...) -> str: ...
546+
@overload
547+
def log(self, text: str, *, level: LogLevel = ..., name: str) -> str: ...
548+
@overload
549+
def log(self, text: str, *, level: LogLevel = ..., id: str) -> str: ...
550+
def log(self, text: str, *, level: LogLevel = "text", name: Optional[str] = None, id: Optional[str] = None) -> str:
540551
"""
541-
Append to a job's event log. Update an existing log by providing a name.
552+
Append to a job's event log. Update an existing log by providing a name
553+
or ID.
542554
543555
Args:
544556
text (str): Text to log
545557
level (str, optional): Log level ("text", "warning" or "error").
546558
Defaults to "text".
547-
name (str, optional): Event name or ID. If called multiple times
548-
with the same name, updates that event instead of creating a new
549-
one. If name is not initially provided, can pass returned ID as
550-
name. Named events are reset when logging a checkpoint.
551-
Defaults to None.
559+
name (str, optional): Event name. If called multiple times with the
560+
same name, updates that event instead of creating a new one.
561+
Named events are reset when logging a checkpoint. Cannot be
562+
provided with id. Defaults to None.
563+
id (str, optional): Update a previously-created event log by its ID.
564+
Cannot be provided with name. Defaults to None.
552565
553566
Example:
554567
@@ -569,15 +582,20 @@ def log(self, text: str, *, level: Literal["text", "warning", "error"] = "text",
569582
>>> job.log("Finished processing", name=event_id)
570583
571584
Returns:
572-
str: Created log event name or ID
585+
str: Created log event ID
573586
"""
587+
existing_id = id
574588
if name and name in self._events:
575-
event_id = self._events[name]
576-
event = self.cs.api.jobs.update_event_log(self.project_uid, self.uid, event_id, text, type=level)
589+
existing_id = self._events[name]
590+
591+
if existing_id:
592+
event = self.cs.api.jobs.update_event_log(self.project_uid, self.uid, existing_id, text, type=level)
577593
else:
578594
event = self.cs.api.jobs.add_event_log(self.project_uid, self.uid, text, type=level)
579-
self._events[name or event.id] = event.id
580-
return name or event.id
595+
596+
if name:
597+
self._events[name] = event.id
598+
return event.id
581599

582600
def log_checkpoint(self, meta: dict = {}):
583601
"""

tests/controllers/test_job.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ def mock_checkpoint_event():
196196
return mock.MagicMock(id="checkpoint_456")
197197

198198

199-
def test_log_without_name(job: JobController, mock_log_event):
199+
def test_log(job: JobController, mock_log_event):
200200
assert isinstance(mock_add_endpoint := APIClient.jobs.add_event_log, mock.Mock)
201201
mock_add_endpoint.return_value = mock_log_event
202202

@@ -213,32 +213,32 @@ def test_log_with_name_create_and_update(job: JobController, mock_log_event):
213213
mock_update_endpoint.return_value = mock_log_event
214214

215215
# First call with name - should create
216-
result1 = job.log("First message", name="progress")
216+
event_id = job.log("First message", name="progress")
217217

218218
mock_add_endpoint.assert_called_once_with(job.project_uid, job.uid, "First message", type="text")
219-
assert result1 == "progress"
219+
assert event_id == "event_123"
220220

221221
# Second call with same name - should update
222-
result2 = job.log("Updated message", level="warning", name="progress")
222+
event_id = job.log("Updated message", level="warning", name="progress")
223223

224224
mock_update_endpoint.assert_called_once_with(
225225
job.project_uid, job.uid, mock_log_event.id, "Updated message", type="warning"
226226
)
227-
assert result2 == "progress"
227+
assert event_id == "event_123"
228228

229229

230-
def test_log_with_returned_event_id_as_name(job: JobController, mock_log_event):
230+
def test_log_with_returned_event_id(job: JobController, mock_log_event):
231231
assert isinstance(mock_add_endpoint := APIClient.jobs.add_event_log, mock.Mock)
232232
assert isinstance(mock_update_endpoint := APIClient.jobs.update_event_log, mock.Mock)
233233
mock_add_endpoint.return_value = mock_log_event
234234
mock_update_endpoint.return_value = mock_log_event
235235

236-
# First call without name - returns event ID
236+
# First call without ID - returns event ID
237237
event_id = job.log("Initial message")
238238
assert event_id == mock_log_event.id
239239

240-
# Second call using the returned event ID as name - should update
241-
result = job.log("Updated with event ID", name=event_id)
240+
# Second call using the returned event ID - should update
241+
result = job.log("Updated with event ID", id=event_id)
242242

243243
mock_update_endpoint.assert_called_once_with(
244244
job.project_uid, job.uid, mock_log_event.id, "Updated with event ID", type="text"
@@ -265,4 +265,4 @@ def test_log_after_checkpoint_creates_new(job: JobController, mock_log_event, mo
265265
mock_add_endpoint.reset_mock() # Reset to track the second call
266266
result = job.log("After checkpoint", name="status")
267267
mock_add_endpoint.assert_called_once_with(job.project_uid, job.uid, "After checkpoint", type="text")
268-
assert result == "status"
268+
assert result == "event_123"

0 commit comments

Comments
 (0)