ecoportal-api-v2 1.1.7 → 1.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 65194be30f026aa431874543d6905b5704ea081c6a3c9ef0bf9741142c4c4253
4
- data.tar.gz: 398eaeb83ea38386670715c0fa83144004abdbd8c7edfd8581ecb7b157c8d205
3
+ metadata.gz: 70ba8da2cd5c6bd11498fb6cf8a40b04d121940c1693efc525372e3a584758f8
4
+ data.tar.gz: 2aa49af74223a5a03529fd3920714ff9b4f1dcbc636285c6b187acebe9b2e601
5
5
  SHA512:
6
- metadata.gz: 0761f2079d2493f6fef928f846daf4b6b0413838c4f1252c8cf31742284fc5bcfc0e8d6dbd635f2659b37a34a6b90c09ed42f7db781c868a635188354dbe4bbd
7
- data.tar.gz: c979ae5a583898d47c1b8501d19ea651f31013a78461008c4ed6eff69c6b1a271c2c812dbbc2a52bc82d90b7caf67e9a286e8d488639eb8bd5a8fd6678c91659
6
+ metadata.gz: 75a8af0bc9495b4ba65688914eaf2ac94e4b08756581a3e6f193c390376ae6d905d08321ba8c8017675e1d2991ce1c699176f74c4c7b4b3b7aa91edbd8b37325
7
+ data.tar.gz: ea3368515e1fb001874e4e932902e063bb2e1cbf015cb352c2813313bb97abd80c446e5f9ab623fa11dbc0dc8e9c164c5b1947475d7a43c935da91ac34c9be22
data/.rubocop.yml CHANGED
@@ -1,39 +1,70 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.5.1
2
+ TargetRubyVersion: 2.7.8
3
3
  Exclude:
4
4
  - 'config/routes.rb'
5
+ NewCops: enable
5
6
 
6
- Metrics/LineLength:
7
- Enabled: false
8
- Metrics/BlockLength:
9
- ExcludedMethods: [context, describe]
10
- Max: 50
7
+ Metrics/ClassLength:
8
+ Max: 500
9
+ Metrics/ModuleLength:
10
+ Max: 300
11
11
  Metrics/MethodLength:
12
12
  Max: 50
13
- Metrics/ClassLength:
14
- Max: 200
15
13
  Metrics/AbcSize:
16
14
  Max: 30
17
-
18
- ParameterLists:
15
+ Metrics/ParameterLists:
19
16
  Max: 5
20
17
  CountKeywordArgs: false
18
+ Metrics/BlockLength:
19
+ CountAsOne: ['array', 'heredoc', 'method_call']
20
+ Max: 50
21
+ Metrics/CyclomaticComplexity:
22
+ Max: 30
23
+ Metrics/PerceivedComplexity:
24
+ Max: 30
21
25
 
22
- Style/StringLiterals:
26
+ Style/AccessorGrouping:
27
+ Enabled: false
28
+ Style/ConditionalAssignment:
29
+ Enabled: false
30
+ Style/BlockDelimiters:
31
+ BracesRequiredMethods: ['log']
32
+ Style/ClassAndModuleChildren:
23
33
  Enabled: false
24
34
  Style/FrozenStringLiteralComment:
25
35
  Enabled: false
26
- Style/CommentedKeyword:
36
+ Style/StringLiterals:
27
37
  Enabled: false
28
- Style/MultilineBlockChain:
38
+ Style/StringLiteralsInInterpolation:
29
39
  Enabled: false
30
40
  Style/Documentation:
31
41
  Enabled: false
32
- Style/StringLiteralsInInterpolation:
42
+ Style/CommentedKeyword:
43
+ Enabled: false
44
+ Style/MultilineBlockChain:
33
45
  Enabled: false
34
46
  Style/AndOr:
35
47
  Enabled: false
48
+ Style/Alias:
49
+ EnforcedStyle: prefer_alias_method
50
+ Style/FetchEnvVar:
51
+ Enabled: false
52
+ Style/RegexpLiteral:
53
+ EnforcedStyle: mixed
54
+ AllowInnerSlashes: true
36
55
 
56
+ Layout/HashAlignment:
57
+ EnforcedColonStyle: table
58
+ EnforcedHashRocketStyle: table
59
+ Layout/LeadingCommentSpace:
60
+ Enabled: false
61
+ AllowGemfileRubyComment: true
62
+ Layout/ParameterAlignment:
63
+ Enabled: false
64
+ Layout/MultilineMethodDefinitionBraceLayout:
65
+ EnforcedStyle: symmetrical
66
+ Layout/LineLength:
67
+ Enabled: true
37
68
  Layout/SpaceInsideHashLiteralBraces:
38
69
  Enabled: false
39
70
  Layout/SpaceInsideBlockBraces:
@@ -42,14 +73,22 @@ Layout/SpaceAroundOperators:
42
73
  Enabled: false
43
74
  Layout/ExtraSpacing:
44
75
  AllowForAlignment: true
76
+ AllowBeforeTrailingComments: true
45
77
  Layout/AccessModifierIndentation:
46
78
  EnforcedStyle: indent
47
79
  Layout/DotPosition:
48
80
  EnforcedStyle: trailing
49
81
  Layout/MultilineMethodCallIndentation:
50
82
  EnforcedStyle: indented
51
- Layout/IndentHash:
83
+ Layout/FirstHashElementIndentation:
84
+ Enabled: false
85
+ Layout/EmptyLineAfterGuardClause:
52
86
  Enabled: false
53
87
 
54
88
  Naming/VariableNumber:
55
89
  EnforcedStyle: snake_case
90
+ CheckSymbols: false
91
+ Naming/MethodParameterName:
92
+ AllowedNames: ['x', 'y', 'i', 'j', 'id', 'io']
93
+ Naming/RescuedExceptionsVariableName:
94
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,13 +1,16 @@
1
1
  # Change Log
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
- ## [1.1.8] - 2024-03-xx
4
+ ## [1.1.8] - 2024-03-23
5
5
 
6
- ### Added
7
6
  ### Changed
7
+ - A lot of code tidy up
8
+
8
9
  ### Fixed
10
+ - `Ecoportal::API::Common::Conent::CollectionModel`
11
+ - correct `item` `klass` resolution
9
12
 
10
- ## [1.1.7] - 2024-03-xx
13
+ ## [1.1.7] - 2024-03-13
11
14
 
12
15
  ### Added
13
16
  - `Ecoportal::API::Common::Concerns::Benchmarkable`
@@ -7,13 +7,9 @@ module Ecoportal
7
7
  # - Its purpose is to handle an Array of basic objects (i.e. `Date`, `String`, `Number`)
8
8
  class ArrayModel < Content::DoubleModel
9
9
  class TypeMismatchedComparison < StandardError
10
- def initialize (this: nil, that: msg = "Trying to compare objects with different behavior.")
11
- if this
12
- msg += " From object with 'order_matters: #{this.order_matters?}' and 'uniq: #{this.uniq?}'."
13
- end
14
- if that
15
- msg += " To object where 'order_matters: #{that.order_matters?}' and 'uniq: #{that.uniq?}'."
16
- end
10
+ def initialize(this: nil, that: msg = "Trying to compare objects with different behavior.")
11
+ msg += " From object with 'order_matters: #{this.order_matters?}' and 'uniq: #{this.uniq?}'." if this
12
+ msg += " To object where 'order_matters: #{that.order_matters?}' and 'uniq: #{that.uniq?}'." if that
17
13
  super(msg)
18
14
  end
19
15
  end
@@ -27,7 +23,8 @@ module Ecoportal
27
23
  # @param b [ArrayModel]
28
24
  # @return [Boolean] `true` if both elements have same behaviour
29
25
  def same_type?(a, b)
30
- raise "To use this comparison both objects should be `ArrayModel`" unless a.is_a?(ArrayModel) && b.is_a?(ArrayModel)
26
+ msg = "To use this comparison both objects should be `ArrayModel`"
27
+ raise msg unless a.is_a?(ArrayModel) && b.is_a?(ArrayModel)
31
28
  (a.order_matters? == b.order_matters?) && (a.uniq? == b.uniq?)
32
29
  end
33
30
  end
@@ -38,12 +35,25 @@ module Ecoportal
38
35
  super(doc, parent: parent, key: key, read_only: read_only)
39
36
  end
40
37
 
41
- def order_matters?; self.class.order_matters; end
42
- def uniq?; self.class.uniq; end
38
+ def order_matters?
39
+ self.class.order_matters
40
+ end
41
+
42
+ def uniq?
43
+ self.class.uniq
44
+ end
45
+
46
+ def length
47
+ count
48
+ end
43
49
 
44
- def length; count; end
45
- def empty?; count == 0; end
46
- def present?; count > 0; end
50
+ def empty?
51
+ count&.zero?
52
+ end
53
+
54
+ def present?
55
+ count&.positive?
56
+ end
47
57
 
48
58
  def each(&block)
49
59
  return to_enum(:each) unless block
@@ -66,10 +76,10 @@ module Ecoportal
66
76
  _items.slice(0..-1)
67
77
  end
68
78
 
69
- # @param value [Object, Array<Object>, ArrayModel] the value(s) of the new object
79
+ # @param other [Object, Array<Object>, ArrayModel] the value(s) of the new object
70
80
  # @return [ArrayModel] a new object with the current class
71
- def new_from(value)
72
- self.class.new(into_a(value))
81
+ def new_from(other)
82
+ self.class.new(into_a(other))
73
83
  end
74
84
 
75
85
  # @return [ArrayModel] a copy of the current object
@@ -93,28 +103,28 @@ module Ecoportal
93
103
  # @param pos [Integer] the position of the element
94
104
  # @param value [String, Date, Number] the element
95
105
  # @return [Date, String, Number]
96
- def []=(post, value)
106
+ def []=(pos, value)
97
107
  _items[pos] = value
98
108
  on_change
99
109
  self[pos]
100
110
  end
101
111
 
102
112
  # Compares with an `Array` or another `ArrayModel`
103
- # @param a [ArrayModel, Array]
104
- def ==(a)
105
- return true if self.equal?(a)
106
- return false unless (a.class == self.class) || a.is_a?(Array)
107
- case a
113
+ # @param other [ArrayModel, Array]
114
+ def ==(other)
115
+ return true if equal?(other)
116
+ return false unless (other.class == self.class) || other.is_a?(Array)
117
+
118
+ case other
108
119
  when Array
109
- self == new_from(a)
120
+ self == new_from(other)
110
121
  when ArrayModel
111
- return true if
112
- raise TypeMismatchedComparison.new(this: self, that: a) unless self.class.same_type?(self, a)
122
+ raise TypeMismatchedComparison.new(this: self, that: other) unless self.class.same_type?(self, other)
113
123
 
114
- if self.order_matters?
115
- _items == a.to_a
124
+ if order_matters?
125
+ _items == other.to_a
116
126
  else
117
- (_items - a.to_a).empty? && (a.to_a - _items).empty?
127
+ (_items - other.to_a).empty? && (other.to_a - _items).empty?
118
128
  end
119
129
  end
120
130
  end
@@ -154,11 +164,10 @@ module Ecoportal
154
164
  end
155
165
 
156
166
  # Resets the `Array` by keeping its reference and adds the value(s)
157
- # @param value [Object, Array<Object>, ArrayModel] the value(s) to be added
158
- # @param values [Array]
159
- def <(values)
167
+ # @param other [Object, Array<Object>, ArrayModel] the value(s) to be added
168
+ def <(other)
160
169
  _items.clear
161
- self << values
170
+ self << other
162
171
  end
163
172
 
164
173
  # Clears the `Array` keeping its reference
@@ -169,25 +178,25 @@ module Ecoportal
169
178
  end
170
179
 
171
180
  # Concat to new
172
- def +(value)
173
- new_from(self.to_a + into_a(value))
181
+ def +(other)
182
+ new_from(to_a + into_a(other))
174
183
  end
175
184
 
176
185
  # Join
177
- # @param value [Object, Array<Object>, ArrayModel] the value(s) to be joined
186
+ # @param other [Object, Array<Object>, ArrayModel] the value(s) to be joined
178
187
  # @return [ArrayModel] a new object instance with the intersection done
179
- def |(value)
180
- new = new_from(value) - self
181
- new_from(to_a + new.to_a)
188
+ def |(other)
189
+ oth = new_from(other) - self
190
+ new_from(to_a + oth.to_a)
182
191
  end
183
192
 
184
193
  # Intersect
185
- # @param value [Object, Array<Object>, ArrayModel] the value(s) to be deleted
194
+ # @param other [Object, Array<Object>, ArrayModel] the value(s) to be deleted
186
195
  # @return [ArrayModel] a new object instance with the intersection done
187
- def &(value)
188
- self.dup.tap do |out|
189
- self.dup.tap do |delta|
190
- delta.delete!(*into_a(value))
196
+ def &(other)
197
+ dup.tap do |out|
198
+ dup.tap do |delta|
199
+ delta.delete!(*into_a(other))
191
200
  out.delete!(*into_a(delta))
192
201
  end
193
202
  end
@@ -196,9 +205,9 @@ module Ecoportal
196
205
  # Subtract
197
206
  # @param value [Object, Array<Object>, ArrayModel] the value(s) to be deleted
198
207
  # @return [ArrayModel] a **copy** of the object with the elements subtracted
199
- def -(value)
200
- self.dup.tap do |copy|
201
- copy.delete!(*into_a(value))
208
+ def -(other)
209
+ dup.tap do |copy|
210
+ copy.delete!(*into_a(other))
202
211
  end
203
212
  end
204
213
 
@@ -206,7 +215,7 @@ module Ecoportal
206
215
  def delete!(*values)
207
216
  values.map do |v|
208
217
  deletion!(v)
209
- end.tap do |r|
218
+ end.tap do |_r|
210
219
  on_change
211
220
  end
212
221
  end
@@ -216,43 +225,41 @@ module Ecoportal
216
225
  # @param val1 [Object] the first value to swap
217
226
  # @param val2 [Object] the second value to swap
218
227
  # @return [Integer] the new of `value1`, `nil` if it wasn't moved
219
- def swap(value1, value2)
220
- index(value2).tap do |dest|
221
- if dest && pos = index(value1)
222
- _items[dest] = value1
223
- _items[pos] = value2
228
+ def swap(val_1, val_2)
229
+ index(val_2).tap do |dest|
230
+ if dest && (pos = index(val_1))
231
+ _items[dest] = val_1
232
+ _items[pos] = val_2
224
233
  end
225
234
  end
226
235
  end
227
236
 
228
237
  def insert_one(value, pos: NOT_USED, before: NOT_USED, after: NOT_USED)
229
- i = index(value)
230
- return i if (i && uniq?)
231
- pos = case
232
- when used_param?(pos) && pos
233
- pos
234
- when used_param?(before) && before
235
- index(before)
236
- when used_param?(after) && after
237
- if i = index(after) then i + 1 end
238
- end
238
+ idx = index(value)
239
+ return idx if idx && uniq?
240
+
241
+ pos =
242
+ if used_param?(pos) && pos
243
+ pos
244
+ elsif used_param?(before) && before
245
+ index(before)
246
+ elsif used_param?(after) && after
247
+ if (idx = index(after)) then idx + 1 end
248
+ end
239
249
 
250
+ # use last position as default
240
251
  pos ||= length
241
- pos.tap do |i|
252
+ pos.tap do |_i|
242
253
  _items.insert(pos, value)
243
254
  on_change
244
255
  end
245
256
  end
246
257
 
247
258
  # TODO
248
- def move(value, pos: NOT_USED, before: NOT_USED, after: NOT_USED)
249
- if i = index(value)
250
- unless i == pos
251
-
252
- on_change
253
- end
254
- pos
255
- end
259
+ def move(value, pos: NOT_USED, _before: NOT_USED, _after: NOT_USED)
260
+ return unless (idx = index(value))
261
+ on_change unless idx == pos
262
+ pos
256
263
  end
257
264
 
258
265
  protected
@@ -270,13 +277,9 @@ module Ecoportal
270
277
  end
271
278
 
272
279
  def deletion!(value)
273
- if !uniq?
274
- if i = _items.index(value)
275
- _items.slice!(i)
276
- end
277
- else
278
- _items.delete(value)
279
- end
280
+ return _items.delete(value) if uniq?
281
+ return unless (idx = _items.index(value))
282
+ _items.slice!(idx)
280
283
  end
281
284
  end
282
285
  end
@@ -5,7 +5,7 @@ module Ecoportal
5
5
  module Content
6
6
  module ClassHelpers
7
7
  include Common::BaseClass
8
- NOT_USED = "no_used!"
8
+ NOT_USED = "no_used!".freeze
9
9
 
10
10
  # Class resolver
11
11
  # @note it caches the resolved `klass`es
@@ -18,21 +18,21 @@ module Ecoportal
18
18
  @resolved ||= {}
19
19
  @resolved[klass] ||=
20
20
  case klass
21
- when Class
22
- klass
23
- when String
24
- begin
25
- Kernel.const_get(klass)
26
- rescue NameError => e
27
- raise if exception
28
- end
29
- when Symbol
30
- source_class.resolve_class(source_class.send(klass))
31
- when Hash
32
- referrer, referred = klass.first
33
- resolve_class(referred, source_class: referrer, exception: exception)
34
- else
35
- raise "Unknown class: #{klass}" if exception
21
+ when Class
22
+ klass
23
+ when String
24
+ begin
25
+ Kernel.const_get(klass)
26
+ rescue NameError
27
+ raise if exception
28
+ end
29
+ when Symbol
30
+ source_class.resolve_class(source_class.send(klass))
31
+ when Hash
32
+ referrer, referred = klass.first
33
+ resolve_class(referred, source_class: referrer, exception: exception)
34
+ else
35
+ raise "Unknown class: #{klass}" if exception
36
36
  end
37
37
  end
38
38
 
@@ -41,11 +41,11 @@ module Ecoportal
41
41
  # @param key [String, Symbol] to be normalized
42
42
  # @return [String] a correct constant name
43
43
  def to_constant(key)
44
- str_name = key.to_s.strip.split(/::/).compact.map do |str|
44
+ key.to_s.strip.split(/::/).compact.map do |str|
45
45
  str.slice(0).upcase + str.slice(1..-1)
46
- end.join("").split(/[\-\_ :]+/i).compact.map do |str|
46
+ end.join.split(/[\-\_ :]+/i).compact.map do |str|
47
47
  str.slice(0).upcase + str.slice(1..-1)
48
- end.join("")
48
+ end.join
49
49
  end
50
50
 
51
51
  # Helper to create an instance variable `name`
@@ -60,7 +60,7 @@ module Ecoportal
60
60
  # Generates random ids in hexadecimal to use in class name generation.
61
61
  # @param len [Integeter] length of the `uid`
62
62
  # @return [String] a random unique id of length `len`
63
- def uid(len = 8);
63
+ def uid(len = 8)
64
64
  SecureRandom.hex(len/2)
65
65
  end
66
66
 
@@ -72,8 +72,8 @@ module Ecoportal
72
72
  # @yieldparam child_class [Class] the new class
73
73
  # @return [Class] the new generated class
74
74
  def new_class(name = "Child#{uid}", inherits: self, namespace: inherits)
75
- name = name.to_s.to_sym.freeze
76
- class_name = to_constant(name)
75
+ name = name.to_s.to_sym.freeze
76
+ class_name = to_constant(name)
77
77
 
78
78
  unless target_class = resolve_class("#{namespace}::#{class_name}", exception: false)
79
79
  target_class = Class.new(inherits)
@@ -92,19 +92,17 @@ module Ecoportal
92
92
  # @return
93
93
  def to_time(value, exception: true)
94
94
  case value
95
- when NilClass
95
+ when Time, NilClass
96
96
  value
97
97
  when String
98
98
  begin
99
99
  Time.parse(value)
100
- rescue ArgumentArgument => e
100
+ rescue ArgumentArgument
101
101
  raise if exception
102
102
  nil
103
103
  end
104
104
  when Date
105
105
  Time.parse(value.to_s)
106
- when Time
107
- value
108
106
  else
109
107
  to_time(value.to_s) if value.respond_to?(:to_s)
110
108
  end
@@ -147,6 +145,7 @@ module Ecoportal
147
145
  # - mutating methods would reflect the changes on other classes as well
148
146
  # - therefore, `freeze` will be called on the values that are inherited.
149
147
  def inherited(subclass)
148
+ super
150
149
  inheritable_class_vars.each do |var|
151
150
  instance_var = instance_variable_name(var)
152
151
  value = instance_variable_get(instance_var)