Main code renderer class that orchestrates the code generation workflow using a hierarchical state machine.
| 17 | |
| 18 | |
| 19 | class CodeRenderer: |
| 20 | """Main code renderer class that orchestrates the code generation workflow using a hierarchical state machine.""" |
| 21 | |
| 22 | def __init__(self, render_context: RenderContext): |
| 23 | self.render_context = render_context |
| 24 | self.state_machine_config = StateMachineConfig() |
| 25 | |
| 26 | # Initialize the state machine |
| 27 | states = self.state_machine_config.get_states(self.render_context) |
| 28 | transitions = self.state_machine_config.get_transitions(self.render_context) |
| 29 | |
| 30 | self.machine = HierarchicalGraphMachine( |
| 31 | model=self.render_context, |
| 32 | states=states, |
| 33 | transitions=transitions, |
| 34 | initial=States.RENDER_INITIALISED.value, |
| 35 | ) |
| 36 | self.render_context.set_machine(self.machine) |
| 37 | |
| 38 | # Get action mappings |
| 39 | self.action_map = self.state_machine_config.get_action_map() |
| 40 | self.action_result_triggers_map = self.state_machine_config.get_action_result_triggers_map() |
| 41 | |
| 42 | def run(self): |
| 43 | """Execute the main rendering workflow.""" |
| 44 | self.render_context.event_bus.publish(RenderModuleStarted(module_name=self.render_context.module_name)) |
| 45 | self.render_context.run_state.current_module = self.render_context.module_name |
| 46 | previous_action_payload = None |
| 47 | previous_state = None |
| 48 | |
| 49 | while True: |
| 50 | if self.render_context.enter_pause_event.is_set(): |
| 51 | self.render_context.event_bus.publish(RenderPaused()) |
| 52 | |
| 53 | # don't take sleep time into account for render time |
| 54 | self.render_context.run_state.add_to_render_time() |
| 55 | while self.render_context.enter_pause_event.is_set(): |
| 56 | time.sleep(PAUSE_POLL_INTERVAL_SECONDS) |
| 57 | self.render_context.run_state.set_last_render_start_timestamp() |
| 58 | |
| 59 | self.render_context.event_bus.publish( |
| 60 | RenderStateUpdated( |
| 61 | state=self.render_context.state, |
| 62 | previous_state=previous_state, |
| 63 | snapshot=self.render_context.create_snapshot(), |
| 64 | ) |
| 65 | ) |
| 66 | previous_state = deepcopy(self.render_context.state) |
| 67 | self.render_context.run_state.current_render_state = self.render_context.state |
| 68 | self.render_context.script_execution_history.should_update_script_outputs = False |
| 69 | |
| 70 | self.render_context.previous_action_payload = previous_action_payload |
| 71 | |
| 72 | outcome, previous_action_payload = self.action_map[self.render_context.state].execute( |
| 73 | self.render_context, previous_action_payload |
| 74 | ) |
| 75 | |
| 76 | if self.render_context.state == States.RENDER_FAILED.value: |