eco-helpers 3.0.19 → 3.0.21

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +35 -3
  4. data/lib/eco/api/common/loaders/config/cli.rb +9 -0
  5. data/lib/eco/api/common/loaders/config/session.rb +12 -0
  6. data/lib/eco/api/common/loaders/config/workflow/mailer.rb +17 -4
  7. data/lib/eco/api/common/loaders/config.rb +11 -2
  8. data/lib/eco/api/common/people/default_parsers/xls_parser.rb +1 -1
  9. data/lib/eco/api/common/session/logger/cache.rb +10 -4
  10. data/lib/eco/api/common/session/logger/channels.rb +41 -0
  11. data/lib/eco/api/common/session/logger.rb +9 -0
  12. data/lib/eco/api/common/session/sftp.rb +5 -0
  13. data/lib/eco/api/custom/mailer.rb +1 -0
  14. data/lib/eco/api/error.rb +4 -0
  15. data/lib/eco/api/session/batch/job.rb +25 -16
  16. data/lib/eco/api/session/batch/jobs.rb +6 -8
  17. data/lib/eco/api/session/batch/launcher/mode_size.rb +5 -2
  18. data/lib/eco/api/session/batch/launcher/retry.rb +6 -1
  19. data/lib/eco/api/session/config/api.rb +1 -0
  20. data/lib/eco/api/session/config/apis/one_off.rb +6 -6
  21. data/lib/eco/api/session/config/workflow.rb +16 -3
  22. data/lib/eco/api/session.rb +11 -7
  23. data/lib/eco/api/usecases/default/locations/tagtree_extract_case.rb +1 -0
  24. data/lib/eco/api/usecases/default/locations/tagtree_upload_case.rb +2 -0
  25. data/lib/eco/api/usecases/default_cases/samples/sftp_case.rb +22 -15
  26. data/lib/eco/api/usecases/ooze_cases/export_register_case.rb +6 -6
  27. data/lib/eco/api/usecases/ooze_samples/helpers/exportable_register.rb +1 -0
  28. data/lib/eco/api/usecases/ooze_samples/ooze_base_case.rb +1 -1
  29. data/lib/eco/api/usecases/ooze_samples/ooze_run_base_case.rb +8 -5
  30. data/lib/eco/cli_default/input.rb +49 -29
  31. data/lib/eco/cli_default/options.rb +4 -1
  32. data/lib/eco/cli_default/people.rb +102 -47
  33. data/lib/eco/cli_default/people_filters.rb +4 -1
  34. data/lib/eco/cli_default/workflow.rb +10 -4
  35. data/lib/eco/csv/stream.rb +2 -0
  36. data/lib/eco/csv.rb +3 -2
  37. data/lib/eco/language/auxiliar_logger.rb +16 -3
  38. data/lib/eco/language/basic_logger.rb +1 -0
  39. data/lib/eco/language/methods/delegate_missing.rb +4 -3
  40. data/lib/eco/version.rb +1 -1
  41. metadata +5 -2
@@ -70,6 +70,7 @@ module Eco
70
70
  )
71
71
  if live && api?(version: :graphql)
72
72
  return live_tree(include_archived: include_archived, **kargs, &block) unless merge
73
+
73
74
  live_trees(include_archived: include_archived, **kargs, &block).inject(&:merge)
74
75
  else
75
76
  config.tagtree(recache: recache)
@@ -118,10 +119,12 @@ module Eco
118
119
  # @return [Eco::Data::Mapper] the mappings between the internal and external attribute/property names.
119
120
  def fields_mapper
120
121
  return @fields_mapper if instance_variable_defined?(:@fields_mapper)
122
+
121
123
  mappings = []
122
124
  if (map_file = config.people.fields_mapper)
123
125
  mappings = map_file ? file_manager.load_json(map_file) : []
124
126
  end
127
+
125
128
  @fields_mapper = Eco::Data::Mapper.new(mappings)
126
129
  end
127
130
 
@@ -166,9 +169,9 @@ module Eco
166
169
  # @param phase [Symbol] the phase when this parser should be active.
167
170
  # @return [Object] the parsed attribute.
168
171
  def parse_attribute(attr, source, phase = :internal, deps: {})
169
- unless (parsers = entry_factory.person_parser)
170
- raise "There are no parsers defined"
171
- end
172
+ msg = "There are no parsers defined"
173
+ raise msg unless (parsers = entry_factory.person_parser)
174
+
172
175
  parsers.parse(attr, source, phase, deps: deps)
173
176
  end
174
177
 
@@ -390,18 +393,19 @@ module Eco
390
393
 
391
394
  # from schema `id` or `name` to a PersonSchema object
392
395
  def to_schema(value)
393
- return nil unless value
394
396
  sch = nil
397
+ return unless value
398
+
395
399
  case value
396
400
  when String
397
- unless (sch = schemas.schema(value))
398
- fatal "The schema with id or name '#{value}' does not exist."
399
- end
401
+ msg = "The schema with id or name '#{value}' does not exist."
402
+ fatal msg unless (sch = schemas.schema(value))
400
403
  when Ecoportal::API::V1::PersonSchema
401
404
  sch = value
402
405
  else
403
406
  fatal "Required String or Ecoportal::API::V1::PersonSchema. Given: #{value}"
404
407
  end
408
+
405
409
  sch
406
410
  end
407
411
  end
@@ -195,6 +195,7 @@ class Eco::API::UseCases::Default::Locations::TagtreeExtract < Eco::API::UseCase
195
195
 
196
196
  def excel(filename)
197
197
  require 'fast_excel'
198
+
198
199
  FastExcel.open(filename, constant_memory: true).tap do |workbook|
199
200
  yield(workbook)
200
201
  workbook.close
@@ -27,6 +27,7 @@ class Eco::API::UseCases::Default::Locations::TagtreeUpload < Eco::API::UseCases
27
27
  comms << insert_command(tree, pid: pid) unless top_id?(tree.id)
28
28
  pid = tree.id
29
29
  end
30
+
30
31
  tree.nodes.map do |node|
31
32
  insert_commands(node, pid: pid)
32
33
  end.flatten(1).tap do |subs|
@@ -54,6 +55,7 @@ class Eco::API::UseCases::Default::Locations::TagtreeUpload < Eco::API::UseCases
54
55
 
55
56
  def top_id?(node_id = nil)
56
57
  return top_id.is_a?(String) if node_id.nil?
58
+
57
59
  node_id == top_id
58
60
  end
59
61
 
@@ -7,7 +7,7 @@ class Eco::API::UseCases::DefaultCases::Samples::Sftp < Eco::API::Common::Loader
7
7
  name "sftp"
8
8
  type :other
9
9
 
10
- CONST_REFERRAL = /^(?:::)?(?:[A-Z][a-zA-Z0-9_]*(?:::[A-Z][a-zA-Z0-9_]*)*)$/.freeze
10
+ CONST_REFERRAL = /^(?:::)?(?:[A-Z][a-zA-Z0-9_]*(?:::[A-Z][a-zA-Z0-9_]*)*)$/
11
11
 
12
12
  def main(session, options, _usecase)
13
13
  options[:end_get] = false
@@ -31,7 +31,7 @@ class Eco::API::UseCases::DefaultCases::Samples::Sftp < Eco::API::Common::Loader
31
31
  def file_pattern(require: true)
32
32
  fpc = file_pattern_const
33
33
  return fpc if fpc
34
- return unless require
34
+ return unless require
35
35
 
36
36
  msg = "(#{self.class}) You should redefine the file_pattern function "
37
37
  msg << "as a RegEx expression that matches the target remote file"
@@ -41,6 +41,7 @@ class Eco::API::UseCases::DefaultCases::Samples::Sftp < Eco::API::Common::Loader
41
41
  def file_pattern_const
42
42
  if (fpc = options.dig(:sftp, :file_pattern_const))
43
43
  raise WrongConst, "(#{self.class}) Invalid file pattern const referral: #{fpc}" unless fpc.match(CONST_REFERRAL)
44
+
44
45
  begin
45
46
  self.eval(fpc)
46
47
  rescue NameError
@@ -54,6 +55,7 @@ class Eco::API::UseCases::DefaultCases::Samples::Sftp < Eco::API::Common::Loader
54
55
  # Ex: "/IN/Personnel"
55
56
  def remote_subfolder(require: true)
56
57
  rm_sf = options.dig(:sftp, :remote_subfolder)
58
+
57
59
  return rm_sf if rm_sf
58
60
  return unless require
59
61
 
@@ -78,7 +80,7 @@ class Eco::API::UseCases::DefaultCases::Samples::Sftp < Eco::API::Common::Loader
78
80
  options.dig(:sftp, :local_folder) || "."
79
81
  end
80
82
 
81
- def with_remote_files(folder: self.remote_folder, pattern: self.file_pattern)
83
+ def with_remote_files(folder: remote_folder, pattern: file_pattern)
82
84
  sftp.files(folder, pattern: pattern).each do |remote_file|
83
85
  yield(remote_file) if block_given?
84
86
  end
@@ -100,22 +102,25 @@ class Eco::API::UseCases::DefaultCases::Samples::Sftp < Eco::API::Common::Loader
100
102
 
101
103
  def get_files
102
104
  with_remote_files.tap do |files|
103
- unless files.empty?
104
- file_names = files.map {|file| to_remote_path(file.name)}
105
- puts "Getting the following files into the local folder '#{local_folder}':"
106
- puts file_names
107
- sftp.download(file_names, local_folder: local_folder)
108
- end
105
+ next if files.empty?
106
+
107
+ file_names = files.map {|file| to_remote_path(file.name)}
108
+
109
+ puts "Getting the following files into the local folder '#{local_folder}':"
110
+ puts file_names
111
+
112
+ sftp.download(file_names, local_folder: local_folder)
109
113
  end
110
114
  end
111
115
 
112
116
  def get_last
113
117
  with_remote_files.last.tap do |file|
114
- if file
115
- file_name = to_remote_path(file.name)
116
- puts "Getting the following file: #{file_name}"
117
- sftp.download(file_name, local_folder: local_folder)
118
- end
118
+ next unless file
119
+
120
+ file_name = to_remote_path(file.name)
121
+ puts "Getting the following file: #{file_name}"
122
+
123
+ sftp.download(file_name, local_folder: local_folder)
119
124
  end
120
125
  end
121
126
 
@@ -125,7 +130,9 @@ class Eco::API::UseCases::DefaultCases::Samples::Sftp < Eco::API::Common::Loader
125
130
  dest = to_remote_path("#{archive_subfolder}/#{file.name}")
126
131
  move_file(source, dest)
127
132
  end.tap do |files|
128
- puts "Moved the file(s) to the #{archive_subfolder} folder" unless files.empty?
133
+ next if files.empty?
134
+
135
+ puts "Moved the file(s) to the #{archive_subfolder} folder"
129
136
  end
130
137
  end
131
138
 
@@ -40,7 +40,7 @@ class Eco::API::UseCases::OozeCases::ExportRegisterCase < Eco::API::UseCases::Oo
40
40
 
41
41
  def build_tags_filter(mode = :any)
42
42
  tags = option_tags(mode)
43
- return nil if !tags || tags.empty?
43
+ return if !tags || tags.empty?
44
44
 
45
45
  tags_filter(tags, any: mode == :any)
46
46
  end
@@ -48,7 +48,7 @@ class Eco::API::UseCases::OozeCases::ExportRegisterCase < Eco::API::UseCases::Oo
48
48
  def build_range_filter(key = :update_at)
49
49
  from = from_date(key)
50
50
  to = to_date(key)
51
- return nil unless from || to
51
+ return unless from || to
52
52
 
53
53
  date_range_filter(from: from, to: to, key: key)
54
54
  end
@@ -92,10 +92,10 @@ class Eco::API::UseCases::OozeCases::ExportRegisterCase < Eco::API::UseCases::Oo
92
92
 
93
93
  def filename
94
94
  @filename ||= (options[:file] || options.dig(:export, :file, :name)).tap do |filename|
95
- unless filename
96
- log(:error) { "Destination file not specified" }
97
- return false
98
- end
95
+ next if filename
96
+
97
+ log(:error) { "Destination file not specified" }
98
+ return false
99
99
  end
100
100
  end
101
101
  end
@@ -48,6 +48,7 @@ module Eco
48
48
 
49
49
  def header(refresh: false)
50
50
  return @header if instance_variable_defined?(:@header) && !refresh
51
+
51
52
  @header = typed_header.map do |name|
52
53
  ExportableOoze.key_to_label(name)
53
54
  end
@@ -234,7 +234,7 @@ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders:
234
234
 
235
235
  def dry_count
236
236
  @dry_count ||= 0
237
- @dry_count += 1
237
+ @dry_count += 1
238
238
  end
239
239
 
240
240
  def dry_run_feedback(entry = target)
@@ -3,17 +3,19 @@ class Eco::API::UseCases::OozeSamples::OozeRunBaseCase < Eco::API::UseCases::Ooz
3
3
  name "ooze-run-base"
4
4
  type :other
5
5
 
6
- SAVE_PATCH = "ooze_patch_update.json"
6
+ SAVE_PATCH = "ooze_patch_update.json".freeze
7
7
 
8
8
  def main(session, options, usecase)
9
9
  super(session, options, usecase) do
10
- if method(:process_ooze).parameters.count == 0
10
+ if method(:process_ooze).parameters.count.zero?
11
11
  ooze # retrieve ooze
12
12
  process_ooze
13
13
  else
14
14
  process_ooze(ooze)
15
15
  end
16
+
16
17
  yield(target) if block_given?
18
+
17
19
  exit_if_no_changes!
18
20
  update_ooze(target)
19
21
  end
@@ -30,7 +32,7 @@ class Eco::API::UseCases::OozeSamples::OozeRunBaseCase < Eco::API::UseCases::Ooz
30
32
  end
31
33
 
32
34
  def stage(stage_id_name = stage_id, ooze: target)
33
- super(stage_id_name, ooze: ooze)
35
+ super
34
36
  end
35
37
 
36
38
  def ooze_id
@@ -43,11 +45,12 @@ class Eco::API::UseCases::OozeSamples::OozeRunBaseCase < Eco::API::UseCases::Ooz
43
45
 
44
46
  def update_ooze(ooz = target)
45
47
  prompt_to_confirm!
46
- super(ooz)
48
+
49
+ super
47
50
  end
48
51
 
49
52
  def exit_if_no_changes!
50
- return if (changes = !!patch_doc["page"])
53
+ return if !!patch_doc["page"]
51
54
 
52
55
  log(:info) { "No Changes!!" }
53
56
  exit(0)
@@ -1,6 +1,5 @@
1
- # rubocop:disable Metrics/BlockLength
2
- ASSETS.cli.config do |cnf|
3
- formats = {
1
+ class Eco::CliDefault::Input < Eco::API::Common::Loaders::CliConfig
2
+ FORMATS = {
4
3
  csv: {
5
4
  option: ["-csv"],
6
5
  extname: [".csv", ".txt"]
@@ -17,51 +16,74 @@ ASSETS.cli.config do |cnf|
17
16
  option: ["-json"],
18
17
  extname: [".json"]
19
18
  }
20
- }
19
+ }.freeze
21
20
 
22
- cnf.input(default_option: "-entries-from") do |session, str_opt, options|
23
- input = []
21
+ class << self
22
+ attr_reader :options, :session
24
23
 
24
+ def encoding
25
+ options.dig(:input, :file, :encoding)
26
+ end
27
+
28
+ def format_by_cli
29
+ FORMATS.reduce(nil) do |matched, (frm, selectors)|
30
+ next matched if matched
31
+
32
+ used = selectors[:option].reduce(false) do |us, option|
33
+ SCR.get_arg(option) || us
34
+ end
35
+
36
+ next frm if used
37
+ end
38
+ end
39
+
40
+ def format_by_ext(ext)
41
+ FORMATS.reduce(nil) do |matched, (frm, selectors)|
42
+ next matched if matched
43
+ next frm if selectors[:extname].any? {|e| ext == e}
44
+ end
45
+ end
46
+ end
47
+
48
+ input(default_option: "-entries-from") do |session, str_opt, options|
49
+ @options = options
50
+ @session = session
51
+ input = []
25
52
  next input unless SCR.get_arg(str_opt)
26
53
 
27
54
  file = SCR.get_file(str_opt, required: true)
28
55
 
29
56
  # 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
57
+ format = format_by_cli
35
58
 
36
59
  # File/Folder check
37
60
  file = File.expand_path(file)
61
+
38
62
  if File.directory?(file)
39
63
  folder = file
40
64
  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)
48
- end
65
+ ext = FORMATS.dig(format, :extname)
66
+ ext ||= [File.extname(file.first)]
67
+ file = file.select do |f|
68
+ ext.any? {|e| File.extname(f) == e}
69
+ end.tap do |files|
70
+ next unless files.empty?
71
+
72
+ session.log(:error) {
73
+ "Could not find any file with extension: #{ext} in folder '#{folder}'"
74
+ }
75
+ exit(1)
49
76
  end
50
77
  else
51
- ext = File.extname(file)
78
+ ext = [File.extname(file)]
52
79
  end
53
80
 
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
81
+ format ||= format_by_ext(ext.first)
58
82
  format ||= :csv
59
83
 
60
- options.deep_merge!(input: {file: {name: file}})
84
+ options.deep_merge!(input: {file: {name: file}})
61
85
  options.deep_merge!(input: {file: {format: format}})
62
86
 
63
- encoding = options.dig(:input, :file, :encoding)
64
-
65
87
  case format
66
88
  when :xml
67
89
  [file].flatten.each {|f| session.config.files.validate(:xml, f)}
@@ -83,5 +105,3 @@ ASSETS.cli.config do |cnf|
83
105
  input
84
106
  end
85
107
  end
86
-
87
- # rubocop:enable Metrics/BlockLength
@@ -69,7 +69,10 @@ ASSETS.cli.config do |cnf| # rubocop:disable Metrics/BlockLength
69
69
  sch_id = session.schemas.to_id(sch_name)
70
70
 
71
71
  unless sch_id
72
- msg = "You need to specify a correct schema id or name. '#{sch_name}' does not exist"
72
+ msg = "You need to specify a correct schema id or name. "
73
+ msg << "'#{sch_name}' does not exist. Correct options are: "
74
+ msg << session.schemas.map(&:name).join(", ")
75
+
73
76
  session.log(:error) { msg }
74
77
  exit(1)
75
78
  end
@@ -1,69 +1,124 @@
1
- MAX_GET_PARTIAL = 12_000
1
+ class Eco::CliDefault::People < Eco::API::Common::Loaders::CliConfig
2
+ MAX_GET_PARTIAL = 12_000
2
3
 
3
- ASSETS.cli.config do |cnf|
4
- cnf.people do |input, session, options|
5
- get = options.dig(:people, :get)
6
- get = {} if get.nil?
4
+ class << self
5
+ attr_reader :options, :session
6
+ attr_writer :get_full, :get_partial
7
7
 
8
- from_remote = get && get[:from] == :remote
9
- from_local = get && get[:from] == :local
8
+ def get_options # rubocop:disable Naming/AccessorMethodName
9
+ get = options.dig(:people, :get)
10
+ get = {} if get.nil?
11
+ get
12
+ end
13
+
14
+ def no_get?
15
+ get_options == false
16
+ end
10
17
 
11
- get_full = from_remote && get[:type] == :full
12
- get_partial = from_remote && get[:type] == :partial
13
- get_by_file = from_local && get[:type] == :file
18
+ def from_remote?
19
+ return false unless get_options
20
+
21
+ get_options[:from] == :remote
22
+ end
23
+
24
+ def from_local?
25
+ return false unless get_options
26
+
27
+ get_options[:from] == :local
28
+ end
29
+
30
+ def get_full?
31
+ return @get_full if instance_variable_defined?(:@get_full)
32
+ return false unless from_remote?
33
+
34
+ get_options[:type] == :full
35
+ end
36
+
37
+ def get_partial?
38
+ return @get_partial if instance_variable_defined?(:@get_partial)
39
+ return false unless from_remote?
40
+
41
+ @get_partial = (get_options[:type] == :partial)
42
+ end
43
+
44
+ def get_by_file?
45
+ return false unless from_local?
46
+
47
+ get_options[:type] == :file
48
+ end
49
+
50
+ def source_file
51
+ return unless get_by_file?
52
+
53
+ get_options[:file]
54
+ end
55
+
56
+ def switch_to_full_remote!
57
+ self.get_full = true
58
+ self.get_partial = false
59
+
60
+ options.deep_merge!(people: {
61
+ get: {
62
+ from: :remote,
63
+ type: :full
64
+ }
65
+ })
66
+ end
67
+
68
+ def switch_to_full_local!
69
+ self.get_full = true
70
+ self.get_partial = false
71
+
72
+ options.deep_merge!(people: {
73
+ get: {
74
+ from: :local,
75
+ type: :full
76
+ }
77
+ })
78
+ end
79
+
80
+ def optimize_get_partial!(input)
81
+ return unless get_partial?
14
82
 
15
- # -get-partial: validate input present and under max
16
- if get_partial
17
83
  msg = "To use -get-partial (partial updates), you need to use -entries-from"
18
84
  raise msg unless input.is_a?(Enumerable)
19
85
 
20
- if input.count > MAX_GET_PARTIAL
21
- get_full = true
22
- get_partial = false
23
-
24
- msg = "(Optimization) "
25
- msg << "Switching from partial to full people download. "
26
- msg << "Input (#{input.count}) surpases MAX_GET_PARTIAL "
27
- msg << "(#{MAX_GET_PARTIAL}) entries."
28
- session.log(:info) { msg }
29
-
30
- options.deep_merge!(people: {
31
- get: {
32
- from: :remote,
33
- type: :full
34
- }
35
- })
36
- end
86
+ return unless input.count > MAX_GET_PARTIAL
87
+
88
+ msg = "(Optimization) "
89
+ msg << "Switching from partial to full people download. "
90
+ msg << "Input (#{input.count}) surpases MAX_GET_PARTIAL "
91
+ msg << "(#{MAX_GET_PARTIAL}) entries."
92
+ session.log(:info) { msg }
93
+
94
+ switch_to_full_remote!
37
95
  end
96
+ end
97
+
98
+ people do |input, session, options|
99
+ @options = options
100
+ @session = session
38
101
 
39
- if get == false
102
+ # -get-partial: validate input present and under max
103
+ optimize_get_partial!(input) if get_partial?
104
+
105
+ if no_get?
40
106
  Eco::API::Organization::People.new([])
41
- elsif get_full
107
+ elsif get_full?
42
108
  # -get-people
43
109
  session.micro.people_cache
44
- elsif get_partial
110
+ elsif get_partial?
45
111
  # -get-partial
46
112
  session.micro.people_search(input, options: options)
47
- elsif get_by_file
113
+ elsif get_by_file?
48
114
  # -people-from-backup
49
- session.micro.people_load(get[:file], modifier: :file)
115
+ session.micro.people_load(source_file, modifier: :file)
50
116
  else
51
- options.deep_merge!(people: {
52
- get: {
53
- from: :local,
54
- type: :full
55
- }
56
- })
57
-
117
+ switch_to_full_local!
58
118
  people = session.micro.people_load(modifier: %i[newest save])
59
119
 
60
120
  if people.empty?
61
- options.deep_merge!(people: {
62
- get: {
63
- from: :remote,
64
- type: :full
65
- }
66
- })
121
+ switch_to_full_remote!
67
122
  people = session.micro.people_cache
68
123
  end
69
124
 
@@ -92,7 +92,10 @@ ASSETS.cli.config do |cnf| # rubocop:disable Metrics/BlockLength
92
92
  sch_id = session.schemas.to_id(sch_name)
93
93
 
94
94
  unless sch_id
95
- msg = "You need to specify a correct schema id or name. '#{sch_name}' does not exist"
95
+ msg = "You need to specify a correct schema id or name. "
96
+ msg << "'#{sch_name}' does not exist. Correct options are: "
97
+ msg << session.schemas.map(&:name).join(", ")
98
+
96
99
  session.log(:error) { msg }
97
100
  exit(1)
98
101
  end
@@ -1,12 +1,14 @@
1
1
  ASSETS.cli do |cli| # rubocop:disable Metrics/BlockLength
2
2
  ASSETS.config.workflow do |wf| # rubocop:disable Metrics/BlockLength
3
3
  rescued = false
4
+
4
5
  # default rescue
5
6
  wf.rescue do |err, io|
6
7
  next io if rescued
7
8
 
8
9
  rescued = true
9
10
  log(:debug) { err.patch_full_message }
11
+
10
12
  wf.run(:close, io: io)
11
13
  rescue StandardError => e
12
14
  puts "Some problem in workflow.rescue: #{e}"
@@ -74,10 +76,10 @@ ASSETS.cli do |cli| # rubocop:disable Metrics/BlockLength
74
76
  end
75
77
 
76
78
  wf.on(:usecases) do |_wf_ca, io|
77
- unless cli.config.usecases.process(io: io)
78
- log(:info) { "No update operation specified... quitting" }
79
- exit 0
80
- end
79
+ next if cli.config.usecases.process(io: io)
80
+
81
+ log(:info) { "No update operation specified... quitting" }
82
+ exit 0
81
83
  end
82
84
 
83
85
  wf.before(:launch_jobs) do |_wf_jobs, _io|
@@ -95,11 +97,13 @@ ASSETS.cli do |cli| # rubocop:disable Metrics/BlockLength
95
97
  run_it = !options[:dry_run] || options.dig(:post_launch, :run)
96
98
  unless run_it
97
99
  wf_post.skip!
100
+
98
101
  log(:info) {
99
102
  msg = "Although there are post_launch cases, they will NOT be RUN"
100
103
  msg << ", because we are in dry-run (simulate)." if options[:dry_run]
101
104
  msg
102
105
  }
106
+
103
107
  next
104
108
  end
105
109
 
@@ -117,6 +121,7 @@ ASSETS.cli do |cli| # rubocop:disable Metrics/BlockLength
117
121
  end
118
122
  msg
119
123
  }
124
+
120
125
  next
121
126
  end
122
127
 
@@ -131,6 +136,7 @@ ASSETS.cli do |cli| # rubocop:disable Metrics/BlockLength
131
136
  use.launch(io: io).base
132
137
  rescue Eco::API::UseCases::BaseIO::MissingParameter => e
133
138
  raise unless e.required == :people
139
+
134
140
  log(:debug) {
135
141
  "Skipping use case '#{use.name}' -- no base people detected for the current run"
136
142
  }
@@ -7,6 +7,7 @@ module Eco
7
7
 
8
8
  def initialize(filename, **kargs)
9
9
  raise ArgumentError, "File '#{filename}' does not exist" unless ::File.exist?(filename)
10
+
10
11
  @filename = filename
11
12
  @params = {
12
13
  headers: true,
@@ -55,6 +56,7 @@ module Eco
55
56
  # see https://dalibornasevic.com/posts/68-processing-large-csv-files-with-ruby
56
57
  def csv
57
58
  return @csv if instance_variable_defined?(:@csv)
59
+
58
60
  @fd = ::File.open(filename, 'r')
59
61
  @csv = Eco::CSV.new(fd, **params)
60
62
  end
data/lib/eco/csv.rb CHANGED
@@ -5,9 +5,9 @@ module Eco
5
5
  include Eco::Data::Files
6
6
 
7
7
  # @return [Eco::CSV::Table]
8
- def parse(data, **kargs, &block)
8
+ def parse(data, **kargs)
9
9
  kargs = {headers: true, skip_blanks: true}.merge(kargs)
10
- Eco::CSV::Table.new(super(data, **kargs, &block))
10
+ Eco::CSV::Table.new(super)
11
11
  end
12
12
 
13
13
  # @return [Eco::CSV::Table]
@@ -51,6 +51,7 @@ module Eco
51
51
  included = yield(row) if block_given?
52
52
  count += 1 if included
53
53
  end
54
+
54
55
  count
55
56
  end
56
57
  end