Update deep_merge_dicts to disallow null-overrides

This commit is contained in:
Matthias 2022-03-18 06:58:22 +01:00
parent b56aab0bdf
commit fdce055061
2 changed files with 21 additions and 7 deletions

View File

@ -129,7 +129,7 @@ def format_ms_time(date: int) -> str:
return datetime.fromtimestamp(date/1000.0).strftime('%Y-%m-%dT%H:%M:%S') return datetime.fromtimestamp(date/1000.0).strftime('%Y-%m-%dT%H:%M:%S')
def deep_merge_dicts(source, destination): def deep_merge_dicts(source, destination, allow_null_overrides: bool = True):
""" """
Values from Source override destination, destination is returned (and modified!!) Values from Source override destination, destination is returned (and modified!!)
Sample: Sample:
@ -142,8 +142,8 @@ def deep_merge_dicts(source, destination):
if isinstance(value, dict): if isinstance(value, dict):
# get node or create one # get node or create one
node = destination.setdefault(key, {}) node = destination.setdefault(key, {})
deep_merge_dicts(value, node) deep_merge_dicts(value, node, allow_null_overrides)
else: elif value is not None or allow_null_overrides:
destination[key] = value destination[key] = value
return destination return destination

View File

@ -1,15 +1,16 @@
# pragma pylint: disable=missing-docstring,C0103 # pragma pylint: disable=missing-docstring,C0103
import datetime import datetime
from copy import deepcopy
from pathlib import Path from pathlib import Path
from unittest.mock import MagicMock from unittest.mock import MagicMock
import pytest import pytest
from freqtrade.misc import (decimals_per_coin, file_dump_json, file_load_json, format_ms_time, from freqtrade.misc import (decimals_per_coin, deep_merge_dicts, file_dump_json, file_load_json,
pair_to_filename, parse_db_uri_for_logging, plural, render_template, format_ms_time, pair_to_filename, parse_db_uri_for_logging, plural,
render_template_with_fallback, round_coin_value, safe_value_fallback, render_template, render_template_with_fallback, round_coin_value,
safe_value_fallback2, shorten_date) safe_value_fallback, safe_value_fallback2, shorten_date)
def test_decimals_per_coin(): def test_decimals_per_coin():
@ -203,3 +204,16 @@ def test_render_template_fallback(mocker):
def test_parse_db_uri_for_logging(conn_url, expected) -> None: def test_parse_db_uri_for_logging(conn_url, expected) -> None:
assert parse_db_uri_for_logging(conn_url) == expected assert parse_db_uri_for_logging(conn_url) == expected
def test_deep_merge_dicts():
a = {'first': {'rows': {'pass': 'dog', 'number': '1', 'test': None}}}
b = {'first': {'rows': {'fail': 'cat', 'number': '5', 'test': 'asdf'}}}
res = {'first': {'rows': {'pass': 'dog', 'fail': 'cat', 'number': '5', 'test': 'asdf'}}}
res2 = {'first': {'rows': {'pass': 'dog', 'fail': 'cat', 'number': '1', 'test': None}}}
assert deep_merge_dicts(b, deepcopy(a)) == res
assert deep_merge_dicts(a, deepcopy(b)) == res2
res2['first']['rows']['test'] = 'asdf'
assert deep_merge_dicts(a, deepcopy(b), allow_null_overrides=False) == res2