forked from conda/constructor
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathjinja.py
More file actions
37 lines (30 loc) · 1.27 KB
/
Copy pathjinja.py
File metadata and controls
37 lines (30 loc) · 1.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
from jinja2 import BaseLoader, Environment, FileSystemLoader, TemplateError
import os
from constructor.exceptions import UnableToParse
# adapted from conda-build
class FilteredLoader(BaseLoader):
"""
A pass-through for the given loader, except that the loaded source is
filtered according to any metadata selectors in the source text.
"""
def __init__(self, unfiltered_loader, content_filter):
self._unfiltered_loader = unfiltered_loader
self.list_templates = unfiltered_loader.list_templates
self.content_filter = content_filter
def get_source(self, environment, template):
loader = self._unfiltered_loader
contents, filename, uptodate = loader.get_source(environment, template)
filtered_contents = self.content_filter(contents)
return filtered_contents, filename, uptodate
# adapted from conda-build
def render_jinja(data, directory, content_filter):
loader = FilteredLoader(FileSystemLoader(directory), content_filter)
env = Environment(loader=loader)
env.globals['environ'] = os.environ.copy()
env.globals['os'] = os
try:
template = env.from_string(data)
rendered = template.render()
except TemplateError as ex:
raise UnableToParse(original=ex)
return rendered