chewy 7.6.0 → 8.0.0.pre.beta
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/.github/CODEOWNERS +1 -1
- data/.github/workflows/ruby.yml +5 -5
- data/CHANGELOG.md +12 -0
- data/README.md +33 -1
- data/chewy.gemspec +3 -2
- data/docker-compose.yml +15 -0
- data/gemfiles/base.gemfile +1 -1
- data/lib/chewy/config.rb +2 -2
- data/lib/chewy/errors.rb +3 -0
- data/lib/chewy/fields/root.rb +1 -1
- data/lib/chewy/index/actions.rb +5 -5
- data/lib/chewy/index/aliases.rb +1 -1
- data/lib/chewy/index/syncer.rb +1 -1
- data/lib/chewy/minitest/helpers.rb +1 -1
- data/lib/chewy/search/request.rb +4 -4
- data/lib/chewy/search/response.rb +7 -0
- data/lib/chewy/search/scrolling.rb +2 -1
- data/lib/chewy/version.rb +1 -1
- data/lib/chewy.rb +4 -0
- data/spec/chewy/config_spec.rb +2 -2
- data/spec/chewy/elastic_client_spec.rb +1 -1
- data/spec/chewy/fields/base_spec.rb +2 -2
- data/spec/chewy/fields/time_fields_spec.rb +1 -1
- data/spec/chewy/index/actions_spec.rb +9 -9
- data/spec/chewy/index/aliases_spec.rb +1 -1
- data/spec/chewy/index/import/bulk_builder_spec.rb +2 -2
- data/spec/chewy/index/import/bulk_request_spec.rb +1 -1
- data/spec/chewy/index/import/routine_spec.rb +1 -1
- data/spec/chewy/index/import_spec.rb +15 -15
- data/spec/chewy/index/observe/callback_spec.rb +1 -1
- data/spec/chewy/index/specification_spec.rb +1 -4
- data/spec/chewy/index/syncer_spec.rb +1 -1
- data/spec/chewy/index_spec.rb +1 -1
- data/spec/chewy/journal_spec.rb +2 -2
- data/spec/chewy/minitest/helpers_spec.rb +1 -1
- data/spec/chewy/multi_search_spec.rb +1 -1
- data/spec/chewy/rake_helper_spec.rb +1 -1
- data/spec/chewy/rspec/update_index_spec.rb +1 -1
- data/spec/chewy/runtime_spec.rb +2 -2
- data/spec/chewy/search/loader_spec.rb +1 -1
- data/spec/chewy/search/pagination/kaminari_examples.rb +1 -1
- data/spec/chewy/search/request_spec.rb +1 -1
- data/spec/chewy/search/response_spec.rb +2 -2
- data/spec/chewy/search/scrolling_spec.rb +1 -1
- data/spec/chewy/search_spec.rb +1 -1
- data/spec/chewy/stash_spec.rb +1 -1
- data/spec/chewy/strategy/delayed_sidekiq_spec.rb +1 -1
- data/spec/chewy/strategy_spec.rb +1 -1
- data/spec/chewy_spec.rb +6 -5
- data/spec/spec_helper.rb +26 -0
- metadata +13 -12
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fe6459bb964c9d44912601a2a5abc6ea93ea7ac7be94c384673ade2ce68fb9e6
|
|
4
|
+
data.tar.gz: 397d2104f889f9e9232ed673b3fe5dc50fe4c13f1330b4ce9b1b1e45f9a11e16
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ebe662c3e11aaebd6fb8de8058ed9199d94b7eb80e7f4b6347c0fe98481c37cdb6be51e72d13645e627ae7d653d43c4bcd6a9a1f81b4eafdbb7371c814f2e847
|
|
7
|
+
data.tar.gz: 0e3b1d9b5eb0724fb1b2453d75e7980d9d7c1a3b341dca3934c366c7ba6ec5242bd9e647538486c9be6203d1ca9a5c6f18bcefcfc7ea64cdf8a31b7893af9f72
|
data/.github/CODEOWNERS
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.github/workflows @toptal/
|
|
1
|
+
.github/workflows @toptal/sre
|
data/.github/workflows/ruby.yml
CHANGED
|
@@ -41,11 +41,11 @@ jobs:
|
|
|
41
41
|
with:
|
|
42
42
|
ruby-version: ${{ matrix.ruby }}
|
|
43
43
|
bundler-cache: true
|
|
44
|
-
- name:
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
- name: Start containers
|
|
45
|
+
run: |
|
|
46
|
+
docker compose up elasticsearch_test -d
|
|
47
|
+
sleep 15
|
|
48
|
+
|
|
49
49
|
- name: Tests
|
|
50
50
|
run: bundle exec rspec
|
|
51
51
|
|
data/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,18 @@
|
|
|
8
8
|
|
|
9
9
|
### Bugs Fixed
|
|
10
10
|
|
|
11
|
+
## 8.0.0-beta (2024-08-27)
|
|
12
|
+
|
|
13
|
+
### New Features
|
|
14
|
+
|
|
15
|
+
* [#962](https://github.com/toptal/chewy/pull/962): ElasticSearch v.8 support added
|
|
16
|
+
|
|
17
|
+
* `delete_all_enabled` setting introduced to align Chewy.massacre with wildcard indices deletion disabled in ES 8 by default
|
|
18
|
+
|
|
19
|
+
### Changes
|
|
20
|
+
|
|
21
|
+
### Bugs Fixed
|
|
22
|
+
|
|
11
23
|
## 7.6.0 (2024-05-03)
|
|
12
24
|
|
|
13
25
|
### Changes
|
data/README.md
CHANGED
|
@@ -51,6 +51,7 @@ Chewy is compatible with MRI 3.0-3.2¹.
|
|
|
51
51
|
|
|
52
52
|
| Chewy version | Elasticsearch version |
|
|
53
53
|
| ------------- | ---------------------------------- |
|
|
54
|
+
| 8.0.0 | 8.x |
|
|
54
55
|
| 7.2.x | 7.x |
|
|
55
56
|
| 7.1.x | 7.x |
|
|
56
57
|
| 7.0.x | 6.8, 7.x |
|
|
@@ -97,7 +98,36 @@ development:
|
|
|
97
98
|
Make sure you have Elasticsearch up and running. You can [install](https://www.elastic.co/guide/en/elasticsearch/reference/current/install-elasticsearch.html) it locally, but the easiest way is to use [Docker](https://www.docker.com/get-started):
|
|
98
99
|
|
|
99
100
|
```shell
|
|
100
|
-
$ docker run --rm --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:
|
|
101
|
+
$ docker run --rm --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "xpack.security.enabled=false" elasticsearch:8.15.0
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Security
|
|
105
|
+
|
|
106
|
+
Please note that starting from version 8 ElasticSearch has security features enabled by default.
|
|
107
|
+
Docker command above has it disabled for local testing convenience. If you want to enable it, omit
|
|
108
|
+
`"xpack.security.enabled=false"` part from Docker command, and run these command after starting container (container name `es8` assumed):
|
|
109
|
+
|
|
110
|
+
Reset password for `elastic` user:
|
|
111
|
+
```
|
|
112
|
+
docker container exec es8 '/usr/share/elasticsearch/bin/elasticsearch-reset-password' -u elastic
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Extract CA certificate generated by ElasticSearch on first run:
|
|
116
|
+
```
|
|
117
|
+
docker container cp es8:/usr/share/elasticsearch/config/certs/http_ca.crt tmp/
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
And then add them to settings:
|
|
121
|
+
|
|
122
|
+
```yaml
|
|
123
|
+
# config/chewy.yml
|
|
124
|
+
development:
|
|
125
|
+
host: 'localhost:9200'
|
|
126
|
+
user: 'elastic'
|
|
127
|
+
password: 'SomeLongPassword'
|
|
128
|
+
transport_options:
|
|
129
|
+
ssl:
|
|
130
|
+
ca_file: './tmp/http_ca.crt'
|
|
101
131
|
```
|
|
102
132
|
|
|
103
133
|
### Index
|
|
@@ -941,6 +971,8 @@ Controller actions are wrapped with the configurable value of `Chewy.request_str
|
|
|
941
971
|
|
|
942
972
|
It is also a good idea to set up the `:bypass` strategy inside your test suite and import objects manually only when needed, and use `Chewy.massacre` when needed to flush test ES indices before every example. This will allow you to minimize unnecessary ES requests and reduce overhead.
|
|
943
973
|
|
|
974
|
+
Deprecation note: since version 8 wildcard removing of indices is disabled by default. You can enable it for a cluster with setting `action.destructive_requires_name` to false.
|
|
975
|
+
|
|
944
976
|
```ruby
|
|
945
977
|
RSpec.configure do |config|
|
|
946
978
|
config.before(:suite) do
|
data/chewy.gemspec
CHANGED
|
@@ -11,13 +11,14 @@ Gem::Specification.new do |spec|
|
|
|
11
11
|
spec.description = 'Chewy provides functionality for Elasticsearch index handling, documents import mappings and chainable query DSL'
|
|
12
12
|
spec.homepage = 'https://github.com/toptal/chewy'
|
|
13
13
|
spec.license = 'MIT'
|
|
14
|
+
spec.required_ruby_version = '~> 3.0'
|
|
14
15
|
|
|
15
16
|
spec.files = `git ls-files`.split($RS)
|
|
16
17
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
|
17
18
|
spec.require_paths = ['lib']
|
|
18
19
|
|
|
19
|
-
spec.add_dependency 'activesupport', '>=
|
|
20
|
-
spec.add_dependency 'elasticsearch', '>=
|
|
20
|
+
spec.add_dependency 'activesupport', '>= 6.1'
|
|
21
|
+
spec.add_dependency 'elasticsearch', '>= 8.14', '< 9.0'
|
|
21
22
|
spec.add_dependency 'elasticsearch-dsl'
|
|
22
23
|
spec.metadata['rubygems_mfa_required'] = 'true'
|
|
23
24
|
end
|
data/docker-compose.yml
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
version: "3.4"
|
|
2
|
+
services:
|
|
3
|
+
elasticsearch_test:
|
|
4
|
+
image: "elasticsearch:8.15.0"
|
|
5
|
+
environment:
|
|
6
|
+
- bootstrap.memory_lock=${ES_MEMORY_LOCK:-false}
|
|
7
|
+
- "ES_JAVA_OPTS=-Xms${TEST_ES_HEAP_SIZE:-500m} -Xmx${TEST_ES_HEAP_SIZE:-500m}"
|
|
8
|
+
- discovery.type=single-node
|
|
9
|
+
- xpack.security.enabled=false
|
|
10
|
+
ports:
|
|
11
|
+
- "127.0.0.1:9250:9200"
|
|
12
|
+
ulimits:
|
|
13
|
+
nofile:
|
|
14
|
+
soft: 65536
|
|
15
|
+
hard: 65536
|
data/gemfiles/base.gemfile
CHANGED
data/lib/chewy/config.rb
CHANGED
|
@@ -70,12 +70,12 @@ module Chewy
|
|
|
70
70
|
end
|
|
71
71
|
|
|
72
72
|
def transport_logger=(logger)
|
|
73
|
-
Chewy.client.transport.
|
|
73
|
+
Chewy.client.transport.logger = logger
|
|
74
74
|
@transport_logger = logger
|
|
75
75
|
end
|
|
76
76
|
|
|
77
77
|
def transport_tracer=(tracer)
|
|
78
|
-
Chewy.client.transport.
|
|
78
|
+
Chewy.client.transport.tracer = tracer
|
|
79
79
|
@transport_tracer = tracer
|
|
80
80
|
end
|
|
81
81
|
|
data/lib/chewy/errors.rb
CHANGED
data/lib/chewy/fields/root.rb
CHANGED
data/lib/chewy/index/actions.rb
CHANGED
|
@@ -32,7 +32,7 @@ module Chewy
|
|
|
32
32
|
#
|
|
33
33
|
def create(*args, **kwargs)
|
|
34
34
|
create!(*args, **kwargs)
|
|
35
|
-
rescue
|
|
35
|
+
rescue Elastic::Transport::Transport::Errors::BadRequest
|
|
36
36
|
false
|
|
37
37
|
end
|
|
38
38
|
|
|
@@ -83,9 +83,9 @@ module Chewy
|
|
|
83
83
|
result = client.indices.delete index: index_names.join(',')
|
|
84
84
|
Chewy.wait_for_status if result
|
|
85
85
|
result
|
|
86
|
-
# es-ruby >= 1.0.10 handles
|
|
86
|
+
# es-ruby >= 1.0.10 handles Elastic::Transport::Transport::Errors::NotFound
|
|
87
87
|
# by itself, rescue is for previous versions
|
|
88
|
-
rescue
|
|
88
|
+
rescue Elastic::Transport::Transport::Errors::NotFound
|
|
89
89
|
false
|
|
90
90
|
end
|
|
91
91
|
|
|
@@ -99,9 +99,9 @@ module Chewy
|
|
|
99
99
|
# UsersIndex.delete '01-2014' # deletes `users_01-2014` index
|
|
100
100
|
#
|
|
101
101
|
def delete!(suffix = nil)
|
|
102
|
-
# es-ruby >= 1.0.10 handles
|
|
102
|
+
# es-ruby >= 1.0.10 handles Elastic::Transport::Transport::Errors::NotFound
|
|
103
103
|
# by itself, so it is raised here
|
|
104
|
-
delete(suffix) or raise
|
|
104
|
+
delete(suffix) or raise Elastic::Transport::Transport::Errors::NotFound
|
|
105
105
|
end
|
|
106
106
|
|
|
107
107
|
# Deletes and recreates index. Supports suffixes.
|
data/lib/chewy/index/aliases.rb
CHANGED
data/lib/chewy/index/syncer.rb
CHANGED
|
@@ -213,7 +213,7 @@ module Chewy
|
|
|
213
213
|
@outdated_sync_field_type = mappings
|
|
214
214
|
.fetch('properties', {})
|
|
215
215
|
.fetch(@index.outdated_sync_field.to_s, {})['type']
|
|
216
|
-
rescue
|
|
216
|
+
rescue Elastic::Transport::Transport::Errors::NotFound
|
|
217
217
|
nil
|
|
218
218
|
end
|
|
219
219
|
end
|
data/lib/chewy/search/request.rb
CHANGED
|
@@ -46,7 +46,7 @@ module Chewy
|
|
|
46
46
|
|
|
47
47
|
delegate :hits, :wrappers, :objects, :records, :documents,
|
|
48
48
|
:object_hash, :record_hash, :document_hash,
|
|
49
|
-
:total, :max_score, :took, :timed_out?, to: :response
|
|
49
|
+
:total, :max_score, :took, :timed_out?, :terminated_early?, to: :response
|
|
50
50
|
delegate :each, :size, :to_a, :[], to: :wrappers
|
|
51
51
|
alias_method :to_ary, :to_a
|
|
52
52
|
alias_method :total_count, :total
|
|
@@ -854,7 +854,7 @@ module Chewy
|
|
|
854
854
|
else
|
|
855
855
|
Chewy.client.count(only(WHERE_STORAGES).render)['count']
|
|
856
856
|
end
|
|
857
|
-
rescue
|
|
857
|
+
rescue Elastic::Transport::Transport::Errors::NotFound
|
|
858
858
|
0
|
|
859
859
|
end
|
|
860
860
|
|
|
@@ -891,7 +891,7 @@ module Chewy
|
|
|
891
891
|
def first(limit = UNDEFINED)
|
|
892
892
|
request_limit = limit == UNDEFINED ? 1 : limit
|
|
893
893
|
|
|
894
|
-
if performed? && (request_limit <= size || size == total)
|
|
894
|
+
if performed? && (terminated_early? || request_limit <= size || size == total)
|
|
895
895
|
limit == UNDEFINED ? wrappers.first : wrappers.first(limit)
|
|
896
896
|
else
|
|
897
897
|
result = except(EXTRA_STORAGES).limit(request_limit).to_a
|
|
@@ -1035,7 +1035,7 @@ module Chewy
|
|
|
1035
1035
|
request_body = render.merge(additional)
|
|
1036
1036
|
ActiveSupport::Notifications.instrument 'search_query.chewy', notification_payload(request: request_body) do
|
|
1037
1037
|
Chewy.client.search(request_body)
|
|
1038
|
-
rescue
|
|
1038
|
+
rescue Elastic::Transport::Transport::Errors::NotFound
|
|
1039
1039
|
{}
|
|
1040
1040
|
end
|
|
1041
1041
|
end
|
|
@@ -47,6 +47,13 @@ module Chewy
|
|
|
47
47
|
@timed_out ||= @body['timed_out']
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
+
# Has the request been terminated early?
|
|
51
|
+
#
|
|
52
|
+
# @return [true, false]
|
|
53
|
+
def terminated_early?
|
|
54
|
+
@terminated_early ||= @body['terminated_early']
|
|
55
|
+
end
|
|
56
|
+
|
|
50
57
|
# The `suggest` response part. Returns empty hash if suggests
|
|
51
58
|
# were not requested.
|
|
52
59
|
#
|
|
@@ -39,7 +39,8 @@ module Chewy
|
|
|
39
39
|
hits = hits.first(last_batch_size) if last_batch_size != 0 && fetched >= total
|
|
40
40
|
yield(hits) if hits.present?
|
|
41
41
|
scroll_id = result['_scroll_id']
|
|
42
|
-
|
|
42
|
+
|
|
43
|
+
break if result['terminated_early'] || fetched >= total
|
|
43
44
|
|
|
44
45
|
result = perform_scroll(scroll: scroll, scroll_id: scroll_id)
|
|
45
46
|
end
|
data/lib/chewy/version.rb
CHANGED
data/lib/chewy.rb
CHANGED
|
@@ -116,6 +116,10 @@ module Chewy
|
|
|
116
116
|
# Be careful, if current prefix is blank, this will destroy all the indexes.
|
|
117
117
|
#
|
|
118
118
|
def massacre
|
|
119
|
+
unless Chewy.settings[:delete_all_enabled]
|
|
120
|
+
raise FeatureDisabled, 'Feature disabled by default in ES 8. You can enable it in the cluster and set `delete_all_enabled` option in settings'
|
|
121
|
+
end
|
|
122
|
+
|
|
119
123
|
Chewy.client.indices.delete(index: [Chewy.configuration[:prefix], '*'].reject(&:blank?).join('_'))
|
|
120
124
|
Chewy.wait_for_status
|
|
121
125
|
end
|
data/spec/chewy/config_spec.rb
CHANGED
|
@@ -22,7 +22,7 @@ describe Chewy::Config do
|
|
|
22
22
|
|
|
23
23
|
specify do
|
|
24
24
|
expect { subject.transport_logger = logger }
|
|
25
|
-
.to change { Chewy.client.transport.
|
|
25
|
+
.to change { Chewy.client.transport.logger }.to(logger)
|
|
26
26
|
end
|
|
27
27
|
specify do
|
|
28
28
|
expect { subject.transport_logger = logger }
|
|
@@ -40,7 +40,7 @@ describe Chewy::Config do
|
|
|
40
40
|
|
|
41
41
|
specify do
|
|
42
42
|
expect { subject.transport_tracer = tracer }
|
|
43
|
-
.to change { Chewy.client.transport.
|
|
43
|
+
.to change { Chewy.client.transport.tracer }.to(tracer)
|
|
44
44
|
end
|
|
45
45
|
specify do
|
|
46
46
|
expect { subject.transport_tracer = tracer }
|
|
@@ -5,7 +5,7 @@ describe Chewy::Fields::Base do
|
|
|
5
5
|
specify { expect(described_class.new('name', type: 'integer').options[:type]).to eq('integer') }
|
|
6
6
|
|
|
7
7
|
describe '#compose' do
|
|
8
|
-
let(:field) { described_class.new(:name, value:
|
|
8
|
+
let(:field) { described_class.new(:name, value: lambda(&:value)) }
|
|
9
9
|
|
|
10
10
|
specify { expect(field.compose(double(value: 'hello'))).to eq(name: 'hello') }
|
|
11
11
|
specify { expect(field.compose(double(value: %w[hello world]))).to eq(name: %w[hello world]) }
|
|
@@ -23,7 +23,7 @@ describe Chewy::Fields::Base do
|
|
|
23
23
|
|
|
24
24
|
context 'nested fields' do
|
|
25
25
|
before do
|
|
26
|
-
field.children.push(described_class.new(:subname1, value:
|
|
26
|
+
field.children.push(described_class.new(:subname1, value: lambda(&:subvalue1)))
|
|
27
27
|
field.children.push(described_class.new(:subname2, value: -> { subvalue2 }))
|
|
28
28
|
field.children.push(described_class.new(:subname3))
|
|
29
29
|
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
describe Chewy::Index::Actions do
|
|
4
|
-
before {
|
|
4
|
+
before { drop_indices }
|
|
5
5
|
|
|
6
6
|
before do
|
|
7
7
|
stub_index :dummies
|
|
@@ -78,12 +78,12 @@ describe Chewy::Index::Actions do
|
|
|
78
78
|
specify do
|
|
79
79
|
expect do
|
|
80
80
|
DummiesIndex.create!
|
|
81
|
-
end.to raise_error(
|
|
81
|
+
end.to raise_error(Elastic::Transport::Transport::Errors::BadRequest).with_message(/already exists.*dummies/)
|
|
82
82
|
end
|
|
83
83
|
specify do
|
|
84
84
|
expect do
|
|
85
85
|
DummiesIndex.create!('2013')
|
|
86
|
-
end.to raise_error(
|
|
86
|
+
end.to raise_error(Elastic::Transport::Transport::Errors::BadRequest).with_message(/Invalid alias name \[dummies\]/)
|
|
87
87
|
end
|
|
88
88
|
end
|
|
89
89
|
|
|
@@ -100,7 +100,7 @@ describe Chewy::Index::Actions do
|
|
|
100
100
|
specify do
|
|
101
101
|
expect do
|
|
102
102
|
DummiesIndex.create!('2013')
|
|
103
|
-
end.to raise_error(
|
|
103
|
+
end.to raise_error(Elastic::Transport::Transport::Errors::BadRequest).with_message(/already exists.*dummies_2013/)
|
|
104
104
|
end
|
|
105
105
|
specify { expect(DummiesIndex.create!('2014')['acknowledged']).to eq(true) }
|
|
106
106
|
|
|
@@ -190,11 +190,11 @@ describe Chewy::Index::Actions do
|
|
|
190
190
|
end
|
|
191
191
|
|
|
192
192
|
describe '.delete!' do
|
|
193
|
-
specify { expect { DummiesIndex.delete! }.to raise_error(
|
|
193
|
+
specify { expect { DummiesIndex.delete! }.to raise_error(Elastic::Transport::Transport::Errors::NotFound) }
|
|
194
194
|
specify do
|
|
195
195
|
expect do
|
|
196
196
|
DummiesIndex.delete!('2013')
|
|
197
|
-
end.to raise_error(
|
|
197
|
+
end.to raise_error(Elastic::Transport::Transport::Errors::NotFound)
|
|
198
198
|
end
|
|
199
199
|
|
|
200
200
|
context do
|
|
@@ -768,7 +768,7 @@ describe Chewy::Index::Actions do
|
|
|
768
768
|
.to receive(:clear_cache)
|
|
769
769
|
.and_call_original
|
|
770
770
|
expect { CitiesIndex.clear_cache({index: unexisted_index_name}) }
|
|
771
|
-
.to raise_error
|
|
771
|
+
.to raise_error Elastic::Transport::Transport::Errors::NotFound
|
|
772
772
|
end
|
|
773
773
|
end
|
|
774
774
|
|
|
@@ -820,7 +820,7 @@ describe Chewy::Index::Actions do
|
|
|
820
820
|
.to receive(:reindex)
|
|
821
821
|
.and_call_original
|
|
822
822
|
expect { CitiesIndex.reindex(source: unexisting_index, dest: dest_index_with_prefix) }
|
|
823
|
-
.to raise_error
|
|
823
|
+
.to raise_error Elastic::Transport::Transport::Errors::NotFound
|
|
824
824
|
end
|
|
825
825
|
end
|
|
826
826
|
|
|
@@ -883,7 +883,7 @@ describe Chewy::Index::Actions do
|
|
|
883
883
|
context 'index name' do
|
|
884
884
|
specify do
|
|
885
885
|
expect { CitiesIndex.update_mapping(unexisting_index, body_hash) }
|
|
886
|
-
.to raise_error
|
|
886
|
+
.to raise_error Elastic::Transport::Transport::Errors::NotFound
|
|
887
887
|
end
|
|
888
888
|
end
|
|
889
889
|
|
|
@@ -17,7 +17,7 @@ SimpleComment = Class.new do
|
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
describe Chewy::Index::Import::BulkBuilder do
|
|
20
|
-
before {
|
|
20
|
+
before { drop_indices }
|
|
21
21
|
|
|
22
22
|
subject { described_class.new(index, to_index: to_index, delete: delete, fields: fields) }
|
|
23
23
|
let(:index) { CitiesIndex }
|
|
@@ -216,7 +216,7 @@ describe Chewy::Index::Import::BulkBuilder do
|
|
|
216
216
|
end
|
|
217
217
|
|
|
218
218
|
def do_raw_index_comment(options:, data:)
|
|
219
|
-
CommentsIndex.client.index(options.merge(index: 'comments',
|
|
219
|
+
CommentsIndex.client.index(options.merge(index: 'comments', refresh: true, body: data))
|
|
220
220
|
end
|
|
221
221
|
|
|
222
222
|
def raw_index_comment(comment)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
describe Chewy::Index::Import do
|
|
4
|
-
before {
|
|
4
|
+
before { drop_indices }
|
|
5
5
|
|
|
6
6
|
before do
|
|
7
7
|
stub_model(:city)
|
|
@@ -204,10 +204,10 @@ describe Chewy::Index::Import do
|
|
|
204
204
|
end
|
|
205
205
|
end
|
|
206
206
|
|
|
207
|
-
let(:
|
|
207
|
+
let(:document_parsing_exception) do
|
|
208
208
|
{
|
|
209
|
-
'type' => '
|
|
210
|
-
'reason' => 'object mapping for [name] tried to parse field [name] as object, but found a concrete value'
|
|
209
|
+
'type' => 'document_parsing_exception',
|
|
210
|
+
'reason' => '[1:9] object mapping for [name] tried to parse field [name] as object, but found a concrete value'
|
|
211
211
|
}
|
|
212
212
|
end
|
|
213
213
|
|
|
@@ -215,7 +215,7 @@ describe Chewy::Index::Import do
|
|
|
215
215
|
payload = subscribe_notification
|
|
216
216
|
import dummy_cities, batch_size: 2
|
|
217
217
|
expect(payload).to eq(index: CitiesIndex,
|
|
218
|
-
errors: {index: {
|
|
218
|
+
errors: {index: {document_parsing_exception => %w[1 2 3]}},
|
|
219
219
|
import: {index: 3})
|
|
220
220
|
end
|
|
221
221
|
end
|
|
@@ -270,8 +270,8 @@ describe Chewy::Index::Import do
|
|
|
270
270
|
expect(payload).to eq(
|
|
271
271
|
errors: {
|
|
272
272
|
index: {{
|
|
273
|
-
'type' => '
|
|
274
|
-
'reason' => 'object mapping for [object] tried to parse field [object] as object, but found a concrete value'
|
|
273
|
+
'type' => 'document_parsing_exception',
|
|
274
|
+
'reason' => '[1:27] object mapping for [object] tried to parse field [object] as object, but found a concrete value'
|
|
275
275
|
} => %w[2 4]}
|
|
276
276
|
},
|
|
277
277
|
import: {index: 6},
|
|
@@ -293,8 +293,8 @@ describe Chewy::Index::Import do
|
|
|
293
293
|
expect(payload).to eq(
|
|
294
294
|
errors: {
|
|
295
295
|
index: {{
|
|
296
|
-
'type' => '
|
|
297
|
-
'reason' => 'object mapping for [object] tried to parse field [object] as object, but found a concrete value'
|
|
296
|
+
'type' => 'document_parsing_exception',
|
|
297
|
+
'reason' => '[1:27] object mapping for [object] tried to parse field [object] as object, but found a concrete value'
|
|
298
298
|
} => %w[2 4]}
|
|
299
299
|
},
|
|
300
300
|
import: {index: 6},
|
|
@@ -319,8 +319,8 @@ describe Chewy::Index::Import do
|
|
|
319
319
|
expect(payload).to eq(
|
|
320
320
|
errors: {
|
|
321
321
|
index: {{
|
|
322
|
-
'type' => '
|
|
323
|
-
'reason' => 'object mapping for [object] tried to parse field [object] as object, but found a concrete value'
|
|
322
|
+
'type' => 'document_parsing_exception',
|
|
323
|
+
'reason' => '[1:27] object mapping for [object] tried to parse field [object] as object, but found a concrete value'
|
|
324
324
|
} => %w[2 4]}
|
|
325
325
|
},
|
|
326
326
|
import: {index: 6},
|
|
@@ -383,8 +383,8 @@ describe Chewy::Index::Import do
|
|
|
383
383
|
|
|
384
384
|
# Full match doesn't work here.
|
|
385
385
|
expect(payload[:errors][:update].keys).to match([
|
|
386
|
-
hash_including('type' => 'document_missing_exception', 'reason' => '[
|
|
387
|
-
hash_including('type' => 'document_missing_exception', 'reason' => '[
|
|
386
|
+
hash_including('type' => 'document_missing_exception', 'reason' => '[1]: document missing'),
|
|
387
|
+
hash_including('type' => 'document_missing_exception', 'reason' => '[3]: document missing')
|
|
388
388
|
])
|
|
389
389
|
expect(payload[:errors][:update].values).to eq([['1'], ['3']])
|
|
390
390
|
expect(imported_cities).to match_array([
|
|
@@ -431,8 +431,8 @@ describe Chewy::Index::Import do
|
|
|
431
431
|
expect(payload).to eq(
|
|
432
432
|
errors: {
|
|
433
433
|
update: {{
|
|
434
|
-
'type' => '
|
|
435
|
-
'reason' => 'object mapping for [object] tried to parse field [object] as object, but found a concrete value'
|
|
434
|
+
'type' => 'document_parsing_exception',
|
|
435
|
+
'reason' => '[1:26] object mapping for [object] tried to parse field [object] as object, but found a concrete value'
|
|
436
436
|
} => %w[2 4]}
|
|
437
437
|
},
|
|
438
438
|
import: {index: 6},
|
|
@@ -21,7 +21,7 @@ describe Chewy::Index::Observe::Callback do
|
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
context 'when executable is has arity 1' do
|
|
24
|
-
let(:executable) {
|
|
24
|
+
let(:executable) { lambda(&:population) }
|
|
25
25
|
|
|
26
26
|
it 'calls exectuable within context' do
|
|
27
27
|
expect(callback.call(city)).to eq(city.population)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
describe Chewy::Index::Specification do
|
|
4
|
-
before {
|
|
4
|
+
before { drop_indices }
|
|
5
5
|
|
|
6
6
|
let(:index1) do
|
|
7
7
|
stub_index(:places) do
|
|
@@ -46,7 +46,6 @@ describe Chewy::Index::Specification do
|
|
|
46
46
|
specify do
|
|
47
47
|
expect { specification1.lock! }.to change { Chewy::Stash::Specification.all.hits }.from([]).to([{
|
|
48
48
|
'_index' => 'chewy_specifications',
|
|
49
|
-
'_type' => '_doc',
|
|
50
49
|
'_id' => 'places',
|
|
51
50
|
'_score' => 1.0,
|
|
52
51
|
'_source' => {'specification' => Base64.encode64({
|
|
@@ -62,7 +61,6 @@ describe Chewy::Index::Specification do
|
|
|
62
61
|
specify do
|
|
63
62
|
expect { specification5.lock! }.to change { Chewy::Stash::Specification.all.hits }.to([{
|
|
64
63
|
'_index' => 'chewy_specifications',
|
|
65
|
-
'_type' => '_doc',
|
|
66
64
|
'_id' => 'places',
|
|
67
65
|
'_score' => 1.0,
|
|
68
66
|
'_source' => {'specification' => Base64.encode64({
|
|
@@ -71,7 +69,6 @@ describe Chewy::Index::Specification do
|
|
|
71
69
|
}.to_json)}
|
|
72
70
|
}, {
|
|
73
71
|
'_index' => 'chewy_specifications',
|
|
74
|
-
'_type' => '_doc',
|
|
75
72
|
'_id' => 'namespace/cities',
|
|
76
73
|
'_score' => 1.0,
|
|
77
74
|
'_source' => {'specification' => Base64.encode64({
|
data/spec/chewy/index_spec.rb
CHANGED
data/spec/chewy/journal_spec.rb
CHANGED
|
@@ -21,7 +21,7 @@ describe Chewy::Journal do
|
|
|
21
21
|
default_import_options journal: true
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
drop_indices
|
|
25
25
|
Chewy.settings[:prefix] = 'some_prefix'
|
|
26
26
|
Timecop.freeze(time)
|
|
27
27
|
end
|
|
@@ -145,7 +145,7 @@ describe Chewy::Journal do
|
|
|
145
145
|
end
|
|
146
146
|
|
|
147
147
|
context do
|
|
148
|
-
before {
|
|
148
|
+
before { drop_indices }
|
|
149
149
|
before do
|
|
150
150
|
stub_model(:city) do
|
|
151
151
|
update_index 'cities', :self
|
data/spec/chewy/runtime_spec.rb
CHANGED
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
|
3
3
|
describe Chewy::Runtime do
|
|
4
4
|
describe '.version' do
|
|
5
5
|
specify { expect(described_class.version).to be_a(described_class::Version) }
|
|
6
|
-
specify { expect(described_class.version).to be >= '
|
|
7
|
-
specify { expect(described_class.version).to be < '
|
|
6
|
+
specify { expect(described_class.version).to be >= '8.0' }
|
|
7
|
+
specify { expect(described_class.version).to be < '9.0' }
|
|
8
8
|
end
|
|
9
9
|
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
|
|
3
3
|
describe Chewy::Search::Response, :orm do
|
|
4
|
-
before {
|
|
4
|
+
before { drop_indices }
|
|
5
5
|
|
|
6
6
|
before do
|
|
7
7
|
stub_model(:city)
|
|
@@ -39,7 +39,7 @@ describe Chewy::Search::Response, :orm do
|
|
|
39
39
|
specify { expect(subject.hits).to all be_a(Hash) }
|
|
40
40
|
specify do
|
|
41
41
|
expect(subject.hits.flat_map(&:keys).uniq)
|
|
42
|
-
.to match_array(%w[_id _index
|
|
42
|
+
.to match_array(%w[_id _index _score _source sort])
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
context do
|
data/spec/chewy/search_spec.rb
CHANGED
data/spec/chewy/stash_spec.rb
CHANGED
|
@@ -134,7 +134,7 @@ if defined?(Sidekiq)
|
|
|
134
134
|
context 'both calls with different update fields' do
|
|
135
135
|
it 'deos reindex with union of fields' do
|
|
136
136
|
Timecop.freeze do
|
|
137
|
-
expect(CitiesIndex).to receive(:import!).with(match_array([city.id, other_city.id]), update_fields: %w[name description]).once
|
|
137
|
+
expect(CitiesIndex).to receive(:import!).with(match_array([city.id, other_city.id]), update_fields: match_array(%w[name description])).once
|
|
138
138
|
scheduler = Chewy::Strategy::DelayedSidekiq::Scheduler.new(CitiesIndex, [city.id], update_fields: ['name'])
|
|
139
139
|
scheduler.postpone
|
|
140
140
|
scheduler = Chewy::Strategy::DelayedSidekiq::Scheduler.new(CitiesIndex, [other_city.id], update_fields: ['description'])
|
data/spec/chewy/strategy_spec.rb
CHANGED
data/spec/chewy_spec.rb
CHANGED
|
@@ -31,8 +31,8 @@ describe Chewy do
|
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
before {
|
|
34
|
+
xdescribe '.massacre' do
|
|
35
|
+
before { drop_indices }
|
|
36
36
|
|
|
37
37
|
before do
|
|
38
38
|
allow(Chewy).to receive_messages(configuration: Chewy.configuration.merge(prefix: 'prefix1'))
|
|
@@ -40,7 +40,7 @@ describe Chewy do
|
|
|
40
40
|
allow(Chewy).to receive_messages(configuration: Chewy.configuration.merge(prefix: 'prefix2'))
|
|
41
41
|
stub_index(:developers).create!
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
drop_indices
|
|
44
44
|
|
|
45
45
|
allow(Chewy).to receive_messages(configuration: Chewy.configuration.merge(prefix: 'prefix1'))
|
|
46
46
|
end
|
|
@@ -84,7 +84,8 @@ describe Chewy do
|
|
|
84
84
|
# To avoid flaky issues when previous specs were run
|
|
85
85
|
allow(Chewy::Index).to receive(:descendants).and_return([CitiesIndex, PlacesIndex])
|
|
86
86
|
|
|
87
|
-
|
|
87
|
+
CitiesIndex.delete
|
|
88
|
+
PlacesIndex.delete
|
|
88
89
|
end
|
|
89
90
|
|
|
90
91
|
specify do
|
|
@@ -111,7 +112,7 @@ describe Chewy do
|
|
|
111
112
|
expect(CitiesIndex.exists?).to eq true
|
|
112
113
|
expect(PlacesIndex.exists?).to eq true
|
|
113
114
|
|
|
114
|
-
expect { Chewy.create_indices! }.to raise_error(
|
|
115
|
+
expect { Chewy.create_indices! }.to raise_error(Elastic::Transport::Transport::Errors::BadRequest)
|
|
115
116
|
end
|
|
116
117
|
end
|
|
117
118
|
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -28,6 +28,32 @@ Chewy.settings = {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
+
# To work with security enabled:
|
|
32
|
+
#
|
|
33
|
+
# user = ENV['ES_USER'] || 'elastic'
|
|
34
|
+
# password = ENV['ES_PASSWORD'] || ''
|
|
35
|
+
# ca_cert = ENV['ES_CA_CERT'] || './tmp/http_ca.crt'
|
|
36
|
+
#
|
|
37
|
+
# Chewy.settings.merge!(
|
|
38
|
+
# user: user,
|
|
39
|
+
# password: password,
|
|
40
|
+
# transport_options: {
|
|
41
|
+
# ssl: {
|
|
42
|
+
# ca_file: ca_cert
|
|
43
|
+
# }
|
|
44
|
+
# }
|
|
45
|
+
# )
|
|
46
|
+
|
|
47
|
+
# Low-level substitute for now-obsolete drop_indices
|
|
48
|
+
def drop_indices
|
|
49
|
+
response = Chewy.client.cat.indices
|
|
50
|
+
indices = response.body.lines.map { |line| line.split[2] }
|
|
51
|
+
return if indices.blank?
|
|
52
|
+
|
|
53
|
+
Chewy.client.indices.delete(index: indices)
|
|
54
|
+
Chewy.wait_for_status
|
|
55
|
+
end
|
|
56
|
+
|
|
31
57
|
# Chewy.transport_logger = Logger.new(STDERR)
|
|
32
58
|
|
|
33
59
|
RSpec.configure do |config|
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: chewy
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version:
|
|
4
|
+
version: 8.0.0.pre.beta
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Toptal, LLC
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2024-
|
|
12
|
+
date: 2024-09-04 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: activesupport
|
|
@@ -17,34 +17,34 @@ dependencies:
|
|
|
17
17
|
requirements:
|
|
18
18
|
- - ">="
|
|
19
19
|
- !ruby/object:Gem::Version
|
|
20
|
-
version: '
|
|
20
|
+
version: '6.1'
|
|
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: '
|
|
27
|
+
version: '6.1'
|
|
28
28
|
- !ruby/object:Gem::Dependency
|
|
29
29
|
name: elasticsearch
|
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
|
31
31
|
requirements:
|
|
32
32
|
- - ">="
|
|
33
33
|
- !ruby/object:Gem::Version
|
|
34
|
-
version:
|
|
34
|
+
version: '8.14'
|
|
35
35
|
- - "<"
|
|
36
36
|
- !ruby/object:Gem::Version
|
|
37
|
-
version: '
|
|
37
|
+
version: '9.0'
|
|
38
38
|
type: :runtime
|
|
39
39
|
prerelease: false
|
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
|
41
41
|
requirements:
|
|
42
42
|
- - ">="
|
|
43
43
|
- !ruby/object:Gem::Version
|
|
44
|
-
version:
|
|
44
|
+
version: '8.14'
|
|
45
45
|
- - "<"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '
|
|
47
|
+
version: '9.0'
|
|
48
48
|
- !ruby/object:Gem::Dependency
|
|
49
49
|
name: elasticsearch-dsl
|
|
50
50
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -88,6 +88,7 @@ files:
|
|
|
88
88
|
- README.md
|
|
89
89
|
- Rakefile
|
|
90
90
|
- chewy.gemspec
|
|
91
|
+
- docker-compose.yml
|
|
91
92
|
- filters
|
|
92
93
|
- gemfiles/base.gemfile
|
|
93
94
|
- gemfiles/rails.6.1.activerecord.gemfile
|
|
@@ -311,14 +312,14 @@ require_paths:
|
|
|
311
312
|
- lib
|
|
312
313
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
313
314
|
requirements:
|
|
314
|
-
- - "
|
|
315
|
+
- - "~>"
|
|
315
316
|
- !ruby/object:Gem::Version
|
|
316
|
-
version: '0'
|
|
317
|
+
version: '3.0'
|
|
317
318
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
318
319
|
requirements:
|
|
319
|
-
- - "
|
|
320
|
+
- - ">"
|
|
320
321
|
- !ruby/object:Gem::Version
|
|
321
|
-
version:
|
|
322
|
+
version: 1.3.1
|
|
322
323
|
requirements: []
|
|
323
324
|
rubygems_version: 3.4.10
|
|
324
325
|
signing_key:
|