28
28
29
29
from renku .core import errors
30
30
from renku .core .constant import RENKU_HOME
31
+ from renku .core .util import communication
31
32
from renku .core .util .os import get_safe_relative_path , hash_file , hash_string
32
33
from renku .core .util .util import to_string
33
34
@@ -343,16 +344,23 @@ def get_files(self) -> Generator[str, None, None]:
343
344
if subpath .is_file ():
344
345
yield str (subpath .relative_to (self .path ))
345
346
346
- def render (self , metadata : "TemplateMetadata" ) -> "RenderedTemplate" :
347
+ def render (self , metadata : "TemplateMetadata" , ignore_template_errors : bool = False ) -> "RenderedTemplate" :
347
348
"""Render template files in a new directory."""
348
349
if self .path is None :
349
350
raise ValueError ("Template path not set" )
350
351
351
352
render_base = Path (tempfile .mkdtemp ())
352
353
353
354
for relative_path in self .get_files ():
354
- # NOTE: The path could contain template variables, we need to template it
355
- rendered_relative_path = jinja2 .Template (relative_path ).render (metadata .metadata )
355
+ try :
356
+ # NOTE: The path could contain template variables, we need to template it
357
+ rendered_relative_path = jinja2 .Template (relative_path ).render (metadata .metadata )
358
+ except jinja2 .TemplateError as e :
359
+ if ignore_template_errors :
360
+ rendered_relative_path = relative_path
361
+ communication .warn (f"Ignoring template error when rendering path '{ relative_path } '" )
362
+ else :
363
+ raise errors .InvalidTemplateError (f"Cannot render template file path '{ relative_path } ': { e } " )
356
364
357
365
destination = render_base / rendered_relative_path
358
366
destination .parent .mkdir (parents = True , exist_ok = True )
@@ -365,9 +373,20 @@ def render(self, metadata: "TemplateMetadata") -> "RenderedTemplate":
365
373
content_bytes = source .read_bytes ()
366
374
destination .write_bytes (content_bytes )
367
375
else :
368
- template = jinja2 .Template (content , keep_trailing_newline = True )
369
- rendered_content = template .render (metadata .metadata )
370
- destination .write_text (rendered_content )
376
+ try :
377
+ rendered_content = jinja2 .Template (content , keep_trailing_newline = True ).render (metadata .metadata )
378
+ except jinja2 .TemplateError as e :
379
+ if ignore_template_errors :
380
+ destination .write_text (content )
381
+ communication .warn (
382
+ f"Ignoring template rendering error when creating '{ rendered_relative_path } '"
383
+ )
384
+ else :
385
+ raise errors .InvalidTemplateError (
386
+ f"Cannot render template file '{ rendered_relative_path } ': { e } "
387
+ )
388
+ else :
389
+ destination .write_text (rendered_content )
371
390
372
391
return RenderedTemplate (path = render_base , template = self , metadata = metadata .metadata )
373
392
@@ -432,8 +451,8 @@ def from_dict(cls, name: str, value: Dict[str, Any]):
432
451
@property
433
452
def has_default (self ) -> bool :
434
453
"""Return True if a default value is set."""
435
- # NOTE: ``None`` cannot be used as the default value but it's ok since no variable type accepts it and it's not
436
- # a valid value anyways
454
+ # NOTE: ``None`` cannot be used as the default value, but it's ok since no variable type accepts it, and it's
455
+ # not a valid value anyway
437
456
return self .default is not None
438
457
439
458
def validate (self , raise_errors : bool = True ) -> List [str ]:
0 commit comments