@@ -158,16 +158,6 @@ def _check_connection(codeplainAPI: codeplain_api.CodeplainAPI):
158158 )
159159
160160
161- def load_plain_module (args , template_dirs ) -> plain_modules .PlainModule :
162- """Parse the plain file (and its required modules) into a PlainModule."""
163- return plain_modules .PlainModule (
164- args .filename ,
165- args .build_folder ,
166- args .conformance_tests_folder ,
167- template_dirs ,
168- )
169-
170-
171161def warn_if_acceptance_tests_without_conformance_script (plain_module , args ) -> None :
172162 """Warn when any loaded module (including required modules) defines acceptance tests
173163 but no conformance tests script is configured.
@@ -194,15 +184,17 @@ def warn_if_acceptance_tests_without_conformance_script(plain_module, args) -> N
194184 )
195185
196186
197- def render (args , run_state : RunState , event_bus : EventBus , default_log_level : str = "INFO" ): # noqa: C901
198- template_dirs = file_utils .get_template_directories (args .filename , args .template_dir , DEFAULT_TEMPLATE_DIRS )
199-
187+ def render ( # noqa: C901
188+ plain_module : plain_modules .PlainModule ,
189+ args ,
190+ run_state : RunState ,
191+ event_bus : EventBus ,
192+ default_log_level : str = "INFO" ,
193+ ):
200194 # Compute render range from either --render-range or --render-from
201195 render_range = None
202196 if args .render_range or args .render_from :
203- # Parse the plain file to get the plain_source for FRID extraction
204- _ , plain_source , _ = plain_file .plain_file_parser (args .filename , template_dirs )
205- render_range = plain_spec .compute_render_range (args , plain_source )
197+ render_range = plain_spec .compute_render_range (args , plain_module .plain_source )
206198
207199 codeplainAPI = codeplain_api .CodeplainAPI (args .api_key , console )
208200 assert args .api is not None and args .api != "" , "API URL is required"
@@ -214,8 +206,6 @@ def render(args, run_state: RunState, event_bus: EventBus, default_log_level: st
214206 enter_pause_event = threading .Event ()
215207 signal .signal (signal .SIGTERM , lambda _signum , _frame : stop_event .set ())
216208
217- plain_module = load_plain_module (args , template_dirs )
218-
219209 warn_if_acceptance_tests_without_conformance_script (plain_module , args )
220210
221211 render_choice = None
@@ -341,29 +331,38 @@ def main(): # noqa: C901
341331 console .error (f"Error fetching status: { str (e )} " )
342332 return
343333
344- # Handle early-exit flags before heavy initialization
345- if args .dry_run or args .full_plain :
346- template_dirs = file_utils .get_template_directories (args .filename , args .template_dir , DEFAULT_TEMPLATE_DIRS )
334+ template_dirs = file_utils .get_template_directories (args .filename , args .template_dir , DEFAULT_TEMPLATE_DIRS )
347335
336+ # Handle full plain early-exit (raw text dump; does not require a parsed module).
337+ if args .full_plain :
348338 try :
349- if args .full_plain :
350- module_name = Path (args .filename ).stem
351- plain_source = plain_file .read_module_plain_source (module_name , template_dirs )
352- [full_plain_source , _ ] = file_utils .get_loaded_templates (template_dirs , plain_source )
353- console .info ("Full plain text:\n " )
354- console .info (full_plain_source )
355- return
356-
357- if args .dry_run :
358- console .info ("Printing dry run output...\n " )
359- plain_module = load_plain_module (args , template_dirs )
360- render_range = plain_spec .compute_render_range (args , plain_module .plain_source )
361- print_dry_run_output (plain_module .plain_source , render_range )
362- warn_if_acceptance_tests_without_conformance_script (plain_module , args )
363- return
339+ module_name = Path (args .filename ).stem
340+ plain_source = plain_file .read_module_plain_source (module_name , template_dirs )
341+ [full_plain_source , _ ] = file_utils .get_loaded_templates (template_dirs , plain_source )
342+ console .info ("Full plain text:\n " )
343+ console .info (full_plain_source )
364344 except Exception as e :
365345 console .error (f"Error: { str (e )} " )
366- return
346+ return
347+
348+ # Parse the plain file (and its required modules) once; reused by dry-run and rendering.
349+ try :
350+ plain_module = plain_modules .PlainModule (
351+ args .filename ,
352+ args .build_folder ,
353+ args .conformance_tests_folder ,
354+ template_dirs ,
355+ )
356+ except Exception as e :
357+ console .error (f"Error: { str (e )} " )
358+ return
359+
360+ if args .dry_run :
361+ console .info ("Printing dry run output...\n " )
362+ render_range = plain_spec .compute_render_range (args , plain_module .plain_source )
363+ print_dry_run_output (plain_module .plain_source , render_range )
364+ warn_if_acceptance_tests_without_conformance_script (plain_module , args )
365+ return
367366
368367 event_bus = EventBus ()
369368
@@ -391,7 +390,7 @@ def main(): # noqa: C901
391390 raise MissingAPIKey (
392391 "Your API key is required. Please set the CODEPLAIN_API_KEY environment variable or provide it with the --api-key argument.\n "
393392 )
394- render (args , run_state , event_bus , default_log_level )
393+ render (plain_module , args , run_state , event_bus , default_log_level )
395394 except BaseException as e :
396395 if isinstance (e , KeyboardInterrupt ):
397396 error_message = "Keyboard interrupt"
0 commit comments