module ActiveWebhook::Configuration::Base

Public Class Methods

new() click to toggle source
# File lib/active_webhook/configuration.rb, line 17
def initialize
  (self.class.instance_variable_get(:@components) || []).each do |component_name|
    component = "#{self.class.name.deconstantize}::#{component_name.to_s.camelize}::Configuration"
    component = component.constantize.new
    instance_variable_set "@#{component_name}", component
  end

  (self.class.instance_variable_get(:@options) || []).each do |option, option_definition|
    send "#{option}=", option_definition[:default]
  end
end

Public Instance Methods

define_component(component_name) click to toggle source
# File lib/active_webhook/configuration.rb, line 64
def define_component(component_name)
  @components ||= []
  @components << component_name
  require "#{name.deconstantize.to_s.underscore}/#{component_name}/configuration"
  attr_reader component_name
end
define_option(option, values: [], default: nil, allow_nil: false, allow_proc: false, prefixes: nil) click to toggle source

TODO: consider changing so that all options accept a proc

q: does the proc run every time the option is asked? seems inefficent
# File lib/active_webhook/configuration.rb, line 34
def define_option(option, values: [], default: nil, allow_nil: false, allow_proc: false, prefixes: nil)
  attr_reader option

  default = values&.first if default.nil? && !allow_nil
  prefixes ||= name.deconstantize.underscore.delete_prefix("active_webhook").split("/")
  prefixes.shift if prefixes.first.blank?

  @options ||= {}
  @options[option] = {
    values: values,
    default: default,
    allow_proc: allow_proc,
    prefixes: prefixes
  }

  const_set option.to_s.pluralize.upcase, values

  define_method "#{option}=" do |value|
    unless (allow_proc && value.respond_to?(:call)) ||
           (allow_nil && value.nil?) ||
           values.empty? ||
           values.include?(value)
      raise Configuration::InvalidOptionError.new (prefixes + [option]).compact.join("."), value,
                                                  values
    end

    instance_variable_set "@#{option}", value
  end
end