mrzasa/call_logger

View on GitHub
lib/call_logger.rb

Summary

Maintainability
A
0 mins
Test Coverage
require "call_logger/version"

require 'call_logger/formatter'
require 'call_logger/logger'
require 'call_logger/configuration'
require 'call_logger/call_wrapper'
require 'call_logger/method_wrapper'

module CallLogger
  def self.included(base)
    base.extend(ClassMethods)
  end

  class << self
    attr_accessor :configuration
  end

  def self.configure
    self.configuration ||= Configuration.new
    yield(configuration) if block_given?
  end
  configure # set defaults

  def log_block(name, &block)
    self.class.log_block(name, &block)
  end

  def self.log_block(name, &block)
    logger = configuration.logger
    formatter = configuration.formatter
    call_wrapper = CallWrapper.new(
      logger: logger, formatter: formatter
    )
    call_wrapper.call(name, [], &block)
  end

  module ClassMethods
    def log(*methods)
      wrap_log(self, methods)
    end

    def log_class(*methods)
      wrap_log(singleton_class, methods)
    end

    def log_block(name, &block)
      do_log(name, [], &block)
    end

    def wrap_log(owner, methods)
      wrapper = MethodWrapper.new(owner, self)
      if methods.size == 1 && owner.respond_to?(methods.first)
        wrapper.wrap_single(methods.first)
      else
        wrapper.wrap_multiple(methods)
      end
    end

    def do_log(name, args, &block)
      logger = ::CallLogger.configuration.logger
      formatter = ::CallLogger.configuration.formatter
      call_wrapper = CallWrapper.new(
        logger: logger, formatter: formatter
      )
      call_wrapper.call(name, args, &block)
    end
  end
end