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

Commit c498181

Browse files
authored
Added Meta Engine support (#20)
1 parent 6c4a565 commit c498181

File tree

5 files changed

+96
-3
lines changed

5 files changed

+96
-3
lines changed

README.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,33 @@ Creating a search key that will only search over the body field.
380380
>>> client = Client(host_identifier, signed_search_key)
381381
```
382382

383+
### Create a Meta Engine
384+
385+
```python
386+
>>> client.create_engine('my-meta-engine', options={
387+
'type': 'meta',
388+
'source_engines': [
389+
'source-engine-1',
390+
'source-engine-2'
391+
]
392+
})
393+
{'source_engines': ['source-engine-1', 'source-engine-2'], 'type': 'meta', 'name': 'my-meta-engine'}
394+
```
395+
396+
### Add a Source Engine to a Meta Engine
397+
398+
```python
399+
>>> client.add_source_engines('my-meta-engine', ['source-engine-3'])
400+
{'source_engines': ['source-engine-1', 'source-engine-2', 'source-engine-3'], 'type': 'meta', 'name': 'my-meta-engine'}
401+
```
402+
403+
### Remove a Source Engine from a Meta Engine
404+
405+
```python
406+
>>> client.remove_source_engines('my-meta-engine', ['source-engine-3'])
407+
{'source_engines': ['source-engine-1', 'source-engine-2'], 'type': 'meta', 'name': 'my-meta-engine'}
408+
```
409+
383410
## Running tests
384411

385412
```python

elastic_app_search/client.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,16 +149,19 @@ def get_engine(self, engine_name):
149149
"""
150150
return self.session.request('get', "engines/{}".format(engine_name))
151151

152-
def create_engine(self, engine_name, language=None):
152+
def create_engine(self, engine_name, language=None, options=None):
153153
"""
154154
Creates an engine with the specified name.
155155
:param engine_name: Name of the new engine.
156156
:param language: Language of the new engine.
157+
:param options: Engine configuration.
157158
:return: A dictionary corresponding to the new engine.
158159
"""
159160
data = { 'name': engine_name }
160161
if language is not None:
161162
data['language'] = language
163+
if options is not None:
164+
data.update(options)
162165
return self.session.request('post', 'engines', json=data)
163166

164167
def destroy_engine(self, engine_name):
@@ -289,6 +292,13 @@ def click(self, engine_name, options):
289292
endpoint = "engines/{}/click".format(engine_name)
290293
return self.session.request_ignore_response('post', endpoint, json=options)
291294

295+
def add_source_engines(self, engine_name, source_engines):
296+
endpoint = "engines/{}/source_engines".format(engine_name)
297+
return self.session.request('post', endpoint, json=source_engines)
298+
299+
def remove_source_engines(self, engine_name, source_engines):
300+
endpoint = "engines/{}/source_engines".format(engine_name)
301+
return self.session.request('delete', endpoint, json=source_engines)
292302

293303
@staticmethod
294304
def create_signed_search_key(api_key, api_key_name, options):

elastic_app_search/exceptions.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ class RecordAlreadyExists(ElasticAppSearchError):
1515
class BadRequest(ElasticAppSearchError):
1616
"""Raised when bad request"""
1717

18+
def __init__(self, message):
19+
super(ElasticAppSearchError, self).__init__(message)
20+
1821
class Forbidden(ElasticAppSearchError):
1922
"""Raised when http forbidden"""
2023

elastic_app_search/request_session.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def raise_if_error(self, response):
2222
if response.status_code == requests.codes.unauthorized:
2323
raise InvalidCredentials(response.reason)
2424
elif response.status_code == requests.codes.bad:
25-
raise BadRequest()
25+
raise BadRequest(response.text)
2626
elif response.status_code == requests.codes.conflict:
2727
raise RecordAlreadyExists()
2828
elif response.status_code == requests.codes.not_found:

tests/test_client.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,29 @@ def test_create_engine(self):
253253
with requests_mock.Mocker() as m:
254254
url = "{}/{}".format(self.client.session.base_url, 'engines')
255255
m.register_uri('POST', url, json=expected_return, status_code=200)
256-
response = self.client.create_engine(engine_name, 'en')
256+
response = self.client.create_engine(
257+
engine_name=engine_name, language='en')
258+
self.assertEqual(response, expected_return)
259+
260+
def test_create_engine_with_options(self):
261+
engine_name = 'myawesomeengine'
262+
expected_return = {'name': engine_name, 'type': 'meta',
263+
'source_engines': [
264+
'source-engine-1',
265+
'source-engine-2'
266+
]}
267+
268+
with requests_mock.Mocker() as m:
269+
url = "{}/{}".format(self.client.session.base_url, 'engines')
270+
m.register_uri('POST', url, json=expected_return, status_code=200)
271+
response = self.client.create_engine(
272+
engine_name=engine_name, options={
273+
'type': 'meta',
274+
'source_engines': [
275+
'source-engine-1',
276+
'source-engine-2'
277+
]
278+
})
257279
self.assertEqual(response, expected_return)
258280

259281
def test_destroy_engine(self):
@@ -487,3 +509,34 @@ def test_click(self):
487509
m.register_uri('POST', url, json={}, status_code=200)
488510
self.client.click(self.engine_name, {
489511
'query': 'cat', 'document_id': 'INscMGmhmX4'})
512+
513+
def test_add_source_engines(self):
514+
target_source_engine_name = 'source-engine-3'
515+
expected_return = {'source_engines': [
516+
'source-engine-1', 'source-engine-2', target_source_engine_name], 'type': 'meta', 'name': self.engine_name}
517+
518+
with requests_mock.Mocker() as m:
519+
url = "{}/{}".format(
520+
self.client.session.base_url,
521+
"engines/{}/source_engines".format(self.engine_name)
522+
)
523+
m.register_uri('POST', url, json=expected_return, status_code=200)
524+
response = self.client.add_source_engines(
525+
self.engine_name, [target_source_engine_name])
526+
self.assertEqual(response, expected_return)
527+
528+
def test_remove_source_engines(self):
529+
source_engine_name = 'source-engine-3'
530+
expected_return = {'source_engines': [
531+
'source-engine-1', 'source-engine-2'], 'type': 'meta', 'name': self.engine_name}
532+
533+
with requests_mock.Mocker() as m:
534+
url = "{}/{}".format(
535+
self.client.session.base_url,
536+
"engines/{}/source_engines".format(self.engine_name)
537+
)
538+
m.register_uri('DELETE', url, json=expected_return,
539+
status_code=200)
540+
response = self.client.remove_source_engines(
541+
self.engine_name, [source_engine_name])
542+
self.assertEqual(response, expected_return)

0 commit comments

Comments
 (0)