elastomer-client 3.2.3 → 6.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. checksums.yaml +4 -4
  2. data/.devcontainer/devcontainer.json +46 -0
  3. data/.devcontainer/postCreateCommand.sh +4 -0
  4. data/.github/dependabot.yaml +11 -0
  5. data/.github/workflows/main.yml +45 -0
  6. data/.github/workflows/rubocop.yml +15 -0
  7. data/.gitignore +1 -1
  8. data/.rubocop.yml +13 -65
  9. data/.ruby-version +1 -0
  10. data/CHANGELOG.md +73 -0
  11. data/Gemfile +18 -1
  12. data/README.md +110 -51
  13. data/Rakefile +3 -1
  14. data/docker/compose.yaml +71 -0
  15. data/docker/elasticsearch8plus.yml +13 -0
  16. data/docs/README.md +4 -5
  17. data/docs/bulk_indexing.md +1 -1
  18. data/docs/client.md +20 -33
  19. data/docs/cluster.md +8 -8
  20. data/docs/docs.md +5 -5
  21. data/docs/index.md +4 -4
  22. data/docs/multi_search.md +1 -1
  23. data/docs/notifications.md +3 -3
  24. data/docs/scan_scroll.md +1 -1
  25. data/docs/snapshots.md +1 -1
  26. data/docs/templates.md +1 -1
  27. data/elastomer-client.gemspec +7 -16
  28. data/lib/{elastomer → elastomer_client}/client/bulk.rb +70 -47
  29. data/lib/{elastomer → elastomer_client}/client/cluster.rb +18 -16
  30. data/lib/{elastomer → elastomer_client}/client/delete_by_query.rb +6 -4
  31. data/lib/{elastomer → elastomer_client}/client/docs.rb +82 -72
  32. data/lib/{elastomer → elastomer_client}/client/errors.rb +7 -17
  33. data/lib/{elastomer → elastomer_client}/client/index.rb +55 -79
  34. data/lib/{elastomer → elastomer_client}/client/multi_percolate.rb +7 -5
  35. data/lib/{elastomer → elastomer_client}/client/multi_search.rb +5 -3
  36. data/lib/{elastomer → elastomer_client}/client/native_delete_by_query.rb +6 -6
  37. data/lib/{elastomer → elastomer_client}/client/nodes.rb +11 -10
  38. data/lib/{elastomer → elastomer_client}/client/percolator.rb +9 -10
  39. data/lib/elastomer_client/client/reindex.rb +29 -0
  40. data/lib/{elastomer → elastomer_client}/client/repository.rb +7 -5
  41. data/lib/{elastomer → elastomer_client}/client/rest_api_spec/api_spec.rb +7 -6
  42. data/lib/{elastomer → elastomer_client}/client/rest_api_spec/api_spec_v5_6.rb +1 -1
  43. data/lib/elastomer_client/client/rest_api_spec/api_spec_v8_13.rb +7567 -0
  44. data/lib/elastomer_client/client/rest_api_spec/api_spec_v8_7.rb +6553 -0
  45. data/lib/{elastomer → elastomer_client}/client/rest_api_spec/rest_api.rb +5 -3
  46. data/lib/{elastomer → elastomer_client}/client/rest_api_spec.rb +3 -2
  47. data/lib/{elastomer → elastomer_client}/client/scroller.rb +17 -16
  48. data/lib/{elastomer → elastomer_client}/client/snapshot.rb +10 -8
  49. data/lib/{elastomer → elastomer_client}/client/tasks.rb +9 -13
  50. data/lib/{elastomer → elastomer_client}/client/template.rb +10 -9
  51. data/lib/elastomer_client/client/update_by_query.rb +50 -0
  52. data/lib/{elastomer → elastomer_client}/client.rb +51 -62
  53. data/lib/{elastomer → elastomer_client}/core_ext/time.rb +2 -0
  54. data/lib/{elastomer → elastomer_client}/middleware/compress.rb +2 -2
  55. data/lib/{elastomer → elastomer_client}/middleware/encode_json.rb +4 -2
  56. data/lib/{elastomer → elastomer_client}/middleware/limit_size.rb +5 -3
  57. data/lib/{elastomer → elastomer_client}/middleware/opaque_id.rb +10 -7
  58. data/lib/{elastomer → elastomer_client}/middleware/parse_json.rb +5 -3
  59. data/lib/{elastomer → elastomer_client}/notifications.rb +17 -15
  60. data/lib/elastomer_client/version.rb +9 -0
  61. data/lib/elastomer_client/version_support.rb +24 -0
  62. data/script/bootstrap +4 -2
  63. data/script/console +3 -1
  64. data/script/generate-rest-api-spec +77 -22
  65. data/test/assertions.rb +32 -39
  66. data/test/client/bulk_test.rb +166 -141
  67. data/test/client/cluster_test.rb +35 -13
  68. data/test/client/docs_test.rb +387 -274
  69. data/test/client/errors_test.rb +38 -40
  70. data/test/client/index_test.rb +243 -202
  71. data/test/client/multi_percolate_test.rb +46 -41
  72. data/test/client/multi_search_test.rb +122 -67
  73. data/test/client/native_delete_by_query_test.rb +96 -88
  74. data/test/client/nodes_test.rb +21 -10
  75. data/test/client/percolator_test.rb +19 -14
  76. data/test/client/reindex_test.rb +76 -0
  77. data/test/client/repository_test.rb +31 -19
  78. data/test/client/rest_api_spec/api_spec_test.rb +13 -11
  79. data/test/client/rest_api_spec/rest_api_test.rb +9 -7
  80. data/test/client/scroller_test.rb +44 -70
  81. data/test/client/snapshot_test.rb +38 -21
  82. data/test/client/stubbed_client_test.rb +7 -4
  83. data/test/client/tasks_test.rb +12 -17
  84. data/test/client/template_test.rb +34 -13
  85. data/test/client/update_by_query_test.rb +137 -0
  86. data/test/client_test.rb +158 -92
  87. data/test/core_ext/time_test.rb +14 -12
  88. data/test/middleware/encode_json_test.rb +18 -7
  89. data/test/middleware/opaque_id_test.rb +18 -14
  90. data/test/middleware/parse_json_test.rb +17 -9
  91. data/test/mock_response.rb +30 -0
  92. data/test/notifications_test.rb +15 -8
  93. data/test/test_helper.rb +40 -97
  94. data/test/version_support_test.rb +13 -78
  95. metadata +60 -208
  96. data/.overcommit.yml +0 -5
  97. data/.travis.yml +0 -34
  98. data/docker/docker-compose.cibuild.yml +0 -8
  99. data/docker/docker-compose.es24.yml +0 -34
  100. data/docker/docker-compose.es56.yml +0 -37
  101. data/docs/warmers.md +0 -3
  102. data/lib/elastomer/client/app_delete_by_query.rb +0 -144
  103. data/lib/elastomer/client/rest_api_spec/api_spec_v2_3.rb +0 -2232
  104. data/lib/elastomer/client/rest_api_spec/api_spec_v2_4.rb +0 -2250
  105. data/lib/elastomer/client/warmer.rb +0 -98
  106. data/lib/elastomer/version.rb +0 -7
  107. data/lib/elastomer/version_support.rb +0 -182
  108. data/script/cibuild +0 -103
  109. data/script/cibuild-elastomer-client +0 -1
  110. data/script/cibuild-elastomer-client-es24 +0 -8
  111. data/script/cibuild-elastomer-client-es56 +0 -8
  112. data/test/client/app_delete_by_query_test.rb +0 -192
  113. data/test/client/es_5_x_warmer_test.rb +0 -13
  114. data/test/client/warmer_test.rb +0 -60
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "addressable/template"
2
4
  require "faraday"
3
5
  require "faraday_middleware"
@@ -5,25 +7,21 @@ require "multi_json"
5
7
  require "semantic"
6
8
  require "zlib"
7
9
 
8
- require "elastomer/version"
9
- require "elastomer/version_support"
10
+ require "elastomer_client/version"
11
+ require "elastomer_client/version_support"
10
12
 
11
- module Elastomer
13
+ module ElastomerClient
12
14
 
13
15
  class Client
14
16
  IVAR_BLACK_LIST = [:@basic_auth, :@token_auth]
15
- IVAR_NOISY_LIST = [:@api_spec, :@cluster]
16
-
17
- MAX_REQUEST_SIZE = 250 * 2**20 # 250 MB
17
+ IVAR_NOISY_LIST = [:@api_spec, :@cluster, :@connection]
18
18
 
19
- RETRYABLE_METHODS = %i[get head].freeze
19
+ MAX_REQUEST_SIZE = 2**20 * 250 # 250 MB
20
20
 
21
21
  # Create a new client that can be used to make HTTP requests to the
22
- # Elasticsearch server. If you use `:max_retries`, then any GET or HEAD
23
- # request will be retried up to this many times with a 75ms delay between
24
- # the retry attempts. Only non-fatal exceptions will retried automatically.
22
+ # Elasticsearch server.
25
23
  #
26
- # see lib/elastomer/client/errors.rb#L92-L94
24
+ # see lib/elastomer_client/client/errors.rb#L92-L94
27
25
  #
28
26
  # Method params:
29
27
  # :host - the host as a String
@@ -34,8 +32,6 @@ module Elastomer
34
32
  # :adapter - the Faraday adapter to use (defaults to :excon)
35
33
  # :opaque_id - set to `true` to use the 'X-Opaque-Id' request header
36
34
  # :max_request_size - the maximum allowed request size in bytes (defaults to 250 MB)
37
- # :max_retries - the maximum number of request retires (defaults to 0)
38
- # :retry_delay - delay in seconds between retries (defaults to 0.075)
39
35
  # :strict_params - set to `true` to raise exceptions when invalid request params are used
40
36
  # :es_version - set to the Elasticsearch version (example: "5.6.6") to avoid an HTTP request to get the version.
41
37
  # :compress_body - set to true to enable request body compression (default: false)
@@ -44,10 +40,9 @@ module Elastomer
44
40
  # :token_auth - an authentication token as a String to use on connections (overrides :basic_auth)
45
41
  #
46
42
  def initialize(host: "localhost", port: 9200, url: nil,
47
- read_timeout: 5, open_timeout: 2, max_retries: 0, retry_delay: 0.075,
48
- opaque_id: false, adapter: Faraday.default_adapter, max_request_size: MAX_REQUEST_SIZE,
43
+ read_timeout: 5, open_timeout: 2, opaque_id: false, adapter: Faraday.default_adapter, max_request_size: MAX_REQUEST_SIZE,
49
44
  strict_params: false, es_version: nil, compress_body: false, compression: Zlib::DEFAULT_COMPRESSION,
50
- basic_auth: nil, token_auth: nil)
45
+ basic_auth: nil, token_auth: nil, &block)
51
46
 
52
47
  @url = url || "http://#{host}:#{port}"
53
48
 
@@ -57,8 +52,6 @@ module Elastomer
57
52
 
58
53
  @read_timeout = read_timeout
59
54
  @open_timeout = open_timeout
60
- @max_retries = max_retries
61
- @retry_delay = retry_delay
62
55
  @adapter = adapter
63
56
  @opaque_id = opaque_id
64
57
  @max_request_size = max_request_size
@@ -68,11 +61,12 @@ module Elastomer
68
61
  @compression = compression
69
62
  @basic_auth = basic_auth
70
63
  @token_auth = token_auth
64
+ @connection_block = block
71
65
  end
72
66
 
73
67
  attr_reader :host, :port, :url
74
68
  attr_reader :read_timeout, :open_timeout
75
- attr_reader :max_retries, :retry_delay, :max_request_size
69
+ attr_reader :max_request_size
76
70
  attr_reader :strict_params
77
71
  attr_reader :es_version
78
72
  attr_reader :compress_body
@@ -83,12 +77,12 @@ module Elastomer
83
77
  # fashion.
84
78
  def dup
85
79
  self.class.new \
86
- url: url,
87
- read_timeout: read_timeout,
88
- open_timeout: open_timeout,
80
+ url:,
81
+ read_timeout:,
82
+ open_timeout:,
89
83
  adapter: @adapter,
90
84
  opaque_id: @opaque_id,
91
- max_request_size: max_request_size,
85
+ max_request_size:,
92
86
  basic_auth: @basic_auth,
93
87
  token_auth: @token_auth
94
88
  end
@@ -140,9 +134,8 @@ module Elastomer
140
134
  # Request compressed responses from ES and decompress them
141
135
  conn.use(:gzip)
142
136
  conn.request(:encode_json)
143
- conn.request(:opaque_id) if @opaque_id
144
- conn.request(:limit_size, max_request_size: max_request_size) if max_request_size
145
- conn.request(:elastomer_compress, compression: compression) if compress_body
137
+ conn.request(:limit_size, max_request_size:) if max_request_size
138
+ conn.request(:elastomer_compress, compression:) if compress_body
146
139
 
147
140
  conn.options[:timeout] = read_timeout
148
141
  conn.options[:open_timeout] = open_timeout
@@ -153,6 +146,10 @@ module Elastomer
153
146
  conn.basic_auth(@basic_auth[:username], @basic_auth[:password])
154
147
  end
155
148
 
149
+ @connection_block&.call(conn)
150
+
151
+ conn.request(:opaque_id) if @opaque_id
152
+
156
153
  if @adapter.is_a?(Array)
157
154
  conn.adapter(*@adapter)
158
155
  else
@@ -176,7 +173,7 @@ module Elastomer
176
173
  # params - Parameters Hash
177
174
  #
178
175
  # Returns a Faraday::Response
179
- def head( path, params = {} )
176
+ def head(path, params = {})
180
177
  request :head, path, params
181
178
  end
182
179
 
@@ -186,8 +183,8 @@ module Elastomer
186
183
  # params - Parameters Hash
187
184
  #
188
185
  # Returns a Faraday::Response
189
- # Raises an Elastomer::Client::Error on 4XX and 5XX responses
190
- def get( path, params = {} )
186
+ # Raises an ElastomerClient::Client::Error on 4XX and 5XX responses
187
+ def get(path, params = {})
191
188
  request :get, path, params
192
189
  end
193
190
 
@@ -197,8 +194,8 @@ module Elastomer
197
194
  # params - Parameters Hash
198
195
  #
199
196
  # Returns a Faraday::Response
200
- # Raises an Elastomer::Client::Error on 4XX and 5XX responses
201
- def put( path, params = {} )
197
+ # Raises an ElastomerClient::Client::Error on 4XX and 5XX responses
198
+ def put(path, params = {})
202
199
  request :put, path, params
203
200
  end
204
201
 
@@ -208,8 +205,8 @@ module Elastomer
208
205
  # params - Parameters Hash
209
206
  #
210
207
  # Returns a Faraday::Response
211
- # Raises an Elastomer::Client::Error on 4XX and 5XX responses
212
- def post( path, params = {} )
208
+ # Raises an ElastomerClient::Client::Error on 4XX and 5XX responses
209
+ def post(path, params = {})
213
210
  request :post, path, params
214
211
  end
215
212
 
@@ -219,8 +216,8 @@ module Elastomer
219
216
  # params - Parameters Hash
220
217
  #
221
218
  # Returns a Faraday::Response
222
- # Raises an Elastomer::Client::Error on 4XX and 5XX responses
223
- def delete( path, params = {} )
219
+ # Raises an ElastomerClient::Client::Error on 4XX and 5XX responses
220
+ def delete(path, params = {})
224
221
  request :delete, path, params
225
222
  end
226
223
 
@@ -233,18 +230,14 @@ module Elastomer
233
230
  # params - Parameters Hash
234
231
  # :body - Will be used as the request body
235
232
  # :read_timeout - Optional read timeout (in seconds) for the request
236
- # :max_retires - Optional retry number for the request
237
233
  #
238
234
  # Returns a Faraday::Response
239
- # Raises an Elastomer::Client::Error on 4XX and 5XX responses
240
- # rubocop:disable Metrics/MethodLength
241
- def request( method, path, params )
235
+ # Raises an ElastomerClient::Client::Error on 4XX and 5XX responses
236
+ def request(method, path, params)
242
237
  read_timeout = params.delete(:read_timeout)
243
- request_max_retries = params.delete(:max_retries) || max_retries
244
238
  body = extract_body(params)
245
239
  path = expand_path(path, params)
246
240
 
247
- params[:retries] = retries = 0
248
241
  instrument(path, body, params) do
249
242
  begin
250
243
  response =
@@ -276,14 +269,9 @@ module Elastomer
276
269
 
277
270
  handle_errors response
278
271
 
279
- # wrap Faraday errors with appropriate Elastomer::Client error classes
280
- rescue Faraday::Error::ClientError => boom
272
+ # wrap Faraday errors with appropriate ElastomerClient::Client error classes
273
+ rescue Faraday::Error => boom
281
274
  error = wrap_faraday_error(boom, method, path)
282
- if error.retry? && RETRYABLE_METHODS.include?(method) && (retries += 1) <= request_max_retries
283
- params[:retries] = retries
284
- sleep retry_delay
285
- retry
286
- end
287
275
  raise error
288
276
  rescue OpaqueIdError => boom
289
277
  reset!
@@ -293,7 +281,7 @@ module Elastomer
293
281
  end
294
282
  # rubocop:enable Metrics/MethodLength
295
283
 
296
- # Internal: Returns a new Elastomer::Client error that wraps the given
284
+ # Internal: Returns a new ElastomerClient::Client error that wraps the given
297
285
  # Faraday error. A generic Error is returned if we cannot wrap the given
298
286
  # Faraday error.
299
287
  #
@@ -303,7 +291,7 @@ module Elastomer
303
291
  #
304
292
  def wrap_faraday_error(error, method, path)
305
293
  error_name = error.class.name.split("::").last
306
- error_class = Elastomer::Client.const_get(error_name) rescue Elastomer::Client::Error
294
+ error_class = ElastomerClient::Client.const_get(error_name) rescue ElastomerClient::Client::Error
307
295
  error_class.new(error, method.upcase, path)
308
296
  end
309
297
 
@@ -323,7 +311,7 @@ module Elastomer
323
311
  # params - Parameters Hash
324
312
  #
325
313
  # Returns the request body as a String or `nil` if no :body is present
326
- def extract_body( params )
314
+ def extract_body(params)
327
315
  body = params.delete :body
328
316
  return if body.nil?
329
317
 
@@ -360,14 +348,13 @@ module Elastomer
360
348
  # #=> '/foo/no%20bar'
361
349
  #
362
350
  # Returns an Addressable::Uri
363
- def expand_path( path, params )
351
+ def expand_path(path, params)
364
352
  template = Addressable::Template.new path
365
353
 
366
354
  expansions = {}
367
355
  query_values = params.dup
368
356
  query_values.delete :action
369
357
  query_values.delete :context
370
- query_values.delete :retries
371
358
 
372
359
  rest_api = query_values.delete :rest_api
373
360
 
@@ -379,19 +366,21 @@ module Elastomer
379
366
 
380
367
  if rest_api
381
368
  query_values = if strict_params?
382
- api_spec.validate_params!(api: rest_api, params: query_values)
369
+ api_spec.validate_params!(api: rest_api, params: query_values)
383
370
  else
384
371
  api_spec.select_params(api: rest_api, from: query_values)
385
372
  end
386
373
  end
387
374
 
388
375
  uri = template.expand(expansions)
389
- uri.query_values = query_values unless query_values.empty?
376
+ query_values.transform_keys!(&:to_s)
377
+ uri.query_values = (uri.query_values || {}).merge(query_values) unless query_values.empty?
378
+
390
379
  uri.to_s
391
380
  end
392
381
 
393
382
  # Internal: A noop method that simply yields to the block. This method
394
- # will be replaced when the 'elastomer/notifications' module is included.
383
+ # will be replaced when the 'elastomer_client/notifications' module is included.
395
384
  #
396
385
  # path - The full request path as a String
397
386
  # body - The request body as a String or `nil`
@@ -399,7 +388,7 @@ module Elastomer
399
388
  # block - The block that will be instrumented
400
389
  #
401
390
  # Returns the response from the block
402
- def instrument( path, body, params )
391
+ def instrument(path, body, params)
403
392
  yield
404
393
  end
405
394
 
@@ -414,9 +403,9 @@ module Elastomer
414
403
  # response - The Faraday::Response object.
415
404
  #
416
405
  # Returns the response.
417
- # Raises an Elastomer::Client::Error on 500 responses or responses
406
+ # Raises an ElastomerClient::Client::Error on 500 responses or responses
418
407
  # containing and 'error' field.
419
- def handle_errors( response )
408
+ def handle_errors(response)
420
409
  raise ServerError, response if response.status >= 500
421
410
 
422
411
  if response.body.is_a?(Hash) && (error = response.body["error"])
@@ -429,7 +418,7 @@ module Elastomer
429
418
  when "document_already_exists_exception"; raise DocumentAlreadyExistsError, response
430
419
  # Elasticsearch 5.x.x root_cause type for document already existing
431
420
  when "version_conflict_engine_exception"; raise DocumentAlreadyExistsError, response
432
- when *version_support.query_parse_exception; raise QueryParsingError, response
421
+ when "query_shard_exception", "parsing_exception"; raise QueryParsingError, response
433
422
  end
434
423
 
435
424
  raise RequestError, response
@@ -453,7 +442,7 @@ module Elastomer
453
442
  #
454
443
  # Returns the validated param as a String.
455
444
  # Raises an ArgumentError if the param is not valid.
456
- def assert_param_presence( param, name = "input value" )
445
+ def assert_param_presence(param, name = "input value")
457
446
  case param
458
447
  when String, Symbol, Numeric
459
448
  param = param.to_s.strip
@@ -501,7 +490,7 @@ module Elastomer
501
490
  object.respond_to?(:empty?) ? !object.empty? : !!object
502
491
  end
503
492
  end # Client
504
- end # Elastomer
493
+ end # ElastomerClient
505
494
 
506
495
  # require all files in the `client` sub-directory
507
496
  Dir.glob(File.expand_path("../client/*.rb", __FILE__)).each { |fn| require fn }
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "time"
2
4
 
3
5
  class Time
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  require "stringio"
3
3
 
4
- module Elastomer
4
+ module ElastomerClient
5
5
  module Middleware
6
6
  # Request middleware that compresses request bodies with GZip for supported
7
7
  # versions of Elasticsearch.
@@ -42,4 +42,4 @@ module Elastomer
42
42
  end
43
43
  end
44
44
 
45
- Faraday::Request.register_middleware(elastomer_compress: ::Elastomer::Middleware::Compress)
45
+ Faraday::Request.register_middleware(elastomer_compress: ElastomerClient::Middleware::Compress)
@@ -1,4 +1,6 @@
1
- module Elastomer
1
+ # frozen_string_literal: true
2
+
3
+ module ElastomerClient
2
4
  module Middleware
3
5
  # Request middleware that encodes the body as JSON.
4
6
  #
@@ -55,4 +57,4 @@ module Elastomer
55
57
  end
56
58
 
57
59
  Faraday::Request.register_middleware \
58
- :encode_json => ::Elastomer::Middleware::EncodeJson
60
+ encode_json: ElastomerClient::Middleware::EncodeJson
@@ -1,4 +1,6 @@
1
- module Elastomer
1
+ # frozen_string_literal: true
2
+
3
+ module ElastomerClient
2
4
  module Middleware
3
5
 
4
6
  # Request middleware that raises an exception if the request body exceeds a
@@ -15,7 +17,7 @@ module Elastomer
15
17
  def call(env)
16
18
  if body = env[:body]
17
19
  if body.is_a?(String) && body.bytesize > max_request_size
18
- raise ::Elastomer::Client::RequestSizeError,
20
+ raise ::ElastomerClient::Client::RequestSizeError,
19
21
  "Request of size `#{body.bytesize}` exceeds the maximum requst size: #{max_request_size}"
20
22
  end
21
23
  end
@@ -27,4 +29,4 @@ module Elastomer
27
29
  end
28
30
 
29
31
  Faraday::Request.register_middleware \
30
- :limit_size => ::Elastomer::Middleware::LimitSize
32
+ limit_size: ElastomerClient::Middleware::LimitSize
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "securerandom"
2
4
 
3
- module Elastomer
5
+ module ElastomerClient
4
6
  module Middleware
5
7
 
6
8
  # This Faraday middleware implements the "X-Opaque-Id" request / response
@@ -12,7 +14,7 @@ module Elastomer
12
14
  # The SecureRandom lib is used to generate a UUID string for each request.
13
15
  # This value is used as the content for the "X-Opaque-Id" header. If the
14
16
  # value is different between the request and the response, then an
15
- # `Elastomer::Client::OpaqueIdError` is raised. In this case no response
17
+ # `ElastomerClient::Client::OpaqueIdError` is raised. In this case no response
16
18
  # will be returned.
17
19
  #
18
20
  # See [Elasticsearch "X-Opaque-Id"
@@ -27,14 +29,15 @@ module Elastomer
27
29
  # env - Faraday environment Hash
28
30
  #
29
31
  # Returns the environment Hash
30
- def call( env )
32
+ def call(env)
31
33
  uuid = generate_uuid.freeze
32
34
  env[:request_headers][X_OPAQUE_ID] = uuid
33
35
 
34
36
  @app.call(env).on_complete do |renv|
35
37
  response_uuid = renv[:response_headers][X_OPAQUE_ID]
36
- if uuid != response_uuid
37
- raise ::Elastomer::Client::OpaqueIdError,
38
+ # Don't raise OpaqueIdError if the response is a 5xx
39
+ if !response_uuid.nil? && uuid != response_uuid && renv.status < 500
40
+ raise ::ElastomerClient::Client::OpaqueIdError,
38
41
  "Conflicting 'X-Opaque-Id' headers: request #{uuid.inspect}, response #{response_uuid.inspect}"
39
42
  end
40
43
  end
@@ -65,7 +68,7 @@ module Elastomer
65
68
  # 'X-Opaque-Id' request header and the one received in the response header.
66
69
  Client::OpaqueIdError = Class.new Client::Error
67
70
 
68
- end # Elastomer
71
+ end # ElastomerClient
69
72
 
70
73
  Faraday::Request.register_middleware \
71
- :opaque_id => ::Elastomer::Middleware::OpaqueId
74
+ opaque_id: ElastomerClient::Middleware::OpaqueId
@@ -1,4 +1,6 @@
1
- module Elastomer
1
+ # frozen_string_literal: true
2
+
3
+ module ElastomerClient
2
4
  module Middleware
3
5
 
4
6
  # Parse response bodies as JSON.
@@ -18,7 +20,7 @@ module Elastomer
18
20
  def parse(body)
19
21
  MultiJson.load(body) if body.respond_to?(:to_str) && !body.strip.empty?
20
22
  rescue StandardError, SyntaxError => e
21
- raise Faraday::Error::ParsingError, e
23
+ raise Faraday::ParsingError, e
22
24
  end
23
25
 
24
26
  def process_response?(env)
@@ -36,4 +38,4 @@ module Elastomer
36
38
  end
37
39
 
38
40
  Faraday::Response.register_middleware \
39
- :parse_json => ::Elastomer::Middleware::ParseJson
41
+ parse_json: ElastomerClient::Middleware::ParseJson
@@ -1,13 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support"
1
4
  require "active_support/notifications"
2
5
  require "securerandom"
3
- require "elastomer/client"
6
+ require "elastomer_client/client"
4
7
 
5
- module Elastomer
8
+ module ElastomerClient
6
9
 
7
10
  # So you want to get notifications from your Elasticsearch client? Well,
8
11
  # you've come to the right place!
9
12
  #
10
- # require 'elastomer/notifications'
13
+ # require 'elastomer_client/notifications'
11
14
  #
12
15
  # Requiring this module will add ActiveSupport notifications to all
13
16
  # Elasticsearch requests. To subscribe to those requests ...
@@ -27,11 +30,11 @@ module Elastomer
27
30
  # * :status - response status code
28
31
  #
29
32
  # If you want to use your own notifications service then you will need to
30
- # let Elastomer know by setting the `service` here in the Notifications
33
+ # let ElastomerClient know by setting the `service` here in the Notifications
31
34
  # module. The service should adhere to the ActiveSupport::Notifications
32
35
  # specification.
33
36
  #
34
- # Elastomer::Notifications.service = your_own_service
37
+ # ElastomerClient::Notifications.service = your_own_service
35
38
  #
36
39
  module Notifications
37
40
 
@@ -53,23 +56,22 @@ module Elastomer
53
56
  # block - The block that will be instrumented
54
57
  #
55
58
  # Returns the response from the block
56
- def instrument( path, body, params )
59
+ def instrument(path, body, params)
57
60
  payload = {
58
- :index => params[:index],
59
- :type => params[:type],
60
- :action => params[:action],
61
- :context => params[:context],
62
- :request_body => body,
63
- :body => body # for backwards compatibility
61
+ index: params[:index],
62
+ type: params[:type],
63
+ action: params[:action],
64
+ context: params[:context],
65
+ request_body: body,
66
+ body: # for backwards compatibility
64
67
  }
65
68
 
66
- ::Elastomer::Notifications.service.instrument(NAME, payload) do
69
+ ::ElastomerClient::Notifications.service.instrument(NAME, payload) do
67
70
  response = yield
68
71
  payload[:url] = response.env[:url]
69
72
  payload[:method] = response.env[:method]
70
73
  payload[:status] = response.status
71
74
  payload[:response_body] = response.body
72
- payload[:retries] = params[:retries]
73
75
  response
74
76
  end
75
77
  end
@@ -81,6 +83,6 @@ module Elastomer
81
83
  # inject our instrument method into the Client class
82
84
  class Client
83
85
  remove_method :instrument
84
- include ::Elastomer::Notifications
86
+ include ::ElastomerClient::Notifications
85
87
  end
86
88
  end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElastomerClient
4
+ VERSION = "6.2.0"
5
+
6
+ def self.version
7
+ VERSION
8
+ end
9
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ElastomerClient
4
+ class VersionSupport
5
+
6
+ attr_reader :version
7
+
8
+ # version - an Elasticsearch version string e.g., 5.6.6 or 8.7.0
9
+ #
10
+ # Raises ArgumentError if version is unsupported.
11
+ def initialize(version)
12
+ if version < "5.0" || version >= "9.0"
13
+ raise ArgumentError, "Elasticsearch version #{version} is not supported by elastomer-client"
14
+ end
15
+
16
+ @version = version
17
+ end
18
+
19
+ # Returns true if Elasticsearch version is 8.x or higher.
20
+ def es_version_8_plus?
21
+ version >= "8.0.0"
22
+ end
23
+ end
24
+ end
data/script/bootstrap CHANGED
@@ -1,9 +1,11 @@
1
1
  #!/bin/sh
2
- set -e
2
+ set -ex
3
3
 
4
4
  cd "$(dirname "$0:a")/.."
5
5
  if bundle check 1>/dev/null 2>&1; then
6
6
  echo "Gem environment up-to-date"
7
7
  else
8
- exec bundle install --binstubs --path vendor/gems "$@"
8
+ echo "Installing gem dependencies"
9
+ exec bundle install "$@"
10
+ exec bundle binstubs --all
9
11
  fi
data/script/console CHANGED
@@ -1,9 +1,11 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
2
4
  require "irb"
3
5
  require "rubygems"
4
6
  require "bundler/setup"
5
7
 
6
8
  $LOAD_PATH.unshift "lib"
7
- require "elastomer/client"
9
+ require "elastomer_client/client"
8
10
 
9
11
  IRB.start