eco-helpers 2.0.38 → 2.0.42
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +65 -2
- data/eco-helpers.gemspec +1 -1
- data/lib/eco/api/common/people/entry_factory.rb +1 -1
- data/lib/eco/api/common/session/sftp.rb +0 -1
- data/lib/eco/api/error.rb +8 -0
- data/lib/eco/api/microcases/people_refresh.rb +9 -2
- data/lib/eco/api/organization/presets_values.json +4 -1
- data/lib/eco/api/session/batch/errors.rb +36 -37
- data/lib/eco/api/session/batch/feedback.rb +24 -0
- data/lib/eco/api/session/batch/job.rb +18 -3
- data/lib/eco/api/session/config/workflow.rb +21 -2
- data/lib/eco/api/usecases/default_cases/entries_to_csv_case.rb +18 -0
- data/lib/eco/api/usecases/default_cases.rb +1 -0
- data/lib/eco/api/usecases/ooze_samples/ooze_base_case.rb +47 -0
- data/lib/eco/api/usecases/ooze_samples/ooze_update_case.rb +0 -39
- data/lib/eco/api/usecases/ooze_samples/register_update_case.rb +2 -2
- data/lib/eco/api/usecases/ooze_samples/target_oozes_update_case.rb +64 -0
- data/lib/eco/api/usecases/ooze_samples.rb +1 -0
- data/lib/eco/cli/config/default/options.rb +7 -0
- data/lib/eco/cli/config/default/usecases.rb +8 -1
- data/lib/eco/cli/config/default/workflow.rb +27 -7
- data/lib/eco/csv/table.rb +3 -0
- data/lib/eco/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c14b952724b755aa88b633094baf947b8c32b3a8699f77e8a4d63cdc94e10765
|
4
|
+
data.tar.gz: 015fd112ec97cb490c1bae82cdbd744256ca8879b98578f4c2442a0730652bf5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cbdf02bb1b3323069682c6b9dca370b598d846fc185e8db6dba7e337f1939a41f00b17d60bcb599c4f8abf9c0c6a713495e88258eb5a521b061ffa01c63d552d
|
7
|
+
data.tar.gz: b656b2a52dc65a7e2ae582ec68999de0d7551a6a17c5b83a3763ead94d161a8c969dc76add52ec6a93ebbfd68b5b47293c06fe3e33c8cfaacc4ad6273bf5b17f
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,71 @@
|
|
1
1
|
# Change Log
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
+
## [2.0.42] - 2021-10-30
|
5
|
+
|
6
|
+
### Added
|
7
|
+
- `eco/api/organization/presets_values.json` added abilities:
|
8
|
+
- `visitor_management`
|
9
|
+
- `broadcast_notifications`
|
10
|
+
- `cross_register_reporting`
|
11
|
+
- Due to dev pipeline, the `ecoportal-api` version `0.8.4` hasn't been released
|
12
|
+
- This part of the current `eco-helpers` version depends on that gem version (to be upgraded later)
|
13
|
+
- Changed the `workflow` in
|
14
|
+
- `before(:post_launch, :usecases)` => post launch cases are not prevented for **partial** updates
|
15
|
+
- rectified message
|
16
|
+
- `run(:post_launch, :usecases)` => missing **people** error will log in `debug` level
|
17
|
+
- it won't break the script anymore (just prevent a post use case to be run)
|
18
|
+
- New use case `Eco::API::UseCases::DefaultCases::EntriesToCsv`: to export input entries as `csv`
|
19
|
+
- invokable via `-entries-to-csv`
|
20
|
+
- More errors:
|
21
|
+
- `Eco::API::Error::ExternalIdTaken`
|
22
|
+
- `Eco::API::Error::InternalServerError`
|
23
|
+
- **Added** option `processed-people-to-csv file.csv` to export a `csv` with the results of processing people
|
24
|
+
- This option allows to preview the final data when launching a `dry-run` (`-simulate`)
|
25
|
+
- **Added** ooze case sample `Eco::API::UseCases::OozeSamples::TargetOozesUpdateCase`
|
26
|
+
- Allows to retrieve the target entries based on a `csv`
|
27
|
+
|
28
|
+
### Changed
|
29
|
+
- Moved methods of `#person_ref`, `#get_attr` and `#get_row` as **class methods** of `Eco::API::Session::Batch::Feedback`
|
30
|
+
- `Eco::API::Session::Errors` methods above to use them via `Feedback` class
|
31
|
+
- `Eco::API::Session::Errors::ErrorCache`: **added** new property `response`
|
32
|
+
- `#by_type` added parameter `only_entries` to specify the output type
|
33
|
+
- `#errors` capture the `response` in the generated `ErrorCache` object
|
34
|
+
|
35
|
+
### Fixed
|
36
|
+
- `Eco::API::Session::Config::Workflow#run` to validate **callback** output class
|
37
|
+
- It should be a `Eco::API::UseCases::BaseIO`
|
38
|
+
- Prevent **uncreated people** to be present in queues or people refresh (if the server side worked perfectly, this contingency shouldn't be necessary):
|
39
|
+
- `Eco::API::Session::Batch::Job#processed_queue`
|
40
|
+
- Sanity-check to exclude people that are **new** and do not have `id` when the current `Job` is **not** of type `:create` (meaning that it was supposed to be created but failed and it probably doesn't exist on server-side)
|
41
|
+
- This prevents errors when trying to update/delete a person that most probably does not exist on the server.
|
42
|
+
- `Eco::API::MicroCases#people_refresh`
|
43
|
+
- Remove from people run-time object those that are **new** that are `dirty` (with pending changes)
|
44
|
+
|
45
|
+
## [2.0.41] - 2021-10-06
|
46
|
+
|
47
|
+
### Fixed
|
48
|
+
- `Eco::API::Session::Batch::Job` `backup_update`
|
49
|
+
- Saved `requests` filename was overlapping due to only batch job type being used
|
50
|
+
- Now it uses the name of the batch job as well
|
51
|
+
|
52
|
+
## [2.0.40] - 2021-09-29
|
53
|
+
|
54
|
+
### Added
|
55
|
+
- Unique access point for `validation` via core case `Eco::API::UseCases::OozeSamples::OozeBaseCase#update_ooze`
|
56
|
+
|
57
|
+
## [2.0.39] - 2021-09-28
|
58
|
+
|
59
|
+
### Changed
|
60
|
+
- `Eco::API::UseCases::OozeSamples::OozeBaseCase`
|
61
|
+
- Moved helpers from `Eco::API::UseCases::OozeSamples::OozeUpdateCase`
|
62
|
+
|
63
|
+
### Fixed
|
64
|
+
- `Eco::API::UseCases::OozeSamples::RegisterUpdateCase`
|
65
|
+
- fix launch condition to be `Y`
|
66
|
+
- fix `search` method call
|
67
|
+
- Changed the `workflow` to prevent re-cache of people when `people` was not used
|
68
|
+
|
4
69
|
## [2.0.38] - 2021-09-07
|
5
70
|
|
6
71
|
### Added
|
@@ -12,8 +77,6 @@ All notable changes to this project will be documented in this file.
|
|
12
77
|
### Changed
|
13
78
|
- Changed the `workflow` to prevent re-cache of people when `people` was not used
|
14
79
|
|
15
|
-
### Fixed
|
16
|
-
|
17
80
|
## [2.0.37] - 2021-09-03
|
18
81
|
|
19
82
|
### Added
|
data/eco-helpers.gemspec
CHANGED
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
|
|
31
31
|
spec.add_development_dependency "redcarpet", ">= 3.5.1", "< 3.6"
|
32
32
|
|
33
33
|
spec.add_dependency 'ecoportal-api', '>= 0.8.3', '< 0.9'
|
34
|
-
spec.add_dependency 'ecoportal-api-v2', '>= 0.8.
|
34
|
+
spec.add_dependency 'ecoportal-api-v2', '>= 0.8.19', '< 0.9'
|
35
35
|
spec.add_dependency 'aws-sdk-s3', '>= 1.83.0', '< 2'
|
36
36
|
spec.add_dependency 'aws-sdk-ses', '>= 1.36.0', '< 2'
|
37
37
|
spec.add_dependency 'dotenv', '>= 2.7.6', '< 2.8'
|
@@ -166,7 +166,7 @@ module Eco
|
|
166
166
|
run = true
|
167
167
|
if Eco::API::Common::Session::FileManager.file_exists?(file)
|
168
168
|
prompt_user("Do you want to overwrite it? (Y/n):", explanation: "The file '#{file}' already exists.", default: "Y") do |response|
|
169
|
-
run = (response == "") ||
|
169
|
+
run = (response == "") || response.upcase.start_with?("Y")
|
170
170
|
end
|
171
171
|
end
|
172
172
|
|
data/lib/eco/api/error.rb
CHANGED
@@ -19,10 +19,18 @@ module Eco
|
|
19
19
|
@match = /.*/
|
20
20
|
end
|
21
21
|
|
22
|
+
class InternalServerError < Eco::API::Error
|
23
|
+
@str_err = "Internal Server Error"
|
24
|
+
@match = /#{@str_err}/
|
25
|
+
end
|
22
26
|
class UnknownPersonId < Eco::API::Error
|
23
27
|
@str_err = "Unknown person id"
|
24
28
|
@match = /Cannot find person with id (.*)/
|
25
29
|
end
|
30
|
+
class ExternalIdTaken < Eco::API::Error
|
31
|
+
@str_err = "external ID already taken"
|
32
|
+
@match = /#{@str_err}/
|
33
|
+
end
|
26
34
|
class EmailMissing < Eco::API::Error
|
27
35
|
@str_err = "missing email for account creation"
|
28
36
|
@match = /#{@str_err}/
|
@@ -2,15 +2,22 @@ module Eco
|
|
2
2
|
module API
|
3
3
|
class MicroCases
|
4
4
|
# Helper to obtain all the elements of `people` anew from the _People Manager_.
|
5
|
-
# @note
|
5
|
+
# @note
|
6
|
+
# 1. This helper is normally used to run consecutive usecases, where data needs refresh.
|
7
|
+
# 2. It only includes new people if they are not dirty (they do not have pending updates)
|
8
|
+
# - This contingency wouldn't be necessary if the server worked perfectly.
|
6
9
|
# @param people [Eco::API::Organization::People] the people that needs refresh.
|
7
10
|
# @param include_created [Boolean] include people created during this session? (will check `:create` batch jobs).
|
8
11
|
# @return [Eco::API::Organization::People] the `People` object with the data.
|
9
12
|
def people_refresh(people:, include_created: true)
|
13
|
+
people = people.newFrom people.select do |person|
|
14
|
+
!person.new? || !person.dirty?
|
15
|
+
end
|
10
16
|
ini = people.length
|
11
17
|
if include_created
|
12
18
|
session.job_groups.find_jobs(type: :create).map do |job|
|
13
|
-
|
19
|
+
to_add = job.people.select {|person| !person.dirty?}
|
20
|
+
people = people.merge(to_add)
|
14
21
|
end
|
15
22
|
end
|
16
23
|
|
@@ -12,5 +12,8 @@
|
|
12
12
|
"person_core_edit": [null, "edit"],
|
13
13
|
"person_details": [null, "view", "edit_public", "view_private", "edit_private"],
|
14
14
|
"person_account": [null, "view", "create", "edit"],
|
15
|
-
"person_abilities": [null, "view", "edit"]
|
15
|
+
"person_abilities": [null, "view", "edit"],
|
16
|
+
"visitor_management": [null, "view", "edit", "administrate"],
|
17
|
+
"broadcast_notifications": [null, "view", "administrate"],
|
18
|
+
"cross_register_reporting": [null, "view"]
|
16
19
|
}
|
@@ -8,7 +8,7 @@ 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)
|
11
|
+
ErrorCache = Struct.new(:type, :err, :entry, :response)
|
12
12
|
|
13
13
|
# @param status [Eco::API::Session::Batch::Status] `batch status` this `Errors` object is associated to.
|
14
14
|
def initialize(status:)
|
@@ -46,31 +46,52 @@ module Eco
|
|
46
46
|
|
47
47
|
# @!group Pure errors helper methods
|
48
48
|
|
49
|
+
# @return [Integer] the number of `entries` that got error.
|
50
|
+
def count
|
51
|
+
entries.length
|
52
|
+
end
|
53
|
+
|
49
54
|
# Was there any _Sever_ (reply) **error** as a result of this batch?
|
50
55
|
# @return [Boolean] `true` if any of the queried _entries_ got an unsuccessful `Ecoportal::API::Common::BatchResponse`
|
51
56
|
def any?
|
52
57
|
queue.any? {|query| !status[query].success?}
|
53
58
|
end
|
54
59
|
|
55
|
-
#
|
56
|
-
|
57
|
-
|
60
|
+
# Groups `entries` with error `type`
|
61
|
+
# @return [Hash] where each `key` is a `type` **error** and each value is an `Array` of:
|
62
|
+
# 1. `entries` that got that error, if `only_entries` is `true`
|
63
|
+
# 2. `ErrorCache` objects, if `only_entries` is `false`
|
64
|
+
def by_type(only_entries: true)
|
65
|
+
errors.group_by do |e|
|
66
|
+
e.type
|
67
|
+
end.transform_values do |arr|
|
68
|
+
if only_entries
|
69
|
+
arr.map {|e| e.entry}
|
70
|
+
else
|
71
|
+
arr
|
72
|
+
end
|
73
|
+
end
|
58
74
|
end
|
75
|
+
# @!endgroup
|
59
76
|
|
60
|
-
# For all the `entries` with errors generates
|
61
|
-
# @return [Array<
|
62
|
-
# 1.
|
63
|
-
# 2.
|
64
|
-
# 3.
|
77
|
+
# For all the `entries` with errors generates an `Array` of `ErrorCache` objects
|
78
|
+
# @return [Array<Eco::API::Session::Batch::Errors::ErrorCache>] where each `object` has
|
79
|
+
# 1. `type` -> the error type `Class`
|
80
|
+
# 2. `err` -> an instance object of that error `class` type
|
81
|
+
# 3. `entry` -> the entry that generated the error
|
82
|
+
# 4. `response` -> the original response from the server that carries the error
|
65
83
|
def errors
|
66
84
|
entries.each_with_object([]) do |entry, arr|
|
67
|
-
|
68
|
-
|
85
|
+
response = status[entry]
|
86
|
+
if body = response.body
|
87
|
+
if errs = body["errors"] || body["error"]
|
88
|
+
errs = [errs].flatten(1).compact
|
69
89
|
errs.each do |msg|
|
70
90
|
arr.push(ErrorCache.new(
|
71
91
|
klass = Eco::API::Error.get_type(msg),
|
72
92
|
klass.new(err_msg: msg, entry: entry, session: session),
|
73
|
-
entry
|
93
|
+
entry,
|
94
|
+
response
|
74
95
|
))
|
75
96
|
end
|
76
97
|
end
|
@@ -78,18 +99,6 @@ module Eco
|
|
78
99
|
end
|
79
100
|
end
|
80
101
|
|
81
|
-
# Groups `entries` with error `type`
|
82
|
-
# @return [Hash] where each `key` is a `type` **error** and each value is
|
83
|
-
# an `Array` of `entries` that got that error
|
84
|
-
def by_type
|
85
|
-
errors.group_by do |e|
|
86
|
-
e.type
|
87
|
-
end.transform_values do |arr|
|
88
|
-
arr.map {|e| e.entry}
|
89
|
-
end
|
90
|
-
end
|
91
|
-
# @!endgroup
|
92
|
-
|
93
102
|
# @!group Messaging methods
|
94
103
|
|
95
104
|
def message
|
@@ -112,8 +121,7 @@ module Eco
|
|
112
121
|
# @!endgroup
|
113
122
|
|
114
123
|
def person_ref(entry)
|
115
|
-
|
116
|
-
"#{row_str}(id: '#{get_attr(entry, :id)}') '#{get_attr(entry, :name)}' ('#{get_attr(entry, :external_id)}': '#{get_attr(entry, :email)}')"
|
124
|
+
Eco::API::Session::Batch::Feedback.person_ref(entry)
|
117
125
|
end
|
118
126
|
|
119
127
|
private
|
@@ -142,20 +150,11 @@ module Eco
|
|
142
150
|
end
|
143
151
|
|
144
152
|
def get_attr(entry, attr)
|
145
|
-
|
146
|
-
entry.public_send(attr.to_sym)
|
147
|
-
elsif entry.is_a?(Hash)
|
148
|
-
entry["#{attr}"]
|
149
|
-
end
|
153
|
+
Eco::API::Session::Batch::Feedback.get_attr(entry, attr)
|
150
154
|
end
|
151
155
|
|
152
156
|
def get_row(value)
|
153
|
-
|
154
|
-
when Eco::API::Common::People::PersonEntry
|
155
|
-
value.idx
|
156
|
-
when Ecoportal::API::V1::Person
|
157
|
-
get_row(value.entry)
|
158
|
-
end
|
157
|
+
Eco::API::Session::Batch::Feedback.get_row(value)
|
159
158
|
end
|
160
159
|
|
161
160
|
# Sorts the entries that got server error by error `type` and generates the error messages.
|
@@ -5,6 +5,30 @@ module Eco
|
|
5
5
|
# @attr_reader job [Eco::API::Session::Batch::Job] `batch job` the feedback is associated with
|
6
6
|
class Feedback
|
7
7
|
|
8
|
+
class << self
|
9
|
+
def person_ref(entry)
|
10
|
+
row_str = (row = get_row(entry)) ? "(row: #{row}) " : nil
|
11
|
+
"#{row_str}(id: '#{get_attr(entry, :id)}') '#{get_attr(entry, :name)}' ('#{get_attr(entry, :external_id)}': '#{get_attr(entry, :email)}')"
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_attr(entry, attr)
|
15
|
+
if entry.respond_to?(attr.to_sym)
|
16
|
+
entry.public_send(attr.to_sym)
|
17
|
+
elsif entry.is_a?(Hash)
|
18
|
+
entry["#{attr}"]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_row(value)
|
23
|
+
case value
|
24
|
+
when Eco::API::Common::People::PersonEntry
|
25
|
+
value.idx
|
26
|
+
when Ecoportal::API::V1::Person
|
27
|
+
get_row(value.entry)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
8
32
|
attr_reader :job
|
9
33
|
|
10
34
|
# @param job [Eco::API::Session::Batch::Job] `batch job` the feedback is associated with
|
@@ -235,9 +235,23 @@ module Eco
|
|
235
235
|
end
|
236
236
|
end
|
237
237
|
|
238
|
+
# Method to generate the base of people that will be present in the queue
|
239
|
+
# @note
|
240
|
+
# - If the entry is a new person, we are not in a creation job and the person doesn't have `id`
|
241
|
+
# it means that it failed to be created (it doesn't exist on server-side).
|
242
|
+
# The entry won't be included.
|
243
|
+
# - The contingency above wouldn't be necessary if the server worked perfectly.
|
238
244
|
def processed_queue
|
239
|
-
@queue.
|
240
|
-
|
245
|
+
pre_filtered = @queue.select do |entry|
|
246
|
+
if unexisting = entry.new? && !entry.id && type != :create
|
247
|
+
ref = Eco::API::Session::Batch::Feedback.person_ref(entry)
|
248
|
+
msg = "Job ('#{name}':#{type}): excluded unexisting entry (failed creation): #{ref}"
|
249
|
+
session.logger.warn(msg)
|
250
|
+
end
|
251
|
+
!unexisting
|
252
|
+
end
|
253
|
+
pre_filtered.each {|e| @callbacks[e].call(e) if @callbacks.key?(e) }
|
254
|
+
apply_policies(api_included(pre_filtered)).select do |e|
|
241
255
|
!as_update(e).empty?
|
242
256
|
end.select do |e|
|
243
257
|
next true unless e.is_a?(Ecoportal::API::V1::Person)
|
@@ -343,7 +357,8 @@ module Eco
|
|
343
357
|
def backup_update(requests, simulate: false)
|
344
358
|
dry_run = simulate ? "_dry_run" : ""
|
345
359
|
dir = config.people.requests_folder
|
346
|
-
|
360
|
+
filename = name.split(" ").join("-").gsub(/[=\\\/><,"-]+/,"_")
|
361
|
+
file = File.join(dir, "#{type}_data_#{filename}#{dry_run}.json")
|
347
362
|
file_manager.save_json(requests, file, :timestamp)
|
348
363
|
end
|
349
364
|
|
@@ -185,6 +185,7 @@ module Eco
|
|
185
185
|
# - it will **not** run the `callback` for `on` defined during the configuration time
|
186
186
|
# - it will rather `yield` the target stage after all the `before` _callbacks_ have been run
|
187
187
|
# - aside of this, the rest will be the same as when the _block_ is provided (see previous note)
|
188
|
+
# @raise [ArgumentError] if the object returned by `before` and `after` callbacks is not an `Eco::API::UseCases::BaseIO`.
|
188
189
|
# @param key [Symbol, nil] cases:
|
189
190
|
# - if `key` is not provided, it targets the _current stage_
|
190
191
|
# - if `key` is provided, it targets the specific _sub-stage_
|
@@ -200,7 +201,16 @@ module Eco
|
|
200
201
|
if key
|
201
202
|
io = stage(key).run(io: io, &block)
|
202
203
|
elsif pending?
|
203
|
-
@before.each
|
204
|
+
@before.each do |c|
|
205
|
+
io = c.call(self, io).tap do |i_o|
|
206
|
+
unless i_o.is_a?(Eco::API::UseCases::BaseIO)
|
207
|
+
msg = "Workflow callaback before('#{name}') should return Eco::API::UseCases::BaseIO object."
|
208
|
+
msg += " Given #{i_o.class}"
|
209
|
+
msg += " • Callback source location: '#{c.source_location}'"
|
210
|
+
raise ArgumentError.new(msg)
|
211
|
+
end
|
212
|
+
end
|
213
|
+
end
|
204
214
|
|
205
215
|
unless skip?
|
206
216
|
io.session.logger.debug("(Workflow: #{path}) running now")
|
@@ -218,7 +228,16 @@ module Eco
|
|
218
228
|
@pending = false
|
219
229
|
end
|
220
230
|
|
221
|
-
@after.each
|
231
|
+
@after.each do |c|
|
232
|
+
io = c.call(self, io).tap do |i_o|
|
233
|
+
unless i_o.is_a?(Eco::API::UseCases::BaseIO)
|
234
|
+
msg = "Workflow callaback after('#{name}') should return Eco::API::UseCases::BaseIO object."
|
235
|
+
msg += " Given #{i_o.class}"
|
236
|
+
msg += " • Callback source location: '#{c.source_location}'"
|
237
|
+
raise ArgumentError.new(msg)
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
222
241
|
end
|
223
242
|
rescue SystemExit
|
224
243
|
exit
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class Eco::API::UseCases::DefaultCases::EntriesToCsv < Eco::API::Common::Loaders::UseCase
|
2
|
+
name "entries-to-csv"
|
3
|
+
type :import
|
4
|
+
|
5
|
+
attr_reader :session, :options
|
6
|
+
|
7
|
+
def main(entries, session, options, usecase)
|
8
|
+
@options = options
|
9
|
+
@session = session
|
10
|
+
entries.export(filename)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def filename
|
16
|
+
options.dig(:export, :file) || "entries.csv"
|
17
|
+
end
|
18
|
+
end
|
@@ -24,6 +24,7 @@ require_relative 'default_cases/email_as_id_case'
|
|
24
24
|
require_relative 'default_cases/hris_case'
|
25
25
|
require_relative 'default_cases/new_id_case'
|
26
26
|
require_relative 'default_cases/new_email_case'
|
27
|
+
require_relative 'default_cases/entries_to_csv_case'
|
27
28
|
require_relative 'default_cases/org_data_convert_case'
|
28
29
|
require_relative 'default_cases/refresh_case'
|
29
30
|
require_relative 'default_cases/reinvite_trans_case'
|
@@ -26,6 +26,48 @@ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders:
|
|
26
26
|
update_ooze(ooze)
|
27
27
|
end
|
28
28
|
|
29
|
+
protected
|
30
|
+
|
31
|
+
def add_field(name, type, section, after: nil, before: nil, side: :left)
|
32
|
+
unless section.is_a?(Ecoportal::API::V2::Page::Section)
|
33
|
+
raise "You need to specify a section for a new field. Given: #{section.class}"
|
34
|
+
end
|
35
|
+
target.components.add(label: name, type: type) do |field|
|
36
|
+
section.add_component(field, after: after, before: before, side: side)
|
37
|
+
end.tap do |field|
|
38
|
+
yield(field) if block_given?
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def with_fields(type: nil, label: nil)
|
43
|
+
flds = target.components
|
44
|
+
flds = flds.get_by_type(type) if type
|
45
|
+
flds = flds.select do |fld|
|
46
|
+
value = (label == :unnamed) ? nil : label
|
47
|
+
!label || same_string?(fld.label, value)
|
48
|
+
end.each do |field|
|
49
|
+
yield(field) if block_given?
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def with_sections(type: nil, heading: nil)
|
54
|
+
secs = target.sections
|
55
|
+
secs = secs.get_by_type(type) if type
|
56
|
+
secs = secs.select do |sec|
|
57
|
+
value = (heading == :unnamed) ? nil : heading
|
58
|
+
!heading || same_string?(sec.heading, value)
|
59
|
+
end.each do |sec|
|
60
|
+
yield(sec) if block_given?
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def with_stage(name:)
|
65
|
+
if stage = target.stages.get_by_name(name)
|
66
|
+
yield(stage) if block_given?
|
67
|
+
end
|
68
|
+
stage
|
69
|
+
end
|
70
|
+
|
29
71
|
private
|
30
72
|
|
31
73
|
# Hook method to use before the target is switched
|
@@ -70,6 +112,11 @@ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders:
|
|
70
112
|
def update_ooze(ooze = target)
|
71
113
|
if !options[:simulate]
|
72
114
|
return unless dirty?(ooze)
|
115
|
+
|
116
|
+
ooze.validate.tap do |validation|
|
117
|
+
raise validation if validation.is_a?(String)
|
118
|
+
end
|
119
|
+
|
73
120
|
apiv2.pages.update(ooze).tap do |response|
|
74
121
|
if response.success?
|
75
122
|
ooze.consolidate!
|
@@ -4,44 +4,6 @@ class Eco::API::UseCases::OozeSamples::OozeUpdateCase < Eco::API::UseCases::Ooze
|
|
4
4
|
|
5
5
|
private
|
6
6
|
|
7
|
-
def with_fields(type: nil, label: nil)
|
8
|
-
flds = target.components
|
9
|
-
flds = flds.get_by_type(type) if type
|
10
|
-
flds = flds.select do |fld|
|
11
|
-
value = (label == :unnamed) ? nil : label
|
12
|
-
!label || same_string?(fld.label, value)
|
13
|
-
end.each do |field|
|
14
|
-
yield(field) if block_given?
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def with_sections(type: nil, heading: nil)
|
19
|
-
secs = target.sections
|
20
|
-
secs = secs.get_by_type(type) if type
|
21
|
-
secs = secs.select do |sec|
|
22
|
-
value = (heading == :unnamed) ? nil : heading
|
23
|
-
!heading || same_string?(sec.heading, value)
|
24
|
-
end.each do |sec|
|
25
|
-
yield(sec) if block_given?
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def with_stage(name:)
|
30
|
-
if stage = target.stages.get_by_name(name)
|
31
|
-
yield(stage) if block_given?
|
32
|
-
end
|
33
|
-
stage
|
34
|
-
end
|
35
|
-
|
36
|
-
def add_field(name, type, section, after: nil, side: :left)
|
37
|
-
raise "You need to specify a section for a new field. Given: #{section.class}" unless section.is_a?(Ecoportal::API::V2::Page::Section)
|
38
|
-
target.components.add(label: name, type: type) do |field|
|
39
|
-
section.add_component(field, after: after, side: side)
|
40
|
-
end.tap do |field|
|
41
|
-
yield(field) if block_given?
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
7
|
def to_field(value)
|
46
8
|
fld = nil
|
47
9
|
fld ||= value if value.is_a?(Ecoportal::API::V2::Page::Component)
|
@@ -50,5 +12,4 @@ class Eco::API::UseCases::OozeSamples::OozeUpdateCase < Eco::API::UseCases::Ooze
|
|
50
12
|
#fld ||= value.reference if value.is_a?(Ecoportal::API::V2::Page::Force::Binding)
|
51
13
|
end
|
52
14
|
|
53
|
-
|
54
15
|
end
|
@@ -129,7 +129,7 @@ class Eco::API::UseCases::OozeSamples::RegisterUpdateCase < Eco::API::UseCases::
|
|
129
129
|
apiv2.registers.search(register_id, search_options.merge(only_first: true)).tap do |search_results|
|
130
130
|
str_results = "Total target entries: #{search_results.total} (out of #{search_results.total_before_filtering})"
|
131
131
|
session.prompt_user("Do you want to proceed (y/N):", explanation: str_results, default: "N", timeout: 10) do |res|
|
132
|
-
|
132
|
+
unless res.upcase.start_with?("Y")
|
133
133
|
puts "..."
|
134
134
|
logger.info "Aborting script..."
|
135
135
|
exit(0)
|
@@ -142,7 +142,7 @@ class Eco::API::UseCases::OozeSamples::RegisterUpdateCase < Eco::API::UseCases::
|
|
142
142
|
@search_options ||= {}.tap do |opts|
|
143
143
|
opts.merge!(sort: "created_at")
|
144
144
|
opts.merge!(dir: "asc")
|
145
|
-
opts.merge!(query:
|
145
|
+
opts.merge!(query: conf_search) if conf_search
|
146
146
|
opts.merge!(filters: conf_filters)
|
147
147
|
end
|
148
148
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# Use case to update a target oozes
|
2
|
+
# @note
|
3
|
+
# - `target_ids` => Expects options[:source][:file] where at least the 1st column should be the target entry `ids`
|
4
|
+
class Eco::API::UseCases::OozeSamples::TargetOozesUpdateCase < Eco::API::UseCases::OozeSamples::RegisterUpdateCase
|
5
|
+
name "target-oozes-update-case"
|
6
|
+
type :other
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def with_each_entry
|
11
|
+
batched_target_ids do |ids|
|
12
|
+
ids.each do |id|
|
13
|
+
if pending = queue_shift(id)
|
14
|
+
if dirty?(pending)
|
15
|
+
msg = "Same entry 'id' appears more than once. "
|
16
|
+
msg << "Launching update on '#{object_reference(pending)}' to be able to queue it back"
|
17
|
+
console.warn msg
|
18
|
+
update_ooze(pending)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
if ooz = ooze(id)
|
22
|
+
yield(ooz)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
update_oozes
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def batched_target_ids
|
30
|
+
raise "Missing block. It yields in slices of #{self.class.batch_size} ids" unless block_given?
|
31
|
+
target_ids_preview
|
32
|
+
pool = []
|
33
|
+
target_ids.each do |id|
|
34
|
+
pool << id
|
35
|
+
if pool.length >= self.class.batch_size
|
36
|
+
yield(pool)
|
37
|
+
pool = []
|
38
|
+
end
|
39
|
+
end
|
40
|
+
yield(pool) unless pool.empty?
|
41
|
+
end
|
42
|
+
|
43
|
+
def target_ids_preview
|
44
|
+
dups = target_ids.select {|id| target_ids.count(id) > 1}
|
45
|
+
dups_str = dups.count > 0 ? "There are #{dups.count} duplicated ids" : "No duplicates detected"
|
46
|
+
msg = "Total target entries: #{target_ids.count} (#{dups_str})"
|
47
|
+
session.prompt_user("Do you want to proceed (y/N):", explanation: msg, default: "N", timeout: 10) do |res|
|
48
|
+
unless res.upcase.start_with?("Y")
|
49
|
+
puts "..."
|
50
|
+
logger.info "Aborting script..."
|
51
|
+
exit(0)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def target_ids
|
57
|
+
@target_ids ||= input_csv.columns.first[1..-1]
|
58
|
+
end
|
59
|
+
|
60
|
+
def input_csv
|
61
|
+
@input_csv ||= Eco::CSV.read(options.dig(:source, :file))
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -14,3 +14,4 @@ require_relative 'ooze_samples/ooze_run_base_case'
|
|
14
14
|
require_relative 'ooze_samples/ooze_update_case'
|
15
15
|
require_relative 'ooze_samples/ooze_from_doc_case'
|
16
16
|
require_relative 'ooze_samples/register_update_case'
|
17
|
+
require_relative 'ooze_samples/target_oozes_update_case'
|
@@ -96,6 +96,13 @@ ASSETS.cli.config do |cnf|
|
|
96
96
|
})
|
97
97
|
end
|
98
98
|
|
99
|
+
desc = "Used to export to a csv the final people (after processing). "
|
100
|
+
desc += "It is useful analyse the data after a -dry-run (-simulate)."
|
101
|
+
options_set.add("-processed-people-to-csv", desc) do |options, session|
|
102
|
+
file = SCR.get_file("-processed-people-to-csv", required: true, should_exist: false)
|
103
|
+
options.deep_merge!(report: {people: {csv: file}})
|
104
|
+
end
|
105
|
+
|
99
106
|
desc = "Runs in dry-run (no requests sent to server)"
|
100
107
|
options_set.add(["-dry-run", "-simulate"], desc) do |options, session|
|
101
108
|
options[:dry_run] = true
|
@@ -137,6 +137,13 @@ ASSETS.cli.config do |cnf|
|
|
137
137
|
end
|
138
138
|
end
|
139
139
|
|
140
|
+
desc = "Input file dump into a CSV as is."
|
141
|
+
cases.add("-entries-to-csv", :import, desc, case_name: "entries-to-csv")
|
142
|
+
.add_option("-out") do |options|
|
143
|
+
file = SCR.get_file("-out")
|
144
|
+
options.deep_merge(export: {file: file})
|
145
|
+
end
|
146
|
+
|
140
147
|
desc = "Usage '-org-data-convert backup.json -restore-db-from'."
|
141
148
|
desc += " Transforms an input .json file to the values of the destination environment "
|
142
149
|
desc += " (names missmatch won't solve: i.e. usergroups)"
|
@@ -196,7 +203,7 @@ ASSETS.cli.config do |cnf|
|
|
196
203
|
.add_option("-append-starters", as1) do |options|
|
197
204
|
options.deep_merge!(people: {append_created: true})
|
198
205
|
end
|
199
|
-
|
206
|
+
|
200
207
|
desc = "Creates people with only details"
|
201
208
|
cases.add("-create-details-from", :sync, desc, case_name: "create-details")
|
202
209
|
.add_option("-append-starters", as1) do |options|
|
@@ -101,19 +101,26 @@ ASSETS.cli.config do |config|
|
|
101
101
|
get_people = io.options.dig(:people, :get)
|
102
102
|
partial_update = get_people && get_people.dig(:type) == :partial
|
103
103
|
run_it = !io.options[:dry_run] || io.options.dig(:post_launch, :run)
|
104
|
-
|
105
|
-
|
104
|
+
refresh_data = !io.options[:dry_run] && partial_update
|
105
|
+
if run_it
|
106
|
+
if refresh_data
|
106
107
|
# get target people afresh
|
107
108
|
people = io.session.micro.people_refresh(people: io.people, include_created: true)
|
108
109
|
io = io.base.new(people: people)
|
110
|
+
else
|
111
|
+
msg = "Although there are post_launch cases, data will not be refreshed before their run"
|
112
|
+
if io.options[:dry_run]
|
113
|
+
msg += ", because we are in dry-run (simulate)."
|
114
|
+
elsif !partial_update
|
115
|
+
msg += ", because it is not a partial update (-get-partial option not present)."
|
116
|
+
end
|
117
|
+
io.session.logger.warn(msg)
|
109
118
|
end
|
110
119
|
else
|
111
120
|
wf_post.skip!
|
112
121
|
msg = "Although there are post_launch cases, they will NOT be RUN"
|
113
122
|
if io.options[:dry_run]
|
114
123
|
msg+= ", because we are in dry-run (simulate)."
|
115
|
-
elsif !partial_update
|
116
|
-
msg+= ", because it is not a partial update (-get-partial)"
|
117
124
|
end
|
118
125
|
io.session.logger.info(msg)
|
119
126
|
end
|
@@ -125,7 +132,15 @@ ASSETS.cli.config do |config|
|
|
125
132
|
|
126
133
|
wf_post.on(:usecases) do |wf_postcases, io|
|
127
134
|
io.session.post_launch.each do |use|
|
128
|
-
|
135
|
+
begin
|
136
|
+
io = use.launch(io: io).base
|
137
|
+
rescue Eco::API::UseCases::BaseIO::MissingParameter => e
|
138
|
+
if e.required == :people
|
139
|
+
io.session.logger.debug("Skipping use case '#{use.name}' -- no base people detected for the current run")
|
140
|
+
else
|
141
|
+
raise
|
142
|
+
end
|
143
|
+
end
|
129
144
|
end
|
130
145
|
io
|
131
146
|
end
|
@@ -137,8 +152,13 @@ ASSETS.cli.config do |config|
|
|
137
152
|
end
|
138
153
|
|
139
154
|
wf.on(:report) do |wf_report, io|
|
140
|
-
|
141
|
-
|
155
|
+
if file = io.options.dig(:report, :people, :csv)
|
156
|
+
io.options.deep_merge!(export: {
|
157
|
+
options: {internal_names: true, nice_header: true, split_schemas: true},
|
158
|
+
file: {name: file, format: :csv}
|
159
|
+
})
|
160
|
+
io = io.session.process_case("to-csv", io: io, type: :export)
|
161
|
+
end
|
142
162
|
io
|
143
163
|
end
|
144
164
|
|
data/lib/eco/csv/table.rb
CHANGED
@@ -15,6 +15,7 @@ module Eco
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
+
# It allows to rename the header names
|
18
19
|
# @return [Eco::CSV::Table]
|
19
20
|
def transform_headers
|
20
21
|
header = self.headers
|
@@ -25,6 +26,8 @@ module Eco
|
|
25
26
|
columns_to_table(cols)
|
26
27
|
end
|
27
28
|
|
29
|
+
# When there are headers with the same name, it merges those columns
|
30
|
+
# @note it also offers a way to resolve merge conflicts
|
28
31
|
# @return [Eco::CSV::Table]
|
29
32
|
def merge_same_header_names
|
30
33
|
dups = self.duplicated_header_names
|
data/lib/eco/version.rb
CHANGED
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.
|
4
|
+
version: 2.0.42
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oscar Segura
|
@@ -136,7 +136,7 @@ dependencies:
|
|
136
136
|
requirements:
|
137
137
|
- - ">="
|
138
138
|
- !ruby/object:Gem::Version
|
139
|
-
version: 0.8.
|
139
|
+
version: 0.8.19
|
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.
|
149
|
+
version: 0.8.19
|
150
150
|
- - "<"
|
151
151
|
- !ruby/object:Gem::Version
|
152
152
|
version: '0.9'
|
@@ -533,6 +533,7 @@ files:
|
|
533
533
|
- lib/eco/api/usecases/default_cases/delete_sync_case.rb
|
534
534
|
- lib/eco/api/usecases/default_cases/delete_trans_case.rb
|
535
535
|
- lib/eco/api/usecases/default_cases/email_as_id_case.rb
|
536
|
+
- lib/eco/api/usecases/default_cases/entries_to_csv_case.rb
|
536
537
|
- lib/eco/api/usecases/default_cases/hris_case.rb
|
537
538
|
- lib/eco/api/usecases/default_cases/new_email_case.rb
|
538
539
|
- lib/eco/api/usecases/default_cases/new_id_case.rb
|
@@ -564,6 +565,7 @@ files:
|
|
564
565
|
- lib/eco/api/usecases/ooze_samples/ooze_run_base_case.rb
|
565
566
|
- lib/eco/api/usecases/ooze_samples/ooze_update_case.rb
|
566
567
|
- lib/eco/api/usecases/ooze_samples/register_update_case.rb
|
568
|
+
- lib/eco/api/usecases/ooze_samples/target_oozes_update_case.rb
|
567
569
|
- lib/eco/api/usecases/use_case.rb
|
568
570
|
- lib/eco/api/usecases/use_case_chain.rb
|
569
571
|
- lib/eco/api/usecases/use_case_io.rb
|