fluent-plugin-buffered-filter 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 869a1462cd301510e94ac8ef9cfa69acb5b22525
4
+ data.tar.gz: a3c03ff87d013b30ab0f0dc398d8ab44067ae8cd
5
+ SHA512:
6
+ metadata.gz: c0bc0c0f924c92f1add2bf680c7289cabc8eae4e5cc534840d292cec6b2d93268e7662300b15fb78167f75a9ede367c951100fd769d88e69665cab21f690dc6f
7
+ data.tar.gz: 9ef94cee856103a665a9b982e185625523d0051d0830164fb45ffc0d46abc31bdf2c3a5795f191f6df41f1f8e5f50fe6590060dc887af8fbfdbabe8a92fbdfc8
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --require spec_helper
2
+ --colour
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fluent-plugin-buffered-filter.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Genki Sugawara
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,44 @@
1
+ # fluent-plugin-buffered-filter
2
+
3
+ Versatile filtering plugin
4
+
5
+ [![Gem Version](https://badge.fury.io/rb/fluent-plugin-buffered-filter.png)](http://badge.fury.io/rb/fluent-plugin-buffered-filter)
6
+ [![Build Status](https://drone.io/bitbucket.org/winebarrel/fluent-plugin-buffered-filter/status.png)]
7
+
8
+ ## Installation
9
+
10
+ $ gem install fluent-plugin-buffered-filter
11
+
12
+
13
+ ## Configuration
14
+
15
+ ```
16
+ <match my.**>
17
+ type buffered_filter
18
+ filter_path /foo/bar/my_filrer.rb
19
+ #prefix filtered
20
+ </match>
21
+
22
+ <match filtered.my.**>
23
+ type stdout
24
+ </match>
25
+ ```
26
+
27
+ ## Usage
28
+
29
+ ```ruby
30
+ # Count the number of keys in the record
31
+
32
+ proc {|tag, time, record|
33
+ {'key_count' => record.keys}
34
+ # or [{...},{...},{...}, ...]
35
+ }
36
+ ```
37
+
38
+ ## Contributing
39
+
40
+ 1. Fork it
41
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
42
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
43
+ 4. Push to the branch (`git push origin my-new-feature`)
44
+ 5. Create new Pull Request
@@ -0,0 +1,5 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ RSpec::Core::RakeTask.new('spec')
5
+ task :default => :spec
@@ -0,0 +1,21 @@
1
+ # coding: utf-8
2
+ Gem::Specification.new do |spec|
3
+ spec.name = 'fluent-plugin-buffered-filter'
4
+ spec.version = '0.1.0'
5
+ spec.authors = ['Genki Sugawara']
6
+ spec.email = ['sgwr_dts@yahoo.co.jp']
7
+ spec.description = %q{Versatile filtering plugin}
8
+ spec.summary = %q{Versatile filtering plugin}
9
+ spec.homepage = 'https://bitbucket.org/winebarrel/fluent-plugin-buffered-filter'
10
+ spec.license = 'MIT'
11
+
12
+ spec.files = `git ls-files`.split($/)
13
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
14
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
15
+ spec.require_paths = ['lib']
16
+
17
+ spec.add_dependency 'fluentd'
18
+ spec.add_development_dependency 'bundler', '~> 1.3'
19
+ spec.add_development_dependency 'rake'
20
+ spec.add_development_dependency 'rspec', '>= 2.11.0'
21
+ end
@@ -0,0 +1,52 @@
1
+ class Fluent::BufferedFilterOutput < Fluent::BufferedOutput
2
+ Fluent::Plugin.register_output('buffered_filter', self)
3
+
4
+ unless method_defined?(:log)
5
+ define_method('log') { $log }
6
+ end
7
+
8
+ config_param :filter_path, :type => :string
9
+ config_param :prefix, :type => :string, :default => 'filtered'
10
+
11
+ def configure(conf)
12
+ super
13
+
14
+ unless File.exist?(@filter_path)
15
+ raise Fluent::ConfigError, "No such file: #{@filter_path}"
16
+ end
17
+
18
+ begin
19
+ @filter = Object.new.instance_eval(File.read(@filter_path), @filter_path)
20
+ rescue => e
21
+ raise Fluent::ConfigError, "Invalid filter: #{@filter_path}: #{e}"
22
+ end
23
+
24
+ unless @filter.respond_to?(:call)
25
+ raise Fluent::ConfigError, "`call` method not implemented in filter: #{@filter_path}"
26
+ end
27
+ end
28
+
29
+ def format(tag, time, record)
30
+ [tag, time, record].to_msgpack
31
+ end
32
+
33
+ def write(chunk)
34
+ chunk.msgpack_each do |tag, time, record|
35
+ records = @filter.call(tag, time, record)
36
+ records = [records] unless records.kind_of?(Array)
37
+ emit_records(tag, time, records)
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def emit_records(tag, time, records)
44
+ records.each do |record|
45
+ if record.kind_of?(Hash)
46
+ Fluent::Engine.emit("#{@prefix}.#{tag}", time, record)
47
+ else
48
+ log.warn("Record must be Hash: #{record.inspect} (#{record.class})")
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,188 @@
1
+ describe Fluent::BufferedFilterOutput do
2
+ let(:time) {
3
+ Time.parse('2014-02-08 04:14:15 UTC').to_i
4
+ }
5
+
6
+ it 'should be filtered' do
7
+ emits = run_driver do |d|
8
+ (0...10).each do |i|
9
+ d.emit({"key#{i}" => "val#{i}"}, time + i)
10
+ end
11
+ end
12
+
13
+ expect(emits).to eq(
14
+ [["filtered.test.default", 1391832855, {"record"=>"test.default,1391832855,{\"key0\"=>\"val0\"}"}],
15
+ ["filtered.test.default", 1391832856, {"record"=>"test.default,1391832856,{\"key1\"=>\"val1\"}"}],
16
+ ["filtered.test.default", 1391832857, {"record"=>"test.default,1391832857,{\"key2\"=>\"val2\"}"}],
17
+ ["filtered.test.default", 1391832858, {"record"=>"test.default,1391832858,{\"key3\"=>\"val3\"}"}],
18
+ ["filtered.test.default", 1391832859, {"record"=>"test.default,1391832859,{\"key4\"=>\"val4\"}"}],
19
+ ["filtered.test.default", 1391832860, {"record"=>"test.default,1391832860,{\"key5\"=>\"val5\"}"}],
20
+ ["filtered.test.default", 1391832861, {"record"=>"test.default,1391832861,{\"key6\"=>\"val6\"}"}],
21
+ ["filtered.test.default", 1391832862, {"record"=>"test.default,1391832862,{\"key7\"=>\"val7\"}"}],
22
+ ["filtered.test.default", 1391832863, {"record"=>"test.default,1391832863,{\"key8\"=>\"val8\"}"}],
23
+ ["filtered.test.default", 1391832864, {"record"=>"test.default,1391832864,{\"key9\"=>\"val9\"}"}]]
24
+ )
25
+ end
26
+
27
+ it 'should be rewritten to the specified tag' do
28
+ emits = run_driver(:prefix => 'any_prefix') do |d|
29
+ (0...10).each do |i|
30
+ d.emit({"key#{i}" => "val#{i}"}, time + i)
31
+ end
32
+ end
33
+
34
+ expect(emits).to eq(
35
+ [["any_prefix.test.default", 1391832855, {"record"=>"test.default,1391832855,{\"key0\"=>\"val0\"}"}],
36
+ ["any_prefix.test.default", 1391832856, {"record"=>"test.default,1391832856,{\"key1\"=>\"val1\"}"}],
37
+ ["any_prefix.test.default", 1391832857, {"record"=>"test.default,1391832857,{\"key2\"=>\"val2\"}"}],
38
+ ["any_prefix.test.default", 1391832858, {"record"=>"test.default,1391832858,{\"key3\"=>\"val3\"}"}],
39
+ ["any_prefix.test.default", 1391832859, {"record"=>"test.default,1391832859,{\"key4\"=>\"val4\"}"}],
40
+ ["any_prefix.test.default", 1391832860, {"record"=>"test.default,1391832860,{\"key5\"=>\"val5\"}"}],
41
+ ["any_prefix.test.default", 1391832861, {"record"=>"test.default,1391832861,{\"key6\"=>\"val6\"}"}],
42
+ ["any_prefix.test.default", 1391832862, {"record"=>"test.default,1391832862,{\"key7\"=>\"val7\"}"}],
43
+ ["any_prefix.test.default", 1391832863, {"record"=>"test.default,1391832863,{\"key8\"=>\"val8\"}"}],
44
+ ["any_prefix.test.default", 1391832864, {"record"=>"test.default,1391832864,{\"key9\"=>\"val9\"}"}]]
45
+ )
46
+ end
47
+
48
+ it 'should be filtered to multiple records' do
49
+ filter = <<-EOS
50
+ proc {|tag, time, record|
51
+ [
52
+ {'record1' => [tag, time, record].join(',')},
53
+ {'record2' => [tag, time, record].reverse.join(',')},
54
+ ]
55
+ }
56
+ EOS
57
+
58
+ emits = run_driver(:filter => filter) do |d|
59
+ (0...10).each do |i|
60
+ d.emit({"key#{i}" => "val#{i}"}, time + i)
61
+ end
62
+ end
63
+
64
+ expect(emits).to eq(
65
+ [["filtered.test.default", 1391832855, {"record1"=>"test.default,1391832855,{\"key0\"=>\"val0\"}"}],
66
+ ["filtered.test.default", 1391832855, {"record2"=>"{\"key0\"=>\"val0\"},1391832855,test.default"}],
67
+ ["filtered.test.default", 1391832856, {"record1"=>"test.default,1391832856,{\"key1\"=>\"val1\"}"}],
68
+ ["filtered.test.default", 1391832856, {"record2"=>"{\"key1\"=>\"val1\"},1391832856,test.default"}],
69
+ ["filtered.test.default", 1391832857, {"record1"=>"test.default,1391832857,{\"key2\"=>\"val2\"}"}],
70
+ ["filtered.test.default", 1391832857, {"record2"=>"{\"key2\"=>\"val2\"},1391832857,test.default"}],
71
+ ["filtered.test.default", 1391832858, {"record1"=>"test.default,1391832858,{\"key3\"=>\"val3\"}"}],
72
+ ["filtered.test.default", 1391832858, {"record2"=>"{\"key3\"=>\"val3\"},1391832858,test.default"}],
73
+ ["filtered.test.default", 1391832859, {"record1"=>"test.default,1391832859,{\"key4\"=>\"val4\"}"}],
74
+ ["filtered.test.default", 1391832859, {"record2"=>"{\"key4\"=>\"val4\"},1391832859,test.default"}],
75
+ ["filtered.test.default", 1391832860, {"record1"=>"test.default,1391832860,{\"key5\"=>\"val5\"}"}],
76
+ ["filtered.test.default", 1391832860, {"record2"=>"{\"key5\"=>\"val5\"},1391832860,test.default"}],
77
+ ["filtered.test.default", 1391832861, {"record1"=>"test.default,1391832861,{\"key6\"=>\"val6\"}"}],
78
+ ["filtered.test.default", 1391832861, {"record2"=>"{\"key6\"=>\"val6\"},1391832861,test.default"}],
79
+ ["filtered.test.default", 1391832862, {"record1"=>"test.default,1391832862,{\"key7\"=>\"val7\"}"}],
80
+ ["filtered.test.default", 1391832862, {"record2"=>"{\"key7\"=>\"val7\"},1391832862,test.default"}],
81
+ ["filtered.test.default", 1391832863, {"record1"=>"test.default,1391832863,{\"key8\"=>\"val8\"}"}],
82
+ ["filtered.test.default", 1391832863, {"record2"=>"{\"key8\"=>\"val8\"},1391832863,test.default"}],
83
+ ["filtered.test.default", 1391832864, {"record1"=>"test.default,1391832864,{\"key9\"=>\"val9\"}"}],
84
+ ["filtered.test.default", 1391832864, {"record2"=>"{\"key9\"=>\"val9\"},1391832864,test.default"}]]
85
+ )
86
+ end
87
+
88
+ describe 'when an invalid record was included' do
89
+ it 'should skip the bad records (Filter returns a Hash)' do
90
+ filter = <<-EOS
91
+ proc {|tag, time, record|
92
+ if record.has_key?('return_nil')
93
+ nil
94
+ else
95
+ {'record' => [tag, time, record].join(',')}
96
+ end
97
+ }
98
+ EOS
99
+
100
+ emits = run_driver(:filter => filter) do |d|
101
+ d.instance.log.should_receive(:warn) {|msg| expect(msg).to eq('Record must be Hash: nil (NilClass)') }
102
+
103
+ (0...10).each do |i|
104
+ d.emit({"key#{i}" => "val#{i}"}, time + i)
105
+ end
106
+
107
+ d.emit({"return_nil" => 1}, time + 10)
108
+
109
+ (10...20).each do |i|
110
+ d.emit({"key#{i}" => "val#{i}"}, time + i)
111
+ end
112
+ end
113
+
114
+ expect(emits).to eq(
115
+ [["filtered.test.default", 1391832855, {"record"=>"test.default,1391832855,{\"key0\"=>\"val0\"}"}],
116
+ ["filtered.test.default", 1391832856, {"record"=>"test.default,1391832856,{\"key1\"=>\"val1\"}"}],
117
+ ["filtered.test.default", 1391832857, {"record"=>"test.default,1391832857,{\"key2\"=>\"val2\"}"}],
118
+ ["filtered.test.default", 1391832858, {"record"=>"test.default,1391832858,{\"key3\"=>\"val3\"}"}],
119
+ ["filtered.test.default", 1391832859, {"record"=>"test.default,1391832859,{\"key4\"=>\"val4\"}"}],
120
+ ["filtered.test.default", 1391832860, {"record"=>"test.default,1391832860,{\"key5\"=>\"val5\"}"}],
121
+ ["filtered.test.default", 1391832861, {"record"=>"test.default,1391832861,{\"key6\"=>\"val6\"}"}],
122
+ ["filtered.test.default", 1391832862, {"record"=>"test.default,1391832862,{\"key7\"=>\"val7\"}"}],
123
+ ["filtered.test.default", 1391832863, {"record"=>"test.default,1391832863,{\"key8\"=>\"val8\"}"}],
124
+ ["filtered.test.default", 1391832864, {"record"=>"test.default,1391832864,{\"key9\"=>\"val9\"}"}],
125
+ ["filtered.test.default", 1391832865, {"record"=>"test.default,1391832865,{\"key10\"=>\"val10\"}"}],
126
+ ["filtered.test.default", 1391832866, {"record"=>"test.default,1391832866,{\"key11\"=>\"val11\"}"}],
127
+ ["filtered.test.default", 1391832867, {"record"=>"test.default,1391832867,{\"key12\"=>\"val12\"}"}],
128
+ ["filtered.test.default", 1391832868, {"record"=>"test.default,1391832868,{\"key13\"=>\"val13\"}"}],
129
+ ["filtered.test.default", 1391832869, {"record"=>"test.default,1391832869,{\"key14\"=>\"val14\"}"}],
130
+ ["filtered.test.default", 1391832870, {"record"=>"test.default,1391832870,{\"key15\"=>\"val15\"}"}],
131
+ ["filtered.test.default", 1391832871, {"record"=>"test.default,1391832871,{\"key16\"=>\"val16\"}"}],
132
+ ["filtered.test.default", 1391832872, {"record"=>"test.default,1391832872,{\"key17\"=>\"val17\"}"}],
133
+ ["filtered.test.default", 1391832873, {"record"=>"test.default,1391832873,{\"key18\"=>\"val18\"}"}],
134
+ ["filtered.test.default", 1391832874, {"record"=>"test.default,1391832874,{\"key19\"=>\"val19\"}"}]]
135
+ )
136
+ end
137
+
138
+ it 'should skip the bad records (Filter returns an Array)' do
139
+ filter = <<-EOS
140
+ proc {|tag, time, record|
141
+ if record.has_key?('return_nil')
142
+ [nil, 1]
143
+ else
144
+ {'record' => [tag, time, record].join(',')}
145
+ end
146
+ }
147
+ EOS
148
+
149
+ emits = run_driver(:filter => filter) do |d|
150
+ d.instance.log.should_receive(:warn) {|msg| expect(msg).to eq('Record must be Hash: nil (NilClass)') }
151
+ d.instance.log.should_receive(:warn) {|msg| expect(msg).to eq('Record must be Hash: 1 (Fixnum)') }
152
+
153
+ (0...10).each do |i|
154
+ d.emit({"key#{i}" => "val#{i}"}, time + i)
155
+ end
156
+
157
+ d.emit({"return_nil" => 1}, time + 10)
158
+
159
+ (10...20).each do |i|
160
+ d.emit({"key#{i}" => "val#{i}"}, time + i)
161
+ end
162
+ end
163
+
164
+ expect(emits).to eq(
165
+ [["filtered.test.default", 1391832855, {"record"=>"test.default,1391832855,{\"key0\"=>\"val0\"}"}],
166
+ ["filtered.test.default", 1391832856, {"record"=>"test.default,1391832856,{\"key1\"=>\"val1\"}"}],
167
+ ["filtered.test.default", 1391832857, {"record"=>"test.default,1391832857,{\"key2\"=>\"val2\"}"}],
168
+ ["filtered.test.default", 1391832858, {"record"=>"test.default,1391832858,{\"key3\"=>\"val3\"}"}],
169
+ ["filtered.test.default", 1391832859, {"record"=>"test.default,1391832859,{\"key4\"=>\"val4\"}"}],
170
+ ["filtered.test.default", 1391832860, {"record"=>"test.default,1391832860,{\"key5\"=>\"val5\"}"}],
171
+ ["filtered.test.default", 1391832861, {"record"=>"test.default,1391832861,{\"key6\"=>\"val6\"}"}],
172
+ ["filtered.test.default", 1391832862, {"record"=>"test.default,1391832862,{\"key7\"=>\"val7\"}"}],
173
+ ["filtered.test.default", 1391832863, {"record"=>"test.default,1391832863,{\"key8\"=>\"val8\"}"}],
174
+ ["filtered.test.default", 1391832864, {"record"=>"test.default,1391832864,{\"key9\"=>\"val9\"}"}],
175
+ ["filtered.test.default", 1391832865, {"record"=>"test.default,1391832865,{\"key10\"=>\"val10\"}"}],
176
+ ["filtered.test.default", 1391832866, {"record"=>"test.default,1391832866,{\"key11\"=>\"val11\"}"}],
177
+ ["filtered.test.default", 1391832867, {"record"=>"test.default,1391832867,{\"key12\"=>\"val12\"}"}],
178
+ ["filtered.test.default", 1391832868, {"record"=>"test.default,1391832868,{\"key13\"=>\"val13\"}"}],
179
+ ["filtered.test.default", 1391832869, {"record"=>"test.default,1391832869,{\"key14\"=>\"val14\"}"}],
180
+ ["filtered.test.default", 1391832870, {"record"=>"test.default,1391832870,{\"key15\"=>\"val15\"}"}],
181
+ ["filtered.test.default", 1391832871, {"record"=>"test.default,1391832871,{\"key16\"=>\"val16\"}"}],
182
+ ["filtered.test.default", 1391832872, {"record"=>"test.default,1391832872,{\"key17\"=>\"val17\"}"}],
183
+ ["filtered.test.default", 1391832873, {"record"=>"test.default,1391832873,{\"key18\"=>\"val18\"}"}],
184
+ ["filtered.test.default", 1391832874, {"record"=>"test.default,1391832874,{\"key19\"=>\"val19\"}"}]]
185
+ )
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,62 @@
1
+ require 'fluent/test'
2
+ require 'fluent/plugin/out_buffered_filter'
3
+ require 'tempfile'
4
+ require 'time'
5
+
6
+ # Disable Test::Unit
7
+ module Test::Unit::RunCount; def run(*); end; end
8
+
9
+ RSpec.configure do |config|
10
+ config.before(:all) do
11
+ Fluent::Test.setup
12
+ end
13
+ end
14
+
15
+ def tempfile(content, basename = nil)
16
+ basename ||= "#{File.basename __FILE__}.#{$$}"
17
+
18
+ Tempfile.open(basename) do |f|
19
+ f << content
20
+ f.flush
21
+ f.rewind
22
+ yield(f)
23
+ end
24
+ end
25
+
26
+ def run_driver(options = {})
27
+ options = options.dup
28
+
29
+ filter = options[:filter] || (<<-EOS)
30
+ proc {|tag, time, record|
31
+ {'record' => [tag, time, record].join(',')}
32
+ }
33
+ EOS
34
+
35
+ option_keys = [
36
+ :prefix,
37
+ ]
38
+
39
+ additional_options = option_keys.map {|key|
40
+ if options[key]
41
+ "#{key} #{options[key]}"
42
+ end
43
+ }.join("\n")
44
+
45
+ tag = options[:tag] || 'test.default'
46
+
47
+ tempfile(filter, options[:tempfile]) do |f|
48
+ fluentd_conf = <<-EOS
49
+ type buffered_filter
50
+ filter_path #{f.path}
51
+ #{additional_options}
52
+ EOS
53
+
54
+ driver = Fluent::Test::OutputTestDriver.new(Fluent::BufferedFilterOutput, tag).configure(fluentd_conf)
55
+
56
+ driver.run do
57
+ yield(driver)
58
+ end
59
+
60
+ driver.emits
61
+ end
62
+ end
metadata ADDED
@@ -0,0 +1,112 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-buffered-filter
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Genki Sugawara
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-02-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: fluentd
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.3'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.3'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 2.11.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: 2.11.0
69
+ description: Versatile filtering plugin
70
+ email:
71
+ - sgwr_dts@yahoo.co.jp
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - .gitignore
77
+ - .rspec
78
+ - Gemfile
79
+ - LICENSE.txt
80
+ - README.md
81
+ - Rakefile
82
+ - fluent-plugin-buffered-filter.gemspec
83
+ - lib/fluent/plugin/out_buffered_filter.rb
84
+ - spec/out_buffered_filter_spec.rb
85
+ - spec/spec_helper.rb
86
+ homepage: https://bitbucket.org/winebarrel/fluent-plugin-buffered-filter
87
+ licenses:
88
+ - MIT
89
+ metadata: {}
90
+ post_install_message:
91
+ rdoc_options: []
92
+ require_paths:
93
+ - lib
94
+ required_ruby_version: !ruby/object:Gem::Requirement
95
+ requirements:
96
+ - - '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ required_rubygems_version: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ requirements: []
105
+ rubyforge_project:
106
+ rubygems_version: 2.0.14
107
+ signing_key:
108
+ specification_version: 4
109
+ summary: Versatile filtering plugin
110
+ test_files:
111
+ - spec/out_buffered_filter_spec.rb
112
+ - spec/spec_helper.rb