fluentd 0.10.24 → 0.10.25
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of fluentd might be problematic. Click here for more details.
- data/ChangeLog +8 -0
- data/VERSION +1 -1
- data/lib/fluent/engine.rb +10 -6
- data/lib/fluent/plugin/in_tail.rb +1 -1
- data/lib/fluent/plugin/out_exec_filter.rb +68 -20
- data/lib/fluent/plugin/out_roundrobin.rb +32 -4
- data/lib/fluent/version.rb +1 -1
- data/test/plugin/in_tail.rb +29 -1
- data/test/plugin/out_exec_filter.rb +13 -2
- data/test/plugin/out_roundrobin.rb +62 -4
- metadata +66 -21
data/ChangeLog
CHANGED
@@ -1,4 +1,12 @@
|
|
1
1
|
|
2
|
+
Release 0.10.25 - 2012/07/23
|
3
|
+
|
4
|
+
* shutdown won't block
|
5
|
+
* out_exec_filter supports 'child_respawn' option
|
6
|
+
* in_tail doesn't remove whitespaces
|
7
|
+
* out_roundrobin supports 'weight' option
|
8
|
+
|
9
|
+
|
2
10
|
Release 0.10.24 - 2012/06/28
|
3
11
|
|
4
12
|
* TextParser/in_tail: supports 'tsv' and 'csv' preset formats
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.10.
|
1
|
+
0.10.25
|
data/lib/fluent/engine.rb
CHANGED
@@ -174,13 +174,17 @@ class EngineClass
|
|
174
174
|
end
|
175
175
|
|
176
176
|
def shutdown
|
177
|
-
@started.
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
177
|
+
@started.map {|s|
|
178
|
+
Thread.new do
|
179
|
+
begin
|
180
|
+
s.shutdown
|
181
|
+
rescue
|
182
|
+
$log.warn "unexpected error while shutting down", :error=>$!.to_s
|
183
|
+
$log.warn_backtrace
|
184
|
+
end
|
183
185
|
end
|
186
|
+
}.each {|t|
|
187
|
+
t.join
|
184
188
|
}
|
185
189
|
end
|
186
190
|
|
@@ -68,6 +68,9 @@ class ExecFilterOutput < BufferedOutput
|
|
68
68
|
config_param :localtime, :bool, :default => true
|
69
69
|
config_param :num_children, :integer, :default => 1
|
70
70
|
|
71
|
+
# nil, 'none' or 0: no respawn, 'inf' or -1: infinite times, positive integer: try to respawn specified times only
|
72
|
+
config_param :child_respawn, :string, :default => nil
|
73
|
+
|
71
74
|
config_set_default :flush_interval, 1
|
72
75
|
|
73
76
|
def configure(conf)
|
@@ -153,6 +156,16 @@ class ExecFilterOutput < BufferedOutput
|
|
153
156
|
when :msgpack
|
154
157
|
@parser = MessagePackParser.new(method(:on_message))
|
155
158
|
end
|
159
|
+
|
160
|
+
@respawns = if @child_respawn.nil? or @child_respawn == 'none' or @child_respawn == '0'
|
161
|
+
0
|
162
|
+
elsif @child_respawn == 'inf' or @child_respawn == '-1'
|
163
|
+
-1
|
164
|
+
elsif @child_respawn =~ /^\d+$/
|
165
|
+
@child_respawn.to_i
|
166
|
+
else
|
167
|
+
raise ConfigError, "child_respawn option argument invalid: none(or 0), inf(or -1) or positive number"
|
168
|
+
end
|
156
169
|
end
|
157
170
|
|
158
171
|
def start
|
@@ -162,7 +175,7 @@ class ExecFilterOutput < BufferedOutput
|
|
162
175
|
@rr = 0
|
163
176
|
begin
|
164
177
|
@num_children.times do
|
165
|
-
c = ChildProcess.new(@parser)
|
178
|
+
c = ChildProcess.new(@parser, @respawns)
|
166
179
|
c.start(@command)
|
167
180
|
@children << c
|
168
181
|
end
|
@@ -214,49 +227,81 @@ class ExecFilterOutput < BufferedOutput
|
|
214
227
|
end
|
215
228
|
|
216
229
|
class ChildProcess
|
217
|
-
def initialize(parser)
|
230
|
+
def initialize(parser,respawns=0)
|
218
231
|
@pid = nil
|
219
232
|
@thread = nil
|
220
233
|
@parser = parser
|
234
|
+
@respawns = respawns
|
235
|
+
@mutex = Mutex.new
|
221
236
|
end
|
222
237
|
|
223
238
|
def start(command)
|
224
239
|
@command = command
|
225
|
-
@
|
226
|
-
|
227
|
-
|
240
|
+
@mutex.synchronize do
|
241
|
+
@io = IO.popen(command, "r+")
|
242
|
+
@pid = @io.pid
|
243
|
+
@io.sync = true
|
244
|
+
@thread = Thread.new(&method(:run))
|
245
|
+
end
|
228
246
|
@finished = false
|
229
|
-
@thread = Thread.new(&method(:run))
|
230
247
|
end
|
231
248
|
|
232
|
-
def
|
233
|
-
@finished = true
|
249
|
+
def kill_child(join_wait)
|
234
250
|
begin
|
235
251
|
Process.kill(:TERM, @pid)
|
236
252
|
rescue Errno::ESRCH
|
237
|
-
|
238
|
-
|
239
|
-
else
|
240
|
-
raise
|
241
|
-
end
|
253
|
+
# Errno::ESRCH 'No such process', ignore
|
254
|
+
# child process killed by signal chained from fluentd process
|
242
255
|
end
|
243
|
-
if @thread.join(
|
256
|
+
if @thread.join(join_wait)
|
257
|
+
# @thread successfully shutdown
|
244
258
|
return
|
245
259
|
end
|
246
260
|
begin
|
247
261
|
Process.kill(:KILL, @pid)
|
248
262
|
rescue Errno::ESRCH
|
249
|
-
if
|
250
|
-
# ignore if successfully killed by :TERM
|
251
|
-
else
|
252
|
-
raise
|
253
|
-
end
|
263
|
+
# ignore if successfully killed by :TERM
|
254
264
|
end
|
255
265
|
@thread.join
|
256
266
|
end
|
257
267
|
|
268
|
+
def shutdown
|
269
|
+
@finished = true
|
270
|
+
@mutex.synchronize do
|
271
|
+
kill_child(60) # TODO wait time
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
258
275
|
def write(chunk)
|
259
|
-
|
276
|
+
begin
|
277
|
+
chunk.write_to(@io)
|
278
|
+
rescue Errno::EPIPE => e
|
279
|
+
# Broken pipe (child process unexpectedly exited)
|
280
|
+
$log.warn "exec_filter Broken pipe, child process maybe exited.", :command => @command
|
281
|
+
if try_respawn
|
282
|
+
retry # retry chunk#write_to with child respawned
|
283
|
+
else
|
284
|
+
raise e # to retry #write with other ChildProcess instance (when num_children > 1)
|
285
|
+
end
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
def try_respawn
|
290
|
+
return false if @respawns == 0
|
291
|
+
@mutex.synchronize do
|
292
|
+
return false if @respawns == 0
|
293
|
+
|
294
|
+
kill_child(5) # TODO wait time
|
295
|
+
|
296
|
+
@io = IO.popen(@command, "r+")
|
297
|
+
@pid = @io.pid
|
298
|
+
@io.sync = true
|
299
|
+
@thread = Thread.new(&method(:run))
|
300
|
+
|
301
|
+
@respawns -= 1 if @respawns > 0
|
302
|
+
end
|
303
|
+
$log.warn "exec_filter child process successfully respawned.", :command => @command, :respawns => @respawns
|
304
|
+
true
|
260
305
|
end
|
261
306
|
|
262
307
|
def run
|
@@ -268,6 +313,9 @@ class ExecFilterOutput < BufferedOutput
|
|
268
313
|
pid, stat = Process.waitpid2(@pid)
|
269
314
|
unless @finished
|
270
315
|
$log.error "exec_filter process unexpectedly exited.", :command=>@command, :ecode=>stat.to_i
|
316
|
+
unless @respawns == 0
|
317
|
+
$log.warn "exec_filter child process will respawn for next input data (respawns #{@respawns})."
|
318
|
+
end
|
271
319
|
end
|
272
320
|
end
|
273
321
|
end
|
@@ -23,9 +23,11 @@ class RoundRobinOutput < MultiOutput
|
|
23
23
|
|
24
24
|
def initialize
|
25
25
|
@outputs = []
|
26
|
+
@weights = []
|
26
27
|
end
|
27
28
|
|
28
|
-
attr_reader :outputs
|
29
|
+
attr_reader :outputs, :weights
|
30
|
+
attr_accessor :rand_seed
|
29
31
|
|
30
32
|
def configure(conf)
|
31
33
|
conf.elements.select {|e|
|
@@ -35,16 +37,23 @@ class RoundRobinOutput < MultiOutput
|
|
35
37
|
unless type
|
36
38
|
raise ConfigError, "Missing 'type' parameter on <store> directive"
|
37
39
|
end
|
38
|
-
|
40
|
+
|
41
|
+
weight = e['weight']
|
42
|
+
weight = weight ? weight.to_i : 1
|
43
|
+
$log.debug "adding store type=#{type.dump}, weight=#{weight}"
|
39
44
|
|
40
45
|
output = Plugin.new_output(type)
|
41
46
|
output.configure(e)
|
42
47
|
@outputs << output
|
48
|
+
@weights << weight
|
43
49
|
}
|
44
50
|
@rr = -1 # starts from @output[0]
|
51
|
+
@rand_seed = Random.new.seed
|
45
52
|
end
|
46
53
|
|
47
54
|
def start
|
55
|
+
rebuild_weight_array
|
56
|
+
|
48
57
|
@outputs.each {|o|
|
49
58
|
o.start
|
50
59
|
}
|
@@ -62,8 +71,27 @@ class RoundRobinOutput < MultiOutput
|
|
62
71
|
|
63
72
|
protected
|
64
73
|
def next_output
|
65
|
-
@rr = 0 if (@rr += 1) >= @
|
66
|
-
@
|
74
|
+
@rr = 0 if (@rr += 1) >= @weight_array.size
|
75
|
+
@weight_array[@rr]
|
76
|
+
end
|
77
|
+
|
78
|
+
def rebuild_weight_array
|
79
|
+
gcd = @weights.inject(0) {|r,w| r.gcd(w) }
|
80
|
+
|
81
|
+
weight_array = []
|
82
|
+
@outputs.zip(@weights).each {|output,weight|
|
83
|
+
(weight / gcd).times {
|
84
|
+
weight_array << output
|
85
|
+
}
|
86
|
+
}
|
87
|
+
|
88
|
+
# don't randomize order if all weight is 1 (=default)
|
89
|
+
if @weights.any? {|w| w > 1 }
|
90
|
+
r = Random.new(@rand_seed)
|
91
|
+
weight_array.sort_by! { r.rand }
|
92
|
+
end
|
93
|
+
|
94
|
+
@weight_array = weight_array
|
67
95
|
end
|
68
96
|
end
|
69
97
|
|
data/lib/fluent/version.rb
CHANGED
data/test/plugin/in_tail.rb
CHANGED
@@ -75,5 +75,33 @@ class TailInputTest < Test::Unit::TestCase
|
|
75
75
|
assert_equal(true, emits.length > 0)
|
76
76
|
assert_equal({"message"=>"test3test4"}, emits[0][2])
|
77
77
|
end
|
78
|
-
end
|
79
78
|
|
79
|
+
def test_whitespace
|
80
|
+
File.open("#{TMP_DIR}/tail.txt", "w") {|f| }
|
81
|
+
|
82
|
+
d = create_driver
|
83
|
+
|
84
|
+
d.run do
|
85
|
+
sleep 1
|
86
|
+
|
87
|
+
File.open("#{TMP_DIR}/tail.txt", "a") {|f|
|
88
|
+
f.puts " " # 4 spaces
|
89
|
+
f.puts " 4 spaces"
|
90
|
+
f.puts "4 spaces "
|
91
|
+
f.puts " " # tab
|
92
|
+
f.puts " tab"
|
93
|
+
f.puts "tab "
|
94
|
+
}
|
95
|
+
sleep 1
|
96
|
+
end
|
97
|
+
|
98
|
+
emits = d.emits
|
99
|
+
assert_equal(true, emits.length > 0)
|
100
|
+
assert_equal({"message"=>" "}, emits[0][2])
|
101
|
+
assert_equal({"message"=>" 4 spaces"}, emits[1][2])
|
102
|
+
assert_equal({"message"=>"4 spaces "}, emits[2][2])
|
103
|
+
assert_equal({"message"=>" "}, emits[3][2])
|
104
|
+
assert_equal({"message"=>" tab"}, emits[4][2])
|
105
|
+
assert_equal({"message"=>"tab "}, emits[5][2])
|
106
|
+
end
|
107
|
+
end
|
@@ -22,6 +22,17 @@ class ExecFilterOutputTest < Test::Unit::TestCase
|
|
22
22
|
Fluent::Test::OutputTestDriver.new(Fluent::ExecFilterOutput, tag).configure(conf)
|
23
23
|
end
|
24
24
|
|
25
|
+
def sed_unbuffered_support?
|
26
|
+
@sed_unbuffered_support ||= lambda {
|
27
|
+
system("echo xxx | sed --unbuffered -l -e 's/x/y/g' >/dev/null 2>&1")
|
28
|
+
$?.success?
|
29
|
+
}.call
|
30
|
+
end
|
31
|
+
|
32
|
+
def sed_unbuffered_option
|
33
|
+
sed_unbuffered_support? ? '--unbuffered' : ''
|
34
|
+
end
|
35
|
+
|
25
36
|
def test_configure
|
26
37
|
d = create_driver
|
27
38
|
|
@@ -115,7 +126,7 @@ class ExecFilterOutputTest < Test::Unit::TestCase
|
|
115
126
|
assert_equal ["xxx", time, {"val2"=>"sed-ed value foo"}], emits[0]
|
116
127
|
|
117
128
|
d = create_driver %[
|
118
|
-
command sed
|
129
|
+
command sed #{sed_unbuffered_option} -l -e s/foo/bar/
|
119
130
|
in_keys time,val1
|
120
131
|
out_keys time,val2
|
121
132
|
tag xxx
|
@@ -138,7 +149,7 @@ class ExecFilterOutputTest < Test::Unit::TestCase
|
|
138
149
|
|
139
150
|
def test_emit_4
|
140
151
|
d = create_driver(%[
|
141
|
-
command sed
|
152
|
+
command sed #{sed_unbuffered_option} -l -e s/foo/bar/
|
142
153
|
in_keys tag,time,val1
|
143
154
|
remove_prefix input
|
144
155
|
out_keys tag,time,val2
|
@@ -19,6 +19,22 @@ class RoundRobinOutputTest < Test::Unit::TestCase
|
|
19
19
|
name c2
|
20
20
|
</store>
|
21
21
|
]
|
22
|
+
CONFIG_WITH_WEIGHT = %[
|
23
|
+
<store>
|
24
|
+
type test
|
25
|
+
name c0
|
26
|
+
weight 3
|
27
|
+
</store>
|
28
|
+
<store>
|
29
|
+
type test
|
30
|
+
name c1
|
31
|
+
weight 3
|
32
|
+
</store>
|
33
|
+
<store>
|
34
|
+
type test
|
35
|
+
name c2
|
36
|
+
</store>
|
37
|
+
]
|
22
38
|
|
23
39
|
def create_driver(conf = CONFIG)
|
24
40
|
Fluent::Test::OutputTestDriver.new(Fluent::RoundRobinOutput).configure(conf)
|
@@ -35,16 +51,41 @@ class RoundRobinOutputTest < Test::Unit::TestCase
|
|
35
51
|
assert_equal "c0", outputs[0].name
|
36
52
|
assert_equal "c1", outputs[1].name
|
37
53
|
assert_equal "c2", outputs[2].name
|
54
|
+
|
55
|
+
weights = d.instance.weights
|
56
|
+
assert_equal 3, weights.size
|
57
|
+
assert_equal 1, weights[0]
|
58
|
+
assert_equal 1, weights[1]
|
59
|
+
assert_equal 1, weights[2]
|
60
|
+
|
61
|
+
d = create_driver(CONFIG_WITH_WEIGHT)
|
62
|
+
|
63
|
+
outputs = d.instance.outputs
|
64
|
+
assert_equal 3, outputs.size
|
65
|
+
assert_equal Fluent::TestOutput, outputs[0].class
|
66
|
+
assert_equal Fluent::TestOutput, outputs[1].class
|
67
|
+
assert_equal Fluent::TestOutput, outputs[2].class
|
68
|
+
assert_equal "c0", outputs[0].name
|
69
|
+
assert_equal "c1", outputs[1].name
|
70
|
+
assert_equal "c2", outputs[2].name
|
71
|
+
|
72
|
+
weights = d.instance.weights
|
73
|
+
assert_equal 3, weights.size
|
74
|
+
assert_equal 3, weights[0]
|
75
|
+
assert_equal 3, weights[1]
|
76
|
+
assert_equal 1, weights[2]
|
38
77
|
end
|
39
78
|
|
40
79
|
def test_emit
|
41
80
|
d = create_driver
|
42
81
|
|
43
82
|
time = Time.parse("2011-01-02 13:14:15 UTC").to_i
|
44
|
-
d.
|
45
|
-
|
46
|
-
|
47
|
-
|
83
|
+
d.run do
|
84
|
+
d.emit({"a"=>1}, time)
|
85
|
+
d.emit({"a"=>2}, time)
|
86
|
+
d.emit({"a"=>3}, time)
|
87
|
+
d.emit({"a"=>4}, time)
|
88
|
+
end
|
48
89
|
|
49
90
|
os = d.instance.outputs
|
50
91
|
|
@@ -61,5 +102,22 @@ class RoundRobinOutputTest < Test::Unit::TestCase
|
|
61
102
|
[time, {"a"=>3}],
|
62
103
|
], os[2].events
|
63
104
|
end
|
105
|
+
|
106
|
+
def test_emit_weighted
|
107
|
+
d = create_driver(CONFIG_WITH_WEIGHT)
|
108
|
+
|
109
|
+
time = Time.parse("2011-01-02 13:14:15 UTC").to_i
|
110
|
+
d.run do
|
111
|
+
14.times do |i|
|
112
|
+
d.emit({"a"=>i}, time)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
os = d.instance.outputs
|
117
|
+
|
118
|
+
assert_equal 6, os[0].events.size # weight=3
|
119
|
+
assert_equal 6, os[1].events.size # weight=3
|
120
|
+
assert_equal 2, os[2].events.size # weight=1
|
121
|
+
end
|
64
122
|
end
|
65
123
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluentd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.25
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-07-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: msgpack
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: 0.4.4
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.4.4
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: json
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ! '>='
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: 1.4.3
|
33
38
|
type: :runtime
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 1.4.3
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: yajl-ruby
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '1.0'
|
44
54
|
type: :runtime
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.0'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: cool.io
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ~>
|
@@ -54,10 +69,15 @@ dependencies:
|
|
54
69
|
version: 1.1.0
|
55
70
|
type: :runtime
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.1.0
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: http_parser.rb
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
83
|
- - ~>
|
@@ -65,10 +85,15 @@ dependencies:
|
|
65
85
|
version: 0.5.1
|
66
86
|
type: :runtime
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 0.5.1
|
69
94
|
- !ruby/object:Gem::Dependency
|
70
95
|
name: rake
|
71
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
72
97
|
none: false
|
73
98
|
requirements:
|
74
99
|
- - ! '>='
|
@@ -76,10 +101,15 @@ dependencies:
|
|
76
101
|
version: 0.9.2
|
77
102
|
type: :development
|
78
103
|
prerelease: false
|
79
|
-
version_requirements:
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.9.2
|
80
110
|
- !ruby/object:Gem::Dependency
|
81
111
|
name: rr
|
82
|
-
requirement:
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
83
113
|
none: false
|
84
114
|
requirements:
|
85
115
|
- - ! '>='
|
@@ -87,10 +117,15 @@ dependencies:
|
|
87
117
|
version: 1.0.0
|
88
118
|
type: :development
|
89
119
|
prerelease: false
|
90
|
-
version_requirements:
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 1.0.0
|
91
126
|
- !ruby/object:Gem::Dependency
|
92
127
|
name: timecop
|
93
|
-
requirement:
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
94
129
|
none: false
|
95
130
|
requirements:
|
96
131
|
- - ! '>='
|
@@ -98,10 +133,15 @@ dependencies:
|
|
98
133
|
version: 0.3.0
|
99
134
|
type: :development
|
100
135
|
prerelease: false
|
101
|
-
version_requirements:
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 0.3.0
|
102
142
|
- !ruby/object:Gem::Dependency
|
103
143
|
name: jeweler
|
104
|
-
requirement:
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
105
145
|
none: false
|
106
146
|
requirements:
|
107
147
|
- - ! '>='
|
@@ -109,7 +149,12 @@ dependencies:
|
|
109
149
|
version: 1.0.0
|
110
150
|
type: :development
|
111
151
|
prerelease: false
|
112
|
-
version_requirements:
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 1.0.0
|
113
158
|
description:
|
114
159
|
email: frsyuki@gmail.com
|
115
160
|
executables:
|
@@ -219,7 +264,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
219
264
|
version: '0'
|
220
265
|
requirements: []
|
221
266
|
rubyforge_project:
|
222
|
-
rubygems_version: 1.8.
|
267
|
+
rubygems_version: 1.8.23
|
223
268
|
signing_key:
|
224
269
|
specification_version: 3
|
225
270
|
summary: Fluent event collector
|