eco-helpers 2.0.2 → 2.0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 37b6126eddfc0f3ef3c32f621fd0c6d15e5b1e15e83e539a52d331ebe59d8d16
4
- data.tar.gz: 838d28773e4175fe9948243dd0145ee184d6c1329a1c4fb772743db146261465
3
+ metadata.gz: b444c56a85b8fb8ce11e4b9201222adcb135c841eecece4b9e98f8bd6274b479
4
+ data.tar.gz: fca867adb3b83aeb1ab4473d76e69e9ff5ee4c4852c9e938317f656b1056fb53
5
5
  SHA512:
6
- metadata.gz: daa1ee54fdf2aa3bb983ef4ca8c813c4e6778cea94f32777854fbb157864d80c9eb2120007fbbd4c9a47c3b84d72ca4f671f3f64c8bf0bbafca6385d490e7437
7
- data.tar.gz: 8370f7da5acf41bc0951ed0fee5822bea43e128d8de34a3c84e626d60ad9ade2686bb0911af11e35b0197f8e67d9073826ff0f6b9b4dca4f5c78a73e9297b031
6
+ metadata.gz: 9a52c4b75a3093854de42d9f1a633e30faeb4b70e56322cc7252a5b5b8d581296afb53c32eaba209965366f7f4d398a73e3ecfaf3c03738e6b9b124a18ba4512
7
+ data.tar.gz: ab33ad8f29467b3844e3f43c407f3534228814c3915e63c72095bb9f2396f2f31b6cbd9dca9102472b75907dd908b3f529f1695479396cf5400b792e8ac0ed2f
data/CHANGELOG.md CHANGED
@@ -1,7 +1,48 @@
1
1
  # Change Log
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
- ## [2.0.2] - 2021-02-xx
4
+ ## [2.0.7] - 2021-03-xx
5
+
6
+ ### Added
7
+ ### Changed
8
+ ### Fixed
9
+ - `Eco::API::Session::Batch::JobsGroups` and `Eco::API::Session::Batch::Jobs`: when new `Batch::Job`s are creating during launch, they remained unlaunched
10
+ - this fix makes `#launch` method to iterate until there are no pending
11
+
12
+ ## [2.0.6] - 2021-03-08
13
+
14
+ ### Added
15
+ ### Changed
16
+ - `Eco::API::Session::Batch:Errors` moved some methods to be private
17
+ ### Fixed
18
+ - `Eco::API::Error` should inherit from `StandardError`, rather than from `Exception`
19
+
20
+ ## [2.0.5] - 2021-02-24
21
+
22
+ ### Added
23
+ ### Changed
24
+ ### Fixed
25
+ - `Eco::API::Common::People::PersonParser#symbol_keys` to use `Array#select`
26
+ - as `Array#filter` was introduced in ruby `2.5.5`
27
+
28
+ ## [2.0.4] - 2021-02-23
29
+
30
+ ### Added
31
+ ### Changed
32
+ - `Eco::API::Common::People::PersonParser#defined_attrs` to include virtual attributes
33
+
34
+ ### Fixed
35
+
36
+ ## [2.0.3] - 2021-02-23
37
+
38
+ ### Added
39
+ - `Eco::API::UseCases::OozeSamples::OozeUpdateCase`: added integration to update page instances (non-templates)
40
+
41
+ ### Changed
42
+ ### Fixed
43
+ - `Eco::API::Policies::DefaultPolicies::UserAccess` complete default policy code.
44
+
45
+ ## [2.0.2] - 2021-02-22
5
46
 
6
47
  ### Added
7
48
  ### Changed
data/eco-helpers.gemspec CHANGED
@@ -30,9 +30,9 @@ Gem::Specification.new do |spec|
30
30
  spec.add_development_dependency "yard", ">= 0.9.26", "< 0.10"
31
31
  spec.add_development_dependency "redcarpet", ">= 3.5.1", "< 3.6"
32
32
 
33
- spec.add_dependency 'ecoportal-api', '>= 0.8.1', '< 0.9'
33
+ spec.add_dependency 'ecoportal-api', '>= 0.8.2', '< 0.9'
34
34
  #spec.add_dependency 'ecoportal-api', '>= 0.7.5', '< 0.8'
35
- spec.add_dependency 'ecoportal-api-v2', '>= 0.8.3', '< 0.9'
35
+ spec.add_dependency 'ecoportal-api-v2', '>= 0.8.6', '< 0.9'
36
36
  spec.add_dependency 'aws-sdk-s3', '>= 1.83.0', '< 2'
37
37
  spec.add_dependency 'aws-sdk-ses', '>= 1.36.0', '< 2'
38
38
  spec.add_dependency 'dotenv', '>= 2.7.6', '< 2.8'
@@ -99,9 +99,16 @@ module Eco
99
99
  # - the list is sorted according `CORE_ATTRS` + `ACCOUNT_ATTRS` + schema attrs
100
100
  # @return [Array<String>] list of all attribute defined parsers.
101
101
  def defined_attrs
102
- defined = @parsers.keys
103
- defined = (all_attrs || defined) && defined
104
- defined - (defined - all_attrs)
102
+ defined = @parsers.keys
103
+ defined = (all_attrs | defined) & defined
104
+ defined - symbol_keys
105
+ end
106
+
107
+ # Symbol keys are type or import parsers (that do not belong to the model)
108
+ # @note this was introduced to boost virtual fields to treat in different phases of the parsing process
109
+ # @return [Array<Symbol>] all the parsers defined as Symbol
110
+ def symbol_keys
111
+ @parsers.keys.select {|k| k.is_a?(Symbol)}
105
112
  end
106
113
 
107
114
  # Returns a list of all the internal attributes of the model that have a parser defined & that should be active.
data/lib/eco/api/error.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  module Eco
2
2
  module API
3
3
  # To identify api server errors
4
- class Error < Exception
5
- class UnknownErrorClass < Exception
4
+ class Error < StandardError
5
+ class UnknownErrorClass < StandardError
6
6
  def initialize(msg = nil, klass:)
7
7
  msg ||= "Unkown api error class #{klass}"
8
8
  super(msg)
@@ -1,18 +1,18 @@
1
1
  class Eco::API::Policies::DefaultPolicies::UserAccess < Eco::API::Common::Loaders::Policy
2
2
  name "default-user-access"
3
3
 
4
- attr_reader :session, :options
4
+ attr_reader :session, :options, :job
5
5
  attr_accessor :account_removed_count
6
6
 
7
7
  def main(people, session, options, policy, job)
8
- @session = session; @options = options
8
+ @session = session; @options = options; @job = job
9
9
 
10
10
  self.account_removed_count = 0
11
11
 
12
12
  people.each do |person|
13
- remove_account_when_no_email!(person) if person.email.to_s.empty?
14
- person.account.policy_group_ids = [defid] if no_policy_group_ids?(person)
15
- refresh_abilities!(person.account)
13
+ remove_account_when_no_email!(person) if person.email.to_s.empty?
14
+ person.account.policy_group_ids = defid if no_policy_group_ids?(person)
15
+ refresh_abilities!(person)
16
16
  end
17
17
 
18
18
  warn_account_removal!
@@ -22,14 +22,14 @@ class Eco::API::Policies::DefaultPolicies::UserAccess < Eco::API::Common::Loader
22
22
 
23
23
  def warn_account_removal!
24
24
  if account_removed_count > 0
25
- msg = "Removed account to #{account_removed_count} people"
25
+ msg = "(DefaultPolicy on job '#{job.name}') Removed account to #{account_removed_count} people"
26
26
  session.logger.warn(msg)
27
27
  end
28
28
  end
29
29
 
30
30
  def remove_account_when_no_email!(person)
31
31
  if person.account
32
- account_removed_count += 1 if had_account?(person)
32
+ self.account_removed_count += 1 if had_account?(person)
33
33
  person.account = nil
34
34
  end
35
35
  end
@@ -40,23 +40,11 @@ class Eco::API::Policies::DefaultPolicies::UserAccess < Eco::API::Common::Loader
40
40
  return !!person.original_doc["account"]
41
41
  end
42
42
 
43
- def provision_basic_level!(person)
44
- if account = person.account
45
-
46
- unless options.dig(:exclude, :abilities)
47
- account.permissions_custom = session.new_preset(person)
48
-
49
- if no_abilities?(person)
50
- account.permissions_custom = min_abilities
51
- end
52
- end
53
-
54
- end
55
- end
56
-
57
- def refresh_abilities!(account)
58
- return nil unless account
59
-
43
+ def refresh_abilities!(person)
44
+ return nil if options.dig(:exclude, :abilities)
45
+ return nil unless account = person.account
46
+ account.permissions_custom = session.new_preset(person)
47
+ account.permissions_custom = min_abilities if no_abilities?(person)
60
48
  end
61
49
 
62
50
  def no_policy_group_ids?(person)
@@ -64,8 +52,8 @@ class Eco::API::Policies::DefaultPolicies::UserAccess < Eco::API::Common::Loader
64
52
  end
65
53
 
66
54
  def no_abilities?(person)
67
- person.account.permissions_custom &&
68
- person.account.permissions_custom.values.all?(&:nil?)
55
+ return true unless account = person.account
56
+ account.permissions_custom && account.permissions_custom.values.all?(&:nil?)
69
57
  end
70
58
 
71
59
  def min_abilities
@@ -86,7 +74,7 @@ class Eco::API::Policies::DefaultPolicies::UserAccess < Eco::API::Common::Loader
86
74
  end
87
75
 
88
76
  def defid
89
- @defid ||= policy_groups.to_id(default_group)
77
+ @defid ||= policy_groups.to_id([default_group]).compact
90
78
  end
91
79
 
92
80
  def default_group
@@ -8,6 +8,8 @@ module Eco
8
8
  # @attr_reader status [Eco::API::Session::Batch::Status] `batch status` this `Errors` object is associated to.
9
9
  attr_reader :status
10
10
 
11
+ ErrorCache = Struct.new(:type, :err, :entry)
12
+
11
13
  # @param status [Eco::API::Session::Batch::Status] `batch status` this `Errors` object is associated to.
12
14
  def initialize(status:)
13
15
  "Expected Batch::Status as root. Given: #{status.class}" unless status.is_a?(Eco::API::Session::Batch::Status)
@@ -55,29 +57,6 @@ module Eco
55
57
  entries.length
56
58
  end
57
59
 
58
- # Input entries that got **error** response from the _Server_.
59
- # @raise [Exception] if there are elements of the final `queue` that did not get response
60
- # @note discards those that did not get _response_ from the Server (so those that were not queried)
61
- # - please, observe that this can only happen if there were repeated entries in the `source_queue`
62
- # @return [Array<Hash>, Array<Ecoportal::API::V1::Person>, Array<Ecoportal::API::Internal::Person>]
63
- def entries
64
- queue.each_with_index.map do |query, i|
65
- unless response = status[i]
66
- msg = "Error: query with no response. You might have duplicated entries in your queue.\n"
67
- msg += "Queue length: #{queue.length}; Queue elements class: #{queue.first.class}\n"
68
- msg += "Query with no response. Person: #{person_ref(query)}\n"
69
- queue.map do |entry|
70
- if [:id, :external_id, :email].any? {|attr| (v = get_attr(entry, attr)) && v == get_attr(query, attr)}
71
- msg += "It could be this peson entry (idx: #{to_index(entry)}): #{person_ref(entry)}\n"
72
- end
73
- end
74
- raise msg
75
- end
76
-
77
- response.success?? nil : query
78
- end.compact
79
- end
80
-
81
60
  # For all the `entries` with errors generates a `Hash` object
82
61
  # @return [Array<Hash>] where each `Hash` has
83
62
  # 1. `:type` -> the error type
@@ -88,11 +67,11 @@ module Eco
88
67
  if body = status[entry].body
89
68
  if errs = body["errors"]
90
69
  errs.each do |msg|
91
- arr.push({
92
- type: klass = Eco::API::Error.get_type(msg),
93
- err: klass.new(err_msg: msg, entry: entry, session: session),
94
- entry: entry
95
- })
70
+ arr.push(ErrorCache.new(
71
+ klass = Eco::API::Error.get_type(msg),
72
+ klass.new(err_msg: msg, entry: entry, session: session),
73
+ entry
74
+ ))
96
75
  end
97
76
  end
98
77
  end
@@ -103,45 +82,16 @@ module Eco
103
82
  # @return [Hash] where each `key` is a `type` **error** and each value is
104
83
  # an `Array` of `entries` that got that error
105
84
  def by_type
106
- errors.group_by do |h|
107
- h[:type]
85
+ errors.group_by do |e|
86
+ e.type
108
87
  end.transform_values do |arr|
109
- arr.map {|h| h[:entry]}
88
+ arr.map {|e| e.entry}
110
89
  end
111
90
  end
112
91
  # @!endgroup
113
92
 
114
93
  # @!group Messaging methods
115
94
 
116
- # Generates a `String` specifying the error for the entry `key`.
117
- # @param key [Integer, Ecoportal::API::V1::Person]
118
- # @return [String] the error description.
119
- def str(key)
120
- msg = ""
121
- unless status.success?(key)
122
- i = to_index(key)
123
- entry = queue.to_a[i]
124
- response = status[i]
125
- msg = "Error #{response.status}: #{response.body}\n"
126
- msg += "-- Failed to batch #{method}. Person: #{person_ref(entry)}"
127
- end
128
- msg
129
- end
130
-
131
- # Sorts the entries that got server error by error `type` and generates the error messages.
132
- # @return [Array<String>] the errors messages.
133
- def strs
134
- by_type.values.flatten(1).each_with_object([]) do |query, msgs|
135
- msgs.push(str(query))
136
- end
137
- end
138
-
139
- def print_one(key)
140
- unless status.success?(key)
141
- logger.error(str(key))
142
- end
143
- end
144
-
145
95
  def message
146
96
  msgs = strs
147
97
  if msgs.length > 0
@@ -163,6 +113,29 @@ module Eco
163
113
 
164
114
  private
165
115
 
116
+ # Input entries that got **error** response from the _Server_.
117
+ # @raise [Exception] if there are elements of the final `queue` that did not get response
118
+ # @note discards those that did not get _response_ from the Server (so those that were not queried)
119
+ # - please, observe that this can only happen if there were repeated entries in the `source_queue`
120
+ # @return [Array<Hash>, Array<Ecoportal::API::V1::Person>, Array<Ecoportal::API::Internal::Person>]
121
+ def entries
122
+ queue.filter.with_index do |query, i|
123
+ unless response = status[i]
124
+ msg = "Error: query with no response. You might have duplicated entries in your queue.\n"
125
+ msg += "Queue length: #{queue.length}; Queue elements class: #{queue.first.class}\n"
126
+ msg += "Query with no response. Person: #{person_ref(query)}\n"
127
+ queue.map do |entry|
128
+ if [:id, :external_id, :email].any? {|attr| (v = get_attr(entry, attr)) && v == get_attr(query, attr)}
129
+ msg += "It could be this peson entry (idx: #{to_index(entry)}): #{person_ref(entry)}\n"
130
+ end
131
+ end
132
+ raise msg
133
+ end
134
+
135
+ !response.success?
136
+ end
137
+ end
138
+
166
139
  def person_ref(entry)
167
140
  row_str = (row = get_row(entry)) ? "(row: #{row}) " : nil
168
141
  "#{row_str}(id: '#{get_attr(entry, :id)}') '#{get_attr(entry, :name)}' ('#{get_attr(entry, :external_id)}': '#{get_attr(entry, :email)}')"
@@ -185,6 +158,35 @@ module Eco
185
158
  end
186
159
  end
187
160
 
161
+ # Sorts the entries that got server error by error `type` and generates the error messages.
162
+ # @return [Array<String>] the errors messages.
163
+ def strs
164
+ by_type.values.flatten(1).each_with_object([]) do |query, msgs|
165
+ msgs.push(str(query))
166
+ end
167
+ end
168
+
169
+ # Generates a `String` specifying the error for the entry `key`.
170
+ # @param key [Integer, Ecoportal::API::V1::Person]
171
+ # @return [String] the error description.
172
+ def str(key)
173
+ msg = ""
174
+ unless status.success?(key)
175
+ i = to_index(key)
176
+ entry = queue.to_a[i]
177
+ response = status[i]
178
+ msg = "Error #{response.status}: #{response.body}\n"
179
+ msg += "-- Failed to batch #{method}. Person: #{person_ref(entry)}"
180
+ end
181
+ msg
182
+ end
183
+
184
+ def print_one(key)
185
+ unless status.success?(key)
186
+ logger.error(str(key))
187
+ end
188
+ end
189
+
188
190
  end
189
191
  end
190
192
  end
@@ -212,6 +212,13 @@ module Eco
212
212
 
213
213
  private
214
214
 
215
+ def subjobs_summary
216
+ return "" unless subjobs.count > 0
217
+ [].tap do |msg|
218
+ subjobs.map {|subjob| msg << subjob.summary}
219
+ end.join("\n")
220
+ end
221
+
215
222
  def as_update(*args)
216
223
  feedback.as_update(*args)
217
224
  end
@@ -310,13 +317,6 @@ module Eco
310
317
  end
311
318
  end
312
319
 
313
- def subjobs_summary
314
- return "" unless subjobs.count > 0
315
- [].tap do |msg|
316
- subjobs.map {|subjob| msg << subjob.summary}
317
- end.join("\n")
318
- end
319
-
320
320
  end
321
321
  end
322
322
  end
@@ -94,7 +94,7 @@ module Eco
94
94
  callback.call(job, job_status) if callback
95
95
  end
96
96
  end
97
-
97
+ launch(simulate: simulate) if pending?
98
98
  return status
99
99
  end
100
100
 
@@ -96,6 +96,7 @@ module Eco
96
96
  self.class.counter(DELAY_BETWEEN_GROUPS) if !simulate && idx < @order.length - 1
97
97
  end
98
98
  end
99
+ launch(simulate: simulate) if pending?
99
100
  return status
100
101
  end
101
102
 
@@ -122,7 +122,9 @@ module Eco
122
122
  def valid_index(index: nil, entry: nil)
123
123
  index ||= @hash[entry]
124
124
  unless index && index < @queue.length
125
- fatal "You must provide either the index on the final 'queue' or the original entry object of the batch"
125
+ msg = "You must provide either the index on the final 'queue' or the original entry object of the batch. "
126
+ msg += "Given, index=#{index.class}, entry:#{entry.class}"
127
+ fatal msg
126
128
  end
127
129
  index
128
130
  end
@@ -195,6 +195,7 @@ module Eco
195
195
  # @yieldreturn [Eco::API::UseCases::BaseIO] the `io` input/output object carried througout all the _workflow_
196
196
  # @return [Eco::API::Session::Config::Workflow] the current stage object (to ease chainig).
197
197
  def run(key = nil, io:, &block)
198
+ raise "Missing BaseIO object" unless io.is_a?(Eco::API::UseCases::BaseIO)
198
199
  begin
199
200
  if key
200
201
  io = stage(key).run(io: io, &block)
@@ -25,10 +25,30 @@ class Eco::API::UseCases::OozeSamples::OozeUpdateCase < Eco::API::Common::Loader
25
25
  options.dig(:source, :ooze_id)
26
26
  end
27
27
 
28
+ def stage_id
29
+ options.dig(:source, :stage_id)
30
+ end
31
+
32
+ def stage(id_name = stage_id)
33
+ if stg = ooze.stages[id_name] || ooze.stages.get_by_name(id_name)
34
+ return apiv2.pages.get(ooze_id, stage_id: stg.id).tap do |stage|
35
+ if stage
36
+ new_target(stage)
37
+ logger.info("Got #{object_reference(stage)} from #{object_reference(ooze)}")
38
+ else
39
+ logger.error("Could not get stage '#{id_name}' in ooze '#{ooze_id}'")
40
+ exit(1)
41
+ end
42
+ end
43
+ end
44
+ raise "Stage '#{id_name}' doesn't exist in ooze '#{ooze_id}'"
45
+ end
46
+
28
47
  def ooze
29
48
  @ooze ||= apiv2.pages.get(ooze_id).tap do |ooze|
30
49
  if ooze
31
- logger.info("Got ooze '#{ooze_id}': '#{ooze.name}'")
50
+ new_target(ooze)
51
+ logger.info("Got #{object_reference(ooze)}")
32
52
  else
33
53
  logger.error("Could not get ooze '#{ooze_id}'")
34
54
  exit(1)
@@ -39,7 +59,7 @@ class Eco::API::UseCases::OozeSamples::OozeUpdateCase < Eco::API::Common::Loader
39
59
  def launch_request
40
60
  prompt_to_confirm!
41
61
 
42
- apiv2.pages.update(ooze).tap do |response|
62
+ apiv2.pages.update(target).tap do |response|
43
63
  if response.success?
44
64
  logger.info("All went OK")
45
65
  else
@@ -59,9 +79,35 @@ class Eco::API::UseCases::OozeSamples::OozeUpdateCase < Eco::API::Common::Loader
59
79
  @apiv2 ||= session.api(version: :oozes)
60
80
  end
61
81
 
62
- def patch_doc(renew: false)
63
- return @patch_doc if @patch_doc && !renew
64
- @patch_doc = apiv2.pages.get_body(ooze)
82
+ def target
83
+ @target
84
+ end
85
+
86
+ def new_target(object)
87
+ if @target && patch_doc["page"]
88
+ logger.warn "You you are switching to a new target #{object_reference(object)} after doing unsaved changes to #{object_reference(@target)}"
89
+ end
90
+ @target = object
91
+ end
92
+
93
+ def object_reference(obj)
94
+ return "No reference" unless obj
95
+ "".tap do |ref|
96
+ case obj
97
+ when Ecoportal::API::V2::Page::Stage
98
+ ref << "Stage "
99
+ when Ecoportal::API::V2::Pages::PageStage
100
+ ref << "StagePage "
101
+ when Ecoportal::API::V2::Page
102
+ ref << "Page "
103
+ end
104
+ ref << "'#{obj.name}' " if obj.respond_to?(:name)
105
+ end
106
+ end
107
+
108
+
109
+ def patch_doc
110
+ apiv2.pages.get_body(target)
65
111
  end
66
112
 
67
113
  def backup_patch!
data/lib/eco/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Eco
2
- VERSION = "2.0.2"
2
+ VERSION = "2.0.7"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eco-helpers
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 2.0.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oscar Segura
@@ -116,7 +116,7 @@ dependencies:
116
116
  requirements:
117
117
  - - ">="
118
118
  - !ruby/object:Gem::Version
119
- version: 0.8.1
119
+ version: 0.8.2
120
120
  - - "<"
121
121
  - !ruby/object:Gem::Version
122
122
  version: '0.9'
@@ -126,7 +126,7 @@ dependencies:
126
126
  requirements:
127
127
  - - ">="
128
128
  - !ruby/object:Gem::Version
129
- version: 0.8.1
129
+ version: 0.8.2
130
130
  - - "<"
131
131
  - !ruby/object:Gem::Version
132
132
  version: '0.9'
@@ -136,7 +136,7 @@ dependencies:
136
136
  requirements:
137
137
  - - ">="
138
138
  - !ruby/object:Gem::Version
139
- version: 0.8.3
139
+ version: 0.8.6
140
140
  - - "<"
141
141
  - !ruby/object:Gem::Version
142
142
  version: '0.9'
@@ -146,7 +146,7 @@ dependencies:
146
146
  requirements:
147
147
  - - ">="
148
148
  - !ruby/object:Gem::Version
149
- version: 0.8.3
149
+ version: 0.8.6
150
150
  - - "<"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0.9'