class Declarative::Defaults

{Defaults} is a mutable DSL object that collects default directives via merge!. Internally, it uses {Variables} to implement the merging of defaults.

Public Class Methods

new() click to toggle source
# File lib/declarative/defaults.rb, line 5
def initialize
  @static_options  = {}
  @dynamic_options = ->(*) { {} }
end
wrap_arrays(variables) click to toggle source

Wrap arrays in `variables` with Variables::Append so they get appended to existing same-named arrays.

# File lib/declarative/defaults.rb, line 38
def self.wrap_arrays(variables)
  Hash[ variables.
    find_all { |k,v| v.instance_of?(Array) }.
    collect  { |k,v| [k, Variables::Append(v)] }
  ]
end

Public Instance Methods

call(name, given_options) click to toggle source

Evaluate defaults and merge given_options into them.

# File lib/declarative/defaults.rb, line 20
def call(name, given_options)
  # TODO: allow to receive rest of options/block in dynamic block. or, rather, test it as it was already implemented.
  evaluated_options = @dynamic_options.(name, given_options)

  options = Variables.merge( @static_options, handle_array_and_deprecate(evaluated_options) )
  Variables.merge( options, handle_array_and_deprecate(given_options) ) # FIXME: given_options is not tested!
end
handle_array_and_deprecate(variables) click to toggle source
# File lib/declarative/defaults.rb, line 28
def handle_array_and_deprecate(variables)
  wrapped = Defaults.wrap_arrays(variables)

  warn "[Declarative] Defaults#merge! and #call still accept arrays and automatically prepend those. This is now deprecated, you should replace `ary` with `Declarative::Variables::Append(ary)`." if wrapped.any?

  variables.merge(wrapped)
end
merge!(hash={}, &block) click to toggle source

Set default values. Usually called in Schema::defaults. This can be called multiple times and will “deep-merge” arrays, e.g. `_features: []`.

# File lib/declarative/defaults.rb, line 12
def merge!(hash={}, &block)
  @static_options  = Variables.merge( @static_options, handle_array_and_deprecate(hash) )
  @dynamic_options = block if block_given?

  self
end