Skip to content

Commit 2d91f43

Browse files
committed
refactor: build PlainModule once in main and pass it to render
Previously the module was constructed in both the dry-run branch and inside render(), and render() re-parsed the file again just to compute the render range. Parse the plain file once in main() and pass the PlainModule into render(), removing the duplicate construction and the redundant re-parse.
1 parent 4682d44 commit 2d91f43

1 file changed

Lines changed: 37 additions & 38 deletions

File tree

plain2code.py

Lines changed: 37 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
171161
def 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

Comments
 (0)