/
via_template.py
55 lines (44 loc) · 1.89 KB
/
via_template.py
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
from __future__ import absolute_import, unicode_literals
import os
import sys
from abc import ABCMeta, abstractmethod
import six
from .activator import Activator
if sys.version_info >= (3, 7):
from importlib.resources import read_text
else:
from importlib_resources import read_text
@six.add_metaclass(ABCMeta)
class ViaTemplateActivator(Activator):
@abstractmethod
def templates(self):
raise NotImplementedError
def generate(self, creator):
dest_folder = creator.bin_dir
replacements = self.replacements(creator, dest_folder)
self._generate(replacements, self.templates(), dest_folder, creator)
if self.flag_prompt is not None:
creator.pyenv_cfg["prompt"] = self.flag_prompt
def replacements(self, creator, dest_folder):
return {
"__VIRTUAL_PROMPT__": "" if self.flag_prompt is None else self.flag_prompt,
"__VIRTUAL_ENV__": six.ensure_text(str(creator.dest)),
"__VIRTUAL_NAME__": creator.env_name,
"__BIN_NAME__": six.ensure_text(str(creator.bin_dir.relative_to(creator.dest))),
"__PATH_SEP__": six.ensure_text(os.pathsep),
}
def _generate(self, replacements, templates, to_folder, creator):
for template in templates:
text = self.instantiate_template(replacements, template, creator)
(to_folder / template).write_text(text, encoding="utf-8")
def instantiate_template(self, replacements, template, creator):
# read text and do replacements
text = read_text(self.__module__, str(template), encoding="utf-8", errors="strict")
for key, value in replacements.items():
value = self._repr_unicode(creator, value)
text = text.replace(key, value)
return text
@staticmethod
def _repr_unicode(creator, value):
# by default we just let it be unicode
return value