Module: InjectedLogger

Defined in:
lib/injectedlogger.rb,
lib/injectedlogger/errors.rb,
lib/injectedlogger/logger.rb,
lib/injectedlogger/version.rb,
lib/injectedlogger/delegator.rb

Defined Under Namespace

Modules: Delegator, Logger

Constant Summary collapse

Error =
Class.new StandardError
InUse =
Class.new Error
UnsupportedLevels =
Class.new Error do
  def initalize(levels)
    super("logger does not support required levels #{levels.join ', '}")
  end
end
VERSION =
'0.0.3'

Class Method Summary collapse

Class Method Details

.inject(klass, required: [], method_name: :logger, &blk) ⇒ Object

inject a default logger in case no one has set one for you:

module MyLogger

InjectedLogger.inject self do
  require 'logger'
  # logger is required, the rest are other use() params
  { logger: Logger.new(STDERR), prefix: '[mylogger]', ... }
end

end

class WantsLogging

include MyLogger

def some_method_needing_logging
  logger.info 'some info'
end

end

This will only run the block passed to inject IFF there was no logger set up to be used by InjectedLogger, and it will only happen the first time the logger method is called, so that it does not ‘require’ anything if it is not needed. :)



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/injectedlogger.rb', line 29

def self.inject(klass, required: [], method_name: :logger, &blk)
  klass.send :remove_method, method_name rescue nil
  klass.send :define_method, method_name do
    unless InjectedLogger::Logger.in_use?
      args = blk.call
      logger = args.delete :logger
      unless required.empty?
        args[:levels] ||= []
        args[:levels].push(required).flatten!.uniq!
      end
      InjectedLogger::Logger.use(logger, args)
    end
    required.uniq!
    required -= InjectedLogger::Logger.level_info[:supported]
    raise InjectedLogger::UnsupportedLevels.new(required) if not required.empty?
    klass.send :remove_method, method_name
    klass.send :define_method, method_name do
      InjectedLogger::Logger
    end
    InjectedLogger::Logger
  end
end