def test_override(self): """ Overrides work as expected. """ default = { 'value1': 'foo', 'list': [ 'foo' ], 'dict': { 'value2': 'foo', 'value3': 'foo' }, } override = { 'value1': 'bar', 'list': [ 'bar' ], 'dict': { 'value2': 'bar', 'value4': 'bar' }, } merged = merge(default, override) # primitive values are replaced self.assertEqual('bar', merged['value1']) # lists are replaced self.assertEqual(['bar'], merged['list']) # dictionaries are recursively merged self.assertEqual('bar', merged['dict']['value2']) self.assertEqual('foo', merged['dict']['value3']) self.assertEqual('bar', merged['dict']['value4'])
def test_override(self): """ Overrides work as expected. """ default = { 'value1': 'foo', 'list': ['foo'], 'dict': { 'value2': 'foo', 'value3': 'foo' }, } override = { 'value1': 'bar', 'list': ['bar'], 'dict': { 'value2': 'bar', 'value4': 'bar' }, } merged = merge(default, override) # primitive values are replaced self.assertEqual('bar', merged['value1']) # lists are replaced self.assertEqual(['bar'], merged['list']) # dictionaries are recursively merged self.assertEqual('bar', merged['dict']['value2']) self.assertEqual('foo', merged['dict']['value3']) self.assertEqual('bar', merged['dict']['value4'])
def test_no_inputs(self): """ Sane results if no inputs are provided. """ merged = merge() self.assertEquals(merged, {})
def test_no_overrride(self): """ Sane results if no overrides are provided. """ default = {'foo': 'bar'} merged = merge(default) self.assertEquals(merged, default)
def test_no_overrride(self): """ Sane results if no overrides are provided. """ default = { 'foo' : 'bar' } merged = merge(default) self.assertEquals(merged, default)
def test_override_custom(self): """ Custom append() and prepend() lists append and prepend to the origin using N-ary merge. """ default = {'list': ['two']} override1 = {'list': append('three', 'four')} override2 = {'list': prepend('one')} merged = merge(default, override1, override2) self.assertEquals(merged['list'], ['one', 'two', 'three', 'four'])
def __call__(self, componentdef): """ Load the data for the current configuration. :param component: a component definition. """ is_not_none = lambda x: x is not None module_names = filter(is_not_none, self._list_modules(componentdef)) load_module = lambda module_name: import_configuration(module_name, self.data_dir) module_dicts = map(load_module, module_names) confab_data = dict(confab=dict(environment=componentdef.environment, host=componentdef.host, component=componentdef.name)) return merge(confab_data, *module_dicts)
def test_override_custom(self): """ Custom append() and prepend() lists append and prepend to the origin using N-ary merge. """ default = { 'list': [ 'two' ] } override1 = { 'list': append('three', 'four') } override2 = { 'list': prepend('one') } merged = merge(default, override1, override2) self.assertEquals(merged['list'], ['one', 'two', 'three', 'four'])
def __call__(self, componentdef): """ Load the data for the current configuration. :param component: a component definition. """ def load_modules(): for scope, module_name in self._list_modules(componentdef): yield import_configuration(module_name, *self.data_dirs, scope=scope) if not self._ignore_hooks: for hook in hooks.for_scope(scope): if hook.filter(componentdef): yield hook(module_name) confab_data = dict(confab=dict(environment=componentdef.environment, host=componentdef.host, role=componentdef.role, component=componentdef.name)) return merge(confab_data, *load_modules())
def load_data_from_dir(data_dir): """ Load and merge configuration data. Configuration data is loaded from python files by type, where type is defined to include defaults, per-environment values, per-role values and per-host values. """ is_not_none = lambda x: x is not None module_names = filter(is_not_none, [ 'default', _get_environment_module(), _get_role_module(), _get_host_module() ]) load_module = lambda module_name: import_configuration(module_name, data_dir) module_dicts = filter(is_not_none, map(load_module, module_names)) return merge(*module_dicts)
def __call__(self, component): """ Load the data for the given component. :param component: a component path, i.e. `{role}/{sub-component}/{component}`. """ is_not_none = lambda x: x is not None module_names = filter(is_not_none, chain(['default'], _get_component_modules(component), [_get_environment_module(), _get_host_module()])) load_module = lambda module_name: import_configuration(module_name, self.data_dir) module_dicts = filter(is_not_none, map(load_module, module_names)) confab_data = dict(confab=dict(environment=options.get_environmentname(), host=options.get_hostname(), component=component)) return merge(confab_data, *module_dicts)
def check_override(self, default, override, expected=None): merged = merge(default, override) self.assertEqual(merged, expected or default)