Skip to content

Commit bc337be

Browse files
Only use +and in filters when necessary (#695)
1 parent 650ef1f commit bc337be

File tree

2 files changed

+22
-19
lines changed

2 files changed

+22
-19
lines changed

linodecli/api_request.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -162,26 +162,29 @@ def _build_filter_header(
162162
order_by = parsed_args_dict.pop("order_by")
163163
order = parsed_args_dict.pop("order") or "asc"
164164

165-
# The "+and" list to be used in the filter header
166-
filter_list = []
165+
result = {}
166+
167+
# A list filter allows a user to filter on multiple values in a list
168+
# e.g. --tags foobar --tags foobar2
169+
list_filters = []
167170

168-
for k, v in parsed_args_dict.items():
169-
if v is None:
171+
for key, value in parsed_args_dict.items():
172+
if value is None:
170173
continue
171174

172-
# If this is a list, flatten it out
173-
new_filters = [{k: j} for j in v] if isinstance(v, list) else [{k: v}]
174-
filter_list.extend(new_filters)
175+
if not isinstance(value, list):
176+
result[key] = value
177+
continue
178+
179+
list_filters.extend(iter({key: entry} for entry in value))
180+
181+
if len(list_filters) > 0:
182+
result["+and"] = list_filters
175183

176-
result = {}
177-
if len(filter_list) > 0:
178-
if len(filter_list) == 1:
179-
result = filter_list[0]
180-
else:
181-
result["+and"] = filter_list
182184
if order_by is not None:
183185
result["+order_by"] = order_by
184186
result["+order"] = order
187+
185188
return json.dumps(result) if len(result) > 0 else None
186189

187190

tests/unit/test_api_request.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -208,11 +208,11 @@ def test_build_filter_header(self, list_operation):
208208
assert (
209209
json.dumps(
210210
{
211+
"filterable_result": "bar",
211212
"+and": [
212-
{"filterable_result": "bar"},
213213
{"filterable_list_result": "foo"},
214214
{"filterable_list_result": "bar"},
215-
]
215+
],
216216
}
217217
)
218218
== result
@@ -271,8 +271,8 @@ def test_build_filter_header_order_by(self, list_operation):
271271
assert (
272272
json.dumps(
273273
{
274+
"filterable_result": "bar",
274275
"+and": [
275-
{"filterable_result": "bar"},
276276
{"filterable_list_result": "foo"},
277277
{"filterable_list_result": "bar"},
278278
],
@@ -297,8 +297,8 @@ def test_build_filter_header_order(self, list_operation):
297297
assert (
298298
json.dumps(
299299
{
300+
"filterable_result": "bar",
300301
"+and": [
301-
{"filterable_result": "bar"},
302302
{"filterable_list_result": "foo"},
303303
{"filterable_list_result": "bar"},
304304
],
@@ -335,11 +335,11 @@ def validate_http_request(url, headers=None, data=None, **kwargs):
335335
assert url == "http://localhost/v4/foo/bar?page=1&page_size=100"
336336
assert headers["X-Filter"] == json.dumps(
337337
{
338+
"filterable_result": "cool",
338339
"+and": [
339-
{"filterable_result": "cool"},
340340
{"filterable_list_result": "foo"},
341341
{"filterable_list_result": "bar"},
342-
]
342+
],
343343
}
344344
)
345345
assert headers["User-Agent"] == mock_cli.user_agent

0 commit comments

Comments
 (0)