search_flip 4.0.0.beta3 → 4.0.0.beta4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c93ffb5c3868ef14b27903734bfb2d77384acc4a52eb529070f8a17a82f323a3
4
- data.tar.gz: 458f01664f5faf01006eddba2f59cdbcca7e10be22769aafca1084663c242a9b
3
+ metadata.gz: 26839c09be4ddaecd0107d683afc1c16516c0ef562b3e9cb8652b6e0c1818003
4
+ data.tar.gz: 22e8e36e94439280e8cb0caca5ccd0f3f552ec7518bdffaeb43365e5c8cbbea3
5
5
  SHA512:
6
- metadata.gz: 341783040e3c705d6ac1cb7875dbbb0088efd22439057ced5f9a21c5629eb6f9b4ea7e8e4a23a0368e5ef7c249ad0e6a578a5f0f8a57afb2cb3b649b2db0a22e
7
- data.tar.gz: fa40baa33a6626af128fdb14713300f55690ee407bec989b1f2bfca3e55a169377e2a0c5f9cefd6107a97ed7aceba290b52a382dcf5bdbf8c6c9389253896df7
6
+ metadata.gz: 001b1042dd9f7f2d103adc48789c658e12c6a5abb4e223c72d0d405a41159d37cbe2d3a2a4c76efe125befed963470c518e806b31223ca468f700f3b06e6674b
7
+ data.tar.gz: d410d8a68b66496c246dac4b573c463b5fe08c4a998bff84146c6665a622a72ff524384d4ffb80d76ef83464858268816c794ab966ae1bba9ed962dd2ed7a105
@@ -11,7 +11,7 @@ jobs:
11
11
  - elasticsearch:5.4
12
12
  - docker.elastic.co/elasticsearch/elasticsearch:6.7.0
13
13
  - docker.elastic.co/elasticsearch/elasticsearch:7.0.0
14
- - docker.elastic.co/elasticsearch/elasticsearch:7.9.0
14
+ - docker.elastic.co/elasticsearch/elasticsearch:7.11.2
15
15
  ruby:
16
16
  - 2.5
17
17
  - 2.6
@@ -28,6 +28,7 @@ jobs:
28
28
  - uses: actions/setup-ruby@v1
29
29
  with:
30
30
  ruby-version: ${{ matrix.ruby }}
31
+ - run: gem install bundler
31
32
  - run: bundle
32
33
  - run: sleep 10
33
34
  - run: bundle exec rspec
data/.rubocop.yml CHANGED
@@ -1,6 +1,7 @@
1
1
  AllCops:
2
2
  NewCops: enable
3
- TargetRubyVersion: 2.4
3
+ TargetRubyVersion: 2.5
4
+ SuggestExtensions: false
4
5
 
5
6
  Style/CaseLikeIf:
6
7
  Enabled: false
data/CHANGELOG.md CHANGED
@@ -11,6 +11,10 @@
11
11
  * Added `SearchFlip::Connection#get_cluster_settings` and
12
12
  `#update_cluster_settings`
13
13
 
14
+ ## v3.2.1
15
+
16
+ * Fix `refresh` having a empty body breaking in elasticsearch 7.11
17
+
14
18
  ## v3.2.0
15
19
 
16
20
  * Fix `index_scope` not being passed in `each_record` without block
data/README.md CHANGED
@@ -882,53 +882,6 @@ Thus, if your ORM supports `.find_each`, `#id` and `#where` you are already
882
882
  good to go. Otherwise, simply add your custom implementation of those methods
883
883
  that work with whatever ORM you use.
884
884
 
885
- ## Date and Timestamps in JSON
886
-
887
- Elasticsearch requires dates and timestamps to have one of the formats listed
888
- here: [https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html#strict-date-time](https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html#strict-date-time).
889
-
890
- However, `JSON.generate` in ruby by default outputs something like:
891
-
892
- ```ruby
893
- JSON.generate(time: Time.now.utc)
894
- # => "{\"time\":\"2018-02-22 18:19:33 UTC\"}"
895
- ```
896
-
897
- This format is not compatible with Elasticsearch by default. If you're on
898
- Rails, ActiveSupport adds its own `#to_json` methods to `Time`, `Date`, etc.
899
- However, ActiveSupport checks whether they are used in combination with
900
- `JSON.generate` or not and adapt:
901
-
902
- ```ruby
903
- Time.now.utc.to_json
904
- => "\"2018-02-22T18:18:22.088Z\""
905
-
906
- JSON.generate(time: Time.now.utc)
907
- => "{\"time\":\"2018-02-22 18:18:59 UTC\"}"
908
- ```
909
-
910
- SearchFlip is using the [Oj gem](https://github.com/ohler55/oj) to generate
911
- JSON. More concretely, SearchFlip is using:
912
-
913
- ```ruby
914
- Oj.dump({ key: "value" }, mode: :custom, use_to_json: true)
915
- ```
916
-
917
- This mitigates the issues if you're on Rails:
918
-
919
- ```ruby
920
- Oj.dump(Time.now, mode: :custom, use_to_json: true)
921
- # => "\"2018-02-22T18:21:21.064Z\""
922
- ```
923
-
924
- However, if you're not on Rails, you need to add `#to_json` methods to `Time`,
925
- `Date` and `DateTime` to get proper serialization. You can either add them on
926
- your own, via other libraries or by simply using:
927
-
928
- ```ruby
929
- require "search_flip/to_json"
930
- ```
931
-
932
885
  ## Feature Support
933
886
 
934
887
  * for Elasticsearch 2.x, the delete-by-query plugin is required to delete
@@ -143,7 +143,7 @@ module SearchFlip
143
143
 
144
144
  return if options[:raise] == false
145
145
 
146
- parsed_response = response.parse
146
+ parsed_response = SearchFlip::JSON.parse(response.to_s)
147
147
 
148
148
  return unless parsed_response["errors"]
149
149
 
@@ -28,7 +28,9 @@ module SearchFlip
28
28
  # @return [Hash] The cluster settings
29
29
 
30
30
  def get_cluster_settings
31
- http_client.get("#{base_url}/_cluster/settings").parse
31
+ response = http_client.get("#{base_url}/_cluster/settings")
32
+
33
+ SearchFlip::JSON.parse(response.to_s)
32
34
  end
33
35
 
34
36
  # Updates the cluster settings according to the specified payload
@@ -55,7 +57,11 @@ module SearchFlip
55
57
 
56
58
  def version
57
59
  @version_mutex.synchronize do
58
- @version ||= http_client.headers(accept: "application/json").get("#{base_url}/").parse["version"]["number"]
60
+ @version ||= begin
61
+ response = http_client.headers(accept: "application/json").get("#{base_url}/")
62
+
63
+ SearchFlip::JSON.parse(response.to_s)["version"]["number"]
64
+ end
59
65
  end
60
66
  end
61
67
 
@@ -67,7 +73,9 @@ module SearchFlip
67
73
  # @return [Hash] The raw response
68
74
 
69
75
  def cluster_health
70
- http_client.headers(accept: "application/json").get("#{base_url}/_cluster/health").parse
76
+ response = http_client.headers(accept: "application/json").get("#{base_url}/_cluster/health")
77
+
78
+ SearchFlip::JSON.parse(response.to_s)
71
79
  end
72
80
 
73
81
  # Uses the Elasticsearch Multi Search API to execute multiple search requests
@@ -117,10 +125,11 @@ module SearchFlip
117
125
  # @return [Hash] The raw response
118
126
 
119
127
  def update_aliases(payload)
120
- http_client
128
+ response = http_client
121
129
  .headers(accept: "application/json", content_type: "application/json")
122
130
  .post("#{base_url}/_aliases", body: SearchFlip::JSON.generate(payload))
123
- .parse
131
+
132
+ SearchFlip::JSON.parse(response.to_s)
124
133
  end
125
134
 
126
135
  # Sends an analyze request to Elasticsearch. Raises
@@ -132,10 +141,11 @@ module SearchFlip
132
141
  # @return [Hash] The raw response
133
142
 
134
143
  def analyze(request, params = {})
135
- http_client
144
+ response = http_client
136
145
  .headers(accept: "application/json")
137
146
  .post("#{base_url}/_analyze", json: request, params: params)
138
- .parse
147
+
148
+ SearchFlip::JSON.parse(response.to_s)
139
149
  end
140
150
 
141
151
  # Fetches information about the specified index aliases. Raises
@@ -151,10 +161,11 @@ module SearchFlip
151
161
  # @return [Hash] The raw response
152
162
 
153
163
  def get_aliases(index_name: "*", alias_name: "*")
154
- http_client
164
+ response = http_client
155
165
  .headers(accept: "application/json", content_type: "application/json")
156
166
  .get("#{base_url}/#{index_name}/_alias/#{alias_name}")
157
- .parse
167
+
168
+ SearchFlip::JSON.parse(response.to_s)
158
169
  end
159
170
 
160
171
  # Returns whether or not the associated Elasticsearch alias already
@@ -186,10 +197,11 @@ module SearchFlip
186
197
  # @return [Array] The raw response
187
198
 
188
199
  def get_indices(name = "*", params: {})
189
- http_client
200
+ response = http_client
190
201
  .headers(accept: "application/json", content_type: "application/json")
191
202
  .get("#{base_url}/_cat/indices/#{name}", params: params)
192
- .parse
203
+
204
+ SearchFlip::JSON.parse(response.to_s)
193
205
  end
194
206
 
195
207
  alias_method :cat_indices, :get_indices
@@ -286,10 +298,11 @@ module SearchFlip
286
298
  # @return [Hash] The index settings
287
299
 
288
300
  def get_index_settings(index_name)
289
- http_client
301
+ response = http_client
290
302
  .headers(accept: "application/json")
291
303
  .get("#{index_url(index_name)}/_settings")
292
- .parse
304
+
305
+ SearchFlip::JSON.parse(response.to_s)
293
306
  end
294
307
 
295
308
  # Sends a refresh request to Elasticsearch. Raises
@@ -299,7 +312,7 @@ module SearchFlip
299
312
  # @return [Boolean] Returns true or raises SearchFlip::ResponseError
300
313
 
301
314
  def refresh(index_names = nil)
302
- http_client.post("#{index_names ? index_url(Array(index_names).join(",")) : base_url}/_refresh", json: {})
315
+ http_client.post("#{index_names ? index_url(Array(index_names).join(",")) : base_url}/_refresh")
303
316
 
304
317
  true
305
318
  end
@@ -337,7 +350,9 @@ module SearchFlip
337
350
  url = type_name ? type_url(index_name, type_name) : index_url(index_name)
338
351
  params = type_name && version.to_f >= 6.7 ? { include_type_name: true } : {}
339
352
 
340
- http_client.headers(accept: "application/json").get("#{url}/_mapping", params: params).parse
353
+ response = http_client.headers(accept: "application/json").get("#{url}/_mapping", params: params)
354
+
355
+ SearchFlip::JSON.parse(response.to_s)
341
356
  end
342
357
 
343
358
  # Deletes the specified index from Elasticsearch. Raises
@@ -487,7 +487,9 @@ module SearchFlip
487
487
  # @return [Hash] The raw response
488
488
 
489
489
  def analyze(request, params = {})
490
- connection.http_client.headers(accept: "application/json").post("#{index_url}/_analyze", json: request, params: params).parse
490
+ response = connection.http_client.headers(accept: "application/json").post("#{index_url}/_analyze", json: request, params: params)
491
+
492
+ SearchFlip::JSON.parse(response.to_s)
491
493
  end
492
494
 
493
495
  # Sends a index refresh request to Elasticsearch. Raises
@@ -1,11 +1,21 @@
1
1
  module SearchFlip
2
2
  class JSON
3
+ @default_options = {
4
+ mode: :custom,
5
+ time_format: :xmlschema,
6
+ bigdecimal_as_decimal: false
7
+ }
8
+
9
+ def self.default_options
10
+ @default_options
11
+ end
12
+
3
13
  def self.generate(obj)
4
- Oj.dump(obj, mode: :custom, use_to_json: true)
14
+ Oj.dump(obj, default_options)
5
15
  end
6
16
 
7
- def self.parse(str)
8
- Oj.load(str, mode: :compat)
17
+ def self.parse(json)
18
+ Oj.load(json, default_options)
9
19
  end
10
20
  end
11
21
  end
@@ -1,29 +1 @@
1
- require "time"
2
- require "date"
3
- require "json"
4
-
5
- class Time
6
- def to_json(*args)
7
- iso8601(6).to_json
8
- end
9
- end
10
-
11
- class Date
12
- def to_json(*args)
13
- iso8601.to_json
14
- end
15
- end
16
-
17
- class DateTime
18
- def to_json(*args)
19
- iso8601(6).to_json
20
- end
21
- end
22
-
23
- if defined?(ActiveSupport)
24
- class ActiveSupport::TimeWithZone
25
- def to_json(*args)
26
- iso8601(6).to_json
27
- end
28
- end
29
- end
1
+ warn "[DEPRECATION] Using search_flip/to_json is not neccessary anymore"
@@ -1,3 +1,3 @@
1
1
  module SearchFlip
2
- VERSION = "4.0.0.beta3"
2
+ VERSION = "4.0.0.beta4"
3
3
  end
@@ -2,6 +2,16 @@ require File.expand_path("../spec_helper", __dir__)
2
2
 
3
3
  RSpec.describe SearchFlip::JSON do
4
4
  describe ".generate" do
5
+ it "encodes timestamps correctly" do
6
+ Timecop.freeze "2020-06-01 12:00:00 UTC" do
7
+ expect(described_class.generate(timestamp: Time.now.utc)).to eq('{"timestamp":"2020-06-01T12:00:00Z"}')
8
+ end
9
+ end
10
+
11
+ it "encodes bigdecimals as string" do
12
+ expect(described_class.generate(value: BigDecimal(1))).to eq('{"value":"1.0"}')
13
+ end
14
+
5
15
  it "delegates to Oj" do
6
16
  allow(Oj).to receive(:dump)
7
17
 
@@ -9,7 +19,7 @@ RSpec.describe SearchFlip::JSON do
9
19
 
10
20
  described_class.generate(payload)
11
21
 
12
- expect(Oj).to have_received(:dump).with(payload, mode: :custom, use_to_json: true)
22
+ expect(Oj).to have_received(:dump).with(payload, mode: :custom, time_format: :xmlschema, bigdecimal_as_decimal: false)
13
23
  end
14
24
 
15
25
  it "generates json" do
@@ -18,6 +28,10 @@ RSpec.describe SearchFlip::JSON do
18
28
  end
19
29
 
20
30
  describe ".parse" do
31
+ it "returns the parsed json payload" do
32
+ expect(described_class.parse('{"key":"value"}')).to eq("key" => "value")
33
+ end
34
+
21
35
  it "delegates to Oj" do
22
36
  allow(Oj).to receive(:load)
23
37
 
@@ -25,7 +39,7 @@ RSpec.describe SearchFlip::JSON do
25
39
 
26
40
  described_class.parse(payload)
27
41
 
28
- expect(Oj).to have_received(:load).with(payload, mode: :compat)
42
+ expect(Oj).to have_received(:load).with(payload, mode: :custom, time_format: :xmlschema, bigdecimal_as_decimal: false)
29
43
  end
30
44
  end
31
45
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: search_flip
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0.beta3
4
+ version: 4.0.0.beta4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Benjamin Vetter
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-05 00:00:00.000000000 Z
11
+ date: 2021-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -250,7 +250,6 @@ files:
250
250
  - spec/search_flip/null_instrumenter_spec.rb
251
251
  - spec/search_flip/response_spec.rb
252
252
  - spec/search_flip/result_spec.rb
253
- - spec/search_flip/to_json_spec.rb
254
253
  - spec/spec_helper.rb
255
254
  homepage: https://github.com/mrkamel/search_flip
256
255
  licenses:
@@ -292,5 +291,4 @@ test_files:
292
291
  - spec/search_flip/null_instrumenter_spec.rb
293
292
  - spec/search_flip/response_spec.rb
294
293
  - spec/search_flip/result_spec.rb
295
- - spec/search_flip/to_json_spec.rb
296
294
  - spec/spec_helper.rb
@@ -1,28 +0,0 @@
1
- require File.expand_path("../spec_helper", __dir__)
2
- require "search_flip/to_json"
3
-
4
- RSpec.describe "to_json" do
5
- it "uses the correct format for Time" do
6
- Timecop.freeze Time.parse("2018-01-01 12:00:00 UTC") do
7
- expect(Time.now.utc.to_json).to eq("\"2018-01-01T12:00:00.000000Z\"")
8
- end
9
- end
10
-
11
- it "uses the correct format for Date" do
12
- Timecop.freeze Time.parse("2018-01-01 12:00:00 UTC") do
13
- expect(Date.today.to_json).to eq("\"2018-01-01\"")
14
- end
15
- end
16
-
17
- it "uses the correct format for DateTime" do
18
- Timecop.freeze Time.parse("2018-01-01 12:00:00 UTC") do
19
- expect(Time.now.utc.to_json).to eq("\"2018-01-01T12:00:00.000000Z\"")
20
- end
21
- end
22
-
23
- it "uses the correct format for TimeWithZone" do
24
- Timecop.freeze Time.parse("2018-01-01 12:00:00 UTC") do
25
- expect(Time.find_zone("UTC").now.to_json).to eq("\"2018-01-01T12:00:00.000000Z\"")
26
- end
27
- end
28
- end