Mercurial > hg > config
changeset 193:3efe894f9d79
add a simple example for optparse_undefined
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Fri, 20 Jan 2012 14:15:16 -0800 |
parents | 4b9f353fc416 |
children | 931bc3353f75 |
files | python/optparse_undefined.py |
diffstat | 1 files changed, 49 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/python/optparse_undefined.py Fri Jan 20 14:15:16 2012 -0800 @@ -0,0 +1,49 @@ +#!/usr/bin/env python + +""" +illustrates usage of the undefined pattern from e.g. +http://k0s.org/mozilla/hg/bzconsole/file/tip/bzconsole/command.py + +This is useful for scenarios similar to: +- you have base configuration in a file +- you have an OptionParser to read options in the command line +- the CLI options should overwrite the file configuration iff + the user specifies an option +""" + +from optparse import OptionParser + +class Undefined(object): + def __init__(self, default): + self.default=default + +class UndefinedOptionParser(OptionParser): + + def add_option(self, *args, **kwargs): + kwargs['default'] = Undefined(kwargs.get('default')) + OptionParser.add_option(self, *args, **kwargs) + + def parse_args(self, *args, **kwargs): + options, args = OptionParser.parse_args(self, *args, **kwargs) + return options, args + +if __name__ == '__main__': + + myparser = UndefinedOptionParser() + myparser.add_option("--foo", dest='foo', default='hello') + myparser.add_option("--bar", dest='bar', default='goodbye') + myparser.add_option("--baz", dest='baz', default='helloagain') + myparser.add_option("--fleem", dest='fleem', default='aufwiedersehen') + + myconfiguration = {'foo': 'hi', + 'bar': 'ciao'} + options, args = myparser.parse_args(['--foo', 'hello', '--baz', 'hola']) + for key, value in options.__dict__.items(): + # XXX ideally you would move this to parse_args + if isinstance(value, Undefined): + options.__dict__[key] = myconfiguration.get(key, value.default) + + assert options.foo == 'hello' + assert options.bar == 'ciao' + assert options.baz == 'hola' + assert options.fleem == 'aufwiedersehen'