Coverage for src/hods/config/hooks.py: 100.00%
Shortcuts on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
Shortcuts on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1"""hods - home directory synchronization.
3Copyright (C) 2016-2020 Mathias Stelzer <knoppo@rolln.de>
5hods is free software: you can redistribute it and/or modify
6it under the terms of the GNU General Public License as published by
7the Free Software Foundation, either version 3 of the License, or
8(at your option) any later version.
10hods is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13GNU General Public License for more details.
15You should have received a copy of the GNU General Public License
16along with this program. If not, see <http://www.gnu.org/licenses/>.
17"""
18from hods.utils import run
21class Script:
22 """A runnable string descriptor."""
24 def __init__(self, hook, name, content=''):
25 """Initialize script."""
26 self.hook = hook
27 self.name = name
28 self.content = content
30 def __str__(self):
31 """Return the content as string representation."""
32 return self.content
34 def run(self):
35 """Run this script in a shell.
37 Returns: The completed process information
39 Raises:
40 subprocess.CalledProcessError: If the script returns a non-zero exitcode.
41 """
42 script = self.content.strip()
43 if not script:
44 return
45 return run(script, shell=True)
48class Hook:
49 """A container to access and store pre- and post- hook sequences."""
51 def __init__(self, hooks, name):
52 """Initialize hook."""
53 self.hooks = hooks
54 self.name = name
56 self.pre = Script(self, 'pre')
57 self.post = Script(self, 'post')
59 def load(self, data):
60 """Load given data for this instance."""
61 self.pre.content = data.get('pre', '')
62 self.post.content = data.get('post', '')
64 def as_dict(self):
65 """Return `dict` to store this instance."""
66 return {
67 'pre': self.pre.content,
68 'post': self.post.content,
69 }
72class Hooks:
73 """A container to access and store hooks for a feature."""
75 def __init__(self, feature, *hooks):
76 """Initialize feature hooks."""
77 self.feature = feature
79 self.names = list(hooks)
81 for name in hooks:
82 hook = Hook(self, name)
83 setattr(self, name, hook)
85 def __iter__(self):
86 """Generate `Hook` instances in this container."""
87 for name in self.names:
88 yield getattr(self, name)
90 def load(self, data):
91 """Load given data for this instance."""
92 for hook in self:
93 hook.load(data.get(hook.name, {}))
95 def as_dict(self):
96 """Return `dict` to store this instance."""
97 return {h.name: h.as_dict() for h in self}