eco-helpers 0.8.3 → 0.8.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/eco-helpers.gemspec +0 -2
- data/lib/eco-helpers.rb +0 -1
- data/lib/eco/api/common/people/person_entry.rb +67 -30
- data/lib/eco/api/common/version_patches.rb +2 -1
- data/lib/eco/api/common/version_patches/base_model.rb +27 -0
- data/lib/eco/api/organization/people.rb +6 -0
- data/lib/eco/api/organization/tag_tree.rb +6 -0
- data/lib/eco/api/policies/policy.rb +2 -2
- data/lib/eco/api/session.rb +23 -30
- data/lib/eco/api/session/batch.rb +3 -2
- data/lib/eco/api/session/batch_job.rb +18 -10
- data/lib/eco/api/session/batch_status.rb +27 -11
- data/lib/eco/api/session/config.rb +20 -7
- data/lib/eco/api/usecases/default_cases/change_email_case.rb +2 -6
- data/lib/eco/api/usecases/default_cases/refresh_presets_case.rb +3 -2
- data/lib/eco/api/usecases/use_case.rb +6 -5
- data/lib/eco/api/usecases/use_case_chain.rb +3 -3
- data/lib/eco/api/usecases/use_case_io.rb +3 -3
- data/lib/eco/assets.rb +3 -1
- data/lib/eco/{common → assets}/language.rb +2 -2
- data/lib/eco/cli.rb +3 -4
- data/lib/eco/cli/config.rb +10 -0
- data/lib/eco/cli/config/options.rb +11 -0
- data/lib/eco/cli/scripting.rb +23 -0
- data/lib/eco/cli/scripting/args_helpers.rb +55 -0
- data/lib/eco/cli/scripting/argument.rb +31 -0
- data/lib/eco/cli/scripting/arguments.rb +70 -0
- data/lib/eco/common.rb +1 -3
- data/lib/eco/data/crypto/encryption.rb +2 -2
- data/lib/eco/language/models/collection.rb +1 -1
- data/lib/eco/version.rb +1 -1
- metadata +9 -62
- data/lib/eco/cli/api.rb +0 -14
- data/lib/eco/cli/root.rb +0 -9
- data/lib/eco/cli/session.rb +0 -9
- data/lib/eco/cli/session/batch.rb +0 -9
- data/lib/eco/common/base_cli.rb +0 -23
- data/lib/eco/common/base_cli_backup.rb +0 -120
- data/lib/eco/common/meta_thor.rb +0 -111
- data/lib/eco/common/meta_thor/command_group.rb +0 -36
- data/lib/eco/common/meta_thor/command_unit.rb +0 -48
- data/lib/eco/common/meta_thor/input_backup.rb +0 -111
- data/lib/eco/common/meta_thor/input_multi_backup.rb +0 -139
- data/lib/eco/common/meta_thor/pipe.rb +0 -85
- data/lib/eco/common/meta_thor/thor.rb +0 -1
- data/lib/eco/common/meta_thor/thor/command.rb +0 -36
- data/lib/eco/common/meta_thor/value.rb +0 -54
- data/lib/eco/scripting.rb +0 -32
- data/lib/eco/scripting/README.md +0 -11
- data/lib/eco/scripting/args_helpers.rb +0 -53
- data/lib/eco/scripting/argument.rb +0 -29
- data/lib/eco/scripting/arguments.rb +0 -68
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 05fa297f660326cad5045f7760c4352b961492c7be71a18eda2093cd7032b011
|
4
|
+
data.tar.gz: 13690bdea42b4960af20e835c5171df3424cfc7213f25123f154c0a42205bc58
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f795b7015969ddeaa59c76a1625d6d336ace2d35145651c15fdaecbbc0c32345c7023666febd94b1abb8e1de7ed1d3410aaf61bb19d5799edec6078bb0a02390
|
7
|
+
data.tar.gz: 33e176df8b2209373683ef79eba539f8e05e61fb1bbee63ebf4c8823c0f2ffa215a2c1cc62aa1e55d6c6e75c799f6f57599d8f67f7fd924bc371657018617777
|
data/eco-helpers.gemspec
CHANGED
@@ -29,8 +29,6 @@ Gem::Specification.new do |s|
|
|
29
29
|
s.add_development_dependency "redcarpet", "~> 3.4", ">= 3.4.0"
|
30
30
|
|
31
31
|
s.add_dependency 'ecoportal-api', '~> 0.4', '>= 0.4.3'
|
32
|
-
s.add_dependency 'thor', '~> 0', '>= 0.20'
|
33
|
-
s.add_dependency 'nokogiri', '~> 1.6', '>= 1.6.8'
|
34
32
|
s.add_dependency 'aws-sdk-s3', '~> 1.30', '>= 1.30.1'
|
35
33
|
s.add_dependency 'aws-sdk-ses', '~> 1.14', '>= 1.14.0'
|
36
34
|
s.add_dependency 'dotenv', '~> 2.6', '>= 2.6.0'
|
data/lib/eco-helpers.rb
CHANGED
@@ -3,6 +3,7 @@ module Eco
|
|
3
3
|
module Common
|
4
4
|
module People
|
5
5
|
class PersonEntry
|
6
|
+
|
6
7
|
# This class is meant to provide a common interface to access entries of source data that come in different formats.
|
7
8
|
# @note
|
8
9
|
# - if `data` is a `Person` object, its behaviour is `serialise`.
|
@@ -17,21 +18,21 @@ module Eco
|
|
17
18
|
raise "Constructor needs a PersonParser. Given: #{parser}" if !person_parser.is_a?(Eco::API::Common::People::PersonParser)
|
18
19
|
raise "Expecting Mapper object. Given: #{attr_map}" if attr_map && !attr_map.is_a?(Eco::Data::Mapper)
|
19
20
|
|
20
|
-
@source
|
21
|
+
@source = data
|
21
22
|
@person_parser = person_parser
|
22
|
-
@deps
|
23
|
-
@logger
|
24
|
-
@attr_map
|
23
|
+
@deps = dependencies
|
24
|
+
@logger = logger
|
25
|
+
@attr_map = attr_map
|
25
26
|
@emap = PersonEntryAttributeMapper.new(@source, person_parser: @person_parser, attr_map: @attr_map, logger: @logger)
|
26
27
|
|
27
28
|
if parsing?
|
28
29
|
@external_entry = data
|
29
|
-
@serialized_entry =
|
30
|
-
@internal_entry =
|
30
|
+
@serialized_entry = _mapped_entry(@external_entry)
|
31
|
+
@internal_entry = _internal_entry(@serialized_entry)
|
31
32
|
else # SERIALIZING
|
32
33
|
@person = data
|
33
|
-
@internal_entry =
|
34
|
-
@serialized_entry =
|
34
|
+
@internal_entry = _internal_entry(@person)
|
35
|
+
@serialized_entry = _mapped_entry(@internal_entry)
|
35
36
|
#@external_entry = external_entry
|
36
37
|
end
|
37
38
|
end
|
@@ -99,7 +100,7 @@ module Eco
|
|
99
100
|
def set_core(person, exclude: nil)
|
100
101
|
scoped_attrs = @emap.core_attrs - into_a(exclude)
|
101
102
|
@internal_entry.slice(*scoped_attrs).each do |attr, value|
|
102
|
-
|
103
|
+
_set_to_core(person, attr, value)
|
103
104
|
end
|
104
105
|
end
|
105
106
|
|
@@ -112,7 +113,7 @@ module Eco
|
|
112
113
|
person.add_details(@person_parser.schema) if !person.details || !person.details.schema_id
|
113
114
|
scoped_attrs = @emap.details_attrs - into_a(exclude)
|
114
115
|
@internal_entry.slice(*scoped_attrs).each do |attr, value|
|
115
|
-
|
116
|
+
_set_to_details(person, attr, value)
|
116
117
|
end
|
117
118
|
end
|
118
119
|
|
@@ -126,7 +127,7 @@ module Eco
|
|
126
127
|
person.account.permissions_preset = nil unless person.account.permissions_preset = "custom"
|
127
128
|
scoped_attrs = @emap.account_attrs - into_a(exclude)
|
128
129
|
@internal_entry.slice(*scoped_attrs).each do |attr, value|
|
129
|
-
|
130
|
+
_set_to_account(person, attr, value)
|
130
131
|
end
|
131
132
|
end
|
132
133
|
|
@@ -148,14 +149,50 @@ module Eco
|
|
148
149
|
end
|
149
150
|
end
|
150
151
|
|
152
|
+
def internal_entry
|
153
|
+
@internal_entry
|
154
|
+
end
|
155
|
+
|
156
|
+
def doc
|
157
|
+
return @person.doc if instance_variable_defined?(:@person) && @person
|
158
|
+
|
159
|
+
core_attrs = @emap.core_attrs
|
160
|
+
details_attrs = @emap.details_attrs
|
161
|
+
account_attrs = @emap.account_attrs
|
162
|
+
|
163
|
+
internal_entry.slice(*core_attrs).tap do |core_hash|
|
164
|
+
unless details_attrs.empty?
|
165
|
+
schema_id = @person_parser.schema.id
|
166
|
+
details_fields = @person_parser.schema.doc["fields"].each_with_object([]) do |fld, flds|
|
167
|
+
if details_attrs.include?(fld.alt_id)
|
168
|
+
flds << fld.merge("value" => internal_entry[fld.alt_id]).slice("id", "alt_id", "type", "name", "shared", "multiple", "value")
|
169
|
+
end
|
170
|
+
end
|
171
|
+
core_hash.merge!({
|
172
|
+
"details" => {
|
173
|
+
"schema_id" => schema_id,
|
174
|
+
"fields" => details_fields
|
175
|
+
}
|
176
|
+
})
|
177
|
+
end
|
178
|
+
|
179
|
+
unless account_attrs.empty?
|
180
|
+
account_hash = internal_entry.slice(*account_attrs)
|
181
|
+
core_hash.merge!({
|
182
|
+
"account" => account_hash
|
183
|
+
})
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
151
188
|
private
|
152
189
|
|
153
|
-
def
|
190
|
+
def _set_to_core(person, attr, value)
|
154
191
|
value = value&.downcase if attr == "email"
|
155
192
|
person.send("#{attr}=", value&.strip)
|
156
193
|
end
|
157
194
|
|
158
|
-
def
|
195
|
+
def _set_to_account(person, attr, value)
|
159
196
|
return if !person.account
|
160
197
|
multiple = ["policy_group_ids", "filter_tags"].include?(attr)
|
161
198
|
if multiple
|
@@ -169,7 +206,7 @@ module Eco
|
|
169
206
|
person.account.send("#{attr}=", value)
|
170
207
|
end
|
171
208
|
|
172
|
-
def
|
209
|
+
def _set_to_details(person, attr, value)
|
173
210
|
return if !person.details
|
174
211
|
unless field = person.details.get_field(attr)
|
175
212
|
fatal("Field '#{attr}' does not exist in details of schema: '#{person.details.schema_id}'")
|
@@ -184,18 +221,18 @@ module Eco
|
|
184
221
|
person.details[attr] = value
|
185
222
|
end
|
186
223
|
|
187
|
-
def
|
224
|
+
def _get_from_core (person, attr)
|
188
225
|
person.send(attr)
|
189
226
|
end
|
190
227
|
|
191
|
-
def
|
228
|
+
def _get_from_account (person, attr)
|
192
229
|
return nil if !person.account
|
193
230
|
multiple = ["policy_group_ids", "filter_tags"].include?(attr)
|
194
231
|
value = person.account.send(attr)
|
195
232
|
@person_parser.serialize(:multiple, value) if multiple
|
196
233
|
end
|
197
234
|
|
198
|
-
def
|
235
|
+
def _get_from_details(person, attr)
|
199
236
|
return nil if !person.details || !person&.details&.schema_id
|
200
237
|
unless field = person.details.get_field(attr)
|
201
238
|
fatal("Field '#{attr}' does not exist in details of schema: '#{person.details.schema_id}'")
|
@@ -210,16 +247,16 @@ module Eco
|
|
210
247
|
# To obtain an entry with internal names but external values.
|
211
248
|
# @param data [Hash] external or raw entry (when parsing) or internal or parsed entry (when serializing).
|
212
249
|
# @return [Hash] entry with **internal names** and **external values**.
|
213
|
-
def
|
214
|
-
return
|
215
|
-
|
250
|
+
def _mapped_entry(data)
|
251
|
+
return _aliased_entry(data) if parsing?
|
252
|
+
_serialized_entry(data)
|
216
253
|
end
|
217
254
|
|
218
255
|
# Parsing helper that aliases attribute names (from internal to external names)
|
219
256
|
# @note **Parse**: here we aliase internal attribute names into external ones.
|
220
257
|
# @param ext_entry [Hash] entry in raw, with **external** names and values.
|
221
258
|
# @return [Hash] entry with **internal names** and **external values**.
|
222
|
-
def
|
259
|
+
def _aliased_entry(ext_entry)
|
223
260
|
aliased_hash = @emap.aliased_attrs.map do |attr|
|
224
261
|
[attr, ext_entry[@emap.to_external(attr)]]
|
225
262
|
end.to_h
|
@@ -238,7 +275,7 @@ module Eco
|
|
238
275
|
# 2. when running the serializers, it overrides existing keys.
|
239
276
|
# @param unserialized_entry [Hash] entry with **internal** names and values.
|
240
277
|
# @return [Hash] entry with **internal names** and **external values**.
|
241
|
-
def
|
278
|
+
def _serialized_entry(unserialized_entry)
|
242
279
|
serial_attrs = @person_parser.defined_attrs.reduce({}) do |serial_hash, attr|
|
243
280
|
deps = @deps[attr] || {}
|
244
281
|
serial_attr = @person_parser.serialize(attr, @person, deps: deps)
|
@@ -250,15 +287,15 @@ module Eco
|
|
250
287
|
# To obtain an entry with internal names but external values.
|
251
288
|
# @param data [Hash, Ecoportal::API::V1::Person] alised_entry (when parsing) or person (when serializing).
|
252
289
|
# @return [Hash] the `internal entry` with the **internal** attributes names and values.
|
253
|
-
def
|
254
|
-
return
|
255
|
-
|
290
|
+
def _internal_entry(data)
|
291
|
+
return _parsed_entry(data) if parsing?
|
292
|
+
_unserialized_entry(data)
|
256
293
|
end
|
257
294
|
|
258
295
|
# Parsing helper that just **parses the values** that have a parser/serializer defined.
|
259
296
|
# @param aliased_entry [Hash] the entry with the _internal attribute_ names but the _external values_.
|
260
297
|
# @return [Hash] the `internal entry` with the **internal** attributes names and values.
|
261
|
-
def
|
298
|
+
def _parsed_entry(aliased_entry)
|
262
299
|
parsed = @person_parser.defined_attrs.map do |attr|
|
263
300
|
value = @person_parser.parse(attr, aliased_entry)
|
264
301
|
[attr, value]
|
@@ -274,19 +311,19 @@ module Eco
|
|
274
311
|
# - `core`, `account`, `details`.
|
275
312
|
# @param person [Ecoportal::API::V1::Person] the `Person` object to transform into an _internal entry_.
|
276
313
|
# @return [Hash] the `internal entry` with the **internal** attributes names and values.
|
277
|
-
def
|
314
|
+
def _unserialized_entry(person)
|
278
315
|
core_hash = @person_parser.target_attrs_core.reduce({}) do |hash, attr|
|
279
|
-
value =
|
316
|
+
value = _get_from_core(person, attr)
|
280
317
|
hash.merge(hash_attr(attr, value))
|
281
318
|
end
|
282
319
|
|
283
320
|
details_hash = @person_parser.target_attrs_details.reduce({}) do |hash, attr|
|
284
|
-
value =
|
321
|
+
value = _get_from_details(person, attr)
|
285
322
|
hash.merge(hash_attr(attr, value))
|
286
323
|
end
|
287
324
|
|
288
325
|
account_hash = @person_parser.target_attrs_account.reduce({}) do |hash, attr|
|
289
|
-
value =
|
326
|
+
value = _get_from_account(person, attr)
|
290
327
|
hash.merge(hash_attr(attr, value))
|
291
328
|
end
|
292
329
|
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Ecoportal
|
2
|
+
module API
|
3
|
+
module Common
|
4
|
+
class BaseModel
|
5
|
+
|
6
|
+
attr_reader :initial_doc
|
7
|
+
|
8
|
+
def initialize(doc = {}, parent: self, key: nil)
|
9
|
+
@_parent = parent
|
10
|
+
@_key = key
|
11
|
+
if !_parent || !_key
|
12
|
+
@doc = doc
|
13
|
+
@original_doc = JSON.parse(@doc.to_json)
|
14
|
+
@initial_doc = JSON.parse(@doc.to_json)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def initial_doc
|
19
|
+
raise UnlinkedModel.new unless linked?
|
20
|
+
return @initial_doc if is_root?
|
21
|
+
_parent.initial_doc.dig(*[_key].flatten)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -6,6 +6,7 @@ module Eco
|
|
6
6
|
class TagTree
|
7
7
|
attr_reader :tag, :nodes
|
8
8
|
attr_reader :depth, :path
|
9
|
+
attr_reader :enviro
|
9
10
|
|
10
11
|
# @example Node format:
|
11
12
|
# {"tag": "NODE NAME", "nodes": subtree}
|
@@ -40,6 +41,11 @@ module Eco
|
|
40
41
|
init_hashes
|
41
42
|
end
|
42
43
|
|
44
|
+
# @return [Boolean] `true` if there are tags in the node, `false` otherwise.
|
45
|
+
def empty?
|
46
|
+
@has_tags.empty?
|
47
|
+
end
|
48
|
+
|
43
49
|
# List of tag nodes of the entire subtree.
|
44
50
|
# @return [Array<String>]
|
45
51
|
def tags
|
@@ -4,9 +4,9 @@ module Eco
|
|
4
4
|
class Policy < Eco::API::UseCases::UseCase
|
5
5
|
TYPES = [:transform]
|
6
6
|
|
7
|
-
def initialize(name, type: :transform, root:,
|
7
|
+
def initialize(name, type: :transform, root:, &block)
|
8
8
|
raise "Undefine usecase type #{type}. Please, use any of #{TYPES}" unless self.class.valid_type?(type)
|
9
|
-
super(name, type: type, root: root,
|
9
|
+
super(name, type: type, root: root, &block)
|
10
10
|
end
|
11
11
|
|
12
12
|
def root=(value)
|
data/lib/eco/api/session.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
module Eco
|
2
2
|
module API
|
3
3
|
class Session < Common::Session::BaseSession
|
4
|
-
attr_reader
|
5
|
-
attr_reader
|
6
|
-
attr_reader :schemas
|
4
|
+
attr_reader :batch
|
5
|
+
attr_reader :job_groups
|
7
6
|
attr_accessor :schema
|
8
7
|
|
9
8
|
def initialize(init = {})
|
@@ -21,33 +20,19 @@ module Eco
|
|
21
20
|
|
22
21
|
@use_cases = Eco::API::UseCases::DefaultCases.new.merge(config.usecases)
|
23
22
|
|
24
|
-
|
25
|
-
self.schema = config.people.default_schema || @schemas.first
|
23
|
+
self.schema = config.people.default_schema || schemas.first
|
26
24
|
@policy_groups = config.policy_groups
|
27
25
|
|
28
|
-
@tagtree = nil
|
29
|
-
if tree_file = config.dig('org', 'tagtree')
|
30
|
-
tree = file_manager.load_json(tree_file) unless !tree_file
|
31
|
-
@tagtree = Eco::API::Organization::TagTree.new(tree, enviro: enviro)
|
32
|
-
end
|
33
|
-
|
34
26
|
presets_custom_file = config.people.presets_custom
|
35
27
|
presets_map_file = config.people.presets_map
|
36
28
|
|
37
29
|
@presets_factory = Eco::API::Organization::PresetsFactory.new({
|
38
|
-
#policy_groups: @policy_groups,
|
39
30
|
presets_custom: file_manager.dir.file(presets_custom_file, should_exist: true),
|
40
31
|
presets_map: file_manager.dir.file(presets_map_file, should_exist: true),
|
41
32
|
enviro: enviro
|
42
33
|
})
|
43
34
|
end
|
44
35
|
|
45
|
-
def self.configure
|
46
|
-
Session::Config.new.tap do |conf|
|
47
|
-
yield(conf) if block_given?
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
36
|
# TASKS & JOBS
|
52
37
|
def do
|
53
38
|
@task
|
@@ -71,27 +56,22 @@ module Eco
|
|
71
56
|
end
|
72
57
|
end
|
73
58
|
|
74
|
-
def
|
75
|
-
|
76
|
-
when job_groups.exists?(name)
|
77
|
-
job_groups[name]
|
78
|
-
else
|
79
|
-
job_groups.new(name, order: order)
|
80
|
-
end
|
59
|
+
def policy_groups
|
60
|
+
config.policy_groups
|
81
61
|
end
|
82
62
|
|
83
|
-
def
|
84
|
-
|
63
|
+
def tagtree
|
64
|
+
config.tagtree(enviro: enviro)
|
85
65
|
end
|
86
66
|
|
87
|
-
def
|
88
|
-
|
67
|
+
def schemas
|
68
|
+
config.schemas
|
89
69
|
end
|
90
70
|
|
91
71
|
def schema=(value)
|
92
72
|
case value
|
93
73
|
when String
|
94
|
-
unless @schema =
|
74
|
+
unless @schema = schemas.schema(value)
|
95
75
|
fatal "The schema with id or name '#{value}' does not exist"
|
96
76
|
end
|
97
77
|
when Ecoportal::API::V1::PersonSchema
|
@@ -167,6 +147,19 @@ module Eco
|
|
167
147
|
@use_cases.case(name, type: type).launch(**args)
|
168
148
|
end
|
169
149
|
|
150
|
+
def job_group(name, order: :last)
|
151
|
+
case
|
152
|
+
when job_groups.exists?(name)
|
153
|
+
job_groups[name]
|
154
|
+
else
|
155
|
+
job_groups.new(name, order: order)
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def jobs_launch(simulate: false)
|
160
|
+
job_groups.launch(simulate: simulate)
|
161
|
+
end
|
162
|
+
|
170
163
|
end
|
171
164
|
end
|
172
165
|
end
|
@@ -50,7 +50,7 @@ module Eco
|
|
50
50
|
entries = status.queue
|
51
51
|
puts "\n"
|
52
52
|
entries.each_with_index do |entry, i|
|
53
|
-
if (i %
|
53
|
+
if (i % 10 == 0)
|
54
54
|
percent = i * 100 / entries.length
|
55
55
|
print "Searching: #{percent.round}% (#{i}/#{entries.length} entries)\r"
|
56
56
|
$stdout.flush
|
@@ -107,7 +107,7 @@ module Eco
|
|
107
107
|
people += people_res
|
108
108
|
|
109
109
|
total_iterations ||= response.body["total_pages"]
|
110
|
-
no_pages
|
110
|
+
no_pages = !response.body["total_pages"]
|
111
111
|
total_results ||= response.body["total_results"]
|
112
112
|
|
113
113
|
if !total_iterations
|
@@ -115,6 +115,7 @@ module Eco
|
|
115
115
|
end
|
116
116
|
|
117
117
|
msg = "iteration number: #{page}/#{total_iterations}, got num people #{people_res.length}, with total #{people.length} people got"
|
118
|
+
msg = "search(q=#{params[:q]}) " + msg if params.key?(:q)
|
118
119
|
logger.info(msg) unless silent
|
119
120
|
|
120
121
|
iterate = (no_pages && results_from = response.body["next_results_from"]) || (looping && page < total_iterations)
|