33
44from dataclasses import dataclass
55from pathlib import Path
6- from typing import Any , Dict , List , Optional , Set , Tuple
6+ from typing import Any , Dict , Iterable , List , Optional , Set , Tuple
77from shutil import copyfile
88import re
99
1010from .validator_config import skip
1111from .file_utils import get_files , clear
1212from .metadata import Example
1313from .metadata_errors import MetadataErrors , MetadataError
14+ from .project_validator import (
15+ verify_no_deny_list_words ,
16+ verify_no_secret_keys ,
17+ ValidationConfig ,
18+ )
1419
1520SNIPPET_START = "snippet-start:["
1621SNIPPET_END = "snippet-end:["
@@ -171,6 +176,49 @@ def collect_snippets(
171176 return snippets , errors
172177
173178
179+ def collect_snippet_files (
180+ examples : Iterable [Example ],
181+ snippets : Dict [str , Snippet ],
182+ errors : MetadataErrors ,
183+ root : Path ,
184+ ):
185+ for example in examples :
186+ for lang in example .languages :
187+ language = example .languages [lang ]
188+ for version in language .versions :
189+ for excerpt in version .excerpts :
190+ for snippet_file in excerpt .snippet_files :
191+ if not (root / snippet_file ).exists ():
192+ # Ensure all snippet_files exist
193+ errors .append (
194+ MissingSnippetFile (
195+ file = example .file ,
196+ snippet_file = snippet_file ,
197+ id = f"{ lang } :{ version .sdk_version } " ,
198+ )
199+ )
200+ continue
201+ if re .search (win_unsafe_re , str (snippet_file )):
202+ errors .append (
203+ WindowsUnsafeSnippetFile (
204+ file = example .file ,
205+ snippet_file = snippet_file ,
206+ id = f"{ lang } :{ version .sdk_version } " ,
207+ )
208+ )
209+ continue
210+ name = str (snippet_file ).replace ("/" , "." )
211+ with open (root / snippet_file , encoding = "utf8" ) as file :
212+ code = file .readlines ()
213+ snippets [name ] = Snippet (
214+ id = name ,
215+ file = str (snippet_file ),
216+ line_start = 0 ,
217+ line_end = len (code ),
218+ code = "\n " .join (file ),
219+ )
220+
221+
174222@dataclass
175223class MissingSnippet (MetadataError ):
176224 tag : Optional [str ] = None
@@ -200,9 +248,9 @@ def message(self):
200248
201249
202250def validate_snippets (
203- examples : List [Example ],
251+ examples : Iterable [Example ],
204252 snippets : Dict [str , Snippet ],
205- snippet_files : Set [ str ] ,
253+ validation : ValidationConfig ,
206254 errors : MetadataErrors ,
207255 root : Path ,
208256):
@@ -221,24 +269,10 @@ def validate_snippets(
221269 tag = snippet_tag ,
222270 )
223271 )
224- for snippet_file in excerpt .snippet_files :
225- if not (root / snippet_file ).exists ():
226- # Ensure all snippet_files exist
227- errors .append (
228- MissingSnippetFile (
229- file = example .file ,
230- snippet_file = snippet_file ,
231- id = f"{ lang } :{ version .sdk_version } " ,
232- )
233- )
234- if re .search (win_unsafe_re , str (snippet_file )):
235- errors .append (
236- WindowsUnsafeSnippetFile (
237- file = example .file ,
238- snippet_file = snippet_file ,
239- id = f"{ lang } :{ version .sdk_version } " ,
240- )
241- )
272+
273+ for snippet in snippets .values ():
274+ verify_no_deny_list_words (snippet .code , root / snippet .file , errors )
275+ verify_no_secret_keys (snippet .code , root / snippet .file , validation , errors )
242276
243277
244278def write_snippets (root : Path , snippets : Dict [str , Snippet ], check : bool = False ):
0 commit comments