Class: DynamicSchema::Receiver::Object
- Defined in:
- lib/dynamic_schema/receiver/object.rb
Instance Method Summary collapse
- #class ⇒ Object
- #empty? ⇒ Boolean
-
#initialize(values = nil, schema:, converter:, defaults: true) ⇒ Object
constructor
A new instance of Object.
- #is_a?(klass) ⇒ Boolean (also: #kind_of?)
- #method_missing(method, *args, &block) ⇒ Object
- #respond_to?(method, include_private = false) ⇒ Boolean
- #respond_to_missing?(method, include_private = false) ⇒ Boolean
- #to_h ⇒ Object
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.
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
#class ⇒ Object
53 54 55 |
# File 'lib/dynamic_schema/receiver/object.rb', line 53 def class ::DynamicSchema::Receiver::Object end |
#empty? ⇒ 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?
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
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
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_h ⇒ Object
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 |