diff options
author | Benjamin W. Smith <benjaminwarfield@just-another.net> | 2009-10-26 14:46:03 -0400 |
---|---|---|
committer | Benjamin W. Smith <benjaminwarfield@just-another.net> | 2009-10-26 14:46:03 -0400 |
commit | da49c0fa6cfeb5e2f61c2ed7fc2ac1a90af70b45 (patch) | |
tree | 096de2f74b8442cddebfe326e0907f7da5079110 | |
parent | a957418489e9d8068628440c66488825496fcbc9 (diff) | |
download | mrbelvedere-da49c0fa6cfeb5e2f61c2ed7fc2ac1a90af70b45.tar.bz2 mrbelvedere-da49c0fa6cfeb5e2f61c2ed7fc2ac1a90af70b45.tar.xz mrbelvedere-da49c0fa6cfeb5e2f61c2ed7fc2ac1a90af70b45.zip |
Add some thoughts about a possible Python based DSL for configuration..
-rw-r--r-- | mrbelvedere_dsl_thoughts.py | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/mrbelvedere_dsl_thoughts.py b/mrbelvedere_dsl_thoughts.py new file mode 100644 index 0000000..3310e65 --- /dev/null +++ b/mrbelvedere_dsl_thoughts.py | |||
@@ -0,0 +1,91 @@ | |||
1 | # Is this *too* flexible? | ||
2 | # Am I being naive? Doing it wrong? | ||
3 | |||
4 | from contextlib import contextmanager | ||
5 | |||
6 | class MissingParameterError(Exception): | ||
7 | |||
8 | def __init__(self, value): | ||
9 | self.parameter = value | ||
10 | |||
11 | def __str__(self): | ||
12 | return repr(self.parameter) | ||
13 | |||
14 | # Something like this for the template backend stuff | ||
15 | class Template(object): | ||
16 | def __init__(self, template_name): | ||
17 | self.template_name = template_name | ||
18 | self.arguments = {} | ||
19 | |||
20 | def __setattr__(self, attr, value): | ||
21 | if attr in ("arguments", "template_name"): | ||
22 | object.__setattr__(self, attr, value) | ||
23 | else: | ||
24 | self.arguments[attr] = value | ||
25 | |||
26 | def build(self): | ||
27 | print "Building template %s with arguments: %s" % (self.template_name, self.arguments) | ||
28 | |||
29 | # Do some validation checking on certain arguments, execute code as needed | ||
30 | # Delete arbitrairy arguments that could be created (but inform the user) | ||
31 | |||
32 | # Something like this for the service backend stuff | ||
33 | class Service(object): | ||
34 | def __init__(self, service_name): | ||
35 | self.service_name = service_name | ||
36 | self.arguments = {} | ||
37 | |||
38 | def __setattr__(self, attr, value): | ||
39 | if attr in ("arguments", "service_name"): | ||
40 | object.__setattr__(self, attr, value) | ||
41 | else: | ||
42 | self.arguments[attr] = value | ||
43 | |||
44 | def build(self): | ||
45 | print "Building service %s with arguments: %s" % (self.service_name, self.arguments) | ||
46 | |||
47 | # Do some validation checking on certain arguments, execute code as needed | ||
48 | # Delete arbitrairy arguments that could be created (but inform the user) | ||
49 | |||
50 | # Context manager to kick off the dirty work | ||
51 | @contextmanager | ||
52 | def create_template(name = None): | ||
53 | |||
54 | if not name: | ||
55 | raise MissingParameterError("Missing template name") | ||
56 | |||
57 | template = Template(name) | ||
58 | yield template | ||
59 | template.build() | ||
60 | |||
61 | # Context manager to kick off the dirty work | ||
62 | @contextmanager | ||
63 | def create_service(name = None): | ||
64 | |||
65 | if not name: | ||
66 | raise MissingParameterError("Missing service name") | ||
67 | |||
68 | service = Service(name) | ||
69 | yield service | ||
70 | service.build() | ||
71 | |||
72 | # Services/Templates would look something like this: | ||
73 | |||
74 | with create_service(name = "network") as service: | ||
75 | |||
76 | service.description = "Define network stuff" | ||
77 | |||
78 | service.provides = ['network_guts'] | ||
79 | |||
80 | |||
81 | with create_template(name = "test_template") as webserver_template: | ||
82 | |||
83 | webserver_template.desciption = "Builds web server" | ||
84 | |||
85 | webserver_template.provides = ['webserver'] | ||
86 | |||
87 | webserver_template.needs = ['services.network'] | ||
88 | |||
89 | webserver_template.accounts = ['bsmith', 'mcrute'] | ||
90 | |||
91 | |||