From cf1443cbe259f9a922e0eb70ea06900024770425 Mon Sep 17 00:00:00 2001 From: Zbynek Winkler Date: Mon, 7 Sep 2020 11:45:50 +0200 Subject: [PATCH 1/2] osgar.lib.config: allow overrides in dict merging --- osgar/lib/config.py | 7 +++++++ osgar/lib/test_config.py | 5 ++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/osgar/lib/config.py b/osgar/lib/config.py index 72fe74de1..5a6384ed5 100644 --- a/osgar/lib/config.py +++ b/osgar/lib/config.py @@ -2,6 +2,7 @@ Osgar Config Class """ import json +import numbers import sys from importlib import import_module @@ -53,8 +54,14 @@ def config_load(*filenames, application=None): def merge_dict(dict1, dict2): + simple_types = numbers.Number, str + for t in simple_types: + if isinstance(dict1, t) and isinstance(dict2, t): + return dict2 + if not isinstance(dict1, dict) or not isinstance(dict2, dict): raise MergeConflictError(str((dict1, dict2))) + ret = dict1.copy() for key in dict2.keys(): if key in dict1: diff --git a/osgar/lib/test_config.py b/osgar/lib/test_config.py index 18846ee40..1b1cb2e24 100644 --- a/osgar/lib/test_config.py +++ b/osgar/lib/test_config.py @@ -37,9 +37,8 @@ def test_merge_dict(self): self.assertEqual(merge_dict(dict1, dict2), merge) self.assertEqual(merge_dict({'A':1}, {'A':1}), {'A':1}) - - with self.assertRaises(MergeConflictError) as e: - merge_dict({'A':1}, {'A':2}) + self.assertEqual(merge_dict({'A':1}, {'A':2}), {'A':2}) + self.assertEqual(merge_dict({'A':'a'}, {'A':'b'}), {'A':'b'}) with self.assertRaises(MergeConflictError) as e: merge_dict({'A':{'B':1}}, {'A':2}) From f268208523356cd462381edd34263d8864bf2dd2 Mon Sep 17 00:00:00 2001 From: Zbynek Winkler Date: Wed, 9 Sep 2020 14:46:00 +0200 Subject: [PATCH 2/2] osgar.lib.config: allow list and tupple override --- osgar/lib/config.py | 28 ++++++++++++++-------------- osgar/lib/test_config.py | 2 ++ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/osgar/lib/config.py b/osgar/lib/config.py index 5a6384ed5..7d4a984d7 100644 --- a/osgar/lib/config.py +++ b/osgar/lib/config.py @@ -54,21 +54,21 @@ def config_load(*filenames, application=None): def merge_dict(dict1, dict2): - simple_types = numbers.Number, str - for t in simple_types: - if isinstance(dict1, t) and isinstance(dict2, t): - return dict2 - - if not isinstance(dict1, dict) or not isinstance(dict2, dict): - raise MergeConflictError(str((dict1, dict2))) - ret = dict1.copy() - for key in dict2.keys(): - if key in dict1: - if dict1[key] != dict2[key]: - ret[key] = merge_dict(dict1[key], dict2[key]) - else: - ret[key] = dict2[key] + for key, val2 in dict2.items(): + try: + val1 = dict1[key] + if isinstance(val1, dict) and isinstance(val2, dict): + ret[key] = merge_dict(val1, val2) + else: + for t in numbers.Number, str, list, tuple: + if isinstance(val1, t) and isinstance(val2, t): + ret[key] = val2 + break + else: + raise MergeConflictError(str((val1, val2))) + except KeyError: + ret[key] = val2 return ret # vim: expandtab sw=4 ts=4 diff --git a/osgar/lib/test_config.py b/osgar/lib/test_config.py index 1b1cb2e24..7bbf3d367 100644 --- a/osgar/lib/test_config.py +++ b/osgar/lib/test_config.py @@ -39,6 +39,8 @@ def test_merge_dict(self): self.assertEqual(merge_dict({'A':1}, {'A':1}), {'A':1}) self.assertEqual(merge_dict({'A':1}, {'A':2}), {'A':2}) self.assertEqual(merge_dict({'A':'a'}, {'A':'b'}), {'A':'b'}) + self.assertEqual(merge_dict({'A':[]}, {'A':[1]}), {'A':[1]}) + self.assertEqual(merge_dict({'A':()}, {'A':(1,)}), {'A':(1,)}) with self.assertRaises(MergeConflictError) as e: merge_dict({'A':{'B':1}}, {'A':2})