Skip to content

Commit abfe6b6

Browse files
committed
Bugfixing, refactoring and adding changed module to render from scratch
1 parent b4929b2 commit abfe6b6

8 files changed

Lines changed: 166 additions & 130 deletions

File tree

git_utils.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,10 @@ def _ensure_git_config(repo: Repo) -> None:
6161

6262

6363
def init_git_repo(
64-
path_to_repo: Union[str, os.PathLike], module_name: Optional[str] = None, render_id: Optional[str] = None
64+
path_to_repo: Union[str, os.PathLike],
65+
module_name: Optional[str] = None,
66+
render_id: Optional[str] = None,
67+
additional_files: Optional[dict[str, str]] = None,
6568
) -> Repo:
6669
"""
6770
Initializes a new git repository in the given path.
@@ -75,6 +78,11 @@ def init_git_repo(
7578

7679
repo = Repo.init(path_to_repo)
7780
_ensure_git_config(repo)
81+
82+
if additional_files:
83+
file_utils.store_response_files(path_to_repo, additional_files, [])
84+
repo.git.add(".")
85+
7886
repo.git.commit(
7987
"--allow-empty", "-m", _get_full_commit_message(INITIAL_COMMIT_MESSAGE, module_name, None, render_id)
8088
)
@@ -83,9 +91,18 @@ def init_git_repo(
8391

8492

8593
def clone_repo(
86-
source_repo_path: str, new_repo_path: str, module_name: Optional[str] = None, render_id: Optional[str] = None
94+
source_repo_path: str,
95+
new_repo_path: str,
96+
module_name: Optional[str] = None,
97+
render_id: Optional[str] = None,
98+
additional_files: Optional[dict[str, str]] = None,
8799
) -> Repo:
88100
repo = Repo.clone_from(source_repo_path, new_repo_path)
101+
102+
if additional_files:
103+
file_utils.store_response_files(new_repo_path, additional_files, [])
104+
repo.git.add(".")
105+
89106
repo.git.commit(
90107
"--allow-empty", "-m", _get_full_commit_message(INITIAL_COMMIT_MESSAGE, module_name, None, render_id)
91108
)

module_renderer.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,7 @@ def _build_render_context_for_module(
4747
return RenderContext(
4848
self.codeplainAPI,
4949
memory_manager,
50-
plain_module.module_name,
51-
plain_module.plain_source,
52-
plain_module.all_required_modules,
53-
plain_module.template_dirs,
50+
plain_module,
5451
build_folder=os.path.join(self.args.build_folder, plain_module.module_name),
5552
build_dest=self.args.build_dest,
5653
conformance_tests_folder=self.args.conformance_tests_folder,
@@ -94,19 +91,19 @@ def _render_module(
9491

9592
if rendering_failed:
9693
return False, True
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-
)
94+
10195
if (
102-
((not force_render) or any(module.name == plain_module.name for module in self.loaded_modules))
96+
(
97+
(not force_render)
98+
or any(module.module_name == plain_module.module_name for module in self.loaded_modules)
99+
)
103100
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()
106101
and not has_any_required_module_changed
107102
):
108103
return False, False
109104

105+
# plain_module.save_module_metadata(only_hashes=True)
106+
110107
memory_manager = MemoryManager(
111108
self.codeplainAPI,
112109
os.path.join(

partial_rendering.py

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
from dataclasses import dataclass
22

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

67

78
@dataclass
89
class PartialRender:
9-
module: PlainModule
10-
frid: str | None = None
11-
spec_change: bool = False
12-
code_change: bool = False
10+
last_render_module: PlainModule
11+
last_render_frid: str | None
12+
change: PlainModule | None = None
13+
change_type: str | None = None
1314

1415

1516
@dataclass
@@ -55,13 +56,14 @@ def code_change(plain_module: PlainModule) -> PlainModule | None:
5556
return required_module
5657

5758
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
59+
if len(plain_module.required_modules) > 0:
60+
previous_module = plain_module.required_modules[-1]
61+
if (
62+
module_metadata
63+
and "required_modules_code_hash" in module_metadata
64+
and module_metadata["required_modules_code_hash"] != previous_module.get_module_code_hash()
65+
):
66+
return plain_module
6567

6668
return None
6769

@@ -94,31 +96,38 @@ def detect_partial_rendering(plain_module: PlainModule) -> PartialRender | None:
9496
if required_module.module_name == last_rendered_module:
9597
module = required_module
9698

99+
if last_rendered_module == plain_module.module_name:
100+
if (
101+
last_rendered_frid is None
102+
or plain_spec.get_next_frid(plain_module.plain_source, last_rendered_frid) is not None
103+
):
104+
module = plain_module
105+
else:
106+
return None
107+
97108
if module is None:
98109
raise ModuleDoesNotExistError(
99-
f"Last rendered module {last_rendered_module} not found in {all_required_modules}"
110+
f"Last rendered module {last_rendered_module} not found in {[rmodule.module_name for rmodule in all_required_modules]}"
100111
)
101112

102113
pr = PartialRender(
103-
module=module,
104-
frid=last_rendered_frid,
105-
spec_change=False,
106-
code_change=False,
114+
last_render_module=module,
115+
last_render_frid=last_rendered_frid,
116+
change=None,
117+
change_type=None,
107118
)
108119

109120
if sc is None and cc is None:
110121
return pr
111122

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
123+
if sc is not None:
124+
pr.change = sc
125+
pr.change_type = "spec_change"
126+
127+
if cc is not None and (
128+
pr.change is None or (pr.change is not None and module_comes_before(all_required_modules, cc, pr.change))
129+
):
130+
pr.change = cc
131+
pr.change_type = "code_change"
123132

124133
return pr

plain_modules.py

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -141,33 +141,40 @@ def _get_module_functional_requirements(self) -> list[str]:
141141
return module_functional_requirements
142142

143143
def get_functionalities(self) -> dict[str, list[str]]:
144-
module_metadata = self.load_module_metadata()
145-
if module_metadata is None:
146-
raise ModuleDoesNotExistError(f"Module {self.module_name} does not exist or has no metadata.")
147-
148-
if REQUIRED_MODULES_FUNCTIONALITIES in module_metadata:
149-
functionalities = module_metadata[REQUIRED_MODULES_FUNCTIONALITIES]
150-
else:
151-
functionalities = {}
144+
functionalities = {}
145+
for required_module in self.required_modules:
146+
functionalities.update(required_module.get_functionalities())
152147

153-
functionalities[self.module_name] = module_metadata[MODULE_FUNCTIONALITIES]
148+
functionalities[self.module_name] = self._get_module_functional_requirements()
154149

155150
return functionalities
156151

157-
def save_module_metadata(
158-
self,
159-
):
152+
def module_metadata_path(self, for_git_repo: bool = False) -> str:
153+
if for_git_repo:
154+
return os.path.join(CODEPLAIN_METADATA_FOLDER, MODULE_METADATA_FILENAME)
155+
156+
return os.path.join(self.get_codeplain_folder(), MODULE_METADATA_FILENAME)
157+
158+
def get_hashes(self) -> dict[str, str]:
159+
hashes = {"source_hash": self.get_module_source_hash()}
160+
if len(self.required_modules) > 0:
161+
hashes["required_modules_code_hash"] = self.required_modules[-1].get_module_code_hash()
162+
return hashes
163+
164+
def save_module_metadata(self, only_hashes: bool = False):
160165
codeplain_folder = self.get_codeplain_folder()
161166
os.makedirs(codeplain_folder, exist_ok=True)
162167

163-
module_metadata = {
164-
"source_hash": self.get_module_source_hash(),
165-
MODULE_FUNCTIONALITIES: self._get_module_functional_requirements(),
166-
}
168+
module_metadata = self.get_hashes()
169+
170+
metadata_path = self.module_metadata_path()
167171

168-
if self.required_modules is not None and len(self.required_modules) > 0:
169-
previous_module = self.required_modules[-1]
170-
module_metadata["required_modules_code_hash"] = previous_module.get_module_code_hash()
172+
if only_hashes:
173+
with open(metadata_path, "w", encoding="utf-8") as f:
174+
json.dump(module_metadata, f, indent=4)
175+
return
176+
177+
module_metadata[MODULE_FUNCTIONALITIES] = (self._get_module_functional_requirements(),)
171178

172179
required_modules_functionalities = {}
173180
for required_module in self.required_modules:
@@ -176,7 +183,6 @@ def save_module_metadata(
176183
if required_modules_functionalities:
177184
module_metadata[REQUIRED_MODULES_FUNCTIONALITIES] = required_modules_functionalities
178185

179-
metadata_path = os.path.join(codeplain_folder, MODULE_METADATA_FILENAME)
180186
with open(metadata_path, "w", encoding="utf-8") as f:
181187
json.dump(module_metadata, f, indent=4)
182188

render_machine/actions/prepare_repositories.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import json
12
from typing import Any
23

34
import file_utils
@@ -33,6 +34,11 @@ def execute(self, render_context: RenderContext, _previous_action_payload: Any |
3334
)
3435

3536
else:
37+
module_hashes = render_context.plain_module.get_hashes()
38+
additional_files = {
39+
render_context.plain_module.module_metadata_path(for_git_repo=True): json.dumps(module_hashes)
40+
}
41+
3642
if render_context.required_modules:
3743
previous_module = render_context.required_modules[-1]
3844
if render_context.verbose:
@@ -44,13 +50,17 @@ def execute(self, render_context: RenderContext, _previous_action_payload: Any |
4450
render_context.build_folder,
4551
render_context.module_name,
4652
render_context.run_state.render_id,
53+
additional_files,
4754
)
4855
else:
4956
if render_context.verbose:
5057
console.debug("Initializing git repositories for the render folders.")
5158

5259
git_utils.init_git_repo(
53-
render_context.build_folder, render_context.module_name, render_context.run_state.render_id
60+
render_context.build_folder,
61+
render_context.module_name,
62+
render_context.run_state.render_id,
63+
additional_files,
5464
)
5565

5666
if render_context.base_folder:
@@ -68,6 +78,7 @@ def execute(self, render_context: RenderContext, _previous_action_payload: Any |
6878
render_context.conformance_tests.get_module_conformance_tests_folder(render_context.module_name),
6979
render_context.module_name,
7080
render_context.run_state.render_id,
81+
additional_files,
7182
)
7283

7384
return self.SUCCESSFUL_OUTCOME, None

render_machine/render_context.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,7 @@ def __init__(
3333
self,
3434
codeplain_api,
3535
memory_manager,
36-
module_name: str,
37-
plain_source_tree: dict,
38-
required_modules: list[PlainModule],
39-
template_dirs: list[str],
36+
plain_module: PlainModule,
4037
build_folder: str,
4138
build_dest: str,
4239
conformance_tests_folder: str,
@@ -58,10 +55,11 @@ def __init__(
5855
):
5956
self.codeplain_api: CodeplainAPI = codeplain_api
6057
self.memory_manager = memory_manager
61-
self.plain_source_tree = plain_source_tree
62-
self.module_name = module_name
63-
self.template_dirs = template_dirs
64-
self.required_modules = required_modules
58+
self.plain_module = plain_module
59+
self.plain_source_tree = plain_module.plain_source
60+
self.module_name = plain_module.module_name
61+
self.template_dirs = plain_module.template_dirs
62+
self.required_modules = plain_module.required_modules
6563
self.build_folder = build_folder
6664
self.build_dest = build_dest
6765
self.conformance_tests_folder = conformance_tests_folder
@@ -84,8 +82,8 @@ def __init__(
8482
self.test_script_timeout = test_script_timeout
8583

8684
resources_list = []
87-
plain_spec.collect_linked_resources(plain_source_tree, resources_list, None, True)
88-
self.all_linked_resources = file_utils.load_linked_resources(template_dirs, resources_list)
85+
plain_spec.collect_linked_resources(self.plain_source_tree, resources_list, None, True)
86+
self.all_linked_resources = file_utils.load_linked_resources(self.template_dirs, resources_list)
8987

9088
# Initialize context objects
9189
self.frid_context: Optional[FridContext] = None
@@ -130,6 +128,7 @@ def create_snapshot(self) -> RenderContextSnapshot:
130128
)
131129

132130
def get_required_modules_functionalities(self):
131+
print(f"Getting required modules functionalities for {self.module_name}...")
133132
required_modules_functionalities = {}
134133
if self.required_modules is not None and len(self.required_modules) > 0:
135134
for required_module in self.required_modules:

0 commit comments

Comments
 (0)