Skip to content

Commit 038bc2d

Browse files
committed
Refactoring plain_modules.py
1 parent eef9a4c commit 038bc2d

6 files changed

Lines changed: 211 additions & 185 deletions

File tree

module_renderer.py

Lines changed: 42 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -42,114 +42,6 @@ def __init__(
4242
self.stop_event = stop_event
4343
self.enter_pause_event = enter_pause_event
4444

45-
def _ensure_module_folders_exist(self, module_name: str, first_render_frid: str) -> tuple[str, str]:
46-
"""
47-
Ensure that build and conformance test folders exist for the module.
48-
49-
Args:
50-
module_name: Name of the module being rendered
51-
first_render_frid: The first FRID in the render range
52-
53-
Returns:
54-
tuple[str, str]: (build_folder_path, conformance_tests_path)
55-
56-
Raises:
57-
MissingPreviousFridCommitsError: If any required folders are missing
58-
"""
59-
build_folder_path = os.path.join(self.args.build_folder, module_name)
60-
conformance_tests_path = os.path.join(self.args.conformance_tests_folder, module_name)
61-
62-
if not os.path.exists(build_folder_path):
63-
raise MissingPreviousFunctionalitiesError(
64-
f"Cannot start rendering from functionality {first_render_frid} for module '{module_name}' because the source code folder does not exist.\n\n"
65-
f"To fix this, please render the module from the beginning by running:\n"
66-
f" codeplain {module_name}{plain_file.PLAIN_SOURCE_FILE_EXTENSION}"
67-
)
68-
69-
if not os.path.exists(conformance_tests_path) and self.args.render_conformance_tests:
70-
raise MissingPreviousFunctionalitiesError(
71-
f"Cannot start rendering from functionality {first_render_frid} for module '{module_name}' because the conformance tests folder does not exist.\n\n"
72-
f"To fix this, please render the module from the beginning by running:\n"
73-
f" codeplain {module_name}{plain_file.PLAIN_SOURCE_FILE_EXTENSION}"
74-
)
75-
76-
return build_folder_path, conformance_tests_path
77-
78-
def _ensure_frid_commit_exists(
79-
self,
80-
frid: str,
81-
module_name: str,
82-
build_folder_path: str,
83-
conformance_tests_path: str,
84-
first_render_frid: str,
85-
) -> None:
86-
"""
87-
Ensure commit exists for a single FRID in both repositories.
88-
89-
Args:
90-
frid: The FRID to check
91-
module_name: Name of the module
92-
build_folder_path: Path to the build folder
93-
conformance_tests_path: Path to the conformance tests folder
94-
first_render_frid: The first FRID in the render range (for error messages)
95-
96-
Raises:
97-
MissingPreviousFridCommitsError: If the commit is missing
98-
"""
99-
# Check in build folder
100-
if not git_utils.has_commit_for_frid(build_folder_path, frid, module_name):
101-
raise MissingPreviousFunctionalitiesError(
102-
f"Cannot start rendering from functionality {first_render_frid} for module '{module_name}' because the implementation of the previous functionality ({frid}) hasn't been completed yet.\n\n"
103-
f"To fix this, please render the missing functionality ({frid}) first by running:\n"
104-
f" codeplain {module_name}{plain_file.PLAIN_SOURCE_FILE_EXTENSION} --render-from {frid}"
105-
)
106-
107-
# Check in conformance tests folder (only if conformance tests are enabled)
108-
if self.args.render_conformance_tests:
109-
if not git_utils.has_commit_for_frid(conformance_tests_path, frid, module_name):
110-
raise MissingPreviousFunctionalitiesError(
111-
f"Cannot start rendering from functionality {first_render_frid} for module '{module_name}' because the conformance tests for the previous functionality ({frid}) haven't been completed yet.\n\n"
112-
f"To fix this, please render the missing functionality ({frid}) first by running:\n"
113-
f" codeplain {module_name}{plain_file.PLAIN_SOURCE_FILE_EXTENSION} --render-from {frid}"
114-
)
115-
116-
def _ensure_previous_frid_commits_exist(
117-
self, module_name: str, plain_source: dict, render_range: list[str]
118-
) -> None:
119-
"""
120-
Ensure that all FRID commits before the render_range exist.
121-
122-
This is a precondition check that must pass before rendering can proceed.
123-
Raises an exception if any previous FRID commits are missing.
124-
125-
Args:
126-
module_name: Name of the module being rendered
127-
plain_source: The plain source tree
128-
render_range: List of FRIDs to render
129-
130-
Raises:
131-
MissingPreviousFridCommitsError: If any previous FRID commits are missing
132-
"""
133-
first_render_frid = render_range[0]
134-
135-
# Get all FRIDs that should have been rendered before this one
136-
previous_frids = plain_spec.get_frids_before(plain_source, first_render_frid)
137-
if not previous_frids:
138-
return
139-
140-
# Ensure the module folders exist
141-
build_folder_path, conformance_tests_path = self._ensure_module_folders_exist(module_name, first_render_frid)
142-
143-
# Verify commits exist for all previous FRIDs
144-
for prev_frid in previous_frids:
145-
self._ensure_frid_commit_exists(
146-
prev_frid,
147-
module_name,
148-
build_folder_path,
149-
conformance_tests_path,
150-
first_render_frid,
151-
)
152-
15345
def _build_render_context_for_module(
15446
self,
15547
module_name: str,
@@ -187,67 +79,59 @@ def _build_render_context_for_module(
18779
)
18880

18981
def _render_module(
190-
self, filename: str, render_range: list[str] | None, force_render: bool
82+
self, plain_module: PlainModule, render_range: list[str] | None, force_render: bool
19183
) -> tuple[bool, list[PlainModule], bool]:
19284
"""Render a module.
19385
19486
Returns:
195-
tuple[bool, list[PlainModule], bool]: (Whether the module was rendered, the required modules, and whether the rendering failed)
87+
tuple[bool, bool]: (Whether the module was rendered and whether the rendering failed)
19688
"""
197-
module_name, plain_source, required_modules_list = plain_file.plain_file_parser(filename, self.template_dirs)
198-
199-
resources_list = []
200-
plain_spec.collect_linked_resources(plain_source, resources_list, None, True)
201-
202-
# Ensure that all previous FRID commits exist before proceeding with render_range
20389
if render_range is not None:
204-
self._ensure_previous_frid_commits_exist(module_name, plain_source, render_range)
90+
plain_module.ensure_previous_frid_commits_exist(render_range)
20591

206-
required_modules = []
20792
has_any_required_module_changed = False
208-
if not self.args.render_machine_graph and required_modules_list:
209-
console.debug(f"Analyzing required modules of module {module_name}...")
210-
for required_module_name in required_modules_list:
211-
required_module_filename = required_module_name + plain_file.PLAIN_SOURCE_FILE_EXTENSION
212-
has_module_changed, sub_required_modules, rendering_failed = self._render_module(
213-
required_module_filename,
93+
if not self.args.render_machine_graph and plain_module.required_modules:
94+
console.debug(f"Analyzing required modules of module {plain_module.module_name}...")
95+
for required_module in plain_module.required_modules:
96+
has_any_required_module_changed, rendering_failed = self._render_module(
97+
required_module,
21498
None,
21599
self.args.force_render,
216100
)
217101

218102
if rendering_failed:
219-
return False, required_modules, True
220-
221-
if has_module_changed:
222-
has_any_required_module_changed = True
223-
224-
for sub_required_module in sub_required_modules:
225-
if sub_required_module.name not in [m.name for m in required_modules]:
226-
required_modules.append(
227-
plain_modules.PlainModule(sub_required_module.name, self.args.build_folder)
228-
)
229-
230-
required_modules.append(plain_modules.PlainModule(required_module_name, self.args.build_folder))
231-
232-
plain_module = plain_modules.PlainModule(module_name, self.args.build_folder)
233-
if (
234-
((not force_render) or any(module.name == plain_module.name for module in self.loaded_modules))
235-
and plain_module.get_repo() is not None
236-
and not plain_module.has_plain_spec_changed(plain_source, resources_list)
237-
and not plain_module.has_required_modules_code_changed(required_modules)
238-
and not has_any_required_module_changed
103+
return False, True
104+
105+
if not (
106+
force_render
107+
or any(module.filename == plain_module.filename for module in self.loaded_modules)
108+
or plain_module.get_repo() is None
109+
or plain_module.has_plain_spec_changed()
110+
or plain_module.has_required_modules_code_changed()
111+
or has_any_required_module_changed
239112
):
240-
return False, required_modules, False
113+
return False, False
241114

242-
memory_manager = MemoryManager(self.codeplainAPI, os.path.join(self.args.build_folder, module_name))
115+
memory_manager = MemoryManager(
116+
self.codeplainAPI,
117+
os.path.join(
118+
self.args.build_folder,
119+
plain_module.module_name,
120+
),
121+
)
243122
render_context = self._build_render_context_for_module(
244-
module_name, memory_manager, plain_source, required_modules, self.template_dirs, render_range
123+
plain_module.module_name,
124+
memory_manager,
125+
plain_module.plain_source,
126+
plain_module.all_required_modules,
127+
self.template_dirs,
128+
render_range,
245129
)
246130

247131
code_renderer = CodeRenderer(render_context)
248132
if self.args.render_machine_graph:
249133
code_renderer.generate_render_machine_graph()
250-
return True, required_modules, False
134+
return True, False
251135

252136
code_renderer.run()
253137
if code_renderer.render_context.state == States.RENDER_FAILED.value:
@@ -256,17 +140,23 @@ def _render_module(
256140
fallback_message=code_renderer.render_context.last_error_message,
257141
)
258142
code_renderer.render_context.event_bus.publish(RenderFailed(error_message=error_message))
259-
return False, required_modules, True
143+
return False, True
260144

261-
plain_module.save_module_metadata(plain_source, resources_list, required_modules)
145+
plain_module.save_module_metadata()
262146

263147
self.loaded_modules.append(plain_module)
264148

265-
return True, required_modules, False
149+
return True, False
266150

267151
def render_module(self) -> None:
268152
self.loaded_modules = list[PlainModule]()
269-
_, _, rendering_failed = self._render_module(self.filename, self.render_range, True)
153+
plain_module = plain_modules.PlainModule(
154+
self.filename,
155+
self.args.build_folder,
156+
self.args.conformance_tests_folder,
157+
self.template_dirs,
158+
)
159+
_, rendering_failed = self._render_module(plain_module, self.render_range, True)
270160
if not rendering_failed:
271161
# Get the last module that completed rendering
272162
if self.args.copy_build:

plain_file.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,14 @@ def render_link(self, token: Link) -> Iterable[Fragment]:
5353
)
5454

5555

56+
def get_filename_from_module_name(module_name: str) -> str:
57+
return f"{module_name}{PLAIN_SOURCE_FILE_EXTENSION}"
58+
59+
60+
def get_module_name_from_filename(filename: str) -> str:
61+
return filename.replace(PLAIN_SOURCE_FILE_EXTENSION, "")
62+
63+
5664
def remove_quotes(token):
5765
# If the token has no children, there's nothing to remove.
5866
if not hasattr(token, "children") or token.children is None:

0 commit comments

Comments
 (0)