lib/airbrake-ruby/config/validator.rb
module Airbrake
class Config
# Validator validates values of {Airbrake::Config} options. A valid config
# is a config that guarantees that data can be sent to Airbrake given its
# configuration.
#
# @api private
# @since v1.5.0
class Validator
# @return [Array<Class>] the list of allowed types to configure the
# environment option
VALID_ENV_TYPES = [NilClass, String, Symbol].freeze
class << self
# @param [Airbrake::Config] config
# @since v4.1.0
def validate(config)
promise = Airbrake::Promise.new
unless valid_project_id?(config)
return promise.reject(':project_id is required')
end
unless valid_project_key?(config)
return promise.reject(':project_key is required')
end
unless valid_environment?(config)
return promise.reject(
"the 'environment' option must be configured " \
"with a Symbol (or String), but '#{config.environment.class}' was " \
"provided: #{config.environment}",
)
end
promise.resolve(:ok)
end
# Whether the given +config+ allows sending data to Airbrake. It doesn't
# matter if it's valid or invalid.
#
# @param [Airbrake::Config] config
# @since v4.1.0
def check_notify_ability(config)
promise = Airbrake::Promise.new
unless config.error_notifications
return promise.reject('error notifications are disabled')
end
if ignored_environment?(config)
return promise.reject(
"current environment '#{config.environment}' is ignored",
)
end
promise.resolve(:ok)
end
private
def valid_project_id?(config)
return true if config.project_id.to_i > 0
false
end
def valid_project_key?(config)
return false unless config.project_key.is_a?(String)
return false if config.project_key.empty?
true
end
def valid_environment?(config)
VALID_ENV_TYPES.any? { |type| config.environment.is_a?(type) }
end
def ignored_environment?(config)
if config.ignore_environments.any? && config.environment.nil?
config.logger.warn(
"#{LOG_LABEL} the 'environment' option is not set, " \
"'ignore_environments' has no effect",
)
end
return false if config.ignore_environments.none? || !config.environment
env = config.environment.to_s
config.ignore_environments.any? do |pattern|
pattern.is_a?(Regexp) ? env.match(pattern) : env == pattern.to_s
end
end
end
end
end
end