Package: deconf
deconf======An object system for building declarative configurations in Python.A class that has rich(ish) keyword-parameter handling, including[explicit handling of required parameters](https://github.com/dustinlacewell/deconf#pass-through-parameters),[declaration of parameter dependencies](https://github.com/dustinlacewell/deconf#dependency-parameters) and[basic type-checking](https://github.com/dustinlacewell/deconf#type-checked-parameters).Keyword parameter processing will be performed for any method on the`Deconfigurable` that is decorated with the `@parameter` decorator. Each of thesedecorated methods performs the processing specific to that parameter. Thereturned value is then assigned on the appropriately named attribute.>>> @parameter('foo')>>> def handle_foo(self, value):...    return valuePass-Through Parameters:------------------------If your parameter doesn't require any special treatment and should simplybe stored on the Deconfigurable a shorthand can be used. Simply decoratea parameter method that passes, and `value` will be used as is.>>> @parameter('foo')>>> def handle_foo(self, value):...    passRequired Parameters:--------------------Parameters are required by default. This means that a `RequiredParameterError`will be raised if the `Deconfigurable.__init__` doesn't recieve the designatednamed argument.Passing `default=` to `@parameter` will prevent the parameter fromraising `RequiredParameterError` if the parameter isn't provided a value.>>> @parameter('foo', default='bar')>>> def handle_foo(self, value):...    passType-Checked Parameters:------------------------A basic mechanism is supplied for ensuring that the passed parameter valueis of a specific type. By supplying a type value to the `@parameter`'s`ensure_type` keyword arguement any value passed in will be validated withan *isinstance check*.>>> @parameter('bars', ensure_type=list)>>> def handle_bars(self, value):...     passDependency Parameters:----------------------Sometimes we will want to defer processing of a parameter until some otherparameter has been processed first. To do so, simply pass a list ofdependencies, `depends_on`, to `@parameter`.>>> @parameter('foo')>>> def handle_foo(self, foo):...    pass>>> @parameter('bar', depends_on=('foo', ))>>> def handle_bar(self, bar):...     # offset bar by foo...     return bar + self.fooContrived Example:------------------class Person(Deconfigurable):@staticmethoddef format_name(cls, name):return name.strip().lower().capitalize()@parameter('first_name', ensure_type=str)def handle_first(self, name):return Person.format_name(name)@parameter('last_name', ensure_type=str)def handle_last(self, name):return Person.format_name(name)@parameter('age', ensure_type=int)def handle_age(self, value): pass@parameter('registered_to_vote', ensure_type=bool, depends_on=('age',))def handle_vote(self, value):if self.age < 18:value = Falsereturn value>>> me = Person(...    first_name='Dustin',...    last_name='Lacewell',...    age=25, registered_to_vote=True,... )>>> print me.first_name, ' can vote: ', me.registered_to_voteDustin can vote: True>>> kid = Person(...    first_name='Some Kid',...    last_name='Smith',...    age=12, registered_to_vote=True,... )>>> print kid.first_name, ' can vote: ', kid.registered_to_voteSomeKid can vote: FalseExample from Spidersilk (twisted.web config lib):-------from twisted.web.static import Filefrom twisted.web.proxy import ReverseProxyResourcefrom spidersilk import Domain, Httpdapplication = Httpd(port = 80,default = 'ldlework.com',domains = [Domain(hostname='ldlework.com',resource=File('/var/txweb/ldlework.com'),),Domain(hostname='lichen.ldlework.com',resource=ReverseProxyResource('localhost', 8088, ''),),],)Where Domain is implemented as:class Domain(Deconfigurable):@parameter('hostname', ensure_type=str)def _arg_hostname(self, hostname):pass@parameter('resource', ensure_type=twisted.web.resource.Resource)def _arg_resource(self, resource):pass