99
1010import difflib
1111import os
12+ import sys
1213
1314
14- def validate_snapshots (generated_dir : str , committed_dir : str ) -> bool :
15+ def validate_snapshots (
16+ generated_dir : str , committed_dir : str , output_file : str | None = None
17+ ) -> bool :
1518 """Compare generated snapshots against committed ones.
1619
1720 Returns True if validation passes (snapshots match or no committed snapshots).
1821 Returns False if snapshots differ.
22+
23+ If output_file is provided, writes comparison results to that file
24+ instead of stdout.
1925 """
26+ out = open (output_file , "w" ) if output_file else sys .stdout
27+ try :
28+ return _check_snapshots_impl (generated_dir , committed_dir , out )
29+ finally :
30+ if output_file :
31+ out .close ()
32+
33+
34+ def _check_snapshots_impl (generated_dir : str , committed_dir : str , out ) -> bool :
2035 if not os .path .isdir (committed_dir ):
21- print (f"No committed snapshots directory found at: { committed_dir } " )
22- print ("Skipping comparison (no baseline to compare against)" )
36+ print (f"No committed snapshots directory found at: { committed_dir } " , file = out )
37+ print ("Skipping comparison (no baseline to compare against)" , file = out )
2338 return True
2439
2540 committed_files = sorted (f for f in os .listdir (committed_dir ) if f .endswith (".api" ))
2641 generated_files = sorted (f for f in os .listdir (generated_dir ) if f .endswith (".api" ))
2742
2843 if not committed_files :
29- print ("No committed snapshot files found" )
30- print ("Skipping comparison (no baseline to compare against)" )
44+ print ("No committed snapshot files found" , file = out )
45+ print ("Skipping comparison (no baseline to compare against)" , file = out )
3146 return True
3247
3348 committed_set = set (committed_files )
@@ -40,13 +55,14 @@ def validate_snapshots(generated_dir: str, committed_dir: str) -> bool:
4055
4156 if filename not in generated_set :
4257 print (
43- f"FAIL: { filename } exists in committed snapshots but was not generated"
58+ f"FAIL: { filename } exists in committed snapshots but was not generated" ,
59+ file = out ,
4460 )
4561 all_passed = False
4662 continue
4763
4864 if filename not in committed_set :
49- print (f"OK: { filename } generated (no committed baseline)" )
65+ print (f"OK: { filename } generated (no committed baseline)" , file = out )
5066 continue
5167
5268 with open (committed_path ) as f :
@@ -55,9 +71,9 @@ def validate_snapshots(generated_dir: str, committed_dir: str) -> bool:
5571 generated_content = f .read ()
5672
5773 if committed_content == generated_content :
58- print (f"OK: { filename } matches committed snapshot" )
74+ print (f"OK: { filename } matches committed snapshot" , file = out )
5975 else :
60- print (f"FAIL: { filename } differs from committed snapshot" )
76+ print (f"FAIL: { filename } differs from committed snapshot" , file = out )
6177 diff = "\n " .join (
6278 difflib .unified_diff (
6379 committed_content .splitlines (),
@@ -67,7 +83,7 @@ def validate_snapshots(generated_dir: str, committed_dir: str) -> bool:
6783 lineterm = "" ,
6884 )
6985 )
70- print (diff )
86+ print (diff , file = out )
7187 all_passed = False
7288
7389 return all_passed
0 commit comments