diff --git a/app.py b/app.py index 29ef1b7..231d6a0 100644 --- a/app.py +++ b/app.py @@ -492,7 +492,7 @@ def percent_left_from_used(value: Any) -> Optional[int]: """Convert a used percentage into a clamped remaining percentage.""" try: used_percent = int(value) - except (TypeError, ValueError): + except (TypeError, ValueError, OverflowError): return None return max(0, min(100, 100 - used_percent)) @@ -676,7 +676,11 @@ def token_count_value(value: Any) -> int: """Return a non-negative token count from a session usage value.""" if not isinstance(value, (int, float)): return 0 - return max(0, int(value)) + try: + count = int(value) + except (ValueError, OverflowError): + return 0 + return max(0, count) def parse_codex_timestamp(value: Any) -> Optional[datetime]: diff --git a/tests/test_vibe_status.py b/tests/test_vibe_status.py index 18ae319..4142c45 100644 --- a/tests/test_vibe_status.py +++ b/tests/test_vibe_status.py @@ -818,12 +818,16 @@ def test_percent_left_from_used_clamps_and_rejects_invalid_values(self): self.assertEqual(app.percent_left_from_used(-10), 100) self.assertEqual(app.percent_left_from_used(999), 0) self.assertIsNone(app.percent_left_from_used("bad-value")) + self.assertIsNone(app.percent_left_from_used(float("inf"))) + self.assertIsNone(app.percent_left_from_used(float("nan"))) def test_token_count_value_clamps_negative_and_rejects_non_numeric_values(self): self.assertEqual(app.token_count_value(42), 42) self.assertEqual(app.token_count_value(3.8), 3) self.assertEqual(app.token_count_value(-5), 0) self.assertEqual(app.token_count_value("5"), 0) + self.assertEqual(app.token_count_value(float("inf")), 0) + self.assertEqual(app.token_count_value(float("nan")), 0) def test_dict_or_empty_rejects_non_object_values(self): payload = {"ok": True}