algoliasearch 1.26.1 → 1.27.4

Sign up to get free protection for your applications and to get access to all the features.
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