fluent-plugin-nested-hash-filter 0.0.1
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 +7 -0
- data/.gitignore +10 -0
- data/.travis.yml +6 -0
- data/Gemfile +4 -0
- data/Guardfile +5 -0
- data/README.md +42 -0
- data/Rakefile +12 -0
- data/fluent-plugin-nested-hash-filter.gemspec +24 -0
- data/lib/fluent/plugin/filter_nested_hash.rb +23 -0
- data/lib/fluent/plugin/nested_hash_filter/nested_object.rb +72 -0
- data/lib/fluent/plugin/out_nested_hash.rb +28 -0
- data/test/fluent/plugin/filter_nested_hash_test.rb +70 -0
- data/test/fluent/plugin/nested_hash_filter/nested_object_test.rb +209 -0
- data/test/fluent/plugin/out_nested_hash_test.rb +71 -0
- data/test/test_helper.rb +9 -0
- metadata +141 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 64f83a066f2e3c8d2a3453f62615abc36a1d664a
|
4
|
+
data.tar.gz: 5da7b8ef0de45bf917245a3eb5fac1867b33d659
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2f009f27550f02a2f6333ef8ffca7d8925ccc6b45e3763abc2827af2fa4cd440cd87b273cf6359739d87f11a097d29c61b02e452313d74cb880231d6fcdda651
|
7
|
+
data.tar.gz: 0dde134af29ad68a084ea62431b12ac2bef0c2c972a228cbd5053ace7bb549e72888a3d232f83cdebb3dec337880e0c57ccba2c44b892e7c8d95e3fc7b6ef08d
|
data/.gitignore
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# fluent-plugin-nested-hash-filter
|
2
|
+
|
3
|
+
[](https://travis-ci.org/sugilog/fluent-plugin-nested-hash-filter.svg)
|
4
|
+
|
5
|
+
|
6
|
+
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/fluent/plugin/filter_nested_hash`.
|
7
|
+
|
8
|
+
TODO: Delete this and the text above, and describe your gem
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
Add this line to your application's Gemfile:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
gem 'fluent-plugin-nested-hash-filter'
|
16
|
+
```
|
17
|
+
|
18
|
+
And then execute:
|
19
|
+
|
20
|
+
$ bundle
|
21
|
+
|
22
|
+
Or install it yourself as:
|
23
|
+
|
24
|
+
$ gem install fluent-plugin-nested-hash-filter
|
25
|
+
|
26
|
+
## Usage
|
27
|
+
|
28
|
+
TODO: Write usage instructions here
|
29
|
+
|
30
|
+
## Development
|
31
|
+
|
32
|
+
After checking out the repo, run `bundle install` to install dependencies.
|
33
|
+
|
34
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
35
|
+
|
36
|
+
## Contributing
|
37
|
+
|
38
|
+
1. Fork it ( https://github.com/sugilog/fluent-plugin-nested-hash-filter/fork )
|
39
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
40
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
41
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
42
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rake/testtask"
|
3
|
+
|
4
|
+
desc "Run tests"
|
5
|
+
Rake::TestTask.new do |test|
|
6
|
+
test.name = :test
|
7
|
+
test.libs = ["lib", "test"]
|
8
|
+
test.test_files = FileList["test/**/*_test.rb"]
|
9
|
+
test.verbose = true
|
10
|
+
end
|
11
|
+
|
12
|
+
task :default => :test
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "fluent-plugin-nested-hash-filter"
|
7
|
+
spec.version = "0.0.1"
|
8
|
+
spec.authors = ["sugilog"]
|
9
|
+
spec.email = ["sugilog@gmail.com"]
|
10
|
+
|
11
|
+
spec.summary = %q{Fluent Plugin for converting nested hash into flatten key-value pair.}
|
12
|
+
spec.description = %q{Fluent Plugin for converting nested hash into flatten key-value pair.}
|
13
|
+
spec.homepage = "https://github.com/sugilog/fluent-plugin-nested-hash-filter"
|
14
|
+
|
15
|
+
spec.files = `git ls-files -z`.split("\x0")
|
16
|
+
spec.require_paths = ["lib"]
|
17
|
+
|
18
|
+
spec.add_development_dependency "bundler"
|
19
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
20
|
+
spec.add_runtime_dependency "fluentd"
|
21
|
+
spec.add_development_dependency "test-unit"
|
22
|
+
spec.add_development_dependency "guard"
|
23
|
+
spec.add_development_dependency "guard-test"
|
24
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "fluent/plugin/nested_hash_filter/nested_object"
|
2
|
+
|
3
|
+
module Fluent
|
4
|
+
class FilterNestedHash < Filter
|
5
|
+
Plugin.register_filter("nested_hash_filter", self)
|
6
|
+
|
7
|
+
def configure conf
|
8
|
+
super
|
9
|
+
end
|
10
|
+
|
11
|
+
def start
|
12
|
+
super
|
13
|
+
end
|
14
|
+
|
15
|
+
def shutdown
|
16
|
+
super
|
17
|
+
end
|
18
|
+
|
19
|
+
def filter tag, time, record
|
20
|
+
Fluent::NestedHashFilter::NestedObject.convert record
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Fluent
|
2
|
+
module NestedHashFilter
|
3
|
+
module NestedObject
|
4
|
+
CONNECTOR = "."
|
5
|
+
|
6
|
+
def self.init
|
7
|
+
@output = {}
|
8
|
+
@output_keys = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.convert object
|
12
|
+
init
|
13
|
+
select object
|
14
|
+
|
15
|
+
@output
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.select object
|
19
|
+
case object
|
20
|
+
when Hash
|
21
|
+
convert_hash object
|
22
|
+
when Array
|
23
|
+
convert_array object
|
24
|
+
else
|
25
|
+
update object
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.add_key key
|
30
|
+
@output_keys.push key
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.pop_key
|
34
|
+
@output_keys.pop
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.current_key
|
38
|
+
@output_keys.join CONNECTOR
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.update value
|
42
|
+
unless current_key.empty?
|
43
|
+
@output.update current_key => value
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.convert_hash hash
|
48
|
+
if hash.keys.empty?
|
49
|
+
update nil
|
50
|
+
end
|
51
|
+
|
52
|
+
hash.each do |key, value|
|
53
|
+
add_key key
|
54
|
+
select value
|
55
|
+
pop_key
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.convert_array array
|
60
|
+
if array.empty?
|
61
|
+
update nil
|
62
|
+
end
|
63
|
+
|
64
|
+
array.each_with_index do |value, index|
|
65
|
+
add_key index
|
66
|
+
select value
|
67
|
+
pop_key
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "fluent/plugin/nested_hash_filter/nested_object"
|
2
|
+
|
3
|
+
module Fluent
|
4
|
+
class OutNestedHash < Output
|
5
|
+
Plugin.register_output("nested_hash_filter", self)
|
6
|
+
|
7
|
+
def configure conf
|
8
|
+
super
|
9
|
+
end
|
10
|
+
|
11
|
+
def start
|
12
|
+
super
|
13
|
+
end
|
14
|
+
|
15
|
+
def shutdown
|
16
|
+
super
|
17
|
+
end
|
18
|
+
|
19
|
+
def emit tag, es, chain
|
20
|
+
es.each do |time, record|
|
21
|
+
record = Fluent::NestedHashFilter::NestedObject.convert record
|
22
|
+
Fluent::Engine.emit tag, time, record
|
23
|
+
end
|
24
|
+
|
25
|
+
chain.next
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
require "fluent/plugin/filter_nested_hash"
|
3
|
+
|
4
|
+
class FilterNestedHashTest < Test::Unit::TestCase
|
5
|
+
include Fluent
|
6
|
+
|
7
|
+
setup do
|
8
|
+
Fluent::Test.setup
|
9
|
+
@time = Fluent::Engine.now
|
10
|
+
end
|
11
|
+
|
12
|
+
def create_driver config = ""
|
13
|
+
driver = Test::FilterTestDriver.new FilterNestedHash
|
14
|
+
driver.configure config, true
|
15
|
+
end
|
16
|
+
|
17
|
+
def emit config, messages
|
18
|
+
driver = create_driver config
|
19
|
+
|
20
|
+
driver.run do
|
21
|
+
messages.each do |message|
|
22
|
+
driver.emit message, @time
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
driver
|
27
|
+
end
|
28
|
+
|
29
|
+
def filtered driver, index
|
30
|
+
result = driver.filtered_as_array[index]
|
31
|
+
{tag: result[0], time: result[1], message: result[2]}
|
32
|
+
end
|
33
|
+
|
34
|
+
sub_test_case "configure" do
|
35
|
+
test "check default" do
|
36
|
+
assert_nothing_raised do
|
37
|
+
create_driver "default"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
sub_test_case "filter" do
|
43
|
+
test "with valid record" do
|
44
|
+
driver = emit "", [
|
45
|
+
{a: 1, b: {c: 2, d: {e: 3, f:4}, g: [10, 20, 30]}, h: [], i: {}},
|
46
|
+
{a: {b: {c: 1, d: {e: 2, f:3}, g: [10, 20, 30]}, h: [], i: {}}}
|
47
|
+
]
|
48
|
+
|
49
|
+
expect_message = {"a" => 1, "b.c" => 2, "b.d.e" => 3, "b.d.f" => 4, "b.g.0" => 10, "b.g.1" => 20, "b.g.2" => 30, "h" => nil, "i" => nil}
|
50
|
+
result = filtered driver, 0
|
51
|
+
assert_equal expect_message, result[:message]
|
52
|
+
|
53
|
+
expect_message = {"a.b.c" => 1, "a.b.d.e" => 2, "a.b.d.f" => 3, "a.b.g.0" => 10, "a.b.g.1" => 20, "a.b.g.2" => 30, "a.h" => nil, "a.i" => nil}
|
54
|
+
result = filtered driver, 1
|
55
|
+
assert_equal expect_message, result[:message]
|
56
|
+
end
|
57
|
+
|
58
|
+
test "with invalid record" do
|
59
|
+
driver = emit "", ["message", {hoge: 1, fuga: {"test0" => 2, "test1" => 3}}]
|
60
|
+
|
61
|
+
expect_message = {}
|
62
|
+
result = filtered driver, 0
|
63
|
+
assert_equal expect_message, result[:message]
|
64
|
+
|
65
|
+
expect_message = {"hoge" => 1, "fuga.test0" => 2, "fuga.test1" => 3}
|
66
|
+
result = filtered driver, 1
|
67
|
+
assert_equal expect_message, result[:message]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,209 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
require "fluent/plugin/nested_hash_filter/nested_object"
|
3
|
+
|
4
|
+
class NestedObjectTest < Test::Unit::TestCase
|
5
|
+
setup do
|
6
|
+
klass.init
|
7
|
+
end
|
8
|
+
|
9
|
+
sub_test_case "constants" do
|
10
|
+
test "::CONNECTOR" do
|
11
|
+
assert_equal ".", klass::CONNECTOR
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
sub_test_case "convert" do
|
16
|
+
test "convert by multi time" do
|
17
|
+
hash = {"a" => 1, "b" => {"c" => 2, "d" => 3}, "e" => [4, 5], "f" => {}, "g" => []}
|
18
|
+
output = klass.convert hash
|
19
|
+
assert_equal Set["a", "b.c", "b.d", "e.0", "e.1", "f", "g"], output.keys.to_set
|
20
|
+
assert_equal 1, output["a"]
|
21
|
+
assert_equal 2, output["b.c"]
|
22
|
+
assert_equal 3, output["b.d"]
|
23
|
+
assert_equal 4, output["e.0"]
|
24
|
+
assert_equal 5, output["e.1"]
|
25
|
+
assert_equal nil, output["f"]
|
26
|
+
assert_equal nil, output["g"]
|
27
|
+
|
28
|
+
hash = {"a" => {"b" => {"c" => 1, "d" => 2}, "e" => [3, 4]}}
|
29
|
+
output = klass.convert hash
|
30
|
+
assert_equal Set["a.b.c", "a.b.d", "a.e.0", "a.e.1"], output.keys.to_set
|
31
|
+
assert_equal 1, output["a.b.c"]
|
32
|
+
assert_equal 2, output["a.b.d"]
|
33
|
+
assert_equal 3, output["a.e.0"]
|
34
|
+
assert_equal 4, output["a.e.1"]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
sub_test_case "select" do
|
39
|
+
test "object is hash" do
|
40
|
+
klass.add_key "test"
|
41
|
+
object = {hoge: 1, fuga: "2"}
|
42
|
+
klass.select object
|
43
|
+
|
44
|
+
assert_equal Set["test.hoge", "test.fuga"], output.keys.to_set
|
45
|
+
assert_equal 1, output["test.hoge"]
|
46
|
+
assert_equal "2", output["test.fuga"]
|
47
|
+
end
|
48
|
+
|
49
|
+
test "object is array" do
|
50
|
+
klass.add_key "test"
|
51
|
+
object = [:hoge, "fuga"]
|
52
|
+
klass.select object
|
53
|
+
|
54
|
+
assert_equal Set["test.0", "test.1"], output.keys.to_set
|
55
|
+
assert_equal :hoge, output["test.0"]
|
56
|
+
assert_equal "fuga", output["test.1"]
|
57
|
+
end
|
58
|
+
|
59
|
+
test "object is string" do
|
60
|
+
klass.add_key "test"
|
61
|
+
object = "hoge"
|
62
|
+
klass.select object
|
63
|
+
|
64
|
+
assert_equal Set["test"], output.keys.to_set
|
65
|
+
assert_equal "hoge", output["test"]
|
66
|
+
end
|
67
|
+
|
68
|
+
test "object is number" do
|
69
|
+
klass.add_key "test"
|
70
|
+
object = 12345
|
71
|
+
klass.select object
|
72
|
+
|
73
|
+
assert_equal Set["test"], output.keys.to_set
|
74
|
+
assert_equal 12345, output["test"]
|
75
|
+
end
|
76
|
+
|
77
|
+
test "object is nil" do
|
78
|
+
klass.add_key "test"
|
79
|
+
object = nil
|
80
|
+
klass.select object
|
81
|
+
|
82
|
+
assert_equal Set["test"], output.keys.to_set
|
83
|
+
assert_equal nil, output["test"]
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
sub_test_case "add_key" do
|
88
|
+
test "add" do
|
89
|
+
klass.add_key "test"
|
90
|
+
assert_equal ["test"], output_keys
|
91
|
+
klass.add_key 1
|
92
|
+
assert_equal ["test", 1], output_keys
|
93
|
+
klass.add_key "hoge"
|
94
|
+
assert_equal ["test", 1, "hoge"], output_keys
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
sub_test_case "pop_key" do
|
99
|
+
test "remove key by pop" do
|
100
|
+
klass.add_key "test"
|
101
|
+
klass.add_key 1
|
102
|
+
klass.add_key "hoge"
|
103
|
+
assert_equal ["test", 1, "hoge"], output_keys
|
104
|
+
|
105
|
+
klass.pop_key
|
106
|
+
assert_equal ["test", 1], output_keys
|
107
|
+
|
108
|
+
klass.pop_key
|
109
|
+
assert_equal ["test"], output_keys
|
110
|
+
|
111
|
+
klass.pop_key
|
112
|
+
assert_equal [], output_keys
|
113
|
+
end
|
114
|
+
|
115
|
+
test "without output_keys" do
|
116
|
+
assert_nothing_raised do
|
117
|
+
klass.pop_key
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
sub_test_case "current_key" do
|
123
|
+
test "with output_keys" do
|
124
|
+
klass.add_key "test"
|
125
|
+
klass.add_key 1
|
126
|
+
assert_equal "test.1", klass.current_key
|
127
|
+
end
|
128
|
+
|
129
|
+
test "without output_keys" do
|
130
|
+
assert_equal "", klass.current_key
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
sub_test_case "update" do
|
135
|
+
test "with current_key" do
|
136
|
+
klass.add_key "test"
|
137
|
+
klass.add_key 1
|
138
|
+
klass.update 12345
|
139
|
+
|
140
|
+
assert_equal ["test.1"], output.keys
|
141
|
+
assert_equal 12345, output["test.1"]
|
142
|
+
end
|
143
|
+
|
144
|
+
test "without current_key" do
|
145
|
+
assert klass.current_key.empty?
|
146
|
+
klass.update 12345
|
147
|
+
|
148
|
+
assert_equal [], output.keys
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
sub_test_case "convert_hash" do
|
153
|
+
test "hash is blank" do
|
154
|
+
klass.add_key "test"
|
155
|
+
object = {}
|
156
|
+
klass.convert_hash object
|
157
|
+
assert_equal ["test"], output.keys
|
158
|
+
assert_equal nil, output["test"]
|
159
|
+
end
|
160
|
+
|
161
|
+
test "convert" do
|
162
|
+
klass.add_key "test"
|
163
|
+
object = {"a" => "hoge", "b" => 1, "c" => {"hoge" => "fuga"}, "d" => [10, 20], "e" => nil}
|
164
|
+
klass.convert_hash object
|
165
|
+
assert_equal ["test.a", "test.b", "test.c.hoge", "test.d.0", "test.d.1", "test.e"], output.keys
|
166
|
+
assert_equal "hoge", output["test.a"]
|
167
|
+
assert_equal 1, output["test.b"]
|
168
|
+
assert_equal "fuga", output["test.c.hoge"]
|
169
|
+
assert_equal 10, output["test.d.0"]
|
170
|
+
assert_equal 20, output["test.d.1"]
|
171
|
+
assert_equal nil, output["test.e"]
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
sub_test_case "convert_array" do
|
176
|
+
test "array is empty" do
|
177
|
+
klass.add_key "test"
|
178
|
+
object = []
|
179
|
+
klass.convert_array object
|
180
|
+
assert_equal ["test"], output.keys
|
181
|
+
assert_equal nil, output["test"]
|
182
|
+
end
|
183
|
+
|
184
|
+
test "convert" do
|
185
|
+
klass.add_key "test"
|
186
|
+
object = ["hoge", 1, {"hoge" => "fuga"}, [10, 20], nil]
|
187
|
+
klass.convert_array object
|
188
|
+
assert_equal ["test.0", "test.1", "test.2.hoge", "test.3.0", "test.3.1", "test.4"], output.keys
|
189
|
+
assert_equal "hoge", output["test.0"]
|
190
|
+
assert_equal 1, output["test.1"]
|
191
|
+
assert_equal "fuga", output["test.2.hoge"]
|
192
|
+
assert_equal 10, output["test.3.0"]
|
193
|
+
assert_equal 20, output["test.3.1"]
|
194
|
+
assert_equal nil, output["test.4"]
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
def output
|
199
|
+
klass.instance_variable_get :@output
|
200
|
+
end
|
201
|
+
|
202
|
+
def output_keys
|
203
|
+
klass.instance_variable_get :@output_keys
|
204
|
+
end
|
205
|
+
|
206
|
+
def klass
|
207
|
+
Fluent::NestedHashFilter::NestedObject
|
208
|
+
end
|
209
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
require "fluent/plugin/out_nested_hash"
|
3
|
+
|
4
|
+
class OutNestedHashTest < Test::Unit::TestCase
|
5
|
+
include Fluent
|
6
|
+
|
7
|
+
setup do
|
8
|
+
Fluent::Test.setup
|
9
|
+
@time = Fluent::Engine.now
|
10
|
+
end
|
11
|
+
|
12
|
+
def create_driver config = "", tag = "test"
|
13
|
+
driver = Fluent::Test::OutputTestDriver.new OutNestedHash, tag
|
14
|
+
driver.configure config
|
15
|
+
end
|
16
|
+
|
17
|
+
def emit config, tag, messages
|
18
|
+
driver = create_driver config, tag
|
19
|
+
|
20
|
+
driver.run do
|
21
|
+
messages.each do |message|
|
22
|
+
driver.emit message
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
driver
|
27
|
+
end
|
28
|
+
|
29
|
+
def emitted driver, index
|
30
|
+
result = driver.emits[index]
|
31
|
+
{tag: result[0], time: result[1], message: result[2]}
|
32
|
+
end
|
33
|
+
|
34
|
+
sub_test_case "configure" do
|
35
|
+
test "check_default" do
|
36
|
+
create_driver "default"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
sub_test_case "emit" do
|
41
|
+
test "with valid record" do
|
42
|
+
driver = emit "", "test", [
|
43
|
+
{a: 1, b: {c: 2, d: {e: 3, f:4}, g: [10, 20, 30]}, h: [], i: {}},
|
44
|
+
{a: {b: {c: 1, d: {e: 2, f:3}, g: [10, 20, 30]}, h: [], i: {}}}
|
45
|
+
]
|
46
|
+
|
47
|
+
expect_message = {"a" => 1, "b.c" => 2, "b.d.e" => 3, "b.d.f" => 4, "b.g.0" => 10, "b.g.1" => 20, "b.g.2" => 30, "h" => nil, "i" => nil}
|
48
|
+
result = emitted driver, 0
|
49
|
+
assert_equal "test", result[:tag]
|
50
|
+
assert_equal expect_message, result[:message]
|
51
|
+
|
52
|
+
expect_message = {"a.b.c" => 1, "a.b.d.e" => 2, "a.b.d.f" => 3, "a.b.g.0" => 10, "a.b.g.1" => 20, "a.b.g.2" => 30, "a.h" => nil, "a.i" => nil}
|
53
|
+
result = emitted driver, 1
|
54
|
+
assert_equal "test", result[:tag]
|
55
|
+
assert_equal expect_message, result[:message]
|
56
|
+
end
|
57
|
+
|
58
|
+
test "with invalid record" do
|
59
|
+
driver = emit "", "test", ["message", {hoge: 1, fuga: {"test0" => 2, "test1" => 3}}]
|
60
|
+
|
61
|
+
expect_message = {}
|
62
|
+
result = emitted driver, 0
|
63
|
+
assert_equal expect_message, result[:message]
|
64
|
+
|
65
|
+
expect_message = {"hoge" => 1, "fuga.test0" => 2, "fuga.test1" => 3}
|
66
|
+
result = emitted driver, 1
|
67
|
+
assert_equal "test", result[:tag]
|
68
|
+
assert_equal expect_message, result[:message]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: fluent-plugin-nested-hash-filter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- sugilog
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-06-28 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
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: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: fluentd
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
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: test-unit
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: guard
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: guard-test
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: Fluent Plugin for converting nested hash into flatten key-value pair.
|
98
|
+
email:
|
99
|
+
- sugilog@gmail.com
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- ".gitignore"
|
105
|
+
- ".travis.yml"
|
106
|
+
- Gemfile
|
107
|
+
- Guardfile
|
108
|
+
- README.md
|
109
|
+
- Rakefile
|
110
|
+
- fluent-plugin-nested-hash-filter.gemspec
|
111
|
+
- lib/fluent/plugin/filter_nested_hash.rb
|
112
|
+
- lib/fluent/plugin/nested_hash_filter/nested_object.rb
|
113
|
+
- lib/fluent/plugin/out_nested_hash.rb
|
114
|
+
- test/fluent/plugin/filter_nested_hash_test.rb
|
115
|
+
- test/fluent/plugin/nested_hash_filter/nested_object_test.rb
|
116
|
+
- test/fluent/plugin/out_nested_hash_test.rb
|
117
|
+
- test/test_helper.rb
|
118
|
+
homepage: https://github.com/sugilog/fluent-plugin-nested-hash-filter
|
119
|
+
licenses: []
|
120
|
+
metadata: {}
|
121
|
+
post_install_message:
|
122
|
+
rdoc_options: []
|
123
|
+
require_paths:
|
124
|
+
- lib
|
125
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - ">="
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '0'
|
130
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
131
|
+
requirements:
|
132
|
+
- - ">="
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: '0'
|
135
|
+
requirements: []
|
136
|
+
rubyforge_project:
|
137
|
+
rubygems_version: 2.4.5
|
138
|
+
signing_key:
|
139
|
+
specification_version: 4
|
140
|
+
summary: Fluent Plugin for converting nested hash into flatten key-value pair.
|
141
|
+
test_files: []
|