algoliasearch 1.22.0 → 1.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +6 -6
- data/CHANGELOG.md +14 -0
- data/Gemfile.lock +1 -1
- data/README.md +12 -1
- data/Rakefile +1 -1
- data/lib/algolia/client.rb +55 -6
- data/lib/algolia/index.rb +2 -8
- data/lib/algolia/protocol.rb +10 -0
- data/lib/algolia/version.rb +1 -1
- data/lib/algoliasearch.rb +1 -0
- data/spec/client_spec.rb +6 -10
- data/spec/spec_helper.rb +28 -0
- data/spec/stub_spec.rb +4 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7aec9582dfb81fdce4070cf4c30819075b2bc14e92ca1fa8574877533491904e
|
4
|
+
data.tar.gz: bf648a4405d74d8d9ef94cd2f52566d1ad77ce65ef2012c766649c60de94cafa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c286583acd9d232476d6017c883dc93a193e327bceca68672718b224604fbb436ca832c4a9094def62a65e2a610d40ced96b165b383676707cde61d69b315cc7
|
7
|
+
data.tar.gz: 96f3ad4b2f8eadd48b5c080d18e39427b4782c583fdc6c027132ee6352ab521ae3fad83acb562ac22f2c05a31a205199579308651465e5ed582f0f73c573f799
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
## [1.23.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.23.0) (2018-06-19)
|
2
|
+
|
3
|
+
* Feat(analytics): introduce new analytics class
|
4
|
+
* Chore(rake): use unshift to keep compat with older ruby versions
|
5
|
+
* Ruby version must be after client version in ua
|
6
|
+
* Fix ua tests with new format
|
7
|
+
* Rewrite ua
|
8
|
+
* Feat(ua): add ruby version
|
9
|
+
* Fix(syntax): this isn't php
|
10
|
+
* Tests(mcm): use unique userid everytime
|
11
|
+
* Tests(mcm): introduce auto_retry for more stable tests
|
12
|
+
* Feat(client): expose waittask in the client (#302)
|
13
|
+
* Fix(travis): always test on the latest patches (#295)
|
14
|
+
|
1
15
|
## [1.22.0](https://github.com/algolia/algoliasearch-client-ruby/releases/tag/1.22.0) (2018-05-30)
|
2
16
|
|
3
17
|
* Rename license file (#297)
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -90,7 +90,7 @@ index.add_objects(batch)
|
|
90
90
|
Settings can be customized to fine tune the search behavior. For example, you can add a custom sort by number of followers to further enhance the built-in relevance:
|
91
91
|
|
92
92
|
```ruby
|
93
|
-
index.set_settings
|
93
|
+
index.set_settings(customRanking: ['desc(followers)'])
|
94
94
|
```
|
95
95
|
|
96
96
|
You can also configure the list of attributes you want to index by order of importance (most important first).
|
@@ -287,6 +287,17 @@ search.start();
|
|
287
287
|
|
288
288
|
|
289
289
|
|
290
|
+
### A/B Test
|
291
|
+
|
292
|
+
- [Add an A/B test](https://algolia.com/doc/api-reference/api-methods/add-ab-test/?language=ruby)
|
293
|
+
- [Get an A/B test](https://algolia.com/doc/api-reference/api-methods/get-ab-test/?language=ruby)
|
294
|
+
- [List A/B tests](https://algolia.com/doc/api-reference/api-methods/get-ab-tests/?language=ruby)
|
295
|
+
- [Stop an A/B test](https://algolia.com/doc/api-reference/api-methods/stop-ab-test/?language=ruby)
|
296
|
+
- [Delete an A/B test](https://algolia.com/doc/api-reference/api-methods/delete-ab-test/?language=ruby)
|
297
|
+
|
298
|
+
|
299
|
+
|
300
|
+
|
290
301
|
### MultiClusters
|
291
302
|
|
292
303
|
- [Assign or Move userID](https://algolia.com/doc/api-reference/api-methods/assign-user-id/?language=ruby)
|
data/Rakefile
CHANGED
@@ -57,7 +57,7 @@ namespace :algolia do
|
|
57
57
|
title = "## [%s](%s%s) (%s)\n\n" % [args[:version], GIT_TAG_URL, args[:version], last_commit_date]
|
58
58
|
changes = changelog.each_line
|
59
59
|
.map { |line| (exceptions_regexp === line) ? nil : "* #{line.capitalize}" }
|
60
|
-
.
|
60
|
+
.unshift(title)
|
61
61
|
.append("\n\n")
|
62
62
|
.join
|
63
63
|
|
data/lib/algolia/client.rb
CHANGED
@@ -21,6 +21,7 @@ module Algolia
|
|
21
21
|
DEFAULT_SEND_TIMEOUT = 30
|
22
22
|
DEFAULT_BATCH_TIMEOUT = 120
|
23
23
|
DEFAULT_SEARCH_TIMEOUT = 5
|
24
|
+
DEFAULT_USER_AGENT = ["Algolia for Ruby (#{::Algolia::VERSION})", "Ruby (#{RUBY_VERSION})"]
|
24
25
|
|
25
26
|
def initialize(data = {})
|
26
27
|
raise ArgumentError.new('No APPLICATION_ID provided, please set :application_id') if data[:application_id].nil?
|
@@ -41,7 +42,7 @@ module Algolia
|
|
41
42
|
Protocol::HEADER_API_KEY => api_key,
|
42
43
|
Protocol::HEADER_APP_ID => application_id,
|
43
44
|
'Content-Type' => 'application/json; charset=utf-8',
|
44
|
-
'User-Agent' => (data[:user_agent]
|
45
|
+
'User-Agent' => DEFAULT_USER_AGENT.push(data[:user_agent]).compact.join('; ')
|
45
46
|
}
|
46
47
|
end
|
47
48
|
|
@@ -59,6 +60,13 @@ module Algolia
|
|
59
60
|
Index.new(name, self)
|
60
61
|
end
|
61
62
|
|
63
|
+
#
|
64
|
+
# Initialize analytics helper
|
65
|
+
#
|
66
|
+
def init_analytics()
|
67
|
+
Analytics.new(self, { :headers => @headers })
|
68
|
+
end
|
69
|
+
|
62
70
|
#
|
63
71
|
# Allow to set custom headers
|
64
72
|
#
|
@@ -155,7 +163,7 @@ module Algolia
|
|
155
163
|
# @param request_options contains extra parameters to send with your query
|
156
164
|
#
|
157
165
|
def move_index(src_index, dst_index, request_options = {})
|
158
|
-
request = { 'operation' => 'move', 'destination' => dst_index }
|
166
|
+
request = { 'operation' => 'move', 'destination' => dst_index }
|
159
167
|
post(Protocol.index_operation_uri(src_index), request.to_json, :write, request_options)
|
160
168
|
end
|
161
169
|
|
@@ -168,7 +176,7 @@ module Algolia
|
|
168
176
|
#
|
169
177
|
def move_index!(src_index, dst_index, request_options = {})
|
170
178
|
res = move_index(src_index, dst_index, request_options)
|
171
|
-
|
179
|
+
wait_task(dst_index, res['taskID'], WAIT_TASK_DEFAULT_TIME_BEFORE_RETRY, request_options)
|
172
180
|
res
|
173
181
|
end
|
174
182
|
|
@@ -181,7 +189,7 @@ module Algolia
|
|
181
189
|
# @param request_options contains extra parameters to send with your query
|
182
190
|
#
|
183
191
|
def copy_index(src_index, dst_index, scope = nil, request_options = {})
|
184
|
-
request = { 'operation' => 'copy', 'destination' => dst_index }
|
192
|
+
request = { 'operation' => 'copy', 'destination' => dst_index }
|
185
193
|
request['scope'] = scope unless scope.nil?
|
186
194
|
post(Protocol.index_operation_uri(src_index), request.to_json, :write, request_options)
|
187
195
|
end
|
@@ -196,7 +204,7 @@ module Algolia
|
|
196
204
|
#
|
197
205
|
def copy_index!(src_index, dst_index, scope = nil, request_options = {})
|
198
206
|
res = copy_index(src_index, dst_index, scope, request_options)
|
199
|
-
|
207
|
+
wait_task(dst_index, res['taskID'], WAIT_TASK_DEFAULT_TIME_BEFORE_RETRY, request_options)
|
200
208
|
res
|
201
209
|
end
|
202
210
|
|
@@ -376,7 +384,38 @@ module Algolia
|
|
376
384
|
def batch!(operations, request_options = {})
|
377
385
|
res = batch(operations, request_options)
|
378
386
|
res['taskID'].each do |index, taskID|
|
379
|
-
|
387
|
+
wait_task(index, taskID, WAIT_TASK_DEFAULT_TIME_BEFORE_RETRY, request_options)
|
388
|
+
end
|
389
|
+
end
|
390
|
+
|
391
|
+
#
|
392
|
+
# Check the status of a task on the server.
|
393
|
+
# All server task are asynchronous and you can check the status of a task with this method.
|
394
|
+
#
|
395
|
+
# @param index_name the index name owning the taskID
|
396
|
+
# @param taskID the id of the task returned by server
|
397
|
+
# @param request_options contains extra parameters to send with your query
|
398
|
+
#
|
399
|
+
def get_task_status(index_name, taskID, request_options = {})
|
400
|
+
get(Protocol.task_uri(index_name, taskID), :read, request_options)['status']
|
401
|
+
end
|
402
|
+
|
403
|
+
#
|
404
|
+
# Wait the publication of a task on the server.
|
405
|
+
# All server task are asynchronous and you can check with this method that the task is published.
|
406
|
+
#
|
407
|
+
# @param index_name the index name owning the taskID
|
408
|
+
# @param taskID the id of the task returned by server
|
409
|
+
# @param time_before_retry the time in milliseconds before retry (default = 100ms)
|
410
|
+
# @param request_options contains extra parameters to send with your query
|
411
|
+
#
|
412
|
+
def wait_task(index_name, taskID, time_before_retry = WAIT_TASK_DEFAULT_TIME_BEFORE_RETRY, request_options = {})
|
413
|
+
loop do
|
414
|
+
status = get_task_status(index_name, taskID, request_options)
|
415
|
+
if status == 'published'
|
416
|
+
return
|
417
|
+
end
|
418
|
+
sleep(time_before_retry.to_f / 1000)
|
380
419
|
end
|
381
420
|
end
|
382
421
|
|
@@ -861,6 +900,16 @@ module Algolia
|
|
861
900
|
Algolia.client.batch!(requests, request_options)
|
862
901
|
end
|
863
902
|
|
903
|
+
#
|
904
|
+
# Wait until task is completed by the engine
|
905
|
+
#
|
906
|
+
def Algolia.wait_task(index_name, taskID, time_before_retry = WAIT_TASK_DEFAULT_TIME_BEFORE_RETRY, request_options = {})
|
907
|
+
Algolia.client.wait_task(index_name, taskID, time_before_retry, request_options)
|
908
|
+
end
|
909
|
+
|
910
|
+
def Algolia.get_task_status(index_name, taskID, request_options = {})
|
911
|
+
Algolia.client.get_task_status(index_name, taskID, request_options = {})
|
912
|
+
end
|
864
913
|
#
|
865
914
|
# Used mostly for testing. Lets you delete the api key global vars.
|
866
915
|
#
|
data/lib/algolia/index.rb
CHANGED
@@ -272,7 +272,7 @@ module Algolia
|
|
272
272
|
# @param request_options contains extra parameters to send with your query
|
273
273
|
#
|
274
274
|
def get_task_status(taskID, request_options = {})
|
275
|
-
client.
|
275
|
+
client.get_task_status(name, taskID, request_options)
|
276
276
|
end
|
277
277
|
|
278
278
|
#
|
@@ -284,13 +284,7 @@ module Algolia
|
|
284
284
|
# @param request_options contains extra parameters to send with your query
|
285
285
|
#
|
286
286
|
def wait_task(taskID, time_before_retry = WAIT_TASK_DEFAULT_TIME_BEFORE_RETRY, request_options = {})
|
287
|
-
|
288
|
-
status = get_task_status(taskID, request_options)
|
289
|
-
if status == 'published'
|
290
|
-
return
|
291
|
-
end
|
292
|
-
sleep(time_before_retry.to_f / 1000)
|
293
|
-
end
|
287
|
+
client.wait_task(name, taskID, time_before_retry, request_options)
|
294
288
|
end
|
295
289
|
|
296
290
|
#
|
data/lib/algolia/protocol.rb
CHANGED
@@ -189,5 +189,15 @@ module Algolia
|
|
189
189
|
"/#{VERSION}/clusters/mapping/search"
|
190
190
|
end
|
191
191
|
|
192
|
+
def Protocol.ab_tests_uri(ab_test = nil)
|
193
|
+
ab_test = "/#{ab_test}" if ab_test
|
194
|
+
|
195
|
+
"/2/abtests" + ab_test.to_s
|
196
|
+
end
|
197
|
+
|
198
|
+
def Protocol.ab_tests_stop_uri(ab_test)
|
199
|
+
"/2/abtests/#{ab_test}/stop"
|
200
|
+
end
|
201
|
+
|
192
202
|
end
|
193
203
|
end
|
data/lib/algolia/version.rb
CHANGED
data/lib/algoliasearch.rb
CHANGED
data/spec/client_spec.rb
CHANGED
@@ -2,13 +2,6 @@
|
|
2
2
|
require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
|
3
3
|
require 'base64'
|
4
4
|
|
5
|
-
# avoid concurrent access to the same index
|
6
|
-
def safe_index_name(name)
|
7
|
-
return name if ENV['TRAVIS'].to_s != "true"
|
8
|
-
id = ENV['TRAVIS_JOB_NUMBER']
|
9
|
-
"TRAVIS_RUBY_#{name}-#{id}"
|
10
|
-
end
|
11
|
-
|
12
5
|
def is_include(array, attr, value)
|
13
6
|
array.each do |elt|
|
14
7
|
if elt[attr] == value
|
@@ -311,7 +304,7 @@ describe 'Client' do
|
|
311
304
|
res = Algolia.list_indexes
|
312
305
|
is_include(res['items'], 'name', safe_index_name('àlgol?a')).should eq(false)
|
313
306
|
index.add_object!({ :name => "Robert" })
|
314
|
-
resAfter = Algolia.list_indexes
|
307
|
+
resAfter = Algolia.list_indexes
|
315
308
|
is_include(resAfter['items'], 'name', safe_index_name('àlgol?a')).should eq(true)
|
316
309
|
end
|
317
310
|
|
@@ -1160,8 +1153,11 @@ describe 'Client' do
|
|
1160
1153
|
end
|
1161
1154
|
|
1162
1155
|
before(:each) do
|
1163
|
-
@client = Algolia::Client.new
|
1156
|
+
@client = Algolia::Client.new(
|
1157
|
+
:application_id => ENV['ALGOLIA_APPLICATION_ID'],
|
1158
|
+
:api_key => ENV['ALGOLIA_API_KEY'],
|
1164
1159
|
:user_agent => 'test agent'
|
1160
|
+
)
|
1165
1161
|
@client.destroy # make sure the thread-local vars are reseted
|
1166
1162
|
end
|
1167
1163
|
|
@@ -1170,7 +1166,7 @@ describe 'Client' do
|
|
1170
1166
|
to_return(:status => 200, :body => '{}')
|
1171
1167
|
@client.list_indexes
|
1172
1168
|
expect(WebMock).to have_requested(:get, /https:\/\/.+-dsn.algolia(net\.com|\.net)\/1\/indexes/).
|
1173
|
-
with(:headers => {'User-Agent' =>
|
1169
|
+
with(:headers => { 'User-Agent' => "Algolia for Ruby (#{::Algolia::VERSION}); Ruby (#{RUBY_VERSION}); test agent" })
|
1174
1170
|
end
|
1175
1171
|
|
1176
1172
|
after(:all) do
|
data/spec/spec_helper.rb
CHANGED
@@ -20,6 +20,7 @@ require 'algoliasearch'
|
|
20
20
|
require 'rspec'
|
21
21
|
require 'webmock/rspec'
|
22
22
|
require 'algolia/webmock'
|
23
|
+
require 'time'
|
23
24
|
|
24
25
|
raise 'missing ALGOLIA_APPLICATION_ID or ALGOLIA_API_KEY environment variables' if ENV['ALGOLIA_APPLICATION_ID'].nil? || ENV['ALGOLIA_API_KEY'].nil?
|
25
26
|
Algolia.init :application_id => ENV['ALGOLIA_APPLICATION_ID'], :api_key => ENV['ALGOLIA_API_KEY']
|
@@ -35,3 +36,30 @@ RSpec.configure do |config|
|
|
35
36
|
WebMock.disable!
|
36
37
|
end
|
37
38
|
end
|
39
|
+
|
40
|
+
# avoid concurrent access to the same index
|
41
|
+
def safe_index_name(name)
|
42
|
+
return name if ENV['TRAVIS'].to_s != "true"
|
43
|
+
id = ENV['TRAVIS_JOB_NUMBER']
|
44
|
+
"TRAVIS_RUBY_#{name}-#{id}"
|
45
|
+
end
|
46
|
+
|
47
|
+
def auto_retry(options = {})
|
48
|
+
return if !block_given?
|
49
|
+
|
50
|
+
max_retry = options[:max_retry] || 10
|
51
|
+
retry_count = 0
|
52
|
+
|
53
|
+
loop do
|
54
|
+
begin
|
55
|
+
return yield
|
56
|
+
rescue => e
|
57
|
+
retry_count += 1
|
58
|
+
if retry_count >= max_retry
|
59
|
+
raise e
|
60
|
+
else
|
61
|
+
sleep retry_count
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/spec/stub_spec.rb
CHANGED
@@ -16,7 +16,7 @@ describe 'With a rate limited client' do
|
|
16
16
|
|
17
17
|
it "should pass the right headers" do
|
18
18
|
WebMock.stub_request(:post, %r{https://.*\.algolia\.(io|net)/1/indexes/friends/query}).
|
19
|
-
with(:headers => {'Content-Type'=>'application/json; charset=utf-8', 'User-Agent'=>"Algolia for Ruby #{Algolia::VERSION}", 'X-Algolia-Api-Key'=>ENV['ALGOLIA_API_KEY'], 'X-Algolia-Application-Id'=>ENV['ALGOLIA_APPLICATION_ID'], 'X-Forwarded-Api-Key'=>'ratelimitapikey', 'X-Forwarded-For'=>'1.2.3.4'}).
|
19
|
+
with(:headers => {'Content-Type'=>'application/json; charset=utf-8', 'User-Agent'=>"Algolia for Ruby (#{Algolia::VERSION}); Ruby (#{RUBY_VERSION})", 'X-Algolia-Api-Key'=>ENV['ALGOLIA_API_KEY'], 'X-Algolia-Application-Id'=>ENV['ALGOLIA_APPLICATION_ID'], 'X-Forwarded-Api-Key'=>'ratelimitapikey', 'X-Forwarded-For'=>'1.2.3.4'}).
|
20
20
|
to_return(:status => 200, :body => "{ \"hits\": [], \"fakeAttribute\": 1 }", :headers => {})
|
21
21
|
Algolia.enable_rate_limit_forward ENV['ALGOLIA_API_KEY'], "1.2.3.4", "ratelimitapikey"
|
22
22
|
index = Algolia::Index.new("friends")
|
@@ -26,8 +26,8 @@ describe 'With a rate limited client' do
|
|
26
26
|
|
27
27
|
it "should use original headers" do
|
28
28
|
WebMock.stub_request(:post, %r{https://.*\.algolia\.(io|net)/1/indexes/friends/query}).
|
29
|
-
with(:headers => {'Content-Type'=>'application/json; charset=utf-8', 'User-Agent'=>"Algolia for Ruby #{Algolia::VERSION}", 'X-Algolia-Api-Key'=>ENV['ALGOLIA_API_KEY'], 'X-Algolia-Application-Id'=>ENV['ALGOLIA_APPLICATION_ID'] }).
|
30
|
-
to_return(:status => 200, :body => "{ \"hits\": [], \"fakeAttribute\": 2 }", :headers => {})
|
29
|
+
with(:headers => {'Content-Type'=>'application/json; charset=utf-8', 'User-Agent'=>"Algolia for Ruby (#{Algolia::VERSION}); Ruby (#{RUBY_VERSION})", 'X-Algolia-Api-Key'=>ENV['ALGOLIA_API_KEY'], 'X-Algolia-Application-Id'=>ENV['ALGOLIA_APPLICATION_ID'] }).
|
30
|
+
to_return(:status => 200, :body => "{ \"hits\": [], \"fakeAttribute\": 2 }", :headers => {})
|
31
31
|
Algolia.disable_rate_limit_forward
|
32
32
|
index = Algolia::Index.new("friends")
|
33
33
|
index.search('bar')['fakeAttribute'].should == 2
|
@@ -35,7 +35,7 @@ describe 'With a rate limited client' do
|
|
35
35
|
|
36
36
|
it "should pass the right headers in the scope" do
|
37
37
|
WebMock.stub_request(:post, %r{https://.*\.algolia\.(io|net)/1/indexes/friends/query}).
|
38
|
-
with(:headers => {'Content-Type'=>'application/json; charset=utf-8', 'User-Agent'=>"Algolia for Ruby #{Algolia::VERSION}", 'X-Algolia-Api-Key'=>ENV['ALGOLIA_API_KEY'], 'X-Algolia-Application-Id'=>ENV['ALGOLIA_APPLICATION_ID'], 'X-Forwarded-Api-Key'=>'ratelimitapikey', 'X-Forwarded-For'=>'1.2.3.4'}).
|
38
|
+
with(:headers => {'Content-Type'=>'application/json; charset=utf-8', 'User-Agent'=>"Algolia for Ruby (#{Algolia::VERSION}); Ruby (#{RUBY_VERSION})", 'X-Algolia-Api-Key'=>ENV['ALGOLIA_API_KEY'], 'X-Algolia-Application-Id'=>ENV['ALGOLIA_APPLICATION_ID'], 'X-Forwarded-Api-Key'=>'ratelimitapikey', 'X-Forwarded-For'=>'1.2.3.4'}).
|
39
39
|
to_return(:status => 200, :body => "{ \"hits\": [], \"fakeAttribute\": 1 }", :headers => {})
|
40
40
|
Algolia.with_rate_limits "1.2.3.4", "ratelimitapikey" do
|
41
41
|
index = Algolia::Index.new("friends")
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: algoliasearch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.23.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Algolia
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-06-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httpclient
|