Implements configurables and options to create cleaner transformation classes, and ease documentation of available options.

This commit is contained in:
Romain Dorgueil
2017-01-16 16:22:13 +01:00
parent cf4c7b9817
commit b6e84c66e3
4 changed files with 144 additions and 0 deletions

View File

@ -0,0 +1,76 @@
import pytest
from bonobo import Configurable, Option
class MyConfigurable(Configurable):
required_str = Option(str, required=True)
default_str = Option(str, default='foo')
integer = Option(int)
class MyHarderConfigurable(MyConfigurable):
also_required = Option(bool, required=True)
class MyBetterConfigurable(MyConfigurable):
required_str = Option(str, required=False, default='kaboom')
def test_missing_required_option_error():
with pytest.raises(TypeError) as exc:
MyConfigurable()
assert exc.match('missing 1 required option:')
def test_missing_required_options_error():
with pytest.raises(TypeError) as exc:
MyHarderConfigurable()
assert exc.match('missing 2 required options:')
def test_extraneous_option_error():
with pytest.raises(TypeError) as exc:
MyConfigurable(required_str='foo', hello='world')
assert exc.match('got 1 unexpected option:')
def test_extraneous_options_error():
with pytest.raises(TypeError) as exc:
MyConfigurable(required_str='foo', hello='world', acme='corp')
assert exc.match('got 2 unexpected options:')
def test_defaults():
o = MyConfigurable(required_str='hello')
assert o.required_str == 'hello'
assert o.default_str == 'foo'
assert o.integer == None
def test_str_type_factory():
o = MyConfigurable(required_str=42)
assert o.required_str == '42'
assert o.default_str == 'foo'
assert o.integer == None
def test_int_type_factory():
o = MyConfigurable(required_str='yo', default_str='bar', integer='42')
assert o.required_str == 'yo'
assert o.default_str == 'bar'
assert o.integer == 42
def test_bool_type_factory():
o = MyHarderConfigurable(required_str='yes', also_required='True')
assert o.required_str == 'yes'
assert o.default_str == 'foo'
assert o.integer == None
assert o.also_required == True
def test_option_resolution_order():
o = MyBetterConfigurable()
assert o.required_str == 'kaboom'
assert o.default_str == 'foo'
assert o.integer == None