algolia 2.0.0.pre.alpha.2
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 +7 -0
- data/.circleci/config.yml +146 -0
- data/.github/ISSUE_TEMPLATE.md +20 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +22 -0
- data/.gitignore +38 -0
- data/.rubocop.yml +186 -0
- data/.rubocop_todo.yml +14 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +18 -0
- data/LICENSE +21 -0
- data/README.md +56 -0
- data/Rakefile +45 -0
- data/Steepfile +6 -0
- data/algolia.gemspec +41 -0
- data/bin/console +21 -0
- data/bin/setup +8 -0
- data/lib/algolia.rb +42 -0
- data/lib/algolia/account_client.rb +65 -0
- data/lib/algolia/analytics_client.rb +105 -0
- data/lib/algolia/config/algolia_config.rb +40 -0
- data/lib/algolia/config/analytics_config.rb +20 -0
- data/lib/algolia/config/insights_config.rb +20 -0
- data/lib/algolia/config/recommendation_config.rb +20 -0
- data/lib/algolia/config/search_config.rb +40 -0
- data/lib/algolia/defaults.rb +35 -0
- data/lib/algolia/enums/call_type.rb +4 -0
- data/lib/algolia/enums/retry_outcome_type.rb +5 -0
- data/lib/algolia/error.rb +29 -0
- data/lib/algolia/helpers.rb +83 -0
- data/lib/algolia/http/http_requester.rb +84 -0
- data/lib/algolia/http/response.rb +23 -0
- data/lib/algolia/insights_client.rb +238 -0
- data/lib/algolia/iterators/base_iterator.rb +19 -0
- data/lib/algolia/iterators/object_iterator.rb +27 -0
- data/lib/algolia/iterators/paginator_iterator.rb +44 -0
- data/lib/algolia/iterators/rule_iterator.rb +9 -0
- data/lib/algolia/iterators/synonym_iterator.rb +9 -0
- data/lib/algolia/logger_helper.rb +14 -0
- data/lib/algolia/recommendation_client.rb +60 -0
- data/lib/algolia/responses/add_api_key_response.rb +38 -0
- data/lib/algolia/responses/base_response.rb +9 -0
- data/lib/algolia/responses/delete_api_key_response.rb +40 -0
- data/lib/algolia/responses/indexing_response.rb +28 -0
- data/lib/algolia/responses/multiple_batch_indexing_response.rb +29 -0
- data/lib/algolia/responses/multiple_response.rb +45 -0
- data/lib/algolia/responses/restore_api_key_response.rb +36 -0
- data/lib/algolia/responses/update_api_key_response.rb +39 -0
- data/lib/algolia/search_client.rb +614 -0
- data/lib/algolia/search_index.rb +1094 -0
- data/lib/algolia/transport/request_options.rb +94 -0
- data/lib/algolia/transport/retry_strategy.rb +117 -0
- data/lib/algolia/transport/stateful_host.rb +26 -0
- data/lib/algolia/transport/transport.rb +161 -0
- data/lib/algolia/user_agent.rb +25 -0
- data/lib/algolia/version.rb +3 -0
- data/sig/config/algolia_config.rbs +24 -0
- data/sig/config/analytics_config.rbs +11 -0
- data/sig/config/insights_config.rbs +11 -0
- data/sig/config/recommendation_config.rbs +11 -0
- data/sig/config/search_config.rbs +11 -0
- data/sig/enums/call_type.rbs +5 -0
- data/sig/helpers.rbs +12 -0
- data/sig/http/http_requester.rbs +17 -0
- data/sig/http/response.rbs +14 -0
- data/sig/interfaces/_connection.rbs +16 -0
- data/sig/iterators/base_iterator.rbs +15 -0
- data/sig/iterators/object_iterator.rbs +6 -0
- data/sig/iterators/paginator_iterator.rbs +8 -0
- data/sig/iterators/rule_iterator.rbs +5 -0
- data/sig/iterators/synonym_iterator.rbs +5 -0
- data/sig/transport/request_options.rbs +33 -0
- data/sig/transport/stateful_host.rbs +21 -0
- data/test/algolia/integration/account_client_test.rb +47 -0
- data/test/algolia/integration/analytics_client_test.rb +113 -0
- data/test/algolia/integration/base_test.rb +9 -0
- data/test/algolia/integration/insights_client_test.rb +80 -0
- data/test/algolia/integration/mocks/mock_requester.rb +45 -0
- data/test/algolia/integration/recommendation_client_test.rb +30 -0
- data/test/algolia/integration/search_client_test.rb +361 -0
- data/test/algolia/integration/search_index_test.rb +698 -0
- data/test/algolia/unit/helpers_test.rb +69 -0
- data/test/algolia/unit/retry_strategy_test.rb +139 -0
- data/test/algolia/unit/user_agent_test.rb +16 -0
- data/test/test_helper.rb +89 -0
- data/upgrade_guide.md +595 -0
- metadata +307 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
module Algolia
|
2
|
+
class BaseIterator
|
3
|
+
include Helpers
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
attr_reader :transporter, :index_name, :opts
|
7
|
+
|
8
|
+
# @param transporter [Transport::Transport] transporter used for requests
|
9
|
+
# @param index_name [String] Name of the index
|
10
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
11
|
+
#
|
12
|
+
def initialize(transporter, index_name, opts)
|
13
|
+
@transporter = transporter
|
14
|
+
@index_name = index_name
|
15
|
+
@opts = opts
|
16
|
+
@response = nil
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Algolia
|
2
|
+
class ObjectIterator < BaseIterator
|
3
|
+
# Custom each function to iterate through the objects
|
4
|
+
#
|
5
|
+
def each
|
6
|
+
loop do
|
7
|
+
data = {}
|
8
|
+
|
9
|
+
if @response
|
10
|
+
if @response[:hits].length
|
11
|
+
@response[:hits].each do |hit|
|
12
|
+
yield hit
|
13
|
+
end
|
14
|
+
|
15
|
+
if @response[:cursor].nil?
|
16
|
+
@response = nil
|
17
|
+
raise StopIteration
|
18
|
+
else
|
19
|
+
data[:cursor] = @response[:cursor]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
@response = @transporter.read(:POST, path_encode('1/indexes/%s/browse', @index_name), data, @opts)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Algolia
|
2
|
+
class PaginatorIterator < BaseIterator
|
3
|
+
# @param transporter [Transport::Transport] transporter used for requests
|
4
|
+
# @param index_name [String] Name of the index
|
5
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
6
|
+
#
|
7
|
+
def initialize(transporter, index_name, opts)
|
8
|
+
super(transporter, index_name, opts)
|
9
|
+
|
10
|
+
@data = {
|
11
|
+
hitsPerPage: 1000,
|
12
|
+
page: 0
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def each
|
17
|
+
loop do
|
18
|
+
if @response
|
19
|
+
if @response[:hits].length
|
20
|
+
@response[:hits].each do |hit|
|
21
|
+
hit.delete(:_highlightResult)
|
22
|
+
yield hit
|
23
|
+
end
|
24
|
+
|
25
|
+
if @response[:nbHits] < @data[:hitsPerPage]
|
26
|
+
@response = nil
|
27
|
+
@data = {
|
28
|
+
hitsPerPage: 1000,
|
29
|
+
page: 0
|
30
|
+
}
|
31
|
+
raise StopIteration
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
@response = @transporter.read(:POST, get_endpoint, @data, @opts)
|
36
|
+
@data[:page] += 1
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def get_endpoint
|
41
|
+
raise AlgoliaError, 'Method must be implemented'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module Algolia
|
4
|
+
class LoggerHelper
|
5
|
+
# @param debug_file [nil|String] file used to output the logs
|
6
|
+
#
|
7
|
+
def self.create(debug_file = nil)
|
8
|
+
file = debug_file || File.new('debug.log')
|
9
|
+
instance = ::Logger.new file
|
10
|
+
instance.progname = 'algolia'
|
11
|
+
instance
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module Algolia
|
2
|
+
module Recommendation
|
3
|
+
class Client
|
4
|
+
# Initializes the Recommendation client
|
5
|
+
#
|
6
|
+
# @param recommendation_config [Recommendation::Config] a Recommendation::Config object which contains your APP_ID and API_KEY
|
7
|
+
# @option adapter [Object] adapter object used for the connection
|
8
|
+
# @option logger [Object]
|
9
|
+
# @option http_requester [Object] http_requester object used for the connection
|
10
|
+
#
|
11
|
+
def initialize(recommendation_config, opts = {})
|
12
|
+
@config = recommendation_config
|
13
|
+
adapter = opts[:adapter] || Defaults::ADAPTER
|
14
|
+
logger = opts[:logger] || LoggerHelper.create('debug.log')
|
15
|
+
requester = opts[:http_requester] || Defaults::REQUESTER_CLASS.new(adapter, logger)
|
16
|
+
@transporter = Transport::Transport.new(@config, requester)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Create a new client providing only app ID and API key
|
20
|
+
#
|
21
|
+
# @param app_id [String] Algolia application ID
|
22
|
+
# @param api_key [String] Algolia API key
|
23
|
+
#
|
24
|
+
# @return self
|
25
|
+
#
|
26
|
+
def self.create(app_id, api_key)
|
27
|
+
config = Recommendation::Config.new(app_id: app_id, api_key: api_key)
|
28
|
+
create_with_config(config)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Create a new client providing only an Recommendation::Config object
|
32
|
+
#
|
33
|
+
# @param config [Recommendation::Config]
|
34
|
+
#
|
35
|
+
# @return self
|
36
|
+
#
|
37
|
+
def self.create_with_config(config)
|
38
|
+
new(config)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Set the personalization strategy.
|
42
|
+
#
|
43
|
+
# @param personalization_strategy [Hash] A strategy object.
|
44
|
+
#
|
45
|
+
# @return [Hash]
|
46
|
+
#
|
47
|
+
def set_personalization_strategy(personalization_strategy, opts = {})
|
48
|
+
@transporter.write(:POST, '1/strategies/personalization', personalization_strategy, opts)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Get the personalization strategy.
|
52
|
+
#
|
53
|
+
# @return [Hash]
|
54
|
+
#
|
55
|
+
def get_personalization_strategy(opts = {})
|
56
|
+
@transporter.read(:GET, '1/strategies/personalization', {}, opts)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Algolia
|
2
|
+
class AddApiKeyResponse < BaseResponse
|
3
|
+
attr_reader :raw_response
|
4
|
+
|
5
|
+
# @param client [Search::Client] Algolia Search Client used for verification
|
6
|
+
# @param response [Hash] Raw response from the client
|
7
|
+
#
|
8
|
+
def initialize(client, response)
|
9
|
+
@client = client
|
10
|
+
@raw_response = response
|
11
|
+
@done = false
|
12
|
+
end
|
13
|
+
|
14
|
+
# Wait for the task to complete
|
15
|
+
#
|
16
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
17
|
+
#
|
18
|
+
def wait(opts = {})
|
19
|
+
retries_count = 1
|
20
|
+
|
21
|
+
until @done
|
22
|
+
begin
|
23
|
+
@client.get_api_key(@raw_response[:key], opts)
|
24
|
+
@done = true
|
25
|
+
rescue AlgoliaError => e
|
26
|
+
if e.code != 404
|
27
|
+
raise e
|
28
|
+
end
|
29
|
+
retries_count += 1
|
30
|
+
time_before_retry = retries_count * Defaults::WAIT_TASK_DEFAULT_TIME_BEFORE_RETRY
|
31
|
+
sleep(time_before_retry / 1000)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
self
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Algolia
|
2
|
+
class DeleteApiKeyResponse < BaseResponse
|
3
|
+
attr_reader :raw_response
|
4
|
+
|
5
|
+
# @param client [Search::Client] Algolia Search Client used for verification
|
6
|
+
# @param response [Hash] Raw response from the client
|
7
|
+
# @param key [String] the key to check
|
8
|
+
#
|
9
|
+
def initialize(client, response, key)
|
10
|
+
@client = client
|
11
|
+
@raw_response = response
|
12
|
+
@key = key
|
13
|
+
@done = false
|
14
|
+
end
|
15
|
+
|
16
|
+
# Wait for the task to complete
|
17
|
+
#
|
18
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
19
|
+
#
|
20
|
+
def wait(opts = {})
|
21
|
+
retries_count = 1
|
22
|
+
|
23
|
+
until @done
|
24
|
+
begin
|
25
|
+
@client.get_api_key(@key, opts)
|
26
|
+
rescue AlgoliaError => e
|
27
|
+
@done = e.code == 404
|
28
|
+
|
29
|
+
unless @done
|
30
|
+
retries_count += 1
|
31
|
+
time_before_retry = retries_count * Defaults::WAIT_TASK_DEFAULT_TIME_BEFORE_RETRY
|
32
|
+
sleep(time_before_retry / 1000)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
self
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Algolia
|
2
|
+
class IndexingResponse < BaseResponse
|
3
|
+
attr_reader :raw_response
|
4
|
+
|
5
|
+
# @param index [Search::Index] Algolia Search Index used for verification
|
6
|
+
# @param response [Hash] Raw response from the client
|
7
|
+
#
|
8
|
+
def initialize(index, response)
|
9
|
+
@index = index
|
10
|
+
@raw_response = response
|
11
|
+
@done = false
|
12
|
+
end
|
13
|
+
|
14
|
+
# Wait for the task to complete
|
15
|
+
#
|
16
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
17
|
+
#
|
18
|
+
def wait(opts = {})
|
19
|
+
unless @done
|
20
|
+
task_id = get_option(@raw_response, 'taskID')
|
21
|
+
@index.wait_task(task_id, Defaults::WAIT_TASK_DEFAULT_TIME_BEFORE_RETRY, opts)
|
22
|
+
end
|
23
|
+
|
24
|
+
@done = true
|
25
|
+
self
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Algolia
|
2
|
+
class MultipleIndexBatchIndexingResponse < BaseResponse
|
3
|
+
attr_reader :raw_response
|
4
|
+
|
5
|
+
# @param client [Search::Client] Algolia Search Client used for verification
|
6
|
+
# @param response [Hash] Raw response from the client
|
7
|
+
#
|
8
|
+
def initialize(client, response)
|
9
|
+
@client = client
|
10
|
+
@raw_response = response
|
11
|
+
@done = false
|
12
|
+
end
|
13
|
+
|
14
|
+
# Wait for the task to complete
|
15
|
+
#
|
16
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
17
|
+
#
|
18
|
+
def wait(opts = {})
|
19
|
+
unless @done
|
20
|
+
@raw_response[:taskID].each do |index_name, task_id|
|
21
|
+
@client.wait_task(index_name, task_id, Defaults::WAIT_TASK_DEFAULT_TIME_BEFORE_RETRY, opts)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
@done = true
|
26
|
+
self
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Algolia
|
2
|
+
class MultipleResponse < BaseResponse
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
# @param responses [nil|Array] array of raw responses, when provided
|
6
|
+
#
|
7
|
+
def initialize(responses = nil)
|
8
|
+
@raw_responses = responses || []
|
9
|
+
end
|
10
|
+
|
11
|
+
# Fetch the last element of the responses
|
12
|
+
#
|
13
|
+
def last
|
14
|
+
@raw_responses[@raw_responses.length - 1]
|
15
|
+
end
|
16
|
+
|
17
|
+
# Add a new response to responses
|
18
|
+
#
|
19
|
+
def push(response)
|
20
|
+
@raw_responses.push(response)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Wait for the task to complete
|
24
|
+
#
|
25
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
26
|
+
#
|
27
|
+
def wait(opts = {})
|
28
|
+
@raw_responses.each do |response|
|
29
|
+
response.wait(opts)
|
30
|
+
end
|
31
|
+
|
32
|
+
@raw_responses = []
|
33
|
+
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
# Iterates through the responses
|
38
|
+
#
|
39
|
+
def each
|
40
|
+
@raw_responses.each do |response|
|
41
|
+
yield response
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Algolia
|
2
|
+
class RestoreApiKeyResponse < BaseResponse
|
3
|
+
# @param index [Search::Index] Algolia Search Index used for verification
|
4
|
+
# @param key [String] the key to check
|
5
|
+
#
|
6
|
+
def initialize(client, key)
|
7
|
+
@client = client
|
8
|
+
@key = key
|
9
|
+
@done = false
|
10
|
+
end
|
11
|
+
|
12
|
+
# Wait for the task to complete
|
13
|
+
#
|
14
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
15
|
+
#
|
16
|
+
def wait(opts = {})
|
17
|
+
retries_count = 1
|
18
|
+
|
19
|
+
until @done
|
20
|
+
begin
|
21
|
+
@client.get_api_key(@key, opts)
|
22
|
+
@done = true
|
23
|
+
rescue AlgoliaError => e
|
24
|
+
if e.code != 404
|
25
|
+
raise e
|
26
|
+
end
|
27
|
+
retries_count += 1
|
28
|
+
time_before_retry = retries_count * Defaults::WAIT_TASK_DEFAULT_TIME_BEFORE_RETRY
|
29
|
+
sleep(time_before_retry / 1000)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
self
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Algolia
|
2
|
+
class UpdateApiKeyResponse < BaseResponse
|
3
|
+
include Helpers
|
4
|
+
attr_reader :raw_response
|
5
|
+
|
6
|
+
# @param client [Search::Client] Algolia Search Client used for verification
|
7
|
+
# @param response [Hash] Raw response from the client
|
8
|
+
# @param request_options [Hash] request_options used to find the api key
|
9
|
+
#
|
10
|
+
def initialize(client, response, request_options)
|
11
|
+
@client = client
|
12
|
+
@raw_response = response
|
13
|
+
@request_options = request_options
|
14
|
+
@done = false
|
15
|
+
end
|
16
|
+
|
17
|
+
# Wait for the task to complete
|
18
|
+
#
|
19
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
20
|
+
#
|
21
|
+
def wait(opts = {})
|
22
|
+
retries_count = 1
|
23
|
+
|
24
|
+
until @done
|
25
|
+
begin
|
26
|
+
api_key = @client.get_api_key(@raw_response[:key], opts)
|
27
|
+
@done = hash_includes_subset?(api_key, @request_options)
|
28
|
+
rescue AlgoliaError => e
|
29
|
+
raise e unless e.code == 404
|
30
|
+
retries_count += 1
|
31
|
+
time_before_retry = retries_count * Defaults::WAIT_TASK_DEFAULT_TIME_BEFORE_RETRY
|
32
|
+
sleep(time_before_retry / 1000)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
self
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|