Skip to content
This repository was archived by the owner on Sep 1, 2021. It is now read-only.

Commit b86be18

Browse files
CorrosiveKidJasonStoltz
authored andcommitted
Add client functionality for synonym management (#12)
1 parent 0429c2c commit b86be18

File tree

3 files changed

+334
-0
lines changed

3 files changed

+334
-0
lines changed

README.md

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,121 @@ The client can be configured to use a managed deploy by adjusting the `base_endp
203203
{'deleted': True}
204204
```
205205

206+
### List all synonym sets in an engine
207+
208+
#### With default pagination (a page size of 20)
209+
210+
```python
211+
>>> client.list_synonym_sets('us-national-parks')
212+
{
213+
'meta': {
214+
'page': {
215+
'current': 1,
216+
'total_pages': 1,
217+
'total_results': 3,
218+
'size': 20
219+
}
220+
},
221+
'results': [
222+
{
223+
'id': 'syn-5b11ac66c9f9292013220ad3',
224+
'synonyms': [
225+
'park',
226+
'trail'
227+
]
228+
},
229+
{
230+
'id': 'syn-5b11ac72c9f9296b35220ac9',
231+
'synonyms': [
232+
'protected',
233+
'heritage'
234+
]
235+
},
236+
{
237+
'id': 'syn-5b11ac66c9f9292013220ad3',
238+
'synonyms': [
239+
'hectares',
240+
'acres'
241+
]
242+
}
243+
]
244+
}
245+
```
246+
247+
#### With custom pagination
248+
249+
```python
250+
>>> client.list_synonym_sets('us-national-parks', size=1, current=1)
251+
{
252+
'meta': {
253+
'page': {
254+
'current': 1,
255+
'total_pages': 3,
256+
'total_results': 3,
257+
'size': 1
258+
}
259+
},
260+
'results': [
261+
{
262+
'id': 'syn-5b11ac66c9f9292013220ad3',
263+
'synonyms': [
264+
'park',
265+
'trail'
266+
]
267+
}
268+
]
269+
}
270+
```
271+
272+
### Get a single synonym set
273+
274+
```python
275+
>>> client.get_synonym_set('us-national-parks', 'syn-5b11ac66c9f9292013220ad3')
276+
{
277+
'id': 'syn-5b11ac66c9f9292013220ad3',
278+
'synonyms': [
279+
'park',
280+
'trail'
281+
]
282+
}
283+
```
284+
285+
### Create a synonym set
286+
287+
```python
288+
>>> client.create_synonym_set('us-national-parks', ['park', 'trail'])
289+
{
290+
'id': 'syn-5b11ac72c9f9296b35220ac9',
291+
'synonyms': [
292+
'park',
293+
'trail'
294+
]
295+
}
296+
```
297+
298+
### Update a synonym set
299+
300+
```python
301+
>>> client.update_synonym_set('us-national-parks', 'syn-5b11ac72c9f9296b35220ac9', ['park', 'trail', 'ground'])
302+
{
303+
'id': 'syn-5b11ac72c9f9296b35220ac9',
304+
'synonyms': [
305+
'park',
306+
'trail',
307+
'ground'
308+
]
309+
}
310+
```
311+
312+
### Destroy a synonym set
313+
314+
```python
315+
>>> client.destroy_synonym_set('us-national-parks', 'syn-5b11ac66c9f9292013220ad3')
316+
{
317+
'deleted': True
318+
}
319+
```
320+
206321
### Searching
207322

208323
```python

elastic_app_search/client.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,61 @@ def destroy_engine(self, engine_name):
170170
"""
171171
return self.session.request('delete', "engines/{}".format(engine_name))
172172

173+
def list_synonym_sets(self, engine_name, current=1, size=20):
174+
"""
175+
Lists all synonym sets in engine.
176+
177+
:param engine_name: Name of the engine.
178+
:param current: Page of synonym sets.
179+
:param size: Number of synonym sets to return per page.
180+
:return: List of synonym sets.
181+
"""
182+
data = { 'page': { 'current': current, 'size': size } }
183+
return self.session.request('get', "engines/{}/synonyms".format(engine_name), json=data)
184+
185+
def get_synonym_set(self, engine_name, synonym_set_id):
186+
"""
187+
Get a single synonym set.
188+
189+
:param engine_name: Name of the engine.
190+
:param synonym_set_id: ID of the synonym set.
191+
:return: A single synonym set.
192+
"""
193+
return self.session.request('get', "engines/{}/synonyms/{}".format(engine_name, synonym_set_id))
194+
195+
def create_synonym_set(self, engine_name, synonyms):
196+
"""
197+
Create a synonym set.
198+
199+
:param engine_name: Name of the engine.
200+
:param synonyms: List of synonyms.
201+
:return: A list of synonyms that was created.
202+
"""
203+
data = { 'synonyms': synonyms }
204+
return self.session.request('post', "engines/{}/synonyms".format(engine_name), json=data)
205+
206+
def update_synonym_set(self, engine_name, synonym_set_id, synonyms):
207+
"""
208+
Update an existing synonym set.
209+
210+
:param engine_name: Name of the engine.
211+
:param synonym_set_id: ID of the synonym set to update.
212+
:param synonyms: The updated list of synonyms.
213+
:return: The synonym set that was updated.
214+
"""
215+
data = { 'synonyms': synonyms }
216+
return self.session.request('put', "engines/{}/synonyms/{}".format(engine_name, synonym_set_id), json=data)
217+
218+
def destroy_synonym_set(self, engine_name, synonym_set_id):
219+
"""
220+
Destroy a synonym set.
221+
222+
:param engine_name: Name of the engine.
223+
:param synonym_set_id: ID of the synonym set to be deleted.
224+
:return: Delete status.
225+
"""
226+
return self.session.request('delete', "engines/{}/synonyms/{}".format(engine_name, synonym_set_id))
227+
173228
def search(self, engine_name, query, options=None):
174229
"""
175230
Search an engine. See https://swiftype.com/documentation/app-search/ for more details

tests/test_client.py

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,170 @@ def test_destroy_engine(self):
238238
response = self.client.destroy_engine(engine_name)
239239
self.assertEqual(response, expected_return)
240240

241+
def test_list_synonym_sets(self):
242+
expected_return = {
243+
'meta': {
244+
'page': {
245+
'current': 1,
246+
'total_pages': 1,
247+
'total_results': 3,
248+
'size': 20
249+
}
250+
},
251+
'results': [
252+
{
253+
'id': 'syn-5b11ac66c9f9292013220ad3',
254+
'synonyms': [
255+
'park',
256+
'trail'
257+
]
258+
},
259+
{
260+
'id': 'syn-5b11ac72c9f9296b35220ac9',
261+
'synonyms': [
262+
'protected',
263+
'heritage'
264+
]
265+
},
266+
{
267+
'id': 'syn-5b11ac66c9f9292013220ad3',
268+
'synonyms': [
269+
'hectares',
270+
'acres'
271+
]
272+
}
273+
]
274+
}
275+
276+
with requests_mock.Mocker() as m:
277+
url = "{}/engines/{}/synonyms".format(
278+
self.client.session.base_url,
279+
self.engine_name
280+
)
281+
m.register_uri(
282+
'GET',
283+
url,
284+
additional_matcher=lambda x: x.text == '{"page": {"current": 1, "size": 20}}',
285+
json=expected_return,
286+
status_code=200
287+
)
288+
289+
response = self.client.list_synonym_sets(self.engine_name)
290+
291+
def test_get_synonym_set(self):
292+
synonym_id = 'syn-5b11ac66c9f9292013220ad3'
293+
expected_return = {
294+
'id': synonym_id,
295+
'synonyms': [
296+
'park',
297+
'trail'
298+
]
299+
}
300+
301+
with requests_mock.Mocker() as m:
302+
url = "{}/engines/{}/synonyms/{}".format(
303+
self.client.session.base_url,
304+
self.engine_name,
305+
synonym_id
306+
)
307+
m.register_uri(
308+
'GET',
309+
url,
310+
json=expected_return,
311+
status_code=200
312+
)
313+
314+
response = self.client.get_synonym_set(
315+
self.engine_name,
316+
synonym_id
317+
)
318+
self.assertEqual(response, expected_return)
319+
320+
def test_create_synonym_set(self):
321+
synonym_set = ['park', 'trail']
322+
expected_return = {
323+
'id': 'syn-5b11ac72c9f9296b35220ac9',
324+
'synonyms': [
325+
'park',
326+
'trail'
327+
]
328+
}
329+
330+
with requests_mock.Mocker() as m:
331+
url = "{}/engines/{}/synonyms".format(
332+
self.client.session.base_url,
333+
self.engine_name
334+
)
335+
m.register_uri(
336+
'POST',
337+
url,
338+
json=expected_return,
339+
status_code=200
340+
)
341+
342+
response = self.client.create_synonym_set(
343+
self.engine_name,
344+
synonym_set
345+
)
346+
self.assertEqual(response, expected_return)
347+
348+
def test_update_synonym_set(self):
349+
synonym_id = 'syn-5b11ac72c9f9296b35220ac9'
350+
synonym_set = ['park', 'trail', 'ground']
351+
expected_return = {
352+
'id': synonym_id,
353+
'synonyms': [
354+
'park',
355+
'trail',
356+
'ground'
357+
]
358+
}
359+
360+
with requests_mock.Mocker() as m:
361+
url = "{}/engines/{}/synonyms/{}".format(
362+
self.client.session.base_url,
363+
self.engine_name,
364+
synonym_id
365+
)
366+
m.register_uri(
367+
'PUT',
368+
url,
369+
json=expected_return,
370+
status_code=200
371+
)
372+
373+
response = self.client.update_synonym_set(
374+
self.engine_name,
375+
synonym_id,
376+
synonym_set
377+
)
378+
self.assertEqual(response, expected_return)
379+
380+
def test_destroy_synonym_set(self):
381+
synonym_id = 'syn-5b11ac66c9f9292013220ad3'
382+
expected_return = {
383+
'deleted': True
384+
}
385+
386+
with requests_mock.Mocker() as m:
387+
url = "{}/engines/{}/synonyms/{}".format(
388+
self.client.session.base_url,
389+
self.engine_name,
390+
synonym_id
391+
)
392+
m.register_uri(
393+
'DELETE',
394+
url,
395+
json=expected_return,
396+
status_code=200
397+
)
398+
399+
response = self.client.destroy_synonym_set(
400+
self.engine_name,
401+
synonym_id
402+
)
403+
self.assertEqual(response, expected_return)
404+
241405
def test_search(self):
242406
query = 'query'
243407
expected_return = { 'meta': {}, 'results': []}

0 commit comments

Comments
 (0)