2828
2929from renku .core import errors
3030from renku .core .constant import RENKU_HOME
31+ from renku .core .util import communication
3132from renku .core .util .os import get_safe_relative_path , hash_file , hash_string
3233from renku .core .util .util import to_string
3334
@@ -343,16 +344,23 @@ def get_files(self) -> Generator[str, None, None]:
343344 if subpath .is_file ():
344345 yield str (subpath .relative_to (self .path ))
345346
346- def render (self , metadata : "TemplateMetadata" ) -> "RenderedTemplate" :
347+ def render (self , metadata : "TemplateMetadata" , ignore_template_errors : bool = False ) -> "RenderedTemplate" :
347348 """Render template files in a new directory."""
348349 if self .path is None :
349350 raise ValueError ("Template path not set" )
350351
351352 render_base = Path (tempfile .mkdtemp ())
352353
353354 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 } " )
356364
357365 destination = render_base / rendered_relative_path
358366 destination .parent .mkdir (parents = True , exist_ok = True )
@@ -365,9 +373,20 @@ def render(self, metadata: "TemplateMetadata") -> "RenderedTemplate":
365373 content_bytes = source .read_bytes ()
366374 destination .write_bytes (content_bytes )
367375 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 )
371390
372391 return RenderedTemplate (path = render_base , template = self , metadata = metadata .metadata )
373392
@@ -432,8 +451,8 @@ def from_dict(cls, name: str, value: Dict[str, Any]):
432451 @property
433452 def has_default (self ) -> bool :
434453 """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
437456 return self .default is not None
438457
439458 def validate (self , raise_errors : bool = True ) -> List [str ]:
0 commit comments