algolia 2.0.0.pre.alpha.4 → 2.0.0.pre.beta.1
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/.rubocop.yml +3 -0
- data/Gemfile +1 -1
- data/lib/algolia.rb +1 -1
- data/lib/algolia/analytics_client.rb +1 -1
- data/lib/algolia/config/analytics_config.rb +2 -2
- data/lib/algolia/config/{algolia_config.rb → base_config.rb} +10 -7
- data/lib/algolia/config/insights_config.rb +2 -2
- data/lib/algolia/config/recommendation_config.rb +2 -2
- data/lib/algolia/config/search_config.rb +2 -2
- data/lib/algolia/defaults.rb +2 -2
- data/lib/algolia/insights_client.rb +1 -1
- data/lib/algolia/recommendation_client.rb +1 -1
- data/lib/algolia/search_client.rb +1 -1
- data/lib/algolia/search_index.rb +35 -35
- data/lib/algolia/transport/transport.rb +4 -4
- data/lib/algolia/version.rb +1 -1
- data/sig/config/algolia_config.rbs +3 -3
- data/sig/config/analytics_config.rbs +1 -1
- data/sig/config/insights_config.rbs +1 -1
- data/sig/config/recommendation_config.rbs +1 -1
- data/sig/config/search_config.rbs +1 -1
- data/test/algolia/integration/analytics_client_test.rb +6 -6
- data/test/algolia/integration/insights_client_test.rb +11 -11
- data/test/algolia/integration/search_client_test.rb +20 -11
- data/test/algolia/unit/algolia_config_test.rb +16 -0
- data/test/algolia/unit/retry_strategy_test.rb +3 -3
- data/test/test_helper.rb +1 -1
- data/upgrade_guide.md +23 -21
- metadata +9 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70ae2ec824eed001a361d702826ad88956c6b580793bc8bb3aceda020ea8e8ea
|
4
|
+
data.tar.gz: bbed7b37901bf59cbc1cbf172a4ec9fa06df026988187cd1ea78fd6a3cf9dae4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 253ebb7ccb0745b17f72526df5656ba58eb800c3ce973eaffe52e6f098758def22d425c77fe6b07f882733551d3d01f081ff80b4be6b900f7ccfcac3a2926edf
|
7
|
+
data.tar.gz: a5e231f9bd48361cfe12fa5b74234ad899b6ac1dbd2b46dc0b4f69a76532bebb7cc1e0f7eb9abf7930693422a124c7eb5e5f18b5798beb3eb9edd6463779d3b7
|
data/.rubocop.yml
CHANGED
data/Gemfile
CHANGED
data/lib/algolia.rb
CHANGED
@@ -3,7 +3,7 @@ require 'algolia/helpers'
|
|
3
3
|
require 'algolia/http/http_requester'
|
4
4
|
require 'algolia/defaults'
|
5
5
|
require 'algolia/user_agent'
|
6
|
-
require 'algolia/config/
|
6
|
+
require 'algolia/config/base_config'
|
7
7
|
require 'algolia/config/search_config'
|
8
8
|
require 'algolia/config/analytics_config'
|
9
9
|
require 'algolia/config/insights_config'
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module Algolia
|
2
2
|
module Analytics
|
3
|
-
class Config <
|
3
|
+
class Config < BaseConfig
|
4
4
|
attr_accessor :region, :default_hosts
|
5
5
|
|
6
6
|
# Initialize a config
|
7
7
|
#
|
8
|
-
# @option options [String] :
|
8
|
+
# @option options [String] :application_id
|
9
9
|
# @option options [String] :api_key
|
10
10
|
# @option options [String] :region
|
11
11
|
#
|
@@ -1,13 +1,12 @@
|
|
1
1
|
require 'faraday'
|
2
2
|
|
3
3
|
module Algolia
|
4
|
-
|
5
|
-
|
6
|
-
attr_accessor :app_id, :api_key, :default_headers, :batch_size, :read_timeout, :write_timeout, :connect_timeout, :compression_type,
|
4
|
+
class BaseConfig
|
5
|
+
attr_accessor :app_id, :api_key, :headers, :batch_size, :read_timeout, :write_timeout, :connect_timeout, :compression_type,
|
7
6
|
:symbolize_keys
|
8
7
|
|
9
8
|
#
|
10
|
-
# @option options [String] :
|
9
|
+
# @option options [String] :application_id
|
11
10
|
# @option options [String] :api_key
|
12
11
|
# @option options [Integer] :batch_size
|
13
12
|
# @option options [Integer] :read_timeout
|
@@ -16,13 +15,13 @@ module Algolia
|
|
16
15
|
# @option options [Boolean] :symbolize_keys
|
17
16
|
#
|
18
17
|
def initialize(opts = {})
|
19
|
-
raise AlgoliaError, 'No Application ID provided, please set :
|
18
|
+
raise AlgoliaError, 'No Application ID provided, please set :application_id' unless opts.has_key?(:application_id)
|
20
19
|
raise AlgoliaError, 'No API key provided, please set :api_key' unless opts.has_key?(:api_key)
|
21
20
|
|
22
|
-
@app_id = opts[:
|
21
|
+
@app_id = opts[:application_id]
|
23
22
|
@api_key = opts[:api_key]
|
24
23
|
|
25
|
-
@
|
24
|
+
@headers = {
|
26
25
|
Defaults::HEADER_API_KEY => @api_key,
|
27
26
|
Defaults::HEADER_APP_ID => @app_id,
|
28
27
|
'Content-Type' => 'application/json; charset=utf-8',
|
@@ -36,5 +35,9 @@ module Algolia
|
|
36
35
|
@compression_type = opts[:compression_type] || Defaults::NONE_ENCODING
|
37
36
|
@symbolize_keys = opts[:symbolize_keys] || true
|
38
37
|
end
|
38
|
+
|
39
|
+
def set_extra_header(key, value)
|
40
|
+
@headers[key] = value
|
41
|
+
end
|
39
42
|
end
|
40
43
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module Algolia
|
2
2
|
module Insights
|
3
|
-
class Config <
|
3
|
+
class Config < BaseConfig
|
4
4
|
attr_accessor :region, :default_hosts
|
5
5
|
|
6
6
|
# Initialize a config
|
7
7
|
#
|
8
|
-
# @option options [String] :
|
8
|
+
# @option options [String] :application_id
|
9
9
|
# @option options [String] :api_key
|
10
10
|
# @option options [String] :region
|
11
11
|
#
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module Algolia
|
2
2
|
module Recommendation
|
3
|
-
class Config <
|
3
|
+
class Config < BaseConfig
|
4
4
|
attr_accessor :region, :default_hosts
|
5
5
|
|
6
6
|
# Initialize a config
|
7
7
|
#
|
8
|
-
# @option options [String] :
|
8
|
+
# @option options [String] :application_id
|
9
9
|
# @option options [String] :api_key
|
10
10
|
# @option options [String] :region
|
11
11
|
#
|
@@ -5,13 +5,13 @@ require 'algolia/enums/call_type'
|
|
5
5
|
|
6
6
|
module Algolia
|
7
7
|
module Search
|
8
|
-
class Config <
|
8
|
+
class Config < BaseConfig
|
9
9
|
include CallType
|
10
10
|
attr_accessor :default_hosts
|
11
11
|
|
12
12
|
# Initialize a config
|
13
13
|
#
|
14
|
-
# @option options [String] :
|
14
|
+
# @option options [String] :application_id
|
15
15
|
# @option options [String] :api_key
|
16
16
|
# @option options [Hash] :custom_hosts
|
17
17
|
#
|
data/lib/algolia/defaults.rb
CHANGED
@@ -24,8 +24,8 @@ module Defaults
|
|
24
24
|
|
25
25
|
BATCH_SIZE = 1000
|
26
26
|
CONNECT_TIMEOUT = 2
|
27
|
-
READ_TIMEOUT =
|
28
|
-
WRITE_TIMEOUT =
|
27
|
+
READ_TIMEOUT = 5
|
28
|
+
WRITE_TIMEOUT = 30
|
29
29
|
USER_AGENT = "Algolia for Ruby (#{Algolia::VERSION}), Ruby (#{RUBY_VERSION})"
|
30
30
|
|
31
31
|
WAIT_TASK_DEFAULT_TIME_BEFORE_RETRY = 100
|
@@ -24,7 +24,7 @@ module Algolia
|
|
24
24
|
# @return self
|
25
25
|
#
|
26
26
|
def self.create(app_id, api_key)
|
27
|
-
config = Recommendation::Config.new(
|
27
|
+
config = Recommendation::Config.new(application_id: app_id, api_key: api_key)
|
28
28
|
create_with_config(config)
|
29
29
|
end
|
30
30
|
|
data/lib/algolia/search_index.rb
CHANGED
@@ -5,16 +5,16 @@ module Algolia
|
|
5
5
|
include CallType
|
6
6
|
include Helpers
|
7
7
|
|
8
|
-
attr_reader :
|
8
|
+
attr_reader :name, :transporter, :config
|
9
9
|
|
10
10
|
# Initialize an index
|
11
11
|
#
|
12
|
-
# @param
|
12
|
+
# @param name [String] name of the index
|
13
13
|
# @param transporter [Object] transport object used for the connection
|
14
14
|
# @param config [Config] a Config object which contains your APP_ID and API_KEY
|
15
15
|
#
|
16
|
-
def initialize(
|
17
|
-
@
|
16
|
+
def initialize(name, transporter, config)
|
17
|
+
@name = name
|
18
18
|
@transporter = transporter
|
19
19
|
@config = config
|
20
20
|
end
|
@@ -47,7 +47,7 @@ module Algolia
|
|
47
47
|
# @param opts [Hash] contains extra parameters to send with your query
|
48
48
|
#
|
49
49
|
def get_task_status(task_id, opts = {})
|
50
|
-
res = @transporter.read(:GET, path_encode('/1/indexes/%s/task/%s', @
|
50
|
+
res = @transporter.read(:GET, path_encode('/1/indexes/%s/task/%s', @name, task_id), {}, opts)
|
51
51
|
get_option(res, 'status')
|
52
52
|
end
|
53
53
|
|
@@ -56,7 +56,7 @@ module Algolia
|
|
56
56
|
# @param opts [Hash] contains extra parameters to send with your query
|
57
57
|
#
|
58
58
|
def clear_objects(opts = {})
|
59
|
-
response = @transporter.write(:POST, path_encode('/1/indexes/%s/clear', @
|
59
|
+
response = @transporter.write(:POST, path_encode('/1/indexes/%s/clear', @name), {}, opts)
|
60
60
|
|
61
61
|
IndexingResponse.new(self, response)
|
62
62
|
end
|
@@ -75,7 +75,7 @@ module Algolia
|
|
75
75
|
# @param opts [Hash] contains extra parameters to send with your query
|
76
76
|
#
|
77
77
|
def delete(opts = {})
|
78
|
-
response = @transporter.write(:DELETE, path_encode('/1/indexes/%s', @
|
78
|
+
response = @transporter.write(:DELETE, path_encode('/1/indexes/%s', @name), opts)
|
79
79
|
|
80
80
|
IndexingResponse.new(self, response)
|
81
81
|
end
|
@@ -154,7 +154,7 @@ module Algolia
|
|
154
154
|
# @return [IndexingResponse]
|
155
155
|
#
|
156
156
|
def copy_to(name, opts = {})
|
157
|
-
response = @transporter.write(:POST, path_encode('/1/indexes/%s/operation', @
|
157
|
+
response = @transporter.write(:POST, path_encode('/1/indexes/%s/operation', @name), { operation: 'copy', destination: name }, opts)
|
158
158
|
|
159
159
|
IndexingResponse.new(self, response)
|
160
160
|
end
|
@@ -167,7 +167,7 @@ module Algolia
|
|
167
167
|
# @return [IndexingResponse]
|
168
168
|
#
|
169
169
|
def move_to(name, opts = {})
|
170
|
-
response = @transporter.write(:POST, path_encode('/1/indexes/%s/operation', @
|
170
|
+
response = @transporter.write(:POST, path_encode('/1/indexes/%s/operation', @name), { operation: 'move', destination: name }, opts)
|
171
171
|
|
172
172
|
IndexingResponse.new(self, response)
|
173
173
|
end
|
@@ -184,7 +184,7 @@ module Algolia
|
|
184
184
|
# @return [Hash]
|
185
185
|
#
|
186
186
|
def get_object(object_id, opts = {})
|
187
|
-
@transporter.read(:GET, path_encode('/1/indexes/%s/%s', @
|
187
|
+
@transporter.read(:GET, path_encode('/1/indexes/%s/%s', @name, object_id), {}, opts)
|
188
188
|
end
|
189
189
|
|
190
190
|
# Retrieve one or more objects in a single API call
|
@@ -201,7 +201,7 @@ module Algolia
|
|
201
201
|
|
202
202
|
requests = []
|
203
203
|
object_ids.each do |object_id|
|
204
|
-
request = { indexName: @
|
204
|
+
request = { indexName: @name, objectID: object_id.to_s }
|
205
205
|
|
206
206
|
if attributes_to_retrieve
|
207
207
|
request[:attributesToRetrieve] = attributes_to_retrieve
|
@@ -381,7 +381,7 @@ module Algolia
|
|
381
381
|
# @return [IndexingResponse]
|
382
382
|
#
|
383
383
|
def delete_by(filters, opts = {})
|
384
|
-
response = @transporter.write(:POST, path_encode('/1/indexes/%s/deleteByQuery', @
|
384
|
+
response = @transporter.write(:POST, path_encode('/1/indexes/%s/deleteByQuery', @name), filters, opts)
|
385
385
|
|
386
386
|
IndexingResponse.new(self, response)
|
387
387
|
end
|
@@ -436,7 +436,7 @@ module Algolia
|
|
436
436
|
# @return [Hash]
|
437
437
|
#
|
438
438
|
def get_rule(object_id, opts = {})
|
439
|
-
@transporter.read(:GET, path_encode('/1/indexes/%s/rules/%s', @
|
439
|
+
@transporter.read(:GET, path_encode('/1/indexes/%s/rules/%s', @name, object_id), {}, opts)
|
440
440
|
end
|
441
441
|
|
442
442
|
# Create or update a rule
|
@@ -500,7 +500,7 @@ module Algolia
|
|
500
500
|
get_object_id(rule)
|
501
501
|
end
|
502
502
|
|
503
|
-
response = @transporter.write(:POST, path_encode('/1/indexes/%s/rules/batch', @
|
503
|
+
response = @transporter.write(:POST, path_encode('/1/indexes/%s/rules/batch', @name) + handle_params({ forwardToReplicas: forward_to_replicas, clearExistingRules: clear_existing_rules }), rules, request_options)
|
504
504
|
|
505
505
|
IndexingResponse.new(self, response)
|
506
506
|
end
|
@@ -532,7 +532,7 @@ module Algolia
|
|
532
532
|
request_options.delete(:forwardToReplicas)
|
533
533
|
end
|
534
534
|
|
535
|
-
response = @transporter.write(:POST, path_encode('1/indexes/%s/rules/clear', @
|
535
|
+
response = @transporter.write(:POST, path_encode('1/indexes/%s/rules/clear', @name) + handle_params({ forwardToReplicas: forward_to_replicas }), '', request_options)
|
536
536
|
|
537
537
|
IndexingResponse.new(self, response)
|
538
538
|
end
|
@@ -566,7 +566,7 @@ module Algolia
|
|
566
566
|
|
567
567
|
response = @transporter.write(
|
568
568
|
:DELETE,
|
569
|
-
path_encode('1/indexes/%s/rules/%s', @
|
569
|
+
path_encode('1/indexes/%s/rules/%s', @name, object_id) + handle_params({ forwardToReplicas: forward_to_replicas }),
|
570
570
|
'',
|
571
571
|
request_options
|
572
572
|
)
|
@@ -598,7 +598,7 @@ module Algolia
|
|
598
598
|
# @return [Hash]
|
599
599
|
#
|
600
600
|
def get_synonym(object_id, opts = {})
|
601
|
-
@transporter.read(:GET, path_encode('/1/indexes/%s/synonyms/%s', @
|
601
|
+
@transporter.read(:GET, path_encode('/1/indexes/%s/synonyms/%s', @name, object_id), {}, opts)
|
602
602
|
end
|
603
603
|
|
604
604
|
# Create a new synonym object or update the existing synonym object with the given object ID
|
@@ -666,7 +666,7 @@ module Algolia
|
|
666
666
|
end
|
667
667
|
response = @transporter.write(
|
668
668
|
:POST,
|
669
|
-
path_encode('/1/indexes/%s/synonyms/batch', @
|
669
|
+
path_encode('/1/indexes/%s/synonyms/batch', @name) + handle_params({ forwardToReplicas: forward_to_replicas, replaceExistingSynonyms: replace_existing_synonyms }),
|
670
670
|
synonyms,
|
671
671
|
request_options
|
672
672
|
)
|
@@ -703,7 +703,7 @@ module Algolia
|
|
703
703
|
end
|
704
704
|
response = @transporter.write(
|
705
705
|
:POST,
|
706
|
-
path_encode('1/indexes/%s/synonyms/clear', @
|
706
|
+
path_encode('1/indexes/%s/synonyms/clear', @name) + handle_params({ forwardToReplicas: forward_to_replicas }),
|
707
707
|
'',
|
708
708
|
request_options
|
709
709
|
)
|
@@ -738,7 +738,7 @@ module Algolia
|
|
738
738
|
end
|
739
739
|
response = @transporter.write(
|
740
740
|
:DELETE,
|
741
|
-
path_encode('1/indexes/%s/synonyms/%s', @
|
741
|
+
path_encode('1/indexes/%s/synonyms/%s', @name, object_id) + handle_params({ forwardToReplicas: forward_to_replicas }),
|
742
742
|
'',
|
743
743
|
request_options
|
744
744
|
)
|
@@ -769,9 +769,9 @@ module Algolia
|
|
769
769
|
#
|
770
770
|
def browse_objects(opts = {}, &block)
|
771
771
|
if block_given?
|
772
|
-
ObjectIterator.new(@transporter, @
|
772
|
+
ObjectIterator.new(@transporter, @name, opts).each(&block)
|
773
773
|
else
|
774
|
-
ObjectIterator.new(@transporter, @
|
774
|
+
ObjectIterator.new(@transporter, @name, opts)
|
775
775
|
end
|
776
776
|
end
|
777
777
|
|
@@ -783,9 +783,9 @@ module Algolia
|
|
783
783
|
#
|
784
784
|
def browse_rules(opts = {}, &block)
|
785
785
|
if block_given?
|
786
|
-
RuleIterator.new(@transporter, @
|
786
|
+
RuleIterator.new(@transporter, @name, opts).each(&block)
|
787
787
|
else
|
788
|
-
RuleIterator.new(@transporter, @
|
788
|
+
RuleIterator.new(@transporter, @name, opts)
|
789
789
|
end
|
790
790
|
end
|
791
791
|
|
@@ -797,9 +797,9 @@ module Algolia
|
|
797
797
|
#
|
798
798
|
def browse_synonyms(opts = {}, &block)
|
799
799
|
if block_given?
|
800
|
-
SynonymIterator.new(@transporter, @
|
800
|
+
SynonymIterator.new(@transporter, @name, opts).each(&block)
|
801
801
|
else
|
802
|
-
SynonymIterator.new(@transporter, @
|
802
|
+
SynonymIterator.new(@transporter, @name, opts)
|
803
803
|
end
|
804
804
|
end
|
805
805
|
|
@@ -822,7 +822,7 @@ module Algolia
|
|
822
822
|
request_options.delete(:safe)
|
823
823
|
end
|
824
824
|
|
825
|
-
tmp_index_name = @
|
825
|
+
tmp_index_name = @name + '_tmp_' + rand(10000000).to_s
|
826
826
|
copy_to_response = copy_to(tmp_index_name, request_options.merge({ scope: %w(settings synonyms rules) }))
|
827
827
|
|
828
828
|
if safe
|
@@ -839,7 +839,7 @@ module Algolia
|
|
839
839
|
save_objects_response.wait
|
840
840
|
end
|
841
841
|
|
842
|
-
move_to_response = tmp_index.move_to(@
|
842
|
+
move_to_response = tmp_index.move_to(@name)
|
843
843
|
if safe
|
844
844
|
move_to_response.wait
|
845
845
|
end
|
@@ -924,7 +924,7 @@ module Algolia
|
|
924
924
|
# @return [Hash]
|
925
925
|
#
|
926
926
|
def search(query, opts = {})
|
927
|
-
@transporter.read(:POST, path_encode('/1/indexes/%s/query', @
|
927
|
+
@transporter.read(:POST, path_encode('/1/indexes/%s/query', @name), { 'query': query.to_s }, opts)
|
928
928
|
end
|
929
929
|
|
930
930
|
# Search for values of a given facet, optionally restricting the returned values to those contained
|
@@ -937,7 +937,7 @@ module Algolia
|
|
937
937
|
# @return [Hash]
|
938
938
|
#
|
939
939
|
def search_for_facet_values(facet_name, facet_query, opts = {})
|
940
|
-
@transporter.read(:POST, path_encode('/1/indexes/%s/facets/%s/query', @
|
940
|
+
@transporter.read(:POST, path_encode('/1/indexes/%s/facets/%s/query', @name, facet_name),
|
941
941
|
{ 'facetQuery': facet_query }, opts)
|
942
942
|
end
|
943
943
|
|
@@ -949,7 +949,7 @@ module Algolia
|
|
949
949
|
# @return [Hash]
|
950
950
|
#
|
951
951
|
def search_synonyms(query, opts = {})
|
952
|
-
@transporter.read(:POST, path_encode('/1/indexes/%s/synonyms/search', @
|
952
|
+
@transporter.read(:POST, path_encode('/1/indexes/%s/synonyms/search', @name), { query: query.to_s }, opts)
|
953
953
|
end
|
954
954
|
|
955
955
|
# Search or browse all rules, optionally filtering them by type
|
@@ -960,7 +960,7 @@ module Algolia
|
|
960
960
|
# @return [Hash]
|
961
961
|
#
|
962
962
|
def search_rules(query, opts = {})
|
963
|
-
@transporter.read(:POST, path_encode('/1/indexes/%s/rules/search', @
|
963
|
+
@transporter.read(:POST, path_encode('/1/indexes/%s/rules/search', @name), { query: query.to_s }, opts)
|
964
964
|
end
|
965
965
|
|
966
966
|
# # # # # # # # # # # # # # # # # # # # #
|
@@ -974,7 +974,7 @@ module Algolia
|
|
974
974
|
# @return [Hash]
|
975
975
|
#
|
976
976
|
def get_settings(opts = {})
|
977
|
-
response = @transporter.read(:GET, path_encode('/1/indexes/%s/settings', @
|
977
|
+
response = @transporter.read(:GET, path_encode('/1/indexes/%s/settings', @name) + handle_params({ getVersion: 2 }), {}, opts)
|
978
978
|
|
979
979
|
deserialize_settings(response)
|
980
980
|
end
|
@@ -987,7 +987,7 @@ module Algolia
|
|
987
987
|
# @return [IndexingResponse]
|
988
988
|
#
|
989
989
|
def set_settings(settings, opts = {})
|
990
|
-
response = @transporter.write(:PUT, path_encode('/1/indexes/%s/settings', @
|
990
|
+
response = @transporter.write(:PUT, path_encode('/1/indexes/%s/settings', @name), settings, opts)
|
991
991
|
|
992
992
|
IndexingResponse.new(self, response)
|
993
993
|
end
|
@@ -1087,7 +1087,7 @@ module Algolia
|
|
1087
1087
|
end
|
1088
1088
|
|
1089
1089
|
def raw_batch(requests, opts)
|
1090
|
-
@transporter.write(:POST, path_encode('/1/indexes/%s/batch', @
|
1090
|
+
@transporter.write(:POST, path_encode('/1/indexes/%s/batch', @name), { requests: requests }, opts)
|
1091
1091
|
end
|
1092
1092
|
end
|
1093
1093
|
end
|
@@ -132,10 +132,10 @@ module Algolia
|
|
132
132
|
# @return [Hash] merged headers
|
133
133
|
#
|
134
134
|
def generate_headers(request_options = {})
|
135
|
-
headers
|
136
|
-
extra_headers
|
137
|
-
@config.
|
138
|
-
extra_headers.each { |key, val| headers[key.to_s]
|
135
|
+
headers = {}
|
136
|
+
extra_headers = request_options.headers || {}
|
137
|
+
@config.headers.each { |key, val| headers[key.to_s] = val }
|
138
|
+
extra_headers.each { |key, val| headers[key.to_s] = val }
|
139
139
|
if request_options.compression_type == Defaults::GZIP_ENCODING
|
140
140
|
headers['Accept-Encoding'] = Defaults::GZIP_ENCODING
|
141
141
|
end
|
data/lib/algolia/version.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
module Algolia
|
2
|
-
|
3
|
-
class AlgoliaConfig
|
2
|
+
class BaseConfig
|
4
3
|
attr_accessor app_id: String
|
5
4
|
|
6
5
|
attr_accessor api_key: String
|
7
6
|
|
8
|
-
attr_accessor
|
7
|
+
attr_accessor headers: Hash[String, String]
|
9
8
|
|
10
9
|
attr_accessor batch_size: Integer
|
11
10
|
|
@@ -20,5 +19,6 @@ module Algolia
|
|
20
19
|
attr_accessor symbolize_keys: bool
|
21
20
|
|
22
21
|
def initialize: (?::Hash[Symbol, String|[String]] opts) -> void
|
22
|
+
def set_extra_header: (Symbol|String key, String value) -> void
|
23
23
|
end
|
24
24
|
end
|
@@ -11,14 +11,14 @@ class AnalyticsClientTest < BaseTest
|
|
11
11
|
index1.save_object!({ objectID: 'one' })
|
12
12
|
index2.save_object!({ objectID: 'one' })
|
13
13
|
|
14
|
-
ab_test_name = index1.
|
14
|
+
ab_test_name = index1.name
|
15
15
|
tomorrow = Time.now + 24*60*60
|
16
16
|
|
17
17
|
ab_test = {
|
18
18
|
name: ab_test_name,
|
19
19
|
variants: [
|
20
|
-
{ index: index1.
|
21
|
-
{ index: index2.
|
20
|
+
{ index: index1.name, trafficPercentage: 60, description: 'a description' },
|
21
|
+
{ index: index2.name, trafficPercentage: 40 }
|
22
22
|
],
|
23
23
|
endAt: tomorrow.strftime('%Y-%m-%dT%H:%M:%SZ')
|
24
24
|
}
|
@@ -74,14 +74,14 @@ class AnalyticsClientTest < BaseTest
|
|
74
74
|
|
75
75
|
index.save_object!({ objectID: 'one' })
|
76
76
|
|
77
|
-
ab_test_name = index.
|
77
|
+
ab_test_name = index.name
|
78
78
|
tomorrow = Time.now + 24*60*60
|
79
79
|
|
80
80
|
ab_test = {
|
81
81
|
name: ab_test_name,
|
82
82
|
variants: [
|
83
|
-
{ index: index.
|
84
|
-
{ index: index.
|
83
|
+
{ index: index.name, trafficPercentage: 90 },
|
84
|
+
{ index: index.name, trafficPercentage: 10, customSearchParameters: { ignorePlurals: true } }
|
85
85
|
],
|
86
86
|
endAt: tomorrow.strftime('%Y-%m-%dT%H:%M:%SZ')
|
87
87
|
}
|
@@ -17,7 +17,7 @@ class InsightsClientTest < BaseTest
|
|
17
17
|
client.send_event({
|
18
18
|
eventType: 'click',
|
19
19
|
eventName: 'foo',
|
20
|
-
index: index.
|
20
|
+
index: index.name,
|
21
21
|
userToken: 'bar',
|
22
22
|
objectIDs: %w(one two),
|
23
23
|
timestamp: (today - 2).strftime('%Q').to_i
|
@@ -27,14 +27,14 @@ class InsightsClientTest < BaseTest
|
|
27
27
|
{
|
28
28
|
eventType: 'click',
|
29
29
|
eventName: 'foo',
|
30
|
-
index: index.
|
30
|
+
index: index.name,
|
31
31
|
userToken: 'bar',
|
32
32
|
objectIDs: %w(one two),
|
33
33
|
timestamp: (today - 2).strftime('%Q').to_i
|
34
34
|
}, {
|
35
35
|
eventType: 'click',
|
36
36
|
eventName: 'foo',
|
37
|
-
index: index.
|
37
|
+
index: index.name,
|
38
38
|
userToken: 'bar',
|
39
39
|
objectIDs: %w(one two),
|
40
40
|
timestamp: (today - 2).strftime('%Q').to_i
|
@@ -42,37 +42,37 @@ class InsightsClientTest < BaseTest
|
|
42
42
|
])
|
43
43
|
|
44
44
|
user_client = client.user('bar')
|
45
|
-
response = user_client.clicked_object_ids('foo', index.
|
45
|
+
response = user_client.clicked_object_ids('foo', index.name, %w(one two))
|
46
46
|
assert_equal 200, response[:status]
|
47
47
|
assert_equal 'OK', response[:message]
|
48
48
|
|
49
49
|
query_id = index.search('', { clickAnalytics: true })[:queryID]
|
50
50
|
|
51
|
-
response = user_client.clicked_object_ids_after_search('foo', index.
|
51
|
+
response = user_client.clicked_object_ids_after_search('foo', index.name, %w(one two), [1, 2], query_id)
|
52
52
|
assert_equal 200, response[:status]
|
53
53
|
assert_equal 'OK', response[:message]
|
54
54
|
|
55
|
-
response = user_client.clicked_filters('foo', index.
|
55
|
+
response = user_client.clicked_filters('foo', index.name, %w(filter:foo filter:bar))
|
56
56
|
assert_equal 200, response[:status]
|
57
57
|
assert_equal 'OK', response[:message]
|
58
58
|
|
59
|
-
response = user_client.converted_object_ids('foo', index.
|
59
|
+
response = user_client.converted_object_ids('foo', index.name, %w(one two))
|
60
60
|
assert_equal 200, response[:status]
|
61
61
|
assert_equal 'OK', response[:message]
|
62
62
|
|
63
|
-
response = user_client.converted_object_ids_after_search('foo', index.
|
63
|
+
response = user_client.converted_object_ids_after_search('foo', index.name, %w(one two), query_id)
|
64
64
|
assert_equal 200, response[:status]
|
65
65
|
assert_equal 'OK', response[:message]
|
66
66
|
|
67
|
-
response = user_client.converted_filters('foo', index.
|
67
|
+
response = user_client.converted_filters('foo', index.name, %w(filter:foo filter:bar))
|
68
68
|
assert_equal 200, response[:status]
|
69
69
|
assert_equal 'OK', response[:message]
|
70
70
|
|
71
|
-
response = user_client.viewed_object_ids('foo', index.
|
71
|
+
response = user_client.viewed_object_ids('foo', index.name, %w(one two))
|
72
72
|
assert_equal 200, response[:status]
|
73
73
|
assert_equal 'OK', response[:message]
|
74
74
|
|
75
|
-
response = user_client.viewed_filters('foo', index.
|
75
|
+
response = user_client.viewed_filters('foo', index.name, %w(filter:foo filter:bar))
|
76
76
|
assert_equal 200, response[:status]
|
77
77
|
assert_equal 'OK', response[:message]
|
78
78
|
end
|
@@ -80,10 +80,10 @@ class SearchClientTest < BaseTest
|
|
80
80
|
copy_rules_index = @@search_client.init_index(get_test_index_name('copy_index_rules'))
|
81
81
|
copy_synonyms_index = @@search_client.init_index(get_test_index_name('copy_index_synonyms'))
|
82
82
|
copy_full_copy_index = @@search_client.init_index(get_test_index_name('copy_index_full_copy'))
|
83
|
-
@@search_client.copy_settings!(@index_name, copy_settings_index.
|
84
|
-
@@search_client.copy_rules!(@index_name, copy_rules_index.
|
85
|
-
@@search_client.copy_synonyms!(@index_name, copy_synonyms_index.
|
86
|
-
@@search_client.copy_index!(@index_name, copy_full_copy_index.
|
83
|
+
@@search_client.copy_settings!(@index_name, copy_settings_index.name)
|
84
|
+
@@search_client.copy_rules!(@index_name, copy_rules_index.name)
|
85
|
+
@@search_client.copy_synonyms!(@index_name, copy_synonyms_index.name)
|
86
|
+
@@search_client.copy_index!(@index_name, copy_full_copy_index.name)
|
87
87
|
|
88
88
|
assert_equal @index.get_settings, copy_settings_index.get_settings
|
89
89
|
assert_equal @index.get_rule(rule[:objectID]), copy_rules_index.get_rule(rule[:objectID])
|
@@ -93,7 +93,7 @@ class SearchClientTest < BaseTest
|
|
93
93
|
assert_equal @index.get_synonym(synonym[:objectID]), copy_full_copy_index.get_synonym(synonym[:objectID])
|
94
94
|
|
95
95
|
moved_index = @@search_client.init_index(get_test_index_name('move_index'))
|
96
|
-
@@search_client.move_index!(@index_name, moved_index.
|
96
|
+
@@search_client.move_index!(@index_name, moved_index.name)
|
97
97
|
|
98
98
|
moved_index.get_synonym('google_placeholder')
|
99
99
|
moved_index.get_rule('company_auto_faceting')
|
@@ -233,7 +233,16 @@ class SearchClientTest < BaseTest
|
|
233
233
|
|
234
234
|
assert_equal 'Key does not exist', exception.message
|
235
235
|
|
236
|
-
|
236
|
+
loop do
|
237
|
+
begin
|
238
|
+
@@search_client.restore_api_key!(@api_key[:value])
|
239
|
+
break
|
240
|
+
rescue Algolia::AlgoliaHttpError => e
|
241
|
+
if e.code != 404
|
242
|
+
raise StandardError
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
237
246
|
|
238
247
|
restored_key = @@search_client.get_api_key(@api_key[:value])
|
239
248
|
|
@@ -261,8 +270,8 @@ class SearchClientTest < BaseTest
|
|
261
270
|
end
|
262
271
|
|
263
272
|
def test_multiple_operations
|
264
|
-
index_name1 = @index1.
|
265
|
-
index_name2 = @index2.
|
273
|
+
index_name1 = @index1.name
|
274
|
+
index_name2 = @index2.name
|
266
275
|
|
267
276
|
response = @@search_client.multiple_batch!([
|
268
277
|
{ indexName: index_name1, action: 'addObject', body: { firstname: 'Jimmie' } },
|
@@ -317,12 +326,12 @@ class SearchClientTest < BaseTest
|
|
317
326
|
now = Time.now.to_i
|
318
327
|
secured_api_key = Algolia::Search::Client.generate_secured_api_key(SEARCH_KEY_1, {
|
319
328
|
validUntil: now + (10 * 60),
|
320
|
-
restrictIndices: @index1.
|
329
|
+
restrictIndices: @index1.name
|
321
330
|
})
|
322
331
|
|
323
332
|
secured_client = Algolia::Search::Client.create(APPLICATION_ID_1, secured_api_key)
|
324
|
-
secured_index1 = secured_client.init_index(@index1.
|
325
|
-
secured_index2 = secured_client.init_index(@index2.
|
333
|
+
secured_index1 = secured_client.init_index(@index1.name)
|
334
|
+
secured_index2 = secured_client.init_index(@index2.name)
|
326
335
|
|
327
336
|
secured_index1.search('')
|
328
337
|
exception = assert_raises Algolia::AlgoliaHttpError do
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'algolia'
|
2
|
+
require 'test_helper'
|
3
|
+
|
4
|
+
class AlgoliaConfigTest
|
5
|
+
describe 'set an extra header' do
|
6
|
+
def before_all
|
7
|
+
@config = Algolia::AlgoliaConfig.new(app_id: 'app_id', api_key: 'api_key')
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_set_extra_header
|
11
|
+
@config.set_extra_header('foo', 'bar')
|
12
|
+
assert @config.headers['foo']
|
13
|
+
assert_equal @config.headers['foo'], 'bar'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -13,7 +13,7 @@ class RetryStrategyTest
|
|
13
13
|
stateful_hosts << "#{@app_id}-4.algolianet.com"
|
14
14
|
stateful_hosts << "#{@app_id}-5.algolianet.com"
|
15
15
|
stateful_hosts << "#{@app_id}-6.algolianet.com"
|
16
|
-
@config = Algolia::Search::Config.new(
|
16
|
+
@config = Algolia::Search::Config.new(application_id: @app_id, api_key: @api_key, custom_hosts: stateful_hosts)
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_resets_expired_hosts_according_to_read_type
|
@@ -74,7 +74,7 @@ class RetryStrategyTest
|
|
74
74
|
describe 'All hosts are unreachable' do
|
75
75
|
def test_failure_when_all_hosts_are_down
|
76
76
|
stateful_hosts = ['0.0.0.0']
|
77
|
-
@config = Algolia::Search::Config.new(
|
77
|
+
@config = Algolia::Search::Config.new(application_id: 'foo', api_key: 'bar', custom_hosts: stateful_hosts)
|
78
78
|
client = Algolia::Search::Client.create_with_config(@config)
|
79
79
|
index = client.init_index(get_test_index_name('failure'))
|
80
80
|
|
@@ -91,7 +91,7 @@ class RetryStrategyTest
|
|
91
91
|
super
|
92
92
|
@app_id = 'app_id'
|
93
93
|
@api_key = 'api_key'
|
94
|
-
@config = Algolia::Search::Config.new(
|
94
|
+
@config = Algolia::Search::Config.new(application_id: @app_id, api_key: @api_key)
|
95
95
|
@retry_strategy = Algolia::Transport::RetryStrategy.new(@config)
|
96
96
|
@hosts = @retry_strategy.get_tryable_hosts(READ|WRITE)
|
97
97
|
end
|
data/test/test_helper.rb
CHANGED
@@ -24,7 +24,7 @@ class Minitest::Test
|
|
24
24
|
|
25
25
|
include Minitest::Hooks
|
26
26
|
include Helpers
|
27
|
-
@@search_config = Algolia::Search::Config.new(
|
27
|
+
@@search_config = Algolia::Search::Config.new(application_id: APPLICATION_ID_1, api_key: ADMIN_KEY_1, user_agent: USER_AGENT)
|
28
28
|
@@search_client = Algolia::Search::Client.new(@@search_config)
|
29
29
|
end
|
30
30
|
|
data/upgrade_guide.md
CHANGED
@@ -5,7 +5,7 @@ First, you'll have to include the new version in your Gemfile. To do so, change
|
|
5
5
|
|
6
6
|
```diff
|
7
7
|
- gem 'algoliasearch'
|
8
|
-
+ gem 'algolia', git: 'https://github.com/algolia/algoliasearch-client-ruby.git', tag: 'v2.0.0-
|
8
|
+
+ gem 'algolia', git: 'https://github.com/algolia/algoliasearch-client-ruby.git', tag: 'v2.0.0-beta.1'
|
9
9
|
```
|
10
10
|
|
11
11
|
Then, you'll need to change your current `require` statements:
|
@@ -38,7 +38,7 @@ index = client.init_index('index_name')
|
|
38
38
|
client = Algolia::Search::Client.create('APP_ID', 'API_KEY')
|
39
39
|
index = client.init_index('index_name')
|
40
40
|
# or
|
41
|
-
search_config = Algolia::Search::Config.new(
|
41
|
+
search_config = Algolia::Search::Config.new(application_id: app_id, api_key: api_key)
|
42
42
|
client = Algolia::Search::Client.create_with_config(search_config)
|
43
43
|
index = client.init_index('index_name')
|
44
44
|
```
|
@@ -55,12 +55,8 @@ index.search('query', search_params, request_opts)
|
|
55
55
|
|
56
56
|
# After
|
57
57
|
opts = {
|
58
|
-
:
|
59
|
-
|
60
|
-
},
|
61
|
-
:params => {
|
62
|
-
hitsPerPage: 50
|
63
|
-
}
|
58
|
+
headers: { 'X-Algolia-UserToken': 'user123' },
|
59
|
+
hitsPerPage: 50
|
64
60
|
}
|
65
61
|
index.search('query', opts)
|
66
62
|
```
|
@@ -69,6 +65,20 @@ index.search('query', opts)
|
|
69
65
|
|
70
66
|
### `Client`
|
71
67
|
|
68
|
+
#### `set_extra_header`
|
69
|
+
The `set_extra_header` method has been moved from the Client to the `Algolia::AlgoliaConfig` class. You have to define your extra headers on Client instantiation.
|
70
|
+
```ruby
|
71
|
+
# Before
|
72
|
+
client.set_extra_header('admin', 'admin-key')
|
73
|
+
|
74
|
+
# After
|
75
|
+
# `Algolia::Search::Config` inherits from `Algolia::AlgoliaConfig`
|
76
|
+
config = Algolia::Search::Config.new(app_id: 'APP_ID', api_key: 'API_KEY')
|
77
|
+
config.set_extra_header('admin', 'admin-key')
|
78
|
+
|
79
|
+
client = Algolia::Search::Client.create_with_config(config)
|
80
|
+
```
|
81
|
+
|
72
82
|
#### `multiple_queries`
|
73
83
|
The `strategy` parameter is no longer a string, but a key in the `requestOptions`.
|
74
84
|
```ruby
|
@@ -244,12 +254,8 @@ index.search('query', search_params, request_opts)
|
|
244
254
|
|
245
255
|
# After
|
246
256
|
opts = {
|
247
|
-
:
|
248
|
-
|
249
|
-
},
|
250
|
-
:params => {
|
251
|
-
hitsPerPage: 50
|
252
|
-
}
|
257
|
+
headers: { 'X-Algolia-UserToken': 'user123' },
|
258
|
+
hitsPerPage: 50
|
253
259
|
}
|
254
260
|
index.search('query', opts)
|
255
261
|
```
|
@@ -265,12 +271,8 @@ index.search_for_facet_values('category', 'phone', search_params, request_opts)
|
|
265
271
|
|
266
272
|
# After
|
267
273
|
opts = {
|
268
|
-
:
|
269
|
-
|
270
|
-
},
|
271
|
-
:params => {
|
272
|
-
hitsPerPage: 50
|
273
|
-
}
|
274
|
+
headers: { 'X-Algolia-UserToken': 'user123' },
|
275
|
+
hitsPerPage: 50
|
274
276
|
}
|
275
277
|
index.search_for_facet_values('category', 'phone', opts)
|
276
278
|
```
|
@@ -590,6 +592,6 @@ client = Algolia::Client.new({
|
|
590
592
|
})
|
591
593
|
|
592
594
|
# After
|
593
|
-
search_config = Algolia::Search::Config.new(
|
595
|
+
search_config = Algolia::Search::Config.new(application_id: 'app_id', api_key: 'api_key', read_timeout: 10, connect_timeout: 2)
|
594
596
|
client = Algolia::Search::Client.create_with_config(search_config)
|
595
597
|
```
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: algolia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.pre.
|
4
|
+
version: 2.0.0.pre.beta.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Algolia
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-10-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -204,8 +204,8 @@ files:
|
|
204
204
|
- lib/algolia.rb
|
205
205
|
- lib/algolia/account_client.rb
|
206
206
|
- lib/algolia/analytics_client.rb
|
207
|
-
- lib/algolia/config/algolia_config.rb
|
208
207
|
- lib/algolia/config/analytics_config.rb
|
208
|
+
- lib/algolia/config/base_config.rb
|
209
209
|
- lib/algolia/config/insights_config.rb
|
210
210
|
- lib/algolia/config/recommendation_config.rb
|
211
211
|
- lib/algolia/config/search_config.rb
|
@@ -265,6 +265,7 @@ files:
|
|
265
265
|
- test/algolia/integration/recommendation_client_test.rb
|
266
266
|
- test/algolia/integration/search_client_test.rb
|
267
267
|
- test/algolia/integration/search_index_test.rb
|
268
|
+
- test/algolia/unit/algolia_config_test.rb
|
268
269
|
- test/algolia/unit/helpers_test.rb
|
269
270
|
- test/algolia/unit/retry_strategy_test.rb
|
270
271
|
- test/algolia/unit/user_agent_test.rb
|
@@ -277,7 +278,7 @@ metadata:
|
|
277
278
|
bug_tracker_uri: https://github.com/algolia/algoliasearch-client-ruby/issues
|
278
279
|
documentation_uri: http://www.rubydoc.info/gems/algolia
|
279
280
|
source_code_uri: https://github.com/algolia/algoliasearch-client-ruby/tree/release/v2
|
280
|
-
post_install_message:
|
281
|
+
post_install_message:
|
281
282
|
rdoc_options: []
|
282
283
|
require_paths:
|
283
284
|
- lib
|
@@ -292,8 +293,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
292
293
|
- !ruby/object:Gem::Version
|
293
294
|
version: 1.3.1
|
294
295
|
requirements: []
|
295
|
-
rubygems_version: 3.0.
|
296
|
-
signing_key:
|
296
|
+
rubygems_version: 3.0.3
|
297
|
+
signing_key:
|
297
298
|
specification_version: 4
|
298
299
|
summary: A simple Ruby client for the algolia.com REST API (alpha release)
|
299
300
|
test_files:
|
@@ -305,6 +306,7 @@ test_files:
|
|
305
306
|
- test/algolia/integration/recommendation_client_test.rb
|
306
307
|
- test/algolia/integration/search_client_test.rb
|
307
308
|
- test/algolia/integration/search_index_test.rb
|
309
|
+
- test/algolia/unit/algolia_config_test.rb
|
308
310
|
- test/algolia/unit/helpers_test.rb
|
309
311
|
- test/algolia/unit/retry_strategy_test.rb
|
310
312
|
- test/algolia/unit/user_agent_test.rb
|