From da49c0fa6cfeb5e2f61c2ed7fc2ac1a90af70b45 Mon Sep 17 00:00:00 2001 From: "Benjamin W. Smith" Date: Mon, 26 Oct 2009 14:46:03 -0400 Subject: Add some thoughts about a possible Python based DSL for configuration.. --- mrbelvedere_dsl_thoughts.py | 91 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 mrbelvedere_dsl_thoughts.py 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 @@ +# Is this *too* flexible? +# Am I being naive? Doing it wrong? + +from contextlib import contextmanager + +class MissingParameterError(Exception): + + def __init__(self, value): + self.parameter = value + + def __str__(self): + return repr(self.parameter) + +# Something like this for the template backend stuff +class Template(object): + def __init__(self, template_name): + self.template_name = template_name + self.arguments = {} + + def __setattr__(self, attr, value): + if attr in ("arguments", "template_name"): + object.__setattr__(self, attr, value) + else: + self.arguments[attr] = value + + def build(self): + print "Building template %s with arguments: %s" % (self.template_name, self.arguments) + + # Do some validation checking on certain arguments, execute code as needed + # Delete arbitrairy arguments that could be created (but inform the user) + +# Something like this for the service backend stuff +class Service(object): + def __init__(self, service_name): + self.service_name = service_name + self.arguments = {} + + def __setattr__(self, attr, value): + if attr in ("arguments", "service_name"): + object.__setattr__(self, attr, value) + else: + self.arguments[attr] = value + + def build(self): + print "Building service %s with arguments: %s" % (self.service_name, self.arguments) + + # Do some validation checking on certain arguments, execute code as needed + # Delete arbitrairy arguments that could be created (but inform the user) + +# Context manager to kick off the dirty work +@contextmanager +def create_template(name = None): + + if not name: + raise MissingParameterError("Missing template name") + + template = Template(name) + yield template + template.build() + +# Context manager to kick off the dirty work +@contextmanager +def create_service(name = None): + + if not name: + raise MissingParameterError("Missing service name") + + service = Service(name) + yield service + service.build() + +# Services/Templates would look something like this: + +with create_service(name = "network") as service: + + service.description = "Define network stuff" + + service.provides = ['network_guts'] + + +with create_template(name = "test_template") as webserver_template: + + webserver_template.desciption = "Builds web server" + + webserver_template.provides = ['webserver'] + + webserver_template.needs = ['services.network'] + + webserver_template.accounts = ['bsmith', 'mcrute'] + + -- cgit v1.2.3