class KubeManifest::Describe

Constants

SPEC_VAR

Public Class Methods

new(klass) click to toggle source
# File lib/kube_manifest/describe.rb, line 6
def initialize(klass)
  @klass = klass
end
new_value(obj, klass, *args, **kwargs, &block) click to toggle source
# File lib/kube_manifest/describe.rb, line 36
def self.new_value(obj, klass, *args, **kwargs, &block)
  if args.first.is_a? ::KubeManifest::Context
    returning = args.first.evaluate(overriding: obj._ctx)
    returning.instance_eval(&block) if block
    return returning
  elsif args.first.is_a? Array
    args = args.first
    returning = args.map do |arg|
      if arg.is_a? ::KubeManifest::Context
        arg.evaluate(overriding: obj._ctx)
      else
        arg
      end
    end
    return returning
  end

  returning = klass.new(ctx: obj._ctx, values: obj._values)
  returning.instance_eval(&block) if block
  kwargs.each_pair do |key, value|
    field_type = klass.class_variable_get(::KubeManifest::Describe::SPEC_VAR)[key]
    is_spec = field_type.is_a?(Class) && field_type.ancestors.include?(::KubeManifest::Spec)
    if is_spec
      if value.is_a? Hash
        child = ::KubeManifest::Describe.new_value(obj, field_type, *args, **value, &nil)
        returning.instance_variable_set("@#{key}", child)
      elsif value.is_a? Array
        child = value.map { |e| e.class == ::KubeManifest::Context ? e.evaluate(overriding: obj._ctx) : e }
        returning.instance_variable_set("@#{key}", child)
      end
    else
      returning.instance_variable_set("@#{key}", value)
    end
  end
  returning
end

Public Instance Methods

method_missing(name, *args, &block) click to toggle source
# File lib/kube_manifest/describe.rb, line 10
def method_missing(name, *args, &block)
  field_name = name.to_s.gsub(/^_/, '').to_sym
  field_type = args[0]
  is_spec = field_type.is_a?(Class) && field_type.ancestors.include?(::KubeManifest::Spec)
  is_array = args[1] == Array
  if is_spec && !field_type.class_variable_defined?(::KubeManifest::Describe::SPEC_VAR)
    field_type.class_variable_set(::KubeManifest::Describe::SPEC_VAR, {})
  end

  unless @klass.instance_methods.include? field_name
    method = if is_spec && is_array
               ::KubeManifest::SpecUtils.children_node(field_name, field_type)
             elsif is_spec && !is_array
               ::KubeManifest::SpecUtils.child_node(field_name, field_type)
             elsif !is_spec && is_array
               ::KubeManifest::SpecUtils.children_value(field_name)
             else
               ::KubeManifest::SpecUtils.child_value(field_name)
             end
    @klass.define_method(field_name, method)
    @klass.alias_method name, field_name
  end

  @klass.class_variable_get(::KubeManifest::Describe::SPEC_VAR)[field_name] = field_type
end