Skip to content

Commit a59bcbc

Browse files
authored
fix(iterators): encode path parameters (#546)
1 parent 33374ec commit a59bcbc

File tree

6 files changed

+60
-8
lines changed

6 files changed

+60
-8
lines changed

algoliasearch/http/requester.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from requests import Timeout, RequestException, Session
66
from requests.adapters import HTTPAdapter
7-
from requests.packages.urllib3.util import Retry
7+
from urllib3.util import Retry
88

99
from algoliasearch.http.transporter import Response, Request
1010

algoliasearch/iterators.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import abc
22

33
from typing import Optional, Union
4+
from algoliasearch.helpers import endpoint
45

56
from algoliasearch.http.request_options import RequestOptions
67
from algoliasearch.http.transporter import Transporter
@@ -101,7 +102,7 @@ def __next__(self):
101102

102103
self._raw_response = self._transporter.read(
103104
Verb.POST,
104-
"1/indexes/{}/browse".format(self._index_name),
105+
endpoint("1/indexes/{}/browse", self._index_name),
105106
data,
106107
self._request_options,
107108
)
@@ -113,11 +114,11 @@ class SynonymIterator(PaginatorIterator):
113114
def get_endpoint(self):
114115
# type: () -> str
115116

116-
return "1/indexes/{}/synonyms/search".format(self._index_name)
117+
return endpoint("1/indexes/{}/synonyms/search", self._index_name)
117118

118119

119120
class RuleIterator(PaginatorIterator):
120121
def get_endpoint(self):
121122
# type: () -> str
122123

123-
return "1/indexes/{}/rules/search".format(self._index_name)
124+
return endpoint("1/indexes/{}/rules/search", self._index_name)

algoliasearch/iterators_async.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import asyncio
33

44
from typing import Optional, Union
5+
from algoliasearch.helpers import endpoint
56

67
from algoliasearch.http.request_options import RequestOptions
78
from algoliasearch.http.transporter import Transporter
@@ -90,7 +91,7 @@ def __anext__(self): # type: ignore
9091

9192
self._raw_response = yield from self._transporter.read(
9293
Verb.POST,
93-
"1/indexes/{}/browse".format(self._index_name),
94+
endpoint("1/indexes/{}/browse", self._index_name),
9495
data,
9596
self._request_options,
9697
)
@@ -102,11 +103,11 @@ class SynonymIteratorAsync(PaginatorIteratorAsync):
102103
def get_endpoint(self):
103104
# type: () -> str
104105

105-
return "1/indexes/{}/synonyms/search".format(self._index_name)
106+
return endpoint("1/indexes/{}/synonyms/search", self._index_name)
106107

107108

108109
class RuleIteratorAsync(PaginatorIteratorAsync):
109110
def get_endpoint(self):
110111
# type: () -> str
111112

112-
return "1/indexes/{}/rules/search".format(self._index_name)
113+
return endpoint("1/indexes/{}/rules/search", self._index_name)

tests/unit/test_helpers.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,8 @@ def test_endpoint(self):
4141
"/1/indexes/%23index%20name_42%23%2523/batch",
4242
endpoint("/1/indexes/{}/batch", "#index name_42#%23"),
4343
)
44+
45+
self.assertEqual(
46+
"/1/indexes/space%20bar/browse",
47+
endpoint("/1/indexes/{}/browse", "space bar"),
48+
)

tests/unit/test_search_index.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,51 @@ def test_get_task(self):
371371
with self.assertRaises(AssertionError) as _:
372372
self.index.get_task("")
373373

374+
def test_browse_objects_encode_path(self):
375+
index = SearchIndex(self.transporter, self.config, "#index name_42#%23")
376+
self.transporter.read.return_value = {"hits": [{"foo": "bar"}], "nbPages": 1}
377+
378+
index.browse_objects().next()
379+
380+
self.transporter.read.assert_called_once_with(
381+
"POST",
382+
"1/indexes/%23index%20name_42%23%2523/browse",
383+
{},
384+
None,
385+
)
386+
387+
def test_browse_rules_encode_path(self):
388+
index = SearchIndex(self.transporter, self.config, "#index name_42#%23")
389+
self.transporter.read.return_value = {
390+
"hits": [{"foo": "bar", "_highlightResult": "algolia"}],
391+
"nbPages": 1,
392+
}
393+
394+
index.browse_rules().next()
395+
396+
self.transporter.read.assert_called_once_with(
397+
"POST",
398+
"1/indexes/%23index%20name_42%23%2523/rules/search",
399+
{"hitsPerPage": 1000, "page": 1},
400+
None,
401+
)
402+
403+
def test_browse_synonyms_encode_path(self):
404+
index = SearchIndex(self.transporter, self.config, "#index name_42#%23")
405+
self.transporter.read.return_value = {
406+
"hits": [{"foo": "bar", "_highlightResult": "algolia"}],
407+
"nbPages": 1,
408+
}
409+
410+
index.browse_synonyms().next()
411+
412+
self.transporter.read.assert_called_once_with(
413+
"POST",
414+
"1/indexes/%23index%20name_42%23%2523/synonyms/search",
415+
{"hitsPerPage": 1000, "page": 1},
416+
None,
417+
)
418+
374419

375420
class NullResponse(Response):
376421
def wait(self):

tox.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ aiohttp = >=2.0,<4.0; python_version >= '3.4.2'
1515
async_timeout = >=2.0,<4.0
1616
mypy = >=0.6,<7.0
1717
flake8 = ==3.8.3
18-
black = ==20.8b0
18+
black = ==22.3.0
1919
twine = >=1.13,<2.0
2020
wheel = >=0.34,<1.0
2121
requests = ==2.26.0

0 commit comments

Comments
 (0)