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 included from DoubleModel::Diffable

DoubleModel::Diffable::DIFF_CLASS

Constants included from DoubleModel::Base

DoubleModel::Base::NOT_USED

Class Attribute Summary collapse

Attributes included from DoubleModel::Parented

#_parent, #_parent_key

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from DoubleModel

new_uuid

Methods included from DoubleModel::Diffable

#as_update, #dirty?

Methods included from Includer

#include_missing

Constructor Details

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

Returns a new instance of ArrayModel.



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

def initialize(doc = [], parent: self, key: nil, read_only: self.class.read_only?)
  doc = [] unless doc.is_a?(Array)
  super
end

Class Attribute Details

.order_mattersObject

Returns the value of attribute order_matters.



20
21
22
# File 'lib/ecoportal/api/common/content/array_model.rb', line 20

def order_matters
  @order_matters
end

.uniqObject

Returns the value of attribute uniq.



20
21
22
# File 'lib/ecoportal/api/common/content/array_model.rb', line 20

def uniq
  @uniq
end

Class Method Details

.same_type?(a, b) ⇒ Boolean

Returns true if both elements have same behaviour.

Parameters:

Returns:

  • (Boolean)

    true if both elements have same behaviour



25
26
27
28
29
30
# File 'lib/ecoportal/api/common/content/array_model.rb', line 25

def same_type?(a, b) # rubocop:disable Naming/MethodParameterName

  msg = "To use this comparison both objects should be `ArrayModel`"
  raise msg unless a.is_a?(ArrayModel) && b.is_a?(ArrayModel)

  (a.order_matters? == b.order_matters?) && (a.uniq? == b.uniq?)
end

Instance Method Details

#&(other) ⇒ ArrayModel

Intersect

Parameters:

  • other (Object, Array<Object>, ArrayModel)

    the value(s) to be deleted

Returns:

  • (ArrayModel)

    a new object instance with the intersection done



215
216
217
218
219
220
221
222
# File 'lib/ecoportal/api/common/content/array_model.rb', line 215

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

#+(other) ⇒ Object

Concat to new



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

def +(other)
  new_from(to_a + into_a(other))
end

#-(other) ⇒ ArrayModel

Subtract

Parameters:

  • value (Object, Array<Object>, ArrayModel)

    the value(s) to be deleted

Returns:

  • (ArrayModel)

    a copy of the object with the elements subtracted



227
228
229
230
231
# File 'lib/ecoportal/api/common/content/array_model.rb', line 227

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

#<(other) ⇒ Object

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

Parameters:

  • other (Object, Array<Object>, ArrayModel)

    the value(s) to be added



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

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

#<<(value) ⇒ Object

Note:

if the class variable uniq is true, it skips duplicates

Adds an element to the subjacent Array



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

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

  on_change
  self
end

#==(other) ⇒ Object

Compares with an Array or another ArrayModel

Parameters:



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/ecoportal/api/common/content/array_model.rb', line 117

def ==(other)
  return true  if equal?(other)
  return false unless (other.class == self.class) || other.is_a?(Array)

  case other
  when Array
    self == new_from(other)
  when ArrayModel
    raise TypeMismatchedComparison.new(this: self, that: other) unless self.class.same_type?(self, other)

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

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

Retrieves the element of a certain position

Parameters:

  • pos (Integer)

    the position of the element

Returns:

  • (Date, String, Number)


101
102
103
# File 'lib/ecoportal/api/common/content/array_model.rb', line 101

def [](pos)
  _items[pos]
end

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

Sets the element of a certain position

Parameters:

  • pos (Integer)

    the position of the element

  • value (String, Date, Number)

    the element

Returns:

  • (Date, String, Number)


109
110
111
112
113
# File 'lib/ecoportal/api/common/content/array_model.rb', line 109

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

#_itemsArray

Returns the array element represented by this object.

Returns:

  • (Array)

    the array element represented by this object



67
68
69
70
# File 'lib/ecoportal/api/common/content/array_model.rb', line 67

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

#added_itemsArray<Date>, ... Also known as: added

Returns Array, Array, Array<Number] the elements that have been added.

Returns:

  • (Array<Date>, Array<String>, Array<Number] the elements that have been added)

    Array, Array, Array<Number] the elements that have been added



150
151
152
# File 'lib/ecoportal/api/common/content/array_model.rb', line 150

def added_items
  (doc || []) - (original_doc || [])
end

#clear!Object

Clears the Array keeping its reference



193
194
195
196
197
# File 'lib/ecoportal/api/common/content/array_model.rb', line 193

def clear!
  _items.clear
  on_change
  self
end

#concat!(values) ⇒ Object

Note:

same as #push! but for multiple elements

See Also:



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

def concat!(values)
  self << values
end

#delete!(*values) ⇒ Object

Deletes values from the Array



234
235
236
237
238
239
240
# File 'lib/ecoportal/api/common/content/array_model.rb', line 234

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

#deleted_itemsArray<Date>, ... Also known as: deleted

Returns Array, Array, Array<Number] the elements that have been deleted.

Returns:

  • (Array<Date>, Array<String>, Array<Number] the elements that have been deleted)

    Array, Array, Array<Number] the elements that have been deleted



157
158
159
# File 'lib/ecoportal/api/common/content/array_model.rb', line 157

def deleted_items
  (original_doc || []) - (doc || [])
end

#dupArrayModel

Returns a copy of the current object.

Returns:



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

def dup
  new_from(to_a)
end

#each(&block) ⇒ Object



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

def each(&block)
  return to_enum(:each) unless block

  _items.each(&block)
end

#empty?Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/ecoportal/api/common/content/array_model.rb', line 52

def empty?
  count&.zero?
end

#include?(value) ⇒ Boolean

Returns true if value is present, false otherwise.

Returns:

  • (Boolean)

    true if value is present, false otherwise



136
137
138
# File 'lib/ecoportal/api/common/content/array_model.rb', line 136

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

#include_all?(*value) ⇒ Boolean

Returns:

  • (Boolean)


144
145
146
# File 'lib/ecoportal/api/common/content/array_model.rb', line 144

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

#include_any?(*value) ⇒ Boolean

Returns:

  • (Boolean)


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

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

#index(value) ⇒ Integer

Returns the position of the element in the Array.

Returns:

  • (Integer)

    the position of the element in the Array



94
95
96
# File 'lib/ecoportal/api/common/content/array_model.rb', line 94

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

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



256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
# File 'lib/ecoportal/api/common/content/array_model.rb', line 256

def insert_one(value, pos: NOT_USED, before: NOT_USED, after: NOT_USED)
  idx = index(value)
  return idx if idx && uniq?

  pos =
    if used_param?(pos) && pos
      pos
    elsif used_param?(before) && before
      index(before)
    elsif used_param?(after) && after
      if (idx = index(after)) then idx + 1 end
    end

  # use last position as default

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

#lengthObject



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

def length
  count
end

#move(value, pos: NOT_USED, _before: NOT_USED, _after: NOT_USED) ⇒ Object

TODO



278
279
280
281
282
# File 'lib/ecoportal/api/common/content/array_model.rb', line 278

def move(value, pos: NOT_USED, _before: NOT_USED, _after: NOT_USED)
  return    unless (idx = index(value))
  on_change unless idx == pos
  pos
end

#new_from(other) ⇒ ArrayModel

Returns a new object with the current class.

Parameters:

  • other (Object, Array<Object>, ArrayModel)

    the value(s) of the new object

Returns:

  • (ArrayModel)

    a new object with the current class



84
85
86
# File 'lib/ecoportal/api/common/content/array_model.rb', line 84

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

#order_matters?Boolean

Returns:

  • (Boolean)


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

def order_matters?
  self.class.order_matters
end

#present?Boolean

Returns:

  • (Boolean)


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

def present?
  count&.positive?
end

#push!(*values) ⇒ Object Also known as: push

See Also:



174
175
176
# File 'lib/ecoportal/api/common/content/array_model.rb', line 174

def push!(*values)
  self << values
end

#swap(val_1, val_2) ⇒ Integer

Note:

this will work with first instances when not uniq?

Swaps two values' positions

Parameters:

  • val1 (Object)

    the first value to swap

  • val2 (Object)

    the second value to swap

Returns:

  • (Integer)

    the new of value1, nil if it wasn't moved



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

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

#to_aArray

Returns a copy of the Array elements.

Returns:

  • (Array)

    a copy of the Array elements

See Also:



78
79
80
# File 'lib/ecoportal/api/common/content/array_model.rb', line 78

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

#to_s(delimiter: "|") ⇒ Object



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

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

#uniq?Boolean

Returns:

  • (Boolean)


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

def uniq?
  self.class.uniq
end

#|(other) ⇒ ArrayModel

Join

Parameters:

  • other (Object, Array<Object>, ArrayModel)

    the value(s) to be joined

Returns:

  • (ArrayModel)

    a new object instance with the intersection done



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

def |(other)
  oth = new_from(other) - self
  new_from(to_a + oth.to_a)
end