lib/timber/integrator.rb
module Timber
# Base class for `Timber::Integrations::*`. Provides a common interface for all integrators.
# An integrator is a single specific integration into a part of a library. See
# {Integration} for higher library level integration settings.
class Integrator
# Raised when an integrators requirements are not met. For example, this will be raised
# in the ActiveRecord integration if ActiveRecord is not available as a dependency in
# the current application.
class RequirementNotMetError < StandardError; end
class << self
attr_writer :enabled
# Allows you to enable / disable specific integrations.
#
# @note Disabling specific low level integrations should only be needed for edge cases.
# If you want to disable integration with an entire library, we recommend doing so
# at a higher level. Ex: `Timber::Integrations::ActiveRecord.enabled = false`.
#
# @example
# Timber::Integrations::ActiveRecord::LogSubscriber.enabled = false
def enabled?
@enabled != false
end
# Convenience class level method that runs the integrator by instantiating a new
# object and calling {#integrate!}. It also takes care to look at the if the integrator
# is enabled, skipping it if not.
def integrate!(*args)
if !enabled?
Config.instance.debug_logger.debug("#{name} integration disabled, skipping") if Config.instance.debug_logger
return false
end
new(*args).integrate!
Config.instance.debug_logger.debug("Integrated #{name}") if Config.instance.debug_logger
true
# RequirementUnsatisfiedError is the only silent failure we support
rescue RequirementNotMetError => e
Config.instance.debug_logger.debug("Failed integrating #{name}: #{e.message}") if Config.instance.debug_logger
false
end
end
# Abstract method that each integration must implement.
def integrate!
raise NotImplementedError.new
end
end
end