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

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, #key, #key=, key?, new_uuid, #original_doc, pass_reader, pass_writer, passarray, passdate, 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, #used_param?

Constructor Details

#initialize(doc = {}, parent: self, key: nil) ⇒ ArrayModel

Returns a new instance of ArrayModel.



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

def initialize(doc = {}, parent: self, key: nil)
  super(doc, parent: parent, key: key)
end

Class Attribute Details

.order_mattersObject

Returns the value of attribute order_matters.



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

def order_matters
  @order_matters
end

.uniqObject

Returns the value of attribute uniq.



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

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



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

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

Parameters:

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

    the value(s) to be deleted

Returns:

  • (ArrayModel)

    a new object instance with the intersection done



181
182
183
184
185
186
187
188
# File 'lib/ecoportal/api/common/content/array_model.rb', line 181

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



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

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

#-(value) ⇒ 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



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

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)

Parameters:

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

    the value(s) to be added

  • values (Array)


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

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



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

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

Parameters:



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/ecoportal/api/common/content/array_model.rb', line 98

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

Parameters:

  • pos (Integer)

    the position of the element

Returns:

  • (Date, String, Number)


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

def [](pos)
  _items[pos]
end

#[]=(post, 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)


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

def []=(post, 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



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

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



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

def clear!
  _items.clear
  on_change
  self
end

#concat!(values) ⇒ Object

Note:

same as #push! but for multiple elements

See Also:



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

def concat!(values)
  self << values
end

#delete!(*values) ⇒ Object

Deletes values from the Array



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

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

#dupArrayModel

Returns a copy of the current object.

Returns:



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

def dup
  new_from(to_a)
end

#each(&block) ⇒ Object



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

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

#empty?Boolean

Returns:

  • (Boolean)


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

def empty?;   count == 0; end

#include?(value) ⇒ Boolean

Returns true if value is present, false otherwise.

Returns:

  • (Boolean)

    true if value is present, false otherwise



117
118
119
# File 'lib/ecoportal/api/common/content/array_model.rb', line 117

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

#include_all?(*value) ⇒ Boolean

Returns:

  • (Boolean)


125
126
127
# File 'lib/ecoportal/api/common/content/array_model.rb', line 125

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

#include_any?(*value) ⇒ Boolean

Returns:

  • (Boolean)


121
122
123
# File 'lib/ecoportal/api/common/content/array_model.rb', line 121

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



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

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

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



222
223
224
225
226
227
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 222

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
        when used_param?(before)
          index(before)
        when used_param?(after)
          if i = index(after)
            i + 1
          end
        else
          length
        end

  pos.tap do |i|
    unless !i
      _items.insert(pos, value)
      on_change
    end
  end
end

#lengthObject



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

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

Returns a new object with the current class.

Parameters:

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

    the value(s) of the new object

Returns:

  • (ArrayModel)

    a new object with the current class



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

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

#order_matters?Boolean

Returns:

  • (Boolean)


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

def order_matters?; self.class.order_matters; end

#present?Boolean

Returns:

  • (Boolean)


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

def present?; count > 0;  end

#push!(value) ⇒ Object

See Also:



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

def push!(value)
  self << value
end

#swap(value1, value2) ⇒ 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



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

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.

Returns:

  • (Array)

    a copy of the Array elements

See Also:



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

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

#uniq?Boolean

Returns:

  • (Boolean)


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

def uniq?;          self.class.uniq;          end

#|(value) ⇒ ArrayModel

Join

Parameters:

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

    the value(s) to be joined

Returns:

  • (ArrayModel)

    a new object instance with the intersection done



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

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