Module: Configurations::Configurable::ClassMethods

Defined in:
lib/configurations/configurable.rb

Overview

Class methods that will get installed in the host module

Instance Method Summary collapse

Instance Method Details

#configurable(*properties, &block) ⇒ Object

configurable can be used to set the properties which should be configurable, as well as a type which the given property should be asserted to

Examples:

Define a configurable property

configurable :foo

Define a type asserted, nested property for type String

configurable String, bar: :baz

Define a custom assertion for a property

configurable biz: %i(bi bu) do |value|
  unless %w(a b c).include?(value)
    fail ArgumentError, 'must be one of a, b, c'
  end
end

Parameters:

  • properties (Class, Symbol, Hash)

    a type as a first argument to type assert (if any) or nested properties to allow for setting

  • block (Proc)

    a block with arity 2 to evaluate when a property is set. It will be given: property name and value



119
120
121
122
123
124
125
126
127
128
# File 'lib/configurations/configurable.rb', line 119

def configurable(*properties, &block)
  @configurable_properties ||= Maps::Properties.new
  @configurable_types ||= Maps::Types.new
  @configurable_blocks ||= Maps::Blocks.new

  type, properties = extract_type(properties)
  @configurable_properties.add(properties)
  @configurable_types.add(type, properties)
  @configurable_blocks.add(block, properties)
end

#configurable?(property) ⇒ Boolean

returns whether a property is set to be configurable

Parameters:

  • property (Symbol)

    the property to ask status for

Returns:

  • (Boolean)

    whether the property is configurable



142
143
144
145
146
# File 'lib/configurations/configurable.rb', line 142

def configurable?(property)
  defined?(@configurable_properties) &&
    @configurable_properties &&
    @configurable_properties.configurable?(Path.new([property]))
end

#configuration_defaults(&block) ⇒ Object

Configuration defaults can be used to set the defaults of any Configuration

Parameters:

  • block (Proc)

    setting the default values of the configuration



97
98
99
# File 'lib/configurations/configurable.rb', line 97

def configuration_defaults(&block)
  @configuration_defaults = block
end

#configuration_method(method, &block) ⇒ Object

configuration method can be used to retrieve properties from the configuration which use your gem’s context

Examples:

Define a configuration method ‘foobararg’

configuration_method :foobararg do |arg|
  foo + bar + arg
end

Define a configuration method on a nested property

configuration_method foo: { bar: :arg } do
  baz + biz
end

Parameters:

  • method (Class, Symbol, Hash)

    the method to define

  • block (Proc)

    the block to evaluate



162
163
164
165
166
167
168
169
170
# File 'lib/configurations/configurable.rb', line 162

def configuration_method(method, &block)
  fail(
    ArgumentError,
    "can't be configuration property and a method"
  ) if configurable?(method)

  @configuration_method_blocks ||= Maps::Blocks.new
  @configuration_method_blocks.add(block, [method])
end

#extract_type(properties) ⇒ Object



130
131
132
133
134
135
136
# File 'lib/configurations/configurable.rb', line 130

def extract_type(properties)
  if properties.first.is_a?(Module)
    [properties.first, properties[1...properties.size]]
  else
    [nil, properties]
  end
end

#not_configured(*properties, &block) {|Symbol| ... } ⇒ Object

not_configured defines the behaviour when a property has not been configured. This can be useful for presence validations of certain properties or behaviour for undefined properties deviating from the original behaviour.

Examples:

Define a specific not_configured callback

not_configured :property1, property2: :property3 do |property|
  raise ArgumentError, "#{property} should be configured"
end

Define a catch-all not_configured callback

not_configured do |property|
  raise StandardError, "You did not configure #{property}"
end

Parameters:

  • properties (Array, Symbol, Hash)

    the properties to install the callback on. If omitted, the callback will be installed on all properties that have no specific callbacks

  • block (Proc)

    the block to evaluate when a property has not been configured

Yields:

  • (Symbol)

    the property that has not been configured



191
192
193
194
195
196
197
198
# File 'lib/configurations/configurable.rb', line 191

def not_configured(*properties, &block)
  @not_configured_blocks ||= Maps::Blocks.new
  @not_configured_blocks.add(block, properties)

  if properties.empty?
    @not_configured_blocks.add_default(block)
  end
end