logasm 0.8.1 → 0.9.0

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 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