logstash-filter-units 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 693aa67dfac7153254fb62cfdb716c9d108fb92c
4
- data.tar.gz: e10a3496e7c6ae1ce57972e3981be82776a20246
3
+ metadata.gz: 77351902d501e8d3ed2aff1d95be75078f4e6731
4
+ data.tar.gz: f8518e36bd0b3b9e4f70c03f18964f5debad93f7
5
5
  SHA512:
6
- metadata.gz: 714eec4b166ca567bf3c5440c752e01966cc1c09eb392e337d8094200dac7c98c4d8bbd53efe78284e51ddaf500fd6fbcde3e6064187391a6d3d2d48de650656
7
- data.tar.gz: d54019094055725ccb20cc9d5bc521b0c0a543e33862d38b81c48e78872e1e420efd46ddbbad6d94ce622e6b16adef49144b3452d7c45879d1530cada29912c2
6
+ metadata.gz: 797eec246d7f1b29e0e751a5fad410edbc1e89416233aaa926ae6ef26198977a799066190f8763bf6f6c7b45c69fc35ad9f62b1842768b345e3942484a7003a1
7
+ data.tar.gz: 1f36b803c1fc541cd54bd58c05ab2c7d757c6cf8972e4b1c7a277011843e5ee589df25717dd6a34670a7466b5ce781e286078dfb902a2a755646b13bf0be22c1
data/Gemfile CHANGED
@@ -1,12 +1,2 @@
1
1
  source 'http://rubygems.org'
2
- # gem 'treetop'
3
- # gem 'jrjackson'
4
- # gem 'stud'
5
- # gem 'clamp'
6
- # gem 'i18n'
7
- # gem 'filesize'
8
- # gem 'cabin'
9
- # gem 'rake'
10
- # gem 'unitwise'
11
- gem "logstash", :github => "elasticsearch/logstash", :branch => "1.5"
12
- gemspec
2
+ gemspec
@@ -3,278 +3,284 @@
3
3
  require "logstash/filters/base"
4
4
  require "logstash/namespace"
5
5
  require "unitwise"
6
+ # ------------------------------------------------------------------------------
6
7
 
7
8
  # The units filter is used for converting specified fields from one
8
9
  # unit of measure to another (or many others).
9
-
10
10
  class LogStash::Filters::Units < LogStash::Filters::Base
11
- config_name "units"
12
- milestone 1
13
-
14
- config(:fields, :validate => :array, :required => true)
15
- # The source fields to be converted
16
- # Fields may be specified in three different ways:
17
- # - Fields may be referenced specifically, by drilling
18
- # down the field hierarchy using the square bracket syntax. If
19
- # they are specified in this manner, then only the exact field
20
- # specified will be converted.
21
- # - Fields may also be specifed more generally simply by proving
22
- # the field name. If done this way, the given field will convert
23
- # any bottom level field of the same name.
24
- # - If provided a string rather than an array of fields, the field
25
- # provided will be converted in place rather then prepended with
26
- # additional fields.
27
- # Example:
28
- # [source,ruby]
29
- # filter {
30
- # units {
31
- # fields => ["top_level_field",
32
- # "bottom_level_field",
33
- # "[a][nested][field]"]
34
- # output_units => ["kilobyte", "megabyte"]
35
- # }
36
- # }
37
- # Example:
38
- # [source,ruby]
39
- # filter {
40
- # units {
41
- # fields => "in_place_conversion"
42
- # output_units => ["megabyte"]
43
- # }
44
- # }
11
+ config_name "units"
12
+ milestone 1
13
+
14
+ # The source fields to be converted
15
+ # Fields may be specified in three different ways:
16
+ # - Fields may be referenced specifically, by drilling
17
+ # down the field hierarchy using the square bracket syntax. If
18
+ # they are specified in this manner, then only the exact field
19
+ # specified will be converted.
20
+ # - Fields may also be specifed more generally simply by proving
21
+ # the field name. If done this way, the given field will convert
22
+ # any bottom level field of the same name.
23
+ # - If provided a string rather than an array of fields, the field
24
+ # provided will be converted in place rather then prepended with
25
+ # additional fields.
26
+ # Example:
27
+ # [source,ruby]
28
+ # filter {
29
+ # units {
30
+ # fields => ["top_level_field",
31
+ # "bottom_level_field",
32
+ # "[a][nested][field]"]
33
+ # output_units => ["kilobyte", "megabyte"]
34
+ # }
35
+ # }
36
+ # Example:
37
+ # [source,ruby]
38
+ # filter {
39
+ # units {
40
+ # fields => "in_place_conversion"
41
+ # output_units => ["megabyte"]
42
+ # }
43
+ # }
44
+ config(:fields, :validate => :array, :required => true)
45
+
45
46
 
46
- config(:input_unit, :validate => :string, :default => "byte")
47
- # The unit of measure of the source fields to be converted.
48
- # This parameter supports all units of measure specified by
49
- # the unitwise gem.
50
- # http://github.com/joshwlewis/unitwise
51
- # Example:
52
- # [source,ruby]
53
- # filter {
54
- # units {
55
- # fields => ["length", "height"]
56
- # input_unit => "millimeter"
57
- # output_units => ["centimeter", "meter"]
58
- # }
59
- # }
47
+ # The unit of measure of the source fields to be converted.
48
+ # This parameter supports all units of measure specified by
49
+ # the unitwise gem.
50
+ # http://github.com/joshwlewis/unitwise
51
+ # Example:
52
+ # [source,ruby]
53
+ # filter {
54
+ # units {
55
+ # fields => ["length", "height"]
56
+ # input_unit => "millimeter"
57
+ # output_units => ["centimeter", "meter"]
58
+ # }
59
+ # }
60
+ config(:input_unit, :validate => :string, :default => "byte")
60
61
 
61
- config(:output_units, :required => true)
62
- # The units of measure used for conversion.
63
- # This parameter supports all units of measure specified by
64
- # the unitwise gem.
65
- # http://github.com/joshwlewis/unitwise
66
- # By default, new fields will be named according to these units.
67
- # Example:
68
- # [source,ruby]
69
- # filter {
70
- # units {
71
- # fields => ["length", "height"]
72
- # input_unit => "millimeter"
73
- # output_units => ["centimeter", "meter"]
74
- # }
75
- # }
76
62
 
77
- config(:root_field, :validate => :string)
78
- # If specified, the fields generated by the filter will be
79
- # placed within a hierarchy mirroring that of the fields
80
- # listed within the fields parameter, which is itself nested
81
- # under the given root field.
82
- # For example, with this config:
83
- # [source,ruby]
84
- # filter {
85
- # units {
86
- # fields => ["c"]
87
- # input_unit => "byte"
88
- # output_units => ["kilobyte", "megabyte"]
89
- # root_field => "special"
90
- # }
91
- # }
92
- #
93
- # {
94
- # "a" => {
95
- # "b" => {
96
- # "c" => 1000000
97
- # }
98
- # }
99
- # }
100
- #
101
- # becomes
102
- #
103
- # {
104
- # "a" => {
105
- # "b" => {
106
- # "c" => 1000000
107
- # }
108
- # },
109
- # "special" => {
110
- # "a" => {
111
- # "b" => {
112
- # "c" => {
113
- # "kilobyte" => 1000,
114
- # "megabyte" => 1
115
- # }
116
- # }
117
- # }
118
- # }
119
- # }
63
+ # The units of measure used for conversion.
64
+ # This parameter supports all units of measure specified by
65
+ # the unitwise gem.
66
+ # http://github.com/joshwlewis/unitwise
67
+ # By default, new fields will be named according to these units.
68
+ # Example:
69
+ # [source,ruby]
70
+ # filter {
71
+ # units {
72
+ # fields => ["length", "height"]
73
+ # input_unit => "millimeter"
74
+ # output_units => ["centimeter", "meter"]
75
+ # }
76
+ # }
77
+ config(:output_units, :required => true)
120
78
 
121
- config(:rename_labels, :validate => :hash, :default => {})
122
- # Renames the resulting output fields according to a hash.
123
- # Keys should be the output fields and values should be their
124
- # desired names, respectively. Unamed fields will persist.
125
- # Example:
126
- # [source,ruby]
127
- # filter {
128
- # units {
129
- # fields => ["file_size"]
130
- # input_unit => "byte"
131
- # output_units => ["kilobyte", "megabyte"]
132
- # rename_labels => {
133
- # "kilobyte" => "kB"
134
- # "megabyte" => "mB"
135
- # }
136
- # }
137
- # }
79
+ # If specified, the fields generated by the filter will be
80
+ # placed within a hierarchy mirroring that of the fields
81
+ # listed within the fields parameter, which is itself nested
82
+ # under the given root field.
83
+ # For example, with this config:
84
+ # [source,ruby]
85
+ # filter {
86
+ # units {
87
+ # fields => ["c"]
88
+ # input_unit => "byte"
89
+ # output_units => ["kilobyte", "megabyte"]
90
+ # root_field => "special"
91
+ # }
92
+ # }
93
+ #
94
+ # {
95
+ # "a" => {
96
+ # "b" => {
97
+ # "c" => 1000000
98
+ # }
99
+ # }
100
+ # }
101
+ #
102
+ # becomes
103
+ #
104
+ # {
105
+ # "a" => {
106
+ # "b" => {
107
+ # "c" => 1000000
108
+ # }
109
+ # },
110
+ # "special" => {
111
+ # "a" => {
112
+ # "b" => {
113
+ # "c" => {
114
+ # "kilobyte" => 1000,
115
+ # "megabyte" => 1
116
+ # }
117
+ # }
118
+ # }
119
+ # }
120
+ # }
121
+ config(:root_field, :validate => :string)
138
122
 
139
- def initialize(*args)
140
- super(*args)
141
- end
123
+ # Renames the resulting output fields according to a hash.
124
+ # Keys should be the output fields and values should be their
125
+ # desired names, respectively. Unamed fields will persist.
126
+ # Example:
127
+ # [source,ruby]
128
+ # filter {
129
+ # units {
130
+ # fields => ["file_size"]
131
+ # input_unit => "byte"
132
+ # output_units => ["kilobyte", "megabyte"]
133
+ # rename_labels => {
134
+ # "kilobyte" => "kB"
135
+ # "megabyte" => "mB"
136
+ # }
137
+ # }
138
+ # }
139
+ config(:rename_labels, :validate => :hash, :default => {})
140
+ # ----------------------------------------------------------------------------
142
141
 
143
- public
144
- def register()
145
- end
142
+ def initialize(*args)
143
+ super(*args)
144
+ end
146
145
 
147
- private
148
- def nested_hash_to_matrix(data)
149
- @sep = '.'
150
- @output = []
151
- def _nested_hash_to_matrix(data, name)
152
- data.each do |key, val|
153
- new_key = name + @sep + key.to_s
154
- if val.is_a?(Hash) and val != {}
155
- _nested_hash_to_matrix(val, new_key)
156
- else
157
- @output.push([new_key, val])
158
- end
159
- end
160
- return @output
161
- end
146
+ public
147
+ def register()
148
+ end
149
+ # ----------------------------------------------------------------------------
150
+
151
+ private
152
+ def nested_hash_to_matrix(data)
153
+ @sep = '.'
154
+ @output = []
155
+ def _nested_hash_to_matrix(data, name)
156
+ data.each do |key, val|
157
+ new_key = name + @sep + key.to_s
158
+ if val.is_a?(Hash) and val != {}
159
+ _nested_hash_to_matrix(val, new_key)
160
+ else
161
+ @output.push([new_key, val])
162
+ end
163
+ end
164
+ return @output
165
+ end
162
166
 
163
- @output = _nested_hash_to_matrix(data, @sep)
164
- @output = @output.map { |key, val| [key.split('.')[2..-1], val] }
165
- return @output
166
- end
167
+ @output = _nested_hash_to_matrix(data, @sep)
168
+ @output = @output.map { |key, val| [key.split('.')[2..-1], val] }
169
+ return @output
170
+ end
167
171
 
168
- private
169
- def matrix_to_nested_hash(data)
170
- output = {}
171
- data.each do |keys, value|
172
- cursor = output
173
- for key in keys[0..-2]
174
- if !cursor.include?(key)
175
- cursor[key] = {}
176
- cursor = cursor[key]
177
- else
178
- cursor = cursor[key]
179
- end
180
- end
181
- cursor[keys[-1]] = value
182
- end
183
- return output
184
- end
172
+ private
173
+ def matrix_to_nested_hash(data)
174
+ output = {}
175
+ data.each do |keys, value|
176
+ cursor = output
177
+ for key in keys[0..-2]
178
+ if !cursor.include?(key)
179
+ cursor[key] = {}
180
+ cursor = cursor[key]
181
+ else
182
+ cursor = cursor[key]
183
+ end
184
+ end
185
+ cursor[keys[-1]] = value
186
+ end
187
+ return output
188
+ end
189
+ # ----------------------------------------------------------------------------
185
190
 
186
- private
187
- def convert_to_dict(value)
188
- # convert a single value to a hash of converted values
189
- output = {}
190
- for output_unit in @output_units do
191
- output_value = convert(value, output_unit)
192
- if @rename_labels.include?(output_unit)
193
- output_unit = @rename_labels[output_unit]
194
- end
195
- output[output_unit] = output_value
196
- end
197
- return output
198
- end
191
+ private
192
+ def convert_to_dict(value)
193
+ # convert a single value to a hash of converted values
194
+ output = {}
195
+ for output_unit in @output_units do
196
+ output_value = convert(value, output_unit)
197
+ if @rename_labels.include?(output_unit)
198
+ output_unit = @rename_labels[output_unit]
199
+ end
200
+ output[output_unit] = output_value
201
+ end
202
+ return output
203
+ end
199
204
 
200
- private
201
- def convert(value, output_unit)
202
- begin
203
- return output_value = Unitwise(value, @input_unit).convert_to(output_unit).value
204
- rescue Exception
205
- raise StandardError
206
- end
207
- end
205
+ private
206
+ def convert(value, output_unit)
207
+ begin
208
+ return output_value = Unitwise(value, @input_unit).convert_to(output_unit).value
209
+ rescue Exception
210
+ raise StandardError
211
+ end
212
+ end
208
213
 
209
- private
210
- def field_handler(fields)
211
- output = {"exact" => [], "partial" => []}
212
- for field in fields
213
- if /\[|\]/.match(field)
214
- temp = field.split(/\]\[|^\[|\]$/)[1..-1]
215
- output["exact"].push(temp)
216
- else
217
- output["partial"].push(field)
218
- end
219
- end
220
- return output
221
- end
214
+ private
215
+ def field_handler(fields)
216
+ output = {"exact" => [], "partial" => []}
217
+ for field in fields
218
+ if /\[|\]/.match(field)
219
+ temp = field.split(/\]\[|^\[|\]$/)[1..-1]
220
+ output["exact"].push(temp)
221
+ else
222
+ output["partial"].push(field)
223
+ end
224
+ end
225
+ return output
226
+ end
227
+ # ----------------------------------------------------------------------------
222
228
 
223
- public
224
- def filter(event)
225
- return unless filter?(event)
226
- begin
227
- # flag for converting a value in place or expanding it into
228
- # a hash
229
- inplace = @output_units.is_a?(String)
230
- matrix = nested_hash_to_matrix(event.to_hash)
229
+ public
230
+ def filter(event)
231
+ return unless filter?(event)
232
+ begin
233
+ # flag for converting a value in place or expanding it into
234
+ # a hash
235
+ inplace = @output_units.is_a?(String)
236
+ matrix = nested_hash_to_matrix(event.to_hash)
231
237
 
232
- # convert matching fields and remove rows that
233
- # do not contain leaf nodes that match @fields
234
- fields = field_handler(@fields)
235
- del = []
236
- matrix.each do |row|
237
- if fields["exact"].include?(row[0])
238
- if inplace
239
- row[1] = convert(row[1], @output_units)
240
- else
241
- row[1] = convert_to_dict(row[1])
242
- end
243
- elsif fields["partial"].include?(row[0][-1])
244
- if inplace
245
- row[1] = convert(row[1], @output_units)
246
- else
247
- row[1] = convert_to_dict(row[1])
248
- end
249
- else
250
- del.push(row)
251
- end
252
- end
253
- # delete all rows that do not have leaf nodes listed
254
- # in fields
255
- for row in del
256
- matrix.delete(row)
257
- end
258
-
259
- new_hash = matrix_to_nested_hash(matrix)
260
- if @root_field
261
- new_hash = {@root_field => new_hash}
262
- end
238
+ # convert matching fields and remove rows that
239
+ # do not contain leaf nodes that match @fields
240
+ fields = field_handler(@fields)
241
+ del = []
242
+ matrix.each do |row|
243
+ if fields["exact"].include?(row[0])
244
+ if inplace
245
+ row[1] = convert(row[1], @output_units)
246
+ else
247
+ row[1] = convert_to_dict(row[1])
248
+ end
249
+ elsif fields["partial"].include?(row[0][-1])
250
+ if inplace
251
+ row[1] = convert(row[1], @output_units)
252
+ else
253
+ row[1] = convert_to_dict(row[1])
254
+ end
255
+ else
256
+ del.push(row)
257
+ end
258
+ end
259
+ # delete all rows that do not have leaf nodes listed
260
+ # in fields
261
+ for row in del
262
+ matrix.delete(row)
263
+ end
264
+
265
+ new_hash = matrix_to_nested_hash(matrix)
266
+ if @root_field
267
+ new_hash = {@root_field => new_hash}
268
+ end
263
269
 
264
- # merge new hash into event's hash
265
- # assignment of items from new_hash with a prior merge
266
- # will destroy unmatched branches
267
- data = event.to_hash().merge(new_hash)
268
- data.each do |key, value|
269
- event[key] = value
270
- end
271
- return filter_matched(event)
272
- rescue StandardError
273
- event.tag("_unitsparsefailure")
274
- return event
275
- rescue Logstash::ShutdownSignal
276
- event.cancel()
277
- @logger.debug(e)
278
- end
279
- end
270
+ # merge new hash into event's hash
271
+ # assignment of items from new_hash with a prior merge
272
+ # will destroy unmatched branches
273
+ data = event.to_hash().merge(new_hash)
274
+ data.each do |key, value|
275
+ event[key] = value
276
+ end
277
+ return filter_matched(event)
278
+ rescue StandardError
279
+ event.tag("_unitsparsefailure")
280
+ return event
281
+ rescue Logstash::ShutdownSignal
282
+ event.cancel()
283
+ @logger.debug(e)
284
+ end
285
+ end
280
286
  end
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
 
3
3
  s.name = 'logstash-filter-units'
4
- s.version = '0.1.0'
4
+ s.version = '0.1.1'
5
5
  s.licenses = ['Apache License (2.0)']
6
6
  s.summary = "A filter for performing unit conversions on specified fields."
7
7
  s.description = "The units filter is used for converting specified fields from one unit of measure to another (or many others)."
@@ -21,6 +21,7 @@ Gem::Specification.new do |s|
21
21
 
22
22
  # Gem dependencies
23
23
  s.add_runtime_dependency "logstash", '>= 1.4.0', '< 2.0.0'
24
- s.add_runtime_dependency "unitwise", ">= 1.0.4"
24
+ s.add_runtime_dependency "unitwise"
25
25
  s.add_development_dependency "logstash-devutils"
26
+
26
27
  end
@@ -3,73 +3,73 @@ require "logstash/devutils/rspec/spec_helper"
3
3
  require "logstash/filters/units"
4
4
 
5
5
  describe LogStash::Filters::Units do
6
- describe "special field" do
7
- let(:config) do <<-CONFIG
8
- filter {
9
- units {
10
- fields => ["[a1][a2]", "b1", "c1", "d2"]
11
- input_unit => "byte"
12
- output_units => ["kibibyte", "mebibyte"]
13
- root_field => "special"
14
- rename_labels => {
15
- "kibibyte" => "kb"
16
- "mebibyte" => "mb"
17
- }
18
- }
19
- }
20
- CONFIG
21
- end
6
+ describe "special field" do
7
+ let(:config) do <<-CONFIG
8
+ filter {
9
+ units {
10
+ fields => ["[a1][a2]", "b1", "c1", "d2"]
11
+ input_unit => "byte"
12
+ output_units => ["kibibyte", "mebibyte"]
13
+ root_field => "special"
14
+ rename_labels => {
15
+ "kibibyte" => "kb"
16
+ "mebibyte" => "mb"
17
+ }
18
+ }
19
+ }
20
+ CONFIG
21
+ end
22
22
 
23
- event = {
24
- "a1" => {
25
- "a2" => 1024
26
- },
27
- "b1" => 1024,
28
- "c1" => 1024,
29
- "d1" => {
30
- "d2" => 1024
31
- }
32
- }
33
- sample(event) do
34
- insist { subject["special"]["a1"]["a2"]["kb"] } == 1
35
- insist { subject["special"]["a1"]["a2"]["kb"] } == 1
36
- insist { subject["special"]["b1"]["kb"] } == 1
37
- insist { subject["special"]["c1"]["kb"] } == 1
38
- insist { subject["special"]["d1"]["d2"]["kb"] } == 1
39
- end
40
- end
23
+ event = {
24
+ "a1" => {
25
+ "a2" => 1024
26
+ },
27
+ "b1" => 1024,
28
+ "c1" => 1024,
29
+ "d1" => {
30
+ "d2" => 1024
31
+ }
32
+ }
33
+ sample(event) do
34
+ insist { subject["special"]["a1"]["a2"]["kb"] } == 1
35
+ insist { subject["special"]["a1"]["a2"]["kb"] } == 1
36
+ insist { subject["special"]["b1"]["kb"] } == 1
37
+ insist { subject["special"]["c1"]["kb"] } == 1
38
+ insist { subject["special"]["d1"]["d2"]["kb"] } == 1
39
+ end
40
+ end
41
41
 
42
- describe "in place" do
43
- let(:config) do <<-CONFIG
44
- filter {
45
- units {
46
- fields => ["[a1][a2]", "b1", "c1", "d2"]
47
- input_unit => "byte"
48
- output_units => ["kibibyte", "mebibyte"]
49
- rename_labels => {
50
- "kibibyte" => "kb"
51
- "mebibyte" => "mb"
52
- }
53
- }
54
- }
55
- CONFIG
56
- end
42
+ describe "in place" do
43
+ let(:config) do <<-CONFIG
44
+ filter {
45
+ units {
46
+ fields => ["[a1][a2]", "b1", "c1", "d2"]
47
+ input_unit => "byte"
48
+ output_units => ["kibibyte", "mebibyte"]
49
+ rename_labels => {
50
+ "kibibyte" => "kb"
51
+ "mebibyte" => "mb"
52
+ }
53
+ }
54
+ }
55
+ CONFIG
56
+ end
57
57
 
58
- event = {
59
- "a1" => {
60
- "a2" => 1024**2
61
- },
62
- "b1" => 1024**2,
63
- "c1" => 1024**2,
64
- "d1" => {
65
- "d2" => 1024**2
66
- }
67
- }
68
- sample(event) do
69
- insist { subject["a1"]["a2"]["mb"] } == 1
70
- insist { subject["b1"]["mb"] } == 1
71
- insist { subject["c1"]["mb"] } == 1
72
- insist { subject["d1"]["d2"]["mb"] } == 1
73
- end
74
- end
58
+ event = {
59
+ "a1" => {
60
+ "a2" => 1024**2
61
+ },
62
+ "b1" => 1024**2,
63
+ "c1" => 1024**2,
64
+ "d1" => {
65
+ "d2" => 1024**2
66
+ }
67
+ }
68
+ sample(event) do
69
+ insist { subject["a1"]["a2"]["mb"] } == 1
70
+ insist { subject["b1"]["mb"] } == 1
71
+ insist { subject["c1"]["mb"] } == 1
72
+ insist { subject["d1"]["d2"]["mb"] } == 1
73
+ end
74
+ end
75
75
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-filter-units
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Braun
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-16 00:00:00.000000000 Z
11
+ date: 2015-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logstash
@@ -36,12 +36,12 @@ dependencies:
36
36
  requirements:
37
37
  - - '>='
38
38
  - !ruby/object:Gem::Version
39
- version: 1.0.4
39
+ version: '0'
40
40
  requirement: !ruby/object:Gem::Requirement
41
41
  requirements:
42
42
  - - '>='
43
43
  - !ruby/object:Gem::Version
44
- version: 1.0.4
44
+ version: '0'
45
45
  prerelease: false
46
46
  type: :runtime
47
47
  - !ruby/object:Gem::Dependency