elasticsearch-extensions 0.0.15 → 0.0.16

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NzFhMWNhNDFlNjBmMjcxMzAyMTVlZDRkZWFlYjI2NzkzNzc0NjE2Nw==
5
- data.tar.gz: !binary |-
6
- NDU0NzFlZjRjYjU1M2RlZDdkNGUxMzMyYmUxMzc2MzhlYWExODdmNw==
2
+ SHA1:
3
+ metadata.gz: b3a84e8764023e5bf5d1ea21d93308eb3bfeafa0
4
+ data.tar.gz: 49f72a1364a104f0fbbe8fcf6a4986e4dd88121f
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- NDNjNDdmN2E4ZjZhZDdjYzkxZDJjYTZlMThkOWYwZDQyODM2ZjhmZTllMTI2
10
- NTgwMjllZjNhOTYzNGZiODg4YWNkODMzZjIyNDVkMGQyNTJkZTFiNTY1NTVi
11
- NGQ2NDY4NTI2YjQyZjQxYzU1Y2JkM2E5ODZiNTUyMzRjZjQ4YTE=
12
- data.tar.gz: !binary |-
13
- N2JjZWE5NmJjYTk3YzU4YWQ3ODUwN2NjZDQ2Njg4MmM0NzQ4ODMwNTkxZDQ2
14
- NmNiNTc0ODQ1OTNlMGQwZTIyNDQwNGI0ZWJmZjFjYmYzYWUzOWVmNzFjNWQ1
15
- NzJmMDljNjk2NjExNGIwZmMzNDk2MGNjNTE1YjkzNjNjYWNhNTg=
6
+ metadata.gz: 7ac3d9463af301fbb315573d56217d6c1973d9f3e53a15544acaccaf51fe50ac3167583c255182e2176ea98fe2e56f3da4e1981f443ea653c144ebbb10c074b5
7
+ data.tar.gz: a9834e293e11e73a624978e16ec2a14b7ca540e0e0a04d33e9ac511f991508105cf6cd8e2c39dc6aa93d10a4322a50f749f750d500a6810d8ad05cdc653d886f
data/README.md CHANGED
@@ -161,6 +161,22 @@ or install it from a source code checkout:
161
161
  bundle install
162
162
  rake install
163
163
 
164
+ ## Development
165
+
166
+ To work on the code, clone and bootstrap the main repository first --
167
+ please see instructions in the main [README](../README.md#development).
168
+
169
+ To run tests, launch a testing cluster -- again, see instructions
170
+ in the main [README](../README.md#development) -- and use the Rake tasks:
171
+
172
+ ```
173
+ time rake test:unit
174
+ time rake test:integration
175
+ ```
176
+
177
+ Unit tests have to use Ruby 1.8 compatible syntax, integration tests
178
+ can use Ruby 2.x syntax and features.
179
+
164
180
  ## License
165
181
 
166
182
  This software is licensed under the Apache 2 license, quoted below.
@@ -38,7 +38,8 @@ Gem::Specification.new do |s|
38
38
  s.add_development_dependency "mocha"
39
39
  s.add_development_dependency "turn"
40
40
  s.add_development_dependency "yard"
41
- s.add_development_dependency "ci_reporter"
41
+ s.add_development_dependency "pry"
42
+ s.add_development_dependency "ci_reporter", "~> 1.9"
42
43
 
43
44
  if defined?(RUBY_VERSION) && RUBY_VERSION < '1.9'
44
45
  s.add_development_dependency "json"
@@ -49,4 +50,9 @@ Gem::Specification.new do |s|
49
50
  s.add_development_dependency "simplecov-rcov"
50
51
  s.add_development_dependency "cane"
51
52
  end
53
+
54
+ # Gems for testing integrations
55
+ s.add_development_dependency "backup", '~> 4'
56
+ s.add_development_dependency "patron"
57
+ s.add_development_dependency "oj"
52
58
  end
@@ -0,0 +1,142 @@
1
+ # encoding: utf-8
2
+
3
+ require 'pathname'
4
+ require 'fileutils'
5
+
6
+ require 'multi_json'
7
+ require 'oj'
8
+
9
+ require 'elasticsearch'
10
+ require 'patron'
11
+
12
+ module Backup
13
+ module Database
14
+
15
+ # Integration with the Backup gem [https://github.com/meskyanichi/backup/]
16
+ #
17
+ # This extension allows to backup Elasticsearch indices as flat JSON files on the disk.
18
+ #
19
+ # Use the Backup gem's DSL to configure the backup:
20
+ #
21
+ # require 'elasticsearch/extensions/backup'
22
+ #
23
+ # Model.new(:elasticsearch_backup, 'Elasticsearch') do
24
+ #
25
+ # database Elasticsearch do |db|
26
+ # # db.url = 'http://localhost:9200'
27
+ # # db.indices = 'articles,people'
28
+ # # db.size = 500
29
+ # # db.scroll = '10m'
30
+ # end
31
+ #
32
+ # store_with Local do |local|
33
+ # local.path = '/usr/local/var/backups'
34
+ # local.keep = 3
35
+ # end
36
+ #
37
+ # compress_with Gzip
38
+ # end
39
+ #
40
+ # Perform the backup with the Backup gem's command line utility:
41
+ #
42
+ # $ backup perform -t elasticsearch_backup
43
+ #
44
+ #
45
+ # A simple recover script could look like this:
46
+ #
47
+ # PATH = '/path/to/backup/'
48
+ #
49
+ # require 'elasticsearch'
50
+ # client = Elasticsearch::Client.new log: true
51
+ # payload = []
52
+ #
53
+ # Dir[ File.join( PATH, '**', '*.json' ) ].each do |file|
54
+ # document = MultiJson.load(File.read(file))
55
+ # item = document.merge(data: document['_source'])
56
+ # document.delete('_source')
57
+ # document.delete('_score')
58
+ #
59
+ # payload << { index: item }
60
+ #
61
+ # if payload.size == 100
62
+ # client.bulk body: payload
63
+ # payload = []
64
+ # end
65
+ #
66
+ # client.bulk body: payload
67
+ # end
68
+ #
69
+ # @see http://meskyanichi.github.io/backup/v4/
70
+ #
71
+ class Elasticsearch < Base
72
+ class Error < ::Backup::Error; end
73
+
74
+ attr_accessor :url,
75
+ :indices,
76
+ :size,
77
+ :scroll
78
+
79
+ attr_accessor :mode
80
+
81
+ def initialize(model, database_id = nil, &block)
82
+ super
83
+
84
+ @url ||= 'http://localhost:9200'
85
+ @indices ||= '_all'
86
+ @size ||= 100
87
+ @scroll ||= '10m'
88
+ @mode ||= 'single'
89
+
90
+ instance_eval(&block) if block_given?
91
+ end
92
+
93
+ def perform!
94
+ super
95
+
96
+ case mode
97
+ when 'single'
98
+ __perform_single
99
+ else
100
+ raise Error, "Unsupported mode [#{mode}]"
101
+ end
102
+
103
+ log!(:finished)
104
+ end
105
+
106
+ def client
107
+ @client ||= ::Elasticsearch::Client.new url: url, logger: logger
108
+ end
109
+
110
+ def path
111
+ Pathname.new File.join(dump_path , dump_filename.downcase)
112
+ end
113
+
114
+ def logger
115
+ logger = Backup::Logger.__send__(:logger)
116
+ logger.instance_eval do
117
+ def debug(*args);end
118
+ # alias :debug :info
119
+ alias :fatal :warn
120
+ end
121
+ logger
122
+ end
123
+
124
+
125
+ def __perform_single
126
+ r = client.search index: indices, search_type: 'scan', scroll: scroll, size: size
127
+ raise Error, "No scroll_id returned in response:\n#{r.inspect}" unless r['_scroll_id']
128
+
129
+ while r = client.scroll(scroll_id: r['_scroll_id'], scroll: scroll) and not r['hits']['hits'].empty? do
130
+ r['hits']['hits'].each do |hit|
131
+ FileUtils.mkdir_p "#{path.join hit['_index'], hit['_type']}"
132
+ File.open("#{path.join hit['_index'], hit['_type'], hit['_id']}.json", 'w') do |file|
133
+ file.write MultiJson.dump(hit)
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
141
+
142
+ ::Backup::Config::DSL::Elasticsearch = ::Backup::Database::Elasticsearch
@@ -76,7 +76,7 @@ module Elasticsearch
76
76
  arguments[:es_params] ||= ENV['TEST_CLUSTER_PARAMS'] || ''
77
77
  arguments[:path_work] ||= '/tmp'
78
78
  arguments[:node_name] ||= 'node'
79
- arguments[:timeout] ||= 30
79
+ arguments[:timeout] ||= (ENV['TEST_CLUSTER_TIMEOUT'] || 30).to_i
80
80
 
81
81
  if running? :on => arguments[:port], :as => arguments[:cluster_name]
82
82
  print "[!] Elasticsearch cluster already running".ansi(:red)
@@ -102,11 +102,13 @@ module Elasticsearch
102
102
  -D es.index.store.type=#{arguments[:index_store]} \
103
103
  -D es.path.data=#{arguments[:path_data]} \
104
104
  -D es.path.work=#{arguments[:path_work]} \
105
+ -D es.cluster.routing.allocation.disk.threshold_enabled=false \
105
106
  -D es.network.host=0.0.0.0 \
106
107
  -D es.discovery.zen.ping.multicast.enabled=true \
107
108
  -D es.script.disable_dynamic=false \
108
109
  -D es.node.test=true \
109
110
  -D es.node.bench=true \
111
+ -D es.logger.level=DEBUG \
110
112
  #{arguments[:es_params]} \
111
113
  > /dev/null
112
114
  COMMAND
@@ -1,5 +1,5 @@
1
1
  module Elasticsearch
2
2
  module Extensions
3
- VERSION = "0.0.15"
3
+ VERSION = "0.0.16"
4
4
  end
5
5
  end
@@ -0,0 +1,75 @@
1
+ require 'test_helper'
2
+
3
+ require 'backup'
4
+
5
+ require 'elasticsearch/extensions/backup'
6
+
7
+ class Elasticsearch::Extensions::BackupTest < Test::Unit::TestCase
8
+ context "The Backup gem extension" do
9
+ setup do
10
+ @model = ::Backup::Model.new(:test_trigger, 'test label')
11
+ @subject = ::Backup::Database::Elasticsearch.new(@model)
12
+ end
13
+
14
+ should "have a client" do
15
+ assert_instance_of Elasticsearch::Transport::Client, @subject.client
16
+ end
17
+
18
+ should "have a path" do
19
+ assert_instance_of Pathname, @subject.path
20
+ end
21
+
22
+ should "have defaults" do
23
+ assert_equal 'http://localhost:9200', @subject.url
24
+ assert_equal '_all', @subject.indices
25
+ end
26
+
27
+ should "be configurable" do
28
+ @subject = ::Backup::Database::Elasticsearch.new(@model) do |db|
29
+ db.url = 'https://example.com'
30
+ db.indices = 'foo,bar'
31
+ end
32
+
33
+ assert_equal 'https://example.com', @subject.url
34
+ assert_equal 'foo,bar', @subject.indices
35
+
36
+ assert_equal 'example.com', @subject.client.transport.connections.first.host[:host]
37
+ end
38
+
39
+ should "perform the backup" do
40
+ @subject.expects(:__perform_single)
41
+ @subject.perform!
42
+ end
43
+
44
+ should "raise an expection for an unsupported type of backup" do
45
+ @subject = ::Backup::Database::Elasticsearch.new(@model) { |db| db.mode = 'foobar' }
46
+ assert_raise ::Backup::Database::Elasticsearch::Error do
47
+ @subject.perform!
48
+ end
49
+ end
50
+
51
+ should "scan and scroll the index" do
52
+ @subject = ::Backup::Database::Elasticsearch.new(@model) { |db| db.indices = 'test' }
53
+
54
+ @subject.client
55
+ .expects(:search)
56
+ .with do |params|
57
+ assert_equal 'test', params[:index]
58
+ end
59
+ .returns({"_scroll_id" => "abc123"})
60
+
61
+ @subject.client
62
+ .expects(:scroll)
63
+ .twice
64
+ .returns({"_scroll_id" => "def456",
65
+ "hits" => { "hits" => [ {"_index"=>"test", "_type"=>"doc", "_id"=>"1", "_source"=>{"title"=>"Test"}} ] }
66
+ })
67
+ .then
68
+ .returns({"_scroll_id" => "ghi789",
69
+ "hits" => { "hits" => [] }
70
+ })
71
+
72
+ @subject.__perform_single
73
+ end
74
+ end
75
+ end
metadata CHANGED
@@ -1,209 +1,265 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elasticsearch-extensions
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.15
4
+ version: 0.0.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Karel Minarik
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-22 00:00:00.000000000 Z
11
+ date: 2014-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ansi
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ! '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '4.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '4.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: ruby-prof
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ! '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ! '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: bundler
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ! '>'
59
+ - - ">"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '1'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ! '>'
66
+ - - ">"
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ! '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ! '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: awesome_print
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ! '>='
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ! '>='
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: shoulda-context
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - ! '>='
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - ! '>='
108
+ - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: mocha
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - ! '>='
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - ! '>='
122
+ - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: turn
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ! '>='
129
+ - - ">="
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - ! '>='
136
+ - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: yard
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - ! '>='
143
+ - - ">="
144
144
  - !ruby/object:Gem::Version
145
145
  version: '0'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - ! '>='
150
+ - - ">="
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
153
  - !ruby/object:Gem::Dependency
154
- name: ci_reporter
154
+ name: pry
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
- - - ! '>='
157
+ - - ">="
158
158
  - !ruby/object:Gem::Version
159
159
  version: '0'
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
- - - ! '>='
164
+ - - ">="
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: ci_reporter
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '1.9'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '1.9'
167
181
  - !ruby/object:Gem::Dependency
168
182
  name: simplecov
169
183
  requirement: !ruby/object:Gem::Requirement
170
184
  requirements:
171
- - - ! '>='
185
+ - - ">="
172
186
  - !ruby/object:Gem::Version
173
187
  version: '0'
174
188
  type: :development
175
189
  prerelease: false
176
190
  version_requirements: !ruby/object:Gem::Requirement
177
191
  requirements:
178
- - - ! '>='
192
+ - - ">="
179
193
  - !ruby/object:Gem::Version
180
194
  version: '0'
181
195
  - !ruby/object:Gem::Dependency
182
196
  name: simplecov-rcov
183
197
  requirement: !ruby/object:Gem::Requirement
184
198
  requirements:
185
- - - ! '>='
199
+ - - ">="
186
200
  - !ruby/object:Gem::Version
187
201
  version: '0'
188
202
  type: :development
189
203
  prerelease: false
190
204
  version_requirements: !ruby/object:Gem::Requirement
191
205
  requirements:
192
- - - ! '>='
206
+ - - ">="
193
207
  - !ruby/object:Gem::Version
194
208
  version: '0'
195
209
  - !ruby/object:Gem::Dependency
196
210
  name: cane
197
211
  requirement: !ruby/object:Gem::Requirement
198
212
  requirements:
199
- - - ! '>='
213
+ - - ">="
214
+ - !ruby/object:Gem::Version
215
+ version: '0'
216
+ type: :development
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: '0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: backup
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '4'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '4'
237
+ - !ruby/object:Gem::Dependency
238
+ name: patron
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
251
+ - !ruby/object:Gem::Dependency
252
+ name: oj
253
+ requirement: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ">="
200
256
  - !ruby/object:Gem::Version
201
257
  version: '0'
202
258
  type: :development
203
259
  prerelease: false
204
260
  version_requirements: !ruby/object:Gem::Requirement
205
261
  requirements:
206
- - - ! '>='
262
+ - - ">="
207
263
  - !ruby/object:Gem::Version
208
264
  version: '0'
209
265
  description: Extensions for the Elasticsearch Rubygem
@@ -213,7 +269,7 @@ executables: []
213
269
  extensions: []
214
270
  extra_rdoc_files: []
215
271
  files:
216
- - .gitignore
272
+ - ".gitignore"
217
273
  - Gemfile
218
274
  - LICENSE.txt
219
275
  - README.md
@@ -225,12 +281,14 @@ files:
225
281
  - lib/elasticsearch/extensions/ansi/actions.rb
226
282
  - lib/elasticsearch/extensions/ansi/helpers.rb
227
283
  - lib/elasticsearch/extensions/ansi/response.rb
284
+ - lib/elasticsearch/extensions/backup.rb
228
285
  - lib/elasticsearch/extensions/test/cluster.rb
229
286
  - lib/elasticsearch/extensions/test/cluster/tasks.rb
230
287
  - lib/elasticsearch/extensions/test/profiling.rb
231
288
  - lib/elasticsearch/extensions/test/startup_shutdown.rb
232
289
  - lib/elasticsearch/extensions/version.rb
233
290
  - test/ansi/unit/ansi_test.rb
291
+ - test/backup/unit/backup_test.rb
234
292
  - test/test_helper.rb
235
293
  homepage: ''
236
294
  licenses:
@@ -242,12 +300,12 @@ require_paths:
242
300
  - lib
243
301
  required_ruby_version: !ruby/object:Gem::Requirement
244
302
  requirements:
245
- - - ! '>='
303
+ - - ">="
246
304
  - !ruby/object:Gem::Version
247
305
  version: '0'
248
306
  required_rubygems_version: !ruby/object:Gem::Requirement
249
307
  requirements:
250
- - - ! '>='
308
+ - - ">="
251
309
  - !ruby/object:Gem::Version
252
310
  version: '0'
253
311
  requirements: []
@@ -258,5 +316,6 @@ specification_version: 4
258
316
  summary: Extensions for the Elasticsearch Rubygem
259
317
  test_files:
260
318
  - test/ansi/unit/ansi_test.rb
319
+ - test/backup/unit/backup_test.rb
261
320
  - test/test_helper.rb
262
321
  has_rdoc: