From 7dc3bb0f5e981df1ff46861ba9c69464b4719edf Mon Sep 17 00:00:00 2001 From: Zee Date: Wed, 15 Jan 2020 10:46:20 -0800 Subject: [PATCH] Developers may include debug messages in their application logs (#1) * Developers may include debug messages in their application logs There were some breaking changes with how the griddler gem was packaged. This caused rake to fail until we downloaded the photos and updated the spec helper. * Use Ruby 2.0 compliant syntax for defining protected methods --- lib/griddler/mandrill.rb | 3 ++- lib/griddler/mandrill/adapter.rb | 7 +++++++ lib/griddler/mandrill/logging.rb | 28 ++++++++++++++++++++++++++++ spec/fixtures/photo1.jpg | Bin 0 -> 6753 bytes spec/fixtures/photo2.jpg | Bin 0 -> 8941 bytes spec/spec_helper.rb | 8 ++++++++ 6 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 lib/griddler/mandrill/logging.rb create mode 100644 spec/fixtures/photo1.jpg create mode 100644 spec/fixtures/photo2.jpg diff --git a/lib/griddler/mandrill.rb b/lib/griddler/mandrill.rb index 71c86c0..2bf068a 100644 --- a/lib/griddler/mandrill.rb +++ b/lib/griddler/mandrill.rb @@ -1,5 +1,6 @@ require 'griddler' require 'griddler/mandrill/version' require 'griddler/mandrill/adapter' +require 'griddler/mandrill/logging' -Griddler.adapter_registry.register(:mandrill, Griddler::Mandrill::Adapter) +Griddler.adapter_registry.register(:mandrill, Griddler::Mandrill::Adapter) \ No newline at end of file diff --git a/lib/griddler/mandrill/adapter.rb b/lib/griddler/mandrill/adapter.rb index 4d5cd70..0316e51 100644 --- a/lib/griddler/mandrill/adapter.rb +++ b/lib/griddler/mandrill/adapter.rb @@ -12,6 +12,7 @@ def self.normalize_params(params) end def normalize_params + logger.debug(message: "entered #normalize_params", events: events) events.select do |event| event[:spf].present? && (event[:spf][:result] == 'pass' || event[:spf][:result] == 'neutral') end.map do |event| @@ -32,6 +33,12 @@ def normalize_params end end + protected + + def logger + Logging.logger + end + private attr_reader :params diff --git a/lib/griddler/mandrill/logging.rb b/lib/griddler/mandrill/logging.rb new file mode 100644 index 0000000..4a0a6a0 --- /dev/null +++ b/lib/griddler/mandrill/logging.rb @@ -0,0 +1,28 @@ +module Griddler + module Mandrill + module Logging + # The default logger discards all message; as we do not want + # to start clogging up existing users logs. + def self.logger + @logger ||= NullLogger.new(STDOUT) + end + + # Set your application's logger + # @example In a Rails initializer: + # Griddler::Mandrill::Logging.logger = Rails.logger + # @example In Rails while logging a different level than the default logger + # Griddler::Mandrill::Logging.logger = ActiveSupport::Logger.new(Rails.logger, level: :debug) + def self.logger=(logger) + @logger = logger + end + + # A logger which discards messages + class NullLogger < Logger + # Overload the Logger#add method as this is where the #info/#warn/#error methods + # send their messags to the logging subsystem. + def add(*_arguments) + end + end + end + end +end \ No newline at end of file diff --git a/spec/fixtures/photo1.jpg b/spec/fixtures/photo1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3d554863349a55ba126045f938a14adf032203c0 GIT binary patch literal 6753 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 QQH&4@z-Xu->CMdl0a@OMwEzGB literal 0 HcmV?d00001 diff --git a/spec/fixtures/photo2.jpg b/spec/fixtures/photo2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..852d3bd78e9bd8ecd4c76c1b0cd929b78a7d6fec GIT binary patch literal 8941 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