Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(FACT-2319) Added debugonce method #2085

Merged
merged 1 commit into from
Sep 14, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 23 additions & 4 deletions lib/facter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ class ResolveCustomFactError < StandardError; end
Options.init
Log.output(STDOUT)
@already_searched = {}
@debug_once = []

class << self
def clear_messages
Expand Down Expand Up @@ -54,6 +55,7 @@ def add(name, options = {}, &block)
# @api public
def clear
@already_searched = {}
@debug_once = []
LegacyFacter.clear
Options[:custom_dir] = []
LegacyFacter.collection.invalidate_custom_facts
Expand All @@ -68,16 +70,33 @@ def core_value(user_query)
fact_collection.dig(*splitted_user_query)
end

# Prints out a debug message when debug option is set to true
# @param msg [String] Message to be printed out
# Logs debug message when debug option is set to true
# @param message [Object] Message object to be logged
#
# @return [nil]
#
# @api public
def debug(msg)
def debug(message)
return unless debugging?

logger.debug(msg)
logger.debug(message.to_s)
nil
end

# Logs the same debug message only once when debug option is set to true
# @param message [Object] Message object to be logged
#
# @return [nil]
#
# @api public
def debugonce(message)
return unless debugging?

message_string = message.to_s
return if @debug_once.include? message_string

@debug_once << message_string
logger.debug(message_string)
nil
end

Expand Down
4 changes: 1 addition & 3 deletions lib/facter/framework/logging/logger.rb
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,7 @@ def initialize(logged_class)
def debug(msg)
return unless debugging_active?

if msg.nil? || msg.empty?
empty_message_error(msg)
elsif @@message_callback
if @@message_callback
@@message_callback.call(:debug, msg)
else
msg = colorize(msg, CYAN) if Options[:color]
Expand Down
60 changes: 60 additions & 0 deletions spec/facter/facter_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -380,4 +380,64 @@ def mock_collection(method, os_name = nil, error = nil)
end
end
end

describe '#debugonce' do
context 'when debugging is active' do
before do
allow(logger).to receive(:debug)
Facter.debugging(true)
end

after do
Facter.debugging(false)
end

it 'calls logger with the debug message' do
message = 'Some error message'

Facter.debugonce(message)

expect(logger).to have_received(:debug).with(message)
end

it 'writes the same debug message only once' do
message = 'Some error message'

Facter.debugonce(message)
Facter.debugonce(message)

expect(logger).to have_received(:debug).once.with(message)
end

it 'writes empty message when message is nil' do
Facter.debugonce(nil)

expect(logger).to have_received(:debug).with('')
end

it 'when message is a hash' do
Facter.debugonce({ warn: 'message' })

expect(logger).to have_received(:debug).with('{:warn=>"message"}')
end

it 'returns nil' do
result = Facter.debugonce({ warn: 'message' })

expect(result).to be_nil
end
end
end

context 'when debugging is inactive' do
before do
allow(logger).to receive(:debug)
end

it 'does not call the logger' do
Facter.debugonce('message')

expect(logger).not_to have_received(:debug)
end
end
end
12 changes: 0 additions & 12 deletions spec/framework/logging/logger_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,18 +29,6 @@
end
end

it 'logs a warn if message is nil' do
log.debug(nil)

expect(multi_logger_double).to have_received(:warn).with(/debug invoked with invalid message/)
end

it 'logs a warn if message is empty' do
log.debug('')

expect(multi_logger_double).to have_received(:warn).with(/debug invoked with invalid message/)
end

shared_examples 'writes debug message' do
it 'calls debug on multi_logger' do
log.debug('debug_message')
Expand Down