eco-helpers 3.0.4 → 3.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -0
- data/CHANGELOG.md +55 -4
- data/eco-helpers.gemspec +1 -1
- data/lib/eco/api/common/class_helpers.rb +24 -23
- data/lib/eco/api/common/class_meta_basics.rb +0 -2
- data/lib/eco/api/common/loaders/use_case.rb +1 -0
- data/lib/eco/api/common/people/entry_factory.rb +6 -4
- data/lib/eco/api/common/people/person_entry.rb +4 -6
- data/lib/eco/api/common/people/person_entry_attribute_mapper.rb +25 -12
- data/lib/eco/api/common/people/person_parser.rb +8 -0
- data/lib/eco/api/common/session/base_session.rb +1 -1
- data/lib/eco/api/common/session/environment.rb +7 -0
- data/lib/eco/api/common/session/file_manager.rb +15 -8
- data/lib/eco/api/common/session/logger/cache.rb +14 -10
- data/lib/eco/api/common/session/logger/log.rb +8 -7
- data/lib/eco/api/common/session/mailer.rb +22 -13
- data/lib/eco/api/common/session/s3_uploader.rb +29 -20
- data/lib/eco/api/microcases/people_search.rb +1 -1
- data/lib/eco/api/organization/login_providers.rb +11 -4
- data/lib/eco/api/organization/node_classifications.rb +3 -0
- data/lib/eco/api/organization/presets_factory.rb +37 -31
- data/lib/eco/api/organization/tag_tree.rb +14 -5
- data/lib/eco/api/policies/default_policies/99_user_access_policy.rb +28 -18
- data/lib/eco/api/session/batch/errors.rb +38 -20
- data/lib/eco/api/session/batch/job.rb +252 -135
- data/lib/eco/api/session/batch/status.rb +55 -36
- data/lib/eco/api/session/batch.rb +2 -2
- data/lib/eco/api/session/config/base_config.rb +12 -11
- data/lib/eco/api/session/config/tagtree.rb +10 -14
- data/lib/eco/api/session/config/workflow.rb +15 -3
- data/lib/eco/api/session/config.rb +19 -26
- data/lib/eco/api/session.rb +13 -4
- data/lib/eco/api/usecases/cli.rb +4 -0
- data/lib/eco/api/usecases/default/locations/cli/codes_to_tags_cli.rb +18 -0
- data/lib/eco/api/usecases/default/locations/cli/csv_to_tree_cli.rb +12 -0
- data/lib/eco/api/usecases/default/locations/cli/tagtree_paths_cli.rb +12 -0
- data/lib/eco/api/usecases/default/locations/codes_to_tags_case.rb +32 -13
- data/lib/eco/api/usecases/default/locations/csv_to_tree_case.rb +15 -5
- data/lib/eco/api/usecases/default/locations/tagtree_extract_case.rb +6 -0
- data/lib/eco/api/usecases/default/locations/tagtree_paths_case.rb +51 -0
- data/lib/eco/api/usecases/default/locations.rb +1 -1
- data/lib/eco/api/usecases/default/people/amend/cli/reinvite_sync_cli.rb +8 -0
- data/lib/eco/api/usecases/default/people/amend/cli/reinvite_trans_cli.rb +11 -0
- data/lib/eco/api/usecases/default/people/amend/cli/restore_db_cli.rb +26 -0
- data/lib/eco/api/usecases/default/people/amend/reinvite_sync_case.rb +2 -0
- data/lib/eco/api/usecases/default/people/amend/reinvite_trans_case.rb +2 -0
- data/lib/eco/api/usecases/default/people/amend/restore_db_case.rb +3 -0
- data/lib/eco/api/usecases/default/people/treat/analyse_people_case.rb +15 -5
- data/lib/eco/api/usecases/default/people/treat/cli/analyse_people_cli.rb +66 -0
- data/lib/eco/api/usecases/default/people/treat/cli/org_data_convert_cli.rb +35 -0
- data/lib/eco/api/usecases/default/people/treat/cli/supers_cyclic_identify_cli.rb +15 -0
- data/lib/eco/api/usecases/default/people/treat/cli/supers_hierachy_cli.rb +15 -0
- data/lib/eco/api/usecases/default/people/treat/org_data_convert_case.rb +11 -5
- data/lib/eco/api/usecases/default/people/treat/supers_cyclic_identify_case.rb +28 -7
- data/lib/eco/api/usecases/default/people/treat/supers_hierarchy_case.rb +32 -9
- data/lib/eco/api/usecases/default/people/utils/set_default_tag_case.rb +2 -1
- data/lib/eco/api/usecases/default_cases/to_csv_case.rb +2 -2
- data/lib/eco/api/usecases/graphql/helpers/base/case_env.rb +1 -0
- data/lib/eco/api/usecases/graphql/helpers/base/error_handling.rb +52 -0
- data/lib/eco/api/usecases/graphql/helpers/base.rb +1 -0
- data/lib/eco/api/usecases/graphql/helpers/location/base/classifications_parser.rb +5 -0
- data/lib/eco/api/usecases/graphql/helpers/location/command/diffs/stages/commandable.rb +2 -0
- data/lib/eco/api/usecases/graphql/helpers/location/command/diffs/stages/diff_sortable.rb +2 -0
- data/lib/eco/api/usecases/graphql/helpers/location/command/result.rb +2 -1
- data/lib/eco/api/usecases/graphql/helpers/location/command/results.rb +3 -0
- data/lib/eco/api/usecases/graphql/helpers/location/command.rb +1 -0
- data/lib/eco/api/usecases/graphql/helpers/location/tags_remap.rb +3 -0
- data/lib/eco/api/usecases/graphql/samples/location/command/dsl.rb +19 -18
- data/lib/eco/api/usecases/graphql/samples/location/command/results.rb +1 -7
- data/lib/eco/api/usecases/graphql/samples/location/command/service/tree_update.rb +11 -6
- data/lib/eco/api/usecases/graphql/samples/location/command/track_changed_ids.rb +3 -8
- data/lib/eco/api/usecases/graphql/samples/location/service/tree_diff/convertible/parsing/classifications.rb +2 -0
- data/lib/eco/api/usecases/graphql/samples/location/service/tree_diff/convertible.rb +5 -2
- data/lib/eco/api/usecases/graphql/samples/location/service/tree_diff.rb +10 -4
- data/lib/eco/api/usecases/graphql/samples/location/service/tree_to_list/converter/parser.rb +6 -2
- data/lib/eco/api/usecases/graphql/samples/location/service/tree_to_list/converter.rb +2 -0
- data/lib/eco/api/usecases/graphql/samples/location/service/tree_to_list.rb +5 -3
- data/lib/eco/api/usecases/ooze_cases/export_register_case.rb +1 -0
- data/lib/eco/api/usecases/ooze_samples/helpers_migration/copying.rb +66 -29
- data/lib/eco/api/usecases/ooze_samples/ooze_base_case.rb +25 -3
- data/lib/eco/api/usecases/ooze_samples/register_update_case.rb +10 -0
- data/lib/eco/api/usecases/use_case.rb +3 -1
- data/lib/eco/cli/config/use_cases.rb +4 -0
- data/lib/eco/cli/scripting/args_helpers.rb +3 -2
- data/lib/eco/cli/scripting/argument.rb +2 -2
- data/lib/eco/cli_default/input.rb +49 -45
- data/lib/eco/cli_default/input_filters.rb +32 -17
- data/lib/eco/cli_default/options.rb +8 -4
- data/lib/eco/cli_default/people.rb +1 -1
- data/lib/eco/cli_default/people_filters.rb +32 -24
- data/lib/eco/cli_default/usecases.rb +8 -121
- data/lib/eco/cli_default/workflow.rb +6 -4
- data/lib/eco/csv/split.rb +2 -0
- data/lib/eco/csv/table.rb +13 -0
- data/lib/eco/data/files/encoding.rb +15 -8
- data/lib/eco/data/files/helpers.rb +6 -2
- data/lib/eco/data/hashes/diff_result.rb +5 -0
- data/lib/eco/data/locations/node_diff/nodes_diff.rb +13 -0
- data/lib/eco/data/locations/node_diff.rb +4 -0
- data/lib/eco/data/locations/node_level.rb +6 -0
- data/lib/eco/language/auxiliar_logger.rb +2 -0
- data/lib/eco/version.rb +1 -1
- data/lib/eco-helpers.rb +1 -1
- metadata +16 -6
- data/lib/eco/api/usecases/default/locations/create_tag_paths_case.rb +0 -25
- data/lib/eco/api/usecases/default/people/amend/reinvite_trans_cli.rb +0 -4
@@ -14,6 +14,7 @@ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders:
|
|
14
14
|
def main(_session, options, _usecase)
|
15
15
|
options[:end_get] = false
|
16
16
|
raise "You need to inherit from this class ('#{self.class}') and call super with a block" unless block_given?
|
17
|
+
|
17
18
|
@target = nil
|
18
19
|
yield
|
19
20
|
end
|
@@ -22,6 +23,7 @@ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders:
|
|
22
23
|
def process_ooze(ooz = target)
|
23
24
|
ooz ||= ooze
|
24
25
|
raise "You need to inherit from this class ('#{self.class}') and call super with a block" unless block_given?
|
26
|
+
|
25
27
|
yield(ooz)
|
26
28
|
update_ooze(ooz)
|
27
29
|
end
|
@@ -33,15 +35,18 @@ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders:
|
|
33
35
|
end
|
34
36
|
|
35
37
|
def create_page(page = nil, template_id: nil, retrieve: false)
|
36
|
-
template_id = template_id.id
|
37
|
-
template_id ||= page.template_id
|
38
|
+
template_id = template_id.id if template_id.is_a?(Ecoportal::API::V2::Page)
|
39
|
+
template_id ||= page.template_id if page.respond_to?(:template_id)
|
38
40
|
template_id ||= page["template_id"] if page.is_a?(Hash)
|
39
|
-
page = new_page(template_id)
|
41
|
+
page = new_page(template_id) unless page || !template_id
|
42
|
+
|
40
43
|
yield(page) if block_given?
|
44
|
+
|
41
45
|
reference = apiv2.pages.create(page, from: template_id)
|
42
46
|
ooze_id = reference.page_id
|
43
47
|
stage_id = reference.active_stage_id
|
44
48
|
return [ooze_id, stage_id] unless retrieve
|
49
|
+
|
45
50
|
ooze(ooze_id, stage_id: stage_id)
|
46
51
|
end
|
47
52
|
|
@@ -49,6 +54,7 @@ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders:
|
|
49
54
|
unless section.is_a?(Ecoportal::API::V2::Page::Section)
|
50
55
|
raise "You need to specify a section for a new field. Given: #{section.class}"
|
51
56
|
end
|
57
|
+
|
52
58
|
entry.components.add(doc: doc) do |field|
|
53
59
|
section.add_component(field, after: after, before: before, side: side)
|
54
60
|
end.tap do |field|
|
@@ -60,6 +66,7 @@ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders:
|
|
60
66
|
unless section.is_a?(Ecoportal::API::V2::Page::Section)
|
61
67
|
raise "You need to specify a section for a new field. Given: #{section.class}"
|
62
68
|
end
|
69
|
+
|
63
70
|
entry.components.add(label: name, type: type) do |field|
|
64
71
|
section.add_component(field, after: after, before: before, side: side)
|
65
72
|
end.tap do |field|
|
@@ -69,6 +76,7 @@ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders:
|
|
69
76
|
|
70
77
|
def with_fields(entry = target, type: nil, label: nil)
|
71
78
|
flds = entry.components
|
79
|
+
|
72
80
|
if type
|
73
81
|
if flds.respond_to?(:get_by_type)
|
74
82
|
flds = flds.get_by_type(type)
|
@@ -76,6 +84,7 @@ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders:
|
|
76
84
|
flds = flds.select {|fld| fld.type == type}
|
77
85
|
end
|
78
86
|
end
|
87
|
+
|
79
88
|
flds.select do |fld|
|
80
89
|
value = label == :unnamed ? nil : label
|
81
90
|
!label || same_string?(fld.label, value)
|
@@ -87,6 +96,7 @@ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders:
|
|
87
96
|
def with_sections(entry = target, type: nil, heading: nil)
|
88
97
|
secs = entry.sections
|
89
98
|
secs = secs.get_by_type(type) if type
|
99
|
+
|
90
100
|
secs.select do |sec|
|
91
101
|
value = heading == :unnamed ? nil : heading
|
92
102
|
!heading || same_string?(sec.heading, value)
|
@@ -97,6 +107,7 @@ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders:
|
|
97
107
|
|
98
108
|
def with_stage(name:)
|
99
109
|
return unless (stage = target.stages.get_by_name(name))
|
110
|
+
|
100
111
|
yield(stage) if block_given?
|
101
112
|
stage
|
102
113
|
end
|
@@ -110,7 +121,9 @@ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders:
|
|
110
121
|
|
111
122
|
def ooze(ooze_id = nil, stage_id: nil)
|
112
123
|
return target unless ooze_id
|
124
|
+
|
113
125
|
before_loading_new_target(ooze_id)
|
126
|
+
|
114
127
|
apiv2.pages.get(ooze_id, stage_id: stage_id).tap do |ooze|
|
115
128
|
if ooze
|
116
129
|
new_target(ooze)
|
@@ -130,7 +143,9 @@ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders:
|
|
130
143
|
|
131
144
|
if (stg = ooze.stages[id_name] || ooze.stages.get_by_name(id_name))
|
132
145
|
return ooze if ooze.respond_to?(:current_stage_id) && (ooze.current_stage_id == stg.id)
|
146
|
+
|
133
147
|
before_loading_new_target(ooze_id)
|
148
|
+
|
134
149
|
return apiv2.pages.get(ooze_id, stage_id: stg.id).tap do |stage|
|
135
150
|
if stage
|
136
151
|
new_target(stage)
|
@@ -142,6 +157,7 @@ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders:
|
|
142
157
|
end
|
143
158
|
end
|
144
159
|
end
|
160
|
+
|
145
161
|
exit_error "Stage '#{id_name}' doesn't exist in ooze '#{ooze_id}'"
|
146
162
|
end
|
147
163
|
|
@@ -178,8 +194,10 @@ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders:
|
|
178
194
|
msg += " after doing unsaved changes to #{object_reference(target)}"
|
179
195
|
log(:warn) { msg }
|
180
196
|
end
|
197
|
+
|
181
198
|
yield(target) if block_given?
|
182
199
|
end
|
200
|
+
|
183
201
|
@target = object
|
184
202
|
end
|
185
203
|
|
@@ -206,6 +224,7 @@ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders:
|
|
206
224
|
def display_patch(entry = target)
|
207
225
|
return if options.dig(:feedback, :only_stats)
|
208
226
|
return unless (patch = (patch_doc(entry) || {})["page"])
|
227
|
+
|
209
228
|
pp patch
|
210
229
|
end
|
211
230
|
|
@@ -222,12 +241,15 @@ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders:
|
|
222
241
|
entry.validate.tap do |validation|
|
223
242
|
log(:error) { validation } if validation.is_a?(String)
|
224
243
|
end
|
244
|
+
|
225
245
|
display_patch(entry)
|
226
246
|
backup_patch!(entry)
|
247
|
+
|
227
248
|
if dirty?(entry) && dry_count > self.class::DRY_COUNT
|
228
249
|
log(:info) { "Reached #{self.class::DRY_COUNT} dry-run samples." }
|
229
250
|
exit(0)
|
230
251
|
end
|
252
|
+
|
231
253
|
false
|
232
254
|
end
|
233
255
|
|
@@ -49,6 +49,7 @@ class Eco::API::UseCases::OozeSamples::RegisterUpdateCase < Eco::API::UseCases::
|
|
49
49
|
|
50
50
|
def before_loading_new_target(ooze_id)
|
51
51
|
return unless (pending = queue_shift(ooze_id))
|
52
|
+
|
52
53
|
update_ooze(pending).tap do |result|
|
53
54
|
if result.is_a?(Ecoportal::API::Common::Response)
|
54
55
|
if result.success?
|
@@ -83,6 +84,7 @@ class Eco::API::UseCases::OozeSamples::RegisterUpdateCase < Eco::API::UseCases::
|
|
83
84
|
log(:warn) { msg }
|
84
85
|
update_ooze(pending)
|
85
86
|
end
|
87
|
+
|
86
88
|
if (ooz = ooze(page_result.id))
|
87
89
|
@retrieved_oozes += 1
|
88
90
|
yield(ooz)
|
@@ -97,9 +99,11 @@ class Eco::API::UseCases::OozeSamples::RegisterUpdateCase < Eco::API::UseCases::
|
|
97
99
|
|
98
100
|
def enqueue(object)
|
99
101
|
return unless object.respond_to?(:id)
|
102
|
+
|
100
103
|
unless object.is_a?(Ecoportal::API::V2::Page) or object.is_a?(Ecoportal::API::V2::Pages::PageStage)
|
101
104
|
raise "Queuing is just for entries. Expecting Page or PageStage. Given: #{object.class}"
|
102
105
|
end
|
106
|
+
|
103
107
|
if (elem = queue_get(object.id))
|
104
108
|
msg = "Something is wrong. Native case 'RegisterUpdateCase' is "
|
105
109
|
if (elem != object) && dirty?(elem)
|
@@ -131,7 +135,9 @@ class Eco::API::UseCases::OozeSamples::RegisterUpdateCase < Eco::API::UseCases::
|
|
131
135
|
|
132
136
|
def batched_search_results
|
133
137
|
raise "Missing block. It yields in slices of #{self.class.batch_size} results" unless block_given?
|
138
|
+
|
134
139
|
results_preview
|
140
|
+
|
135
141
|
results = []
|
136
142
|
apiv2.registers.search(register_id, search_options) do |page_result|
|
137
143
|
results << page_result
|
@@ -140,6 +146,7 @@ class Eco::API::UseCases::OozeSamples::RegisterUpdateCase < Eco::API::UseCases::
|
|
140
146
|
results = []
|
141
147
|
end
|
142
148
|
end
|
149
|
+
|
143
150
|
yield(results) unless results.empty?
|
144
151
|
end
|
145
152
|
|
@@ -180,6 +187,7 @@ class Eco::API::UseCases::OozeSamples::RegisterUpdateCase < Eco::API::UseCases::
|
|
180
187
|
|
181
188
|
def backup_patch!(ooze = target)
|
182
189
|
return if (patch_doc(ooze) || {})["page"]
|
190
|
+
|
183
191
|
log(:info) {
|
184
192
|
"No changes to update for #{object_reference(ooze)}."
|
185
193
|
}
|
@@ -188,8 +196,10 @@ class Eco::API::UseCases::OozeSamples::RegisterUpdateCase < Eco::API::UseCases::
|
|
188
196
|
def results_preview
|
189
197
|
apiv2.registers.search(register_id, search_options.merge(only_first: true)).tap do |search_results|
|
190
198
|
@total_search_oozes = search_results.total
|
199
|
+
|
191
200
|
str_results = "Total target entries: #{search_results.total} (out of #{search_results.total_before_filtering})"
|
192
201
|
default_answer = session.config.run_mode_remote?? "Y" : "N"
|
202
|
+
|
193
203
|
session.prompt_user(
|
194
204
|
"Do you want to proceed (y/N):",
|
195
205
|
explanation: str_results,
|
@@ -58,7 +58,9 @@ module Eco
|
|
58
58
|
|
59
59
|
UseCaseIO.new(**kargs).tap do |uio|
|
60
60
|
@options = uio.options
|
61
|
-
uio.session.
|
61
|
+
uio.session.log(:debug) {
|
62
|
+
"#{self.class}: going to process '#{name}'"
|
63
|
+
}
|
62
64
|
|
63
65
|
set_session_n_options(uio) if callback_from_loader?
|
64
66
|
|
@@ -28,13 +28,16 @@ module Eco
|
|
28
28
|
# @return [String] summary of the use cases.
|
29
29
|
def help(refine: nil)
|
30
30
|
refinement = refine.is_a?(String)? " (containing: '#{refine}')" : ""
|
31
|
+
|
31
32
|
["The following are the available use cases#{refinement}:"].then do |lines|
|
32
33
|
max_len = keys_max_len(@linked_cases.keys)
|
34
|
+
|
33
35
|
@linked_cases.keys.sort.select do |key|
|
34
36
|
!refine.is_a?(String) || key.include?(refine)
|
35
37
|
end.each do |option_case|
|
36
38
|
lines << help_line(option_case, @linked_cases[option_case].description, max_len)
|
37
39
|
end
|
40
|
+
|
38
41
|
lines
|
39
42
|
end.join("\n")
|
40
43
|
end
|
@@ -150,6 +153,7 @@ module Eco
|
|
150
153
|
|
151
154
|
def validate_io!(io)
|
152
155
|
return if io.is_a?(Eco::API::UseCases::BaseIO)
|
156
|
+
|
153
157
|
raise ArgumentError, "You need to provide Eco::API::UseCases::BaseIO object. Given: #{io.class}"
|
154
158
|
end
|
155
159
|
end
|
@@ -30,7 +30,8 @@ module Eco
|
|
30
30
|
all_available: all_available
|
31
31
|
}
|
32
32
|
unknown = arguments.unknown(**args) do |key, correct|
|
33
|
-
suggestions[key] = correct unless correct.empty?
|
33
|
+
next suggestions[key] = correct unless correct.empty?
|
34
|
+
suggstions[key] = '-- not known similar options! --'
|
34
35
|
end
|
35
36
|
unknown = unknown.select {|arg| is_modifier?(arg)} if only_options
|
36
37
|
|
@@ -38,7 +39,7 @@ module Eco
|
|
38
39
|
|
39
40
|
suggestions_str = suggestions.slice(*unknown).map do |key, correct|
|
40
41
|
str = "Unknown option '#{key}'."
|
41
|
-
str_corr = correct.map {|
|
42
|
+
str_corr = correct.map {|ky| "'#{ky}'"}
|
42
43
|
str << " Did you mean: #{str_corr.join(', ')}" unless correct.empty?
|
43
44
|
str
|
44
45
|
end.join("\n * ")
|
@@ -2,12 +2,11 @@ module Eco
|
|
2
2
|
class CLI
|
3
3
|
class Scripting
|
4
4
|
class Argument
|
5
|
-
|
6
5
|
attr_reader :key
|
7
6
|
|
8
7
|
class << self
|
9
8
|
def is_modifier?(value)
|
10
|
-
|
9
|
+
value&.start_with?("-")
|
11
10
|
end
|
12
11
|
end
|
13
12
|
|
@@ -19,6 +18,7 @@ module Eco
|
|
19
18
|
def args_slice(*args)
|
20
19
|
#pp "known arg '#{key}' => included? #{args.include?(key)}"
|
21
20
|
return args unless args.include?(key)
|
21
|
+
|
22
22
|
i = args.index(key)
|
23
23
|
j = with_param?? i+1 : i
|
24
24
|
args - args.slice(i..j)
|
@@ -21,61 +21,65 @@ ASSETS.cli.config do |cnf|
|
|
21
21
|
|
22
22
|
cnf.input(default_option: "-entries-from") do |session, str_opt, options|
|
23
23
|
input = []
|
24
|
-
if SCR.get_arg(str_opt)
|
25
|
-
file = SCR.get_file(str_opt, required: true)
|
26
24
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
next matched if matched
|
31
|
-
next frm if used
|
32
|
-
end
|
25
|
+
next input unless SCR.get_arg(str_opt)
|
26
|
+
|
27
|
+
file = SCR.get_file(str_opt, required: true)
|
33
28
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
29
|
+
# Command line check
|
30
|
+
format = formats.reduce(nil) do |matched, (frm, selectors)|
|
31
|
+
used = selectors[:option].reduce(false) {|us, option| SCR.get_arg(option) || us}
|
32
|
+
next matched if matched
|
33
|
+
next frm if used
|
34
|
+
end
|
35
|
+
|
36
|
+
# File/Folder check
|
37
|
+
file = File.expand_path(file)
|
38
|
+
if File.directory?(file)
|
39
|
+
folder = file
|
40
|
+
file = Dir.glob("#{file}/*").reject {|f| File.directory?(f)}
|
41
|
+
ext = (format && formats[format][:extname]) || [File.extname(file.first)]
|
42
|
+
file = file.select {|f| ext.any? {|e| File.extname(f) == e}}.tap do |files|
|
43
|
+
if files.empty?
|
44
|
+
session.log(:error) {
|
45
|
+
"Could not find any file with extension: #{ext} in folder '#{folder}'"
|
46
|
+
}
|
47
|
+
exit(1)
|
45
48
|
end
|
46
|
-
else
|
47
|
-
ext = File.extname(file)
|
48
49
|
end
|
50
|
+
else
|
51
|
+
ext = File.extname(file)
|
52
|
+
end
|
49
53
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
54
|
+
format ||= formats.reduce(nil) do |matched, (frm, selectors)|
|
55
|
+
next matched if matched
|
56
|
+
next frm if selectors[:extname].any? {|e| ext == e}
|
57
|
+
end
|
58
|
+
format ||= :csv
|
55
59
|
|
56
|
-
|
57
|
-
|
60
|
+
options.deep_merge!(input: {file: {name: file}})
|
61
|
+
options.deep_merge!(input: {file: {format: format}})
|
58
62
|
|
59
|
-
|
63
|
+
encoding = options.dig(:input, :file, :encoding)
|
60
64
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
end
|
73
|
-
else # :csv
|
74
|
-
kargs = {check_headers: true}
|
75
|
-
kargs.merge!(encoding: encoding) if encoding
|
76
|
-
input = session.csv_entries(file, **kargs)
|
65
|
+
case format
|
66
|
+
when :xml
|
67
|
+
[file].flatten.each {|f| session.config.files.validate(:xml, f)}
|
68
|
+
kargs = {file: file, format: format}
|
69
|
+
kargs.merge!(encoding: encoding) if encoding
|
70
|
+
input = session.entries(**kargs)
|
71
|
+
when :xls
|
72
|
+
input = session.entries(file: file, format: format)
|
73
|
+
when :json
|
74
|
+
input = [file].flatten.reduce(Eco::API::Organization::People.new([])) do |people, filename|
|
75
|
+
people.merge(JSON.parse(File.read(filename)))
|
77
76
|
end
|
77
|
+
else # :csv
|
78
|
+
kargs = {check_headers: true}
|
79
|
+
kargs.merge!(encoding: encoding) if encoding
|
80
|
+
input = session.csv_entries(file, **kargs)
|
78
81
|
end
|
82
|
+
|
79
83
|
input
|
80
84
|
end
|
81
85
|
end
|
@@ -1,47 +1,62 @@
|
|
1
1
|
ASSETS.cli.config do |cnf|
|
2
2
|
cnf.input_filters do |filters|
|
3
|
-
|
4
|
-
filters.add("-input-filter-tags-all",
|
3
|
+
desc = "only those that have ALL the specified tags separated by '|'"
|
4
|
+
filters.add("-input-filter-tags-all", desc) do |input, session, options|
|
5
5
|
tags = SCR.get_arg("-input-filter-tags-all", with_param: true).upcase.split("|")
|
6
|
+
|
6
7
|
options.deep_merge!(input: {filter: {filter_tags: {all: tags}}})
|
8
|
+
|
7
9
|
input.filter_tags_all(tags).tap do |filtered|
|
8
|
-
msg
|
9
|
-
|
10
|
+
msg = "Filtered #{filtered.count} entries (out of #{input.count})"
|
11
|
+
msg << " with 'all' filter_tags #{tags}"
|
12
|
+
session.log(:info) { msg }
|
10
13
|
end
|
11
14
|
end
|
12
15
|
|
13
|
-
|
16
|
+
desc = "only those that have ANY the specified tags separated by '|'"
|
17
|
+
filters.add("-input-filter-tags-any", desc) do |input, session, options|
|
14
18
|
tags = SCR.get_arg("-input-filter-tags-any", with_param: true).upcase.split("|")
|
19
|
+
|
15
20
|
options.deep_merge!(input: {filter: {filter_tags: {any: tags}}})
|
21
|
+
|
16
22
|
input.filter_tags_any(tags).tap do |filtered|
|
17
|
-
msg
|
18
|
-
|
23
|
+
msg = "Filtered #{filtered.count} entries (out of #{input.count})"
|
24
|
+
msg << " with 'any' filter_tags #{tags}"
|
25
|
+
session.log(:info) { msg }
|
19
26
|
end
|
20
27
|
end
|
21
28
|
|
22
|
-
|
29
|
+
desc = "only those that have ANY tag in the specified subtrees separated by '|'"
|
30
|
+
filters.add("-input-filter-tags-tree", desc) do |input, session, options|
|
23
31
|
top_tags = SCR.get_arg("-input-filter-tags-tree", with_param: true).upcase.split("|")
|
24
|
-
tags = top_tags.each_with_object([]) do |top,
|
25
|
-
|
32
|
+
tags = top_tags.each_with_object([]) do |top, tgs|
|
33
|
+
tgs.concat(session.tagtree.node(top).tags)
|
26
34
|
end.uniq
|
35
|
+
|
27
36
|
options.deep_merge!(input: {filter: {filter_tags: {tree: top_tags, any: tags}}})
|
37
|
+
|
28
38
|
input.filter_tags_any(tags).tap do |filtered|
|
29
|
-
msg
|
30
|
-
|
39
|
+
msg = "Filtered #{filtered.count} entries (out of #{input.count})"
|
40
|
+
msg << " with 'any' filter_tags in subtrees #{top_tags}"
|
41
|
+
session.log(:info) { msg }
|
31
42
|
end
|
32
43
|
end
|
33
44
|
|
34
|
-
|
45
|
+
desc = "only those that do not have 'id' or 'external_id' specified"
|
46
|
+
filters.add("-input-no-id", desc) do |input, _sess, options|
|
35
47
|
options.deep_merge!(input: {filter: {external_id: nil}})
|
48
|
+
|
36
49
|
input.select do |entry|
|
37
|
-
|
38
|
-
end.
|
50
|
+
entry.id || entry.external_id
|
51
|
+
end.then do |filtered|
|
39
52
|
input.newFrom filtered
|
40
53
|
end
|
41
54
|
end
|
42
55
|
|
43
|
-
|
44
|
-
|
56
|
+
desc = "only those with certain supervisor id or external_id"
|
57
|
+
filters.add("-input-supervisor-id", desc) do |input, _sess, options|
|
58
|
+
id = SCR.get_arg("-input-supervisor-id", with_param: true)
|
59
|
+
|
45
60
|
options.deep_merge!(input: {filter: {supervisor_id: id}})
|
46
61
|
#unless sup = entries.find({"id" => id, "external_id" => id})
|
47
62
|
# raise "Could not find anyone in the input with that id '#{id}'"
|
@@ -7,18 +7,22 @@ ASSETS.cli.config do |cnf| # rubocop:disable Metrics/BlockLength
|
|
7
7
|
if (there = SCR.get_arg(opt))
|
8
8
|
refine = SCR.get_arg(opt, with_param: true)
|
9
9
|
end
|
10
|
+
|
10
11
|
refine || there
|
11
12
|
end
|
12
13
|
|
13
14
|
if (hpf = active.call("-filters"))
|
14
15
|
puts conf.people_filters.help(refine: hpf)
|
15
16
|
end
|
17
|
+
|
16
18
|
if (hif = active.call("-input-filters"))
|
17
19
|
puts conf.input_filters.help(refine: hif)
|
18
20
|
end
|
21
|
+
|
19
22
|
if (ho = active.call("-options"))
|
20
23
|
puts conf.options_set.help(refine: ho)
|
21
24
|
end
|
25
|
+
|
22
26
|
if (huc = active.call("-usecases"))
|
23
27
|
puts conf.usecases.help(refine: huc)
|
24
28
|
end
|
@@ -64,13 +68,13 @@ ASSETS.cli.config do |cnf| # rubocop:disable Metrics/BlockLength
|
|
64
68
|
|
65
69
|
unless sch_id
|
66
70
|
msg = "You need to specify a correct schema id or name. '#{sch_name}' does not exist"
|
67
|
-
session.
|
71
|
+
session.log(:error) { msg }
|
68
72
|
exit(1)
|
69
73
|
end
|
70
|
-
|
71
74
|
options.deep_merge!(people: {filter: {details: {schema_id: sch_id}}})
|
72
|
-
session.
|
73
|
-
|
75
|
+
session.log(:info) {
|
76
|
+
"Setting schema #{session.schemas.to_name(sch_id)}"
|
77
|
+
}
|
74
78
|
session.schema = sch_id
|
75
79
|
end
|
76
80
|
|
@@ -24,7 +24,7 @@ ASSETS.cli.config do |cnf|
|
|
24
24
|
msg = "(Optimization) "
|
25
25
|
msg << "Switching from partial to full people download. "
|
26
26
|
msg << "Input (#{input.count}) surpases MAX_GET_PARTIAL (#{MAX_GET_PARTIAL}) entries."
|
27
|
-
session.
|
27
|
+
session.log(:info) { msg }
|
28
28
|
|
29
29
|
options.deep_merge!(people: {
|
30
30
|
get: {
|
@@ -1,22 +1,21 @@
|
|
1
|
-
ASSETS.cli.config do |cnf|
|
2
|
-
cnf.people_filters do |filters|
|
3
|
-
|
4
|
-
filters.add("-only-users", "only those with account") do |people, session, options|
|
1
|
+
ASSETS.cli.config do |cnf| # rubocop:disable Metrics/BlockLength
|
2
|
+
cnf.people_filters do |filters| # rubocop:disable Metrics/BlockLength
|
3
|
+
filters.add("-only-users", "only those with account") do |people, _sess, options|
|
5
4
|
options.deep_merge!(people: {filter: {account: true}})
|
6
5
|
people.users
|
7
6
|
end
|
8
7
|
|
9
|
-
filters.add("-no-account", "only those with no account") do |people,
|
8
|
+
filters.add("-no-account", "only those with no account") do |people, _sess, options|
|
10
9
|
options.deep_merge!(people: {filter: {account: false}})
|
11
10
|
people.account_present(false)
|
12
11
|
end
|
13
12
|
|
14
|
-
filters.add("-with-details", "only those with details") do |people,
|
13
|
+
filters.add("-with-details", "only those with details") do |people, _sess, options|
|
15
14
|
options.deep_merge!(people: {filter: {details: true}})
|
16
15
|
people.details_present
|
17
16
|
end
|
18
17
|
|
19
|
-
filters.add("-no-id", "only those with no external_id") do |people,
|
18
|
+
filters.add("-no-id", "only those with no external_id") do |people, _sess, options|
|
20
19
|
options.deep_merge!(people: {filter: {external_id: nil}})
|
21
20
|
people.external_id_present(false)
|
22
21
|
end
|
@@ -27,25 +26,29 @@ ASSETS.cli.config do |cnf|
|
|
27
26
|
# end
|
28
27
|
|
29
28
|
filters.add("-supervisor-id", "only those with certain supervisor") do |people, session, options|
|
30
|
-
id
|
29
|
+
id = SCR.get_arg("-supervisor-id", with_param: true)
|
31
30
|
options.deep_merge!(people: {filter: {supervisor_id: id}})
|
32
|
-
|
31
|
+
|
32
|
+
unless (sup = session.micro.with_supervisor(id, people, strict: true))
|
33
33
|
status = session.batch.search([{"id" => id}])
|
34
34
|
sup = status.people.first
|
35
35
|
end
|
36
|
+
|
36
37
|
unless sup
|
37
|
-
session.
|
38
|
+
session.log(:error) {
|
39
|
+
"Supervisor with id '#{id}' does not exist"
|
40
|
+
}
|
38
41
|
exit(1)
|
39
42
|
end
|
40
43
|
|
41
44
|
people.supervisor_id(sup.id)
|
42
45
|
end
|
43
46
|
|
44
|
-
filters.add("-no-default-tag", "only those users with no default tag") do |people,
|
47
|
+
filters.add("-no-default-tag", "only those users with no default tag") do |people, _sess, options|
|
45
48
|
options.deep_merge!(people: {filter: {account: {default_tag: nil}}})
|
46
|
-
people.users.
|
47
|
-
|
48
|
-
end.
|
49
|
+
people.users.reject do |person|
|
50
|
+
person.account.default_tag
|
51
|
+
end.then do |filtered|
|
49
52
|
people.newFrom filtered
|
50
53
|
end
|
51
54
|
end
|
@@ -56,7 +59,7 @@ ASSETS.cli.config do |cnf|
|
|
56
59
|
options.deep_merge!(input: {filter: {filter_tags: {any: tags}}})
|
57
60
|
people.filter_tags_all(tags).tap do |filtered|
|
58
61
|
msg = "Filtered #{filtered.count} people (out of #{people.count}) with 'all' filter_tags #{tags}"
|
59
|
-
session.
|
62
|
+
session.log(:info) { msg }
|
60
63
|
end
|
61
64
|
end
|
62
65
|
|
@@ -66,20 +69,21 @@ ASSETS.cli.config do |cnf|
|
|
66
69
|
options.deep_merge!(input: {filter: {filter_tags_any: tags}})
|
67
70
|
people.filter_tags_any(tags).tap do |filtered|
|
68
71
|
msg = "Filtered #{filtered.count} people (out of #{people.count}) with 'any' filter_tags #{tags}"
|
69
|
-
session.
|
72
|
+
session.log(:info) { msg }
|
70
73
|
end
|
71
74
|
end
|
72
75
|
|
73
76
|
desc = "only those that have ANY tag in the specified subtrees separated by '|'"
|
74
77
|
filters.add("-filter-tags-tree", desc) do |people, session, options|
|
75
78
|
top_tags = SCR.get_arg("-filter-tags-tree", with_param: true).upcase.split("|").compact
|
76
|
-
tags = top_tags.each_with_object([])
|
77
|
-
|
79
|
+
tags = top_tags.each_with_object([]) do |top, tgs|
|
80
|
+
tgs.concat(session.tagtree.node(top).tags)
|
78
81
|
end.uniq
|
79
82
|
options.deep_merge!(input: {filter: {filter_tags: {tree: top_tags, any: tags}}})
|
80
83
|
people.filter_tags_any(tags).tap do |filtered|
|
81
|
-
msg
|
82
|
-
|
84
|
+
msg = "Filtered #{filtered.count} people (out of #{people.count})"
|
85
|
+
msg << " with 'any' filter_tags in subtrees #{top_tags}"
|
86
|
+
session.log(:info) { msg }
|
83
87
|
end
|
84
88
|
end
|
85
89
|
|
@@ -89,17 +93,21 @@ ASSETS.cli.config do |cnf|
|
|
89
93
|
|
90
94
|
unless sch_id
|
91
95
|
msg = "You need to specify a correct schema id or name. '#{sch_name}' does not exist"
|
92
|
-
session.
|
96
|
+
session.log(:error) { msg }
|
93
97
|
exit(1)
|
94
98
|
end
|
95
99
|
|
96
100
|
options.deep_merge!(people: {filter: {details: {schema_id: sch_id}}})
|
97
|
-
session.
|
101
|
+
session.log(:info) {
|
102
|
+
"Filtering people records with schema #{session.schemas.to_name(sch_id)}"
|
103
|
+
}
|
98
104
|
|
99
105
|
people.select do |person|
|
100
106
|
person.details && (person.details.schema_id == sch_id)
|
101
|
-
end.
|
102
|
-
session.
|
107
|
+
end.then do |filtered|
|
108
|
+
session.log(:info) {
|
109
|
+
"Filtered #{filtered.count} people out of #{people.count} total"
|
110
|
+
}
|
103
111
|
people.newFrom filtered
|
104
112
|
end
|
105
113
|
end
|