Codegen: add render_str

This commit is contained in:
Paolo Tranquilli
2023-11-21 16:54:18 +01:00
parent e40c53a340
commit d659709695
2 changed files with 47 additions and 4 deletions

View File

@@ -29,7 +29,7 @@ class Renderer:
self._r = pystache.Renderer(search_dirs=str(paths.templates_dir), escape=lambda u: u)
self._generator = generator
def render(self, data: object, output: pathlib.Path):
def render(self, data: object, output: typing.Optional[pathlib.Path], template: typing.Optional[str] = None):
""" Render `data` to `output`.
`data` must have a `template` attribute denoting which template to use from the template directory.
@@ -42,13 +42,17 @@ class Renderer:
extensions = getattr(data, "extensions", [None])
for ext in extensions:
output_filename = output
template = data.template
template_to_use = template or data.template
if ext:
output_filename = output_filename.with_suffix(f".{ext}")
template += f"_{ext}"
contents = self._r.render_name(template, data, generator=self._generator)
template_to_use += f"_{ext}"
contents = self.render_str(data, template_to_use)
self._do_write(mnemonic, contents, output_filename)
def render_str(self, data: object, template: typing.Optional[str] = None):
template = template or data.template
return self._r.render_name(template, data, generator=self._generator)
def _do_write(self, mnemonic: str, contents: str, output: pathlib.Path):
with open(output, "w") as out:
out.write(contents)

View File

@@ -76,6 +76,45 @@ def test_render(pystache_renderer, sut):
]
def test_render_provided_template(pystache_renderer, sut):
data = mock.Mock(spec=())
custom_template = object()
text = "some text"
pystache_renderer.render_name.side_effect = (text,)
output = paths.root_dir / "a/some/output.txt"
sut.render(data, output, template=custom_template)
assert_file(output, text)
assert pystache_renderer.mock_calls == [
mock.call.render_name(custom_template, data, generator=generator),
]
def test_render_to_string(pystache_renderer, sut):
data = mock.Mock(spec=("template",))
text = "some text"
pystache_renderer.render_name.side_effect = (text,)
result = sut.render_str(data)
assert result == text
assert pystache_renderer.mock_calls == [
mock.call.render_name(data.template, data, generator=generator),
]
def test_render_to_string_with_provided_template(pystache_renderer, sut):
data = mock.Mock(spec=())
custom_template = object()
text = "some text"
pystache_renderer.render_name.side_effect = (text,)
result = sut.render_str(data, custom_template)
assert result == text
assert pystache_renderer.mock_calls == [
mock.call.render_name(custom_template, data, generator=generator),
]
def test_managed_render(pystache_renderer, sut):
data = mock.Mock(spec=("template",))
text = "some text"