Skip to content

Commit 63853df

Browse files
Merge pull request #301 from algolia/feat/per-request-parameters
Feat/per request parameters
2 parents 098750c + dcfb1e7 commit 63853df

File tree

6 files changed

+186
-124
lines changed

6 files changed

+186
-124
lines changed

algoliasearch/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,4 @@ class algoliasearch(object):
3535
Client = client.Client
3636
Index = index.Index
3737
AlgoliaException = helpers.AlgoliaException
38+
RequestOptions = client.RequestOptions

algoliasearch/client.py

Lines changed: 48 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,23 @@
4545
MAX_API_KEY_LENGTH = 500
4646

4747

48+
class RequestOptions:
49+
HEADERS = {
50+
'forwardedFor': 'X-Forwarded-For',
51+
'algoliaUserID': 'X-Algolia-User-ID'
52+
}
53+
54+
def __init__(self, options):
55+
self.headers = {}
56+
self.parameters = {}
57+
58+
for k, v in options.items():
59+
if k in self.HEADERS:
60+
self.headers[self.HEADERS[k]] = v
61+
else:
62+
self.parameters[k] = v
63+
64+
4865
class Client(object):
4966
"""
5067
Entry point in the Python Client API.
@@ -214,7 +231,8 @@ def multipleQueries(self, queries, index_name_key='indexName'):
214231

215232
def multiple_queries(self, queries,
216233
index_name_key='indexName',
217-
strategy='none'):
234+
strategy='none',
235+
request_options=None):
218236
"""This method allows to query multiple indexes with one API call."""
219237
path = '/1/indexes/*/queries'
220238

@@ -228,48 +246,48 @@ def multiple_queries(self, queries,
228246
})
229247

230248
data = {'requests': requests, 'strategy': strategy}
231-
return self._req(True, path, 'POST', data=data)
249+
return self._req(True, path, 'POST', request_options, data=data)
232250

233-
def batch(self, requests):
251+
def batch(self, requests, request_options=None):
234252
"""Send a batch request targeting multiple indices."""
235253
if isinstance(requests, (list, tuple)):
236254
requests = {'requests': requests}
237255

238256
path = '/1/indexes/*/batch'
239-
return self._req(False, path, 'POST', data=requests)
257+
return self._req(False, path, 'POST', request_options, data=requests)
240258

241259
@deprecated
242260
def listIndexes(self):
243261
return self.list_indexes()
244262

245-
def list_indexes(self):
263+
def list_indexes(self, request_options=None):
246264
"""
247265
List all existing indexes.
248266
Return an object of the form:
249267
{'items': [{ 'name': 'contacts', 'created_at': '2013-01-18T15:33:13.556Z'},
250268
{'name': 'notes', 'created_at': '2013-01-18T15:33:13.556Z'}]}
251269
"""
252-
return self._req(True, '/1/indexes', 'GET')
270+
return self._req(True, '/1/indexes', 'GET', request_options)
253271

254272
@deprecated
255273
def deleteIndex(self, index_name):
256274
return self.delete_index(index_name)
257275

258-
def delete_index(self, index_name):
276+
def delete_index(self, index_name, request_options=None):
259277
"""
260278
Delete an index.
261279
Return an object of the form: {'deleted_at': '2013-01-18T15:33:13.556Z'}
262280
263281
@param index_name the name of index to delete
264282
"""
265283
path = '/1/indexes/%s' % safe(index_name)
266-
return self._req(False, path, 'DELETE')
284+
return self._req(False, path, 'DELETE', request_options)
267285

268286
@deprecated
269287
def moveIndex(self, src_index_name, dst_index_name):
270288
return self.move_index(src_index_name, dst_index_name)
271289

272-
def move_index(self, src_index_name, dst_index_name):
290+
def move_index(self, src_index_name, dst_index_name, request_options=None):
273291
"""
274292
Move an existing index.
275293
@@ -279,13 +297,13 @@ def move_index(self, src_index_name, dst_index_name):
279297
"""
280298
path = '/1/indexes/%s/operation' % safe(src_index_name)
281299
request = {'operation': 'move', 'destination': dst_index_name}
282-
return self._req(False, path, 'POST', data=request)
300+
return self._req(False, path, 'POST', request_options, data=request)
283301

284302
@deprecated
285303
def copyIndex(self, src_index_name, dst_index_name):
286304
return self.copy_index(src_index_name, dst_index_name)
287305

288-
def copy_index(self, src_index_name, dst_index_name):
306+
def copy_index(self, src_index_name, dst_index_name, request_options=None):
289307
"""
290308
Copy an existing index.
291309
@@ -295,13 +313,13 @@ def copy_index(self, src_index_name, dst_index_name):
295313
"""
296314
path = '/1/indexes/%s/operation' % safe(src_index_name)
297315
request = {'operation': 'copy', 'destination': dst_index_name}
298-
return self._req(False, path, 'POST', data=request)
316+
return self._req(False, path, 'POST', request_options, data=request)
299317

300318
@deprecated
301319
def getLogs(self, offset=0, length=10, type='all'):
302320
return self.get_logs(offset, length, type)
303321

304-
def get_logs(self, offset=0, length=10, type='all'):
322+
def get_logs(self, offset=0, length=10, type='all', request_options=None):
305323
"""
306324
Return last logs entries.
307325
@@ -311,7 +329,7 @@ def get_logs(self, offset=0, length=10, type='all'):
311329
starting at offset. Maximum allowed value: 1000.
312330
"""
313331
params = {'offset': offset, 'length': length, 'type': type}
314-
return self._req(False, '/1/logs', 'GET', params)
332+
return self._req(False, '/1/logs', 'GET', request_options, params)
315333

316334
@deprecated
317335
def initIndex(self, index_name):
@@ -335,9 +353,9 @@ def list_user_keys(self):
335353
"""Use `list_api_keys`"""
336354
return self.list_api_keys()
337355

338-
def list_api_keys(self):
356+
def list_api_keys(self, request_options=None):
339357
"""List all existing api keys with their associated ACLs."""
340-
return self._req(True, '/1/keys', 'GET')
358+
return self._req(True, '/1/keys', 'GET', request_options)
341359

342360
@deprecated
343361
def getUserKeyACL(self, key):
@@ -348,10 +366,10 @@ def get_user_key_acl(self, key):
348366
"""Use `get_api_key_acl`"""
349367
return self.get_api_key_acl(key)
350368

351-
def get_api_key_acl(self, key):
369+
def get_api_key_acl(self, key, request_options=None):
352370
"""'Get ACL of an api key."""
353371
path = '/1/keys/%s' % key
354-
return self._req(True, path, 'GET')
372+
return self._req(True, path, 'GET', request_options)
355373

356374
@deprecated
357375
def deleteUserKey(self, key):
@@ -362,10 +380,10 @@ def delete_user_key(self, key):
362380
"""Use `delete_api_key`"""
363381
return self.delete_api_key(key)
364382

365-
def delete_api_key(self, key):
383+
def delete_api_key(self, key, request_options=None):
366384
"""Delete an existing api key."""
367385
path = '/1/keys/%s' % key
368-
return self._req(False, path, 'DELETE')
386+
return self._req(False, path, 'DELETE', request_options)
369387

370388
@deprecated
371389
def addUserKey(self, obj,
@@ -392,7 +410,8 @@ def add_api_key(self, obj,
392410
validity=0,
393411
max_queries_per_ip_per_hour=0,
394412
max_hits_per_query=0,
395-
indexes=None):
413+
indexes=None,
414+
request_options=None):
396415
"""
397416
Create a new api key.
398417
@@ -435,7 +454,7 @@ def add_api_key(self, obj,
435454
if indexes:
436455
obj['indexes'] = indexes
437456

438-
return self._req(False, '/1/keys', 'POST', data=obj)
457+
return self._req(False, '/1/keys', 'POST', request_options, data=obj)
439458

440459
@deprecated
441460
def update_user_key(self, key, obj,
@@ -454,7 +473,8 @@ def update_api_key(self, key, obj,
454473
validity=None,
455474
max_queries_per_ip_per_hour=None,
456475
max_hits_per_query=None,
457-
indexes=None):
476+
indexes=None,
477+
request_options=None):
458478
"""
459479
Update a api key.
460480
@@ -500,7 +520,7 @@ def update_api_key(self, key, obj,
500520
obj['indexes'] = indexes
501521

502522
path = '/1/keys/%s' % key
503-
return self._req(False, path, 'PUT', data=obj)
523+
return self._req(False, path, 'PUT', request_options, data=obj)
504524

505525
@deprecated
506526
def generateSecuredApiKey(self, private_api_key, tag_filters,
@@ -534,16 +554,16 @@ def generate_secured_api_key(self, private_api_key, queryParameters,
534554
securedKey = hmac.new(private_api_key.encode('utf-8'), queryParameters.encode('utf-8'), hashlib.sha256).hexdigest()
535555
return str(base64.b64encode(("%s%s" % (securedKey, queryParameters)).encode('utf-8')).decode('utf-8'))
536556

537-
def is_alive(self):
557+
def is_alive(self, request_options=None):
538558
"""
539559
Test if the server is alive.
540560
This performs a simple application-level ping. If up and running, the server answers with a basic message.
541561
"""
542-
return self._req(True, '/1/isalive', 'GET')
562+
return self._req(True, '/1/isalive', 'GET', request_options)
543563

544-
def _req(self, is_search, path, meth, params=None, data=None):
564+
def _req(self, is_search, path, meth, request_options, params=None, data=None):
545565
if len(self.api_key) > MAX_API_KEY_LENGTH:
546566
if data is None:
547567
data = {}
548568
data['apiKey'] = self.api_key
549-
return self._transport.req(is_search, path, meth, params, data)
569+
return self._transport.req(is_search, path, meth, params, data, request_options)

0 commit comments

Comments
 (0)