travis-api/lib/travis/event/config.rb
Aakriti Gupta 65f1a29d86 Move travis-core files from /vendor to /lib.
- Re-factor
- Remove code for notifications
- Remove addons
- Remove travis-core gem.
- Ignore logs directory only
- Move core tests to spec/lib
2016-07-20 11:22:25 +02:00

110 lines
4.0 KiB
Ruby

require 'travis/secure_config'
module Travis
module Event
class Config
DEFAULTS = {
start: { email: false, webhooks: false, campfire: false, hipchat: false, irc: false, flowdock: false, sqwiggle: false, slack: false, pushover: false },
success: { email: :change, webhooks: :always, campfire: :always, hipchat: :always, irc: :always, flowdock: :always, sqwiggle: :always, slack: :always, pushover: :always, },
failure: { email: :always, webhooks: :always, campfire: :always, hipchat: :always, irc: :always, flowdock: :always, sqwiggle: :always, slack: :always, pushover: :always, }
}
attr_reader :payload, :build, :secure_key, :config
def initialize(payload, secure_key = nil)
@payload = payload
@build = payload['build']
@config = build['config']
@secure_key = secure_key
end
def enabled?(key)
return !!notifications[key] if notifications.has_key?(key) # TODO this seems inconsistent. what if email: { disabled: true }
[:disabled, :disable].each { |key| return !notifications[key] if notifications.has_key?(key) } # TODO deprecate disabled and disable
true
end
def send_on?(type, event)
send(:"send_on_#{event}_for?", type)
end
def send_on_started_for?(type)
config = with_fallbacks(type, :on_start, DEFAULTS[:start][type])
config == true || config == :always
end
def send_on_finished_for?(type)
send_on_initial_build? || send_on_success_for?(type) || send_on_failure_for?(type)
end
def send_on_initial_build?
build['previous_state'].nil?
end
def send_on_success_for?(type)
!!if build_passed?
config = with_fallbacks(type, :on_success, DEFAULTS[:success][type])
config == :always || (config == :change && !previous_build_passed?)
end
end
def send_on_failure_for?(type)
!!if !build_passed?
config = with_fallbacks(type, :on_failure, DEFAULTS[:failure][type])
config == :always || (config == :change && previous_build_passed?)
end
end
def build_passed?
build['state'].try(:to_sym) == :passed
end
def previous_build_passed?
build['previous_state'].try(:to_sym) == :passed
end
# Fetches config with fallbacks. (notification type > global > default)
# Filters can be configured for each notification type.
# If no rules are configured for the given type, then fall back to the global rules, and then to the defaults.
def with_fallbacks(type, key, default)
config = if (notifications[type] && notifications[type].is_a?(Hash) && notifications[type].has_key?(key))
# Returns the type config if key is present (notifications: email: [:on_success])
notifications[type][key]
elsif notifications.has_key?(key)
# Returns the global config if key is present (notifications: [:on_success])
notifications[key]
else
# Else, returns the given default
default
end
config.respond_to?(:to_sym) ? config.to_sym : config
end
# Returns (recipients, urls, channels) for (email, webhooks, irc)
# Notification type config can be nil, true/false, a string, an array of values,
# or a hash containing a key for these values.
def notification_values(type, key)
config = notifications[type] rescue {}
value = config.is_a?(Hash) ? config[key] : config
case value
when Array, String
normalize_array(value)
else
value
end
end
def notifications
Travis::SecureConfig.decrypt(config.fetch(:notifications, {}), secure_key)
end
def normalize_array(values)
values = Array(values).compact
values = values.map { |value| value.split(',') if value.is_a?(String) }
values.compact.flatten.map(&:strip).reject(&:blank?)
end
end
end
end