22from collections import defaultdict
33from dataclasses import asdict
44from pathlib import Path
5- from typing import Any , DefaultDict , Dict , List
5+ from typing import Any , DefaultDict , Dict , List , Set , Tuple
66
7+ import difflib
78import logging
89import yaml
910
1213
1314logging .basicConfig (level = logging .INFO )
1415
15- logger = logging .getLogger (__file__ )
16+ logger = logging .getLogger (Path ( __file__ ). name )
1617
1718
1819def write_many (root : Path , to_write : Dict [str , str ]):
@@ -111,6 +112,45 @@ def excerpt_dict(excerpt: Dict) -> Dict:
111112 return reordered
112113
113114
115+ def collect_yaml (root : Path ) -> Dict [str , Dict ]:
116+ yaml_files : Dict [str , Dict ] = {}
117+ metadata_dir = root / ".doc_gen" / "metadata"
118+
119+ if not metadata_dir .exists ():
120+ return yaml_files
121+
122+ for yaml_path in metadata_dir .glob ("**/*.yaml" ):
123+ rel_path = yaml_path .relative_to (root )
124+
125+ with open (yaml_path , "r" ) as file :
126+ try :
127+ content = yaml .safe_load (file )
128+ yaml_files [str (rel_path )] = content
129+ except yaml .YAMLError as e :
130+ logger .error (f"Error parsing YAML file { yaml_path } : { e } " )
131+
132+ return yaml_files
133+
134+
135+ def report_yaml_differences (
136+ before_values : Dict [str , Dict ], after_values : Dict [str , Dict ]
137+ ) -> List [Tuple [str , str ]]:
138+ differences = []
139+ for file_path in set (before_values .keys ()) | set (after_values .keys ()):
140+ before = before_values .get (file_path )
141+ after = after_values .get (file_path )
142+
143+ if before != after :
144+ if file_path not in before_values :
145+ differences .append ((file_path , "added" ))
146+ elif file_path not in after_values :
147+ differences .append ((file_path , "removed" ))
148+ else :
149+ differences .append ((file_path , "modified" ))
150+
151+ return differences
152+
153+
114154def main ():
115155 parser = ArgumentParser (
116156 description = "Build a DocGen instance and normalize the metadata."
@@ -123,9 +163,21 @@ def main():
123163 if not root .is_dir ():
124164 logger .error (f"Expected { root } to be a directory." )
125165
166+ before_values = collect_yaml (root )
126167 doc_gen = DocGen .from_root (root )
127168 writes = prepare_write (doc_gen .examples )
128169 write_many (root , writes )
170+ after_values = collect_yaml (root )
171+
172+ if before_values != after_values :
173+ differences = report_yaml_differences (before_values , after_values )
174+ logger .error (f"YAML content changed in { len (differences )} files after writing:" )
175+ for file_path , diff_type in differences :
176+ logger .error (f" - { file_path } : { diff_type } " )
177+ else :
178+ logger .info (
179+ f"Metadata for { root .name } has been normalized and verified for consistency."
180+ )
129181
130182
131183if __name__ == "__main__" :
0 commit comments