11from dataclasses import dataclass
22
3+ from plain2code_exceptions import ModuleDoesNotExistError
34from plain_modules import PlainModule
45
56
67@dataclass
78class 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
2122def 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
3343def 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
4569def 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
0 commit comments