Class: DynamicSchema::Receiver::Object

Inherits:
Base
  • Object
show all
Defined in:
lib/dynamic_schema/receiver/object.rb

Instance Method Summary collapse

Methods inherited from Base

const_missing, #evaluate, #inspect, #nil?, #pretty_print, #to_s

Constructor Details

#initialize(values = nil, schema:, converter:, defaults: true) ⇒ Object

Returns a new instance of Object.

Raises:

  • (ArgumentError)


8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/dynamic_schema/receiver/object.rb', line 8

def initialize( values = nil, schema:, converter:, defaults: true )
  raise ArgumentError, 'The Receiver values must be a nil or a Hash.'\
    unless values.nil? || ( values.respond_to?( :[] ) && values.respond_to?( :key? ) )
  
  @values = {}
  @schema = schema
  @defaults = defaults
  @defaults_assigned = {}

  @converter = converter
  
  @schema.each do | key, criteria |
    name = criteria[ :as ] || key 
    if @defaults && criteria.key?( :default )
      self.__send__( key, criteria[ :default ] )
      @defaults_assigned[ key ] = true        
    end
    self.__send__( key, values[ key ] ) if values && values.key?( key ) 
  end

end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/dynamic_schema/receiver/object.rb', line 65

def method_missing( method, *args, &block )
  if @schema.key?( method )
    criteria = @schema[ method ]
    name = criteria[ :as ] || method
    value = @values[ name ]

    type = criteria[ :type ]
    has_multiple_types = type.is_a?( ::Array ) && criteria[ :compiler ]

    unless criteria[ :array ]
      if has_multiple_types
        value = __types( method, args, value: value, criteria: criteria, &block )
      elsif type == ::Object
        value = __object( method, args, value: value, criteria: criteria, &block )
      else
        value = __value( method, args, value: value, criteria: criteria, &block )
      end
    else
      value = @defaults_assigned[ method ] ? ::Array.new : value || ::Array.new
      if has_multiple_types
        value = __types_array( method, args, value: value, criteria: criteria, &block )
      elsif type == ::Object
        value = __object_array( method, args, value: value, criteria: criteria, &block )
      else
        value = __values_array( method, args, value: value, criteria: criteria, &block )
      end
    end

    @defaults_assigned[ method ] = false
    @values[ name ] = value
  else
    ::Kernel.raise ::NoMethodError,
      "There is no schema value or object '#{ method }' defined in this scope which includes: " \
      "#{ @schema.keys.join( ', ' ) }."
  end
end

Instance Method Details

#classObject



53
54
55
# File 'lib/dynamic_schema/receiver/object.rb', line 53

def class
  ::DynamicSchema::Receiver::Object
end

#empty?Boolean

Returns:

  • (Boolean)


30
31
32
# File 'lib/dynamic_schema/receiver/object.rb', line 30

def empty?
  @values.empty?
end

#is_a?(klass) ⇒ Boolean Also known as: kind_of?

Returns:

  • (Boolean)


57
58
59
60
61
# File 'lib/dynamic_schema/receiver/object.rb', line 57

def is_a?( klass )
  klass == ::DynamicSchema::Receiver::Object || 
  klass == ::DynamicSchema::Receiver::Base || 
  klass == ::BasicObject
end

#respond_to?(method, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


102
103
104
# File 'lib/dynamic_schema/receiver/object.rb', line 102

def respond_to?( method, include_private = false )
  @schema.key?( method ) || self.class.instance_methods.include?( method ) 
end

#respond_to_missing?(method, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


106
107
108
# File 'lib/dynamic_schema/receiver/object.rb', line 106

def respond_to_missing?( method, include_private = false )
  @schema.key?( method ) || self.class.instance_methods.include?( method ) 
end

#to_hObject



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/dynamic_schema/receiver/object.rb', line 34

def to_h
  recursive_to_h = ->( object ) do
    case object
    when ::NilClass
      nil
    when ::DynamicSchema::Receiver::Object
      recursive_to_h.call( object.to_h )
    when ::Hash
      object.transform_values { | value | recursive_to_h.call( value ) }
    when ::Array
      object.map { | element | recursive_to_h.call( element ) }
    else
      object.respond_to?( :to_h ) ? object.to_h : object
    end
  end

  recursive_to_h.call( @values )
end