algoliasearch 1.5.1 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7f8a8ea00f71415bf0e2840c750d9122d14a0b14
4
- data.tar.gz: 20f3cdce74f9bf324414263d8fb50e90f0ca933a
3
+ metadata.gz: 511e4c42adb37f4b590e19d4db50e168207206cf
4
+ data.tar.gz: 26b545014c375f33eb5cb5ecee8b1f2c9a2dfa8e
5
5
  SHA512:
6
- metadata.gz: bdf0fb25764237fc16479a5d2f1faebf5f469cb979eaf9e3571b9fe70c3151ca8b40f24b7eee4a94b1bffe5f196d006becdc0ca8654e438567ec12e973623dd3
7
- data.tar.gz: c94357b18b72c01a06ef07af02f45e5f4a01d16cb780af9c555a83321504719689563460691fc738dcafb5b0aa462c73b23cf408c7d2bb056c3368c241615cb9
6
+ metadata.gz: bd5b41f2dd31727913a7cf6d043aa6d95d7736258a6996a3ebdb16efbef6176b0c24f554b1406258c933c6a62abb8b45a8c8db1ed5a78c69e74e2dc3bf92da43
7
+ data.tar.gz: 185d83cf55c8a9778a15e17d1e5dece6ad317c973f7b1e912d4dcc22dbcead51e510d7045add8b2f6bb69ccefd72412965472fe4acc15c72defff99f415b076d
@@ -6,13 +6,8 @@ rvm:
6
6
  - 1.8.7
7
7
  - 1.9.3
8
8
  - 2.0.0
9
- - 2.1.0
10
- - 2.1.1
11
- - 2.1.2
12
- - 2.1.3
13
- - 2.1.4
14
9
  - 2.1.5
15
- - 2.2.0
10
+ - 2.2.2
16
11
  - jruby
17
12
  - rbx-2
18
13
  install:
data/ChangeLog CHANGED
@@ -1,5 +1,8 @@
1
1
  CHANGELOG
2
2
 
3
+ 2015-07-19 1.6.0
4
+ * Ability to instantiate multiple API clients in the same process (was using a class variable before).
5
+
3
6
  2015-07-14 1.5.1
4
7
  * Ability to retrieve a single page from a cursor with `browse_from`
5
8
 
@@ -19,6 +19,8 @@ module Algolia
19
19
  DEFAULT_SEARCH_TIMEOUT = 5
20
20
 
21
21
  def initialize(data = {})
22
+ raise ArgumentError.new("No APPLICATION_ID provided, please set :application_id") if data[:application_id].nil?
23
+
22
24
  @ssl = data[:ssl].nil? ? true : data[:ssl]
23
25
  @ssl_version = data[:ssl_version].nil? ? nil : data[:ssl_version]
24
26
  @application_id = data[:application_id]
@@ -38,6 +40,278 @@ module Algolia
38
40
  }
39
41
  end
40
42
 
43
+ #
44
+ # Initialize a new index
45
+ #
46
+ def init_index(name)
47
+ Index.new(name, self)
48
+ end
49
+
50
+ #
51
+ # Allow to set custom headers
52
+ #
53
+ def set_extra_header(key, value)
54
+ headers[key] = value
55
+ end
56
+
57
+ #
58
+ # Allow to use IP rate limit when you have a proxy between end-user and Algolia.
59
+ # This option will set the X-Forwarded-For HTTP header with the client IP and the X-Forwarded-API-Key with the API Key having rate limits.
60
+ # @param admin_api_key the admin API Key you can find in your dashboard
61
+ # @param end_user_ip the end user IP (you can use both IPV4 or IPV6 syntax)
62
+ # @param rate_limit_api_key the API key on which you have a rate limit
63
+ #
64
+ def enable_rate_limit_forward(admin_api_key, end_user_ip, rate_limit_api_key)
65
+ headers[Protocol::HEADER_API_KEY] = admin_api_key
66
+ headers[Protocol::HEADER_FORWARDED_IP] = end_user_ip
67
+ headers[Protocol::HEADER_FORWARDED_API_KEY] = rate_limit_api_key
68
+ end
69
+
70
+ #
71
+ # Disable IP rate limit enabled with enableRateLimitForward() function
72
+ #
73
+ def disable_rate_limit_forward
74
+ headers[Protocol::HEADER_API_KEY] = Algolia.client.api_key
75
+ headers.delete(Protocol::HEADER_FORWARDED_IP)
76
+ headers.delete(Protocol::HEADER_FORWARDED_API_KEY)
77
+ end
78
+
79
+ #
80
+ # Convenience method thats wraps enable_rate_limit_forward/disable_rate_limit_forward
81
+ #
82
+ def with_rate_limits(end_user_ip, rate_limit_api_key, &block)
83
+ enable_rate_limit_forward(Algolia.client.api_key, end_user_ip, rate_limit_api_key)
84
+ begin
85
+ yield
86
+ ensure
87
+ disable_rate_limit_forward
88
+ end
89
+ end
90
+
91
+ #
92
+ # This method allows to query multiple indexes with one API call
93
+ #
94
+ # @param queries the array of hash representing the query and associated index name
95
+ # @param index_name_key the name of the key used to fetch the index_name (:index_name by default)
96
+ # @param strategy define the strategy applied on the sequential searches (none by default)
97
+ #
98
+ def multiple_queries(queries, index_name_key = :index_name, strategy = "none")
99
+ requests = {
100
+ :requests => queries.map do |query|
101
+ indexName = query.delete(index_name_key) || query.delete(index_name_key.to_s)
102
+ encoded_params = Hash[query.map { |k,v| [k.to_s, v.is_a?(Array) ? v.to_json : v] }]
103
+ { :indexName => indexName, :params => Protocol.to_query(encoded_params) }
104
+ end
105
+ }
106
+ post(Protocol.multiple_queries_uri(strategy), requests.to_json, :search)
107
+ end
108
+
109
+ #
110
+ # List all existing indexes
111
+ # return an Answer object with answer in the form
112
+ # {"items": [{ "name": "contacts", "createdAt": "2013-01-18T15:33:13.556Z"},
113
+ # {"name": "notes", "createdAt": "2013-01-18T15:33:13.556Z"}]}
114
+ #
115
+ def list_indexes
116
+ get(Protocol.indexes_uri, :read)
117
+ end
118
+
119
+ #
120
+ # Move an existing index.
121
+ # @param src_index the name of index to copy.
122
+ # @param dst_index the new index name that will contains a copy of srcIndexName (destination will be overriten if it already exist).
123
+ #
124
+ def move_index(src_index, dst_index)
125
+ request = {"operation" => "move", "destination" => dst_index};
126
+ post(Protocol.index_operation_uri(src_index), request.to_json)
127
+ end
128
+
129
+ #
130
+ # Move an existing index and wait until the move has been processed
131
+ # @param src_index the name of index to copy.
132
+ # @param dst_index the new index name that will contains a copy of srcIndexName (destination will be overriten if it already exist).
133
+ #
134
+ def move_index!(src_index, dst_index)
135
+ res = Algolia.move_index(src_index, dst_index)
136
+ init_index(dst_index).wait_task(res['taskID'])
137
+ res
138
+ end
139
+
140
+ #
141
+ # Copy an existing index.
142
+ # @param src_index the name of index to copy.
143
+ # @param dst_index the new index name that will contains a copy of srcIndexName (destination will be overriten if it already exist).
144
+ #
145
+ def copy_index(src_index, dst_index)
146
+ request = {"operation" => "copy", "destination" => dst_index};
147
+ Algolia.client.post(Protocol.index_operation_uri(src_index), request.to_json)
148
+ end
149
+
150
+ #
151
+ # Copy an existing index and wait until the copy has been processed.
152
+ # @param src_index the name of index to copy.
153
+ # @param dst_index the new index name that will contains a copy of srcIndexName (destination will be overriten if it already exist).
154
+ #
155
+ def copy_index!(src_index, dst_index)
156
+ res = Algolia.copy_index(src_index, dst_index)
157
+ init_index(dst_index).wait_task(res['taskID'])
158
+ res
159
+ end
160
+
161
+ # Delete an index
162
+ #
163
+ def delete_index(name)
164
+ init_index(name).delete
165
+ end
166
+
167
+ # Delete an index and wait until the deletion has been processed.
168
+ #
169
+ def delete_index!(name)
170
+ init_index(name).delete!
171
+ end
172
+
173
+ #
174
+ # Return last logs entries.
175
+ #
176
+ # @param offset Specify the first entry to retrieve (0-based, 0 is the most recent log entry).
177
+ # @param length Specify the maximum number of entries to retrieve starting at offset. Maximum allowed value: 1000.
178
+ #
179
+ def get_logs(offset = 0, length = 10, type = "all")
180
+ if (type.is_a?(true.class))
181
+ if (type)
182
+ type = "error"
183
+ else
184
+ type = "all"
185
+ end
186
+ end
187
+ get(Protocol.logs(offset, length, type))
188
+ end
189
+
190
+ # List all existing user keys with their associated ACLs
191
+ def list_user_keys
192
+ get(Protocol.keys_uri, :read)
193
+ end
194
+
195
+ # Get ACL of a user key
196
+ def get_user_key(key)
197
+ get(Protocol.key_uri(key), :read)
198
+ end
199
+
200
+ #
201
+ # Create a new user key
202
+ #
203
+ # @param obj can be two different parameters:
204
+ # The list of parameters for this key. Defined by a NSDictionary that
205
+ # can contains the following values:
206
+ # - acl: array of string
207
+ # - indices: array of string
208
+ # - validity: int
209
+ # - referers: array of string
210
+ # - description: string
211
+ # - maxHitsPerQuery: integer
212
+ # - queryParameters: string
213
+ # - maxQueriesPerIPPerHour: integer
214
+ # Or the list of ACL for this key. Defined by an array of NSString that
215
+ # can contains the following values:
216
+ # - search: allow to search (https and http)
217
+ # - addObject: allows to add/update an object in the index (https only)
218
+ # - deleteObject : allows to delete an existing object (https only)
219
+ # - deleteIndex : allows to delete index content (https only)
220
+ # - settings : allows to get index settings (https only)
221
+ # - editSettings : allows to change index settings (https only)
222
+ # @param validity the number of seconds after which the key will be automatically removed (0 means no time limit for this key)
223
+ # @param maxQueriesPerIPPerHour the maximum number of API calls allowed from an IP address per hour (0 means unlimited)
224
+ # @param maxHitsPerQuery the maximum number of hits this API key can retrieve in one call (0 means unlimited)
225
+ # @param indexes the optional list of targeted indexes
226
+ #
227
+ def add_user_key(obj, validity = 0, maxQueriesPerIPPerHour = 0, maxHitsPerQuery = 0, indexes = nil)
228
+ if obj.instance_of? Array
229
+ params = {
230
+ :acl => obj
231
+ }
232
+ else
233
+ params = obj
234
+ end
235
+ if validity != 0
236
+ params["validity"] = validity.to_i
237
+ end
238
+ if maxQueriesPerIPPerHour != 0
239
+ params["maxQueriesPerIPPerHour"] = maxQueriesPerIPPerHour.to_i
240
+ end
241
+ if maxHitsPerQuery != 0
242
+ params["maxHitsPerQuery"] = maxHitsPerQuery.to_i
243
+ end
244
+ params[:indexes] = indexes if indexes
245
+ post(Protocol.keys_uri, params.to_json)
246
+ end
247
+
248
+ #
249
+ # Update a user key
250
+ #
251
+ # @param obj can be two different parameters:
252
+ # The list of parameters for this key. Defined by a NSDictionary that
253
+ # can contains the following values:
254
+ # - acl: array of string
255
+ # - indices: array of string
256
+ # - validity: int
257
+ # - referers: array of string
258
+ # - description: string
259
+ # - maxHitsPerQuery: integer
260
+ # - queryParameters: string
261
+ # - maxQueriesPerIPPerHour: integer
262
+ # Or the list of ACL for this key. Defined by an array of NSString that
263
+ # can contains the following values:
264
+ # - search: allow to search (https and http)
265
+ # - addObject: allows to add/update an object in the index (https only)
266
+ # - deleteObject : allows to delete an existing object (https only)
267
+ # - deleteIndex : allows to delete index content (https only)
268
+ # - settings : allows to get index settings (https only)
269
+ # - editSettings : allows to change index settings (https only)
270
+ # @param validity the number of seconds after which the key will be automatically removed (0 means no time limit for this key)
271
+ # @param maxQueriesPerIPPerHour the maximum number of API calls allowed from an IP address per hour (0 means unlimited)
272
+ # @param maxHitsPerQuery the maximum number of hits this API key can retrieve in one call (0 means unlimited)
273
+ # @param indexes the optional list of targeted indexes
274
+ #
275
+ def update_user_key(key, obj, validity = 0, maxQueriesPerIPPerHour = 0, maxHitsPerQuery = 0, indexes = nil)
276
+ if obj.instance_of? Array
277
+ params = {
278
+ :acl => obj
279
+ }
280
+ else
281
+ params = obj
282
+ end
283
+ if validity != 0
284
+ params["validity"] = validity.to_i
285
+ end
286
+ if maxQueriesPerIPPerHour != 0
287
+ params["maxQueriesPerIPPerHour"] = maxQueriesPerIPPerHour.to_i
288
+ end
289
+ if maxHitsPerQuery != 0
290
+ params["maxHitsPerQuery"] = maxHitsPerQuery.to_i
291
+ end
292
+ params[:indexes] = indexes if indexes
293
+ put(Protocol.key_uri(key), params.to_json)
294
+ end
295
+
296
+
297
+ # Delete an existing user key
298
+ def delete_user_key(key)
299
+ delete(Protocol.key_uri(key))
300
+ end
301
+
302
+ # Send a batch request targeting multiple indices
303
+ def batch(requests)
304
+ post(Protocol.batch_uri, {"requests" => requests}.to_json, :batch)
305
+ end
306
+
307
+ # Send a batch request targeting multiple indices and wait the end of the indexing
308
+ def batch!(requests)
309
+ res = batch(requests)
310
+ res['taskID'].each do |index, taskID|
311
+ init_index(index).wait_task(taskID)
312
+ end
313
+ end
314
+
41
315
  # Perform an HTTP request for the given uri and method
42
316
  # with common basic response handling. Will raise a
43
317
  # AlgoliaProtocolError if the response has an error status code,
@@ -101,7 +375,7 @@ module Algolia
101
375
  def thread_local_hosts(read, connect_timeout, send_timeout, receive_timeout)
102
376
  thread_local_var = read ? :algolia_search_hosts : :algolia_hosts
103
377
  Thread.current[thread_local_var] ||= {}
104
- Thread.current[thread_local_var]["#{connect_timeout}-#{send_timeout}-#{receive_timeout}"] ||= (read ? search_hosts : hosts).map do |host|
378
+ Thread.current[thread_local_var]["#{self.hash}:#{connect_timeout}-#{send_timeout}-#{receive_timeout}"] ||= (read ? search_hosts : hosts).map do |host|
105
379
  client = HTTPClient.new
106
380
  client.ssl_config.ssl_version = @ssl_version if @ssl && @ssl_version
107
381
  hinfo = {
@@ -117,7 +391,6 @@ module Algolia
117
391
  end
118
392
  end
119
393
 
120
- private
121
394
  def perform_request(session, url, method, data)
122
395
  response = case method
123
396
  when :GET
@@ -153,8 +426,6 @@ module Algolia
153
426
  defaulted = { :application_id => application_id, :api_key => api_key }
154
427
  defaulted.merge!(options)
155
428
 
156
- raise ArgumentError.new("No APPLICATION_ID provided, please set :application_id") if defaulted[:application_id].nil?
157
-
158
429
  @@client = Client.new(defaulted)
159
430
  end
160
431
 
@@ -162,7 +433,7 @@ module Algolia
162
433
  # Allow to set custom headers
163
434
  #
164
435
  def Algolia.set_extra_header(key, value)
165
- Algolia.client.headers[key] = value
436
+ Algolia.client.set_extra_header(key, value)
166
437
  end
167
438
 
168
439
  #
@@ -173,30 +444,21 @@ module Algolia
173
444
  # @param rate_limit_api_key the API key on which you have a rate limit
174
445
  #
175
446
  def Algolia.enable_rate_limit_forward(admin_api_key, end_user_ip, rate_limit_api_key)
176
- Algolia.client.headers[Protocol::HEADER_API_KEY] = admin_api_key
177
- Algolia.client.headers[Protocol::HEADER_FORWARDED_IP] = end_user_ip
178
- Algolia.client.headers[Protocol::HEADER_FORWARDED_API_KEY] = rate_limit_api_key
447
+ Algolia.client.enable_rate_limit_forward(admin_api_key, end_user_ip, rate_limit_api_key)
179
448
  end
180
449
 
181
450
  #
182
451
  # Disable IP rate limit enabled with enableRateLimitForward() function
183
452
  #
184
453
  def Algolia.disable_rate_limit_forward
185
- Algolia.client.headers[Protocol::HEADER_API_KEY] = Algolia.client.api_key
186
- Algolia.client.headers.delete(Protocol::HEADER_FORWARDED_IP)
187
- Algolia.client.headers.delete(Protocol::HEADER_FORWARDED_API_KEY)
454
+ Algolia.client.disable_rate_limit_forward
188
455
  end
189
456
 
190
457
  #
191
458
  # Convenience method thats wraps enable_rate_limit_forward/disable_rate_limit_forward
192
459
  #
193
460
  def Algolia.with_rate_limits(end_user_ip, rate_limit_api_key, &block)
194
- Algolia.enable_rate_limit_forward(Algolia.client.api_key, end_user_ip, rate_limit_api_key)
195
- begin
196
- yield
197
- ensure
198
- Algolia.disable_rate_limit_forward
199
- end
461
+ Algolia.client.with_rate_limits(end_user_ip, rate_limit_api_key, &block)
200
462
  end
201
463
 
202
464
  #
@@ -223,14 +485,7 @@ module Algolia
223
485
  # @param strategy define the strategy applied on the sequential searches (none by default)
224
486
  #
225
487
  def Algolia.multiple_queries(queries, index_name_key = :index_name, strategy = "none")
226
- requests = {
227
- :requests => queries.map do |query|
228
- indexName = query.delete(index_name_key) || query.delete(index_name_key.to_s)
229
- encoded_params = Hash[query.map { |k,v| [k.to_s, v.is_a?(Array) ? v.to_json : v] }]
230
- { :indexName => indexName, :params => Protocol.to_query(encoded_params) }
231
- end
232
- }
233
- Algolia.client.post(Protocol.multiple_queries_uri(strategy), requests.to_json, :search)
488
+ Algolia.client.multiple_queries(queries, index_name_key, strategy)
234
489
  end
235
490
 
236
491
  #
@@ -240,7 +495,7 @@ module Algolia
240
495
  # {"name": "notes", "createdAt": "2013-01-18T15:33:13.556Z"}]}
241
496
  #
242
497
  def Algolia.list_indexes
243
- Algolia.client.get(Protocol.indexes_uri, :read)
498
+ Algolia.client.list_indexes
244
499
  end
245
500
 
246
501
  #
@@ -249,8 +504,7 @@ module Algolia
249
504
  # @param dst_index the new index name that will contains a copy of srcIndexName (destination will be overriten if it already exist).
250
505
  #
251
506
  def Algolia.move_index(src_index, dst_index)
252
- request = {"operation" => "move", "destination" => dst_index};
253
- Algolia.client.post(Protocol.index_operation_uri(src_index), request.to_json)
507
+ Algolia.client.move_index(src_index, dst_index)
254
508
  end
255
509
 
256
510
  #
@@ -259,9 +513,7 @@ module Algolia
259
513
  # @param dst_index the new index name that will contains a copy of srcIndexName (destination will be overriten if it already exist).
260
514
  #
261
515
  def Algolia.move_index!(src_index, dst_index)
262
- res = Algolia.move_index(src_index, dst_index)
263
- Index.new(dst_index).wait_task(res['taskID'])
264
- res
516
+ Algolia.client.move_index!(src_index, dst_index)
265
517
  end
266
518
 
267
519
  #
@@ -270,8 +522,7 @@ module Algolia
270
522
  # @param dst_index the new index name that will contains a copy of srcIndexName (destination will be overriten if it already exist).
271
523
  #
272
524
  def Algolia.copy_index(src_index, dst_index)
273
- request = {"operation" => "copy", "destination" => dst_index};
274
- Algolia.client.post(Protocol.index_operation_uri(src_index), request.to_json)
525
+ Algolia.client.copy_index(src_index, dst_index)
275
526
  end
276
527
 
277
528
  #
@@ -280,21 +531,19 @@ module Algolia
280
531
  # @param dst_index the new index name that will contains a copy of srcIndexName (destination will be overriten if it already exist).
281
532
  #
282
533
  def Algolia.copy_index!(src_index, dst_index)
283
- res = Algolia.copy_index(src_index, dst_index)
284
- Index.new(dst_index).wait_task(res['taskID'])
285
- res
534
+ Algolia.client.copy_index!(src_index, dst_index)
286
535
  end
287
536
 
288
537
  # Delete an index
289
538
  #
290
- def delete_index(name)
291
- Index.new(name).delete
539
+ def Algolia.delete_index(name)
540
+ Algolia.client.delete_index(name)
292
541
  end
293
542
 
294
543
  # Delete an index and wait until the deletion has been processed.
295
544
  #
296
- def delete_index!(name)
297
- Index.new(name).delete!
545
+ def Algolia.delete_index!(name)
546
+ Algolia.client.delete_index!(name)
298
547
  end
299
548
 
300
549
  #
@@ -304,24 +553,17 @@ module Algolia
304
553
  # @param length Specify the maximum number of entries to retrieve starting at offset. Maximum allowed value: 1000.
305
554
  #
306
555
  def Algolia.get_logs(offset = 0, length = 10, type = "all")
307
- if (type.is_a?(true.class))
308
- if (type)
309
- type = "error"
310
- else
311
- type = "all"
312
- end
313
- end
314
- Algolia.client.get(Protocol.logs(offset, length, type))
556
+ Algolia.client.get_logs(offset, length, type)
315
557
  end
316
558
 
317
559
  # List all existing user keys with their associated ACLs
318
560
  def Algolia.list_user_keys
319
- Algolia.client.get(Protocol.keys_uri, :read)
561
+ Algolia.client.list_user_keys
320
562
  end
321
563
 
322
564
  # Get ACL of a user key
323
565
  def Algolia.get_user_key(key)
324
- Algolia.client.get(Protocol.key_uri(key), :read)
566
+ Algolia.client.get_user_key(key)
325
567
  end
326
568
 
327
569
  #
@@ -352,24 +594,7 @@ module Algolia
352
594
  # @param indexes the optional list of targeted indexes
353
595
  #
354
596
  def Algolia.add_user_key(obj, validity = 0, maxQueriesPerIPPerHour = 0, maxHitsPerQuery = 0, indexes = nil)
355
- if obj.instance_of? Array
356
- params = {
357
- :acl => obj
358
- }
359
- else
360
- params = obj
361
- end
362
- if validity != 0
363
- params["validity"] = validity.to_i
364
- end
365
- if maxQueriesPerIPPerHour != 0
366
- params["maxQueriesPerIPPerHour"] = maxQueriesPerIPPerHour.to_i
367
- end
368
- if maxHitsPerQuery != 0
369
- params["maxHitsPerQuery"] = maxHitsPerQuery.to_i
370
- end
371
- params[:indexes] = indexes if indexes
372
- Algolia.client.post(Protocol.keys_uri, params.to_json)
597
+ Algolia.client.add_user_key(obj, validity, maxQueriesPerIPPerHour, maxHitsPerQuery, indexes)
373
598
  end
374
599
 
375
600
  #
@@ -400,43 +625,22 @@ module Algolia
400
625
  # @param indexes the optional list of targeted indexes
401
626
  #
402
627
  def Algolia.update_user_key(key, obj, validity = 0, maxQueriesPerIPPerHour = 0, maxHitsPerQuery = 0, indexes = nil)
403
- if obj.instance_of? Array
404
- params = {
405
- :acl => obj
406
- }
407
- else
408
- params = obj
409
- end
410
- if validity != 0
411
- params["validity"] = validity.to_i
412
- end
413
- if maxQueriesPerIPPerHour != 0
414
- params["maxQueriesPerIPPerHour"] = maxQueriesPerIPPerHour.to_i
415
- end
416
- if maxHitsPerQuery != 0
417
- params["maxHitsPerQuery"] = maxHitsPerQuery.to_i
418
- end
419
- params[:indexes] = indexes if indexes
420
- Algolia.client.put(Protocol.key_uri(key), params.to_json)
628
+ Algolia.client.update_user_key(key, obj, validity, maxQueriesPerIPPerHour, maxHitsPerQuery, indexes)
421
629
  end
422
630
 
423
-
424
631
  # Delete an existing user key
425
632
  def Algolia.delete_user_key(key)
426
- Algolia.client.delete(Protocol.key_uri(key))
633
+ Algolia.client.delete_user_key(key)
427
634
  end
428
635
 
429
636
  # Send a batch request targeting multiple indices
430
637
  def Algolia.batch(requests)
431
- Algolia.client.post(Protocol.batch_uri, {"requests" => requests}.to_json, :batch)
638
+ Algolia.client.batch(requests)
432
639
  end
433
640
 
434
641
  # Send a batch request targeting multiple indices and wait the end of the indexing
435
642
  def Algolia.batch!(requests)
436
- res = batch(requests)
437
- res['taskID'].each { |index, taskID|
438
- Algolia::Index.new(index).wait_task(taskID)
439
- }
643
+ Algolia.client.batch!(requests)
440
644
  end
441
645
 
442
646
  # Used mostly for testing. Lets you delete the api key global vars.
@@ -2,19 +2,20 @@ require 'algolia/client'
2
2
  require 'algolia/error'
3
3
 
4
4
  module Algolia
5
-
5
+
6
6
  class Index
7
- attr_accessor :name
8
-
9
- def initialize(name)
7
+ attr_accessor :name, :client
8
+
9
+ def initialize(name, client = nil)
10
10
  self.name = name
11
+ self.client = client || Algolia.client
11
12
  end
12
-
13
+
13
14
  # Delete an index
14
15
  #
15
16
  # return an hash of the form { "deletedAt" => "2013-01-18T15:33:13.556Z", "taskID" => "42" }
16
17
  def delete
17
- Algolia.client.delete(Protocol.index_uri(name))
18
+ client.delete(Protocol.index_uri(name))
18
19
  end
19
20
  alias_method :delete_index, :delete
20
21
 
@@ -29,25 +30,25 @@ module Algolia
29
30
  alias_method :delete_index!, :delete!
30
31
 
31
32
  # Add an object in this index
32
- #
33
- # @param obj the object to add to the index.
33
+ #
34
+ # @param obj the object to add to the index.
34
35
  # The object is represented by an associative array
35
- # @param objectID (optional) an objectID you want to attribute to this object
36
+ # @param objectID (optional) an objectID you want to attribute to this object
36
37
  # (if the attribute already exist the old object will be overridden)
37
38
  def add_object(obj, objectID = nil)
38
39
  check_object obj
39
40
  if objectID.nil? || objectID.to_s.empty?
40
- Algolia.client.post(Protocol.index_uri(name), obj.to_json)
41
+ client.post(Protocol.index_uri(name), obj.to_json)
41
42
  else
42
- Algolia.client.put(Protocol.object_uri(name, objectID), obj.to_json)
43
+ client.put(Protocol.object_uri(name, objectID), obj.to_json)
43
44
  end
44
45
  end
45
-
46
+
46
47
  # Add an object in this index and wait end of indexing
47
- #
48
+ #
48
49
  # @param obj the object to add to the index.
49
50
  # The object is represented by an associative array
50
- # @param objectID (optional) an objectID you want to attribute to this object
51
+ # @param objectID (optional) an objectID you want to attribute to this object
51
52
  # (if the attribute already exist the old object will be overridden)
52
53
  def add_object!(obj, objectID = nil)
53
54
  res = add_object(obj, objectID)
@@ -56,16 +57,16 @@ module Algolia
56
57
  end
57
58
 
58
59
  # Add several objects in this index
59
- #
60
- # @param objs the array of objects to add inside the index.
60
+ #
61
+ # @param objs the array of objects to add inside the index.
61
62
  # Each object is represented by an associative array
62
63
  def add_objects(objs)
63
64
  batch build_batch('addObject', objs, false)
64
65
  end
65
-
66
+
66
67
  # Add several objects in this index and wait end of indexing
67
- #
68
- # @param objs the array of objects to add inside the index.
68
+ #
69
+ # @param objs the array of objects to add inside the index.
69
70
  # Each object is represented by an associative array
70
71
  def add_objects!(obj)
71
72
  res = add_objects(obj)
@@ -82,65 +83,66 @@ module Algolia
82
83
  # - hitsPerPage: (integer) Pagination parameter used to select the number of hits per page. Defaults to 20.
83
84
  # - attributesToRetrieve: a string that contains the list of object attributes you want to retrieve (let you minimize the answer size).
84
85
  # Attributes are separated with a comma (for example "name,address").
85
- # You can also use a string array encoding (for example ["name","address"]).
86
+ # You can also use a string array encoding (for example ["name","address"]).
86
87
  # By default, all attributes are retrieved. You can also use '*' to retrieve all values when an attributesToRetrieve setting is specified for your index.
87
- # - attributesToHighlight: a string that contains the list of attributes you want to highlight according to the query.
88
- # Attributes are separated by a comma. You can also use a string array encoding (for example ["name","address"]).
89
- # If an attribute has no match for the query, the raw value is returned. By default all indexed text attributes are highlighted.
90
- # You can use `*` if you want to highlight all textual attributes. Numerical attributes are not highlighted.
88
+ # - attributesToHighlight: a string that contains the list of attributes you want to highlight according to the query.
89
+ # Attributes are separated by a comma. You can also use a string array encoding (for example ["name","address"]).
90
+ # If an attribute has no match for the query, the raw value is returned. By default all indexed text attributes are highlighted.
91
+ # You can use `*` if you want to highlight all textual attributes. Numerical attributes are not highlighted.
91
92
  # A matchLevel is returned for each highlighted attribute and can contain:
92
93
  # - full: if all the query terms were found in the attribute,
93
94
  # - partial: if only some of the query terms were found,
94
95
  # - none: if none of the query terms were found.
95
- # - attributesToSnippet: a string that contains the list of attributes to snippet alongside the number of words to return (syntax is `attributeName:nbWords`).
96
+ # - attributesToSnippet: a string that contains the list of attributes to snippet alongside the number of words to return (syntax is `attributeName:nbWords`).
96
97
  # Attributes are separated by a comma (Example: attributesToSnippet=name:10,content:10).
97
98
  # You can also use a string array encoding (Example: attributesToSnippet: ["name:10","content:10"]). By default no snippet is computed.
98
99
  # - minWordSizefor1Typo: the minimum number of characters in a query word to accept one typo in this word. Defaults to 3.
99
100
  # - minWordSizefor2Typos: the minimum number of characters in a query word to accept two typos in this word. Defaults to 7.
100
101
  # - getRankingInfo: if set to 1, the result hits will contain ranking information in _rankingInfo attribute.
101
102
  # - aroundLatLng: search for entries around a given latitude/longitude (specified as two floats separated by a comma).
102
- # For example aroundLatLng=47.316669,5.016670).
103
+ # For example aroundLatLng=47.316669,5.016670).
103
104
  # You can specify the maximum distance in meters with the aroundRadius parameter (in meters) and the precision for ranking with aroundPrecision
104
105
  # (for example if you set aroundPrecision=100, two objects that are distant of less than 100m will be considered as identical for "geo" ranking parameter).
105
106
  # At indexing, you should specify geoloc of an object with the _geoloc attribute (in the form {"_geoloc":{"lat":48.853409, "lng":2.348800}})
106
107
  # - insideBoundingBox: search entries inside a given area defined by the two extreme points of a rectangle (defined by 4 floats: p1Lat,p1Lng,p2Lat,p2Lng).
107
108
  # For example insideBoundingBox=47.3165,4.9665,47.3424,5.0201).
108
109
  # At indexing, you should specify geoloc of an object with the _geoloc attribute (in the form {"_geoloc":{"lat":48.853409, "lng":2.348800}})
109
- # - numericFilters: a string that contains the list of numeric filters you want to apply separated by a comma.
110
- # The syntax of one filter is `attributeName` followed by `operand` followed by `value`. Supported operands are `<`, `<=`, `=`, `>` and `>=`.
111
- # You can have multiple conditions on one attribute like for example numericFilters=price>100,price<1000.
110
+ # - numericFilters: a string that contains the list of numeric filters you want to apply separated by a comma.
111
+ # The syntax of one filter is `attributeName` followed by `operand` followed by `value`. Supported operands are `<`, `<=`, `=`, `>` and `>=`.
112
+ # You can have multiple conditions on one attribute like for example numericFilters=price>100,price<1000.
112
113
  # You can also use a string array encoding (for example numericFilters: ["price>100","price<1000"]).
113
- # - tagFilters: filter the query by a set of tags. You can AND tags by separating them by commas.
114
+ # - tagFilters: filter the query by a set of tags. You can AND tags by separating them by commas.
114
115
  # To OR tags, you must add parentheses. For example, tags=tag1,(tag2,tag3) means tag1 AND (tag2 OR tag3).
115
116
  # You can also use a string array encoding, for example tagFilters: ["tag1",["tag2","tag3"]] means tag1 AND (tag2 OR tag3).
116
- # At indexing, tags should be added in the _tags** attribute of objects (for example {"_tags":["tag1","tag2"]}).
117
- # - facetFilters: filter the query by a list of facets.
118
- # Facets are separated by commas and each facet is encoded as `attributeName:value`.
119
- # For example: `facetFilters=category:Book,author:John%20Doe`.
117
+ # At indexing, tags should be added in the _tags** attribute of objects (for example {"_tags":["tag1","tag2"]}).
118
+ # - facetFilters: filter the query by a list of facets.
119
+ # Facets are separated by commas and each facet is encoded as `attributeName:value`.
120
+ # For example: `facetFilters=category:Book,author:John%20Doe`.
120
121
  # You can also use a string array encoding (for example `["category:Book","author:John%20Doe"]`).
121
- # - facets: List of object attributes that you want to use for faceting.
122
- # Attributes are separated with a comma (for example `"category,author"` ).
122
+ # - facets: List of object attributes that you want to use for faceting.
123
+ # Attributes are separated with a comma (for example `"category,author"` ).
123
124
  # You can also use a JSON string array encoding (for example ["category","author"]).
124
- # Only attributes that have been added in **attributesForFaceting** index setting can be used in this parameter.
125
+ # Only attributes that have been added in **attributesForFaceting** index setting can be used in this parameter.
125
126
  # You can also use `*` to perform faceting on all attributes specified in **attributesForFaceting**.
126
127
  # - queryType: select how the query words are interpreted, it can be one of the following value:
127
128
  # - prefixAll: all query words are interpreted as prefixes,
128
129
  # - prefixLast: only the last word is interpreted as a prefix (default behavior),
129
130
  # - prefixNone: no query word is interpreted as a prefix. This option is not recommended.
130
- # - optionalWords: a string that contains the list of words that should be considered as optional when found in the query.
131
+ # - optionalWords: a string that contains the list of words that should be considered as optional when found in the query.
131
132
  # The list of words is comma separated.
132
- # - distinct: If set to 1, enable the distinct feature (disabled by default) if the attributeForDistinct index setting is set.
133
- # This feature is similar to the SQL "distinct" keyword: when enabled in a query with the distinct=1 parameter,
134
- # all hits containing a duplicate value for the attributeForDistinct attribute are removed from results.
135
- # For example, if the chosen attribute is show_name and several hits have the same value for show_name, then only the best
133
+ # - distinct: If set to 1, enable the distinct feature (disabled by default) if the attributeForDistinct index setting is set.
134
+ # This feature is similar to the SQL "distinct" keyword: when enabled in a query with the distinct=1 parameter,
135
+ # all hits containing a duplicate value for the attributeForDistinct attribute are removed from results.
136
+ # For example, if the chosen attribute is show_name and several hits have the same value for show_name, then only the best
136
137
  # one is kept and others are removed.
137
138
  def search(query, params = {})
138
139
  encoded_params = Hash[params.map { |k,v| [k.to_s, v.is_a?(Array) ? v.to_json : v] }]
139
- Algolia.client.get(Protocol.search_uri(name, query, encoded_params), :search)
140
+ client.get(Protocol.search_uri(name, query, encoded_params), :search)
140
141
  end
141
142
 
142
143
  class IndexBrowser
143
- def initialize(name, params)
144
+ def initialize(client, name, params)
145
+ @client = client
144
146
  @name = name
145
147
  @params = params
146
148
  @cursor = params[:cursor] || params['cursor'] || nil
@@ -148,7 +150,7 @@ module Algolia
148
150
 
149
151
  def browse(&block)
150
152
  loop do
151
- answer = Algolia.client.get(Protocol.browse_uri(@name, @params.merge({ :cursor => @cursor })), :read)
153
+ answer = @client.get(Protocol.browse_uri(@name, @params.merge({ :cursor => @cursor })), :read)
152
154
  answer['hits'].each do |hit|
153
155
  if block.arity == 2
154
156
  yield hit, @cursor
@@ -185,11 +187,11 @@ module Algolia
185
187
  else
186
188
  params[:hitsPerPage] = hitsPerPage unless hitsPerPage.nil?
187
189
  end
188
- IndexBrowser.new(name, params).browse(&block)
190
+ IndexBrowser.new(client, name, params).browse(&block)
189
191
  else
190
192
  page ||= 0
191
193
  hitsPerPage ||= 1000
192
- Algolia.client.get(Protocol.browse_uri(name, {:page => page, :hitsPerPage => hitsPerPage}), :read)
194
+ client.get(Protocol.browse_uri(name, {:page => page, :hitsPerPage => hitsPerPage}), :read)
193
195
  end
194
196
  end
195
197
 
@@ -197,20 +199,20 @@ module Algolia
197
199
  # Browse a single page from a specific cursor
198
200
  #
199
201
  def browse_from(cursor, hitsPerPage = 1000)
200
- Algolia.client.get(Protocol.browse_uri(name, { :cursor => cursor, :hitsPerPage => hitsPerPage }), :read)
202
+ client.get(Protocol.browse_uri(name, { :cursor => cursor, :hitsPerPage => hitsPerPage }), :read)
201
203
  end
202
204
 
203
205
  #
204
206
  # Get an object from this index
205
- #
207
+ #
206
208
  # @param objectID the unique identifier of the object to retrieve
207
209
  # @param attributesToRetrieve (optional) if set, contains the list of attributes to retrieve as a string separated by ","
208
210
  #
209
211
  def get_object(objectID, attributesToRetrieve = nil)
210
212
  if attributesToRetrieve.nil?
211
- Algolia.client.get(Protocol.object_uri(name, objectID, nil), :read)
213
+ client.get(Protocol.object_uri(name, objectID, nil), :read)
212
214
  else
213
- Algolia.client.get(Protocol.object_uri(name, objectID, {:attributes => attributesToRetrieve}), :read)
215
+ client.get(Protocol.object_uri(name, objectID, {:attributes => attributesToRetrieve}), :read)
214
216
  end
215
217
  end
216
218
 
@@ -220,18 +222,18 @@ module Algolia
220
222
  # @param objectIDs the array of unique identifier of the objects to retrieve
221
223
  #
222
224
  def get_objects(objectIDs)
223
- Algolia.client.post(Protocol.objects_uri, { :requests => objectIDs.map { |objectID| { :indexName => name, :objectID => objectID } } }.to_json, :read)['results']
225
+ client.post(Protocol.objects_uri, { :requests => objectIDs.map { |objectID| { :indexName => name, :objectID => objectID } } }.to_json, :read)['results']
224
226
  end
225
227
 
226
- # Wait the publication of a task on the server.
228
+ # Wait the publication of a task on the server.
227
229
  # All server task are asynchronous and you can check with this method that the task is published.
228
230
  #
229
231
  # @param taskID the id of the task returned by server
230
232
  # @param timeBeforeRetry the time in milliseconds before retry (default = 100ms)
231
- #
233
+ #
232
234
  def wait_task(taskID, timeBeforeRetry = 100)
233
235
  loop do
234
- status = Algolia.client.get(Protocol.task_uri(name, taskID), :read)["status"]
236
+ status = client.get(Protocol.task_uri(name, taskID), :read)["status"]
235
237
  if status == "published"
236
238
  return
237
239
  end
@@ -240,19 +242,19 @@ module Algolia
240
242
  end
241
243
 
242
244
  # Override the content of an object
243
- #
245
+ #
244
246
  # @param obj the object to save
245
247
  # @param objectID the associated objectID, if nil 'obj' must contain an 'objectID' key
246
248
  #
247
249
  def save_object(obj, objectID = nil)
248
- Algolia.client.put(Protocol.object_uri(name, get_objectID(obj, objectID)), obj.to_json)
250
+ client.put(Protocol.object_uri(name, get_objectID(obj, objectID)), obj.to_json)
249
251
  end
250
252
 
251
253
  # Override the content of object and wait end of indexing
252
- #
254
+ #
253
255
  # @param obj the object to save
254
256
  # @param objectID the associated objectID, if nil 'obj' must contain an 'objectID' key
255
- #
257
+ #
256
258
  def save_object!(obj, objectID = nil)
257
259
  res = save_object(obj, objectID)
258
260
  wait_task(res["taskID"])
@@ -260,7 +262,7 @@ module Algolia
260
262
  end
261
263
 
262
264
  # Override the content of several objects
263
- #
265
+ #
264
266
  # @param objs the array of objects to save, each object must contain an 'objectID' key
265
267
  #
266
268
  def save_objects(objs)
@@ -268,9 +270,9 @@ module Algolia
268
270
  end
269
271
 
270
272
  # Override the content of several objects and wait end of indexing
271
- #
273
+ #
272
274
  # @param objs the array of objects to save, each object must contain an objectID attribute
273
- #
275
+ #
274
276
  def save_objects!(objs)
275
277
  res = save_objects(objs)
276
278
  wait_task(res["taskID"])
@@ -279,18 +281,18 @@ module Algolia
279
281
 
280
282
  #
281
283
  # Update partially an object (only update attributes passed in argument)
282
- #
284
+ #
283
285
  # @param obj the object attributes to override
284
286
  # @param objectID the associated objectID, if nil 'obj' must contain an 'objectID' key
285
287
  # @param create_if_not_exits a boolean, if true creates the object if this one doesn't exist
286
288
  #
287
289
  def partial_update_object(obj, objectID = nil, create_if_not_exits = true)
288
- Algolia.client.post(Protocol.partial_object_uri(name, get_objectID(obj, objectID), create_if_not_exits), obj.to_json)
290
+ client.post(Protocol.partial_object_uri(name, get_objectID(obj, objectID), create_if_not_exits), obj.to_json)
289
291
  end
290
-
292
+
291
293
  #
292
294
  # Partially Override the content of several objects
293
- #
295
+ #
294
296
  # @param objs an array of objects to update (each object must contains a objectID attribute)
295
297
  # @param create_if_not_exits a boolean, if true create the objects if they don't exist
296
298
  #
@@ -304,7 +306,7 @@ module Algolia
304
306
 
305
307
  #
306
308
  # Partially Override the content of several objects and wait end of indexing
307
- #
309
+ #
308
310
  # @param objs an array of objects to update (each object must contains a objectID attribute)
309
311
  # @param create_if_not_exits a boolean, if true create the objects if they don't exist
310
312
  #
@@ -316,7 +318,7 @@ module Algolia
316
318
 
317
319
  #
318
320
  # Update partially an object (only update attributes passed in argument) and wait indexing
319
- #
321
+ #
320
322
  # @param obj the attributes to override
321
323
  # @param objectID the associated objectID, if nil 'obj' must contain an 'objectID' key
322
324
  # @param create_if_not_exits a boolean, if true creates the object if this one doesn't exist
@@ -326,19 +328,19 @@ module Algolia
326
328
  wait_task(res["taskID"])
327
329
  return res
328
330
  end
329
-
331
+
332
+ #
333
+ # Delete an object from the index
330
334
  #
331
- # Delete an object from the index
332
- #
333
335
  # @param objectID the unique identifier of object to delete
334
336
  #
335
337
  def delete_object(objectID)
336
- Algolia.client.delete(Protocol.object_uri(name, objectID))
338
+ client.delete(Protocol.object_uri(name, objectID))
337
339
  end
338
-
340
+
339
341
  #
340
342
  # Delete an object from the index and wait end of indexing
341
- #
343
+ #
342
344
  # @param objectID the unique identifier of object to delete
343
345
  #
344
346
  def delete_object!(objectID)
@@ -349,7 +351,7 @@ module Algolia
349
351
 
350
352
  #
351
353
  # Delete several objects
352
- #
354
+ #
353
355
  # @param objs an array of objectIDs
354
356
  #
355
357
  def delete_objects(objs)
@@ -359,7 +361,7 @@ module Algolia
359
361
 
360
362
  #
361
363
  # Delete several objects and wait end of indexing
362
- #
364
+ #
363
365
  # @param objs an array of objectIDs
364
366
  #
365
367
  def delete_objects!(objs)
@@ -392,13 +394,13 @@ module Algolia
392
394
 
393
395
  #
394
396
  # Delete the index content
395
- #
397
+ #
396
398
  #
397
399
  def clear
398
- Algolia.client.post(Protocol.clear_uri(name))
400
+ client.post(Protocol.clear_uri(name))
399
401
  end
400
402
  alias_method :clear_index, :clear
401
-
403
+
402
404
  #
403
405
  # Delete the index content and wait end of indexing
404
406
  #
@@ -408,50 +410,50 @@ module Algolia
408
410
  return res
409
411
  end
410
412
  alias_method :clear_index!, :clear!
411
-
413
+
412
414
  #
413
415
  # Set settings for this index
414
- #
416
+ #
415
417
  # @param settigns the settings object that can contains :
416
418
  # - minWordSizefor1Typo: (integer) the minimum number of characters to accept one typo (default = 3).
417
419
  # - minWordSizefor2Typos: (integer) the minimum number of characters to accept two typos (default = 7).
418
420
  # - hitsPerPage: (integer) the number of hits per page (default = 10).
419
- # - attributesToRetrieve: (array of strings) default list of attributes to retrieve in objects.
421
+ # - attributesToRetrieve: (array of strings) default list of attributes to retrieve in objects.
420
422
  # If set to null, all attributes are retrieved.
421
- # - attributesToHighlight: (array of strings) default list of attributes to highlight.
423
+ # - attributesToHighlight: (array of strings) default list of attributes to highlight.
422
424
  # If set to null, all indexed attributes are highlighted.
423
425
  # - attributesToSnippet**: (array of strings) default list of attributes to snippet alongside the number of words to return (syntax is attributeName:nbWords).
424
426
  # By default no snippet is computed. If set to null, no snippet is computed.
425
427
  # - attributesToIndex: (array of strings) the list of fields you want to index.
426
428
  # If set to null, all textual and numerical attributes of your objects are indexed, but you should update it to get optimal results.
427
429
  # This parameter has two important uses:
428
- # - Limit the attributes to index: For example if you store a binary image in base64, you want to store it and be able to
430
+ # - Limit the attributes to index: For example if you store a binary image in base64, you want to store it and be able to
429
431
  # retrieve it but you don't want to search in the base64 string.
430
- # - Control part of the ranking*: (see the ranking parameter for full explanation) Matches in attributes at the beginning of
431
- # the list will be considered more important than matches in attributes further down the list.
432
- # In one attribute, matching text at the beginning of the attribute will be considered more important than text after, you can disable
432
+ # - Control part of the ranking*: (see the ranking parameter for full explanation) Matches in attributes at the beginning of
433
+ # the list will be considered more important than matches in attributes further down the list.
434
+ # In one attribute, matching text at the beginning of the attribute will be considered more important than text after, you can disable
433
435
  # this behavior if you add your attribute inside `unordered(AttributeName)`, for example attributesToIndex: ["title", "unordered(text)"].
434
- # - attributesForFaceting: (array of strings) The list of fields you want to use for faceting.
436
+ # - attributesForFaceting: (array of strings) The list of fields you want to use for faceting.
435
437
  # All strings in the attribute selected for faceting are extracted and added as a facet. If set to null, no attribute is used for faceting.
436
- # - attributeForDistinct: (string) The attribute name used for the Distinct feature. This feature is similar to the SQL "distinct" keyword: when enabled
437
- # in query with the distinct=1 parameter, all hits containing a duplicate value for this attribute are removed from results.
438
+ # - attributeForDistinct: (string) The attribute name used for the Distinct feature. This feature is similar to the SQL "distinct" keyword: when enabled
439
+ # in query with the distinct=1 parameter, all hits containing a duplicate value for this attribute are removed from results.
438
440
  # For example, if the chosen attribute is show_name and several hits have the same value for show_name, then only the best one is kept and others are removed.
439
441
  # - ranking: (array of strings) controls the way results are sorted.
440
- # We have six available criteria:
442
+ # We have six available criteria:
441
443
  # - typo: sort according to number of typos,
442
444
  # - geo: sort according to decreassing distance when performing a geo-location based search,
443
445
  # - proximity: sort according to the proximity of query words in hits,
444
446
  # - attribute: sort according to the order of attributes defined by attributesToIndex,
445
- # - exact:
446
- # - if the user query contains one word: sort objects having an attribute that is exactly the query word before others.
447
- # For example if you search for the "V" TV show, you want to find it with the "V" query and avoid to have all popular TV
447
+ # - exact:
448
+ # - if the user query contains one word: sort objects having an attribute that is exactly the query word before others.
449
+ # For example if you search for the "V" TV show, you want to find it with the "V" query and avoid to have all popular TV
448
450
  # show starting by the v letter before it.
449
451
  # - if the user query contains multiple words: sort according to the number of words that matched exactly (and not as a prefix).
450
452
  # - custom: sort according to a user defined formula set in **customRanking** attribute.
451
453
  # The standard order is ["typo", "geo", "proximity", "attribute", "exact", "custom"]
452
454
  # - customRanking: (array of strings) lets you specify part of the ranking.
453
455
  # The syntax of this condition is an array of strings containing attributes prefixed by asc (ascending order) or desc (descending order) operator.
454
- # For example `"customRanking" => ["desc(population)", "asc(name)"]`
456
+ # For example `"customRanking" => ["desc(population)", "asc(name)"]`
455
457
  # - queryType: Select how the query words are interpreted, it can be one of the following value:
456
458
  # - prefixAll: all query words are interpreted as prefixes,
457
459
  # - prefixLast: only the last word is interpreted as a prefix (default behavior),
@@ -461,24 +463,24 @@ module Algolia
461
463
  # - optionalWords: (array of strings) Specify a list of words that should be considered as optional when found in the query.
462
464
  #
463
465
  def set_settings(new_settings)
464
- Algolia.client.put(Protocol.settings_uri(name), new_settings.to_json)
466
+ client.put(Protocol.settings_uri(name), new_settings.to_json)
465
467
  end
466
-
468
+
467
469
  # Get settings of this index
468
470
  def get_settings
469
- Algolia.client.get(Protocol.settings_uri(name), :read)
470
- end
471
+ client.get(Protocol.settings_uri(name), :read)
472
+ end
471
473
 
472
474
  # List all existing user keys with their associated ACLs
473
475
  def list_user_keys
474
- Algolia.client.get(Protocol.index_keys_uri(name), :read)
476
+ client.get(Protocol.index_keys_uri(name), :read)
475
477
  end
476
-
478
+
477
479
  # Get ACL of a user key
478
480
  def get_user_key(key)
479
- Algolia.client.get(Protocol.index_key_uri(name, key), :read)
481
+ client.get(Protocol.index_key_uri(name, key), :read)
480
482
  end
481
-
483
+
482
484
  #
483
485
  # Create a new user key
484
486
  #
@@ -521,7 +523,7 @@ module Algolia
521
523
  if maxHitsPerQuery != 0
522
524
  params["maxHitsPerQuery"] = maxHitsPerQuery.to_i
523
525
  end
524
- Algolia.client.post(Protocol.index_keys_uri(name), params.to_json)
526
+ client.post(Protocol.index_keys_uri(name), params.to_json)
525
527
  end
526
528
 
527
529
  #
@@ -566,18 +568,18 @@ module Algolia
566
568
  if maxHitsPerQuery != 0
567
569
  params["maxHitsPerQuery"] = maxHitsPerQuery.to_i
568
570
  end
569
- Algolia.client.put(Protocol.index_key_uri(name, key), params.to_json)
571
+ client.put(Protocol.index_key_uri(name, key), params.to_json)
570
572
  end
571
573
 
572
-
574
+
573
575
  # Delete an existing user key
574
576
  def delete_user_key(key)
575
- Algolia.client.delete(Protocol.index_key_uri(name, key))
577
+ client.delete(Protocol.index_key_uri(name, key))
576
578
  end
577
579
 
578
580
  # Send a batch request
579
581
  def batch(request)
580
- Algolia.client.post(Protocol.batch_uri(name), request.to_json, :batch)
582
+ client.post(Protocol.batch_uri(name), request.to_json, :batch)
581
583
  end
582
584
 
583
585
  # Send a batch request and wait the end of the indexing
@@ -648,7 +650,7 @@ module Algolia
648
650
  :analytics => false
649
651
  })
650
652
  end
651
- answers = Algolia.multiple_queries(queries)
653
+ answers = client.multiple_queries(queries)
652
654
 
653
655
  # aggregate answers
654
656
  ## first answer stores the hits + regular facets
@@ -1,3 +1,3 @@
1
1
  module Algolia
2
- VERSION = "1.5.1"
2
+ VERSION = "1.6.0"
3
3
  end
metadata CHANGED
@@ -1,83 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: algoliasearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.1
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Algolia
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-14 00:00:00.000000000 Z
11
+ date: 2015-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httpclient
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '2.4'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.4'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: json
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: 1.5.1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.5.1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: travis
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rdoc
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  description: A simple Ruby client for the algolia.com REST API
@@ -89,8 +89,8 @@ extra_rdoc_files:
89
89
  - LICENSE.txt
90
90
  - README.md
91
91
  files:
92
- - .rspec
93
- - .travis.yml
92
+ - ".rspec"
93
+ - ".travis.yml"
94
94
  - ChangeLog
95
95
  - Gemfile
96
96
  - Gemfile.lock
@@ -121,17 +121,17 @@ require_paths:
121
121
  - lib
122
122
  required_ruby_version: !ruby/object:Gem::Requirement
123
123
  requirements:
124
- - - '>='
124
+ - - ">="
125
125
  - !ruby/object:Gem::Version
126
126
  version: '0'
127
127
  required_rubygems_version: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - '>='
129
+ - - ">="
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0'
132
132
  requirements: []
133
133
  rubyforge_project:
134
- rubygems_version: 2.0.14
134
+ rubygems_version: 2.2.2
135
135
  signing_key:
136
136
  specification_version: 4
137
137
  summary: A simple Ruby client for the algolia.com REST API