Class: JSONAPIonify::Structure::Collections::Base

Inherits:
Concurrent::Array
  • Object
show all
Includes:
EnumerableObserver, Helpers::InheritsOrigin
Defined in:
lib/jsonapionify/structure/collections/base.rb

Direct Known Subclasses

Errors, ResourceIdentifiers, Resources

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Helpers::InheritsOrigin

#client?, #origin, #server?

Constructor Details

#initialize(array = []) ⇒ Base

Returns a new instance of Base.



22
23
24
25
26
27
28
29
30
31
# File 'lib/jsonapionify/structure/collections/base.rb', line 22

def initialize(array = [])
  observe.added do |items|
    items.each do |item|
      item.instance_variable_set(:@parent, self) unless item.frozen?
    end
  end
  array.each do |instance|
    self << instance
  end
end

Instance Attribute Details

#parentObject (readonly)

Returns the value of attribute parent.



10
11
12
# File 'lib/jsonapionify/structure/collections/base.rb', line 10

def parent
  @parent
end

Class Method Details

.value_is(type_class) ⇒ Object



14
15
16
17
18
# File 'lib/jsonapionify/structure/collections/base.rb', line 14

def self.value_is(type_class)
  define_method(:type_class) do
    type_class
  end
end

Instance Method Details

#<<(instance) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/jsonapionify/structure/collections/base.rb', line 68

def <<(instance)
  new_instance =
    case instance
    when Hash
      type_class.new(**instance)
    when type_class
      instance
    else
      if type_class < instance.class
        type_class.from_hash instance.to_h
      else
        raise(
          ValidationError,
          "Can't initialize collection `#{self.class.name}` with a type of `#{instance.class.name}`"
        )
      end
    end
  super new_instance
end

#collect_hashesObject



47
48
49
50
51
52
53
54
55
56
# File 'lib/jsonapionify/structure/collections/base.rb', line 47

def collect_hashes
  map do |member|
    case member
    when Objects::Base, Hash
      member.to_h
    else
      member
    end
  end
end

#compileObject



58
59
60
# File 'lib/jsonapionify/structure/collections/base.rb', line 58

def compile
  collect_hashes
end

#errorsObject



88
89
90
91
92
93
94
95
# File 'lib/jsonapionify/structure/collections/base.rb', line 88

def errors
  map.each_with_index.each_with_object({}) do |(value, key), errors|
    next unless value.respond_to? :errors
    value.errors.each do |error_key, message|
      errors[[key, error_key].join('/')] = message
    end
  end
end

#new(**attributes) ⇒ Object Also known as: append



62
63
64
# File 'lib/jsonapionify/structure/collections/base.rb', line 62

def new(**attributes)
  self << attributes
end

#original_method(method) ⇒ Object



33
34
35
# File 'lib/jsonapionify/structure/collections/base.rb', line 33

def original_method(method)
  Array.instance_method(method).bind(self)
end

#signatureObject



43
44
45
# File 'lib/jsonapionify/structure/collections/base.rb', line 43

def signature
  "#{self.class.name}:#{Digest::SHA2.hexdigest map(&:signature).join}"
end

#validateObject



37
38
39
40
41
# File 'lib/jsonapionify/structure/collections/base.rb', line 37

def validate
  each do |member|
    member.validate if member.respond_to? :validate
  end
end

#warningsObject Also known as: all_warnings



97
98
99
100
101
102
103
104
# File 'lib/jsonapionify/structure/collections/base.rb', line 97

def warnings
  map.each_with_index.each_with_object({}) do |(value, key), warnings|
    next unless value.respond_to? :all_warnings
    value.all_warnings.each do |warning_key, message|
      warnings[[key, warning_key].join('. ')] = message
    end
  end
end