module Kubes::Compiler::Dsl::Core::Fields
Public Instance Methods
field(name)
click to toggle source
Defines field methods. Example:
field :spec
Results in:
def spec(value=nil) value.nil? ? spec_reader : spec_writer(value) end def spec_reader default = default_spec if respond_to?(:default_spec) @spec || default end def spec_writer(value) case type # captured by closure. IE: labels:hash => type = hash when 'hash' spec_writer_hash(value) else @spec = value end end def spec_writer_hash(value) mode = value.delete(:_mode) @spec = {} if mode == "reset" @spec ||= {} @spec.deeper_merge!(value) end
# File lib/kubes/compiler/dsl/core/fields.rb, line 34 def field(name) name, type = name.to_s.split(':') type ||= 'string' reader = "#{name}_reader" writer = "#{name}_writer" ivar = "@#{name}" writer_hash = "#{name}_writer_hash" define_method(name) do |value=nil| value.nil? ? send(reader) : send(writer, value) end define_method(reader) do default_meth = "default_#{name}" # IE: default_spec, default_apiVersion etc default = send(default_meth) if respond_to?(default_meth.to_sym) instance_variable_get(ivar) || default end define_method(writer) do |value| case type when 'hash' send(writer_hash, value) else # string, object, etc instance_variable_set(ivar, value) end end define_method(writer_hash) do |value| mode = value.delete(:_mode) # special treatment result = instance_variable_get(ivar) result = {} if mode == "reset" # allow user to override with mode: reset option result ||= {} # maintain value for layering Kubes.deep_merge!(result, value) instance_variable_set(ivar, result) end end
fields(*names)
click to toggle source
# File lib/kubes/compiler/dsl/core/fields.rb, line 72 def fields(*names) names.each do |name| field(name) end end