feat: add util.mako_renderer()
function
This commit is contained in:
parent
4879887cb3
commit
c41d364e03
|
@ -52,12 +52,15 @@ merely a personal convention. You can define tasks however you need::
|
|||
"""
|
||||
|
||||
from fabric import task
|
||||
from wuttamess import apt, sync
|
||||
from wuttamess import apt, sync, util
|
||||
|
||||
|
||||
# nb. this is used below, for file sync
|
||||
root = sync.make_root('files')
|
||||
|
||||
# nb. this is for global mako template context etc.
|
||||
env = {'machine_is_live': False}
|
||||
|
||||
|
||||
@task
|
||||
def bootstrap_all(c):
|
||||
|
@ -74,11 +77,13 @@ merely a personal convention. You can define tasks however you need::
|
|||
"""
|
||||
Bootstrap the base system
|
||||
"""
|
||||
renderers = {'mako': util.mako_renderer(c, env)}
|
||||
|
||||
apt.dist_upgrade(c)
|
||||
|
||||
# postfix
|
||||
apt.install(c, 'postfix')
|
||||
if sync.check_isync(c, root, 'etc/postfix'):
|
||||
if sync.check_isync(c, root, 'etc/postfix', renderers=renderers):
|
||||
c.run('systemctl restart postfix')
|
||||
|
||||
|
||||
|
|
|
@ -31,6 +31,8 @@ requires-python = ">= 3.8"
|
|||
dependencies = [
|
||||
"fabric",
|
||||
"fabsync",
|
||||
"mako",
|
||||
"typing_extensions",
|
||||
]
|
||||
|
||||
|
||||
|
|
|
@ -24,9 +24,46 @@
|
|||
Misc. Utilities
|
||||
"""
|
||||
|
||||
from pathlib import Path
|
||||
from typing_extensions import Any, Mapping
|
||||
|
||||
from mako.template import Template
|
||||
|
||||
|
||||
def exists(c, path):
|
||||
"""
|
||||
Returns ``True`` if given path exists on the host, otherwise ``False``.
|
||||
"""
|
||||
return not c.run(f'test -e {path}', warn=True).failed
|
||||
|
||||
|
||||
def mako_renderer(c, env={}):
|
||||
"""
|
||||
This returns a *function* suitable for use as a ``fabsync`` file
|
||||
renderer. The function assumes the file is a Mako template.
|
||||
|
||||
:param c: Fabric connection.
|
||||
|
||||
:param env: Environment dictionary to be used as Mako template
|
||||
context.
|
||||
|
||||
Typical usage is something like::
|
||||
|
||||
from fabric import task
|
||||
from wuttamess import sync, util
|
||||
|
||||
root = sync.make_root('files')
|
||||
env = {}
|
||||
|
||||
@task
|
||||
def foo(c):
|
||||
|
||||
# define possible renderers for fabsync
|
||||
renderers = {'mako': util.mako_renderer(c, env)}
|
||||
|
||||
sync.check_isync(c, root, 'etc/postfix', renderers=renderers)
|
||||
"""
|
||||
def render(path: Path, vars: Mapping[str, Any], **kwargs) -> bytes:
|
||||
return Template(filename=str(path)).render(**env)
|
||||
|
||||
return render
|
||||
|
|
4
tests/files/bar/_sync.toml
Normal file
4
tests/files/bar/_sync.toml
Normal file
|
@ -0,0 +1,4 @@
|
|||
|
||||
[files."baz"]
|
||||
renderer = 'mako'
|
||||
tags = ['baz']
|
1
tests/files/bar/baz
Normal file
1
tests/files/bar/baz
Normal file
|
@ -0,0 +1 @@
|
|||
machine_is_live = ${machine_is_live}
|
|
@ -1,5 +1,6 @@
|
|||
# -*- coding: utf-8; -*-
|
||||
|
||||
import os
|
||||
from unittest import TestCase
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
|
@ -12,3 +13,14 @@ class TestExists(TestCase):
|
|||
c = MagicMock()
|
||||
mod.exists(c, '/foo')
|
||||
c.run.assert_called_once_with('test -e /foo', warn=True)
|
||||
|
||||
|
||||
class TestMakoRenderer(TestCase):
|
||||
|
||||
def test_basic(self):
|
||||
c = MagicMock()
|
||||
renderer = mod.mako_renderer(c, env={'machine_is_live': True})
|
||||
here = os.path.dirname(__file__)
|
||||
path = os.path.join(here, 'files', 'bar', 'baz')
|
||||
rendered = renderer(path, vars={})
|
||||
self.assertEqual(rendered, 'machine_is_live = True')
|
||||
|
|
Loading…
Reference in a new issue