fix: builtin_actions heuristics crash on a truthy non-string input (#1639)
This commit is contained in:
@@ -478,7 +478,7 @@ def _result_has_work(result: str | None) -> bool:
|
|||||||
'No new emails to summarize', 'Tagged 0 / Moved 0', etc. when nothing
|
'No new emails to summarize', 'Tagged 0 / Moved 0', etc. when nothing
|
||||||
was done. Used to decide whether to record the run or noop it.
|
was done. Used to decide whether to record the run or noop it.
|
||||||
"""
|
"""
|
||||||
if not result:
|
if not isinstance(result, str) or not result:
|
||||||
return False
|
return False
|
||||||
low = result.lower()
|
low = result.lower()
|
||||||
if "processed 0" in low or "no new" in low or "nothing to" in low:
|
if "processed 0" in low or "no new" in low or "nothing to" in low:
|
||||||
@@ -554,7 +554,7 @@ _HEURISTIC_CRITICAL = ["surgery", "court", "wedding day", "funeral", "delivery d
|
|||||||
|
|
||||||
def _classify_event_heuristic(summary: str) -> tuple:
|
def _classify_event_heuristic(summary: str) -> tuple:
|
||||||
"""Quick heuristic classification — returns (event_type, importance) or (None, None) if unclear."""
|
"""Quick heuristic classification — returns (event_type, importance) or (None, None) if unclear."""
|
||||||
s = (summary or "").lower()
|
s = (summary if isinstance(summary, str) else "").lower()
|
||||||
etype = None
|
etype = None
|
||||||
for t, kws in _HEURISTIC_TYPES.items():
|
for t, kws in _HEURISTIC_TYPES.items():
|
||||||
if any(k in s for k in kws):
|
if any(k in s for k in kws):
|
||||||
|
|||||||
21
tests/test_builtin_actions_nonstring.py
Normal file
21
tests/test_builtin_actions_nonstring.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
"""Regression: builtin_actions heuristics must tolerate non-string input.
|
||||||
|
|
||||||
|
_result_has_work did `result.lower()` after a falsy-only guard, and
|
||||||
|
_classify_event_heuristic did `(summary or "").lower()`; a truthy non-string
|
||||||
|
(e.g. a dict) raised AttributeError. They now coerce/guard non-strings.
|
||||||
|
"""
|
||||||
|
from src.builtin_actions import _result_has_work, _classify_event_heuristic
|
||||||
|
|
||||||
|
|
||||||
|
def test_result_has_work_non_string():
|
||||||
|
assert _result_has_work({"x": 1}) is False
|
||||||
|
assert _result_has_work(123) is False
|
||||||
|
|
||||||
|
|
||||||
|
def test_classify_event_heuristic_non_string():
|
||||||
|
out = _classify_event_heuristic(123)
|
||||||
|
assert isinstance(out, tuple)
|
||||||
|
|
||||||
|
|
||||||
|
def test_valid_inputs_unchanged():
|
||||||
|
assert _result_has_work("Processed 0 emails") is False
|
||||||
Reference in New Issue
Block a user