elastomer-client 0.7.0 → 0.8.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/.overcommit.yml +5 -0
- data/.rubocop.yml +83 -0
- data/CHANGELOG.md +8 -0
- data/Gemfile +2 -2
- data/README.md +1 -1
- data/Rakefile +2 -2
- data/elastomer-client.gemspec +4 -2
- data/lib/elastomer/client.rb +42 -37
- data/lib/elastomer/client/bulk.rb +2 -2
- data/lib/elastomer/client/cluster.rb +19 -19
- data/lib/elastomer/client/delete_by_query.rb +7 -7
- data/lib/elastomer/client/docs.rb +81 -24
- data/lib/elastomer/client/errors.rb +2 -2
- data/lib/elastomer/client/index.rb +65 -29
- data/lib/elastomer/client/multi_percolate.rb +127 -0
- data/lib/elastomer/client/multi_search.rb +2 -2
- data/lib/elastomer/client/nodes.rb +4 -4
- data/lib/elastomer/client/percolator.rb +77 -0
- data/lib/elastomer/client/repository.rb +7 -7
- data/lib/elastomer/client/scroller.rb +14 -14
- data/lib/elastomer/client/snapshot.rb +9 -9
- data/lib/elastomer/client/template.rb +3 -3
- data/lib/elastomer/client/warmer.rb +5 -16
- data/lib/elastomer/core_ext/time.rb +1 -1
- data/lib/elastomer/middleware/encode_json.rb +5 -5
- data/lib/elastomer/middleware/opaque_id.rb +3 -3
- data/lib/elastomer/middleware/parse_json.rb +5 -5
- data/lib/elastomer/notifications.rb +4 -4
- data/lib/elastomer/version.rb +1 -1
- data/script/bootstrap +2 -0
- data/script/console +5 -5
- data/test/assertions.rb +26 -24
- data/test/client/bulk_test.rb +111 -111
- data/test/client/cluster_test.rb +58 -58
- data/test/client/delete_by_query_test.rb +53 -53
- data/test/client/docs_test.rb +279 -203
- data/test/client/errors_test.rb +1 -1
- data/test/client/index_test.rb +143 -109
- data/test/client/multi_percolate_test.rb +130 -0
- data/test/client/multi_search_test.rb +30 -28
- data/test/client/nodes_test.rb +30 -29
- data/test/client/percolator_test.rb +52 -0
- data/test/client/repository_test.rb +23 -23
- data/test/client/scroller_test.rb +40 -40
- data/test/client/snapshot_test.rb +15 -15
- data/test/client/stubbed_client_test.rb +15 -15
- data/test/client/template_test.rb +10 -10
- data/test/client/warmer_test.rb +18 -18
- data/test/client_test.rb +53 -53
- data/test/core_ext/time_test.rb +12 -12
- data/test/middleware/encode_json_test.rb +20 -20
- data/test/middleware/opaque_id_test.rb +10 -10
- data/test/middleware/parse_json_test.rb +14 -14
- data/test/notifications_test.rb +32 -32
- data/test/test_helper.rb +24 -24
- metadata +38 -2
data/test/core_ext/time_test.rb
CHANGED
@@ -1,20 +1,20 @@
|
|
1
|
-
require File.expand_path(
|
2
|
-
require
|
1
|
+
require File.expand_path("../../test_helper", __FILE__)
|
2
|
+
require "elastomer/core_ext/time"
|
3
3
|
|
4
|
-
describe
|
4
|
+
describe "JSON conversions for Time" do
|
5
5
|
before do
|
6
|
-
@name =
|
6
|
+
@name = "elastomer-time-test"
|
7
7
|
@index = $client.index(@name)
|
8
8
|
|
9
9
|
unless @index.exists?
|
10
10
|
@index.create \
|
11
|
-
:settings => {
|
11
|
+
:settings => { "index.number_of_shards" => 1, "index.number_of_replicas" => 0 },
|
12
12
|
:mappings => {
|
13
13
|
:doc1 => {
|
14
14
|
:_source => { :enabled => true }, :_all => { :enabled => false },
|
15
15
|
:properties => {
|
16
|
-
:title => { :type =>
|
17
|
-
:created_at => { :type =>
|
16
|
+
:title => { :type => "string", :index => "not_analyzed" },
|
17
|
+
:created_at => { :type => "date" }
|
18
18
|
}
|
19
19
|
}
|
20
20
|
}
|
@@ -29,18 +29,18 @@ describe 'JSON conversions for Time' do
|
|
29
29
|
@index.delete if @index.exists?
|
30
30
|
end
|
31
31
|
|
32
|
-
it
|
32
|
+
it "generates ISO8601 formatted time strings" do
|
33
33
|
time = Time.utc(2013, 5, 3, 10, 1, 31)
|
34
34
|
assert_equal '"2013-05-03T10:01:31Z"', MultiJson.encode(time)
|
35
35
|
end
|
36
36
|
|
37
|
-
it
|
37
|
+
it "indexes time fields" do
|
38
38
|
time = Time.utc(2013, 5, 3, 10, 1, 31)
|
39
|
-
h = @docs.index({:title =>
|
39
|
+
h = @docs.index({:title => "test document", :created_at => time}, :type => "doc1")
|
40
40
|
|
41
41
|
assert_created(h)
|
42
42
|
|
43
|
-
doc = @docs.get(:type =>
|
44
|
-
assert_equal
|
43
|
+
doc = @docs.get(:type => "doc1", :id => h["_id"])
|
44
|
+
assert_equal "2013-05-03T10:01:31Z", doc["_source"]["created_at"]
|
45
45
|
end
|
46
46
|
end
|
@@ -1,53 +1,53 @@
|
|
1
|
-
require File.expand_path(
|
1
|
+
require File.expand_path("../../test_helper", __FILE__)
|
2
2
|
|
3
3
|
describe Elastomer::Middleware::EncodeJson do
|
4
4
|
let(:middleware) { Elastomer::Middleware::EncodeJson.new(lambda {|env| env})}
|
5
5
|
|
6
6
|
def process(body, content_type = nil)
|
7
7
|
env = { :body => body, :request_headers => Faraday::Utils::Headers.new }
|
8
|
-
env[:request_headers][
|
8
|
+
env[:request_headers]["content-type"] = content_type if content_type
|
9
9
|
middleware.call(env)
|
10
10
|
end
|
11
11
|
|
12
|
-
it
|
12
|
+
it "handles no body" do
|
13
13
|
result = process(nil)
|
14
14
|
assert_nil result[:body]
|
15
|
-
assert_nil result[:request_headers][
|
15
|
+
assert_nil result[:request_headers]["content-type"]
|
16
16
|
end
|
17
17
|
|
18
|
-
it
|
19
|
-
result = process(
|
18
|
+
it "handles empty body" do
|
19
|
+
result = process("")
|
20
20
|
assert_empty result[:body]
|
21
|
-
assert_nil result[:request_headers][
|
21
|
+
assert_nil result[:request_headers]["content-type"]
|
22
22
|
end
|
23
23
|
|
24
|
-
it
|
24
|
+
it "handles string body" do
|
25
25
|
result = process('{"a":1}')
|
26
26
|
assert_equal '{"a":1}', result[:body]
|
27
|
-
assert_equal
|
27
|
+
assert_equal "application/json", result[:request_headers]["content-type"]
|
28
28
|
end
|
29
29
|
|
30
|
-
it
|
30
|
+
it "handles object body" do
|
31
31
|
result = process({:a => 1})
|
32
32
|
assert_equal '{"a":1}', result[:body]
|
33
|
-
assert_equal
|
33
|
+
assert_equal "application/json", result[:request_headers]["content-type"]
|
34
34
|
end
|
35
35
|
|
36
|
-
it
|
36
|
+
it "handles empty object body" do
|
37
37
|
result = process({})
|
38
|
-
assert_equal
|
39
|
-
assert_equal
|
38
|
+
assert_equal "{}", result[:body]
|
39
|
+
assert_equal "application/json", result[:request_headers]["content-type"]
|
40
40
|
end
|
41
41
|
|
42
|
-
it
|
43
|
-
result = process({:a => 1},
|
42
|
+
it "handles object body with json type" do
|
43
|
+
result = process({:a => 1}, "application/json; charset=utf-8")
|
44
44
|
assert_equal '{"a":1}', result[:body]
|
45
|
-
assert_equal
|
45
|
+
assert_equal "application/json; charset=utf-8", result[:request_headers]["content-type"]
|
46
46
|
end
|
47
47
|
|
48
|
-
it
|
49
|
-
result = process({:a => 1},
|
48
|
+
it "handles object body with incompatible type" do
|
49
|
+
result = process({:a => 1}, "application/xml; charset=utf-8")
|
50
50
|
assert_equal({:a => 1}, result[:body])
|
51
|
-
assert_equal
|
51
|
+
assert_equal "application/xml; charset=utf-8", result[:request_headers]["content-type"]
|
52
52
|
end
|
53
53
|
end
|
@@ -1,25 +1,25 @@
|
|
1
|
-
require File.expand_path(
|
1
|
+
require File.expand_path("../../test_helper", __FILE__)
|
2
2
|
|
3
3
|
describe Elastomer::Middleware::OpaqueId do
|
4
4
|
|
5
5
|
before do
|
6
6
|
stubs = Faraday::Adapter::Test::Stubs.new do |stub|
|
7
|
-
stub.get(
|
7
|
+
stub.get("/_cluster/health") { |env|
|
8
8
|
[ 200,
|
9
9
|
|
10
|
-
{
|
11
|
-
|
12
|
-
|
10
|
+
{ "X-Opaque-Id" => env[:request_headers]["X-Opaque-Id"],
|
11
|
+
"Content-Type" => "application/json; charset=UTF-8",
|
12
|
+
"Content-Length" => "49" },
|
13
13
|
|
14
14
|
%q[{"cluster_name":"elasticsearch","status":"green"}]
|
15
15
|
]
|
16
16
|
}
|
17
17
|
|
18
|
-
stub.get(
|
19
|
-
[ 200, {}, {
|
18
|
+
stub.get("/") { |env|
|
19
|
+
[ 200, {}, {"version" => {"number" => "1.0.0"}} ]
|
20
20
|
}
|
21
|
-
stub.get(
|
22
|
-
[ 200, {
|
21
|
+
stub.get("/_cluster/state") { |env|
|
22
|
+
[ 200, {"X-Opaque-Id" => "00000000-0000-0000-0000-000000000000"}, %q[{"foo":"bar"}] ]
|
23
23
|
}
|
24
24
|
end
|
25
25
|
|
@@ -35,7 +35,7 @@ describe Elastomer::Middleware::OpaqueId do
|
|
35
35
|
assert_equal({"cluster_name" => "elasticsearch", "status" => "green"}, health)
|
36
36
|
end
|
37
37
|
|
38
|
-
it
|
38
|
+
it "raises an exception on conflicting headers" do
|
39
39
|
assert_raises(Elastomer::Client::OpaqueIdError) { @client.cluster.state }
|
40
40
|
end
|
41
41
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.expand_path(
|
1
|
+
require File.expand_path("../../test_helper", __FILE__)
|
2
2
|
|
3
3
|
describe Elastomer::Middleware::ParseJson do
|
4
4
|
let(:middleware) { Elastomer::Middleware::ParseJson.new(lambda {|env| Faraday::Response.new(env)})}
|
@@ -6,7 +6,7 @@ describe Elastomer::Middleware::ParseJson do
|
|
6
6
|
|
7
7
|
def process(body, content_type = nil)
|
8
8
|
env = { :body => body, :response_headers => Faraday::Utils::Headers.new(headers) }
|
9
|
-
env[:response_headers][
|
9
|
+
env[:response_headers]["content-type"] = content_type if content_type
|
10
10
|
middleware.call(env)
|
11
11
|
end
|
12
12
|
|
@@ -15,34 +15,34 @@ describe Elastomer::Middleware::ParseJson do
|
|
15
15
|
assert_nil response.body
|
16
16
|
end
|
17
17
|
|
18
|
-
it
|
18
|
+
it "nullifies empty body" do
|
19
19
|
response = process("")
|
20
20
|
assert_nil response.body
|
21
21
|
end
|
22
22
|
|
23
|
-
it
|
23
|
+
it "nullifies blank body" do
|
24
24
|
response = process(" ")
|
25
25
|
assert_nil response.body
|
26
26
|
end
|
27
27
|
|
28
|
-
it
|
28
|
+
it "parses json body with empty type" do
|
29
29
|
response = process('{"a":1}')
|
30
|
-
assert_equal({
|
30
|
+
assert_equal({"a" => 1}, response.body)
|
31
31
|
end
|
32
32
|
|
33
|
-
it
|
34
|
-
response = process('{"a":1}',
|
35
|
-
assert_equal({
|
33
|
+
it "parses json body of correct type" do
|
34
|
+
response = process('{"a":1}', "application/json; charset=utf-8")
|
35
|
+
assert_equal({"a" => 1}, response.body)
|
36
36
|
end
|
37
37
|
|
38
|
-
it
|
39
|
-
response = process('{"a":1}',
|
38
|
+
it "ignores json body if incorrect type" do
|
39
|
+
response = process('{"a":1}', "application/xml; charset=utf-8")
|
40
40
|
assert_equal('{"a":1}', response.body)
|
41
41
|
end
|
42
42
|
|
43
|
-
it
|
44
|
-
assert_raises(Faraday::Error::ParsingError) { process
|
45
|
-
assert_raises(Faraday::Error::ParsingError) { process
|
43
|
+
it "chokes on invalid json" do
|
44
|
+
assert_raises(Faraday::Error::ParsingError) { process "{!" }
|
45
|
+
assert_raises(Faraday::Error::ParsingError) { process "invalid" }
|
46
46
|
|
47
47
|
# surprisingly these are all valid according to MultiJson
|
48
48
|
#
|
data/test/notifications_test.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
require File.expand_path(
|
2
|
-
require
|
1
|
+
require File.expand_path("../test_helper", __FILE__)
|
2
|
+
require "elastomer/notifications"
|
3
3
|
|
4
4
|
describe Elastomer::Notifications do
|
5
5
|
before do
|
6
|
-
@name =
|
6
|
+
@name = "elastomer-notifications-test"
|
7
7
|
@index = $client.index @name
|
8
8
|
@index.delete if @index.exists?
|
9
9
|
@events = []
|
@@ -20,51 +20,51 @@ describe Elastomer::Notifications do
|
|
20
20
|
it "instruments timeouts" do
|
21
21
|
$client.stub :connection, lambda { raise Faraday::Error::TimeoutError } do
|
22
22
|
assert_raises(Elastomer::Client::TimeoutError) { $client.info }
|
23
|
-
event = @events.detect { |e| e.payload[:action] ==
|
23
|
+
event = @events.detect { |e| e.payload[:action] == "cluster.info" }
|
24
24
|
exception = event.payload[:exception]
|
25
|
-
assert_equal
|
26
|
-
assert_match
|
25
|
+
assert_equal "Elastomer::Client::TimeoutError", exception[0]
|
26
|
+
assert_match "timeout", exception[1]
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
it
|
31
|
-
$client.ping; assert_action_event(
|
32
|
-
$client.info; assert_action_event(
|
30
|
+
it "instruments cluster actions" do
|
31
|
+
$client.ping; assert_action_event("cluster.ping")
|
32
|
+
$client.info; assert_action_event("cluster.info")
|
33
33
|
end
|
34
34
|
|
35
|
-
it
|
35
|
+
it "instruments node actions" do
|
36
36
|
nodes = $client.nodes
|
37
|
-
nodes.info; assert_action_event(
|
38
|
-
nodes.stats; assert_action_event(
|
39
|
-
nodes.hot_threads; assert_action_event(
|
37
|
+
nodes.info; assert_action_event("nodes.info")
|
38
|
+
nodes.stats; assert_action_event("nodes.stats")
|
39
|
+
nodes.hot_threads; assert_action_event("nodes.hot_threads")
|
40
40
|
end
|
41
41
|
|
42
|
-
it
|
43
|
-
client = stub_client(:post,
|
44
|
-
client.nodes.shutdown; assert_action_event(
|
42
|
+
it "instruments node shutdown" do
|
43
|
+
client = stub_client(:post, "/_cluster/nodes/_shutdown")
|
44
|
+
client.nodes.shutdown; assert_action_event("nodes.shutdown")
|
45
45
|
end
|
46
46
|
|
47
|
-
it
|
48
|
-
@index.exists?; assert_action_event(
|
49
|
-
@index.create(
|
50
|
-
assert_action_event(
|
51
|
-
@index.get_settings; assert_action_event(
|
52
|
-
@index.update_settings(
|
53
|
-
assert_action_event(
|
54
|
-
@index.close; assert_action_event(
|
55
|
-
@index.open; assert_action_event(
|
56
|
-
@index.delete; assert_action_event(
|
47
|
+
it "instruments index actions" do
|
48
|
+
@index.exists?; assert_action_event("index.exists")
|
49
|
+
@index.create("number_of_replicas" => 0)
|
50
|
+
assert_action_event("index.create")
|
51
|
+
@index.get_settings; assert_action_event("index.get_settings")
|
52
|
+
@index.update_settings("number_of_replicas" => 0)
|
53
|
+
assert_action_event("index.get_settings")
|
54
|
+
@index.close; assert_action_event("index.close")
|
55
|
+
@index.open; assert_action_event("index.open")
|
56
|
+
@index.delete; assert_action_event("index.delete")
|
57
57
|
end
|
58
58
|
|
59
|
-
it
|
60
|
-
@index.create(
|
61
|
-
event = @events.detect { |e| e.payload[:action] ==
|
59
|
+
it "includes the response body in the payload" do
|
60
|
+
@index.create("number_of_replicas" => 0)
|
61
|
+
event = @events.detect { |e| e.payload[:action] == "index.create" }
|
62
62
|
assert event.payload[:response_body]
|
63
63
|
end
|
64
64
|
|
65
|
-
it
|
66
|
-
@index.create(
|
67
|
-
event = @events.detect { |e| e.payload[:action] ==
|
65
|
+
it "includes the request body in the payload" do
|
66
|
+
@index.create("number_of_replicas" => 0)
|
67
|
+
event = @events.detect { |e| e.payload[:action] == "index.create" }
|
68
68
|
|
69
69
|
payload = event.payload
|
70
70
|
assert payload[:response_body]
|
data/test/test_helper.rb
CHANGED
@@ -1,31 +1,31 @@
|
|
1
|
-
require
|
1
|
+
require "webmock/minitest"
|
2
2
|
WebMock.allow_net_connect!
|
3
3
|
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
4
|
+
require "securerandom"
|
5
|
+
require "rubygems" unless defined? Gem
|
6
|
+
require "bundler"
|
7
7
|
Bundler.require(:default, :development)
|
8
8
|
|
9
|
-
if ENV[
|
10
|
-
require
|
9
|
+
if ENV["COVERAGE"] == "true"
|
10
|
+
require "simplecov"
|
11
11
|
SimpleCov.start do
|
12
12
|
add_filter "/test/"
|
13
13
|
add_filter "/vendor/"
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
require
|
18
|
-
require
|
17
|
+
require "minitest/spec"
|
18
|
+
require "minitest/autorun"
|
19
19
|
|
20
20
|
# push the lib folder onto the load path
|
21
|
-
$LOAD_PATH.unshift
|
22
|
-
require
|
21
|
+
$LOAD_PATH.unshift "lib"
|
22
|
+
require "elastomer/client"
|
23
23
|
|
24
24
|
# we are going to use the same client instance everywhere!
|
25
25
|
# the client should always be stateless
|
26
26
|
$client_params = {
|
27
|
-
:port => ENV[
|
28
|
-
:read_timeout =>
|
27
|
+
:port => ENV["BOXEN_ELASTICSEARCH_PORT"] || 9200,
|
28
|
+
:read_timeout => 10,
|
29
29
|
:open_timeout => 1,
|
30
30
|
:opaque_id => false
|
31
31
|
}
|
@@ -50,7 +50,7 @@ MiniTest::Unit.after_tests do
|
|
50
50
|
end
|
51
51
|
|
52
52
|
# add custom assertions
|
53
|
-
require File.expand_path(
|
53
|
+
require File.expand_path("../assertions", __FILE__)
|
54
54
|
|
55
55
|
# require 'elastomer/notifications'
|
56
56
|
# require 'pp'
|
@@ -75,11 +75,11 @@ require File.expand_path('../assertions', __FILE__)
|
|
75
75
|
# Returns the cluster health response.
|
76
76
|
# Raises Elastomer::Client::TimeoutError if requested status is not achieved
|
77
77
|
# within 5 seconds.
|
78
|
-
def wait_for_index(name, status=
|
78
|
+
def wait_for_index(name, status="yellow")
|
79
79
|
$client.cluster.health(
|
80
80
|
:index => name,
|
81
81
|
:wait_for_status => status,
|
82
|
-
:timeout =>
|
82
|
+
:timeout => "5s"
|
83
83
|
)
|
84
84
|
end
|
85
85
|
|
@@ -89,7 +89,7 @@ end
|
|
89
89
|
#
|
90
90
|
# Returns true if Elasticsearch version is 1.x.
|
91
91
|
def es_version_1_x?
|
92
|
-
$client.semantic_version >=
|
92
|
+
$client.semantic_version >= "1.0.0"
|
93
93
|
end
|
94
94
|
|
95
95
|
# Elasticsearch 1.4 changed the response body for interacting with index
|
@@ -98,20 +98,20 @@ end
|
|
98
98
|
#
|
99
99
|
# Returns `true` if the response contains an "aliases" key.
|
100
100
|
def es_version_always_returns_aliases?
|
101
|
-
$client.semantic_version <
|
102
|
-
$client.semantic_version >=
|
101
|
+
$client.semantic_version < "1.4.0" ||
|
102
|
+
$client.semantic_version >= "1.4.3"
|
103
103
|
end
|
104
104
|
|
105
105
|
# ElasticSearch 1.3 added the `search_shards` API endpoint.
|
106
106
|
def es_version_supports_search_shards?
|
107
|
-
$client.semantic_version >=
|
107
|
+
$client.semantic_version >= "1.3.0"
|
108
108
|
end
|
109
109
|
|
110
110
|
# Elasticsearch 1.2 removed support for gateway snapshots.
|
111
111
|
#
|
112
112
|
# Returns true if Elasticsearch version supports gateway snapshots.
|
113
113
|
def es_version_supports_gateway_snapshots?
|
114
|
-
$client.semantic_version <=
|
114
|
+
$client.semantic_version <= "1.2.0"
|
115
115
|
end
|
116
116
|
|
117
117
|
# Elasticsearch 1.4.0 had a bug in its handling of the Mapping API where it
|
@@ -120,13 +120,13 @@ end
|
|
120
120
|
#
|
121
121
|
# See: https://github.com/elastic/elasticsearch/pull/8426
|
122
122
|
def es_version_supports_update_mapping_with__all_disabled?
|
123
|
-
$client.semantic_version !=
|
123
|
+
$client.semantic_version != "1.4.0"
|
124
124
|
end
|
125
125
|
|
126
126
|
# Elasticsearch 1.6 requires the repo.path setting when creating
|
127
127
|
# FS repositories.
|
128
128
|
def es_version_requires_repo_path?
|
129
|
-
$client.semantic_version >=
|
129
|
+
$client.semantic_version >= "1.6.0"
|
130
130
|
end
|
131
131
|
|
132
132
|
def run_snapshot_tests?
|
@@ -146,8 +146,8 @@ def run_snapshot_tests?
|
|
146
146
|
end
|
147
147
|
|
148
148
|
def create_repo(name, settings = {})
|
149
|
-
location = File.join(*[ENV[
|
150
|
-
default_settings = {:type =>
|
149
|
+
location = File.join(*[ENV["SNAPSHOT_DIR"], name].compact)
|
150
|
+
default_settings = {:type => "fs", :settings => {:location => location}}
|
151
151
|
$client.repository(name).create(default_settings.merge(settings))
|
152
152
|
end
|
153
153
|
|