import re
import shlex
import sys
try:
import jinja2
except ImportError:
print("honcho's 'export' command requires the jinja2 package,\n"
"which you don't appear to have installed.\n"
"\n"
"To fix this, install honcho with the 'export' extra selected:\n"
"\n"
" pip install honcho[export]\n",
file=sys.stderr)
sys.exit(1)
[docs]class BaseExport(object):
def __init__(self, template_dir=None, template_env=None):
if template_env is not None:
self._template_env = template_env
return
if template_dir is not None:
loader = jinja2.FileSystemLoader([template_dir])
else:
loader = self.get_template_loader()
self._template_env = _default_template_env(loader)
[docs] def get_template(self, path):
"""
Retrieve the template at the specified path. Returns an instance of
:py:class:`Jinja2.Template` by default, but may be overridden by
subclasses.
"""
return self._template_env.get_template(path)
[docs] def get_template_loader(self):
raise NotImplementedError("You must implement a get_template_loader "
"method.")
[docs] def render(self, processes, context):
raise NotImplementedError("You must implement a render method.")
[docs]class File(object):
def __init__(self, name, content, executable=False):
self.name = name
self.content = content
self.executable = executable
[docs]def dashrepl(value):
"""
Replace any non-word characters with a dash.
"""
patt = re.compile(r'\W', re.UNICODE)
return re.sub(patt, '-', value)
[docs]def percentescape(value):
"""
Double any % signs.
"""
return value.replace('%', '%%')
def _default_template_env(loader):
env = jinja2.Environment(loader=loader)
env.filters['shellquote'] = shlex.quote
env.filters['dashrepl'] = dashrepl
env.filters['percentescape'] = percentescape
return env