Skip to content

Commit f9e3fdf

Browse files
committed
Cleanup and bugfixing
1 parent b9709e1 commit f9e3fdf

8 files changed

Lines changed: 181 additions & 84 deletions

File tree

file_utils.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,15 +239,17 @@ def load_linked_resources(template_dirs: list[str], resources_list):
239239
content = open_from(template_dirs, file_name)
240240

241241
if content is None:
242-
raise FileNotFoundError(f"""
242+
raise FileNotFoundError(
243+
f"""
243244
Resource file {file_name} not found. Resource files are searched in the following order (highest to lowest precedence):
244245
245246
1. The directory containing your .plain file
246247
2. The directory specified by --template-dir (if provided)
247248
3. The built-in 'standard_template_library' directory
248249
249250
Please ensure that the resource exists in one of these locations, or specify the correct --template-dir if using custom templates.
250-
""")
251+
"""
252+
)
251253

252254
linked_resources[file_name] = content
253255

git_utils.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,8 @@ def get_last_finished_frid(repo_path: Union[str, os.PathLike]) -> tuple[Optional
429429
if not commit_sha:
430430
return None, None
431431
commit_message = repo.commit(commit_sha).message
432+
if isinstance(commit_message, bytes):
433+
commit_message = commit_message.decode("utf-8")
432434
match = re.search(r"FRID\):(\S+) fully implemented", commit_message)
433435
frid = match.group(1) if match else None
434436

module_renderer.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,11 @@
22
import os
33
import threading
44

5-
import git_utils
6-
import plain_file
7-
import plain_modules
8-
import plain_spec
95
from event_bus import EventBus
106
from memory_management import MemoryManager
117
from partial_rendering import PartialRenderChoice
128
from plain2code_console import console
139
from plain2code_events import RenderCompleted, RenderFailed
14-
from plain2code_exceptions import MissingPreviousFunctionalitiesError
1510
from plain2code_state import RunState
1611
from plain_modules import PlainModule
1712
from render_machine.code_renderer import CodeRenderer
@@ -78,7 +73,7 @@ def _build_render_context_for_module(
7873

7974
def _render_module(
8075
self, plain_module: PlainModule, render_range: list[str] | None, force_render: bool
81-
) -> tuple[bool, list[PlainModule], bool]:
76+
) -> tuple[bool, bool]:
8277
"""Render a module.
8378
8479
Returns:
@@ -99,14 +94,16 @@ def _render_module(
9994

10095
if rendering_failed:
10196
return False, True
102-
103-
if not (
104-
force_render
105-
or any(module.filename == plain_module.filename for module in self.loaded_modules)
106-
or plain_module.get_repo() is None
107-
or (plain_module.has_plain_spec_changed() or False)
108-
or (plain_module.has_required_modules_code_changed() or False)
109-
or has_any_required_module_changed
97+
console.debug(f"{plain_module.module_name=}, {force_render=}, {has_any_required_module_changed=}")
98+
console.debug(
99+
f"{plain_module.get_repo()=}, {plain_module.has_plain_spec_changed()=}, {plain_module.has_required_modules_code_changed()=}"
100+
)
101+
if (
102+
((not force_render) or any(module.name == plain_module.name for module in self.loaded_modules))
103+
and plain_module.get_repo() is not None
104+
and not plain_module.has_plain_spec_changed()
105+
and not plain_module.has_required_modules_code_changed()
106+
and not has_any_required_module_changed
110107
):
111108
return False, False
112109

@@ -145,7 +142,7 @@ def _render_module(
145142

146143
def render_module(self) -> None:
147144
self.loaded_modules = list[PlainModule]()
148-
if self.partial_render_choice is not None:
145+
if self.partial_render_choice is not None and self.partial_render_choice.module is not None:
149146
self._render_module(self.partial_render_choice.module, self.partial_render_choice.render_range, True)
150147

151148
_, rendering_failed = self._render_module(self.plain_module, self.render_range, True)

partial_rendering.py

Lines changed: 60 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
from dataclasses import dataclass
22

3+
from plain2code_exceptions import ModuleDoesNotExistError
34
from plain_modules import PlainModule
45

56

67
@dataclass
78
class PartialRender:
8-
module: PlainModule | None = None
9+
module: PlainModule
910
frid: str | None = None
1011
spec_change: bool = False
1112
code_change: bool = False
@@ -19,34 +20,58 @@ class PartialRenderChoice:
1920

2021

2122
def spec_change(plain_module: PlainModule) -> PlainModule | None:
22-
if len(plain_module.required_modules) == 0:
23-
return plain_module if plain_module.has_plain_spec_changed() else None
24-
25-
for required_module in plain_module.required_modules:
26-
sc = spec_change(required_module)
27-
if sc is not None:
28-
return sc
29-
30-
return plain_module if plain_module.has_plain_spec_changed() else None
23+
for required_module in plain_module.all_required_modules:
24+
module_metadata = required_module.load_module_metadata()
25+
if (
26+
module_metadata
27+
and "source_hash" in module_metadata
28+
and module_metadata["source_hash"] != required_module.get_module_source_hash()
29+
):
30+
return required_module
31+
32+
module_metadata = plain_module.load_module_metadata()
33+
if (
34+
module_metadata
35+
and "source_hash" in module_metadata
36+
and module_metadata["source_hash"] != plain_module.get_module_source_hash()
37+
):
38+
return plain_module
39+
40+
return None
3141

3242

3343
def code_change(plain_module: PlainModule) -> PlainModule | None:
34-
if len(plain_module.required_modules) == 0:
35-
return plain_module if plain_module.has_required_modules_code_changed() else None
36-
37-
for required_module in plain_module.required_modules:
38-
cc = code_change(required_module)
39-
if cc is not None:
40-
return cc
41-
42-
return plain_module if plain_module.has_required_modules_code_changed() else None
44+
for required_module in plain_module.all_required_modules:
45+
if len(required_module.required_modules) == 0:
46+
continue
47+
48+
module_metadata = required_module.load_module_metadata()
49+
previous_module = required_module.required_modules[-1]
50+
if (
51+
module_metadata
52+
and "required_modules_code_hash" in module_metadata
53+
and module_metadata["required_modules_code_hash"] != previous_module.get_module_code_hash()
54+
):
55+
return required_module
56+
57+
module_metadata = plain_module.load_module_metadata()
58+
previous_module = plain_module.required_modules[-1]
59+
if (
60+
module_metadata
61+
and "required_modules_code_hash" in module_metadata
62+
and module_metadata["required_modules_code_hash"] != previous_module.get_module_code_hash()
63+
):
64+
return plain_module
65+
66+
return None
4367

4468

4569
def module_comes_before(
4670
all_required_modules: list[PlainModule],
4771
module1: PlainModule,
4872
module2: PlainModule,
4973
) -> bool:
74+
5075
for module in all_required_modules:
5176
if module.module_name == module1.module_name:
5277
return True
@@ -69,6 +94,11 @@ def detect_partial_rendering(plain_module: PlainModule) -> PartialRender | None:
6994
if required_module.module_name == last_rendered_module:
7095
module = required_module
7196

97+
if module is None:
98+
raise ModuleDoesNotExistError(
99+
f"Last rendered module {last_rendered_module} not found in {all_required_modules}"
100+
)
101+
72102
pr = PartialRender(
73103
module=module,
74104
frid=last_rendered_frid,
@@ -79,17 +109,16 @@ def detect_partial_rendering(plain_module: PlainModule) -> PartialRender | None:
79109
if sc is None and cc is None:
80110
return pr
81111

82-
if sc is not None:
83-
if module_comes_before(all_required_modules, sc, pr.module):
84-
pr.module = sc
85-
pr.spec_change = True
86-
pr.frid = None
87-
88-
if cc is not None:
89-
if module_comes_before(all_required_modules, cc, pr.module):
90-
pr.module = cc
91-
pr.code_change = True
92-
pr.spec_change = False
93-
pr.frid = None
112+
if sc is not None and module_comes_before(all_required_modules, sc, pr.module):
113+
pr.module = sc
114+
pr.spec_change = True
115+
pr.code_change = False
116+
pr.frid = None
117+
118+
if cc is not None and module_comes_before(all_required_modules, cc, pr.module):
119+
pr.module = cc
120+
pr.code_change = True
121+
pr.spec_change = False
122+
pr.frid = None
94123

95124
return pr

plain_modules.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,23 +112,23 @@ def has_required_modules_code_changed(
112112
self,
113113
) -> bool:
114114
if self.required_modules is None or len(self.required_modules) == 0:
115-
return None
115+
return False
116116

117117
module_metadata = self.load_module_metadata()
118118

119119
if not module_metadata or "required_modules_code_hash" not in module_metadata:
120-
return None
120+
return True
121121

122122
previous_module = self.required_modules[-1]
123123
return module_metadata["required_modules_code_hash"] != previous_module.get_module_code_hash()
124124

125125
def has_plain_spec_changed(self) -> bool:
126126
module_metadata = self.load_module_metadata()
127127
if not module_metadata:
128-
return None
128+
return True
129129

130130
if "source_hash" not in module_metadata:
131-
return None
131+
return True
132132

133133
return module_metadata["source_hash"] != self.get_module_source_hash()
134134

@@ -282,7 +282,7 @@ def get_next_module(self, module_name: str) -> PlainModule | None:
282282
if module.module_name == module_name and idx < len(self.all_required_modules) - 1:
283283
return self.all_required_modules[idx + 1]
284284

285-
return None
285+
return self
286286

287287
def get_next_frid(self, frid: str, module_name: str) -> tuple[str, PlainModule]:
288288
module = self.get_module_by_name(module_name)

0 commit comments

Comments
 (0)