logasm 0.8.1 → 0.9.0

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: 6f563cce04590bb7f18f91f0546b67c9cfb6317b
4
- data.tar.gz: d0351070693d8d0e2ea59d1e05de36d9db34e016
3
+ metadata.gz: 3c09d965be2c9ada94a7ee35d4b7518f411b9a81
4
+ data.tar.gz: d3442723ac39e8661ac4d789b159aca7f2152895
5
5
  SHA512:
6
- metadata.gz: b2904cdfca1b3020475ef4695910c646d768ba548a24333046ade905d8ddf9a2e4e867189509ca47ede5a4f0bcf99180cf4182b74509855db5c57f325ae5b674
7
- data.tar.gz: 800f52b72bf15df87d88537589a8e25a4affb05c69a45933e9978b5d1c14ae4ebf67f87b71b5a92d5fefcf0629e011298c9e0440aa62f5ebfc4c5e1014ec2363
6
+ metadata.gz: 5a896dc77965ca1b6022ec65918327b8a94435d85ae592e6a516bed903f2588f4b1257e692c7e5915f5431af2564ec14fe9e73b6627d689b0f8f2b4a035df48d
7
+ data.tar.gz: 32deab6ec961e0ffdc123ec6065fa09eabf4a604740c98a9782aeaaf7927f6c5e0160bc99574a94018dcff667aec84eeab62f2de8349af46d84f7a6add776354
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-2.1.2
1
+ ruby-2.4.1
data/Gemfile CHANGED
@@ -1,8 +1,8 @@
1
1
  source "https://rubygems.org"
2
2
 
3
3
  group :test, :development do
4
- gem 'rspec'
5
4
  gem 'pry'
5
+ gem 'rspec'
6
6
  end
7
7
 
8
8
  gemspec
@@ -0,0 +1,52 @@
1
+ require 'bundler/setup'
2
+ require 'logasm/preprocessors/whitelist'
3
+ require 'benchmark/ips'
4
+
5
+ pointers = %w[
6
+ /scalar
7
+ /flat_hash/~
8
+ /nested_hash/~/deep_hash/~
9
+ /flat_array/~
10
+ /nested_array/~/deep_array/~
11
+ ]
12
+
13
+ preprocessor = Logasm::Preprocessors::Whitelist.new(pointers: pointers)
14
+
15
+
16
+ Benchmark.ips do |x|
17
+ x.config(time: 5, warmup: 2)
18
+
19
+ x.report('Scalar value whitelisting') do
20
+ preprocessor.process(scalar: 'value', bad_scalar: 'value', hash: {})
21
+ end
22
+
23
+ x.report('Flat hash whitelisting') do
24
+ preprocessor.process(flat_hash: { scalar: 'value', array: [1, 2], hash: {} })
25
+ end
26
+
27
+ x.report('Nested hash whitelisting') do
28
+ preprocessor.process(
29
+ nested_hash: {
30
+ next_level_hash: {
31
+ deep_hash: { scalar: 'value', array: [1, 2] }
32
+ },
33
+ next_level_hash2: {
34
+ deep_hash: { scalar: 'value', array: [1, 2] }
35
+ },
36
+ next_level_hash3: {
37
+ deep_hash: { scalar: 'value', array: [1, 2] }
38
+ }
39
+ }
40
+ )
41
+ end
42
+
43
+ x.report('Flat array whitelisting') do
44
+ preprocessor.process(
45
+ nested_array: [
46
+ { deep_array: [1, 2, 3] },
47
+ { deep_array: [1, 2, 3] },
48
+ { deep_array: [1, 2, 3] }
49
+ ]
50
+ )
51
+ end
52
+ end
@@ -0,0 +1,40 @@
1
+ require 'lru_redux'
2
+
3
+ class Logasm
4
+ module Preprocessors
5
+ class JSONPointerTrie
6
+ SEPARATOR = '/'.freeze
7
+ WILDCARD = '~'.freeze
8
+ DEFAULT_CACHE_SIZE = 100
9
+
10
+ def initialize(cache_size: DEFAULT_CACHE_SIZE, **)
11
+ @root_node = {}
12
+ @cache = LruRedux::Cache.new(cache_size)
13
+ end
14
+
15
+ def insert(pointer)
16
+ split_path(pointer).reduce(@root_node) do |tree, key|
17
+ tree[key] ||= {}
18
+ end
19
+
20
+ self
21
+ end
22
+
23
+ def include?(path)
24
+ @cache.getset(path) { traverse_path(path) }
25
+ end
26
+
27
+ private
28
+
29
+ def traverse_path(path)
30
+ split_path(path).reduce(@root_node) do |node, key|
31
+ node[key] || node[WILDCARD] || (break false)
32
+ end
33
+ end
34
+
35
+ def split_path(path)
36
+ path.split(SEPARATOR).reject(&:empty?)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,28 +1,23 @@
1
+ require 'logasm/preprocessors/json_pointer_trie'
2
+
1
3
  class Logasm
2
4
  module Preprocessors
3
5
  class Whitelist
4
-
5
- DEFAULT_WHITELIST = %w(/id /message /correlation_id /queue)
6
- MASK_SYMBOL = '*'
6
+ DEFAULT_WHITELIST = %w[/id /message /correlation_id /queue].freeze
7
+ MASK_SYMBOL = '*'.freeze
7
8
  MASKED_VALUE = MASK_SYMBOL * 5
8
- WILDCARD = '~'
9
9
 
10
10
  class InvalidPointerFormatException < Exception
11
11
  end
12
12
 
13
13
  def initialize(config = {})
14
14
  pointers = (config[:pointers] || []) + DEFAULT_WHITELIST
15
- decoded_pointers = pointers
16
- .each(&method(:validate_pointer))
17
- .map(&method(:decode))
18
- @fields_to_include = decoded_pointers.inject({}) do |mem, pointer|
19
- mem.merge(pointer => true)
15
+
16
+ @trie = pointers.reduce(JSONPointerTrie.new(config)) do |trie, pointer|
17
+ validate_pointer(pointer)
18
+
19
+ trie.insert(decode(pointer))
20
20
  end
21
- @wildcards = decoded_pointers
22
- .select(&method(:has_wildcard?))
23
- .inject({}) do |mem, pointer|
24
- mem.merge(get_wildcard_roots_of(pointer))
25
- end
26
21
  end
27
22
 
28
23
  def process(data)
@@ -31,38 +26,9 @@ class Logasm
31
26
 
32
27
  private
33
28
 
34
-
35
- def has_wildcard?(pointer)
36
- pointer.include?("/#{WILDCARD}/") || pointer.end_with?("/#{WILDCARD}")
37
- end
38
-
39
- # From a pointer with wildcards builds a hash with roots that contains a wildcard. Hash is used to easily match
40
- # find if hash element matches the pointer while processing the log.
41
- #
42
- # Example:
43
- #
44
- # Input:
45
- # "/array/~/nested_array/~/fields"
46
- #
47
- # Output:
48
- # {
49
- # "/array/~/nested_array/~" => true,
50
- # "/array/~" => true
51
- # }
52
- #
53
- def get_wildcard_roots_of(pointer)
54
- if (index = pointer.rindex("/#{WILDCARD}/"))
55
- wildcard_root = pointer.slice(0, index + 2)
56
- wildcard_path = pointer.end_with?(WILDCARD) ? pointer : wildcard_root
57
- get_wildcard_roots_of(wildcard_root).merge(wildcard_path => true)
58
- else
59
- {pointer => true}
60
- end
61
- end
62
-
63
29
  def validate_pointer(pointer)
64
30
  if pointer.slice(-1) == '/'
65
- raise InvalidPointerFormatException.new('Pointer should not contain trailing slash')
31
+ raise InvalidPointerFormatException, 'Pointer should not contain trailing slash'
66
32
  end
67
33
  end
68
34
 
@@ -73,52 +39,30 @@ class Logasm
73
39
  end
74
40
 
75
41
  def process_data(parent_pointer, data)
76
- self.send("process_#{get_type(data)}", parent_pointer, data)
77
- end
42
+ return MASKED_VALUE unless @trie.include?(parent_pointer)
43
+
44
+ case data
45
+ when Hash
46
+ process_hash(parent_pointer, data)
47
+
48
+ when Array
49
+ process_array(parent_pointer, data)
78
50
 
79
- def get_type(data)
80
- if data.is_a? Hash
81
- 'hash'
82
- elsif data.is_a? Array
83
- 'array'
84
51
  else
85
- 'value'
52
+ data
86
53
  end
87
54
  end
88
55
 
89
56
  def process_hash(parent_pointer, hash)
90
- create_child_pointer =
91
- if @wildcards["#{parent_pointer}/~"]
92
- lambda { |_| "#{parent_pointer}/~" }
93
- else
94
- lambda { |key| "#{parent_pointer}/#{key}" }
95
- end
96
- hash.inject({}) do |mem, (key, value)|
97
- pointer = create_child_pointer.call(key)
98
- processed_value = process_data(pointer, value)
99
- mem.merge(key => processed_value)
57
+ hash.each_with_object({}) do |(key, value), result|
58
+ processed = process_data("#{parent_pointer}/#{key}", value)
59
+ result[key] = processed
100
60
  end
101
61
  end
102
62
 
103
63
  def process_array(parent_pointer, array)
104
- create_child_pointer =
105
- if @wildcards["#{parent_pointer}/~"]
106
- lambda { |_| "#{parent_pointer}/~" }
107
- else
108
- lambda { |index| "#{parent_pointer}/#{index}" }
109
- end
110
- array.each_with_index.inject([]) do |mem, (value, index)|
111
- pointer = create_child_pointer.call(index)
112
- processed_value = process_data(pointer, value)
113
- mem + [processed_value]
114
- end
115
- end
116
-
117
- def process_value(parent_pointer, value)
118
- if @fields_to_include[parent_pointer]
119
- value
120
- else
121
- MASKED_VALUE
64
+ array.each_with_index.map do |value, index|
65
+ process_data("#{parent_pointer}/#{index}", value)
122
66
  end
123
67
  end
124
68
  end
data/logasm.gemspec CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |gem|
6
6
  gem.name = "logasm"
7
- gem.version = '0.8.1'
7
+ gem.version = '0.9.0'
8
8
  gem.authors = ["Salemove"]
9
9
  gem.email = ["support@salemove.com"]
10
10
  gem.description = %q{It's logasmic}
@@ -17,8 +17,10 @@ Gem::Specification.new do |gem|
17
17
  gem.require_paths = ["lib"]
18
18
 
19
19
  gem.add_dependency 'inflecto'
20
+ gem.add_dependency 'lru_redux'
20
21
 
21
22
  gem.add_development_dependency "bundler", "~> 1.3"
22
23
  gem.add_development_dependency "rake"
23
24
  gem.add_development_dependency "bunny"
25
+ gem.add_development_dependency "benchmark-ips"
24
26
  end
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+ require 'logasm/preprocessors/json_pointer_trie'
3
+
4
+ RSpec.describe Logasm::Preprocessors::JSONPointerTrie do
5
+ let(:trie) { described_class.new }
6
+
7
+ describe '#includes?' do
8
+ it 'returns true for empty prefix' do
9
+ expect(trie).to include('')
10
+ end
11
+
12
+ it 'returns true if trie contains requested prefix or value itself' do
13
+ trie.insert('/data/nested/key')
14
+
15
+ expect(trie).to include('/data')
16
+ expect(trie).to include('/data/nested')
17
+ expect(trie).to include('/data/nested/key')
18
+ end
19
+
20
+ it 'returns false if trie does not contain requested prefix or value' do
21
+ trie.insert('/data/nested/key')
22
+
23
+ expect(trie).to_not include('/bad_data')
24
+ expect(trie).to_not include('/data/bad_nested')
25
+ expect(trie).to_not include('/data/nested/bad_key')
26
+ end
27
+
28
+ it 'returns true if trie contains requested prefix under wildcard' do
29
+ trie.insert('/data/~/key')
30
+
31
+ expect(trie).to include('/data/arbitrary_key/key')
32
+ expect(trie).to include('/data/another_key/key')
33
+ expect(trie).to_not include('/data/arbitrary_key/bad_nested_key')
34
+ end
35
+ end
36
+ end
@@ -4,24 +4,24 @@ require_relative '../../lib/logasm/preprocessors/whitelist'
4
4
  describe Logasm::Preprocessors::Whitelist do
5
5
  subject(:processed_data) { described_class.new(config).process(data) }
6
6
 
7
- let(:config) { {pointers: pointers} }
7
+ let(:config) { { pointers: pointers } }
8
8
  let(:pointers) { [] }
9
- let(:data) {{
10
- field: 'secret',
11
- data: {
12
- field: 'secret'
13
- },
14
- array: [{field: 'secret'}]
15
- }}
9
+ let(:data) do
10
+ {
11
+ field: 'secret',
12
+ data: {
13
+ field: 'secret'
14
+ },
15
+ array: [{ field: 'secret' }]
16
+ }
17
+ end
16
18
 
17
19
  it 'masks all non-whitelisted fields' do
18
- expect(processed_data).to eq({
20
+ expect(processed_data).to eq(
19
21
  field: '*****',
20
- data: {
21
- field: '*****'
22
- },
23
- array: [{field: '*****'}]
24
- })
22
+ data: '*****',
23
+ array: '*****'
24
+ )
25
25
  end
26
26
 
27
27
  context 'when pointer has trailing slash' do
@@ -36,13 +36,11 @@ describe Logasm::Preprocessors::Whitelist do
36
36
  let(:pointers) { ['/field'] }
37
37
 
38
38
  it 'includes the field' do
39
- expect(processed_data).to eq({
39
+ expect(processed_data).to eq(
40
40
  field: 'secret',
41
- data: {
42
- field: '*****'
43
- },
44
- array: [{field: '*****'}]
45
- })
41
+ data: '*****',
42
+ array: '*****'
43
+ )
46
44
  end
47
45
  end
48
46
 
@@ -50,13 +48,13 @@ describe Logasm::Preprocessors::Whitelist do
50
48
  let(:pointers) { ['/data/field'] }
51
49
 
52
50
  it 'includes nested field' do
53
- expect(processed_data).to eq({
51
+ expect(processed_data).to eq(
54
52
  field: '*****',
55
53
  data: {
56
54
  field: 'secret'
57
55
  },
58
- array: [{field: '*****'}]
59
- })
56
+ array: '*****'
57
+ )
60
58
  end
61
59
  end
62
60
 
@@ -64,62 +62,70 @@ describe Logasm::Preprocessors::Whitelist do
64
62
  let(:pointers) { ['/array/0/field'] }
65
63
 
66
64
  it 'includes array element' do
67
- expect(processed_data).to eq({
65
+ expect(processed_data).to eq(
68
66
  field: '*****',
69
- data: {
70
- field: '*****'
71
- },
72
- array: [{field: 'secret'}]
73
- })
67
+ data: '*****',
68
+ array: [{ field: 'secret' }]
69
+ )
74
70
  end
75
71
  end
76
72
 
77
73
  context 'with whitelisted hash' do
78
74
  it 'includes all whitelisted hash elements' do
79
- source = {foo: {bar: 'baz'}}
80
- target = {foo: {bar: 'baz'}}
75
+ source = { foo: { bar: 'baz' } }
76
+ target = { foo: { bar: 'baz' } }
81
77
  expect(process(['/foo/~'], source)).to eq(target)
82
78
  end
83
79
 
84
80
  it 'does not include nested elements' do
85
- source = {foo: {bar: {baz: 'asd'}}}
86
- target = {foo: {bar: {baz: '*****'}}}
81
+ source = { foo: { bar: { baz: 'asd' } } }
82
+ target = { foo: { bar: { baz: '*****' } } }
87
83
  expect(process(['/foo/~'], source)).to eq(target)
88
84
  end
89
85
  end
90
86
 
91
87
  context 'with whitelisted array elements field with wildcard' do
92
- let(:data) {{
93
- array: [{field: 'data1', secret: 'secret1'}, {field: 'data2', secret: 'secret2'}]
94
- }}
88
+ let(:data) do
89
+ {
90
+ array: [
91
+ { field: 'data1', secret: 'secret1' },
92
+ { field: 'data2', secret: 'secret2' }
93
+ ]
94
+ }
95
+ end
95
96
  let(:pointers) { ['/array/~/field'] }
96
97
 
97
98
  it 'includes array elements field' do
98
99
  expect(processed_data).to include(
99
- array: [{field: 'data1', secret: '*****'}, {field: 'data2', secret: '*****'}]
100
+ array: [
101
+ { field: 'data1', secret: '*****' },
102
+ { field: 'data2', secret: '*****' }
103
+ ]
100
104
  )
101
105
  end
102
106
  end
103
107
 
104
108
  context 'with whitelisted string array elements with wildcard' do
105
- let(:data) {{
106
- array: ['secret', 'secret']
107
- }}
109
+ let(:data) do
110
+ { array: %w[secret secret] }
111
+ end
108
112
  let(:pointers) { ['/array/~'] }
109
113
 
110
114
  it 'includes array elements' do
111
- expect(processed_data).to include(array: ['secret', 'secret'])
115
+ expect(processed_data).to include(array: %w[secret secret])
112
116
  end
113
117
  end
114
118
 
115
119
  context 'with whitelisted string array elements in an array with wildcard' do
116
- let(:data) {{
117
- nested: [{array: ['secret', 'secret']}]
118
- }}
120
+ let(:data) do
121
+ {
122
+ nested: [{ array: %w[secret secret] }]
123
+ }
124
+ end
119
125
  let(:pointers) { ['/nested/~/array/~'] }
120
126
 
121
127
  it 'includes array elements' do
122
- expect(processed_data).to include(nested: [{array: ['secret', 'secret']}])
128
+ expect(processed_data).to include(nested: [{ array: %w[secret secret] }])
123
129
  end
124
130
  end
125
131
 
@@ -128,7 +134,7 @@ describe Logasm::Preprocessors::Whitelist do
128
134
  let(:pointers) { ['/array/0'] }
129
135
 
130
136
  it 'masks array element' do
131
- expect(processed_data).to include(array: [{field: '*****'}])
137
+ expect(processed_data).to include(array: [{ field: '*****' }])
132
138
  end
133
139
  end
134
140
 
@@ -136,7 +142,7 @@ describe Logasm::Preprocessors::Whitelist do
136
142
  let(:pointers) { ['/array'] }
137
143
 
138
144
  it 'masks array' do
139
- expect(processed_data).to include(array: [{field: '*****'}])
145
+ expect(processed_data).to include(array: ['*****'])
140
146
  end
141
147
  end
142
148
 
@@ -144,12 +150,12 @@ describe Logasm::Preprocessors::Whitelist do
144
150
  let(:pointers) { ['/data'] }
145
151
 
146
152
  it 'masks hash' do
147
- expect(processed_data).to include(data: {field: '*****'})
153
+ expect(processed_data).to include(data: { field: '*****' })
148
154
  end
149
155
  end
150
156
 
151
157
  context 'when boolean present' do
152
- let(:data) { {bool: true} }
158
+ let(:data) { { bool: true } }
153
159
 
154
160
  it 'masks it with asteriks' do
155
161
  expect(processed_data).to eq(bool: '*****')
@@ -157,31 +163,9 @@ describe Logasm::Preprocessors::Whitelist do
157
163
  end
158
164
 
159
165
  context 'when field has slash in the name' do
160
- let(:data) {{
161
- 'field_with_/' => 'secret'
162
- }}
163
- let(:pointers) { ['/field_with_~1'] }
164
-
165
- it 'includes field' do
166
- expect(processed_data).to include('field_with_/'=> 'secret')
167
- end
168
- end
169
-
170
- context 'when field has tilde in the name' do
171
- let(:data) {{
172
- 'field_with_~' => 'secret'
173
- }}
174
- let(:pointers) { ['/field_with_~0'] }
175
-
176
- it 'includes field' do
177
- expect(processed_data).to include('field_with_~'=> 'secret')
166
+ let(:data) do
167
+ { 'field_with_/' => 'secret' }
178
168
  end
179
- end
180
-
181
- context 'when field has slash in the name' do
182
- let(:data) {{
183
- 'field_with_/' => 'secret'
184
- }}
185
169
  let(:pointers) { ['/field_with_~1'] }
186
170
 
187
171
  it 'includes field' do
@@ -190,9 +174,9 @@ describe Logasm::Preprocessors::Whitelist do
190
174
  end
191
175
 
192
176
  context 'when field has tilde in the name' do
193
- let(:data) {{
194
- 'field_with_~' => 'secret'
195
- }}
177
+ let(:data) do
178
+ { 'field_with_~' => 'secret' }
179
+ end
196
180
  let(:pointers) { ['/field_with_~0'] }
197
181
 
198
182
  it 'includes field' do
@@ -201,9 +185,9 @@ describe Logasm::Preprocessors::Whitelist do
201
185
  end
202
186
 
203
187
  context 'when field has tilde and 1' do
204
- let(:data) {{
205
- 'field_with_~1' => 'secret'
206
- }}
188
+ let(:data) do
189
+ { 'field_with_~1' => 'secret' }
190
+ end
207
191
  let(:pointers) { ['/field_with_~01'] }
208
192
 
209
193
  it 'includes field' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logasm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Salemove
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-10-24 00:00:00.000000000 Z
11
+ date: 2017-12-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: inflecto
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: lru_redux
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: bundler
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +80,20 @@ dependencies:
66
80
  - - ">="
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: benchmark-ips
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'
69
97
  description: It's logasmic
70
98
  email:
71
99
  - support@salemove.com
@@ -80,6 +108,7 @@ files:
80
108
  - Gemfile
81
109
  - README.md
82
110
  - Rakefile
111
+ - benchmark/whitelisting.rb
83
112
  - lib/logasm.rb
84
113
  - lib/logasm/adapters.rb
85
114
  - lib/logasm/adapters/logstash_adapter.rb
@@ -90,6 +119,7 @@ files:
90
119
  - lib/logasm/null_logger.rb
91
120
  - lib/logasm/preprocessors.rb
92
121
  - lib/logasm/preprocessors/blacklist.rb
122
+ - lib/logasm/preprocessors/json_pointer_trie.rb
93
123
  - lib/logasm/preprocessors/whitelist.rb
94
124
  - lib/logasm/utils.rb
95
125
  - logasm.gemspec
@@ -100,6 +130,7 @@ files:
100
130
  - spec/adapters/stdout_json_adapter_spec.rb
101
131
  - spec/logasm_spec.rb
102
132
  - spec/preprocessors/blacklist_spec.rb
133
+ - spec/preprocessors/json_pointer_trie.rb
103
134
  - spec/preprocessors/whitelist_spec.rb
104
135
  - spec/spec_helper.rb
105
136
  - spec/support/implement_interface.rb
@@ -124,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
155
  version: '0'
125
156
  requirements: []
126
157
  rubyforge_project:
127
- rubygems_version: 2.4.5.2
158
+ rubygems_version: 2.6.11
128
159
  signing_key:
129
160
  specification_version: 4
130
161
  summary: What description said
@@ -136,6 +167,7 @@ test_files:
136
167
  - spec/adapters/stdout_json_adapter_spec.rb
137
168
  - spec/logasm_spec.rb
138
169
  - spec/preprocessors/blacklist_spec.rb
170
+ - spec/preprocessors/json_pointer_trie.rb
139
171
  - spec/preprocessors/whitelist_spec.rb
140
172
  - spec/spec_helper.rb
141
173
  - spec/support/implement_interface.rb