Skip to content

Commit

Permalink
Refactor ReplayLogger to extend Logger
Browse files Browse the repository at this point in the history
  • Loading branch information
bkeepers committed Feb 26, 2024
1 parent ccfabc0 commit a2e4d91
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 9 deletions.
16 changes: 8 additions & 8 deletions lib/dotenv/replay_logger.rb
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
module Dotenv
# A logger that can be used before the apps real logger is initialized.
class ReplayLogger
class ReplayLogger < Logger
def initialize
super(nil) # Doesn't matter what this is, it won't be used.
@logs = []
end

def method_missing(name, *args, &block)
@logs.push([name, args, block])
end

def respond_to_missing?(name, include_private = false)
(include_private ? Logger.instance_methods : Logger.public_instance_methods).include?(name) || super
# Override the add method to store logs so we can replay them to a real logger later.
def add(*args, &block)
@logs.push([args, block])
end

# Replay the store logs to a real logger.
def replay(logger)
@logs.each { |name, args, block| logger.send(name, *args, &block) }
@logs.each { |args, block| logger.add(*args, &block) }
@logs.clear
end
end
end
18 changes: 17 additions & 1 deletion spec/dotenv/rails_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
require "dotenv/rails"

describe Dotenv::Rails do
let(:log_io) { StringIO.new }
let(:application) do
log_io = self.log_io
Class.new(Rails::Application) do
config.load_defaults Rails::VERSION::STRING.to_f
config.eager_load = false
config.logger = ActiveSupport::Logger.new(StringIO.new)
config.logger = ActiveSupport::Logger.new(log_io)
config.root = fixture_path

# Remove method fails since app is reloaded for each test
Expand Down Expand Up @@ -197,4 +199,18 @@
application.initialize!
end
end

describe "logger" do
it "defaults to ReplayLogger" do
expect(Dotenv::Rails.logger).to be_a(Dotenv::ReplayLogger)
application.initialize!
expect(Dotenv::Rails.logger).to be_a(ActiveSupport::BroadcastLogger)
end

it "replays to Rails.logger" do
Dotenv::Rails.logger.debug("test")
application.initialize!
expect(log_io.string).to include("test")
end
end
end

0 comments on commit a2e4d91

Please sign in to comment.