Skip to content

Commit 4d15acd

Browse files
committed
fix updating params with kwargs
1 parent 3856038 commit 4d15acd

File tree

6 files changed

+49
-15
lines changed

6 files changed

+49
-15
lines changed

routingpy/routers/graphhopper.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -352,8 +352,8 @@ def directions( # noqa: C901
352352

353353
if alternative_route_max_share_factor:
354354
params["alternative_route_max_share_factor"] = alternative_route_max_share_factor
355-
356-
params.update(direction_kwargs)
355+
356+
params = utils.deep_merge_dicts(params, direction_kwargs)
357357

358358
return self.parse_directions_json(
359359
self.client._request("/route", get_params=get_params, post_params=params, dry_run=dry_run),

routingpy/routers/heremaps.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from typing import List, Optional, Tuple, Union
2020

2121
from .. import convert
22+
from .. import utils
2223
from ..client_base import DEFAULT
2324
from ..client_default import Client
2425
from ..direction import Direction, Directions
@@ -769,8 +770,8 @@ def directions( # noqa: C901
769770

770771
if speed_profile is not None:
771772
params["speedProfile"] = speed_profile
772-
773-
params.update(directions_kwargs)
773+
774+
params = utils.deep_merge_dicts(params, directions_kwargs)
774775

775776
return self.parse_direction_json(
776777
self.client._request(
@@ -1072,8 +1073,8 @@ def isochrones( # noqa: C901
10721073

10731074
if speed_profile is not None:
10741075
params["speedProfile"] = speed_profile
1075-
1076-
params.update(isochrones_kwargs)
1076+
1077+
params = utils.deep_merge_dicts(params, isochrones_kwargs)
10771078

10781079
return self.parse_isochrone_json(
10791080
self.client._request(
@@ -1370,7 +1371,7 @@ def matrix( # noqa: C901
13701371
if speed_profile is not None:
13711372
params["speedProfile"] = speed_profile
13721373

1373-
params.update(matrix_kwargs)
1374+
params = utils.deep_merge_dicts(params, matrix_kwargs)
13741375

13751376
return self.parse_matrix_json(
13761377
self.client._request(

routingpy/routers/osrm.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ def get_direction_params(
240240
if overview is not None:
241241
params["overview"] = convert.convert_bool(overview)
242242

243-
params.update(directions_kwargs)
243+
params = utils.deep_merge_dicts(params, directions_kwargs)
244244

245245
return params
246246

@@ -405,8 +405,8 @@ def get_matrix_params(
405405

406406
if annotations:
407407
params["annotations"] = convert.delimit_list(annotations)
408-
409-
params.update(matrix_kwargs)
408+
409+
params = utils.deep_merge_dicts(params, matrix_kwargs)
410410

411411
return params
412412

routingpy/routers/valhalla.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ def get_direction_params(
252252
params["id"] = id
253253

254254
# update with kw args
255-
params.update(kwargs)
255+
params = utils.deep_merge_dicts(params, kwargs)
256256

257257
return params
258258

@@ -460,7 +460,7 @@ def get_isochrone_params( # noqa: C901
460460
if id:
461461
params["id"] = id
462462

463-
params.update(kwargs)
463+
params = utils.deep_merge_dicts(params, kwargs)
464464

465465
return params
466466

@@ -623,7 +623,7 @@ def get_matrix_params(
623623
if id:
624624
params["id"] = id
625625

626-
params.update(kwargs)
626+
params = utils.deep_merge_dicts(params, kwargs)
627627

628628
return params
629629

@@ -743,7 +743,7 @@ def get_expansion_params(
743743
if expansion_properties:
744744
params["expansion_properties"] = expansion_properties
745745

746-
params.update(kwargs)
746+
params = utils.deep_merge_dicts(params, kwargs)
747747

748748
return params
749749

@@ -846,7 +846,7 @@ def get_trace_attributes_params(
846846
if options:
847847
params["costing_options"][profile] = options
848848

849-
params.update(kwargs)
849+
params = utils.deep_merge_dicts(params, kwargs)
850850

851851
return params
852852

routingpy/utils.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,26 @@ def get_ordinal(number):
125125
return "th"
126126

127127

128+
def deep_merge_dicts(d1: dict, d2: dict) -> dict:
129+
"""
130+
Recursively deep merges two dictionaries.
131+
Values from d2 will overwrite or be merged into d1.
132+
"""
133+
result = d1.copy() # Start with a shallow copy of dict1
134+
for key, value in d2.items():
135+
if (
136+
key in result
137+
and isinstance(result[key], dict)
138+
and isinstance(value, dict)
139+
):
140+
# Both values are dicts: recurse
141+
result[key] = deep_merge_dicts(result[key], value)
142+
else:
143+
# Otherwise, override or add
144+
result[key] = value
145+
return result
146+
147+
128148
def _get_coords(lat, lng, factor, order="lnglat"):
129149
"""Determines coordinate order."""
130150
if order not in ("lnglat", "latlng"):

tests/test_utils.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,16 @@ def test_get_ordinal(self):
5252
self.assertEqual(utils.get_ordinal(1), "st")
5353
self.assertEqual(utils.get_ordinal(2), "nd")
5454
self.assertEqual(utils.get_ordinal(3), "rd")
55+
56+
def test_deep_merge_dicts(self):
57+
d = {}
58+
d = utils.deep_merge_dicts(d, {'k': 'v'})
59+
self.assertEqual(d, {'k': 'v'})
60+
d = utils.deep_merge_dicts(d, {'k': {'k1': 1, 'k2': 2}})
61+
self.assertEqual(d, {'k': {'k1': 1, 'k2': 2}})
62+
d = utils.deep_merge_dicts(d, {'k': {'k1': 0, }})
63+
self.assertEqual(d, {'k': {'k1': 0, 'k2': 2}})
64+
d = utils.deep_merge_dicts(d, {'l': []})
65+
self.assertEqual(d, {'k': {'k1': 0, 'k2': 2}, 'l': []})
66+
d = utils.deep_merge_dicts(d, {'l': [1]})
67+
self.assertEqual(d, {'k': {'k1': 0, 'k2': 2}, 'l': [1]})

0 commit comments

Comments
 (0)