Skip to content

Commit ea8ec3d

Browse files
committed
fix TUI and post render output for failed renders
1 parent e838aaa commit ea8ec3d

6 files changed

Lines changed: 62 additions & 20 deletions

File tree

plain2code.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,12 +235,10 @@ def render(args, run_state: RunState, event_bus: EventBus): # noqa: C901
235235
)
236236

237237
render_error: list[Exception] = []
238-
run_state.render_succeeded = False
239238

240239
def run_render():
241240
try:
242241
module_renderer.render_module()
243-
run_state.set_render_succeeded(True)
244242
except RenderCancelledError:
245243
pass # TUI already closed, nothing to report
246244
except Exception as e:
@@ -252,7 +250,6 @@ def run_render():
252250
console.info(f"Render started. Render ID: {run_state.render_id}")
253251
try:
254252
module_renderer.render_module()
255-
run_state.set_render_succeeded(True)
256253
except RenderCancelledError:
257254
run_state.set_render_succeeded(False)
258255
pass

plain2code_events.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,12 @@ class RenderStateUpdated(BaseEvent):
5555

5656
@dataclass
5757
class RenderModuleCompleted(BaseEvent):
58-
pass
58+
module_name: str
59+
60+
61+
@dataclass
62+
class RenderModuleFailed(BaseEvent):
63+
module_name: str
5964

6065

6166
@dataclass

render_machine/code_renderer.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,13 @@
33

44
from transitions.extensions.diagrams import HierarchicalGraphMachine
55

6-
from plain2code_events import RenderModuleCompleted, RenderModuleStarted, RenderPaused, RenderStateUpdated
6+
from plain2code_events import (
7+
RenderModuleCompleted,
8+
RenderModuleFailed,
9+
RenderModuleStarted,
10+
RenderPaused,
11+
RenderStateUpdated,
12+
)
713
from render_machine.render_context import RenderContext
814
from render_machine.state_machine_config import StateMachineConfig, States
915

@@ -59,16 +65,21 @@ def run(self):
5965
previous_state = deepcopy(self.render_context.state)
6066
self.render_context.script_execution_history.should_update_script_outputs = False
6167

68+
self.render_context.previous_action_payload = previous_action_payload
69+
6270
outcome, previous_action_payload = self.action_map[self.render_context.state].execute(
6371
self.render_context, previous_action_payload
6472
)
65-
self.render_context.previous_action_payload = previous_action_payload
6673

67-
if self.render_context.state in [
68-
States.RENDER_FAILED.value,
69-
States.RENDER_COMPLETED.value,
70-
]:
71-
self.render_context.event_bus.publish(RenderModuleCompleted())
74+
if self.render_context.state == States.RENDER_FAILED.value:
75+
self.render_context.last_error_message = previous_action_payload
76+
self.render_context.event_bus.publish(RenderModuleFailed(module_name=self.render_context.module_name))
77+
break
78+
79+
if self.render_context.state == States.RENDER_COMPLETED.value:
80+
self.render_context.event_bus.publish(
81+
RenderModuleCompleted(module_name=self.render_context.module_name)
82+
)
7283
break
7384

7485
next_trigger = self.action_result_triggers_map[outcome]

tui/components.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,10 @@ def set_progress_status(self, progress_status: str) -> None:
134134
else:
135135
self._timer.resume()
136136

137+
def stop_progress_timer(self) -> None:
138+
if self._timer is not None:
139+
self._timer.stop()
140+
137141
def _add_second(self) -> None:
138142
self._seconds_elapsed += 1
139143
self._refresh_timer()

tui/plain2code_tui.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@
1414
RenderContextSnapshot,
1515
RenderFailed,
1616
RenderModuleCompleted,
17+
RenderModuleFailed,
1718
RenderModuleStarted,
1819
RenderPaused,
1920
RenderStateUpdated,
2021
)
2122
from render_machine.states import States
22-
from tui.widget_helpers import log_to_widget, transition_frid_progress
23+
from tui.widget_helpers import display_module_name, log_to_widget, stop_progress_timer, transition_frid_progress
2324

2425
from .components import (
2526
CustomFooter,
@@ -115,6 +116,7 @@ def on_mount(self) -> None:
115116
self.event_bus.subscribe(RenderFailed, self.on_render_failed)
116117
self.event_bus.subscribe(RenderModuleStarted, self.on_render_module_started)
117118
self.event_bus.subscribe(RenderModuleCompleted, self.on_render_module_completed)
119+
self.event_bus.subscribe(RenderModuleFailed, self.on_render_module_failed)
118120
self.event_bus.subscribe(LogMessageEmitted, self.on_log_message_emitted)
119121
self.event_bus.subscribe(RenderPaused, self.on_render_paused)
120122

@@ -175,14 +177,14 @@ def on_render_module_started(self, event: RenderModuleStarted):
175177
except Exception as e:
176178
log_to_widget(self, "WARNING", f"Error updating render module name: {type(e).__name__}: {e}")
177179

178-
def on_render_module_completed(self, _event: RenderModuleCompleted):
180+
def on_render_module_completed(self, event: RenderModuleCompleted):
179181
"""Update TUI based on the current state machine state."""
180-
try:
181-
frid_progress = self.query_one(f"#{TUIComponents.FRID_PROGRESS.value}", FRIDProgress)
182-
info_box = frid_progress.query_one(RenderingInfoBox)
183-
info_box.update_module(FRIDProgress.RENDERING_MODULE_TEXT)
184-
except Exception as e:
185-
log_to_widget(self, "WARNING", f"Error resetting render module name: {type(e).__name__}: {e}")
182+
display_module_name(self, event.module_name)
183+
184+
def on_render_module_failed(self, event: RenderModuleFailed):
185+
"""Update TUI based on the current state machine state."""
186+
display_module_name(self, event.module_name)
187+
stop_progress_timer(self)
186188

187189
def on_log_message_emitted(self, event: LogMessageEmitted):
188190
try:

tui/widget_helpers.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from textual.css.query import NoMatches
66
from textual.widgets import Static
77

8-
from .components import FRIDProgress, ProgressItem, StructuredLogView, TUIComponents
8+
from .components import FRIDProgress, ProgressItem, RenderingInfoBox, StructuredLogView, SubstateLine, TUIComponents
99
from .models import Substate
1010

1111

@@ -167,3 +167,26 @@ def clear_progress_item_substates(tui, widget_id: str) -> None:
167167
log_to_widget(tui, "WARNING", f"ProgressItem {widget_id} not found: {e}")
168168
except Exception as e:
169169
log_to_widget(tui, "ERROR", f"Error clearing substates for {widget_id}: {e}")
170+
171+
172+
def display_module_name(tui, module_name: str):
173+
"""Helper function to display the module name in the FRIDProgress widget.
174+
175+
Args:
176+
tui: The Plain2CodeTUI instance
177+
module_name: The module name to display
178+
"""
179+
frid_progress = get_frid_progress(tui)
180+
info_box = frid_progress.query_one(RenderingInfoBox)
181+
info_box.update_module(f"{FRIDProgress.RENDERING_MODULE_TEXT}{module_name}")
182+
183+
184+
def stop_progress_timer(tui):
185+
"""Helper function to stop the progress timer in the FRIDProgress widget.
186+
187+
Args:
188+
tui: The Plain2CodeTUI instance
189+
"""
190+
frid_progress = get_frid_progress(tui)
191+
substate_line = frid_progress.query_one(SubstateLine)
192+
substate_line.stop_progress_timer()

0 commit comments

Comments
 (0)