diff --git a/lib/geocoder.rb b/lib/geocoder.rb index 8c4d2b8ce5122ce19265e7a8891739619571f028..4f88cd82a55d0925d6746d1010cd6817c5020168 100644 --- a/lib/geocoder.rb +++ b/lib/geocoder.rb @@ -1,5 +1,6 @@ require "geocoder/configuration" require "geocoder/logger" +require "geocoder/kernel_logger" require "geocoder/query" require "geocoder/calculations" require "geocoder/exceptions" diff --git a/lib/geocoder/configuration.rb b/lib/geocoder/configuration.rb index d706380fb2f41be642189f9493b3645d85467adc..5b898f7dc8e0692294943a30f62784290e6b2d47 100644 --- a/lib/geocoder/configuration.rb +++ b/lib/geocoder/configuration.rb @@ -57,7 +57,8 @@ module Geocoder :units, :distances, :basic_auth, - :logger + :logger, + :kernel_logger_level ] attr_accessor :data @@ -100,6 +101,7 @@ module Geocoder @data[:cache_prefix] = "geocoder:" # prefix (string) to use for all cache keys @data[:basic_auth] = {} # user and password for basic auth ({:user => "user", :password => "password"}) @data[:logger] = :kernel # :kernel or Logger instance + @data[:kernel_logger_level] = ::Logger::WARN # log level, if kernel logger is used # exceptions that should not be rescued by default # (if you want to implement custom error handling); diff --git a/lib/geocoder/kernel_logger.rb b/lib/geocoder/kernel_logger.rb new file mode 100644 index 0000000000000000000000000000000000000000..dc8a52ef4622dc2b26936aeaf432a5e2831e46e2 --- /dev/null +++ b/lib/geocoder/kernel_logger.rb @@ -0,0 +1,25 @@ +module Geocoder + class KernelLogger + include Singleton + + def add(level, message) + return unless log_message_at_level?(level) + case level + when ::Logger::DEBUG, ::Logger::INFO + puts message + when ::Logger::WARN + warn message + when ::Logger::ERROR + raise message + when ::Logger::FATAL + fail message + end + end + + private # ---------------------------------------------------------------- + + def log_message_at_level?(level) + level >= Geocoder.config.kernel_logger_level + end + end +end diff --git a/lib/geocoder/logger.rb b/lib/geocoder/logger.rb index d4d2d98ff30f0b1421ca523c93d227a3ebba7e80..abc9fda01e348a3fd9eb3ebdce6bbce365e84019 100644 --- a/lib/geocoder/logger.rb +++ b/lib/geocoder/logger.rb @@ -18,14 +18,11 @@ module Geocoder } def log(level, message) - return nil unless valid_level?(level) - - logger = Geocoder.config[:logger] - - if logger == :kernel - kernel_log(level, message) - elsif logger.respond_to? :add - logger.add(SEVERITY[level], message) + unless valid_level?(level) + raise StandardError, "Geocoder tried to log a message with an invalid log level." + end + if current_logger.respond_to? :add + current_logger.add(SEVERITY[level], message) else raise Geocoder::ConfigurationError, "Please specify valid logger for Geocoder. " + "Logger specified must be :kernel or must respond to `add(level, message)`." @@ -33,23 +30,18 @@ module Geocoder nil end - private - - def kernel_log(level, message) - case level - when :debug, :info - puts message - when :warn - warn message - when :error - raise message - when :fatal - fail message + private # ---------------------------------------------------------------- + + def current_logger + logger = Geocoder.config[:logger] + if logger == :kernel + logger = Geocoder::KernelLogger.instance end + logger end def valid_level?(level) - [:debug, :info, :warn, :error, :fatal].include? level + SEVERITY.keys.include?(level) end end end diff --git a/test/unit/logger_test.rb b/test/unit/logger_test.rb index c6cf7f64c380ba42ae699fb562e62014469e555d..028374cbf81708f7fc54e8bff542091d361aa34f 100644 --- a/test/unit/logger_test.rb +++ b/test/unit/logger_test.rb @@ -21,12 +21,32 @@ class LoggerTest < GeocoderTestCase assert_equal "should log\n", @tempfile.read end - def test_set_logger_does_not_log_severity_too_low + def test_logger_does_not_log_severity_too_low @logger.level = Logger::ERROR - assert_equal nil, Geocoder.log(:info, "should not log") + Geocoder.log(:info, "should not log") assert_equal "", @tempfile.read end + def test_logger_logs_when_severity_high_enough + @logger.level = Logger::DEBUG + Geocoder.log(:warn, "important: should log!") + assert_match /important: should log/, @tempfile.read + end + + def test_kernel_logger_does_not_log_severity_too_low + assert_nothing_raised do + Geocoder.configure(logger: :kernel, kernel_logger_level: ::Logger::FATAL) + Geocoder.log(:info, "should not log") + end + end + + def test_kernel_logger_logs_when_severity_high_enough + assert_raises RuntimeError do + Geocoder.configure(logger: :kernel, kernel_logger_level: ::Logger::DEBUG) + Geocoder.log(:error, "important: should log!") + end + end + def test_raise_configruation_error_for_invalid_logger Geocoder.configure(logger: {}) assert_raises Geocoder::ConfigurationError do