mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-03-23 08:38:22 +03:00
ensure deep_merge replaces existing list values when override is true
This commit is contained in:
parent
23a5705c9c
commit
74e04c07bd
@ -22,3 +22,32 @@ class TestHttpApp(BaseTestHttp):
|
|||||||
response = client.get("/stats")
|
response = client.get("/stats")
|
||||||
response_json = response.json()
|
response_json = response.json()
|
||||||
assert response_json == self.test_stats
|
assert response_json == self.test_stats
|
||||||
|
|
||||||
|
def test_config_set_in_memory_replaces_objects_track_list(self):
|
||||||
|
self.minimal_config["cameras"]["front_door"]["objects"] = {
|
||||||
|
"track": ["person", "car"],
|
||||||
|
}
|
||||||
|
app = super().create_app()
|
||||||
|
app.config_publisher = Mock()
|
||||||
|
|
||||||
|
with AuthTestClient(app) as client:
|
||||||
|
response = client.put(
|
||||||
|
"/config/set",
|
||||||
|
json={
|
||||||
|
"requires_restart": 0,
|
||||||
|
"skip_save": True,
|
||||||
|
"update_topic": "config/cameras/front_door/objects",
|
||||||
|
"config_data": {
|
||||||
|
"cameras": {
|
||||||
|
"front_door": {
|
||||||
|
"objects": {
|
||||||
|
"track": ["person"],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
assert response.status_code == 200
|
||||||
|
assert app.frigate_config.cameras["front_door"].objects.track == ["person"]
|
||||||
|
|||||||
@ -151,6 +151,22 @@ class TestConfig(unittest.TestCase):
|
|||||||
frigate_config = FrigateConfig(**config)
|
frigate_config = FrigateConfig(**config)
|
||||||
assert "dog" in frigate_config.cameras["back"].objects.track
|
assert "dog" in frigate_config.cameras["back"].objects.track
|
||||||
|
|
||||||
|
def test_deep_merge_override_replaces_list_values(self):
|
||||||
|
base = {"objects": {"track": ["person", "face"]}}
|
||||||
|
update = {"objects": {"track": ["person"]}}
|
||||||
|
|
||||||
|
merged = deep_merge(base, update, override=True)
|
||||||
|
|
||||||
|
assert merged["objects"]["track"] == ["person"]
|
||||||
|
|
||||||
|
def test_deep_merge_merge_lists_still_appends(self):
|
||||||
|
base = {"track": ["person"]}
|
||||||
|
update = {"track": ["face"]}
|
||||||
|
|
||||||
|
merged = deep_merge(base, update, override=True, merge_lists=True)
|
||||||
|
|
||||||
|
assert merged["track"] == ["person", "face"]
|
||||||
|
|
||||||
def test_override_birdseye(self):
|
def test_override_birdseye(self):
|
||||||
config = {
|
config = {
|
||||||
"mqtt": {"host": "mqtt"},
|
"mqtt": {"host": "mqtt"},
|
||||||
|
|||||||
@ -84,7 +84,8 @@ def deep_merge(dct1: dict, dct2: dict, override=False, merge_lists=False) -> dic
|
|||||||
"""
|
"""
|
||||||
:param dct1: First dict to merge
|
:param dct1: First dict to merge
|
||||||
:param dct2: Second dict to merge
|
:param dct2: Second dict to merge
|
||||||
:param override: if same key exists in both dictionaries, should override? otherwise ignore. (default=True)
|
:param override: if same key exists in both dictionaries, should override? otherwise ignore.
|
||||||
|
:param merge_lists: if True, lists will be merged.
|
||||||
:return: The merge dictionary
|
:return: The merge dictionary
|
||||||
"""
|
"""
|
||||||
merged = copy.deepcopy(dct1)
|
merged = copy.deepcopy(dct1)
|
||||||
@ -96,6 +97,8 @@ def deep_merge(dct1: dict, dct2: dict, override=False, merge_lists=False) -> dic
|
|||||||
elif isinstance(v1, list) and isinstance(v2, list):
|
elif isinstance(v1, list) and isinstance(v2, list):
|
||||||
if merge_lists:
|
if merge_lists:
|
||||||
merged[k] = v1 + v2
|
merged[k] = v1 + v2
|
||||||
|
elif override:
|
||||||
|
merged[k] = copy.deepcopy(v2)
|
||||||
else:
|
else:
|
||||||
if override:
|
if override:
|
||||||
merged[k] = copy.deepcopy(v2)
|
merged[k] = copy.deepcopy(v2)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user