Skip to content

Commit b2bcbc0

Browse files
author
Nejc Stebe
committed
add a threading event for pausing the state machine
1 parent a6a715c commit b2bcbc0

6 files changed

Lines changed: 24 additions & 8 deletions

File tree

module_renderer.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ def __init__(
3030
run_state: RunState,
3131
event_bus: EventBus,
3232
stop_event: threading.Event | None = None,
33+
pause_event: threading.Event | None = None,
3334
):
3435
self.codeplainAPI = codeplainAPI
3536
self.filename = filename
@@ -39,6 +40,7 @@ def __init__(
3940
self.run_state = run_state
4041
self.event_bus = event_bus
4142
self.stop_event = stop_event
43+
self.pause_event = pause_event
4244

4345
def _ensure_module_folders_exist(self, module_name: str, first_render_frid: str) -> tuple[str, str]:
4446
"""
@@ -181,6 +183,7 @@ def _build_render_context_for_module(
181183
event_bus=self.event_bus,
182184
test_script_timeout=self.args.test_script_timeout,
183185
stop_event=self.stop_event,
186+
pause_event=self.pause_event,
184187
)
185188

186189
def _render_module(

plain2code.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ def render(args, run_state: RunState, event_bus: EventBus): # noqa: C901
203203
_check_connection(codeplainAPI)
204204

205205
stop_event = threading.Event()
206+
pause_event = threading.Event()
206207
signal.signal(signal.SIGTERM, lambda _signum, _frame: stop_event.set())
207208

208209
module_renderer = ModuleRenderer(
@@ -214,6 +215,7 @@ def render(args, run_state: RunState, event_bus: EventBus): # noqa: C901
214215
run_state,
215216
event_bus,
216217
stop_event=stop_event,
218+
pause_event=pause_event,
217219
)
218220

219221
render_error: list[Exception] = []
@@ -245,6 +247,7 @@ def run_render():
245247
conformance_tests_script=args.conformance_tests_script,
246248
prepare_environment_script=args.prepare_environment_script,
247249
state_machine_version=system_config.client_version,
250+
pause_event=pause_event,
248251
css_path="styles.css",
249252
)
250253
app.run()

plain2code_events.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,3 @@ class RenderModuleStarted(BaseEvent):
6363
module_name: str
6464

6565

66-
@dataclass
67-
class PauseRequested(BaseEvent):
68-
"""Event emitted when the user requests to pause rendering."""
69-
70-
pass

render_machine/code_renderer.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import time
12
from copy import deepcopy
23

34
from transitions.extensions.diagrams import HierarchicalGraphMachine
@@ -6,6 +7,8 @@
67
from render_machine.render_context import RenderContext
78
from render_machine.state_machine_config import StateMachineConfig, States
89

10+
PAUSE_POLL_INTERVAL_SECONDS = 1
11+
912

1013
class CodeRenderer:
1114
"""Main code renderer class that orchestrates the code generation workflow using a hierarchical state machine."""
@@ -35,7 +38,12 @@ def run(self):
3538
self.render_context.event_bus.publish(RenderModuleStarted(module_name=self.render_context.module_name))
3639
previous_action_payload = None
3740
previous_state = None
41+
3842
while True:
43+
if self.render_context.pause_event and self.render_context.pause_event.is_set():
44+
while self.render_context.pause_event.is_set():
45+
time.sleep(PAUSE_POLL_INTERVAL_SECONDS)
46+
3947
self.render_context.event_bus.publish(
4048
RenderStateUpdated(
4149
state=self.render_context.state,

render_machine/render_context.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ def __init__(
5454
event_bus: EventBus,
5555
test_script_timeout: Optional[int] = None,
5656
stop_event: Optional[threading.Event] = None,
57+
pause_event: Optional[threading.Event] = None,
5758
):
5859
self.codeplain_api: CodeplainAPI = codeplain_api
5960
self.memory_manager = memory_manager
@@ -77,6 +78,7 @@ def __init__(
7778
self.run_state = run_state
7879
self.event_bus = event_bus
7980
self.stop_event = stop_event
81+
self.pause_event = pause_event
8082
self.script_execution_history = ScriptExecutionHistory()
8183
self.starting_frid = None
8284
self.test_script_timeout = test_script_timeout

tui/plain2code_tui.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from event_bus import EventBus
1111
from plain2code_events import (
1212
LogMessageEmitted,
13-
PauseRequested,
1413
RenderCompleted,
1514
RenderContextSnapshot,
1615
RenderFailed,
@@ -66,6 +65,7 @@ def __init__(
6665
conformance_tests_script: str,
6766
prepare_environment_script: str,
6867
state_machine_version: str,
68+
pause_event: threading.Event | None = None,
6969
**kwargs,
7070
):
7171
super().__init__(**kwargs)
@@ -77,6 +77,7 @@ def __init__(
7777
self.conformance_tests_script: Optional[str] = conformance_tests_script
7878
self.prepare_environment_script: Optional[str] = prepare_environment_script
7979
self.state_machine_version = state_machine_version
80+
self.pause_event = pause_event
8081
self._render_finished = False
8182

8283
# Initialize state handlers
@@ -283,9 +284,13 @@ async def action_copy_selection(self) -> None:
283284

284285
def action_pause(self) -> None:
285286
"""Handle ctrl+shift+p: request the render machine to pause."""
286-
if not self._render_finished:
287+
if not self._render_finished and self.pause_event is not None:
287288
set_frid_progress_to_paused(self)
288-
self.event_bus.publish(PauseRequested())
289+
290+
if self.pause_event.is_set():
291+
self.pause_event.clear()
292+
else:
293+
self.pause_event.set()
289294

290295
def action_enter_exit(self) -> None:
291296
"""Handle enter: exit the TUI only after rendering has finished."""

0 commit comments

Comments
 (0)