Module: Y::Actioncable::Config::Option

Included in:
Y::Actioncable::Config
Defined in:
lib/y/actioncable/config/option.rb

Overview

Configuration option DSL

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(base) ⇒ Object



75
76
77
78
79
80
81
# File 'lib/y/actioncable/config/option.rb', line 75

def self.extended(base)
  return if base.respond_to?(:builder_class)

  raise Y::Actioncable::MissingConfigurationBuilderClass,
        "Define `self.builder_class` method for #{base} that returns " \
        "your custom Builder class to use options DSL!"
end

Instance Method Details

#option(name, options = {}) ⇒ Object

Defines configuration option

When you call option, it defines two methods. One method will take place in the +Config+ class and the other method will take place in the +Builder+ class.

The +name+ parameter will set both builder method and config attribute. If the +:as+ option is defined, the builder method will be the specified option while the config attribute will be the +name+ parameter.

If you want to introduce another level of config DSL you can define +builder_class+ parameter. Builder should take a block as the initializer parameter and respond to function +build+ that returns the value of the config attribute.

==== Options

  • [:+as+] Set the builder method that goes inside +configure+ block
  • [+:default+] The default value in case no option was set
  • [+:builder_class+] Configuration option builder class

==== Examples

option :name option :name, as: :set_name option :name, default: 'My Name' option :scopes builder_class: ScopesBuilder



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/y/actioncable/config/option.rb', line 36

def option(name, options = {}) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
  attribute = options[:as] || name
  attribute_builder = options[:builder_class]

  builder_class.instance_eval do
    if method_defined?(name)
      Kernel.warn "[ISORUN] Option #{name} already defined and will be overridden"
      remove_method name
    end

    define_method name do |*args, &block| # rubocop:disable Metrics/MethodLength
      if (deprecation_opts = options[:deprecated])
        warning = "[ISORUN] #{name} has been deprecated and will soon be removed"
        warning = "#{warning}\n#{deprecation_opts.fetch(:message)}" if deprecation_opts.is_a?(Hash)

        Kernel.warn(warning)
      end

      value = if attribute_builder
                attribute_builder.new(&block).build
              else
                block || args.first
              end

      @config.instance_variable_set(:"@#{attribute}", value)
    end
  end

  define_method attribute do |*_args|
    if instance_variable_defined?(:"@#{attribute}")
      instance_variable_get(:"@#{attribute}")
    else
      options[:default]
    end
  end

  public attribute
end