elastic_search_framework 1.2.0 → 1.4.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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 39f01fc19a6b4b23c55c54b9c59441ebc4f565db4365096c00031b8e0d28bd46
|
4
|
+
data.tar.gz: 9a050c4f8a88f6faf6348e01c987999e6fe20cac33058c07b66e11b267641d21
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70dc6b3b99fb07405ecf51256393e5dc5534793960197a19f701f85eb28af5ad8fe53723089f009b3e6eecc26b0b26295a37c970c280463188dfdec5d478a23a
|
7
|
+
data.tar.gz: 1c356af13948e1d11e3011075bd4095eb9fa6c410558708278aabf89c0d3c42e90403eb5a94fcb8d8801570b6cd94e6a3663fc42f15817c716270784482722c0
|
@@ -18,26 +18,21 @@ module ElasticSearchFramework
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
def mapping(name:, field:,
|
22
|
-
|
21
|
+
def mapping(name:, field:, **options)
|
23
22
|
unless instance_variable_defined?(:@elastic_search_index_mappings)
|
24
23
|
instance_variable_set(:@elastic_search_index_mappings, {})
|
25
24
|
end
|
26
25
|
|
27
26
|
mappings = instance_variable_get(:@elastic_search_index_mappings)
|
28
27
|
|
29
|
-
if mappings[name]
|
30
|
-
mappings[name] = {}
|
31
|
-
end
|
28
|
+
mappings[name] = {} if mappings[name].nil?
|
32
29
|
|
33
|
-
mappings[name][field] =
|
30
|
+
mappings[name][field] = options
|
34
31
|
|
35
32
|
instance_variable_set(:@elastic_search_index_mappings, mappings)
|
36
|
-
|
37
33
|
end
|
38
34
|
|
39
35
|
def create
|
40
|
-
|
41
36
|
if !valid?
|
42
37
|
raise ElasticSearchFramework::Exceptions::IndexError.new("[#{self.class}] - Invalid Index description specified.")
|
43
38
|
end
|
@@ -50,7 +45,6 @@ module ElasticSearchFramework
|
|
50
45
|
payload = create_payload(description: description, mappings: mappings)
|
51
46
|
|
52
47
|
put(payload: payload)
|
53
|
-
|
54
48
|
end
|
55
49
|
|
56
50
|
def put(payload:)
|
@@ -65,7 +59,7 @@ module ElasticSearchFramework
|
|
65
59
|
end
|
66
60
|
|
67
61
|
unless is_valid_response?(response.code)
|
68
|
-
if response.body.dig(:error, :root_cause, 0, :type) == 'index_already_exists_exception'
|
62
|
+
if JSON.parse(response.body, symbolize_names: true).dig(:error, :root_cause, 0, :type) == 'index_already_exists_exception'
|
69
63
|
# We get here because the `exists?` check in #create is non-atomic
|
70
64
|
ElasticSearchFramework.logger.warn "[#{self.class}] - Failed to create preexisting index. | Response: #{response.body}"
|
71
65
|
else
|
@@ -112,12 +106,11 @@ module ElasticSearchFramework
|
|
112
106
|
|
113
107
|
if description[:shards] != nil
|
114
108
|
payload[:settings] = {
|
115
|
-
|
109
|
+
number_of_shards: Integer(description[:shards])
|
116
110
|
}
|
117
111
|
end
|
118
112
|
|
119
113
|
if mappings.keys.length > 0
|
120
|
-
|
121
114
|
payload[:mappings] = {}
|
122
115
|
|
123
116
|
mappings.keys.each do |name|
|
@@ -125,10 +118,7 @@ module ElasticSearchFramework
|
|
125
118
|
properties: {}
|
126
119
|
}
|
127
120
|
mappings[name].keys.each do |field|
|
128
|
-
payload[:mappings][name][:properties][field] =
|
129
|
-
type: mappings[name][field][:type],
|
130
|
-
index: mappings[name][field][:index]
|
131
|
-
}
|
121
|
+
payload[:mappings][name][:properties][field] = mappings[name][field]
|
132
122
|
end
|
133
123
|
end
|
134
124
|
|
@@ -1,5 +1,4 @@
|
|
1
1
|
RSpec.describe ElasticSearchFramework::Index do
|
2
|
-
|
3
2
|
describe '#description' do
|
4
3
|
it 'should return the index details' do
|
5
4
|
expect(ExampleIndex.description).to be_a(Hash)
|
@@ -10,6 +9,31 @@ RSpec.describe ElasticSearchFramework::Index do
|
|
10
9
|
end
|
11
10
|
end
|
12
11
|
|
12
|
+
describe '#index' do
|
13
|
+
before { ExampleIndex.create unless ExampleIndex.exists? }
|
14
|
+
context 'when the instance variable is not defined' do
|
15
|
+
before { allow(ExampleIndex).to receive(:instance_variable_defined?).and_return(true) }
|
16
|
+
it 'raises an index error' do
|
17
|
+
expect { ExampleIndex.index(name: 'test') }.to raise_error(
|
18
|
+
ElasticSearchFramework::Exceptions::IndexError,
|
19
|
+
"[Class] - Duplicate index description. Name: test | Shards: ."
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#id' do
|
26
|
+
context 'when the instance variable is not defined' do
|
27
|
+
before { allow(ExampleIndex).to receive(:instance_variable_defined?).and_return(true) }
|
28
|
+
it 'raises an index error' do
|
29
|
+
expect { ExampleIndex.id('name') }.to raise_error(
|
30
|
+
ElasticSearchFramework::Exceptions::IndexError,
|
31
|
+
"[Class] - Duplicate index id. Field: name."
|
32
|
+
)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
13
37
|
describe '#full_name' do
|
14
38
|
let(:namespace) { 'uat' }
|
15
39
|
let(:namespace_delimiter) { '.' }
|
@@ -20,6 +44,14 @@ RSpec.describe ElasticSearchFramework::Index do
|
|
20
44
|
it 'should return the full index name including namespace and delimiter' do
|
21
45
|
expect(ExampleIndex.full_name).to eq "#{ElasticSearchFramework.namespace}#{ElasticSearchFramework.namespace_delimiter}#{ExampleIndex.description[:name]}"
|
22
46
|
end
|
47
|
+
|
48
|
+
context 'when the namespace is nil' do
|
49
|
+
before { ElasticSearchFramework.namespace = nil }
|
50
|
+
|
51
|
+
it 'returns the description name downcased' do
|
52
|
+
expect(ExampleIndex.full_name).to eq 'example_index'
|
53
|
+
end
|
54
|
+
end
|
23
55
|
end
|
24
56
|
|
25
57
|
describe '#mapping' do
|
@@ -46,18 +78,40 @@ RSpec.describe ElasticSearchFramework::Index do
|
|
46
78
|
end
|
47
79
|
|
48
80
|
describe '#create' do
|
49
|
-
|
50
|
-
if ExampleIndex.exists?
|
81
|
+
context 'when index is valid and does not exist' do
|
82
|
+
before { ExampleIndex.delete if ExampleIndex.exists? }
|
83
|
+
|
84
|
+
it 'should create an index' do
|
85
|
+
expect(ExampleIndex.exists?).to be false
|
86
|
+
ExampleIndex.create
|
87
|
+
expect(ExampleIndex.exists?).to be true
|
88
|
+
end
|
89
|
+
|
90
|
+
after do
|
51
91
|
ExampleIndex.delete
|
52
92
|
end
|
53
93
|
end
|
54
|
-
|
55
|
-
|
56
|
-
ExampleIndex.
|
57
|
-
|
94
|
+
|
95
|
+
context 'when index is not valid' do
|
96
|
+
before { allow(ExampleIndex).to receive(:valid?).and_return(false) }
|
97
|
+
|
98
|
+
it 'raises an error' do
|
99
|
+
expect(ExampleIndex.exists?).to be false
|
100
|
+
expect { ExampleIndex.create }.to raise_error(
|
101
|
+
ElasticSearchFramework::Exceptions::IndexError,
|
102
|
+
'[Class] - Invalid Index description specified.'
|
103
|
+
)
|
104
|
+
end
|
58
105
|
end
|
59
|
-
|
60
|
-
|
106
|
+
|
107
|
+
context 'when index is valid but already exists' do
|
108
|
+
before { ExampleIndex.delete if ExampleIndex.exists? }
|
109
|
+
|
110
|
+
it 'does not try to create a new index' do
|
111
|
+
allow(ExampleIndex).to receive(:exists?).and_return(true)
|
112
|
+
expect(ExampleIndex).not_to receive(:put)
|
113
|
+
ExampleIndex.create
|
114
|
+
end
|
61
115
|
end
|
62
116
|
end
|
63
117
|
|
@@ -94,6 +148,48 @@ RSpec.describe ElasticSearchFramework::Index do
|
|
94
148
|
end
|
95
149
|
end
|
96
150
|
|
151
|
+
describe '#put' do
|
152
|
+
let(:payload) { {} }
|
153
|
+
context 'when there is a valid response' do
|
154
|
+
before { allow(ExampleIndex).to receive(:is_valid_response?).and_return(true) }
|
155
|
+
|
156
|
+
it 'returns true' do
|
157
|
+
ExampleIndex.create
|
158
|
+
expect(ExampleIndex.put(payload: payload)).to eq true
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
context 'when there is not a valid response' do
|
163
|
+
before { allow(ExampleIndex).to receive(:is_valid_response?).and_return(false) }
|
164
|
+
|
165
|
+
context 'when the error is "index_already_exists_exception"' do
|
166
|
+
let(:response_body) { { error: { root_cause: [{ type: 'index_already_exists_exception' }] } } }
|
167
|
+
let(:request) { double }
|
168
|
+
|
169
|
+
before { ExampleIndex.delete if ExampleIndex.exists? }
|
170
|
+
it 'returns true' do
|
171
|
+
allow(request).to receive(:body).and_return(response_body.to_json)
|
172
|
+
allow(request).to receive(:code).and_return(404)
|
173
|
+
allow_any_instance_of(Net::HTTP).to receive(:request).and_return(request)
|
174
|
+
expect(ExampleIndex.put(payload: payload)).to eq true
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
context 'when the error is not "index_already_exists_exception"' do
|
179
|
+
let(:response_body) { { error: { root_cause: [{ type: 'foo' }] } } }
|
180
|
+
let(:request) { double }
|
181
|
+
it 'raises an IndexError' do
|
182
|
+
allow(request).to receive(:body).and_return(response_body.to_json)
|
183
|
+
allow(request).to receive(:code).and_return(404)
|
184
|
+
allow_any_instance_of(Net::HTTP).to receive(:request).and_return(request)
|
185
|
+
expect { ExampleIndex.put(payload: payload) }.to raise_error(
|
186
|
+
ElasticSearchFramework::Exceptions::IndexError
|
187
|
+
)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
97
193
|
describe '#is_valid_response?' do
|
98
194
|
let(:code) { 200 }
|
99
195
|
context 'when a 200 response code is returned' do
|
@@ -182,5 +278,4 @@ RSpec.describe ElasticSearchFramework::Index do
|
|
182
278
|
ExampleIndex.delete_item(id: id, type: type)
|
183
279
|
end
|
184
280
|
end
|
185
|
-
|
186
281
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: elastic_search_framework
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- vaughanbrittonsage
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-05-
|
11
|
+
date: 2018-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -149,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
149
149
|
version: '0'
|
150
150
|
requirements: []
|
151
151
|
rubyforge_project:
|
152
|
-
rubygems_version: 2.7.
|
152
|
+
rubygems_version: 2.7.7
|
153
153
|
signing_key:
|
154
154
|
specification_version: 4
|
155
155
|
summary: A lightweight framework to for working with elastic search.
|