Class: Ecoportal::API::Common::Content::ArrayModel

Inherits:
DoubleModel
  • Object
show all
Includes:
Enumerable
Defined in:
lib/ecoportal/api/common/content/array_model.rb

Overview

Note:
  • Its purpose is to handle an Array of basic objects (i.e. Date, String, Number)

Class to handle a plain Array embedded in a Hashed model.

Defined Under Namespace

Classes: TypeMismatchedComparison

Constant Summary

Constants inherited from DoubleModel

DoubleModel::NOT_USED

Constants included from ClassHelpers

ClassHelpers::NOT_USED

Class Attribute Summary collapse

Attributes inherited from DoubleModel

#_key, #_parent, #_read_only

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from DoubleModel

#_doc_key, #as_json, #as_update, #consolidate!, #dirty?, #doc, embeds_many, embeds_one, enforce!, #key, #key=, key?, new_uuid, #original_doc, pass_reader, pass_writer, passarray, passboolean, passdate, passforced, passkey, passthrough, #print_pretty, #replace_doc, #reset!, #root, #to_json

Methods included from ClassHelpers

#inheritable_attrs, #inheritable_class_vars, #inherited, #instance_variable_name, #new_class, #resolve_class, #to_constant, #to_time, #uid, #used_param?

Constructor Details

#initialize(doc = [], parent: self, key: nil, read_only: false) ⇒ ArrayModel



37
38
39
# File 'lib/ecoportal/api/common/content/array_model.rb', line 37

def initialize(doc = [], parent: self, key: nil, read_only: false)
  super(doc, parent: parent, key: key, read_only: read_only)
end

Class Attribute Details

.order_mattersObject

Returns the value of attribute order_matters.



24
25
26
# File 'lib/ecoportal/api/common/content/array_model.rb', line 24

def order_matters
  @order_matters
end

.uniqObject

Returns the value of attribute uniq.



24
25
26
# File 'lib/ecoportal/api/common/content/array_model.rb', line 24

def uniq
  @uniq
end

Class Method Details

.same_type?(a, b) ⇒ Boolean



29
30
31
32
# File 'lib/ecoportal/api/common/content/array_model.rb', line 29

def same_type?(a, b)
  raise "To use this comparison both objects should be `ArrayModel`" unless a.is_a?(ArrayModel) && b.is_a?(ArrayModel)
  (a.order_matters? == b.order_matters?) && (a.uniq? == b.uniq?)
end

Instance Method Details

#&(value) ⇒ ArrayModel

Intersect



187
188
189
190
191
192
193
194
# File 'lib/ecoportal/api/common/content/array_model.rb', line 187

def &(value)
  self.dup.tap do |out|
    self.dup.tap do |delta|
      delta.delete!(*into_a(value))
      out.delete!(*into_a(delta))
    end
  end
end

#+(value) ⇒ Object

Concat to new



172
173
174
# File 'lib/ecoportal/api/common/content/array_model.rb', line 172

def +(value)
  new_from(self.to_a + into_a(value))
end

#-(value) ⇒ ArrayModel

Subtract



199
200
201
202
203
# File 'lib/ecoportal/api/common/content/array_model.rb', line 199

def -(value)
  self.dup.tap do |copy|
    copy.delete!(*into_a(value))
  end
end

#<(values) ⇒ Object

Resets the Array by keeping its reference and adds the value(s)



159
160
161
162
# File 'lib/ecoportal/api/common/content/array_model.rb', line 159

def <(values)
  _items.clear
  self << values
end

#<<(value) ⇒ Object

Note:

if the class variable uniq is true, it skips duplicates

Adds an element to the subjacent Array



137
138
139
140
141
142
143
# File 'lib/ecoportal/api/common/content/array_model.rb', line 137

def <<(value)
  _items.concat(into_a(value)).tap do |doc|
    doc.uniq! if uniq?
  end
  on_change
  self
end

#==(a) ⇒ Object

Compares with an Array or another ArrayModel



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/ecoportal/api/common/content/array_model.rb', line 104

def ==(a)
  return true if self.equal?(a)
  return false unless (a.class == self.class) || a.is_a?(Array)
  case a
  when Array
    self == new_from(a)
  when ArrayModel
    return true if
    raise TypeMismatchedComparison.new(this: self, that: a) unless self.class.same_type?(self, a)

    if self.order_matters?
      _items == a.to_a
    else
      (_items - a.to_a).empty? && (a.to_a - _items).empty?
    end
  end
end

#[](pos) ⇒ Date, ...

Retrieves the element of a certain position



88
89
90
# File 'lib/ecoportal/api/common/content/array_model.rb', line 88

def [](pos)
  _items[pos]
end

#[]=(post, value) ⇒ Date, ...

Sets the element of a certain position



96
97
98
99
100
# File 'lib/ecoportal/api/common/content/array_model.rb', line 96

def []=(post, value)
  _items[pos] = value
  on_change
  self[pos]
end

#_itemsArray



54
55
56
57
# File 'lib/ecoportal/api/common/content/array_model.rb', line 54

def _items
  replace_doc([]) unless doc.is_a?(Array)
  doc.tap {|d| d.uniq! if uniq?}
end

#clear!Object

Clears the Array keeping its reference



165
166
167
168
169
# File 'lib/ecoportal/api/common/content/array_model.rb', line 165

def clear!
  _items.clear
  on_change
  self
end

#concat!(values) ⇒ Object

Note:

same as #push! but for multiple elements

See Also:



152
153
154
# File 'lib/ecoportal/api/common/content/array_model.rb', line 152

def concat!(values)
  self << values
end

#delete!(*values) ⇒ Object

Deletes values from the Array



206
207
208
209
210
211
212
# File 'lib/ecoportal/api/common/content/array_model.rb', line 206

def delete!(*values)
  values.map do |v|
    deletion!(v)
  end.tap do |r|
    on_change
  end
end

#dupArrayModel



76
77
78
# File 'lib/ecoportal/api/common/content/array_model.rb', line 76

def dup
  new_from(to_a)
end

#each(&block) ⇒ Object



48
49
50
51
# File 'lib/ecoportal/api/common/content/array_model.rb', line 48

def each(&block)
  return to_enum(:each) unless block
  _items.each(&block)
end

#empty?Boolean



45
# File 'lib/ecoportal/api/common/content/array_model.rb', line 45

def empty?;   count == 0; end

#include?(value) ⇒ Boolean



123
124
125
# File 'lib/ecoportal/api/common/content/array_model.rb', line 123

def include?(value)
  _items.include?(value)
end

#include_all?(*value) ⇒ Boolean



131
132
133
# File 'lib/ecoportal/api/common/content/array_model.rb', line 131

def include_all?(*value)
  value.all? {|v| _items.include?(v)}
end

#include_any?(*value) ⇒ Boolean



127
128
129
# File 'lib/ecoportal/api/common/content/array_model.rb', line 127

def include_any?(*value)
  value.any? {|v| _items.include?(v)}
end

#index(value) ⇒ Integer



81
82
83
# File 'lib/ecoportal/api/common/content/array_model.rb', line 81

def index(value)
  _items.index(value)
end

#insert_one(value, pos: NOT_USED, before: NOT_USED, after: NOT_USED) ⇒ Object



228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
# File 'lib/ecoportal/api/common/content/array_model.rb', line 228

def insert_one(value, pos: NOT_USED, before: NOT_USED, after: NOT_USED)
  i = index(value)
  return i if (i && uniq?)
  pos = case
        when used_param?(pos) && pos
          pos
        when used_param?(before) && before
          index(before)
        when used_param?(after) && after
          if i = index(after) then i + 1 end
        end

  pos ||= length
  pos.tap do |i|
    _items.insert(pos, value)
    on_change
  end
end

#lengthObject



44
# File 'lib/ecoportal/api/common/content/array_model.rb', line 44

def length;   count;      end

#move(value, pos: NOT_USED, before: NOT_USED, after: NOT_USED) ⇒ Object

TODO



248
249
250
251
252
253
254
255
256
# File 'lib/ecoportal/api/common/content/array_model.rb', line 248

def move(value, pos: NOT_USED, before: NOT_USED, after: NOT_USED)
  if i = index(value)
    unless i == pos

      on_change
    end
    pos
  end
end

#new_from(value) ⇒ ArrayModel



71
72
73
# File 'lib/ecoportal/api/common/content/array_model.rb', line 71

def new_from(value)
  self.class.new(into_a(value))
end

#order_matters?Boolean



41
# File 'lib/ecoportal/api/common/content/array_model.rb', line 41

def order_matters?; self.class.order_matters; end

#present?Boolean



46
# File 'lib/ecoportal/api/common/content/array_model.rb', line 46

def present?; count > 0;  end

#push!(value) ⇒ Object

See Also:



146
147
148
# File 'lib/ecoportal/api/common/content/array_model.rb', line 146

def push!(value)
  self << value
end

#swap(value1, value2) ⇒ Integer

Note:

this will work with first instances when not uniq?

Swaps two values' positions



219
220
221
222
223
224
225
226
# File 'lib/ecoportal/api/common/content/array_model.rb', line 219

def swap(value1, value2)
  index(value2).tap do |dest|
    if dest && pos = index(value1)
      _items[dest] = value1
      _items[pos]  = value2
    end
  end
end

#to_aArray

Returns a copy of the Array elements.

See Also:



65
66
67
# File 'lib/ecoportal/api/common/content/array_model.rb', line 65

def to_a
  _items.slice(0..-1)
end

#to_s(delimiter: "|") ⇒ Object



59
60
61
# File 'lib/ecoportal/api/common/content/array_model.rb', line 59

def to_s(delimiter: "|")
  map(&:to_s).join(delimiter)
end

#uniq?Boolean



42
# File 'lib/ecoportal/api/common/content/array_model.rb', line 42

def uniq?;          self.class.uniq;          end

#|(value) ⇒ ArrayModel

Join



179
180
181
182
# File 'lib/ecoportal/api/common/content/array_model.rb', line 179

def |(value)
  new = new_from(value) - self
  new_from(to_a + new.to_a)
end