diff --git a/lib/rackstash/buffer_stack.rb b/lib/rackstash/buffer_stack.rb index 626d30a..2c5cd4b 100644 --- a/lib/rackstash/buffer_stack.rb +++ b/lib/rackstash/buffer_stack.rb @@ -16,11 +16,18 @@ module Rackstash def initialize(sink) @sink = sink + @stack = [] end - # TODO: this is only a spike for now - def with_buffer - yield Buffer.new(@sink) + # Get the current, i.e., latest, top-most, {Buffer} on the internal stack. + # If no Buffer was pushed yet with {#push}, this will be an implicit + # non-buffering Buffer and add it to the stack. + # + # @return [Buffer] + def current + @stack.last || Buffer.new(@sink, buffering: false).tap do |buffer| + @stack.push buffer + end end end end diff --git a/lib/rackstash/logger.rb b/lib/rackstash/logger.rb index 1eb027f..5f82514 100644 --- a/lib/rackstash/logger.rb +++ b/lib/rackstash/logger.rb @@ -224,16 +224,13 @@ module Rackstash end end - now = Time.now.utc.freeze - buffer_stack.with_buffer do |buffer| - buffer.add_message Message.new( - msg, - time: now, - progname: progname, - severity: severity, - formatter: formatter - ) - end + buffer.add_message Message.new( + msg, + time: Time.now.utc.freeze, + progname: progname, + severity: severity, + formatter: formatter + ) msg end @@ -244,5 +241,9 @@ module Rackstash def buffer_stack @buffer_stack ||= Rackstash::BufferStack.new(@sink) end + + def buffer + buffer_stack.current + end end end diff --git a/spec/rackstash/buffer_stack_spec.rb b/spec/rackstash/buffer_stack_spec.rb index 0d89245..a4d03c4 100644 --- a/spec/rackstash/buffer_stack_spec.rb +++ b/spec/rackstash/buffer_stack_spec.rb @@ -11,12 +11,14 @@ describe Rackstash::BufferStack do let(:sink) { instance_double(Rackstash::Sink) } let(:stack) { Rackstash::BufferStack.new(sink) } - describe '#with_buffer' do + describe '#current' do it 'initializes a buffer' do - stack.with_buffer do |buffer| - expect(buffer).to be_a Rackstash::Buffer - expect(buffer.sink).to equal sink - end + expect(stack.current).to be_a Rackstash::Buffer + expect(stack.current.sink).to equal sink + end + + it 'repeatedly returns the same buffer' do + expect(stack.current).to equal stack.current end end end diff --git a/spec/rackstash/logger_spec.rb b/spec/rackstash/logger_spec.rb index e65a4d4..733eac9 100644 --- a/spec/rackstash/logger_spec.rb +++ b/spec/rackstash/logger_spec.rb @@ -115,9 +115,9 @@ describe Rackstash::Logger do let(:buffer_stack) { double('Rackstash::BufferStack').tap do |buffer_stack| - expect(buffer_stack).to receive(:with_buffer) + expect(buffer_stack).to receive(:current) .at_least(:once) - .and_yield(buffer) + .and_return(buffer) end }