Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions clients/circuit_breaker.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ def state(self) -> str:
return "half_open"
return "open"

def reset(self) -> None:
"""Clear failure count and close the circuit."""
self.failures = 0
self.opened_at = None

@property
def is_open(self) -> bool:
if self.opened_at is None:
Expand Down
7 changes: 7 additions & 0 deletions scenarios/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ def build_parser() -> argparse.ArgumentParser:
)

subparsers.add_parser("version", help="Print package version")

subparsers.add_parser("ids", help="Print known scenario ids")
return parser


Expand Down Expand Up @@ -150,6 +152,11 @@ def main(argv: list[str] | None = None) -> int:
print("0.1.0")
return 0

if args.command == "ids":
for scenario_id in known_scenario_ids():
print(scenario_id)
return 0

return 1


Expand Down
25 changes: 25 additions & 0 deletions tests/test_circuit_breaker.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,31 @@ def boom():
self.assertEqual(breaker.call(lambda: {"ok": True})["ok"], True)
self.assertEqual(breaker.state, "closed")

def test_reset_clears_failures_and_opened_at(self):
clock = FakeClock()
breaker = CircuitBreaker(
failure_threshold=1,
recovery_timeout=1.0,
watch=(TransientError,),
clock=clock,
)

def boom():
raise TransientError("x")

with self.assertRaises(TransientError):
breaker.call(boom)
self.assertEqual(breaker.failures, 1)
self.assertIsNotNone(breaker.opened_at)
self.assertEqual(breaker.state, "open")
self.assertTrue(breaker.is_open)

breaker.reset()
self.assertEqual(breaker.failures, 0)
self.assertIsNone(breaker.opened_at)
self.assertEqual(breaker.state, "closed")
self.assertFalse(breaker.is_open)




Expand Down
8 changes: 8 additions & 0 deletions tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,14 @@ def test_version_prints_package_version(self):
self.assertEqual(code, 0)
self.assertEqual(buffer.getvalue().strip(), "0.1.0")

def test_ids_prints_one_id_per_line(self):
buffer = io.StringIO()
with redirect_stdout(buffer):
code = main(["ids"])
self.assertEqual(code, 0)
lines = [line for line in buffer.getvalue().splitlines() if line.strip()]
self.assertEqual(lines, list(known_scenario_ids()))




Expand Down
Loading