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