algoliasearch 1.26.0 → 1.27.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +4 -1
- data/CHANGELOG.md +50 -0
- data/Gemfile +0 -1
- data/Gemfile.lock +59 -57
- data/README.md +31 -338
- data/algoliasearch.gemspec +7 -3
- data/lib/algolia/client.rb +23 -1
- data/lib/algolia/error.rb +9 -1
- data/lib/algolia/index.rb +92 -0
- data/lib/algolia/version.rb +1 -1
- data/resources/ca-bundle.crt +37 -24
- data/spec/client_spec.rb +91 -1
- data/spec/spec_helper.rb +0 -5
- metadata +15 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b8f0b51a88b74caae749998520d35ea8a006089c580e7a7dbb9e3438651c463
|
4
|
+
data.tar.gz: a16f2830aa1af13d4731da6b2eb23ac731812d6d4751f7b9da9aff8feba5de99
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4a310ba42e3b4ad001d16debd277177d28dce746453793777e09509e0c9e7ffcef03d22119e0d1b50f5597e3d616f1a28f76d7b886c006c9c177cd6014726031
|
7
|
+
data.tar.gz: 346211f63a67f947468b1cc4e687ce732463808a3efeb88d0249922f05dd156bf36633d551ff1480a7d6ffc8070391cee45815de622e395d05fa63ebc3fe031d
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,53 @@
|
|
1
|
+
# ChangeLog
|
2
|
+
|
3
|
+
## Unreleased
|
4
|
+
|
5
|
+
## [1.27.3](https://github.com/algolia/algoliasearch-client-ruby/compare/1.27.2...1.27.3) (2020-06-03)
|
6
|
+
|
7
|
+
**Fixed**
|
8
|
+
|
9
|
+
* Replace expired certificate within embedded certificate chain ([9087dd1](https://github.com/algolia/algoliasearch-client-ruby/commit/9087dd14a97bf77c9391a3360c4803edf686086d))
|
10
|
+
|
11
|
+
## [1.27.2](https://github.com/algolia/algoliasearch-client-ruby/compare/1.27.1...1.27.2) (2020-04-28)
|
12
|
+
|
13
|
+
**Fixed**
|
14
|
+
|
15
|
+
* In `search_user_id`, retrieve param `cluster` instead of `clusterName`. [368](https://github.com/algolia/algoliasearch-client-ruby/issues/368)
|
16
|
+
|
17
|
+
## [1.27.1](https://github.com/algolia/algoliasearch-client-ruby/compare/1.27.0...1.27.1) (2019-09-26)
|
18
|
+
|
19
|
+
**Fixed**
|
20
|
+
|
21
|
+
* Update `Algolia::Index.exists` method to `Algolia::Index.exists?`. [364](https://github.com/algolia/algoliasearch-client-ruby/issues/364)
|
22
|
+
|
23
|
+
## [1.27.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.27.0) (2019-09-16)
|
24
|
+
|
25
|
+
**Added**
|
26
|
+
|
27
|
+
* Introduce `Algolia::Index.exists` method. [358](https://github.com/algolia/algoliasearch-client-ruby/issues/358)
|
28
|
+
|
29
|
+
Check whether an index exists or not.
|
30
|
+
|
31
|
+
* Introduce `Algolia::Index.find_object` method. [359](https://github.com/algolia/algoliasearch-client-ruby/issues/359)
|
32
|
+
|
33
|
+
Find object by the given condition.
|
34
|
+
|
35
|
+
* Introduce `Algolia::Index.get_object_position` method. [359](https://github.com/algolia/algoliasearch-client-ruby/issues/359)
|
36
|
+
|
37
|
+
Retrieve the given object position in a set of results.
|
38
|
+
|
39
|
+
* Introduce `Algolia.get_secured_api_key_remaining_validity` method. [361](https://github.com/algolia/algoliasearch-client-ruby/issues/361)
|
40
|
+
|
41
|
+
Returns the remaining validity time for the given API key in seconds.
|
42
|
+
|
43
|
+
|
44
|
+
## [1.26.1](https://github.com/algolia/algoliasearch-client-ruby/compare/1.26.0...1.26.1) (2019-07-31)
|
45
|
+
|
46
|
+
### Chore
|
47
|
+
|
48
|
+
- stop using coveralls because of a GPL-licensed transitive dep ([d2fbe8c](https://github.com/algolia/algoliasearch-client-ruby/commit/d2fbe8c))
|
49
|
+
|
50
|
+
|
1
51
|
[1.26.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.26.0) (2019-02-12)
|
2
52
|
|
3
53
|
**Added**
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,68 +1,73 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
algoliasearch (1.
|
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
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
11
|
+
activesupport (5.2.4.3)
|
12
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
13
|
+
i18n (>= 0.7, < 2)
|
14
|
+
minitest (~> 5.1)
|
15
|
+
tzinfo (~> 1.1)
|
16
|
+
addressable (2.7.0)
|
17
|
+
public_suffix (>= 2.0.2, < 5.0)
|
18
|
+
concurrent-ruby (1.1.6)
|
19
19
|
crack (0.4.3)
|
20
20
|
safe_yaml (~> 1.0.0)
|
21
21
|
diff-lcs (1.3)
|
22
|
-
docile (1.3.
|
22
|
+
docile (1.3.2)
|
23
23
|
ethon (0.12.0)
|
24
24
|
ffi (>= 1.3.0)
|
25
|
-
faraday (0.
|
25
|
+
faraday (1.0.1)
|
26
26
|
multipart-post (>= 1.2, < 3)
|
27
|
-
faraday_middleware (0.
|
28
|
-
faraday (
|
29
|
-
ffi (1.
|
27
|
+
faraday_middleware (1.0.0)
|
28
|
+
faraday (~> 1.0)
|
29
|
+
ffi (1.13.0)
|
30
30
|
ffi2-generators (0.1.1)
|
31
|
-
gh (0.
|
32
|
-
|
33
|
-
|
34
|
-
faraday (~> 0
|
31
|
+
gh (0.17.0)
|
32
|
+
activesupport (~> 5.0)
|
33
|
+
addressable (~> 2.4)
|
34
|
+
faraday (~> 1.0)
|
35
|
+
faraday_middleware (~> 1.0)
|
35
36
|
multi_json (~> 1.0)
|
36
37
|
net-http-persistent (~> 2.9)
|
37
38
|
net-http-pipeline
|
38
|
-
hashdiff (0.
|
39
|
-
highline (
|
39
|
+
hashdiff (1.0.1)
|
40
|
+
highline (2.0.3)
|
40
41
|
httpclient (2.8.3)
|
41
|
-
|
42
|
+
i18n (1.8.2)
|
43
|
+
concurrent-ruby (~> 1.0)
|
44
|
+
json (2.3.0)
|
42
45
|
launchy (2.4.3)
|
43
46
|
addressable (~> 2.3)
|
44
|
-
|
45
|
-
|
47
|
+
minitest (5.14.1)
|
48
|
+
multi_json (1.14.1)
|
49
|
+
multipart-post (2.1.1)
|
46
50
|
net-http-persistent (2.9.4)
|
47
51
|
net-http-pipeline (1.0.1)
|
52
|
+
public_suffix (4.0.5)
|
48
53
|
pusher-client (0.6.2)
|
49
54
|
json
|
50
55
|
websocket (~> 1.0)
|
51
|
-
rake (
|
52
|
-
rdoc (6.
|
53
|
-
rspec (3.
|
54
|
-
rspec-core (~> 3.
|
55
|
-
rspec-expectations (~> 3.
|
56
|
-
rspec-mocks (~> 3.
|
57
|
-
rspec-core (3.
|
58
|
-
rspec-support (~> 3.
|
59
|
-
rspec-expectations (3.
|
56
|
+
rake (13.0.1)
|
57
|
+
rdoc (6.2.1)
|
58
|
+
rspec (3.9.0)
|
59
|
+
rspec-core (~> 3.9.0)
|
60
|
+
rspec-expectations (~> 3.9.0)
|
61
|
+
rspec-mocks (~> 3.9.0)
|
62
|
+
rspec-core (3.9.2)
|
63
|
+
rspec-support (~> 3.9.3)
|
64
|
+
rspec-expectations (3.9.2)
|
60
65
|
diff-lcs (>= 1.2.0, < 2.0)
|
61
|
-
rspec-support (~> 3.
|
62
|
-
rspec-mocks (3.
|
66
|
+
rspec-support (~> 3.9.0)
|
67
|
+
rspec-mocks (3.9.1)
|
63
68
|
diff-lcs (>= 1.2.0, < 2.0)
|
64
|
-
rspec-support (~> 3.
|
65
|
-
rspec-support (3.
|
69
|
+
rspec-support (~> 3.9.0)
|
70
|
+
rspec-support (3.9.3)
|
66
71
|
rubysl (2.2.0)
|
67
72
|
rubysl-abbrev (~> 2.0)
|
68
73
|
rubysl-base64 (~> 2.0)
|
@@ -170,7 +175,7 @@ GEM
|
|
170
175
|
rubysl-curses (2.0.1)
|
171
176
|
rubysl-date (2.0.9)
|
172
177
|
rubysl-delegate (2.0.1)
|
173
|
-
rubysl-digest (2.
|
178
|
+
rubysl-digest (2.1)
|
174
179
|
rubysl-drb (2.0.1)
|
175
180
|
rubysl-e2mmap (2.0.0)
|
176
181
|
rubysl-english (2.0.0)
|
@@ -220,7 +225,7 @@ GEM
|
|
220
225
|
rubysl-observer (2.0.0)
|
221
226
|
rubysl-open-uri (2.0.0)
|
222
227
|
rubysl-open3 (2.0.0)
|
223
|
-
rubysl-openssl (2.
|
228
|
+
rubysl-openssl (2.13)
|
224
229
|
rubysl-optparse (2.0.1)
|
225
230
|
rubysl-shellwords (~> 2.0)
|
226
231
|
rubysl-ostruct (2.1.0)
|
@@ -265,31 +270,29 @@ GEM
|
|
265
270
|
rubysl-xmlrpc (2.0.0)
|
266
271
|
rubysl-yaml (2.1.0)
|
267
272
|
rubysl-zlib (2.0.1)
|
268
|
-
safe_yaml (1.0.
|
269
|
-
simplecov (0.
|
273
|
+
safe_yaml (1.0.5)
|
274
|
+
simplecov (0.18.5)
|
270
275
|
docile (~> 1.1)
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
tins (1.20.2)
|
278
|
-
travis (1.8.9)
|
279
|
-
backports
|
280
|
-
faraday (~> 0.9)
|
281
|
-
faraday_middleware (~> 0.9, >= 0.9.1)
|
276
|
+
simplecov-html (~> 0.11)
|
277
|
+
simplecov-html (0.12.2)
|
278
|
+
thread_safe (0.3.6)
|
279
|
+
travis (1.9.1)
|
280
|
+
faraday (~> 1.0)
|
281
|
+
faraday_middleware (~> 1.0)
|
282
282
|
gh (~> 0.13)
|
283
|
-
highline (~>
|
284
|
-
|
283
|
+
highline (~> 2.0)
|
284
|
+
json (~> 2.3)
|
285
|
+
launchy (~> 2.1, < 2.5.0)
|
285
286
|
pusher-client (~> 0.4)
|
286
287
|
typhoeus (~> 0.6, >= 0.6.8)
|
287
288
|
typhoeus (0.8.0)
|
288
289
|
ethon (>= 0.8.0)
|
289
|
-
|
290
|
+
tzinfo (1.2.7)
|
291
|
+
thread_safe (~> 0.1)
|
292
|
+
webmock (3.8.3)
|
290
293
|
addressable (>= 2.3.6)
|
291
294
|
crack (>= 0.3.2)
|
292
|
-
hashdiff
|
295
|
+
hashdiff (>= 0.4.0, < 2.0.0)
|
293
296
|
websocket (1.2.8)
|
294
297
|
|
295
298
|
PLATFORMS
|
@@ -297,7 +300,6 @@ PLATFORMS
|
|
297
300
|
|
298
301
|
DEPENDENCIES
|
299
302
|
algoliasearch!
|
300
|
-
coveralls
|
301
303
|
rake
|
302
304
|
rdoc
|
303
305
|
rspec (>= 2.5.0)
|
@@ -307,4 +309,4 @@ DEPENDENCIES
|
|
307
309
|
webmock
|
308
310
|
|
309
311
|
BUNDLED WITH
|
310
|
-
1.
|
312
|
+
2.1.4
|
data/README.md
CHANGED
@@ -1,363 +1,56 @@
|
|
1
|
-
|
1
|
+
<p align="center">
|
2
|
+
<a href="https://www.algolia.com">
|
3
|
+
<img alt="Algolia for Ruby" src="https://raw.githubusercontent.com/algolia/algoliasearch-client-common/master/banners/ruby.png" >
|
4
|
+
</a>
|
2
5
|
|
3
|
-
|
6
|
+
<h4 align="center">The perfect starting point to integrate <a href="https://algolia.com" target="_blank">Algolia</a> within your Ruby project</h4>
|
4
7
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
+
<p align="center">
|
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"><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
|
+
</p>
|
13
|
+
</p>
|
8
14
|
|
9
|
-
|
15
|
+
<p align="center">
|
16
|
+
<a href="https://www.algolia.com/doc/api-client/getting-started/install/ruby/" target="_blank">Documentation</a> •
|
17
|
+
<a href="https://github.com/algolia/algoliasearch-rails" target="_blank">Rails</a> •
|
18
|
+
<a href="https://discourse.algolia.com" target="_blank">Community Forum</a> •
|
19
|
+
<a href="http://stackoverflow.com/questions/tagged/algolia" target="_blank">Stack Overflow</a> •
|
20
|
+
<a href="https://github.com/algolia/algoliasearch-client-ruby/issues" target="_blank">Report a bug</a> •
|
21
|
+
<a href="https://www.algolia.com/support" target="_blank">Support</a>
|
22
|
+
</p>
|
10
23
|
|
24
|
+
## ✨ Features
|
11
25
|
|
12
|
-
|
26
|
+
- Thin & minimal low-level HTTP client to interact with Algolia's API
|
27
|
+
- Supports Ruby `^1.8.7`.
|
13
28
|
|
29
|
+
## 💡 Getting Started
|
14
30
|
|
15
|
-
|
16
|
-
|
17
|
-
## API Documentation
|
18
|
-
|
19
|
-
You can find the full reference on [Algolia's website](https://www.algolia.com/doc/api-client/ruby/).
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
1. **[Install](#install)**
|
24
|
-
|
25
|
-
|
26
|
-
1. **[Quick Start](#quick-start)**
|
27
|
-
|
28
|
-
|
29
|
-
1. **[Push data](#push-data)**
|
30
|
-
|
31
|
-
|
32
|
-
1. **[Configure](#configure)**
|
33
|
-
|
34
|
-
|
35
|
-
1. **[Search](#search)**
|
36
|
-
|
37
|
-
|
38
|
-
1. **[Search UI](#search-ui)**
|
39
|
-
|
40
|
-
|
41
|
-
1. **[List of available methods](#list-of-available-methods)**
|
42
|
-
|
43
|
-
|
44
|
-
# Getting Started
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
## Install
|
49
|
-
|
50
|
-
Install the Ruby client using [RubyGems](https://rubygems.org/):
|
51
|
-
|
31
|
+
First, install Algolia Ruby API Client via the [RubyGems](https://rubygems.org/) package manager:
|
52
32
|
```bash
|
53
33
|
gem install algoliasearch
|
54
34
|
```
|
55
35
|
|
56
|
-
|
36
|
+
Then, create objects on your index:
|
57
37
|
|
58
|
-
If you're a Ruby on Rails user, you're probably looking for the [algoliasearch-rails](https://github.com/algolia/algoliasearch-rails) gem.
|
59
|
-
|
60
|
-
## Quick Start
|
61
|
-
|
62
|
-
In 30 seconds, this quick start tutorial will show you how to index and search objects.
|
63
|
-
|
64
|
-
### Initialize the client
|
65
|
-
|
66
|
-
To start, you need to initialize the client. To do this, you need your **Application ID** and **API Key**.
|
67
|
-
You can find both on [your Algolia account](https://www.algolia.com/api-keys).
|
68
38
|
|
69
39
|
```ruby
|
70
|
-
require 'rubygems'
|
71
|
-
require 'algoliasearch'
|
72
|
-
|
73
40
|
Algolia.init(application_id: 'YourApplicationID',
|
74
41
|
api_key: 'YourAPIKey')
|
75
42
|
index = Algolia::Index.new('your_index_name')
|
76
|
-
```
|
77
43
|
|
78
|
-
|
79
|
-
|
80
|
-
Without any prior configuration, you can start indexing [500 contacts](https://github.com/algolia/datasets/blob/master/contacts/contacts.json) in the ```contacts``` index using the following code:
|
81
|
-
```ruby
|
82
|
-
index = Algolia::Index.new('contacts')
|
83
|
-
batch = JSON.parse(File.read('contacts.json'))
|
84
|
-
index.add_objects(batch)
|
44
|
+
index.save_objects([objectID: 1, name: 'Foo'])
|
85
45
|
```
|
86
46
|
|
87
|
-
|
88
|
-
|
89
|
-
You can customize settings to fine tune the search behavior. For example, you can add a custom ranking by number of followers to further enhance the built-in relevance:
|
90
|
-
|
91
|
-
```ruby
|
92
|
-
index.set_settings(customRanking: ['desc(followers)'])
|
93
|
-
```
|
94
|
-
|
95
|
-
You can also configure the list of attributes you want to index by order of importance (most important first).
|
96
|
-
|
97
|
-
**Note:** Algolia is designed to suggest results as you type, which means you'll generally search by prefix.
|
98
|
-
In this case, the order of attributes is crucial to decide which hit is the best.
|
99
|
-
|
100
|
-
```ruby
|
101
|
-
index.set_settings({
|
102
|
-
searchableAttributes: [
|
103
|
-
'lastname',
|
104
|
-
'firstname',
|
105
|
-
'company',
|
106
|
-
'email',
|
107
|
-
'city',
|
108
|
-
'address'
|
109
|
-
]}
|
110
|
-
)
|
111
|
-
```
|
112
|
-
|
113
|
-
## Search
|
114
|
-
|
115
|
-
You can now search for contacts by `firstname`, `lastname`, `company`, etc. (even with typos):
|
116
|
-
|
47
|
+
Finally, you may begin searching a object using the `search` method:
|
117
48
|
```ruby
|
118
|
-
|
119
|
-
puts index.search('jimmie').to_json
|
120
|
-
# Search for a first name with typo
|
121
|
-
puts index.search('jimie').to_json
|
122
|
-
# Search for a company
|
123
|
-
puts index.search('california paint').to_json
|
124
|
-
# Search for a first name and a company
|
125
|
-
puts index.search('jimmie paint').to_json
|
126
|
-
```
|
127
|
-
|
128
|
-
## Search UI
|
129
|
-
|
130
|
-
**Warning:** If you're building a web application, you may be interested in using one of our
|
131
|
-
[front-end search UI libraries](https://www.algolia.com/doc/guides/building-search-ui/what-is-instantsearch/js/).
|
132
|
-
|
133
|
-
The following example shows how to quickly build a front-end search using
|
134
|
-
[InstantSearch.js](https://www.algolia.com/doc/guides/building-search-ui/what-is-instantsearch/js/)
|
135
|
-
|
136
|
-
### index.html
|
137
|
-
|
138
|
-
```html
|
139
|
-
<!doctype html>
|
140
|
-
<head>
|
141
|
-
<meta charset="UTF-8">
|
142
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/instantsearch.css@7.1.0/themes/algolia.css" />
|
143
|
-
</head>
|
144
|
-
<body>
|
145
|
-
<header>
|
146
|
-
<div>
|
147
|
-
<input id="search-input" placeholder="Search for products">
|
148
|
-
<!-- We use a specific placeholder in the input to guide users in their search. -->
|
149
|
-
|
150
|
-
</header>
|
151
|
-
<main>
|
152
|
-
|
153
|
-
|
154
|
-
</main>
|
155
|
-
|
156
|
-
<script type="text/html" id="hit-template">
|
157
|
-
|
158
|
-
<p class="hit-name">
|
159
|
-
{}{ "attribute": "firstname" }{{/helpers.highlight}}
|
160
|
-
{}{ "attribute": "lastname" }{{/helpers.highlight}}
|
161
|
-
</p>
|
162
|
-
|
163
|
-
</script>
|
164
|
-
|
165
|
-
<script src="https://cdn.jsdelivr.net/npm/instantsearch.js@3.0.0"></script>
|
166
|
-
<script src="app.js"></script>
|
167
|
-
</body>
|
168
|
-
```
|
169
|
-
|
170
|
-
### app.js
|
171
|
-
|
172
|
-
```js
|
173
|
-
// Replace with your own values
|
174
|
-
var searchClient = algoliasearch(
|
175
|
-
'YourApplicationID',
|
176
|
-
'YourAPIKey' // search only API key, no ADMIN key
|
177
|
-
);
|
178
|
-
|
179
|
-
var search = instantsearch({
|
180
|
-
indexName: 'instant_search',
|
181
|
-
searchClient: searchClient,
|
182
|
-
routing: true,
|
183
|
-
searchParameters: {
|
184
|
-
hitsPerPage: 10
|
185
|
-
}
|
186
|
-
});
|
187
|
-
|
188
|
-
search.addWidget(
|
189
|
-
instantsearch.widgets.searchBox({
|
190
|
-
container: '#search-input'
|
191
|
-
})
|
192
|
-
);
|
193
|
-
|
194
|
-
search.addWidget(
|
195
|
-
instantsearch.widgets.hits({
|
196
|
-
container: '#hits',
|
197
|
-
templates: {
|
198
|
-
item: document.getElementById('hit-template').innerHTML,
|
199
|
-
empty: "We didn't find any results for the search <em>\"{{query}}\"</em>"
|
200
|
-
}
|
201
|
-
})
|
202
|
-
);
|
203
|
-
|
204
|
-
search.start();
|
49
|
+
objects = index.search('Fo')
|
205
50
|
```
|
206
51
|
|
52
|
+
For full documentation, visit the **[Algolia Ruby API Client](https://www.algolia.com/doc/api-client/getting-started/install/ruby/)**.
|
207
53
|
|
54
|
+
## 📄 License
|
208
55
|
|
209
|
-
|
210
|
-
## List of available methods
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
### Personalization
|
217
|
-
|
218
|
-
- [Add strategy](https://algolia.com/doc/api-reference/api-methods/add-strategy/?language=ruby)
|
219
|
-
- [Get strategy](https://algolia.com/doc/api-reference/api-methods/get-strategy/?language=ruby)
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
### Search
|
225
|
-
|
226
|
-
- [Search index](https://algolia.com/doc/api-reference/api-methods/search/?language=ruby)
|
227
|
-
- [Search for facet values](https://algolia.com/doc/api-reference/api-methods/search-for-facet-values/?language=ruby)
|
228
|
-
- [Search multiple indices](https://algolia.com/doc/api-reference/api-methods/multiple-queries/?language=ruby)
|
229
|
-
- [Browse index](https://algolia.com/doc/api-reference/api-methods/browse/?language=ruby)
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
### Indexing
|
235
|
-
|
236
|
-
- [Add objects](https://algolia.com/doc/api-reference/api-methods/add-objects/?language=ruby)
|
237
|
-
- [Save objects](https://algolia.com/doc/api-reference/api-methods/save-objects/?language=ruby)
|
238
|
-
- [Partial update objects](https://algolia.com/doc/api-reference/api-methods/partial-update-objects/?language=ruby)
|
239
|
-
- [Delete objects](https://algolia.com/doc/api-reference/api-methods/delete-objects/?language=ruby)
|
240
|
-
- [Replace all objects](https://algolia.com/doc/api-reference/api-methods/replace-all-objects/?language=ruby)
|
241
|
-
- [Delete by](https://algolia.com/doc/api-reference/api-methods/delete-by/?language=ruby)
|
242
|
-
- [Clear objects](https://algolia.com/doc/api-reference/api-methods/clear-objects/?language=ruby)
|
243
|
-
- [Get objects](https://algolia.com/doc/api-reference/api-methods/get-objects/?language=ruby)
|
244
|
-
- [Custom batch](https://algolia.com/doc/api-reference/api-methods/batch/?language=ruby)
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
### Settings
|
250
|
-
|
251
|
-
- [Get settings](https://algolia.com/doc/api-reference/api-methods/get-settings/?language=ruby)
|
252
|
-
- [Set settings](https://algolia.com/doc/api-reference/api-methods/set-settings/?language=ruby)
|
253
|
-
- [Copy settings](https://algolia.com/doc/api-reference/api-methods/copy-settings/?language=ruby)
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
### Manage indices
|
259
|
-
|
260
|
-
- [List indices](https://algolia.com/doc/api-reference/api-methods/list-indices/?language=ruby)
|
261
|
-
- [Delete index](https://algolia.com/doc/api-reference/api-methods/delete-index/?language=ruby)
|
262
|
-
- [Copy index](https://algolia.com/doc/api-reference/api-methods/copy-index/?language=ruby)
|
263
|
-
- [Move index](https://algolia.com/doc/api-reference/api-methods/move-index/?language=ruby)
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
### API Keys
|
269
|
-
|
270
|
-
- [Create secured API Key](https://algolia.com/doc/api-reference/api-methods/generate-secured-api-key/?language=ruby)
|
271
|
-
- [Add API Key](https://algolia.com/doc/api-reference/api-methods/add-api-key/?language=ruby)
|
272
|
-
- [Update API Key](https://algolia.com/doc/api-reference/api-methods/update-api-key/?language=ruby)
|
273
|
-
- [Delete API Key](https://algolia.com/doc/api-reference/api-methods/delete-api-key/?language=ruby)
|
274
|
-
- [Get API Key permissions](https://algolia.com/doc/api-reference/api-methods/get-api-key/?language=ruby)
|
275
|
-
- [List API Keys](https://algolia.com/doc/api-reference/api-methods/list-api-keys/?language=ruby)
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
### Synonyms
|
281
|
-
|
282
|
-
- [Save synonym](https://algolia.com/doc/api-reference/api-methods/save-synonym/?language=ruby)
|
283
|
-
- [Batch synonyms](https://algolia.com/doc/api-reference/api-methods/batch-synonyms/?language=ruby)
|
284
|
-
- [Delete synonym](https://algolia.com/doc/api-reference/api-methods/delete-synonym/?language=ruby)
|
285
|
-
- [Clear all synonyms](https://algolia.com/doc/api-reference/api-methods/clear-synonyms/?language=ruby)
|
286
|
-
- [Get synonym](https://algolia.com/doc/api-reference/api-methods/get-synonym/?language=ruby)
|
287
|
-
- [Search synonyms](https://algolia.com/doc/api-reference/api-methods/search-synonyms/?language=ruby)
|
288
|
-
- [Replace all synonyms](https://algolia.com/doc/api-reference/api-methods/replace-all-synonyms/?language=ruby)
|
289
|
-
- [Copy synonyms](https://algolia.com/doc/api-reference/api-methods/copy-synonyms/?language=ruby)
|
290
|
-
- [Export Synonyms](https://algolia.com/doc/api-reference/api-methods/export-synonyms/?language=ruby)
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
### Query rules
|
296
|
-
|
297
|
-
- [Save rule](https://algolia.com/doc/api-reference/api-methods/save-rule/?language=ruby)
|
298
|
-
- [Batch rules](https://algolia.com/doc/api-reference/api-methods/batch-rules/?language=ruby)
|
299
|
-
- [Get rule](https://algolia.com/doc/api-reference/api-methods/get-rule/?language=ruby)
|
300
|
-
- [Delete rule](https://algolia.com/doc/api-reference/api-methods/delete-rule/?language=ruby)
|
301
|
-
- [Clear rules](https://algolia.com/doc/api-reference/api-methods/clear-rules/?language=ruby)
|
302
|
-
- [Search rules](https://algolia.com/doc/api-reference/api-methods/search-rules/?language=ruby)
|
303
|
-
- [Replace all rules](https://algolia.com/doc/api-reference/api-methods/replace-all-rules/?language=ruby)
|
304
|
-
- [Copy rules](https://algolia.com/doc/api-reference/api-methods/copy-rules/?language=ruby)
|
305
|
-
- [Export rules](https://algolia.com/doc/api-reference/api-methods/export-rules/?language=ruby)
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
### A/B Test
|
311
|
-
|
312
|
-
- [Add A/B test](https://algolia.com/doc/api-reference/api-methods/add-ab-test/?language=ruby)
|
313
|
-
- [Get A/B test](https://algolia.com/doc/api-reference/api-methods/get-ab-test/?language=ruby)
|
314
|
-
- [List A/B tests](https://algolia.com/doc/api-reference/api-methods/list-ab-tests/?language=ruby)
|
315
|
-
- [Stop A/B test](https://algolia.com/doc/api-reference/api-methods/stop-ab-test/?language=ruby)
|
316
|
-
- [Delete A/B test](https://algolia.com/doc/api-reference/api-methods/delete-ab-test/?language=ruby)
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
### Insights
|
322
|
-
|
323
|
-
- [Clicked Object IDs After Search](https://algolia.com/doc/api-reference/api-methods/clicked-object-ids-after-search/?language=ruby)
|
324
|
-
- [Clicked Object IDs](https://algolia.com/doc/api-reference/api-methods/clicked-object-ids/?language=ruby)
|
325
|
-
- [Clicked Filters](https://algolia.com/doc/api-reference/api-methods/clicked-filters/?language=ruby)
|
326
|
-
- [Converted Objects IDs After Search](https://algolia.com/doc/api-reference/api-methods/converted-object-ids-after-search/?language=ruby)
|
327
|
-
- [Converted Object IDs](https://algolia.com/doc/api-reference/api-methods/converted-object-ids/?language=ruby)
|
328
|
-
- [Converted Filters](https://algolia.com/doc/api-reference/api-methods/converted-filters/?language=ruby)
|
329
|
-
- [Viewed Object IDs](https://algolia.com/doc/api-reference/api-methods/viewed-object-ids/?language=ruby)
|
330
|
-
- [Viewed Filters](https://algolia.com/doc/api-reference/api-methods/viewed-filters/?language=ruby)
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
### MultiClusters
|
336
|
-
|
337
|
-
- [Assign or Move userID](https://algolia.com/doc/api-reference/api-methods/assign-user-id/?language=ruby)
|
338
|
-
- [Get top userID](https://algolia.com/doc/api-reference/api-methods/get-top-user-id/?language=ruby)
|
339
|
-
- [Get userID](https://algolia.com/doc/api-reference/api-methods/get-user-id/?language=ruby)
|
340
|
-
- [List clusters](https://algolia.com/doc/api-reference/api-methods/list-clusters/?language=ruby)
|
341
|
-
- [List userIDs](https://algolia.com/doc/api-reference/api-methods/list-user-id/?language=ruby)
|
342
|
-
- [Remove userID](https://algolia.com/doc/api-reference/api-methods/remove-user-id/?language=ruby)
|
343
|
-
- [Search userID](https://algolia.com/doc/api-reference/api-methods/search-user-id/?language=ruby)
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
### Advanced
|
349
|
-
|
350
|
-
- [Get logs](https://algolia.com/doc/api-reference/api-methods/get-logs/?language=ruby)
|
351
|
-
- [Configuring timeouts](https://algolia.com/doc/api-reference/api-methods/configuring-timeouts/?language=ruby)
|
352
|
-
- [Set extra header](https://algolia.com/doc/api-reference/api-methods/set-extra-header/?language=ruby)
|
353
|
-
- [Wait for operations](https://algolia.com/doc/api-reference/api-methods/wait-task/?language=ruby)
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
## Getting Help
|
360
|
-
|
361
|
-
- **Need help**? Ask a question to the [Algolia Community](https://discourse.algolia.com/) or on [Stack Overflow](http://stackoverflow.com/questions/tagged/algolia).
|
362
|
-
- **Found a bug?** You can open a [GitHub issue](https://github.com/algolia/algoliasearch-client-ruby/issues).
|
363
|
-
|
56
|
+
Algolia Ruby API Client is an open-sourced software licensed under the [MIT license](LICENSE.md).
|
data/algoliasearch.gemspec
CHANGED
@@ -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
|
data/lib/algolia/client.rb
CHANGED
@@ -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[:
|
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
|
#
|
data/lib/algolia/error.rb
CHANGED
@@ -20,4 +20,12 @@ module Algolia
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
|
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
|
data/lib/algolia/index.rb
CHANGED
@@ -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
|
data/lib/algolia/version.rb
CHANGED
data/resources/ca-bundle.crt
CHANGED
@@ -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-----
|
data/spec/client_spec.rb
CHANGED
@@ -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 "
|
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'],
|
data/spec/spec_helper.rb
CHANGED
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.
|
4
|
+
version: 1.27.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Algolia
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
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:
|
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:
|
26
|
+
version: 1.5.1
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
|
-
name:
|
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:
|
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:
|
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.
|
148
|
+
rubygems_version: 3.0.6
|
149
149
|
signing_key:
|
150
150
|
specification_version: 4
|
151
151
|
summary: A simple Ruby client for the algolia.com REST API
|