# HG changeset patch # User Ludovic Chabant # Date 1509342401 25200 # Node ID 7e51d14097cb4e34a5f508902aca4070a7cc635e # Parent 84fc72a17f7ac6e8b238514d289dcb082caa9749 config: Properly pass the merge mode to the `merge_dicts` function. diff -r 84fc72a17f7a -r 7e51d14097cb piecrust/configuration.py --- a/piecrust/configuration.py Tue Oct 17 01:11:54 2017 -0700 +++ b/piecrust/configuration.py Sun Oct 29 22:46:41 2017 -0700 @@ -83,6 +83,7 @@ "Unsupported value type to merge: %s" % type(other)) merge_dicts(self._values, other_values, + mode=mode, validator=self._validateValue) def validateTypes(self, allowed_types=default_allowed_types): diff -r 84fc72a17f7a -r 7e51d14097cb tests/test_configuration.py --- a/tests/test_configuration.py Tue Oct 17 01:11:54 2017 -0700 +++ b/tests/test_configuration.py Sun Oct 29 22:46:41 2017 -0700 @@ -1,16 +1,16 @@ import copy -import datetime import yaml import pytest from collections import OrderedDict -from piecrust.configuration import (Configuration, ConfigurationLoader, - merge_dicts) +from piecrust.configuration import ( + Configuration, ConfigurationLoader, merge_dicts, + MERGE_APPEND_LISTS, MERGE_PREPEND_LISTS, MERGE_OVERWRITE_VALUES) @pytest.mark.parametrize('values, expected', [ - (None, {}), - ({'foo': 'bar'}, {'foo': 'bar'}) - ]) + (None, {}), + ({'foo': 'bar'}, {'foo': 'bar'}) +]) def test_config_init(values, expected): config = Configuration(values) assert config.getAll() == expected @@ -33,12 +33,12 @@ def test_config_get_and_set_nested(): config = Configuration({ - 'foo': [4, 2], - 'bar': { - 'child1': 'one', - 'child2': 'two' - } - }) + 'foo': [4, 2], + 'bar': { + 'child1': 'one', + 'child2': 'two' + } + }) assert config.get('foo') == [4, 2] assert config.get('bar/child1') == 'one' assert config.get('bar/child2') == 'two' @@ -81,16 +81,18 @@ @pytest.mark.parametrize('local, incoming, expected', [ - ({}, {}, {}), - ({'foo': 'bar'}, {}, {'foo': 'bar'}), - ({}, {'foo': 'bar'}, {'foo': 'bar'}), - ({'foo': 'bar'}, {'foo': 'other'}, {'foo': 'other'}), - ({'foo': [1, 2]}, {'foo': [3]}, {'foo': [3, 1, 2]}), - ({'foo': [1, 2]}, {'foo': 'bar'}, {'foo': 'bar'}), - ({'foo': {'bar': 1, 'baz': 2}}, {'foo': 'bar'}, {'foo': 'bar'}), - ({'foo': {'bar': 1, 'baz': 2}}, {'foo': {'other': 3}}, {'foo': {'bar': 1, 'baz': 2, 'other': 3}}), - ({'foo': {'bar': 1, 'baz': 2}}, {'foo': {'baz': 10}}, {'foo': {'bar': 1, 'baz': 10}}) - ]) + ({}, {}, {}), + ({'foo': 'bar'}, {}, {'foo': 'bar'}), + ({}, {'foo': 'bar'}, {'foo': 'bar'}), + ({'foo': 'bar'}, {'foo': 'other'}, {'foo': 'other'}), + ({'foo': [1, 2]}, {'foo': [3]}, {'foo': [3, 1, 2]}), + ({'foo': [1, 2]}, {'foo': 'bar'}, {'foo': 'bar'}), + ({'foo': {'bar': 1, 'baz': 2}}, {'foo': 'bar'}, {'foo': 'bar'}), + ({'foo': {'bar': 1, 'baz': 2}}, {'foo': {'other': 3}}, + {'foo': {'bar': 1, 'baz': 2, 'other': 3}}), + ({'foo': {'bar': 1, 'baz': 2}}, {'foo': {'baz': 10}}, + {'foo': {'bar': 1, 'baz': 10}}) +]) def test_merge_dicts(local, incoming, expected): local2 = copy.deepcopy(local) merge_dicts(local2, incoming) @@ -99,32 +101,50 @@ def test_config_merge(): config = Configuration({ - 'foo': [4, 2], - 'bar': { - 'child1': 'one', - 'child2': 'two' - } - }) + 'foo': [4, 2], + 'bar': { + 'child1': 'one', + 'child2': 'two' + } + }) other = Configuration({ - 'baz': True, - 'blah': 'blah blah', - 'bar': { - 'child1': 'other one', - 'child10': 'ten' - } - }) + 'baz': True, + 'blah': 'blah blah', + 'bar': { + 'child1': 'other one', + 'child10': 'ten' + } + }) config.merge(other) expected = { - 'foo': [4, 2], - 'baz': True, - 'blah': 'blah blah', - 'bar': { - 'child1': 'other one', - 'child2': 'two', - 'child10': 'ten' - } - } + 'foo': [4, 2], + 'baz': True, + 'blah': 'blah blah', + 'bar': { + 'child1': 'other one', + 'child2': 'two', + 'child10': 'ten' + } + } + assert config.getAll() == expected + + +@pytest.mark.parametrize('mode, expected', [ + (MERGE_APPEND_LISTS, + {'foo': [4, 2, 1, 0], 'bar': 'something'}), + (MERGE_PREPEND_LISTS, + {'foo': [1, 0, 4, 2], 'bar': 'something'}), + (MERGE_OVERWRITE_VALUES, + {'foo': [4, 2], 'bar': 'other thing'}) +]) +def test_config_merge_with_mode(mode, expected): + config = Configuration({ + 'foo': [4, 2], + 'bar': 'something' + }) + other = {'foo': [1, 0], 'bar': 'other thing'} + config.merge(other, mode=mode) assert config.getAll() == expected