eco-helpers 2.0.46 → 2.0.50
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 +4 -4
- data/CHANGELOG.md +48 -1
- data/eco-helpers.gemspec +1 -1
- data/lib/eco/api/common/people/entry_factory.rb +17 -1
- data/lib/eco/api/common/session/s3_uploader.rb +4 -2
- data/lib/eco/api/session/batch/jobs.rb +9 -1
- data/lib/eco/api/session/batch/jobs_groups.rb +7 -2
- data/lib/eco/api/session/batch/request_stats.rb +50 -34
- data/lib/eco/api/session/config.rb +12 -0
- data/lib/eco/api/usecases/default_cases/clean_unknown_tags_case.rb +37 -1
- data/lib/eco/api/usecases/default_cases/create_tag_paths_case.rb +25 -0
- data/lib/eco/api/usecases/default_cases/reinvite_trans_case.rb +13 -4
- data/lib/eco/api/usecases/default_cases/samples/sftp_case.rb +109 -0
- data/lib/eco/api/usecases/default_cases/samples.rb +12 -0
- data/lib/eco/api/usecases/default_cases.rb +2 -0
- data/lib/eco/cli/config/default/usecases.rb +12 -0
- data/lib/eco/cli/config/default/workflow.rb +1 -1
- data/lib/eco/version.rb +1 -1
- metadata +6 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 9c8f3ba10e4524d33de8f1339a48fa9c48c86a7e1b0650e29710d05083b6ed82
|
|
4
|
+
data.tar.gz: f68a0adda4ccebff9552e652bc47bc25cbc72129fe025e5c31b9c542b83ed9f3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 215c64f98db5f29daad59fad9b4f559e0c7e2a136671d87ab9e37a6e2403cafb123948fbb8cd852ddb3155f35e4b52545d9d948df638402f7c3a63797a397690
|
|
7
|
+
data.tar.gz: 8a6119977b69ef6aa699ed718142d377866c1c5f379027b9b5713655525f578f837cf543df70be3dbeee1868cd6328f12ee782b1ba743f1aa87ce4cc592bc2cb
|
data/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,53 @@
|
|
|
1
1
|
# Change Log
|
|
2
2
|
All notable changes to this project will be documented in this file.
|
|
3
3
|
|
|
4
|
+
## [2.0.50] - 2022-02-xx
|
|
5
|
+
|
|
6
|
+
### Added
|
|
7
|
+
- Ability to configure delay between jobs and job groups
|
|
8
|
+
- `Eco::API::Session::Batch::Jobs`, `#delay_between_jobs`
|
|
9
|
+
- `Eco::API::Session::Batch::JobsGroups`, `#delay_between_groups`
|
|
10
|
+
- `Eco::API::Session::Config`, added methods `#delay_between_jobs` and `#delay_between_job_groups`
|
|
11
|
+
- New use case `Eco::API::UseCases::DefaultCases::TagPaths` to create a `csv` with all `tag` paths
|
|
12
|
+
- Its purpose is to ease the build of tag remaps
|
|
13
|
+
- Ideally, after remapping the tags of an org, you would want to fix the tag paths based on the current tagtree
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- `workflow`, when no operation specified it logs as `info`, rather than `warn`
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
## [2.0.49] - 2022-02-14
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
- `Eco::API::Session::Batch::RequestStats#message` now it shows which details have changed
|
|
24
|
+
- `Eco::API::UseCases::DefaultCases::ReinviteTransCase` the option `-force` will also send an invite to users that have accepted the invitation
|
|
25
|
+
|
|
26
|
+
## [2.0.48] - 2022-02-04
|
|
27
|
+
|
|
28
|
+
### Changed
|
|
29
|
+
- upgraded `ecoportal-api-v2` dependency
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
- `Eco::API::Common::People::EntryFactory#get_file_content`
|
|
33
|
+
- Call to `String#scrub` to prevent _invalid byte sequence_ error by replacing those characters by their coding identifier
|
|
34
|
+
- This has been implemented with a max tolerance of 5 byte sequence errors
|
|
35
|
+
- Errors are logged (although could not get to identify the line :/)
|
|
36
|
+
|
|
37
|
+
## [2.0.47] - 2022-02-03
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
- `Eco::API::UseCases::DefaultCases::CleanUnknownTags`
|
|
41
|
+
- It is possible to extend or override `register_tags`
|
|
42
|
+
- New command option `-include-register-tags` (will not ignore register tags; they will be removed too)
|
|
43
|
+
- `Eco::API::UseCases::DefaultCases::Samples::Sftp`
|
|
44
|
+
- Default sample case to list, get and archive SFTP remote files
|
|
45
|
+
### Changed
|
|
46
|
+
- upgraded `ecoportal-api-v2` dependency
|
|
47
|
+
|
|
48
|
+
### Fixed
|
|
49
|
+
- `Eco::API::Common::Session::S3Uploader#upload_file`: check if file exists before opening.
|
|
50
|
+
|
|
4
51
|
## [2.0.46] - 2021-12-24
|
|
5
52
|
|
|
6
53
|
### Added
|
|
@@ -9,7 +56,7 @@ All notable changes to this project will be documented in this file.
|
|
|
9
56
|
- added also counter of failed to retrieve oozes
|
|
10
57
|
- added also counter of double ups in search pagination
|
|
11
58
|
- counter for updated pages and pages that failed update
|
|
12
|
-
- `Eco::API::Session#enviro_name`: to identify in
|
|
59
|
+
- `Eco::API::Session#enviro_name`: to identify in which environment we are running
|
|
13
60
|
|
|
14
61
|
### Changed
|
|
15
62
|
- upgraded `ecoportal-api-v2` dependency
|
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.4', '< 0.9'
|
|
34
|
-
spec.add_dependency 'ecoportal-api-v2', '>= 0.8.
|
|
34
|
+
spec.add_dependency 'ecoportal-api-v2', '>= 0.8.25', '< 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'
|
|
@@ -196,7 +196,23 @@ module Eco
|
|
|
196
196
|
ext = File.extname(file)
|
|
197
197
|
encoding ||= Eco::API::Common::Session::FileManager.encoding(file)
|
|
198
198
|
encoding = (encoding != "utf-8")? "#{encoding}|utf-8": encoding
|
|
199
|
-
|
|
199
|
+
read_with_tolerance(file, encoding: encoding)
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def read_with_tolerance(file, encoding:)
|
|
203
|
+
if content = File.read(file, encoding: encoding)
|
|
204
|
+
tolerance = 5
|
|
205
|
+
content.scrub do |bytes|
|
|
206
|
+
replacement = '<' + bytes.unpack('H*')[0] + '>'
|
|
207
|
+
if tolerance <= 0
|
|
208
|
+
logger.error("There were more than 5 encoding errors in the file '#{file}'.")
|
|
209
|
+
return content
|
|
210
|
+
else
|
|
211
|
+
logger.error("Encoding problem in file '#{file}': '#{replacement}'.")
|
|
212
|
+
replacement
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
end
|
|
200
216
|
end
|
|
201
217
|
|
|
202
218
|
def fatal(msg)
|
|
@@ -32,8 +32,10 @@ module Eco
|
|
|
32
32
|
# @param path [String] the target file to be uploaded
|
|
33
33
|
# @return [String] S3 path to the uploaded `path` file
|
|
34
34
|
def upload_file(path)
|
|
35
|
-
File.
|
|
36
|
-
|
|
35
|
+
if File.exist?(path)
|
|
36
|
+
File.open(path, "rb") do |f|
|
|
37
|
+
upload(File.basename(path), f)
|
|
38
|
+
end
|
|
37
39
|
end
|
|
38
40
|
end
|
|
39
41
|
|
|
@@ -3,6 +3,8 @@ module Eco
|
|
|
3
3
|
class Session
|
|
4
4
|
class Batch
|
|
5
5
|
class Jobs < API::Common::Session::BaseSession
|
|
6
|
+
DELAY_BETWEEN_JOBS = 0.3
|
|
7
|
+
|
|
6
8
|
include Enumerable
|
|
7
9
|
attr_reader :name
|
|
8
10
|
|
|
@@ -87,11 +89,12 @@ module Eco
|
|
|
87
89
|
# - if there was post-launch callback for a `Batch::Job`, it calls it.
|
|
88
90
|
# @return [Hash<Eco::API::Session::Batch::Job, Eco::API::Session::Batch::Status>]
|
|
89
91
|
def launch(simulate: false)
|
|
90
|
-
|
|
92
|
+
each_with_index do |job, idx|
|
|
91
93
|
if job.pending?
|
|
92
94
|
status[job] = job_status = job.launch(simulate: simulate)
|
|
93
95
|
callback = @callbacks[job]
|
|
94
96
|
callback.call(job, job_status) if callback
|
|
97
|
+
Eco::API::Session::Batch::JobsGroups.counter(delay_between_jobs) if !simulate && idx < self.length - 1
|
|
95
98
|
end
|
|
96
99
|
end
|
|
97
100
|
launch(simulate: simulate) if pending?
|
|
@@ -125,6 +128,11 @@ module Eco
|
|
|
125
128
|
end.join("\n")
|
|
126
129
|
end
|
|
127
130
|
|
|
131
|
+
private
|
|
132
|
+
|
|
133
|
+
def delay_between_jobs
|
|
134
|
+
config.delay_between_jobs || DELAY_BETWEEN_JOBS
|
|
135
|
+
end
|
|
128
136
|
end
|
|
129
137
|
end
|
|
130
138
|
end
|
|
@@ -93,10 +93,10 @@ module Eco
|
|
|
93
93
|
status[group] = group_status = group.launch(simulate: simulate)
|
|
94
94
|
callback = @callbacks[group]
|
|
95
95
|
callback.call(group, group_status) if callback
|
|
96
|
-
self.class.counter(
|
|
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
|
+
launch(simulate: simulate) if pending?
|
|
100
100
|
return status
|
|
101
101
|
end
|
|
102
102
|
|
|
@@ -127,6 +127,11 @@ module Eco
|
|
|
127
127
|
end.join("\n")
|
|
128
128
|
end
|
|
129
129
|
|
|
130
|
+
private
|
|
131
|
+
|
|
132
|
+
def delay_between_groups
|
|
133
|
+
config.delay_between_job_groups || DELAY_BETWEEN_GROUPS
|
|
134
|
+
end
|
|
130
135
|
end
|
|
131
136
|
end
|
|
132
137
|
end
|
|
@@ -9,6 +9,7 @@ module Eco
|
|
|
9
9
|
ACCOUNT_ATTRS = (Eco::API::Common::People::PersonParser::ACCOUNT_ATTRS + ["permissions_custom"]).uniq
|
|
10
10
|
DETAILS_ATTRS = ["fields"]
|
|
11
11
|
BLANKED_PREFIX = "blanked_"
|
|
12
|
+
DETAILS_FIELDS = "details_fields"
|
|
12
13
|
|
|
13
14
|
class << self
|
|
14
15
|
|
|
@@ -74,44 +75,43 @@ module Eco
|
|
|
74
75
|
end
|
|
75
76
|
|
|
76
77
|
def message(percent: false)
|
|
77
|
-
key_val_delimiter = ": "; attr_delimiter = " ++ "
|
|
78
|
-
pairs_to_line = Proc.new do |pairs|
|
|
79
|
-
pairs.map do |p|
|
|
80
|
-
[p.first.to_s, "#{p.last.to_s}" + (percent ? "%" : "")].join(key_val_delimiter)
|
|
81
|
-
end.join(attr_delimiter)
|
|
82
|
-
end
|
|
83
|
-
|
|
84
78
|
lines = []
|
|
85
|
-
lines << pairs_to_line
|
|
86
|
-
lines << pairs_to_line
|
|
87
|
-
lines << pairs_to_line
|
|
79
|
+
lines << pairs_to_line(core_pairs(percent: percent))
|
|
80
|
+
lines << pairs_to_line(account_pairs(percent: percent))
|
|
81
|
+
lines << pairs_to_line(details_pairs(percent: percent))
|
|
88
82
|
lines.join("\n")
|
|
89
83
|
end
|
|
90
84
|
|
|
91
85
|
private
|
|
92
86
|
|
|
93
|
-
def
|
|
94
|
-
|
|
87
|
+
def attr_value(attr, percent: false, total: count, details: false)
|
|
88
|
+
target = details ? (@stats[DETAILS_FIELDS] || {}) : @stats
|
|
89
|
+
i = target["#{attr}"]
|
|
95
90
|
return i unless percent
|
|
96
91
|
percentage(i, total: total)
|
|
97
92
|
end
|
|
98
93
|
|
|
99
94
|
def core(percent: false)
|
|
100
|
-
|
|
95
|
+
attr_value("core", percent: percent)
|
|
101
96
|
end
|
|
102
97
|
|
|
103
98
|
def account(percent: false)
|
|
104
|
-
|
|
99
|
+
attr_value("account", percent: percent)
|
|
105
100
|
end
|
|
106
101
|
|
|
107
102
|
def details(percent: false)
|
|
108
|
-
|
|
103
|
+
attr_value("details", percent: percent)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def stats
|
|
107
|
+
@stats ||= Hash.new(0)
|
|
109
108
|
end
|
|
110
109
|
|
|
111
110
|
def build(requests)
|
|
112
|
-
|
|
111
|
+
stats.tap do |stats|
|
|
113
112
|
stats[type] = count
|
|
114
113
|
unless !requests || !requests.is_a?(Enumerable) || requests.empty?
|
|
114
|
+
stats[DETAILS_FIELDS] = Hash.new(0)
|
|
115
115
|
requests.each_with_index do |request|
|
|
116
116
|
add_core_stats(stats, request || {})
|
|
117
117
|
add_account_stats(stats, request || {})
|
|
@@ -149,16 +149,15 @@ module Eco
|
|
|
149
149
|
if request.key?("details")
|
|
150
150
|
stats["details"] += 1
|
|
151
151
|
stats["details_remove"] += 1 if !request["details"]
|
|
152
|
+
|
|
153
|
+
det_attrs = {}
|
|
152
154
|
if fields = request.dig("details", "fields")
|
|
153
155
|
stats["fields"] += fields.length
|
|
156
|
+
det_attrs = fields.each_with_object(det_attrs) {|fld, hash| hash[fld["alt_id"]] = fld["value"]}
|
|
154
157
|
end
|
|
155
|
-
end
|
|
156
|
-
end
|
|
157
158
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
(v = attr(a, percent: percent, total: count)) > 0 ? [a, v] : nil
|
|
161
|
-
end.compact
|
|
159
|
+
attrs_to_stat(stats[DETAILS_FIELDS], det_attrs, det_attrs.keys)
|
|
160
|
+
end
|
|
162
161
|
end
|
|
163
162
|
|
|
164
163
|
def core_pairs(percent: false)
|
|
@@ -172,22 +171,23 @@ module Eco
|
|
|
172
171
|
end
|
|
173
172
|
|
|
174
173
|
def details_pairs(percent: false)
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
174
|
+
det_pairs = [["details", details(percent: percent)]]
|
|
175
|
+
det_pairs += [["fields", fields_average]] if attr_value("fields") && fields_average
|
|
176
|
+
det_pairs += pairs(["details_remove"], percent: percent, total: details)
|
|
177
|
+
det_pairs += pairs(details_field_attrs, percent: percent, total: details, details: true)
|
|
178
178
|
end
|
|
179
179
|
|
|
180
|
-
def
|
|
181
|
-
|
|
182
|
-
(
|
|
183
|
-
end
|
|
180
|
+
def pairs(attrs, percent: false, total: count, details: false)
|
|
181
|
+
pairs = attrs.map do |a|
|
|
182
|
+
(v = attr_value(a, percent: percent, total: count, details: details)) > 0 ? [a, v] : nil
|
|
183
|
+
end.compact
|
|
184
184
|
end
|
|
185
185
|
|
|
186
|
-
def
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
end
|
|
186
|
+
def pairs_to_line(pairs, percent: false)
|
|
187
|
+
key_val_delimiter = ": "; attr_delimiter = " ++ "
|
|
188
|
+
pairs.map do |p|
|
|
189
|
+
[p.first.to_s, "#{p.last.to_s}" + (percent ? "%" : "")].join(key_val_delimiter)
|
|
190
|
+
end.join(attr_delimiter)
|
|
191
191
|
end
|
|
192
192
|
|
|
193
193
|
def core_attrs
|
|
@@ -202,6 +202,10 @@ module Eco
|
|
|
202
202
|
@details_attrs ||= self.class.details_attrs
|
|
203
203
|
end
|
|
204
204
|
|
|
205
|
+
def details_field_attrs
|
|
206
|
+
@stats[DETAILS_FIELDS].keys
|
|
207
|
+
end
|
|
208
|
+
|
|
205
209
|
def blank_attrs(attrs)
|
|
206
210
|
self.class.blank_attrs(attrs)
|
|
207
211
|
end
|
|
@@ -225,6 +229,18 @@ module Eco
|
|
|
225
229
|
end
|
|
226
230
|
end
|
|
227
231
|
|
|
232
|
+
def fields_average
|
|
233
|
+
if (fields_num = attr_value("fields")) && (total = details) > 0
|
|
234
|
+
(fields_num.to_f / total.to_f).round(2)
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def percentage(num, total: count)
|
|
239
|
+
total ||= count
|
|
240
|
+
if num
|
|
241
|
+
(num.to_f / total * 100).round(2)
|
|
242
|
+
end
|
|
243
|
+
end
|
|
228
244
|
end
|
|
229
245
|
end
|
|
230
246
|
end
|
|
@@ -363,6 +363,18 @@ module Eco
|
|
|
363
363
|
yield(wf) if block_given?
|
|
364
364
|
end
|
|
365
365
|
end
|
|
366
|
+
|
|
367
|
+
# @return [nil, Interger] seconds between jobs
|
|
368
|
+
def delay_between_jobs(seconds = nil)
|
|
369
|
+
self["delay_between_jobs"] = seconds if seconds
|
|
370
|
+
self["delay_between_jobs"]
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
# @return [nil, Interger] seconds between job groups
|
|
374
|
+
def delay_between_job_groups(seconds = nil)
|
|
375
|
+
self["delay_between_job_groups"] = seconds if seconds
|
|
376
|
+
self["delay_between_job_groups"]
|
|
377
|
+
end
|
|
366
378
|
# @!endgroup
|
|
367
379
|
|
|
368
380
|
end
|
|
@@ -2,6 +2,8 @@ class Eco::API::UseCases::DefaultCases::CleanUnknownTags < Eco::API::Common::Loa
|
|
|
2
2
|
name "clean-unknown-tags"
|
|
3
3
|
type :transform
|
|
4
4
|
|
|
5
|
+
UNKNOWN_LOCS_FILE = "unknown_locations.txt"
|
|
6
|
+
|
|
5
7
|
REGISTER_TAGS = [
|
|
6
8
|
"EVENT", "INJURY", "RISK", "CONTRACTOR", "PERMIT",
|
|
7
9
|
"AUDIT", "JSEA",
|
|
@@ -20,18 +22,52 @@ class Eco::API::UseCases::DefaultCases::CleanUnknownTags < Eco::API::Common::Loa
|
|
|
20
22
|
people.each do |person|
|
|
21
23
|
unknown_tags = person.filter_tags.select {|tag| !tag?(tag)}
|
|
22
24
|
person.filter_tags -= unknown_tags
|
|
25
|
+
unknown_tag!(*unknown_tags)
|
|
23
26
|
update.add(person)
|
|
24
27
|
end
|
|
25
28
|
end
|
|
26
29
|
|
|
27
30
|
private
|
|
28
31
|
|
|
32
|
+
def unknown_tag!(*tags)
|
|
33
|
+
tags.each do |value|
|
|
34
|
+
unless unknown.include?(value)
|
|
35
|
+
unknown << value
|
|
36
|
+
File.open(unknown_tags_file, 'a') do |fd|
|
|
37
|
+
fd.write("#{value}\n")
|
|
38
|
+
end
|
|
39
|
+
puts "Custom detected: '#{value}'"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def register_tags
|
|
45
|
+
REGISTER_TAGS
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def unknown
|
|
49
|
+
@unknown ||= []
|
|
50
|
+
end
|
|
51
|
+
|
|
29
52
|
def tag?(value)
|
|
30
|
-
tagtree.tag?(value)
|
|
53
|
+
tagtree.tag?(value).yield_self do |is_loc|
|
|
54
|
+
next true if is_loc
|
|
55
|
+
if clean_register_tags?
|
|
56
|
+
register_tags.any? {|reg| value == reg}
|
|
57
|
+
end
|
|
58
|
+
end
|
|
31
59
|
end
|
|
32
60
|
|
|
33
61
|
def tagtree
|
|
34
62
|
@tagtree ||= ASSETS.config.tagtree
|
|
35
63
|
end
|
|
36
64
|
|
|
65
|
+
def unknown_tags_file
|
|
66
|
+
File.join(".","#{session.enviro_name}_#{UNKNOWN_LOCS_FILE}")
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def clean_register_tags?
|
|
70
|
+
!options.dig(:usecase, :include_register_tags)
|
|
71
|
+
end
|
|
72
|
+
|
|
37
73
|
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
class Eco::API::UseCases::DefaultCases::TagPaths < Eco::API::Common::Loaders::UseCase
|
|
2
|
+
name "create-tag-paths"
|
|
3
|
+
type :other
|
|
4
|
+
|
|
5
|
+
def main(session, options, usecase)
|
|
6
|
+
CSV.open("tag_paths.csv", "w") do |csv|
|
|
7
|
+
csv << ["Tag", "Path"]
|
|
8
|
+
tag_paths.each do |values|
|
|
9
|
+
csv << values
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
private
|
|
15
|
+
|
|
16
|
+
def tag_paths
|
|
17
|
+
@tag_paths ||= tagtree.tags.map do |tag|
|
|
18
|
+
[tag, tagtree.path(tag).join("|")]
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def tagtree
|
|
23
|
+
session.tagtree
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -2,16 +2,25 @@ class Eco::API::UseCases::DefaultCases::ReinviteTransCase < Eco::API::Common::Lo
|
|
|
2
2
|
name "reinvite"
|
|
3
3
|
type :transform
|
|
4
4
|
|
|
5
|
+
def main(people, session, options, usecase)
|
|
6
|
+
reinvite(people.users, session, options, usecase)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
|
|
5
11
|
def reinvite(users, session, options, usecase)
|
|
6
12
|
invite = session.new_job("main", "invite", :update, usecase, :account)
|
|
7
13
|
users.each do |person|
|
|
8
|
-
|
|
14
|
+
if force_invite?
|
|
15
|
+
person.account.send_invites = true
|
|
16
|
+
else
|
|
17
|
+
person.account.force_send_invites = true
|
|
18
|
+
end
|
|
9
19
|
invite.add(person)
|
|
10
20
|
end
|
|
11
21
|
end
|
|
12
22
|
|
|
13
|
-
def
|
|
14
|
-
|
|
23
|
+
def force_invite?
|
|
24
|
+
options.dig(:force, :invite)
|
|
15
25
|
end
|
|
16
|
-
|
|
17
26
|
end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
class Eco::API::UseCases::DefaultCases::Samples::Sftp < Eco::API::Common::Loaders::UseCase
|
|
2
|
+
name "sftp-sample"
|
|
3
|
+
type :other
|
|
4
|
+
|
|
5
|
+
attr_reader :session
|
|
6
|
+
|
|
7
|
+
def main(session, options, usecase)
|
|
8
|
+
@session = session
|
|
9
|
+
options[:end_get] = false
|
|
10
|
+
raise "The SFTP is not configured" unless session.sftp?
|
|
11
|
+
case options.dig(:sftp, :command)
|
|
12
|
+
when :list
|
|
13
|
+
list_folder
|
|
14
|
+
when :get
|
|
15
|
+
get_files
|
|
16
|
+
when :get_last
|
|
17
|
+
get_last
|
|
18
|
+
when :archive
|
|
19
|
+
archive_files
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def file_pattern
|
|
26
|
+
raise "You should redefine the file_pattern function as a RegEx expression that matches the target remote file"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Ex: "/IN/Personnel"
|
|
30
|
+
def remote_subfolder
|
|
31
|
+
raise "You should redefine remote_subfolder as the folder where the target file sits. Ex: /IN/Personnel"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def archive_subfolder
|
|
35
|
+
"Archive"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def with_remote_files
|
|
39
|
+
sftp.files(remote_folder, pattern: file_pattern).each do |remote_file|
|
|
40
|
+
yield(remote_file) if block_given?
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def list_folder
|
|
45
|
+
puts "Listing remote folder: '#{remote_folder}':"
|
|
46
|
+
with_remote_files {|file| puts file.longname}
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def get_files
|
|
50
|
+
with_remote_files.tap do |files|
|
|
51
|
+
unless files.empty?
|
|
52
|
+
file_names = files.map {|file| to_remote_path(file.name)}
|
|
53
|
+
puts "Getting the following files:"
|
|
54
|
+
puts file_names
|
|
55
|
+
sftp.download(file_names, local_folder: local_folder)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def get_last
|
|
61
|
+
with_remote_files.last.tap do |file|
|
|
62
|
+
if file
|
|
63
|
+
file_name = to_remote_path(file.name)
|
|
64
|
+
puts "Getting the following file: #{file_name}"
|
|
65
|
+
sftp.download(file_name, local_folder: local_folder)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def archive_files
|
|
71
|
+
with_remote_files do |file|
|
|
72
|
+
source = to_remote_path(file.name) # should probably be file.longname
|
|
73
|
+
dest = to_remote_path("#{archive_subfolder}/#{file.name}")
|
|
74
|
+
move_file(source, dest)
|
|
75
|
+
end.tap do |files|
|
|
76
|
+
puts "Moved the file(s) to the #{archive_subfolder} folder" unless files.empty?
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def move_file(source, dest)
|
|
81
|
+
sftp.move(source, dest, 0x0001) do |response|
|
|
82
|
+
if response.ok?
|
|
83
|
+
puts "#{source}\n -to-> #{dest}"
|
|
84
|
+
else
|
|
85
|
+
puts "Could not move file #{source}"
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def to_remote_path(file)
|
|
91
|
+
remote_folder + "/" + file
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def local_folder
|
|
95
|
+
"."
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def remote_folder
|
|
99
|
+
@remote_folder ||= sftp_config.remote_folder + remote_subfolder
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def sftp_config
|
|
103
|
+
session.config.sftp
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def sftp
|
|
107
|
+
session.sftp
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -9,6 +9,7 @@ module Eco
|
|
|
9
9
|
end
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
+
require_relative 'default_cases/samples'
|
|
12
13
|
require_relative 'default_cases/abstract_policygroup_abilities_case.rb'
|
|
13
14
|
require_relative 'default_cases/analyse_people_case'
|
|
14
15
|
require_relative 'default_cases/append_usergroups_case'
|
|
@@ -18,6 +19,7 @@ require_relative 'default_cases/codes_to_tags_case'
|
|
|
18
19
|
require_relative 'default_cases/create_case'
|
|
19
20
|
require_relative 'default_cases/create_details_case'
|
|
20
21
|
require_relative 'default_cases/create_details_with_supervisor_case'
|
|
22
|
+
require_relative 'default_cases/create_tag_paths_case'
|
|
21
23
|
require_relative 'default_cases/delete_trans_case'
|
|
22
24
|
require_relative 'default_cases/delete_sync_case'
|
|
23
25
|
require_relative 'default_cases/email_as_id_case'
|
|
@@ -87,9 +87,15 @@ ASSETS.cli.config do |cnf|
|
|
|
87
87
|
options.deep_merge!(other: {file: {codes_column: col_codes}})
|
|
88
88
|
end
|
|
89
89
|
|
|
90
|
+
desc = "Creates a CSV with the paths to each tag"
|
|
91
|
+
cases.add("-create-tag-paths", :other, desc, case_name: "create-tag-paths")
|
|
92
|
+
|
|
90
93
|
desc = "Cleans from filter_tags those tags that are not present in the tagtree (as per tagtree.json file)."
|
|
91
94
|
desc += " It will preserve standard register tags of most common registers (i.e. EVENT, RISK)."
|
|
92
95
|
cases.add("-clean-unknown-tags", :transform, desc, case_name: "clean-unknown-tags")
|
|
96
|
+
.add_option("-include-register-tags", "Will also try to remove register tags") do |options|
|
|
97
|
+
options.deep_merge!(usecase: {include_register_tags: true})
|
|
98
|
+
end
|
|
93
99
|
|
|
94
100
|
desc = "Removes the landing page or sets it to -page-id"
|
|
95
101
|
cases.add("-reset-landing-page", :transform, desc, case_name: "reset-landing-page")
|
|
@@ -180,9 +186,15 @@ ASSETS.cli.config do |cnf|
|
|
|
180
186
|
|
|
181
187
|
desc = "Re-sends invites to all filtered users that have not accepted the invite as yet"
|
|
182
188
|
cases.add("-reinvite", :transform, desc, case_name: "reinvite")
|
|
189
|
+
.add_option("-force", "If also send an invite email to those that have accepted the invite") do |options|
|
|
190
|
+
options.deep_merge!(force: {invite: true})
|
|
191
|
+
end
|
|
183
192
|
|
|
184
193
|
desc = "Re-sends invites to target users that have not accepted the invite as yet"
|
|
185
194
|
cases.add("-reinvite-from", :sync, desc, case_name: "reinvite")
|
|
195
|
+
.add_option("-force", "If also send an invite email to those that have accepted the invite") do |options|
|
|
196
|
+
options.deep_merge!(force: {invite: true})
|
|
197
|
+
end
|
|
186
198
|
|
|
187
199
|
desc = "Deletes everybody that has been filtered from the people manager"
|
|
188
200
|
cases.add("-delete", :transform, desc, case_name: "delete")
|
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.50
|
|
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.25
|
|
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.25
|
|
150
150
|
- - "<"
|
|
151
151
|
- !ruby/object:Gem::Version
|
|
152
152
|
version: '0.9'
|
|
@@ -530,6 +530,7 @@ files:
|
|
|
530
530
|
- lib/eco/api/usecases/default_cases/create_case.rb
|
|
531
531
|
- lib/eco/api/usecases/default_cases/create_details_case.rb
|
|
532
532
|
- lib/eco/api/usecases/default_cases/create_details_with_supervisor_case.rb
|
|
533
|
+
- lib/eco/api/usecases/default_cases/create_tag_paths_case.rb
|
|
533
534
|
- lib/eco/api/usecases/default_cases/delete_sync_case.rb
|
|
534
535
|
- lib/eco/api/usecases/default_cases/delete_trans_case.rb
|
|
535
536
|
- lib/eco/api/usecases/default_cases/email_as_id_case.rb
|
|
@@ -546,6 +547,8 @@ files:
|
|
|
546
547
|
- lib/eco/api/usecases/default_cases/remove_account_trans_case.rb
|
|
547
548
|
- lib/eco/api/usecases/default_cases/reset_landing_page_case.rb
|
|
548
549
|
- lib/eco/api/usecases/default_cases/restore_db_case.rb
|
|
550
|
+
- lib/eco/api/usecases/default_cases/samples.rb
|
|
551
|
+
- lib/eco/api/usecases/default_cases/samples/sftp_case.rb
|
|
549
552
|
- lib/eco/api/usecases/default_cases/set_default_tag_case.rb
|
|
550
553
|
- lib/eco/api/usecases/default_cases/set_supervisor_case.rb
|
|
551
554
|
- lib/eco/api/usecases/default_cases/supers_cyclic_identify_case.rb
|