Skip to content

Commit 7709fbc

Browse files
committed
Adds handling for sort and propertySelector (beta) parameters
Cleans up some handling code for snake_case variant parameters Adds tests for the above
1 parent a1962d0 commit 7709fbc

File tree

2 files changed

+76
-12
lines changed

2 files changed

+76
-12
lines changed

mygeotab/parameters.py

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
import re
1111
from copy import copy
12-
from typing import Any
12+
from typing import Any, Optional
1313

1414

1515
def camelcaseify_parameters(parameters: dict[str, Any]) -> dict[str, Any]:
@@ -37,8 +37,8 @@ def camelcaseify_parameters(parameters: dict[str, Any]) -> dict[str, Any]:
3737
def convert_get_parameters(parameters: dict[str, Any]) -> dict[str, Any]:
3838
"""Converts parameters passed into a get() call to a format suitable for the MyGeotab API.
3939
It detects if a 'search' dictionary is passed and flattens it into the top-level parameters.
40-
It also detects 'resultsLimit' or 'results_limit' and removes it from the parameters
41-
so it doesn't become part of the search.
40+
It also detects 'resultsLimit'/'results_limit' or 'sort' parameters and removes them from the parameters
41+
so they doesn't become part of the search.
4242
4343
:param parameters: The parameters object.
4444
:type parameters: dict
@@ -48,18 +48,33 @@ def convert_get_parameters(parameters: dict[str, Any]) -> dict[str, Any]:
4848
if not parameters:
4949
return dict()
5050

51-
results_limit = parameters.get("resultsLimit")
52-
if results_limit is not None:
53-
del parameters["resultsLimit"]
54-
else:
55-
results_limit = parameters.get("results_limit")
56-
if results_limit is not None:
57-
del parameters["results_limit"]
51+
parameters = copy(parameters)
52+
53+
results_limit_param = _try_extract_get_parameter(parameters, "resultsLimit", "results_limit")
54+
property_selector_param = _try_extract_get_parameter(parameters, "propertySelector", "property_selector")
55+
sort_param = _try_extract_get_parameter(parameters, "sort")
5856

5957
if "search" in parameters:
6058
parameters.update(parameters["search"])
6159
del parameters["search"]
60+
6261
result = {"search": parameters}
63-
if results_limit is not None:
64-
result["resultsLimit"] = results_limit
62+
if results_limit_param is not None:
63+
result["resultsLimit"] = results_limit_param
64+
if property_selector_param is not None:
65+
result["propertySelector"] = property_selector_param
66+
if sort_param is not None:
67+
result["sort"] = sort_param
6568
return result
69+
70+
71+
def _try_extract_get_parameter(parameters: dict[str, Any], name: str, pythonic_name: Optional[str] = None) -> Any | None:
72+
"""Helper to get a parameter from a dictionary, returning None if it doesn't exist."""
73+
parameter = parameters.get(name)
74+
if parameter is not None:
75+
del parameters[name]
76+
elif pythonic_name is not None:
77+
parameter = parameters.get(pythonic_name)
78+
if parameter is not None:
79+
del parameters[pythonic_name]
80+
return parameter

tests/test_parameters.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,52 @@ def test_convert_get_parameters_removes_results_limit_from_search():
7878
assert "resultsLimit" in result
7979
assert result["resultsLimit"] == 7
8080
assert "results_limit" not in result["search"]
81+
82+
83+
def test_convert_get_parameters_with_sort():
84+
params = {
85+
"search": {"foo": "bar"},
86+
"sort": {"sortBy": "name", "sortDirection": "asc", "offset": "Delivery Truck 12", "lastId": "b1234"},
87+
}
88+
result = convert_get_parameters(params)
89+
assert "sort" in result
90+
assert isinstance(result["sort"], dict)
91+
assert result["sort"]["sortBy"] == "name"
92+
assert result["sort"]["sortDirection"] == "asc"
93+
assert result["sort"]["offset"] == "Delivery Truck 12"
94+
assert result["sort"]["lastId"] == "b1234"
95+
96+
97+
def test_convert_get_parameters_with_property_selector():
98+
params = {"search": {"foo": "bar"}, "propertySelector": {"fields": ["id", "name"], "isIncluded": True}}
99+
result = convert_get_parameters(params)
100+
assert "propertySelector" in result
101+
assert isinstance(result["propertySelector"], dict)
102+
assert "fields" in result["propertySelector"]
103+
assert "isIncluded" in result["propertySelector"]
104+
105+
106+
def test_convert_get_parameters_with_property_selector_snake_case():
107+
params = {"search": {"foo": "bar"}, "property_selector": {"fields": ["id", "name"], "isIncluded": True}}
108+
result = convert_get_parameters(params)
109+
assert "propertySelector" in result
110+
assert isinstance(result["propertySelector"], dict)
111+
assert "fields" in result["propertySelector"]
112+
assert "isIncluded" in result["propertySelector"]
113+
114+
115+
def test_convert_get_parameters_with_sort_and_property_selector():
116+
params = {
117+
"search": {"foo": "bar"},
118+
"sort": {"sortBy": "name", "sortDirection": "asc", "offset": "Delivery Truck 12", "lastId": "b1234"},
119+
"property_selector": {"fields": ["id", "status"], "isIncluded": True},
120+
}
121+
result = convert_get_parameters(params)
122+
assert "sort" in result
123+
assert result["sort"]["sortBy"] == "name"
124+
assert result["sort"]["sortDirection"] == "asc"
125+
assert result["sort"]["offset"] == "Delivery Truck 12"
126+
assert result["sort"]["lastId"] == "b1234"
127+
assert "propertySelector" in result
128+
assert "fields" in result["propertySelector"]
129+
assert "isIncluded" in result["propertySelector"]

0 commit comments

Comments
 (0)