algoliasearch 1.26.1 → 1.27.4

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
  SHA256:
3
- metadata.gz: 4b688a2dbf301d12d5334b0ae73dbb287bd5054f1a19499d59c68c3b69713569
4
- data.tar.gz: d8d8dc2d476cc6f4e9b8ad81437f390401e1c720a61184b020ec15638026b6c3
3
+ metadata.gz: d05a0e17139977680099b2b1e1ee1e0901834ad0aeb20f8061a54d9f74def4d9
4
+ data.tar.gz: ad1178bb101f66b3dafb95d2e17f40abd6efa1593482b9d7ddd8965d73afbcf9
5
5
  SHA512:
6
- metadata.gz: 40e6001e2b9b43490d9dc6ee901054d53b822f04c87d62c0979eaa6bd8671da4f7f94d9a781a7ffb5fb8e834cbcef63231a2469e42364177ee598fa1428f3f4e
7
- data.tar.gz: de731f8dff00f9084da3fd9e230dfc2ef286cccbea2958a5512690ac229044180e5af2118c37fd3048bc54e238669e60b77b38bacc03675855a2edb510bb0541
6
+ metadata.gz: bfc4fce2c92ca1aa22a814ca43051070600be031227dda2667348eea5ae6e0392c73534b35daf6b1966e6fdb6b380a1bc60d21a4669b3da6d6e6493901ebe330
7
+ data.tar.gz: acb939243bb56bb478ee96fd842b201631d39847296a51cf39e610420b2f5abd7d523bd1141b90eef0fa2dc0f2196f7936eca5417389b0a435299b1b98043cb4
@@ -5,7 +5,6 @@ branches:
5
5
  - master
6
6
 
7
7
  rvm:
8
- - 1.8.7
9
8
  - 1.9.3
10
9
  - 2.0
11
10
  - 2.1
@@ -20,6 +19,10 @@ matrix:
20
19
  allow_failures:
21
20
  - rvm: rbx-3
22
21
  - rvm: jruby
22
+ include:
23
+ - rvm: 1.8.7
24
+ dist: precise
25
+
23
26
 
24
27
  cache: bundler
25
28
 
@@ -1,5 +1,52 @@
1
1
  # ChangeLog
2
2
 
3
+ ## Unreleased
4
+
5
+ ## [1.27.4](https://github.com/algolia/algoliasearch-client-ruby/compare/1.27.3...1.27.4) (2020-09-16)
6
+
7
+ **Fixed**
8
+
9
+ * Retrieve all objects when using `copy_index` from `AccountClient` class ([399](https://github.com/algolia/algoliasearch-client-ruby/pull/399))
10
+
11
+ ## [1.27.3](https://github.com/algolia/algoliasearch-client-ruby/compare/1.27.2...1.27.3) (2020-06-03)
12
+
13
+ **Fixed**
14
+
15
+ * Replace expired certificate within embedded certificate chain ([9087dd1](https://github.com/algolia/algoliasearch-client-ruby/commit/9087dd14a97bf77c9391a3360c4803edf686086d))
16
+
17
+ ## [1.27.2](https://github.com/algolia/algoliasearch-client-ruby/compare/1.27.1...1.27.2) (2020-04-28)
18
+
19
+ **Fixed**
20
+
21
+ * In `search_user_id`, retrieve param `cluster` instead of `clusterName`. [368](https://github.com/algolia/algoliasearch-client-ruby/issues/368)
22
+
23
+ ## [1.27.1](https://github.com/algolia/algoliasearch-client-ruby/compare/1.27.0...1.27.1) (2019-09-26)
24
+
25
+ **Fixed**
26
+
27
+ * Update `Algolia::Index.exists` method to `Algolia::Index.exists?`. [364](https://github.com/algolia/algoliasearch-client-ruby/issues/364)
28
+
29
+ ## [1.27.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.27.0) (2019-09-16)
30
+
31
+ **Added**
32
+
33
+ * Introduce `Algolia::Index.exists` method. [358](https://github.com/algolia/algoliasearch-client-ruby/issues/358)
34
+
35
+ Check whether an index exists or not.
36
+
37
+ * Introduce `Algolia::Index.find_object` method. [359](https://github.com/algolia/algoliasearch-client-ruby/issues/359)
38
+
39
+ Find object by the given condition.
40
+
41
+ * Introduce `Algolia::Index.get_object_position` method. [359](https://github.com/algolia/algoliasearch-client-ruby/issues/359)
42
+
43
+ Retrieve the given object position in a set of results.
44
+
45
+ * Introduce `Algolia.get_secured_api_key_remaining_validity` method. [361](https://github.com/algolia/algoliasearch-client-ruby/issues/361)
46
+
47
+ Returns the remaining validity time for the given API key in seconds.
48
+
49
+
3
50
  ## [1.26.1](https://github.com/algolia/algoliasearch-client-ruby/compare/1.26.0...1.26.1) (2019-07-31)
4
51
 
5
52
  ### Chore
@@ -1,73 +1,66 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- algoliasearch (1.26.0)
4
+ algoliasearch (1.27.3)
5
5
  httpclient (~> 2.8, >= 2.8.3)
6
6
  json (>= 1.5.1)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- addressable (2.4.0)
12
- backports (3.15.0)
13
- coveralls (0.7.2)
14
- multi_json (~> 1.3)
15
- rest-client (= 1.6.7)
16
- simplecov (>= 0.7)
17
- term-ansicolor (= 1.2.2)
18
- thor (= 0.18.1)
11
+ addressable (2.7.0)
12
+ public_suffix (>= 2.0.2, < 5.0)
13
+ backports (3.18.2)
14
+ connection_pool (2.2.3)
19
15
  crack (0.4.3)
20
16
  safe_yaml (~> 1.0.0)
21
- diff-lcs (1.3)
17
+ diff-lcs (1.4.4)
22
18
  docile (1.3.2)
23
19
  ethon (0.12.0)
24
20
  ffi (>= 1.3.0)
25
- faraday (0.15.4)
21
+ faraday (0.17.3)
26
22
  multipart-post (>= 1.2, < 3)
27
- faraday_middleware (0.13.1)
23
+ faraday_middleware (0.14.0)
28
24
  faraday (>= 0.7.4, < 1.0)
29
- ffi (1.11.1)
25
+ ffi (1.13.1)
30
26
  ffi2-generators (0.1.1)
31
- gh (0.15.1)
32
- addressable (~> 2.4.0)
27
+ gh (0.14.0)
28
+ addressable
33
29
  backports
34
30
  faraday (~> 0.8)
35
31
  multi_json (~> 1.0)
36
- net-http-persistent (~> 2.9)
32
+ net-http-persistent (>= 2.7)
37
33
  net-http-pipeline
38
- hashdiff (1.0.0)
34
+ hashdiff (1.0.1)
39
35
  highline (1.7.10)
40
36
  httpclient (2.8.3)
41
- json (2.2.0)
42
- launchy (2.4.3)
43
- addressable (~> 2.3)
44
- mime-types (3.2.2)
45
- mime-types-data (~> 3.2015)
46
- mime-types-data (3.2019.0331)
47
- multi_json (1.13.1)
37
+ json (2.3.1)
38
+ launchy (2.5.0)
39
+ addressable (~> 2.7)
40
+ multi_json (1.15.0)
48
41
  multipart-post (2.1.1)
49
- net-http-persistent (2.9.4)
42
+ net-http-persistent (4.0.0)
43
+ connection_pool (~> 2.2)
50
44
  net-http-pipeline (1.0.1)
45
+ public_suffix (4.0.6)
51
46
  pusher-client (0.6.2)
52
47
  json
53
48
  websocket (~> 1.0)
54
- rake (12.3.2)
55
- rdoc (6.1.1)
56
- rest-client (1.6.7)
57
- mime-types (>= 1.16)
58
- rspec (3.8.0)
59
- rspec-core (~> 3.8.0)
60
- rspec-expectations (~> 3.8.0)
61
- rspec-mocks (~> 3.8.0)
62
- rspec-core (3.8.2)
63
- rspec-support (~> 3.8.0)
64
- rspec-expectations (3.8.4)
49
+ rake (13.0.1)
50
+ rdoc (6.2.1)
51
+ rspec (3.9.0)
52
+ rspec-core (~> 3.9.0)
53
+ rspec-expectations (~> 3.9.0)
54
+ rspec-mocks (~> 3.9.0)
55
+ rspec-core (3.9.2)
56
+ rspec-support (~> 3.9.3)
57
+ rspec-expectations (3.9.2)
65
58
  diff-lcs (>= 1.2.0, < 2.0)
66
- rspec-support (~> 3.8.0)
67
- rspec-mocks (3.8.1)
59
+ rspec-support (~> 3.9.0)
60
+ rspec-mocks (3.9.1)
68
61
  diff-lcs (>= 1.2.0, < 2.0)
69
- rspec-support (~> 3.8.0)
70
- rspec-support (3.8.2)
62
+ rspec-support (~> 3.9.0)
63
+ rspec-support (3.9.3)
71
64
  rubysl (2.2.0)
72
65
  rubysl-abbrev (~> 2.0)
73
66
  rubysl-base64 (~> 2.0)
@@ -175,7 +168,7 @@ GEM
175
168
  rubysl-curses (2.0.1)
176
169
  rubysl-date (2.0.9)
177
170
  rubysl-delegate (2.0.1)
178
- rubysl-digest (2.0.8)
171
+ rubysl-digest (2.1)
179
172
  rubysl-drb (2.0.1)
180
173
  rubysl-e2mmap (2.0.0)
181
174
  rubysl-english (2.0.0)
@@ -225,7 +218,7 @@ GEM
225
218
  rubysl-observer (2.0.0)
226
219
  rubysl-open-uri (2.0.0)
227
220
  rubysl-open3 (2.0.0)
228
- rubysl-openssl (2.10)
221
+ rubysl-openssl (2.13)
229
222
  rubysl-optparse (2.0.1)
230
223
  rubysl-shellwords (~> 2.0)
231
224
  rubysl-ostruct (2.1.0)
@@ -271,16 +264,11 @@ GEM
271
264
  rubysl-yaml (2.1.0)
272
265
  rubysl-zlib (2.0.1)
273
266
  safe_yaml (1.0.5)
274
- simplecov (0.17.0)
267
+ simplecov (0.19.0)
275
268
  docile (~> 1.1)
276
- json (>= 1.8, < 3)
277
- simplecov-html (~> 0.10.0)
278
- simplecov-html (0.10.2)
279
- term-ansicolor (1.2.2)
280
- tins (~> 0.8)
281
- thor (0.18.1)
282
- tins (0.13.2)
283
- travis (1.8.10)
269
+ simplecov-html (~> 0.11)
270
+ simplecov-html (0.12.2)
271
+ travis (1.8.13)
284
272
  backports
285
273
  faraday (~> 0.9)
286
274
  faraday_middleware (~> 0.9, >= 0.9.1)
@@ -291,7 +279,7 @@ GEM
291
279
  typhoeus (~> 0.6, >= 0.6.8)
292
280
  typhoeus (0.8.0)
293
281
  ethon (>= 0.8.0)
294
- webmock (3.6.0)
282
+ webmock (3.8.3)
295
283
  addressable (>= 2.3.6)
296
284
  crack (>= 0.3.2)
297
285
  hashdiff (>= 0.4.0, < 2.0.0)
@@ -302,7 +290,7 @@ PLATFORMS
302
290
 
303
291
  DEPENDENCIES
304
292
  algoliasearch!
305
- coveralls
293
+ gh (<= 0.14.0)
306
294
  rake
307
295
  rdoc
308
296
  rspec (>= 2.5.0)
@@ -312,4 +300,4 @@ DEPENDENCIES
312
300
  webmock
313
301
 
314
302
  BUNDLED WITH
315
- 2.0.2
303
+ 1.17.2
data/README.md CHANGED
@@ -7,8 +7,8 @@
7
7
 
8
8
  <p align="center">
9
9
  <a href="https://travis-ci.org/algolia/algoliasearch-client-ruby"><img src="https://img.shields.io/travis/algolia/algoliasearch-client-ruby/master.svg" alt="Build Status"></a>
10
- <a href="https://rubygems.org/gems/algoliasearch/versions/1.26.0"><img src="https://badge.fury.io/rb/algoliasearch.svg" alt="Gem Version"></a>
11
- <a href="https://rubygems.org/gems/algoliasearch/versions/1.26.0"><img src="https://img.shields.io/badge/licence-MIT-blue.svg" alt="License"></a>
10
+ <a href="https://rubygems.org/gems/algoliasearch"><img src="https://badge.fury.io/rb/algoliasearch.svg" alt="Gem Version"></a>
11
+ <a href="https://rubygems.org/gems/algoliasearch"><img src="https://img.shields.io/badge/licence-MIT-blue.svg" alt="License"></a>
12
12
  </p>
13
13
  </p>
14
14
 
@@ -18,6 +18,7 @@
18
18
  <a href="https://discourse.algolia.com" target="_blank">Community Forum</a> •
19
19
  <a href="http://stackoverflow.com/questions/tagged/algolia" target="_blank">Stack Overflow</a> •
20
20
  <a href="https://github.com/algolia/algoliasearch-client-ruby/issues" target="_blank">Report a bug</a> •
21
+ <a href="https://www.algolia.com/doc/api-client/troubleshooting/faq/ruby/" target="_blank">FAQ</a> •
21
22
  <a href="https://www.algolia.com/support" target="_blank">Support</a>
22
23
  </p>
23
24
 
@@ -51,6 +52,10 @@ objects = index.search('Fo')
51
52
 
52
53
  For full documentation, visit the **[Algolia Ruby API Client](https://www.algolia.com/doc/api-client/getting-started/install/ruby/)**.
53
54
 
55
+ ## ❓ Troubleshooting
56
+
57
+ Encountering an issue? Before reaching out to support, we recommend heading to our [FAQ](https://www.algolia.com/doc/api-client/troubleshooting/faq/ruby/) where you will find answers for the most common issues and gotchas with the client.
58
+
54
59
  ## 📄 License
55
60
 
56
61
  Algolia Ruby API Client is an open-sourced software licensed under the [MIT license](LICENSE.md).
@@ -64,17 +64,21 @@ Gem::Specification.new do |s|
64
64
  s.specification_version = 4
65
65
 
66
66
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
67
+ if defined?(RUBY_VERSION) && RUBY_VERSION < '2.0'
68
+ s.add_runtime_dependency 'json', '>= 1.5.1', '< 2.3'
69
+ else
70
+ s.add_runtime_dependency 'json', '>= 1.5.1'
71
+ end
67
72
  s.add_runtime_dependency 'httpclient', '~> 2.8', '>= 2.8.3'
68
- s.add_runtime_dependency 'json', '>= 1.5.1'
69
73
  s.add_development_dependency 'travis', '~> 0'
70
74
  s.add_development_dependency 'rake', '~> 0'
71
75
  s.add_development_dependency 'rdoc', '~> 0'
72
76
  else
73
77
  s.add_dependency 'httpclient', '~> 2.8', '>= 2.8.3'
74
- s.add_dependency 'json', '>= 1.5.1'
78
+ s.add_dependency 'json', '>= 1.5.1', '< 2.3'
75
79
  end
76
80
  else
77
81
  s.add_dependency 'httpclient', '~> 2.8', '>= 2.8.3'
78
- s.add_dependency 'json', '>= 1.5.1'
82
+ s.add_dependency 'json', '>= 1.5.1', '< 2.3'
79
83
  end
80
84
  end
@@ -55,7 +55,7 @@ module Algolia
55
55
  batch_size = 1000
56
56
  count = 0
57
57
 
58
- source_index.browse()['hits'].each do |obj|
58
+ source_index.browse do |obj|
59
59
  batch << obj
60
60
  count += 1
61
61
 
@@ -552,7 +552,7 @@ module Algolia
552
552
 
553
553
  def search_user_id(query, cluster_name = nil, page = nil, hits_per_page = nil, request_options = {})
554
554
  body = { :query => query }
555
- body[:clusterName] = cluster_name unless cluster_name.nil?
555
+ body[:cluster] = cluster_name unless cluster_name.nil?
556
556
  body[:page] = page unless page.nil?
557
557
  body[:hitsPerPage] = hits_per_page unless hits_per_page.nil?
558
558
  post(Protocol.search_user_id_uri, body.to_json, :read, request_options)
@@ -774,6 +774,28 @@ module Algolia
774
774
  end
775
775
  end
776
776
 
777
+ #
778
+ # Returns the remaining validity time for the given API key in seconds
779
+ #
780
+ # @param [String] secured_api_key the secured API key to check
781
+ #
782
+ # @return [Integer] remaining validity in seconds
783
+ #
784
+ def Algolia.get_secured_api_key_remaining_validity(secured_api_key)
785
+ now = Time.now.to_i
786
+ decoded_key = Base64.decode64(secured_api_key)
787
+ regex = 'validUntil=(\d+)'
788
+ matches = decoded_key.match(regex)
789
+
790
+ if matches === nil
791
+ raise ValidUntilNotFoundError.new('The SecuredAPIKey doesn\'t have a validUntil parameter.')
792
+ end
793
+
794
+ valid_until = matches[1].to_i
795
+
796
+ valid_until - now
797
+ end
798
+
777
799
  #
778
800
  # This method allows to query multiple indexes with one API call
779
801
  #
@@ -20,4 +20,12 @@ module Algolia
20
20
  end
21
21
  end
22
22
 
23
- end
23
+ # An exception class raised when the given object was not found.
24
+ class AlgoliaObjectNotFoundError < AlgoliaError
25
+ end
26
+
27
+ # An exception class raised when the validUntil parameter is not found
28
+ class ValidUntilNotFoundError < AlgoliaError
29
+ end
30
+
31
+ end
@@ -264,6 +264,75 @@ module Algolia
264
264
  client.post(Protocol.objects_uri, { :requests => requests }.to_json, :read, request_options)['results']
265
265
  end
266
266
 
267
+ #
268
+ # Find object by the given condition.
269
+ #
270
+ # Options can be passed in request_options body:
271
+ # - query (string): pass a query
272
+ # - paginate (bool): choose if you want to iterate through all the
273
+ # documents (true) or only the first page (false). Default is true.
274
+ # The function takes a block to filter the results from search query
275
+ # Usage example:
276
+ # index.find_object({'query' => '', 'paginate' => true}) {|obj| obj.key?('company') and obj['company'] == 'Apple'}
277
+ #
278
+ # @param request_options contains extra parameters to send with your query
279
+ #
280
+ # @return [Hash] the matching object and its position in the result set
281
+ #
282
+ def find_object(request_options = {})
283
+ paginate = true
284
+ page = 0
285
+
286
+ query = request_options[:query] || request_options['query'] || ''
287
+ request_options.delete(:query)
288
+ request_options.delete('query')
289
+
290
+ if request_options.has_key? :paginate
291
+ paginate = request_options[:paginate]
292
+ end
293
+
294
+ if request_options.has_key? 'paginate'
295
+ paginate = request_options['paginate']
296
+ end
297
+
298
+ request_options.delete(:paginate)
299
+ request_options.delete('paginate')
300
+
301
+ while true
302
+ request_options['page'] = page
303
+ res = search(query, request_options)
304
+
305
+ res['hits'].each_with_index do |hit, i|
306
+ if yield(hit)
307
+ return {
308
+ 'object' => hit,
309
+ 'position' => i,
310
+ 'page' => page,
311
+ }
312
+ end
313
+ end if block_given?
314
+
315
+ has_next_page = page + 1 < res['nbPages']
316
+ if !paginate || !has_next_page
317
+ raise AlgoliaObjectNotFoundError.new('Object not found')
318
+ end
319
+
320
+ page += 1
321
+ end
322
+ end
323
+
324
+ #
325
+ # Retrieve the given object position in a set of results.
326
+ #
327
+ # @param [Array] objects the result set to browse
328
+ # @param [String] object_id the object to look for
329
+ #
330
+ # @return [Integer] position of the object, or -1 if it's not in the array
331
+ #
332
+ def self.get_object_position(objects, object_id)
333
+ objects['hits'].find_index { |hit| hit['objectID'] == object_id } || -1
334
+ end
335
+
267
336
  #
268
337
  # Check the status of a task on the server.
269
338
  # All server task are asynchronous and you can check the status of a task with this method.
@@ -1208,6 +1277,29 @@ module Algolia
1208
1277
  res
1209
1278
  end
1210
1279
 
1280
+ #
1281
+ # Check whether an index exists or not
1282
+ #
1283
+ # @return [Boolean]
1284
+ #
1285
+ def exists
1286
+ begin
1287
+ get_settings
1288
+ rescue AlgoliaProtocolError => e
1289
+ if e.code === 404
1290
+ return false
1291
+ end
1292
+
1293
+ raise e
1294
+ end
1295
+ return true
1296
+ end
1297
+
1298
+ #
1299
+ # Aliases the exists method
1300
+ #
1301
+ alias :exists? :exists
1302
+
1211
1303
  # Deprecated
1212
1304
  alias_method :get_user_key, :get_api_key
1213
1305
  alias_method :list_user_keys, :list_api_keys
@@ -1,3 +1,3 @@
1
1
  module Algolia
2
- VERSION = "1.26.1"
2
+ VERSION = "1.27.4"
3
3
  end
@@ -16,6 +16,43 @@
16
16
 
17
17
  # @(#) $RCSfile: certdata.txt,v $ $Revision: 1.87 $ $Date: 2012/12/29 16:32:45 $
18
18
 
19
+ USERTrust RSA root CA
20
+ =====================
21
+ -----BEGIN CERTIFICATE-----
22
+ MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB
23
+ iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl
24
+ cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV
25
+ BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw
26
+ MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV
27
+ BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU
28
+ aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy
29
+ dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
30
+ AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B
31
+ 3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY
32
+ tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/
33
+ Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2
34
+ VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT
35
+ 79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6
36
+ c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT
37
+ Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l
38
+ c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee
39
+ UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE
40
+ Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd
41
+ BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G
42
+ A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF
43
+ Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO
44
+ VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3
45
+ ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs
46
+ 8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR
47
+ iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze
48
+ Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ
49
+ XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/
50
+ qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB
51
+ VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB
52
+ L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG
53
+ jjxDah2nGN59PRbxYvnKkKj9
54
+ -----END CERTIFICATE-----
55
+
19
56
  GTE CyberTrust Global Root
20
57
  ==========================
21
58
  -----BEGIN CERTIFICATE-----
@@ -551,30 +588,6 @@ mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
551
588
  ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
552
589
  -----END CERTIFICATE-----
553
590
 
554
- AddTrust External Root
555
- ======================
556
- -----BEGIN CERTIFICATE-----
557
- MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
558
- QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
559
- VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
560
- NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
561
- cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
562
- Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
563
- +iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
564
- Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
565
- aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
566
- 2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
567
- 7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
568
- BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
569
- VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
570
- VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
571
- IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
572
- j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
573
- 6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
574
- e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
575
- G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
576
- -----END CERTIFICATE-----
577
-
578
591
  AddTrust Public Services Root
579
592
  =============================
580
593
  -----BEGIN CERTIFICATE-----
@@ -47,9 +47,7 @@ describe 'Account client' do
47
47
 
48
48
  it 'should perform a cross app copy index and assert that destination must not exist' do
49
49
 
50
- @index_1.save_objects! ([
51
- {:objectID => 'one'},
52
- ])
50
+ @index_1.save_objects!(1.upto(1500).map { |i| { :objectID => i, :i => i } })
53
51
 
54
52
  @index_1.batch_rules! ([
55
53
  {
@@ -67,9 +65,8 @@ describe 'Account client' do
67
65
 
68
66
  Algolia::AccountClient.copy_index!(@index_1, @index_3)
69
67
 
70
- res = @index_3.search('');
71
- res['nbHits'].should eq(1)
72
- res['hits'][0]['objectID'].should eq('one')
68
+ res = @index_3.search('')
69
+ res['nbHits'].should eq(1500)
73
70
 
74
71
  res = @index_3.search_rules('')['hits']
75
72
  res.size.should eq(1)
@@ -175,6 +175,16 @@ describe 'Client' do
175
175
  @index.delete_index rescue "not fatal"
176
176
  end
177
177
 
178
+ it "should tell if index exists" do
179
+ @index.add_object!({ :name => "John Doe", :email => "john@doe.org" }, "1")
180
+ expect(@index.exists?).to be true
181
+ end
182
+
183
+ it "should tell if index does not exist" do
184
+ index = Algolia::Index.new('nonexistent_index')
185
+ expect(index.exists?).to be false
186
+ end
187
+
178
188
  it "should add a simple object" do
179
189
  @index.add_object!({ :name => "John Doe", :email => "john@doe.org" }, "1")
180
190
  res = @index.search("john")
@@ -436,6 +446,73 @@ describe 'Client' do
436
446
  end
437
447
  end
438
448
 
449
+ it 'should find objects when needed' do
450
+ index = Algolia::Index.new(safe_index_name("àlgol?à"))
451
+
452
+ index.save_objects!([
453
+ {:company => 'Algolia', :name => 'Julien Lemoine', :objectID => 'julien-lemoine'},
454
+ {:company => 'Algolia', :name => 'Nicolas Dessaigne', :objectID => 'nicolas-dessaigne'},
455
+ {:company => 'Amazon', :name =>' "Jeff Bezos', :objectID => '162590850'},
456
+ {:company => 'Apple', :name => 'Steve Jobs', :objectID => '162590860'},
457
+ {:company => 'Apple', :name => 'Steve Wozniak', :objectID => '162590870'},
458
+ {:company => 'Arista Networks', :name => 'Jayshree Ullal', :objectID => '162590880'},
459
+ {:company => 'Google', :name => 'Larry Page', :objectID => '162590890'},
460
+ {:company => 'Google', :name => 'Rob Pike', :objectID => '162590900'},
461
+ {:company => 'Google', :name => 'Sergueï Brin', :objectID => '162590910'},
462
+ {:company => 'Microsoft', :name => 'Bill Gates', :objectID => '162590920'},
463
+ {:company => 'SpaceX', :name => 'Elon Musk', :objectID => '162590930'},
464
+ {:company => 'Tesla', :name => 'Elon Musk', :objectID => '162590940'},
465
+ {:company => 'Yahoo', :name => 'Marissa Mayer', :objectID => '162590950'},
466
+ ])
467
+
468
+ res = index.search('algolia')
469
+ Algolia::Index.get_object_position(res, 'nicolas-dessaigne').should eq(0)
470
+ Algolia::Index.get_object_position(res, 'julien-lemoine').should eq(1)
471
+ Algolia::Index.get_object_position(res, '').should eq(-1)
472
+
473
+ expect {
474
+ index.find_object({'query' => '', 'paginate' => true})
475
+ }.to raise_exception(
476
+ Algolia::AlgoliaObjectNotFoundError,
477
+ 'Object not found'
478
+ )
479
+
480
+ expect {
481
+ index.find_object({'query' => '', 'paginate' => true}) { false }
482
+ }.to raise_exception(
483
+ Algolia::AlgoliaObjectNotFoundError,
484
+ 'Object not found'
485
+ )
486
+
487
+ obj = index.find_object({'query' => '', 'paginate' => true}) { true }
488
+ obj['position'].should eq(0)
489
+ obj['page'].should eq(0)
490
+
491
+ # we use a lambda and convert it to a block with `&`
492
+ # so as not to repeat the condition
493
+ condition = lambda do |obj|
494
+ obj.key?('company') and obj['company'] == 'Apple'
495
+ end
496
+
497
+ expect {
498
+ index.find_object({'query' => 'algolia', 'paginate' => true}, &condition)
499
+ }.to raise_exception(
500
+ Algolia::AlgoliaObjectNotFoundError,
501
+ 'Object not found'
502
+ )
503
+
504
+ expect {
505
+ index.find_object({'query' => '', 'paginate' => false, 'hitsPerPage' => 5}, &condition)
506
+ }.to raise_exception(
507
+ Algolia::AlgoliaObjectNotFoundError,
508
+ 'Object not found'
509
+ )
510
+
511
+ obj = index.find_object({'query' => '', 'paginate' => true, 'hitsPerPage' => 5}, &condition)
512
+ obj['position'].should eq(0)
513
+ obj['page'].should eq(2)
514
+ end
515
+
439
516
  it "should copy the index" do
440
517
  index = Algolia::Index.new(safe_index_name("àlgol?à"))
441
518
  begin
@@ -615,7 +692,7 @@ describe 'Client' do
615
692
  expect { Algolia.multiple_queries([{"query" => ""}]) }.to raise_error(ArgumentError)
616
693
  end
617
694
 
618
- it "shoud accept custom batch" do
695
+ it "should accept custom batch" do
619
696
  @index.clear_index! rescue "Not fatal"
620
697
  request = { "requests" => [
621
698
  {
@@ -1277,6 +1354,19 @@ describe 'Client' do
1277
1354
  expect{Algolia.list_indexes('headers' => { 'X-Algolia-API-Key' => 'NotExistentAPIKey' })}.to raise_error(Algolia::AlgoliaProtocolError)
1278
1355
  end
1279
1356
 
1357
+ it 'should retrieve the remaining validity time in seconds' do
1358
+ now = Time.now.to_i
1359
+
1360
+ key = Algolia.generate_secured_api_key('foo', :validUntil => now - (10 * 60))
1361
+ expect(Algolia.get_secured_api_key_remaining_validity(key)).to be < 0
1362
+
1363
+ key = Algolia.generate_secured_api_key('foo', :validUntil => now + (10 * 60))
1364
+ expect(Algolia.get_secured_api_key_remaining_validity(key)).to be > 0
1365
+
1366
+ key = Algolia.generate_secured_api_key('foo', [])
1367
+ expect { Algolia.get_secured_api_key_remaining_validity(key) }.to raise_error(Algolia::ValidUntilNotFoundError)
1368
+ end
1369
+
1280
1370
  context 'DNS timeout' do
1281
1371
  before(:each) do
1282
1372
  @client = Algolia::Client.new :application_id => ENV['ALGOLIA_APPLICATION_ID'], :api_key => ENV['ALGOLIA_API_KEY'],
metadata CHANGED
@@ -1,49 +1,49 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: algoliasearch
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.26.1
4
+ version: 1.27.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Algolia
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-01 00:00:00.000000000 Z
11
+ date: 2020-09-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: httpclient
14
+ name: json
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '2.8'
20
17
  - - ">="
21
18
  - !ruby/object:Gem::Version
22
- version: 2.8.3
19
+ version: 1.5.1
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - "~>"
28
- - !ruby/object:Gem::Version
29
- version: '2.8'
30
24
  - - ">="
31
25
  - !ruby/object:Gem::Version
32
- version: 2.8.3
26
+ version: 1.5.1
33
27
  - !ruby/object:Gem::Dependency
34
- name: json
28
+ name: httpclient
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.8'
37
34
  - - ">="
38
35
  - !ruby/object:Gem::Version
39
- version: 1.5.1
36
+ version: 2.8.3
40
37
  type: :runtime
41
38
  prerelease: false
42
39
  version_requirements: !ruby/object:Gem::Requirement
43
40
  requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '2.8'
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: 1.5.1
46
+ version: 2.8.3
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: travis
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -145,7 +145,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
145
145
  - !ruby/object:Gem::Version
146
146
  version: '0'
147
147
  requirements: []
148
- rubygems_version: 3.0.3
148
+ rubygems_version: 3.0.4
149
149
  signing_key:
150
150
  specification_version: 4
151
151
  summary: A simple Ruby client for the algolia.com REST API