From eb93d70468161530e93542001016b1a6683c325f Mon Sep 17 00:00:00 2001 From: Holger Just Date: Mon, 7 Aug 2017 23:04:10 +0200 Subject: [PATCH] Add Message#copy_with to create an adjusted copy of an exising message You can overwrite any (or none) of the existing fields to create a new frozen copy of a message object. --- lib/rackstash/message.rb | 14 ++++++++++++++ spec/rackstash/message_spec.rb | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/lib/rackstash/message.rb b/lib/rackstash/message.rb index b22fa81..adf9de2 100644 --- a/lib/rackstash/message.rb +++ b/lib/rackstash/message.rb @@ -58,6 +58,20 @@ module Rackstash freeze end + # Create a new Message object based on the values in `self`, optionally + # overwriting any of the them. + # + # @param (see #initialize) + # @return [Message] a new Message + def copy_with(message = nil, severity: nil, time: nil, progname: nil) + self.class.new( + message.nil? ? self.message : message, + severity: severity.nil? ? self.severity : severity, + time: time.nil? ? self.time : time, + progname: progname.nil? ? self.progname : progname + ) + end + # @return [String] the human readable label for the {#severity}. # @see Rackstash.severity_label def severity_label diff --git a/spec/rackstash/message_spec.rb b/spec/rackstash/message_spec.rb index 4675c19..dca3942 100644 --- a/spec/rackstash/message_spec.rb +++ b/spec/rackstash/message_spec.rb @@ -12,6 +12,9 @@ require 'json' require 'rackstash/message' describe Rackstash::Message do + let(:message_args) { {} } + let(:message) { described_class.new 'message', **message_args } + describe '#initialize' do it 'encodes the message as UTF-8' do utf8_str = 'Dönerstraße' @@ -56,6 +59,35 @@ describe Rackstash::Message do end end + describe '#copy_with' do + it 'creates a new message instance' do + expect(message.copy_with).to be_instance_of described_class + expect(message.copy_with.message).to equal message.message + expect(message.copy_with.severity).to equal message.severity + expect(message.copy_with.progname).to equal message.progname + expect(message.copy_with.time).to equal message.time + + expect(message.copy_with).not_to equal message + end + + it 'can overwrite the message' do + expect(message.copy_with('new stuff').message).to eql 'new stuff' + end + + it 'can overwrite the severity' do + expect(message.copy_with(severity: 3).severity).to eql 3 + end + + it 'can overwrite the progname' do + expect(message.copy_with(progname: 'blar').progname).to eql 'blar' + end + + it 'can overwrite the progname' do + time = Time.now.freeze + expect(message.copy_with(time: time).time).to equal time + end + end + describe '#message' do it 'is aliased to to_str' do message = described_class.new('hello world')