From 9152b67df08db96f6285f27fa0f3df707e192cb3 Mon Sep 17 00:00:00 2001 From: Holger Just Date: Wed, 18 Jul 2018 12:41:25 +0200 Subject: [PATCH] Allow to pass initializer arguments to the encoder of a flow --- lib/rackstash/flow.rb | 12 ++++++------ spec/rackstash/flow_spec.rb | 12 ++++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/rackstash/flow.rb b/lib/rackstash/flow.rb index e0a4322..7190df8 100644 --- a/lib/rackstash/flow.rb +++ b/lib/rackstash/flow.rb @@ -178,17 +178,17 @@ module Rackstash # Get or set the encoder for the log {#adapter}. If this value is not # explicitly defined, it defaults to the #{adapter}'s default encoder. # - # @param encoder [#encode, nil] if given, set the flow's encoder to this - # object + # @param encoder_spec (see Rackstash::Encoder.build) + # @param encoder_args (see Rackstash::Encoder.build) + # @param block (see Rackstash::Encoder.build) # @raise [TypeError] if the given `encoder` does not respond to the `encode` # method # @return [#encode] the newly set encoder (if given) or the currently # defined one # @see #encoder= - def encoder(encoder = nil) - return @encoder if encoder.nil? - self.encoder = encoder - @encoder + def encoder(encoder_spec = nil, *encoder_args, &block) + return @encoder if encoder_spec.nil? + @encoder = Rackstash::Encoder.build(encoder_spec, *encoder_args, &block) end # Set the encoder for the log {#adapter}. You can use any object which diff --git a/spec/rackstash/flow_spec.rb b/spec/rackstash/flow_spec.rb index 58a102a..8944f64 100644 --- a/spec/rackstash/flow_spec.rb +++ b/spec/rackstash/flow_spec.rb @@ -211,6 +211,18 @@ RSpec.describe Rackstash::Flow do # The encoder is persisted and is returned afterwards expect(flow.encoder).to equal encoder end + + it 'allows to set an encoder spec' do + expect { flow.encoder(:json) }.to change { flow.encoder } + .from(instance_of(Rackstash::Encoder::Raw)) + .to(instance_of(Rackstash::Encoder::JSON)) + end + + it 'allows to set arguments to an encoder' do + flow.encoder(:message, tagged: ['tags']) + expect(flow.encoder).to be_instance_of(Rackstash::Encoder::Message) + expect(flow.encoder.tagged).to eql ['tags'] + end end describe '#encoder=' do