eco-helpers 1.0.13 → 1.0.14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/eco/api/common/people/entry_factory.rb +3 -1
- data/lib/eco/api/common/people/person_attribute_parser.rb +33 -10
- data/lib/eco/api/common/people/person_entry.rb +1 -1
- data/lib/eco/api/common/people/person_entry_attribute_mapper.rb +1 -1
- data/lib/eco/api/common/people/person_factory.rb +5 -1
- data/lib/eco/api/common/session/environment.rb +7 -3
- data/lib/eco/api/common/session/mailer.rb +4 -0
- data/lib/eco/api/common/session/sftp.rb +4 -3
- data/lib/eco/api/error.rb +1 -0
- data/lib/eco/api/organization/presets_factory.rb +1 -1
- data/lib/eco/api/organization/tag_tree.rb +1 -1
- data/lib/eco/api/session.rb +119 -74
- data/lib/eco/api/session/batch.rb +23 -25
- data/lib/eco/api/session/batch/base_policy.rb +283 -0
- data/lib/eco/api/session/batch/errors.rb +17 -3
- data/lib/eco/api/session/batch/feedback.rb +112 -0
- data/lib/eco/api/session/batch/job.rb +90 -87
- data/lib/eco/api/session/batch/policies.rb +22 -0
- data/lib/eco/api/session/batch/request_stats.rb +195 -0
- data/lib/eco/api/session/batch/status.rb +66 -19
- data/lib/eco/api/session/config.rb +10 -0
- data/lib/eco/api/session/config/workflow.rb +1 -1
- data/lib/eco/api/usecases/default_cases/set_default_tag_case.rb +4 -3
- data/lib/eco/api/usecases/default_cases/switch_supervisor_case.rb +15 -10
- data/lib/eco/cli/config/default/filters.rb +3 -2
- data/lib/eco/cli/config/default/options.rb +12 -0
- data/lib/eco/cli/config/default/usecases.rb +6 -4
- data/lib/eco/cli/config/default/workflow.rb +3 -2
- data/lib/eco/cli/scripting/args_helpers.rb +1 -1
- data/lib/eco/version.rb +1 -1
- metadata +5 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8187e0511f185e36a43a0e123938b1062045b812d747800b34e098a2c0b1bf62
|
4
|
+
data.tar.gz: a6f591af8ab1998a9476903e056a0f97c0ecaaaabbfdea87ceb31ef2a165570e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8b11d2f308202c4b122445ea348e7219dfe7a156f5e5d5fca7b3605c38215a1b8216a5447dce43626afa41cf28973459436594b520b4d4a491a776dc1a3e298
|
7
|
+
data.tar.gz: ee27de5eb9c71d394d6bc28e1e3966f8d3c88b4aeb0603c56e724b4865070bddef79175ed3b16c4aaafeb6d1474bb0fc2b768c4814039c61ba277d4b211cbf5e
|
@@ -2,10 +2,12 @@ module Eco
|
|
2
2
|
module API
|
3
3
|
module Common
|
4
4
|
module People
|
5
|
+
# Helper factory class to generate entries (input entries).
|
6
|
+
# @attr_reader schema [Ecoportal::API::V1::PersonSchema] person schema to be used in this entry factory
|
5
7
|
# @attr_reader person_parser [Eco::API::Common::People::PersonParser] set of attribute, type and format parsers/serializers.
|
6
8
|
class EntryFactory
|
7
9
|
|
8
|
-
attr_reader :person_parser
|
10
|
+
attr_reader :schema, :person_parser
|
9
11
|
|
10
12
|
# @param schema [Ecoportal::API::V1::PersonSchema] schema of person details that the parser will be based upon.
|
11
13
|
# @param person_parser [nil, Eco::API::Common::People::PersonParser] set of attribute, type and format parsers/serializers.
|
@@ -26,25 +26,48 @@ module Eco
|
|
26
26
|
@active_when.call(source_data)
|
27
27
|
end
|
28
28
|
|
29
|
+
# Helper to build the `active_when` condition
|
30
|
+
def active_when_any?(*attrs)
|
31
|
+
Proc.new do |source_data|
|
32
|
+
keys = data_keys(source_data)
|
33
|
+
attrs.any? {|key| keys.include?(key)}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Helper to build the `active_when` condition
|
38
|
+
def active_when_all?(*attrs)
|
39
|
+
Proc.new do |source_data|
|
40
|
+
keys = data_keys(source_data)
|
41
|
+
attrs.all? {|key| keys.include?(key)}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
29
45
|
private
|
30
46
|
|
31
47
|
# by default, an attribute paraser is active if in the entry to parse
|
32
48
|
# the internal attribute is present
|
33
49
|
def attribute_present(active_when)
|
34
50
|
Proc.new do |source_data|
|
35
|
-
|
36
|
-
when Array
|
37
|
-
keys = source_data
|
38
|
-
when Hash
|
39
|
-
keys = source_data.keys
|
40
|
-
else
|
41
|
-
keys = []
|
42
|
-
end
|
43
|
-
|
44
|
-
(source_data && keys.include?(self.attr)) ||
|
51
|
+
data_keys(source_data).include?(self.attr) ||
|
45
52
|
(active_when && active_when.call(source_data))
|
46
53
|
end
|
47
54
|
end
|
55
|
+
|
56
|
+
# Helper to obtain the current internal named attributes of the data
|
57
|
+
# @param source_data [Array<String>, Hash] if `Array` those are already the `keys`, if `Hash` it gets the `keys`
|
58
|
+
# @return [Array<String>] `keys` of `source_data`
|
59
|
+
def data_keys(source_data)
|
60
|
+
case source_data
|
61
|
+
when Array
|
62
|
+
keys = source_data
|
63
|
+
when Hash
|
64
|
+
keys = source_data.keys
|
65
|
+
else
|
66
|
+
keys = []
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
|
48
71
|
end
|
49
72
|
end
|
50
73
|
end
|
@@ -2,9 +2,13 @@ module Eco
|
|
2
2
|
module API
|
3
3
|
module Common
|
4
4
|
module People
|
5
|
+
|
6
|
+
# Helper factory to build `Ecoportal::API::V1::Person` or `Ecoportal::API::Internal::Person` objects
|
7
|
+
# @attr_reader schema [Ecoportal::API::V1::PersonSchema] person schema to be used in this person factory
|
8
|
+
# @attr_reader schema_attrs [Array<String>] _inernal names_ of the schema fields/attributes
|
5
9
|
class PersonFactory
|
6
10
|
|
7
|
-
attr_reader :schema_attrs
|
11
|
+
attr_reader :schema, :schema_attrs
|
8
12
|
|
9
13
|
def initialize(person: {}, schema: {}, account: {}, modifier: Common::People::PersonModifier.new)
|
10
14
|
@modifier = Common::People::PersonModifier.new(modifier)
|
@@ -13,6 +13,8 @@ module Eco
|
|
13
13
|
|
14
14
|
alias_method :fm, :file_manager
|
15
15
|
|
16
|
+
#@param init [Eco::API::Common::Session::Environment] object to ini the session environment
|
17
|
+
#@param session [Eco::API::Session, nil] the current session
|
16
18
|
def initialize(init = {}, session:)
|
17
19
|
init = init.conf if init.is_a?(Environment)
|
18
20
|
msg = "Expected object Eco::API::Session::Config or Environment. Given: #{init}"
|
@@ -23,8 +25,6 @@ module Eco
|
|
23
25
|
@session = session
|
24
26
|
@file_manager = Eco::API::Common::Session::FileManager.new(enviro: self)
|
25
27
|
@logger = Eco::API::Common::Session::Logger.new(enviro: self)
|
26
|
-
|
27
|
-
new_api
|
28
28
|
end
|
29
29
|
|
30
30
|
def mailer
|
@@ -34,11 +34,15 @@ module Eco
|
|
34
34
|
def sftp
|
35
35
|
@sftp ||= Eco::API::Common::Session::SFTP.new(enviro: self)
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
def s3upoader
|
39
39
|
@s3uploader ||= Eco::API::Common::Session::S3Uploader.new(enviro: self)
|
40
40
|
end
|
41
41
|
|
42
|
+
def api
|
43
|
+
@api || new_api
|
44
|
+
end
|
45
|
+
|
42
46
|
def new_api
|
43
47
|
return nil unless config.apis.active_api
|
44
48
|
|
@@ -12,6 +12,10 @@ module Eco
|
|
12
12
|
@enviro = enviro
|
13
13
|
end
|
14
14
|
|
15
|
+
# Sends an email
|
16
|
+
# @param to [String] destination email address
|
17
|
+
# @param subject [String] subject of the email
|
18
|
+
# @param body [String] `html` or plain text message
|
15
19
|
def mail(to:, subject:, body:)
|
16
20
|
ses.send_email(
|
17
21
|
destination: {
|
@@ -23,8 +23,9 @@ module Eco
|
|
23
23
|
non_interactive: true
|
24
24
|
)
|
25
25
|
rescue Exception => e
|
26
|
-
|
27
|
-
|
26
|
+
msg = "Could not open SFTP session. Possible misconfiguration: #{e}"
|
27
|
+
logger.error(msg)
|
28
|
+
raise msg
|
28
29
|
end
|
29
30
|
@sftp_session
|
30
31
|
end
|
@@ -57,7 +58,7 @@ module Eco
|
|
57
58
|
end
|
58
59
|
|
59
60
|
# @see Net::SFTP::Session#rename
|
60
|
-
def move(fullname_source, fullname_dest, flags=
|
61
|
+
def move(fullname_source, fullname_dest, flags=0x0001, &callback)
|
61
62
|
sftp_session.rename!(fullname_source, fullname_dest, flags, &callback)
|
62
63
|
end
|
63
64
|
|
data/lib/eco/api/error.rb
CHANGED
data/lib/eco/api/session.rb
CHANGED
@@ -1,14 +1,9 @@
|
|
1
1
|
module Eco
|
2
2
|
module API
|
3
|
+
# Class to manage the current session.
|
4
|
+
# Central helper of resources.
|
3
5
|
class Session < Common::Session::BaseSession
|
4
|
-
|
5
|
-
attr_accessor :schema
|
6
|
-
|
7
|
-
# Class to manage the current session.
|
8
|
-
# Central helper of resources.
|
9
|
-
#
|
10
|
-
# @attr_reader batch [Eco::API::Session::Batch] provides helper to launch batch operations.
|
11
|
-
# @attr_reader schema [Ecoportal::API::V1::PersonSchema] currently active schema.
|
6
|
+
#@param init [Eco::API::Session::Config, Eco::API::Common::Session::Environment] object to ini the session
|
12
7
|
def initialize(init = {})
|
13
8
|
e = init
|
14
9
|
msg = "Expected object Eco::API::Session::Config or Eco::API::Common::Session::Environment. Given: #{init}"
|
@@ -16,43 +11,21 @@ module Eco
|
|
16
11
|
e = Eco::API::Common::Session::Environment.new(init, session: self) if !e.is_a?(Eco::API::Common::Session::Environment)
|
17
12
|
super(e)
|
18
13
|
|
19
|
-
|
20
|
-
|
21
|
-
@batch = Batch.new(enviro)
|
22
|
-
@task = Task.new(enviro)
|
23
|
-
|
24
|
-
self.schema = config.people.default_schema || schemas.first
|
14
|
+
@entry_factories = {}
|
15
|
+
@person_factories = {}
|
25
16
|
|
26
|
-
|
27
|
-
presets_map_file = config.people.presets_map
|
28
|
-
|
29
|
-
@presets_factory = Eco::API::Organization::PresetsFactory.new({
|
30
|
-
presets_custom: file_manager.dir.file(presets_custom_file, should_exist: true),
|
31
|
-
presets_map: file_manager.dir.file(presets_map_file, should_exist: true),
|
32
|
-
enviro: enviro
|
33
|
-
})
|
17
|
+
logger.debug("LINE COMMAND: #{$0} #{ARGV.join(" ")}")
|
34
18
|
end
|
35
19
|
|
36
20
|
# Helper to perform multiple operations in one go.
|
37
21
|
# @return [Eco::API::Session::Task] provides shortcuts to manage certain kind of operations.
|
38
22
|
def do
|
39
|
-
@task
|
23
|
+
@task ||= Task.new(enviro)
|
40
24
|
end
|
41
25
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
def s3upload(content: nil, file: nil, directory: nil)
|
47
|
-
if content && file
|
48
|
-
s3uploader.upload(file, content)
|
49
|
-
elsif file
|
50
|
-
s3uploader.upload_file(file)
|
51
|
-
elsif directory
|
52
|
-
s3uploader.upload_directory(directory)
|
53
|
-
else
|
54
|
-
logger.error("To use Session.s3upload, you must specify either directory, file or content and file name")
|
55
|
-
end
|
26
|
+
# @return [Eco::API::Session::Batch] provides helper to launch batch operations.
|
27
|
+
def batch
|
28
|
+
@batch ||= Batch.new(enviro)
|
56
29
|
end
|
57
30
|
|
58
31
|
# @see Eco::API::Session::Config#policy_groups
|
@@ -75,40 +48,67 @@ module Eco
|
|
75
48
|
config.schemas
|
76
49
|
end
|
77
50
|
|
51
|
+
# @return [String, Ecoportal::API::V1::PersonSchema] current active session's schema
|
52
|
+
def schema
|
53
|
+
self.schema = config.people.default_schema || schemas.first unless @schema
|
54
|
+
@schema
|
55
|
+
end
|
56
|
+
|
78
57
|
# Sets the current target `PersonSchema` of this session.
|
79
58
|
# @note observe that it is essential for the parsers/serialisers to identify target/present attributes.
|
80
59
|
# @param schema [String, Ecoportal::API::V1::PersonSchema] where `String` can be the _name_ or the _id_ of the schema.
|
81
60
|
def schema=(value)
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
61
|
+
@schema = to_schema(value)
|
62
|
+
self
|
63
|
+
end
|
64
|
+
|
65
|
+
# Builds the presets using the usergroup ids of the input.
|
66
|
+
# @note for each flag/ability it will take the highest among those mapped for the present usergroups.
|
67
|
+
# @param [Ecoportal::API::Internal::Person, Array<String>] the array should be of usegroup names or ids.
|
68
|
+
# @return [Hash] with custom presets.
|
69
|
+
def new_preset(input)
|
70
|
+
case input
|
71
|
+
when Ecoportal::API::Internal::Person
|
72
|
+
presets_factory.new(*input&.account&.policy_group_ids)
|
73
|
+
when Array
|
74
|
+
presets_factory.new(*input)
|
89
75
|
else
|
90
|
-
|
91
|
-
return
|
76
|
+
presets_factory.new(input)
|
92
77
|
end
|
78
|
+
end
|
93
79
|
|
94
|
-
|
80
|
+
# Helper to obtain a EntryFactory
|
81
|
+
# @param schema [String, Ecoportal::API::V1::PersonSchema] `schema` to which associate the EntryFactory,
|
82
|
+
# where `String` can be the _name_ or the _id_ of the schema.
|
83
|
+
# @return [Eco::API::Common::People::EntryFactory] associated to `schema`.
|
84
|
+
# If `schema` is `nil` or not provided it uses the currently associated to the `session`
|
85
|
+
def entry_factory(schema: nil)
|
86
|
+
schema = to_schema(schema) || self.schema
|
87
|
+
return @entry_factories[schema&.id] if @entry_factories.key?(schema&.id)
|
95
88
|
|
96
89
|
# TODO: check PersonEntry#to_internal and #to_external in init_attr_trackers
|
97
90
|
# => when attr_map is avoided, it doesn't work as it should
|
91
|
+
mappings = []
|
98
92
|
if map_file = config.people.fields_mapper
|
99
93
|
mappings = map_file ? file_manager.load_json(map_file) : []
|
100
|
-
else
|
101
|
-
mappings = []
|
102
94
|
end
|
103
|
-
attr_map = Eco::Data::Mapper.new(mappings)
|
104
95
|
|
105
|
-
@
|
106
|
-
schema:
|
96
|
+
@entry_factories[schema&.id] = Eco::API::Common::People::EntryFactory.new({
|
97
|
+
schema: schema,
|
107
98
|
person_parser: config.people.parser,
|
108
|
-
attr_map:
|
99
|
+
attr_map: Eco::Data::Mapper.new(mappings),
|
109
100
|
logger: logger
|
110
101
|
})
|
111
|
-
|
102
|
+
end
|
103
|
+
|
104
|
+
# Helper to obtain a PersonFactory
|
105
|
+
# @param schema [String, Ecoportal::API::V1::PersonSchema] `schema` to which associate the PersonFactory,
|
106
|
+
# where `String` can be the _name_ or the _id_ of the schema.
|
107
|
+
# @return [Eco::API::Common::People::PersonFactory] associated to `schema`.
|
108
|
+
# If `schema` is `nil` or not provided it uses the currently associated to the `session`
|
109
|
+
def person_factory(schema: nil)
|
110
|
+
schema = to_schema(schema) || self.schema
|
111
|
+
@person_factories[schema&.id] ||= Eco::API::Common::People::PersonFactory.new(schema: schema)
|
112
112
|
end
|
113
113
|
|
114
114
|
# Allows to use the defined parsers
|
@@ -116,48 +116,33 @@ module Eco
|
|
116
116
|
# @param attr [String] type (`Symbol`) or attribute (`String`) to target a specific parser.
|
117
117
|
# @param source [Any] source value to be parsed.
|
118
118
|
def parse_attribute(attr, source)
|
119
|
-
unless parsers =
|
119
|
+
unless parsers = entry_factory.person_parser
|
120
120
|
raise "There are no parsers defined"
|
121
121
|
end
|
122
122
|
parsers.parse(attr, source)
|
123
123
|
end
|
124
124
|
|
125
|
-
# Builds the presets using the usergroup ids of the input.
|
126
|
-
# @note for each flag/ability it will take the highest among those mapped for the present usergroups.
|
127
|
-
# @param [Ecoportal::API::Internal::Person, Array<String>] the array should be of usegroup names or ids.
|
128
|
-
# @return [Hash] with custom presets.
|
129
|
-
def new_preset(input)
|
130
|
-
case input
|
131
|
-
when Ecoportal::API::Internal::Person
|
132
|
-
@presets_factory.new(*input&.account&.policy_group_ids)
|
133
|
-
when Array
|
134
|
-
@presets_factory.new(*input)
|
135
|
-
else
|
136
|
-
@presets_factory.new(input)
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
125
|
def export(*args)
|
141
|
-
|
126
|
+
entry_factory.export(*args)
|
142
127
|
end
|
143
128
|
|
144
129
|
# @see Eco::API::Common::People::EntryFactory#new
|
145
130
|
# @return [Ecoportal::API::Internal::Person]
|
146
131
|
def new_person(**keyed_args)
|
147
|
-
|
132
|
+
person_factory.new(**keyed_args)
|
148
133
|
end
|
149
134
|
|
150
135
|
# Builds the entry for the given data.
|
151
136
|
# @see Eco::API::Common::People::EntryFactory#new
|
152
137
|
# @return [Eco::API::Common::People::PersonEntry] parsed entry.
|
153
138
|
def new_entry(data, dependencies: {})
|
154
|
-
|
139
|
+
entry_factory.new(data, dependencies: dependencies)
|
155
140
|
end
|
156
141
|
|
157
142
|
# @see Eco::API::Common::People::EntryFactory#entries
|
158
143
|
# @return [Eco::API::Common::People::Entries] collection of entries.
|
159
144
|
def entries(*args)
|
160
|
-
|
145
|
+
entry_factory.entries(*args).tap do |collection|
|
161
146
|
logger.info("Loaded #{collection.length} input entries.")
|
162
147
|
end
|
163
148
|
end
|
@@ -216,6 +201,66 @@ module Eco
|
|
216
201
|
job_groups.launch(simulate: simulate)
|
217
202
|
end
|
218
203
|
|
204
|
+
# Sends an email
|
205
|
+
# @see Eco::API::Common::Session::Mailer#mail
|
206
|
+
def mail_to(**kargs)
|
207
|
+
mail.mail(**kargs)
|
208
|
+
end
|
209
|
+
|
210
|
+
# Uploads content into a file, a file or a directory to S3
|
211
|
+
# @see Eco::API::Common::Session::S3Uploader#upload
|
212
|
+
# @see Eco::API::Common::Session::S3Uploader#upload_file
|
213
|
+
# @see Eco::API::Common::Session::S3Uploader#upload_directory
|
214
|
+
# @param content [String] content to be uploaded (requires `file`)
|
215
|
+
# @param file [String] name of the file to be uploaded
|
216
|
+
# @param directory [String] name of source directory to be uploaded
|
217
|
+
def s3upload(content: nil, file: nil, directory: nil)
|
218
|
+
if content && file
|
219
|
+
s3uploader.upload(file, content)
|
220
|
+
elsif file
|
221
|
+
s3uploader.upload_file(file)
|
222
|
+
elsif directory
|
223
|
+
s3uploader.upload_directory(directory)
|
224
|
+
else
|
225
|
+
logger.error("To use Session.s3upload, you must specify either directory, file or content and file name")
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
private
|
230
|
+
|
231
|
+
# Helper to state the abilities that a person should have with given their usergroups
|
232
|
+
def presets_factory
|
233
|
+
@presets_factory ||= Eco::API::Organization::PresetsFactory.new({
|
234
|
+
presets_custom: file_manager.dir.file(config.people.presets_custom, should_exist: true),
|
235
|
+
presets_map: file_manager.dir.file(config.people.presets_map, should_exist: true),
|
236
|
+
enviro: enviro
|
237
|
+
})
|
238
|
+
end
|
239
|
+
|
240
|
+
# Comparer to state if 2 schemas are different
|
241
|
+
def same_schema? (schema1, schema2)
|
242
|
+
eq = schema1&.id == schema2&.id
|
243
|
+
eq ||= schema1&.name&.downcase == schema2&.name&.downcase
|
244
|
+
schema1 && schema2 && eq
|
245
|
+
end
|
246
|
+
|
247
|
+
# from schema `id` or `name` to a PersonSchema object
|
248
|
+
def to_schema(value)
|
249
|
+
return nil unless value
|
250
|
+
sch = nil
|
251
|
+
case value
|
252
|
+
when String
|
253
|
+
unless sch = schemas.schema(value)
|
254
|
+
fatal "The schema with id or name '#{value}' does not exist."
|
255
|
+
end
|
256
|
+
when Ecoportal::API::V1::PersonSchema
|
257
|
+
sch = value
|
258
|
+
else
|
259
|
+
fatal "Required String or Ecoportal::API::V1::PersonSchema. Given: #{value}"
|
260
|
+
end
|
261
|
+
sch
|
262
|
+
end
|
263
|
+
|
219
264
|
end
|
220
265
|
end
|
221
266
|
end
|