elastomer-client 2.1.1 → 2.2.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/.gitignore +1 -0
- data/CHANGELOG.md +6 -1
- data/elastomer-client.gemspec +6 -8
- data/lib/elastomer/client.rb +13 -9
- data/lib/elastomer/client/errors.rb +3 -2
- data/lib/elastomer/client/index.rb +7 -1
- data/lib/elastomer/client/scroller.rb +21 -3
- data/lib/elastomer/client/template.rb +3 -2
- data/lib/elastomer/core_ext/time.rb +1 -1
- data/lib/elastomer/version.rb +1 -1
- data/script/bootstrap +0 -2
- data/test/client/bulk_test.rb +6 -6
- data/test/client/scroller_test.rb +14 -0
- data/test/client_test.rb +14 -0
- data/test/core_ext/time_test.rb +2 -2
- data/test/test_helper.rb +1 -1
- metadata +13 -41
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e0ff6e4010e81c9d42f412ac93cda3448bf3207f
|
4
|
+
data.tar.gz: da3742dd0d0724df7ab5b51b7ab2aa7ce9bca9e6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 251b9765f805d5f01dfd66f49e1899b80301ce2c0dfefce8e026657978335bf95ce2551acca5a3548a9c70098cd4f8da336bb674e671a57080d61b4346933af5
|
7
|
+
data.tar.gz: 2f397fe5deafd4bcdf17a8826715e2ab3f86870008ae0bfe63d1809aa45c49d1da53fb68f276f750327e5653bbf24d1ceeb250ce568392a7e355f8dfb304a0ba
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,9 @@
|
|
1
|
-
## 2.
|
1
|
+
## 2.2.0 (2017-04-29)
|
2
|
+
- Added a `clear_scroll` API
|
3
|
+
- JSON timestamps include millisecodns by default
|
4
|
+
- Removing Fixnum usage
|
5
|
+
|
6
|
+
## 2.1.1 (2016-09-02)
|
2
7
|
- Bulk index only rejects documents larger than the maximum request size
|
3
8
|
|
4
9
|
## 2.1.0 (2016-01-02)
|
data/elastomer-client.gemspec
CHANGED
@@ -19,16 +19,14 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
-
spec.add_dependency "addressable", "~> 2.
|
22
|
+
spec.add_dependency "addressable", "~> 2.5"
|
23
23
|
spec.add_dependency "faraday", "~> 0.8"
|
24
|
-
spec.add_dependency "multi_json", "~> 1.
|
25
|
-
spec.add_dependency "semantic", "~> 1.
|
24
|
+
spec.add_dependency "multi_json", "~> 1.12"
|
25
|
+
spec.add_dependency "semantic", "~> 1.6"
|
26
26
|
|
27
|
-
spec.add_development_dependency "bundler",
|
27
|
+
spec.add_development_dependency "bundler", "~> 1.14"
|
28
28
|
spec.add_development_dependency "activesupport", ">= 3.0"
|
29
|
-
spec.add_development_dependency "minitest","~> 4.7"
|
30
|
-
spec.add_development_dependency "webmock","~>
|
29
|
+
spec.add_development_dependency "minitest", "~> 4.7"
|
30
|
+
spec.add_development_dependency "webmock", "~> 2.3"
|
31
31
|
spec.add_development_dependency "rake"
|
32
|
-
spec.add_development_dependency "overcommit"
|
33
|
-
spec.add_development_dependency "rubocop"
|
34
32
|
end
|
data/lib/elastomer/client.rb
CHANGED
@@ -223,15 +223,19 @@ module Elastomer
|
|
223
223
|
body = params.delete :body
|
224
224
|
return if body.nil?
|
225
225
|
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
226
|
+
body =
|
227
|
+
case body
|
228
|
+
when String
|
229
|
+
body
|
230
|
+
when Array
|
231
|
+
body << nil unless body.last.nil?
|
232
|
+
body.join "\n"
|
233
|
+
else
|
234
|
+
MultiJson.dump body
|
235
|
+
end
|
236
|
+
|
237
|
+
# Prevent excon from changing the encoding (see https://github.com/github/elastomer-client/issues/138)
|
238
|
+
body.freeze
|
235
239
|
end
|
236
240
|
|
237
241
|
# Internal: Apply path expansions to the `path` and append query
|
@@ -85,8 +85,9 @@ module Elastomer
|
|
85
85
|
|
86
86
|
# Provide some nice errors for common Elasticsearch exceptions. These are
|
87
87
|
# all subclasses of the more general RequestError
|
88
|
-
IndexNotFoundError
|
89
|
-
QueryParsingError
|
88
|
+
IndexNotFoundError = Class.new RequestError
|
89
|
+
QueryParsingError = Class.new RequestError
|
90
|
+
SearchContextMissing = Class.new RequestError
|
90
91
|
|
91
92
|
ServerError.fatal = false
|
92
93
|
TimeoutError.fatal = false
|
@@ -340,12 +340,18 @@ module Elastomer
|
|
340
340
|
# can be retrieved with parameters.
|
341
341
|
#
|
342
342
|
# params - Parameters Hash
|
343
|
+
# :stats - a single stats value or an Array of stats values
|
344
|
+
#
|
345
|
+
# Examples
|
346
|
+
#
|
347
|
+
# stats(stats: "docs")
|
348
|
+
# stats(stats: %w[flush merge])
|
343
349
|
#
|
344
350
|
# See https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-stats.html
|
345
351
|
#
|
346
352
|
# Returns the response body as a Hash
|
347
353
|
def stats( params = {} )
|
348
|
-
response = client.get "{/index}/_stats", update_params(params, :action => "index.stats")
|
354
|
+
response = client.get "{/index}/_stats{/stats}", update_params(params, :action => "index.stats")
|
349
355
|
response.body
|
350
356
|
end
|
351
357
|
|
@@ -53,7 +53,7 @@ module Elastomer
|
|
53
53
|
# See https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html
|
54
54
|
#
|
55
55
|
# opts - Options Hash
|
56
|
-
# :
|
56
|
+
# :body - the query to scroll as a Hash or JSON encoded String
|
57
57
|
# :index - the name of the index to search
|
58
58
|
# :type - the document type to search
|
59
59
|
# :scroll - the keep alive time of the scrolling request (5 minutes by default)
|
@@ -62,7 +62,7 @@ module Elastomer
|
|
62
62
|
#
|
63
63
|
# Examples
|
64
64
|
#
|
65
|
-
# h = client.start_scroll('{"query":{"match_all":{}},"sort":{"created":"desc"}}', :index => 'test')
|
65
|
+
# h = client.start_scroll(:body => '{"query":{"match_all":{}},"sort":{"created":"desc"}}', :index => 'test')
|
66
66
|
# scroll_id = h['_scroll_id']
|
67
67
|
# h['hits']['hits'].each { |doc| ... }
|
68
68
|
#
|
@@ -87,7 +87,7 @@ module Elastomer
|
|
87
87
|
#
|
88
88
|
# Examples
|
89
89
|
#
|
90
|
-
# scroll_id = client.start_scroll('{"query":{"match_all":{}}}', :index => 'test')['_scroll_id']
|
90
|
+
# scroll_id = client.start_scroll(:body => '{"query":{"match_all":{}}}', :index => 'test')['_scroll_id']
|
91
91
|
#
|
92
92
|
# h = client.continue_scroll scroll_id # scroll to get the next set of results
|
93
93
|
# scroll_id = h['_scroll_id'] # and store the scroll_id to use later
|
@@ -101,6 +101,24 @@ module Elastomer
|
|
101
101
|
def continue_scroll( scroll_id, scroll = "5m" )
|
102
102
|
response = get "/_search/scroll", :body => scroll_id, :scroll => scroll, :action => "search.scroll"
|
103
103
|
response.body
|
104
|
+
rescue RequestError => err
|
105
|
+
if err.error && err.error["caused_by"]["type"] == "search_context_missing_exception" \
|
106
|
+
|| err.message =~ /SearchContextMissingException/
|
107
|
+
raise SearchContextMissing, "No search context found for scroll ID #{scroll_id.inspect}"
|
108
|
+
else
|
109
|
+
raise err
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# Delete one or more scroll IDs.
|
114
|
+
# see https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html#_clear_scroll_api
|
115
|
+
#
|
116
|
+
# scroll_id - One or more scroll IDs
|
117
|
+
#
|
118
|
+
# Returns the response body as a Hash.
|
119
|
+
def clear_scroll( scroll_ids )
|
120
|
+
response = delete "/_search/scroll", :body => {scroll_id: Array(scroll_ids)}, :action => "search.clear_scroll"
|
121
|
+
response.body
|
104
122
|
end
|
105
123
|
|
106
124
|
DEFAULT_OPTS = {
|
@@ -24,8 +24,9 @@ module Elastomer
|
|
24
24
|
attr_reader :client, :name
|
25
25
|
|
26
26
|
# Returns true if the template already exists on the cluster.
|
27
|
-
def exists?
|
28
|
-
client.
|
27
|
+
def exists?( params = {} )
|
28
|
+
response = client.head "/_template/{template}", update_params(params, action: "template.exists")
|
29
|
+
response.success?
|
29
30
|
end
|
30
31
|
alias_method :exist?, :exists?
|
31
32
|
|
data/lib/elastomer/version.rb
CHANGED
data/script/bootstrap
CHANGED
data/test/client/bulk_test.rb
CHANGED
@@ -85,7 +85,7 @@ describe Elastomer::Client::Bulk do
|
|
85
85
|
end
|
86
86
|
items = h["items"]
|
87
87
|
|
88
|
-
|
88
|
+
assert_kind_of Integer, h["took"]
|
89
89
|
|
90
90
|
assert_bulk_index h["items"].first
|
91
91
|
assert_bulk_create h["items"].last
|
@@ -130,7 +130,7 @@ describe Elastomer::Client::Bulk do
|
|
130
130
|
end
|
131
131
|
items = h["items"]
|
132
132
|
|
133
|
-
|
133
|
+
assert_kind_of Integer, h["took"]
|
134
134
|
|
135
135
|
assert_bulk_index h["items"].first
|
136
136
|
assert_bulk_create h["items"].last
|
@@ -259,7 +259,7 @@ describe Elastomer::Client::Bulk do
|
|
259
259
|
b.index document, params
|
260
260
|
end
|
261
261
|
|
262
|
-
|
262
|
+
assert_kind_of Integer, response["took"]
|
263
263
|
|
264
264
|
items = response["items"]
|
265
265
|
assert_bulk_index(items[0])
|
@@ -276,7 +276,7 @@ describe Elastomer::Client::Bulk do
|
|
276
276
|
b.index doc2, { "id" => "bar", "type" => "tweet" }
|
277
277
|
end
|
278
278
|
|
279
|
-
|
279
|
+
assert_kind_of Integer, response["took"]
|
280
280
|
|
281
281
|
items = response["items"]
|
282
282
|
assert_bulk_index(items[0])
|
@@ -294,7 +294,7 @@ describe Elastomer::Client::Bulk do
|
|
294
294
|
b.index document, params
|
295
295
|
end
|
296
296
|
|
297
|
-
|
297
|
+
assert_kind_of Integer, response["took"]
|
298
298
|
|
299
299
|
items = response["items"]
|
300
300
|
assert_bulk_index(items[0])
|
@@ -311,7 +311,7 @@ describe Elastomer::Client::Bulk do
|
|
311
311
|
b.index document, params
|
312
312
|
end
|
313
313
|
|
314
|
-
|
314
|
+
assert_kind_of Integer, response["took"]
|
315
315
|
|
316
316
|
items = response["items"]
|
317
317
|
assert_bulk_index(items[0])
|
@@ -93,6 +93,20 @@ describe Elastomer::Client::Scroller do
|
|
93
93
|
assert_equal 1, counts["book"]
|
94
94
|
end
|
95
95
|
|
96
|
+
it "clears one or more scroll IDs" do
|
97
|
+
h = $client.start_scroll \
|
98
|
+
body: {query: {match_all: {}}},
|
99
|
+
index: @index.name,
|
100
|
+
type: "tweet",
|
101
|
+
scroll: "1m",
|
102
|
+
size: 10
|
103
|
+
|
104
|
+
refute_nil h["_scroll_id"], "response is missing a scroll ID"
|
105
|
+
|
106
|
+
response = $client.clear_scroll(h["_scroll_id"])
|
107
|
+
assert_empty response
|
108
|
+
end
|
109
|
+
|
96
110
|
def populate!
|
97
111
|
h = @index.bulk do |b|
|
98
112
|
50.times { |num|
|
data/test/client_test.rb
CHANGED
@@ -97,6 +97,20 @@ describe Elastomer::Client do
|
|
97
97
|
body = $client.extract_body :body => {:query => {:match_all => {}}}
|
98
98
|
assert_equal '{"query":{"match_all":{}}}', body
|
99
99
|
end
|
100
|
+
|
101
|
+
it "returns frozen strings" do
|
102
|
+
body = $client.extract_body :body => '{"query":{"match_all":{}}}'
|
103
|
+
assert_equal '{"query":{"match_all":{}}}', body
|
104
|
+
assert body.frozen?, "the body string should be frozen"
|
105
|
+
|
106
|
+
body = $client.extract_body :body => %w[foo bar baz]
|
107
|
+
assert_equal "foo\nbar\nbaz\n", body
|
108
|
+
assert body.frozen?, "Array body strings should be frozen"
|
109
|
+
|
110
|
+
body = $client.extract_body :body => {:query => {:match_all => {}}}
|
111
|
+
assert_equal '{"query":{"match_all":{}}}', body
|
112
|
+
assert body.frozen?, "JSON encoded body strings should be frozen"
|
113
|
+
end
|
100
114
|
end
|
101
115
|
|
102
116
|
describe "when validating parameters" do
|
data/test/core_ext/time_test.rb
CHANGED
@@ -31,7 +31,7 @@ describe "JSON conversions for Time" do
|
|
31
31
|
|
32
32
|
it "generates ISO8601 formatted time strings" do
|
33
33
|
time = Time.utc(2013, 5, 3, 10, 1, 31)
|
34
|
-
assert_equal '"2013-05-03T10:01:
|
34
|
+
assert_equal '"2013-05-03T10:01:31.000Z"', MultiJson.encode(time)
|
35
35
|
end
|
36
36
|
|
37
37
|
it "indexes time fields" do
|
@@ -41,6 +41,6 @@ describe "JSON conversions for Time" do
|
|
41
41
|
assert_created(h)
|
42
42
|
|
43
43
|
doc = @docs.get(:type => "doc1", :id => h["_id"])
|
44
|
-
assert_equal "2013-05-03T10:01:
|
44
|
+
assert_equal "2013-05-03T10:01:31.000Z", doc["_source"]["created_at"]
|
45
45
|
end
|
46
46
|
end
|
data/test/test_helper.rb
CHANGED
@@ -25,7 +25,7 @@ require "elastomer/client"
|
|
25
25
|
# we are going to use the same client instance everywhere!
|
26
26
|
# the client should always be stateless
|
27
27
|
$client_params = {
|
28
|
-
:port =>
|
28
|
+
:port => 9200,
|
29
29
|
:read_timeout => 10,
|
30
30
|
:open_timeout => 1,
|
31
31
|
:opaque_id => false
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elastomer-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tim Pease
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2017-04-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: addressable
|
@@ -17,14 +17,14 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '2.
|
20
|
+
version: '2.5'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - "~>"
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '2.
|
27
|
+
version: '2.5'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: faraday
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -45,42 +45,42 @@ dependencies:
|
|
45
45
|
requirements:
|
46
46
|
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version: '1.
|
48
|
+
version: '1.12'
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version: '1.
|
55
|
+
version: '1.12'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: semantic
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - "~>"
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: '1.
|
62
|
+
version: '1.6'
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: '1.
|
69
|
+
version: '1.6'
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: bundler
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
74
|
- - "~>"
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version: '1.
|
76
|
+
version: '1.14'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
81
|
- - "~>"
|
82
82
|
- !ruby/object:Gem::Version
|
83
|
-
version: '1.
|
83
|
+
version: '1.14'
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: activesupport
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
@@ -115,14 +115,14 @@ dependencies:
|
|
115
115
|
requirements:
|
116
116
|
- - "~>"
|
117
117
|
- !ruby/object:Gem::Version
|
118
|
-
version: '
|
118
|
+
version: '2.3'
|
119
119
|
type: :development
|
120
120
|
prerelease: false
|
121
121
|
version_requirements: !ruby/object:Gem::Requirement
|
122
122
|
requirements:
|
123
123
|
- - "~>"
|
124
124
|
- !ruby/object:Gem::Version
|
125
|
-
version: '
|
125
|
+
version: '2.3'
|
126
126
|
- !ruby/object:Gem::Dependency
|
127
127
|
name: rake
|
128
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -137,34 +137,6 @@ dependencies:
|
|
137
137
|
- - ">="
|
138
138
|
- !ruby/object:Gem::Version
|
139
139
|
version: '0'
|
140
|
-
- !ruby/object:Gem::Dependency
|
141
|
-
name: overcommit
|
142
|
-
requirement: !ruby/object:Gem::Requirement
|
143
|
-
requirements:
|
144
|
-
- - ">="
|
145
|
-
- !ruby/object:Gem::Version
|
146
|
-
version: '0'
|
147
|
-
type: :development
|
148
|
-
prerelease: false
|
149
|
-
version_requirements: !ruby/object:Gem::Requirement
|
150
|
-
requirements:
|
151
|
-
- - ">="
|
152
|
-
- !ruby/object:Gem::Version
|
153
|
-
version: '0'
|
154
|
-
- !ruby/object:Gem::Dependency
|
155
|
-
name: rubocop
|
156
|
-
requirement: !ruby/object:Gem::Requirement
|
157
|
-
requirements:
|
158
|
-
- - ">="
|
159
|
-
- !ruby/object:Gem::Version
|
160
|
-
version: '0'
|
161
|
-
type: :development
|
162
|
-
prerelease: false
|
163
|
-
version_requirements: !ruby/object:Gem::Requirement
|
164
|
-
requirements:
|
165
|
-
- - ">="
|
166
|
-
- !ruby/object:Gem::Version
|
167
|
-
version: '0'
|
168
140
|
description: |-
|
169
141
|
Elastomer is a low level API client for the
|
170
142
|
Elasticsearch HTTP interface.
|
@@ -268,7 +240,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
268
240
|
version: '0'
|
269
241
|
requirements: []
|
270
242
|
rubyforge_project:
|
271
|
-
rubygems_version: 2.
|
243
|
+
rubygems_version: 2.6.11
|
272
244
|
signing_key:
|
273
245
|
specification_version: 4
|
274
246
|
summary: A library for interacting with Elasticsearch
|