Skip to content

Commit 8f124d4

Browse files
committed
Support endpoints for handling search synonyms
1 parent 200495e commit 8f124d4

16 files changed

+343
-5
lines changed

recombee_api_client/api_client.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def send(self, request):
6464

6565
@staticmethod
6666
def __get_http_headers(additional_headers=None):
67-
headers = {'User-Agent': 'recombee-python-api-client/3.1.0'}
67+
headers = {'User-Agent': 'recombee-python-api-client/3.2.0'}
6868
if additional_headers:
6969
headers.update(additional_headers)
7070
return headers

recombee_api_client/api_requests/__init__.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,12 @@
5858
from recombee_api_client.api_requests.recommend_next_items import RecommendNextItems
5959
from recombee_api_client.api_requests.recommend_users_to_user import RecommendUsersToUser
6060
from recombee_api_client.api_requests.recommend_users_to_item import RecommendUsersToItem
61-
from recombee_api_client.api_requests.search_items import SearchItems
6261
from recombee_api_client.api_requests.user_based_recommendation import UserBasedRecommendation
6362
from recombee_api_client.api_requests.item_based_recommendation import ItemBasedRecommendation
63+
from recombee_api_client.api_requests.search_items import SearchItems
64+
from recombee_api_client.api_requests.add_search_synonym import AddSearchSynonym
65+
from recombee_api_client.api_requests.list_search_synonyms import ListSearchSynonyms
66+
from recombee_api_client.api_requests.delete_all_search_synonyms import DeleteAllSearchSynonyms
67+
from recombee_api_client.api_requests.delete_search_synonym import DeleteSearchSynonym
6468
from recombee_api_client.api_requests.reset_database import ResetDatabase
6569
from recombee_api_client.api_requests.batch import Batch
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
from recombee_api_client.api_requests.request import Request
2+
import uuid
3+
4+
DEFAULT = uuid.uuid4()
5+
6+
class AddSearchSynonym(Request):
7+
"""
8+
Adds a new synonym for the [Search items](https://docs.recombee.com/api.html#search-items).
9+
10+
When the `term` is used in the search query, the `synonym` is also used for the full-text search.
11+
Unless `oneWay=true`, it works also in the opposite way (`synonym` -> `term`).
12+
13+
An example of a synonym can be `science fiction` for the term `sci-fi`.
14+
15+
Required parameters:
16+
17+
:param term: A word to which the `synonym` is specified.
18+
19+
:param synonym: A word that should be considered equal to the `term` by the full-text search engine.
20+
21+
22+
Optional parameters:
23+
24+
:param one_way: If set to `true`, only `term` -> `synonym` is considered. If set to `false`, also `synonym` -> `term` works.
25+
26+
27+
Default: `false`.
28+
29+
30+
31+
"""
32+
33+
def __init__(self, term, synonym, one_way=DEFAULT):
34+
self.term = term
35+
self.synonym = synonym
36+
self.one_way = one_way
37+
self.timeout = 10000
38+
self.ensure_https = False
39+
self.method = 'post'
40+
self.path = "/synonyms/items/" % ()
41+
42+
def get_body_parameters(self):
43+
"""
44+
Values of body parameters as a dictionary (name of parameter: value of the parameter).
45+
"""
46+
p = dict()
47+
p['term'] = self.term
48+
p['synonym'] = self.synonym
49+
if self.one_way is not DEFAULT:
50+
p['oneWay'] = self.one_way
51+
return p
52+
53+
def get_query_parameters(self):
54+
"""
55+
Values of query parameters as a dictionary (name of parameter: value of the parameter).
56+
"""
57+
params = dict()
58+
return params
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
from recombee_api_client.api_requests.request import Request
2+
import uuid
3+
4+
DEFAULT = uuid.uuid4()
5+
6+
class DeleteAllSearchSynonyms(Request):
7+
"""
8+
Deletes all synonyms defined in the database.
9+
10+
11+
"""
12+
13+
def __init__(self):
14+
self.timeout = 10000
15+
self.ensure_https = False
16+
self.method = 'delete'
17+
self.path = "/synonyms/items/" % ()
18+
19+
def get_body_parameters(self):
20+
"""
21+
Values of body parameters as a dictionary (name of parameter: value of the parameter).
22+
"""
23+
p = dict()
24+
return p
25+
26+
def get_query_parameters(self):
27+
"""
28+
Values of query parameters as a dictionary (name of parameter: value of the parameter).
29+
"""
30+
params = dict()
31+
return params
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
from recombee_api_client.api_requests.request import Request
2+
import uuid
3+
4+
DEFAULT = uuid.uuid4()
5+
6+
class DeleteSearchSynonym(Request):
7+
"""
8+
Deletes synonym of given `id` and this synonym is no longer taken into account in the [Search items](https://docs.recombee.com/api.html#search-items).
9+
10+
Required parameters:
11+
12+
:param id: ID of the synonym that should be deleted.
13+
14+
15+
"""
16+
17+
def __init__(self, id):
18+
self.id = id
19+
self.timeout = 10000
20+
self.ensure_https = False
21+
self.method = 'delete'
22+
self.path = "/synonyms/items/%s" % (self.id)
23+
24+
def get_body_parameters(self):
25+
"""
26+
Values of body parameters as a dictionary (name of parameter: value of the parameter).
27+
"""
28+
p = dict()
29+
return p
30+
31+
def get_query_parameters(self):
32+
"""
33+
Values of query parameters as a dictionary (name of parameter: value of the parameter).
34+
"""
35+
params = dict()
36+
return params
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
from recombee_api_client.api_requests.request import Request
2+
import uuid
3+
4+
DEFAULT = uuid.uuid4()
5+
6+
class ListSearchSynonyms(Request):
7+
"""
8+
Gives the list of synonyms defined in the database.
9+
10+
Optional parameters:
11+
12+
:param count: The number of synonyms to be listed.
13+
14+
:param offset: Specifies the number of synonyms to skip (ordered by `term`).
15+
16+
17+
"""
18+
19+
def __init__(self, count=DEFAULT, offset=DEFAULT):
20+
self.count = count
21+
self.offset = offset
22+
self.timeout = 100000
23+
self.ensure_https = False
24+
self.method = 'get'
25+
self.path = "/synonyms/items/" % ()
26+
27+
def get_body_parameters(self):
28+
"""
29+
Values of body parameters as a dictionary (name of parameter: value of the parameter).
30+
"""
31+
p = dict()
32+
return p
33+
34+
def get_query_parameters(self):
35+
"""
36+
Values of query parameters as a dictionary (name of parameter: value of the parameter).
37+
"""
38+
params = dict()
39+
if self.count is not DEFAULT:
40+
params['count'] = self.count
41+
if self.offset is not DEFAULT:
42+
params['offset'] = self.offset
43+
return params

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
setup(
1212
name='recombee-api-client',
1313

14-
version='3.1.0',
14+
version='3.2.0',
1515

1616
description='Client for Recombee recommendation API',
1717
long_description=long_description,

tests/test.py

+10-2
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,20 @@
134134
suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(RecommendUsersToUserTestCase))
135135
from tests.test_cases.test_recommend_users_to_item import RecommendUsersToItemTestCase
136136
suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(RecommendUsersToItemTestCase))
137-
from tests.test_cases.test_search_items import SearchItemsTestCase
138-
suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(SearchItemsTestCase))
139137
from tests.test_cases.test_user_based_recommendation import UserBasedRecommendationTestCase
140138
suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(UserBasedRecommendationTestCase))
141139
from tests.test_cases.test_item_based_recommendation import ItemBasedRecommendationTestCase
142140
suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(ItemBasedRecommendationTestCase))
141+
from tests.test_cases.test_search_items import SearchItemsTestCase
142+
suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(SearchItemsTestCase))
143+
from tests.test_cases.test_add_search_synonym import AddSearchSynonymTestCase
144+
suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(AddSearchSynonymTestCase))
145+
from tests.test_cases.test_list_search_synonyms import ListSearchSynonymsTestCase
146+
suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(ListSearchSynonymsTestCase))
147+
from tests.test_cases.test_delete_all_search_synonyms import DeleteAllSearchSynonymsTestCase
148+
suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(DeleteAllSearchSynonymsTestCase))
149+
from tests.test_cases.test_delete_search_synonym import DeleteSearchSynonymTestCase
150+
suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(DeleteSearchSynonymTestCase))
143151
from tests.test_cases.test_batch import BatchTestCase
144152
suite.addTests(unittest.defaultTestLoader.loadTestsFromTestCase(BatchTestCase))
145153

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
#
4+
# This file is auto-generated, do not edit
5+
#
6+
7+
from tests.test_cases.recombee_test import RecombeeTest, InteractionsTest, RecommendationsTest
8+
from recombee_api_client.exceptions import ResponseException
9+
from recombee_api_client.api_requests import *
10+
11+
class AddSearchSynonymTest (RecombeeTest ):
12+
13+
def create_request(self,term,synonym,one_way=None):
14+
pass
15+
16+
def test_add_search_synonym(self):
17+
18+
# it 'adds search synonym'
19+
req = self.create_request('sci-fi', 'science fiction', one_way=True)
20+
resp = self.client.send(req)
21+
self.assertEqual(resp['term'], 'sci-fi')
22+
self.assertEqual(resp['synonym'], 'science fiction')
23+
req = self.create_request('sci-fi', 'science fiction', one_way=True)
24+
try:
25+
self.client.send(req)
26+
self.assertFail()
27+
except ResponseException as ex:
28+
self.assertEqual(ex.status_code, 409)
29+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
#
4+
# This file is auto-generated, do not edit
5+
#
6+
7+
from tests.test_cases.recombee_test import RecombeeTest, InteractionsTest, RecommendationsTest
8+
from recombee_api_client.exceptions import ResponseException
9+
from recombee_api_client.api_requests import *
10+
11+
class DeleteAllSearchSynonymsTest (RecombeeTest ):
12+
13+
def create_request(self):
14+
pass
15+
16+
def test_delete_all_search_synonyms(self):
17+
18+
# it 'deletes all search synonyms'
19+
req = self.create_request()
20+
resp = self.client.send(req)
21+
+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
#
4+
# This file is auto-generated, do not edit
5+
#
6+
7+
from tests.test_cases.recombee_test import RecombeeTest, InteractionsTest, RecommendationsTest
8+
from recombee_api_client.exceptions import ResponseException
9+
from recombee_api_client.api_requests import *
10+
11+
class DeleteSearchSynonymTest (RecombeeTest ):
12+
13+
def create_request(self,id):
14+
pass
15+
16+
def test_delete_search_synonym(self):
17+
18+
# it 'deletes search synonym'
19+
req = AddSearchSynonym('sci-fi', 'science fiction')
20+
resp = self.client.send(req)
21+
req = self.create_request(resp['id'])
22+
resp = self.client.send(req)
23+
req = self.create_request('a968271b-d666-4dfb-8a30-f459e564ba7b')
24+
try:
25+
self.client.send(req)
26+
self.assertFail()
27+
except ResponseException as ex:
28+
self.assertEqual(ex.status_code, 404)
29+
+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
#
4+
# This file is auto-generated, do not edit
5+
#
6+
7+
from tests.test_cases.recombee_test import RecombeeTest, InteractionsTest, RecommendationsTest
8+
from recombee_api_client.exceptions import ResponseException
9+
from recombee_api_client.api_requests import *
10+
11+
class ListSearchSynonymsTest (RecombeeTest ):
12+
13+
def create_request(self,count=None,offset=None):
14+
pass
15+
16+
def test_list_search_synonyms(self):
17+
18+
# it 'lists search synonyms'
19+
req = AddSearchSynonym('sci-fi', 'science fiction')
20+
resp = self.client.send(req)
21+
req = self.create_request()
22+
resp = self.client.send(req)
23+
self.assertEqual(len(resp['synonyms']), 1)
24+
req = self.create_request(count=10, offset=1)
25+
resp = self.client.send(req)
26+
self.assertEqual(len(resp['synonyms']), 0)
27+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
#
4+
# This file is auto-generated, do not edit
5+
#
6+
7+
from tests.test_cases.add_search_synonym import AddSearchSynonymTest
8+
from recombee_api_client.api_requests import *
9+
10+
class AddSearchSynonymTestCase (AddSearchSynonymTest):
11+
12+
def create_request(self, term, synonym, one_way=None):
13+
return AddSearchSynonym(term, synonym, one_way=one_way)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
#
4+
# This file is auto-generated, do not edit
5+
#
6+
7+
from tests.test_cases.delete_all_search_synonyms import DeleteAllSearchSynonymsTest
8+
from recombee_api_client.api_requests import *
9+
10+
class DeleteAllSearchSynonymsTestCase (DeleteAllSearchSynonymsTest):
11+
12+
def create_request(self):
13+
return DeleteAllSearchSynonyms()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
#
4+
# This file is auto-generated, do not edit
5+
#
6+
7+
from tests.test_cases.delete_search_synonym import DeleteSearchSynonymTest
8+
from recombee_api_client.api_requests import *
9+
10+
class DeleteSearchSynonymTestCase (DeleteSearchSynonymTest):
11+
12+
def create_request(self, id):
13+
return DeleteSearchSynonym(id)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
#
4+
# This file is auto-generated, do not edit
5+
#
6+
7+
from tests.test_cases.list_search_synonyms import ListSearchSynonymsTest
8+
from recombee_api_client.api_requests import *
9+
10+
class ListSearchSynonymsTestCase (ListSearchSynonymsTest):
11+
12+
def create_request(self, count=None, offset=None):
13+
return ListSearchSynonyms(count=count, offset=offset)

0 commit comments

Comments
 (0)