1
0
mirror of https://github.com/meineerde/rackstash.git synced 2026-02-01 01:37:12 +00:00

Preserve existing field mappings for encoder fields

This commit is contained in:
Holger Just 2018-07-17 21:39:37 +02:00
parent 3167574607
commit d510280532
2 changed files with 52 additions and 4 deletions

View File

@ -18,19 +18,29 @@ module Rackstash
private
def set_fields_mapping(fields, default = {})
@fields_map = default.dup
Hash(fields).each_pair do |key, value|
@fields_map[key.to_sym] = utf8_encode(value)
@fields_map ||= {}
default.each do |key, value|
if fields.key?(key)
@fields_map[key] = utf8_encode(fields[key])
else
# Preserve existing mappings which might have been set by a
# previous call to {#set_fields_mapping}
@fields_map[key] ||= utf8_encode(value)
end
end
end
def extract_field(name, event)
field_name = @fields_map[name]
field_name = field(name)
field = event.delete(field_name) if field_name
field = yield(field_name) if field.nil? && block_given?
field
end
def field(name)
@fields_map[name]
end
end
end
end

View File

@ -26,6 +26,44 @@ RSpec.describe Rackstash::Encoder::Helper::FieldsMap do
}
}
describe '#set_fields_mapping' do
it 'sets a default mapping' do
helper.set_fields_mapping({}, { field: 'default' })
expect(helper.field(:field)).to eql 'default'
end
it 'sets default fields as strings' do
helper.set_fields_mapping({}, { number: 123 })
expect(helper.field(:number)).to eql '123'
end
it 'sets fields as strings' do
helper.set_fields_mapping({ number: 42 }, { number: 'something' })
expect(helper.field(:number)).to eql '42'
end
it 'overwrites fields on subsequent calls' do
helper.set_fields_mapping({ field: 'overwritten' }, { field: 'default' })
expect(helper.field(:field)).to eql 'overwritten'
helper.set_fields_mapping({ field: 'again' }, { field: 'other_default' })
expect(helper.field(:field)).to eql 'again'
end
it 'keeps existing default fields on subsequent calls' do
helper.set_fields_mapping({}, { field: 'foo' })
expect(helper.field(:field)).to eql 'foo'
helper.set_fields_mapping({}, { field: 'bar' })
expect(helper.field(:field)).to eql 'foo'
end
it 'ignores fields not defined as a default field' do
helper.set_fields_mapping({invalid: 'invalid' }, { known: 'known' })
expect(helper.field(:invalid)).to be_nil
end
end
describe '#extract_field' do
context 'with defaults' do
let(:defaults) { { default: 'foo' } }