eco-helpers 1.0.13 → 1.0.14

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.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/lib/eco/api/common/people/entry_factory.rb +3 -1
  3. data/lib/eco/api/common/people/person_attribute_parser.rb +33 -10
  4. data/lib/eco/api/common/people/person_entry.rb +1 -1
  5. data/lib/eco/api/common/people/person_entry_attribute_mapper.rb +1 -1
  6. data/lib/eco/api/common/people/person_factory.rb +5 -1
  7. data/lib/eco/api/common/session/environment.rb +7 -3
  8. data/lib/eco/api/common/session/mailer.rb +4 -0
  9. data/lib/eco/api/common/session/sftp.rb +4 -3
  10. data/lib/eco/api/error.rb +1 -0
  11. data/lib/eco/api/organization/presets_factory.rb +1 -1
  12. data/lib/eco/api/organization/tag_tree.rb +1 -1
  13. data/lib/eco/api/session.rb +119 -74
  14. data/lib/eco/api/session/batch.rb +23 -25
  15. data/lib/eco/api/session/batch/base_policy.rb +283 -0
  16. data/lib/eco/api/session/batch/errors.rb +17 -3
  17. data/lib/eco/api/session/batch/feedback.rb +112 -0
  18. data/lib/eco/api/session/batch/job.rb +90 -87
  19. data/lib/eco/api/session/batch/policies.rb +22 -0
  20. data/lib/eco/api/session/batch/request_stats.rb +195 -0
  21. data/lib/eco/api/session/batch/status.rb +66 -19
  22. data/lib/eco/api/session/config.rb +10 -0
  23. data/lib/eco/api/session/config/workflow.rb +1 -1
  24. data/lib/eco/api/usecases/default_cases/set_default_tag_case.rb +4 -3
  25. data/lib/eco/api/usecases/default_cases/switch_supervisor_case.rb +15 -10
  26. data/lib/eco/cli/config/default/filters.rb +3 -2
  27. data/lib/eco/cli/config/default/options.rb +12 -0
  28. data/lib/eco/cli/config/default/usecases.rb +6 -4
  29. data/lib/eco/cli/config/default/workflow.rb +3 -2
  30. data/lib/eco/cli/scripting/args_helpers.rb +1 -1
  31. data/lib/eco/version.rb +1 -1
  32. metadata +5 -1
@@ -2,26 +2,36 @@ module Eco
2
2
  module API
3
3
  class Session
4
4
  class Batch
5
- class Status < Common::Session::BaseSession
6
- @types = [:exact, :search]
5
+ # @attr_reader source_queue [Array<Hash>, Array<Ecoportal::API::V1::Person>, Array<Ecoportal::API::Internal::Person>]
6
+ # The queue as it was originally made (it could contain duplicates)
7
+ # @attr_reader queue [Array<Hash>, Array<Ecoportal::API::V1::Person>, Array<Ecoportal::API::Internal::Person>]
8
+ # `source_queue` with no repeated elements (**note**: observe that the elimination of duplicates could fail)
9
+ # @attr_reader mode [Symbol] the `mode` that the `batch` was run with
10
+ # @attr_reader root [Eco::API::Session::Job] the `job` that launched the `batch`
11
+ class Status < Eco::API::Common::Session::BaseSession
12
+ @modes = [:exact, :search]
7
13
 
8
14
  attr_reader :source_queue
9
- attr_reader :queue, :method, :type
15
+ attr_reader :queue, :method, :mode
10
16
  attr_reader :root
11
17
 
12
18
  class << self
13
- attr_reader :types
19
+ attr_reader :modes
14
20
 
15
- def valid_type?(value)
16
- types.include?(value)
21
+ def valid_mode?(value)
22
+ modes.include?(value)
17
23
  end
18
24
  end
19
25
 
20
- def initialize(e, queue:, method:, type: :exact)
26
+ # @param e [Eco::API::Common::Session::Environment] requires a session environmen, as any child of `Eco::API::Common::Session::BaseSession`
27
+ # @param queue [Array<Hash>, Array<Ecoportal::API::V1::Person>, Array<Ecoportal::API::Internal::Person>] the `source_queue`
28
+ # @param method [Symbol] the type of `batch operation`
29
+ # @param mode [Symbol] the mode of `batch operation` (search)
30
+ def initialize(e, queue:, method:, mode: :exact)
21
31
  super(e)
22
32
  fatal("In batch operations you must batch an Enumerable. Received: #{queue}") unless queue && queue.is_a?(Enumerable)
23
33
 
24
- self.type = type
34
+ self.mode = mode
25
35
  @method = method
26
36
  @source_queue = queue
27
37
 
@@ -41,33 +51,58 @@ module Eco
41
51
  @people_match = Array.new(@queue.length, [])
42
52
  end
43
53
 
54
+ # Nativelly to this gem, a batch against the server is lauched by an Eco::API::Session::Job.
55
+ # When the batch returns the `BatchStatus`, the `Job` assigns itself as `root` of it.
56
+ # @param object [Eco::API::Session::Job]
44
57
  def root=(object)
45
58
  @root = object
46
59
  end
47
60
 
48
- def type=(value)
49
- fatal("Invalid :type '#{value}. You must specify type: as one of #{self.class.types} ") unless self.class.valid_type?(value)
50
- @type = value
61
+ def mode=(value)
62
+ fatal("Invalid :mode '#{value}. You must specify mode: as one of #{self.class.modes} ") unless self.class.valid_mode?(value)
63
+ @mode = value
51
64
  end
52
65
 
66
+ # @return [Eco::API::Session::Batch::Errors] errors object helper
53
67
  def errors
54
- @errors ||= Batch::Errors.new(status: self)
68
+ @errors ||= Eco::API::Session::Batch::Errors.new(status: self)
55
69
  end
56
70
 
71
+ # Get the assciated `reponse` of an input entry object `key`
72
+ # @param key [Integer, Hash, Ecoportal::API::V1::Person, Ecoportal::API::Internal::Person] these are the **index options**:
73
+ # 1. `Integer`: index/position of the entry in the final `queue`
74
+ # 2. `Hash`: entry queries can be raw `Hash` objects
75
+ # 3. `Person` object: the most common case is to use the person wrapper classes of the `Ecoportal::API` namespace.
76
+ # @return response key [Ecoportal::API::Common::BatchResponse]
57
77
  def [](key)
58
78
  @responses[to_index(key)]
59
79
  end
60
80
 
61
-
81
+ # Associates an input entry object `key` to its `response`
82
+ # @param key [Integer, Hash, Ecoportal::API::V1::Person, Ecoportal::API::Internal::Person]
83
+ # @see Eco::API::Session::Batch::Status#[] for `key` options
84
+ # @param response key [Ecoportal::API::Common::BatchResponse]
62
85
  def []=(key, response)
63
86
  @responses[to_index(key)] = response
64
87
  end
65
88
 
89
+ # The _person_ we got from the Server wrapped to the `Person` object for the input entry object `key`
90
+ # @note it only makes sense when the batch method used was `get`
91
+ # @param key [Integer, Hash, Ecoportal::API::V1::Person, Ecoportal::API::Internal::Person]
92
+ # @see Eco::API::Session::Batch::Status#[] for `key` options
93
+ # return [Ecoportal::API::V1::Person, Ecoportal::API::Internal::Person]
66
94
  def person(key)
67
95
  return self[key].result if success?(key)
68
96
  nil
69
97
  end
70
98
 
99
+ # The _person_ we got from the Server wrapped to the `Person` object for the input entry object `key`
100
+ # @note
101
+ # - it only makes sense when the _batch method_ used was `get` with `q`
102
+ # - **found using a search criteria** (`mode` == `:search`), as opposite to find the person directly by `external_id`
103
+ # @param key [Integer, Hash, Ecoportal::API::V1::Person, Ecoportal::API::Internal::Person]
104
+ # @see Eco::API::Session::Batch::Status#[] for `key` options
105
+ # return [Ecoportal::API::V1::Person, Ecoportal::API::Internal::Person]
71
106
  def person_match(key)
72
107
  @person_match[to_index(key)]
73
108
  end
@@ -84,44 +119,56 @@ module Eco
84
119
  @people_match[to_index(key)] = people
85
120
  end
86
121
 
122
+ # Has the _entry_ `key` been queried to the server?
123
+ # @param key [Hash, Ecoportal::API::V1::Person, Ecoportal::API::Internal::Person]
124
+ # @return [Boolean] `true` if input entry `key` has an associated `Ecoportal::API::Common::BatchResponse`
87
125
  def received?(key)
88
126
  !!self[key]
89
127
  end
90
128
 
129
+ # Has the _entry_ `key` 's query to the server been successful
130
+ # @param key [Hash, Ecoportal::API::V1::Person, Ecoportal::API::Internal::Person]
131
+ # @return [Boolean] `true` if input entry `key` has not had a server Error during the query
91
132
  def success?(key)
92
133
  self[key]&.success?
93
134
  end
94
135
 
136
+ # When the batch _method_ has been `get`, it gathers into an `Array` the people found.
137
+ # @note here is where the used `mode` gets relevance:
138
+ # - while `:exact` mode will keep the order of found people as per order of final `queue`
139
+ # - `:search` mode will just gather the results (order won't match)
140
+ # @raise [Exception] when the `method` of the batch operation was other than `get`
141
+ # @return [Array<Ecoportal::API::V1::Person>, Array<Ecoportal::API::Internal::Person>] all the people that has been found.
95
142
  def people
96
143
  fatal "This batch wasn't a 'get'. Can't obtain people without 'get' method" unless method == :get
97
- #out = Eco::API::Organization::People.new([])
98
- if type == :exact
144
+ if mode == :exact
99
145
  out = Array(queue.length)
100
146
  @responses.each_with_index do |response, i|
101
- # out = out.merge([response.result]) if respose.success?
102
147
  out[i] = response.result if response.success?
103
148
  end
104
- elsif type == :search
149
+ elsif mode == :search
105
150
  out = []
106
151
  queue.each_with_index.map do |entry, i|
107
152
  pers = person(entry)
108
153
  pers ||= person_match(entry)
109
154
  ppl = pers ? [pers] : people_match(entry)
110
155
  out += ppl
111
- # out = out.merge(ppl) unless ppl.empty?
112
156
  end
113
157
  end
114
158
  out
115
159
  end
116
160
 
161
+ # Helper to transform any `key` to an `Integer` index
162
+ # @return [Integer] the index that `key` has in the final `queue`
117
163
  def to_index(key)
118
164
  key.is_a?(Integer) ? valid_index(index: key) : valid_index(entry: key)
119
165
  end
120
166
 
167
+ # _Index_ validator to make this object reliable
121
168
  def valid_index(index: nil, entry: nil)
122
169
  index ||= @hash[entry]
123
170
  unless index && index < @queue.length
124
- fatal "You must provide either the index or the original entry object of the batch"
171
+ fatal "You must provide either the index on the final 'queue' or the original entry object of the batch"
125
172
  end
126
173
  index
127
174
  end
@@ -274,6 +274,16 @@ module Eco
274
274
  end
275
275
  end
276
276
 
277
+ def batch_policies
278
+ @batch_policies = self["batch_policies"] ||= Eco::API::Session::Batch::Policies.new("batch_policy")
279
+ if block_given?
280
+ yield(@batch_policies)
281
+ self
282
+ else
283
+ @batch_policies
284
+ end
285
+ end
286
+
277
287
  def error_handlers
278
288
  @error_handlers = self["error_handlers"] ||= Eco::API::Error::Handlers.new
279
289
  if block_given?
@@ -32,7 +32,7 @@ module Eco
32
32
  def get_model(key)
33
33
  raise "Expected Symbol. Given: #{key.class}" unless key.is_a?(Symbol)
34
34
  workflow = @workflow[key]
35
- raise "Expected Array. Given #{model.class}" unless !workflow || workflow.is_a?(Hash)
35
+ raise "Expected Hash. Given #{model.class}" unless !workflow || workflow.is_a?(Hash)
36
36
 
37
37
  class_name = titleize(key.to_s)
38
38
  full_class_name = "#{self}::#{class_name}"
@@ -14,7 +14,7 @@ module Eco
14
14
  msg = "There is no tagtree definition in the configuration files\n" +
15
15
  "For this usecase to work out you need to define it."
16
16
  session.logger.fatal(msg)
17
- exit
17
+ raise msg
18
18
  end
19
19
 
20
20
  # IMPORTANT: this two lines ensure that only people to be updated is selected
@@ -22,8 +22,9 @@ module Eco
22
22
  people = people.account_present
23
23
 
24
24
  if people.length <= 0
25
- session.logger.info("There are no people with account... aborting script")
26
- exit
25
+ msg = "There are no people with account... aborting script"
26
+ session.logger.info(msg)
27
+ raise msg
27
28
  end
28
29
 
29
30
  update = session.job_group("main").new("update", usecase: usecase, type: :update, sets: :account)
@@ -8,32 +8,37 @@ module Eco
8
8
  @cases.define("switch-supervisor", type: :transform) do |people, session, options, usecase|
9
9
 
10
10
  unless old_id = options.dig(:super, :old)
11
- session.logger.error("You haven't specified the original supervisor. Aborting...")
12
- exit
11
+ msg = "You haven't specified the original supervisor. Aborting..."
12
+ session.logger.error(msg)
13
+ exit(1)
13
14
  end
14
15
 
15
16
  # we could be setting the supervisor to nil
16
17
  unless options[:super].key?(:new)
17
- session.logger.error("You haven't specified the new supervisor. Aborting...")
18
- exit
18
+ msg = "You haven't specified the new supervisor. Aborting..."
19
+ session.logger.error(msg)
20
+ exit(1)
19
21
  end
20
22
 
21
23
  new_id = options.dig(:super, :new)
22
24
 
23
25
  unless old_sup = people.person(id: old_id, external_id: old_id, email: old_id)
24
- session.logger.error("Couldn't find any user with that id (old-super): '#{old_id}'. Aborting...")
25
- exit
26
+ msg = "Couldn't find any user with that id (old-super): '#{old_id}'. Aborting..."
27
+ session.logger.error(msg)
28
+ exit(1)
26
29
  end
27
30
 
28
31
  unless new_sup = people.person(id: new_id, external_id: new_id, email: new_id)
29
- session.logger.error("Couldn't find any user with that id (new-super): '#{new_id}'. Aborting...")
30
- exit
32
+ msg = "Couldn't find any user with that id (new-super): '#{new_id}'. Aborting..."
33
+ session.logger.error(msg)
34
+ exit(1)
31
35
  end
32
36
 
33
37
  people = people.supervisor_id(old_sup.id)
34
38
  unless people.length > 0
35
- session.logger.error("There are no people with supervisor #{old_sup.external_id} (#{old_sup.name} - #{old_sup.email}). Aborting...")
36
- exit
39
+ msg = "There are no people with supervisor #{old_sup.external_id} (#{old_sup.name} - #{old_sup.email}). Aborting..."
40
+ session.logger.error(msg)
41
+ exit(1)
37
42
  end
38
43
 
39
44
  session.logger.info("Going to change supervisor '#{old_sup.name}' (#{old_sup.external_id}) to '#{new_sup.name}' (#{new_sup.external_id})")
@@ -50,8 +50,9 @@ ASSETS.cli.config do |cnf|
50
50
  sch_id = session.schemas.to_id(sch_name)
51
51
 
52
52
  unless sch_id
53
- puts "You need to specify the schema id"
54
- exit
53
+ msg = "You need to specify the schema id"
54
+ session.logger.error(msg)
55
+ exit(1)
55
56
  end
56
57
 
57
58
  options.deep_merge!(people: {filter: {details: {schema_id: sch_id}}})
@@ -6,6 +6,18 @@ ASSETS.cli.config do |cnf|
6
6
  options[:simulate] = true
7
7
  end
8
8
 
9
+ options_set.add("-skip-batch-policy") do |options|
10
+ options.deep_merge!(skip: {batch_policy: true})
11
+ end
12
+
13
+ options_set.add("-skip-api-policies") do |options|
14
+ options.deep_merge!(skip: {api_policies: true})
15
+ end
16
+
17
+ options_set.add("-feed-only-stats") do |options|
18
+ options.deep_merge!(feedback: {only_stats: true})
19
+ end
20
+
9
21
  options[:end_get] = true
10
22
  options_set.add("-no-get") do |options|
11
23
  options[:end_get] = false
@@ -21,14 +21,16 @@ ASSETS.cli.config do |cnf|
21
21
  cases.add("-set-supervisor-from", :sync, case_name: "set-supervisor")
22
22
  cases.add("-switch-supervisor", :transform, case_name: "switch-supervisor") do |people, session, options|
23
23
  unless old_id = SCR.get_arg("-old-super", with_param: true)
24
- session.logger.error("You must specify an -old-super to target whose supervisor is changing")
25
- exit
24
+ msg = "You must specify an -old-super to target whose supervisor is changing"
25
+ session.logger.error(msg)
26
+ exit(1)
26
27
  end
27
28
  options.deep_merge!(super: {old: old_id})
28
29
 
29
30
  unless new_id = SCR.get_arg("-new-super", with_param: true)
30
- session.logger.error("You must specify the -new-super id. To reset to nil the supervisor, please, specify nil.")
31
- exit
31
+ msg = "You must specify the -new-super id. To reset to nil the supervisor, please, specify nil."
32
+ session.logger.error(msg)
33
+ exit(1)
32
34
  end
33
35
  new_id = new_id == "nil"? nil : new_id
34
36
  options.deep_merge!(super: {new: new_id})
@@ -32,8 +32,9 @@ ASSETS.cli.config do |config|
32
32
 
33
33
  wf.on(:usecases) do |wf_cases, io|
34
34
  unless config.usecases.process(io: io)
35
- io.session.logger.warn("No update operation specified... quitting")
36
- exit
35
+ msg = "No update operation specified... quitting"
36
+ io.session.logger.warn(msg)
37
+ exit(1)
37
38
  end
38
39
  io
39
40
  end
@@ -42,7 +42,7 @@ module Eco
42
42
  if !filename
43
43
  if required
44
44
  puts "you need to specify a file '#{key} file'"
45
- exit
45
+ exit(1)
46
46
  end
47
47
  elsif !(File.exists?(filename) || File.exists?(File.expand_path(filename)))
48
48
  if should_exist && required
data/lib/eco/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Eco
2
- VERSION = "1.0.13"
2
+ VERSION = "1.0.14"
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: 1.0.13
4
+ version: 1.0.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oscar Segura
@@ -308,10 +308,14 @@ files:
308
308
  - lib/eco/api/policies/policy.rb
309
309
  - lib/eco/api/session.rb
310
310
  - lib/eco/api/session/batch.rb
311
+ - lib/eco/api/session/batch/base_policy.rb
311
312
  - lib/eco/api/session/batch/errors.rb
313
+ - lib/eco/api/session/batch/feedback.rb
312
314
  - lib/eco/api/session/batch/job.rb
313
315
  - lib/eco/api/session/batch/jobs.rb
314
316
  - lib/eco/api/session/batch/jobs_groups.rb
317
+ - lib/eco/api/session/batch/policies.rb
318
+ - lib/eco/api/session/batch/request_stats.rb
315
319
  - lib/eco/api/session/batch/status.rb
316
320
  - lib/eco/api/session/config.rb
317
321
  - lib/eco/api/session/config/api.rb