Source code for sceptre.template_handlers.file

# -*- coding: utf-8 -*-
import sceptre.template_handlers.helper as helper

from os import path
from pathlib import Path

from sceptre.exceptions import UnsupportedTemplateFileTypeError
from sceptre.template_handlers import TemplateHandler
from sceptre.helpers import normalise_path


[docs]class File(TemplateHandler): """ Template handler that can load files from disk. Supports JSON, YAML, Jinja2 and Python. """ def __init__(self, *args, **kwargs): super(File, self).__init__(*args, **kwargs)
[docs] def schema(self): return { "type": "object", "properties": { "path": {"type": "string"}, }, "required": ["path"] }
[docs] def handle(self): input_path = Path(self.arguments["path"]) path = self._resolve_template_path(str(input_path)) if input_path.suffix not in self.supported_template_extensions: raise UnsupportedTemplateFileTypeError( "Template has file extension %s. Only %s are supported.", input_path.suffix, ",".join(self.supported_template_extensions) ) try: if input_path.suffix in self.standard_template_extensions: with open(path) as template_file: return template_file.read() elif input_path.suffix in self.jinja_template_extensions: return helper.render_jinja_template(path, {"sceptre_user_data": self.sceptre_user_data}, self.stack_group_config.get("j2_environment", {})) elif input_path.suffix in self.python_template_extensions: return helper.call_sceptre_handler(path, self.sceptre_user_data) except Exception as e: helper.print_template_traceback(path) raise e
def _resolve_template_path(self, template_path): """ Return the project_path joined to template_path as a string. Note that os.path.join defers to an absolute path if the input is absolute. """ return path.join( self.stack_group_config["project_path"], "templates", normalise_path(template_path) )