eco-helpers 2.0.32 → 2.0.36

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0a1f04caab2cae362249d46b694021287a8904052f3851151b4cb6103e7f8790
4
- data.tar.gz: b050e7dd4626f331080cb6dc1437da74a793460bce5426ff3aa5a9b91bba5a53
3
+ metadata.gz: '069fe6b03a523420dd24aa933eeffb05c20153ace763deb228de9e978a2f0ef6'
4
+ data.tar.gz: 974d0af1009597161438cc9de087d42a73a503b6c0c8d50ab97c3030672e7180
5
5
  SHA512:
6
- metadata.gz: 7eb83d0cd4b318f42e90065f772b0b9aa801afddd39d0f2e6fa9861446fd06d537cc436500f8cc9a2c852ce46d3ea2b00a2d3a7199cdba9bf244a8104aa63bfc
7
- data.tar.gz: ef8ab06e274156c0341212b9b72865e0dfe4e55e9c4f0f816b67554739b6fc2a1b15614a973bfae234dbdd03de7b429513ad19edcd9264b0123cb80374dc78b8
6
+ metadata.gz: 8c089ac0050ab88d68eda450060785d9a59870cfa87b3c0c958612cb85f8251d826c824aa9da93b1cffa99afa4e7877ebd42dec1ad0d161764fea7de29495fb7
7
+ data.tar.gz: f42d0a303f79775a71da9d13aa1639c8e0de85131590b84301fa1523e0293f87a943d9eaf65c22b97b73d71d667e889ae8bc0137861ac3811fed1a8a439de66f
data/CHANGELOG.md CHANGED
@@ -1,11 +1,60 @@
1
1
  # Change Log
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
- ## [2.0.32] - 2021-07-xx
4
+ ## [2.0.36] - 2021-08-xx
5
5
 
6
6
  ### Added
7
+ ### Changed
8
+ ### Fixed
9
+ - `Eco::API::UseCases::OozeSamples::OozeBaseCase`
10
+ - `#update_ooze` only count dry run for changed pages (to have better feedack)
11
+
12
+ ## [2.0.35] - 2021-08-30
13
+
14
+ ### Added
15
+ - `Eco::API::UseCases::OozeSamples::OozeBaseCase`
16
+ - `#new_target` optional warning when switching `target`
17
+ - `block` that is called when switching target and there were unsaved changes
18
+ - `#dirty?` helper method to check if there are changes
19
+ - `#before_loading_new_target` hook to allow child classes to anticipate when the `target` is going to change
7
20
 
8
21
  ### Changed
22
+ - `Eco::API::UseCases::OozeSamples::Helpers::Shortcuts#object_reference` improved reference text
23
+ - `Eco::API::UseCases::OozeSamples::RegisterUpdateCase`
24
+ - added resilience when switching target (i.e. from one stage to another stage in same entry)
25
+ - added `batch_queue`
26
+
27
+ ### Fixed
28
+ - `Eco::API::UseCases::OozeSamples::RegisterUpdateCase`
29
+ - actual `batch_size` updates
30
+ - actual safe switch of target (i.e. against another stage of same ooze)
31
+
32
+ ## [2.0.34] - 2021-08-28
33
+
34
+ ### Added
35
+ - `Eco::API::UseCases::OozeSamples::OozeBaseCase` refactored ooze base case
36
+ - `Eco::API::UseCases::OozeSamples::RegisterUpdateCase` new case for full register update
37
+
38
+ ### Changed
39
+ - `Eco::API::UseCases::OozeSamples::OozeRunBaseCase` made child of `OozeBaseCase` and simplified to its essential
40
+ - `Eco::API::UseCases::OozeSamples::OozeUpdateCase` remove unnecessary code and helpers that are now inherited from `OoozeBaseCase`
41
+ - `Eco::API::UseCases::OozeSamples::OozeFromDocCase` remove unnecessary code
42
+
43
+
44
+ ## [2.0.33] - 2021-08-16
45
+
46
+ ### Added
47
+ - `Eco::API::UseCases::OozeSamples::OozeFromDocCase` use case to abstract form from doc
48
+ - `docx` dependency
49
+ - A couple more of helpers for the Ooze Cases: `#titleize` & `#normalize_string`
50
+
51
+ ### Changed
52
+ - `ecoporta-api-v2` **gem** (upgrade dependency)
53
+
54
+ ### Fixed
55
+ - `Eco::API::UseCases::OozeSamples::OozeUpdateCase`, helper `with_stage`
56
+
57
+ ## [2.0.32] - 2021-07-14
9
58
 
10
59
  ### Fixed
11
60
  - `Eco::API::UseCases::OozeSamples::OozeUpdateCase` prompting user, fixed typo
data/eco-helpers.gemspec CHANGED
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency "redcarpet", ">= 3.5.1", "< 3.6"
32
32
 
33
33
  spec.add_dependency 'ecoportal-api', '>= 0.8.3', '< 0.9'
34
- spec.add_dependency 'ecoportal-api-v2', '>= 0.8.7', '< 0.9'
34
+ spec.add_dependency 'ecoportal-api-v2', '>= 0.8.12', '< 0.9'
35
35
  spec.add_dependency 'aws-sdk-s3', '>= 1.83.0', '< 2'
36
36
  spec.add_dependency 'aws-sdk-ses', '>= 1.36.0', '< 2'
37
37
  spec.add_dependency 'dotenv', '>= 2.7.6', '< 2.8'
@@ -42,4 +42,5 @@ Gem::Specification.new do |spec|
42
42
  spec.add_dependency 'jaro_winkler', '>= 1.5.4', '< 1.6'
43
43
  spec.add_dependency 'roo', '>= 2.8.3', '< 2.9'
44
44
  spec.add_dependency 'roo-xls', '>= 1.2.0', '< 1.3'
45
+ spec.add_dependency 'docx', '>= 0.6.2', '< 0.7'
45
46
  end
@@ -139,6 +139,7 @@ module Eco
139
139
  explanation = "Batch TimeOut. You have #{retries_left} retries left."
140
140
  prompt_user(" Do you want to retry (y/N)?", default: "Y", explanation: explanation, timeout: 10) do |response|
141
141
  if response.upcase.start_with?("Y")
142
+ puts "\nOkay... let's retry!"
142
143
  offer_retry_on(error_type, retries_left - 1, &block)
143
144
  else
144
145
  raise
@@ -3,7 +3,7 @@ class Eco::API::UseCases::DefaultCases::UpsertCase < Eco::API::Common::Loaders::
3
3
  type :sync
4
4
 
5
5
  attr_reader :options
6
-
6
+
7
7
  def main(entries, people, session, options, usecase)
8
8
  @options = options
9
9
  micro = session.micro
@@ -0,0 +1,77 @@
1
+ module Eco
2
+ module API
3
+ class UseCases
4
+ class OozeSamples
5
+ module Helpers
6
+ module Shortcuts
7
+
8
+ # Offers multiple ways to compare two strings
9
+ def same_string?(value1, value2, exact: false)
10
+ case
11
+ when value1.is_a?(String) && value2.is_a?(String)
12
+ if exact
13
+ value1 == value2
14
+ else
15
+ value1.to_s.strip.downcase == value2.to_s.strip.downcase
16
+ end
17
+ when value1.is_a?(Regexp) && value2.is_a?(String)
18
+ value2 =~ value1
19
+ when value1.is_a?(String) && value2.is_a?(Regexp)
20
+ value1 =~ value2
21
+ else
22
+ value1 == value2
23
+ end
24
+ end
25
+
26
+ def titleize(str)
27
+ return nil unless str
28
+ return str if str.strip.empty?
29
+ str.split(/\s+/).map do |part|
30
+ part[0] = part[0].upcase
31
+ part[1..-1] = part[1..-1].downcase
32
+ part
33
+ end.join(" ")
34
+ end
35
+
36
+ def normalize_string(str)
37
+ return nil unless str
38
+ str.gsub(/[^[:print:]]/, '')
39
+ .gsub(/[[:space:]]+/, ' ')
40
+ .gsub(/[[:space:]]$/, '')
41
+ .gsub(/[-\u2011\u2012\u2013]/, '-').yield_self do |str|
42
+ str = yield(str) if block_given?
43
+ str
44
+ end
45
+ end
46
+
47
+ def clean_question(str)
48
+ return nil unless str
49
+ normalize_string(str) do |str|
50
+ str.gsub(/\r\n/, ' ').yield_self do |str|
51
+ str = yield(str) if block_given?
52
+ str
53
+ end
54
+ end
55
+ end
56
+
57
+ def object_reference(obj)
58
+ return "No reference" unless obj
59
+ "".tap do |ref|
60
+ case obj
61
+ when Ecoportal::API::V2::Page::Stage
62
+ ref << "Stage"
63
+ when Ecoportal::API::V2::Pages::PageStage
64
+ ref << "Page (#{obj.id}) (#{object_reference(obj.current_stage)})"
65
+ when Ecoportal::API::V2::Page
66
+ ref << "Page"
67
+ end
68
+ ref << " '#{obj.name}'" if obj.respond_to?(:name)
69
+ end
70
+ end
71
+
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,13 @@
1
+ require_relative 'helpers/shortcuts.rb'
2
+
3
+ module Eco
4
+ module API
5
+ class UseCases
6
+ class OozeSamples
7
+ module Helpers
8
+ include OozeSamples::Helpers::Shortcuts
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,142 @@
1
+ # @attr_reader target [Ecoportal::API::V2::Page] current target ooze.
2
+ class Eco::API::UseCases::OozeSamples::OozeBaseCase < Eco::API::Common::Loaders::UseCase
3
+ name "ooze-base"
4
+ type :other
5
+
6
+ include Eco::API::UseCases::OozeSamples::Helpers
7
+
8
+ attr_reader :session, :options, :usecase
9
+ attr_reader :target
10
+
11
+ SAVE_PATCH = "ooze_patch_update.json"
12
+ DRY_COUNT = 5
13
+
14
+ def main(session, options, usecase)
15
+ raise "You need to inherit from this class ('#{self.class}') and call super with a block" unless block_given?
16
+ @session = session; @options = options; @usecase = usecase
17
+ @target = nil
18
+ yield
19
+ end
20
+
21
+ # Write here your script
22
+ def process_ooze(ooze = target)
23
+ raise "You need to inherit from this class ('#{self.class}') and call super with a block" unless block_given?
24
+ yield(ooze)
25
+ update_ooze(ooze)
26
+ end
27
+
28
+ private
29
+
30
+ # Hook method to use before the target is switched
31
+ def before_loading_new_target(ooze_id)
32
+ end
33
+
34
+ def ooze(ooze_id = nil, stage_id: nil)
35
+ return target unless ooze_id
36
+ before_loading_new_target(ooze_id)
37
+ apiv2.pages.get(ooze_id, stage_id: stage_id).tap do |ooze|
38
+ if ooze
39
+ new_target(ooze)
40
+ logger.info("Got #{object_reference(ooze)}")
41
+ else
42
+ exit_error "Could not get ooze '#{ooze_id}'"
43
+ end
44
+ end
45
+ end
46
+
47
+ def stage(id_name = nil, ooze: target)
48
+ if ooze_id = ooze && ooze.id
49
+ exit_error "#{object_reference(ooze)} does not have stages!" unless ooze.stages?
50
+ else
51
+ exit_error "There's no target ooze to get retrieve stages from"
52
+ end
53
+
54
+ if stg = ooze.stages[id_name] || ooze.stages.get_by_name(id_name)
55
+ return ooze if ooze.respond_to?(:current_stage_id) && (ooze.current_stage_id == stg.id)
56
+ before_loading_new_target(ooze_id)
57
+ return apiv2.pages.get(ooze_id, stage_id: stg.id).tap do |stage|
58
+ if stage
59
+ new_target(stage)
60
+ logger.info("Got #{object_reference(stage)} from #{object_reference(ooze)}")
61
+ else
62
+ exit_error "Could not get stage '#{id_name}' in ooze '#{ooze_id}'"
63
+ end
64
+ end
65
+ end
66
+ exit_error "Stage '#{id_name}' doesn't exist in ooze '#{ooze_id}'"
67
+ end
68
+
69
+ def update_ooze(ooze = target)
70
+ if !options[:simulate]
71
+ return unless dirty?(ooze)
72
+ apiv2.pages.update(ooze).tap do |response|
73
+ if response.success?
74
+ ooze.consolidate!
75
+ logger.info("Successful update of #{object_reference(ooze)}")
76
+ else
77
+ logger.error("Could not update #{object_reference(ooze)} (created_at: #{ooze.created_at}: #{response.body}")
78
+ end
79
+ end
80
+ else
81
+ unless options.dig(:feedback, :only_stats)
82
+ if patch = (patch_doc(ooze) || {})["page"]
83
+ pp patch
84
+ end
85
+ end
86
+ backup_patch!(ooze)
87
+ exit(0) if dirty?(ooze) && dry_count > DRY_COUNT
88
+ end
89
+ end
90
+
91
+ def new_target(object, warn_pending_changes: true)
92
+ if dirty?(target)
93
+ if warn_pending_changes
94
+ msg = "You you are switching to a new target #{object_reference(object)}"
95
+ msg += " after doing unsaved changes to #{object_reference(target)}"
96
+ logger.warn msg
97
+ end
98
+ yield(target) if block_given?
99
+ end
100
+ @target = object
101
+ end
102
+
103
+ def dirty?(object)
104
+ object && patch_doc(object)["page"]
105
+ end
106
+
107
+ def backup_patch!(ooze = target)
108
+ unless patch = (patch_doc(ooze) || {})["page"]
109
+ logger.info "No changes to update for #{object_reference(ooze)}."
110
+ return
111
+ end
112
+
113
+ patch = patch_doc(ooze)
114
+ # store the request
115
+ File.open(SAVE_PATCH, "w") do |file|
116
+ #file << (patch_doc || {}).to_json
117
+ file << JSON.pretty_generate(patch || {})
118
+ end
119
+ # TODO: ooze_requests folder with subfolders: for each run
120
+ puts "Saved patch at: #{File.expand_path(SAVE_PATCH)}"
121
+ end
122
+
123
+ def patch_doc(ooze = target)
124
+ apiv2.pages.get_body(ooze)
125
+ end
126
+
127
+ def dry_count
128
+ @dry_count ||= 0
129
+ @dry_count += 1
130
+ end
131
+
132
+ def apiv2
133
+ @apiv2 ||= session.api(version: :oozes)
134
+ end
135
+
136
+ def exit_error(msg)
137
+ logger.error(msg)
138
+ exit(1)
139
+ end
140
+
141
+
142
+ end
@@ -0,0 +1,44 @@
1
+ require 'docx'
2
+ # Use case to abstract FORM from word document
3
+ class Eco::API::UseCases::OozeSamples::OozeFromDocCase < Eco::API::UseCases::OozeSamples::OozeUpdateCase
4
+ name "ooze-forms-case"
5
+ type :other
6
+
7
+ private
8
+
9
+ def with_column(num = 0)
10
+ with_tables do |table, i|
11
+ raise "Column num (#{num}) is to big. Table '#{i}' only has #{table.column_count} columns." if table.column_count < num
12
+ table.columns[num].cells.each_with_index do |cell_row, j|
13
+ txt = normalize_string(cell_row.text)
14
+ yield(txt, i, j, table, cell_row)
15
+ end
16
+ end
17
+ end
18
+
19
+ def with_tables
20
+ raise "There are no tables in the doc" unless table_count > 0
21
+ i = 0
22
+ doc.tables.each do |table|
23
+ yield(table, i) if block_given?
24
+ i += 1
25
+ end
26
+ end
27
+
28
+ def table_count
29
+ doc.tables.count
30
+ end
31
+
32
+ def tables?
33
+ table_count > 0
34
+ end
35
+
36
+ def doc
37
+ @doc ||= Docx::Document.open(input_file)
38
+ end
39
+
40
+ def input_file
41
+ options.dig(:source, :file)
42
+ end
43
+
44
+ end
@@ -0,0 +1,60 @@
1
+ # Base class to run a script against a single ooze.
2
+ class Eco::API::UseCases::OozeSamples::OozeRunBaseCase < Eco::API::UseCases::OozeSamples::OozeBaseCase
3
+ name "ooze-run-base"
4
+ type :other
5
+
6
+ attr_reader :session, :options, :usecase
7
+
8
+ SAVE_PATCH = "ooze_patch_update.json"
9
+
10
+ def main(session, options, usecase, &block)
11
+ raise "You need to inherit from this class and call super with a block" unless block
12
+ @session = session; @options = options; @usecase = usecase
13
+ process_ooze(&block)
14
+ end
15
+
16
+ def process_ooze(ooze = target)
17
+ raise "You need to inherit from this class and call super with a block" unless block_given?
18
+ super(ooze) do
19
+ yield(ooze)
20
+ exit_if_no_changes!
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def ooze
27
+ super(ooze_id, stage_id: stage_id)
28
+ end
29
+
30
+ def stage(stage_id_name = stage_id, ooze: target)
31
+ super(stage_id_name, ooze: ooze)
32
+ end
33
+
34
+ def ooze_id
35
+ options.dig(:source, :ooze_id)
36
+ end
37
+
38
+ def stage_id
39
+ options.dig(:source, :stage_id)
40
+ end
41
+
42
+ def update_ooze
43
+ prompt_to_confirm!
44
+ super
45
+ end
46
+
47
+ def exit_if_no_changes!
48
+ unless changes = !!patch_doc["page"]
49
+ logger.warn "No Changes!!"
50
+ exit(0)
51
+ end
52
+ end
53
+
54
+ def prompt_to_confirm!
55
+ micro.prompt_user("Do you want to proceed (y/N)?", default: "Y") do |response|
56
+ exit(1) unless response.upcase.start_with?("Y")
57
+ end
58
+ end
59
+
60
+ end
@@ -1,132 +1,54 @@
1
- class Eco::API::UseCases::OozeSamples::OozeUpdateCase < Eco::API::Common::Loaders::UseCase
1
+ class Eco::API::UseCases::OozeSamples::OozeUpdateCase < Eco::API::UseCases::OozeSamples::OozeRunBaseCase
2
2
  name "single-ooze-case"
3
3
  type :other
4
4
 
5
- attr_reader :session, :options, :usecase
6
-
7
- SAVE_PATCH = "ooze_patch_update.json"
8
-
9
- def main(session, options, usecase)
10
- @session = session; @options = options; @usecase = usecase
11
- yield
12
- end_script!
13
- end
14
-
15
5
  private
16
6
 
17
- def end_script!
18
- exit_if_no_changes!
19
- backup_patch!
20
- launch_request unless options[:simulate]
21
- exit(0)
22
- end
23
-
24
- def ooze_id
25
- options.dig(:source, :ooze_id)
26
- end
27
-
28
- def stage_id
29
- options.dig(:source, :stage_id)
30
- end
31
-
32
- def stage(id_name = stage_id)
33
- if stg = ooze.stages[id_name] || ooze.stages.get_by_name(id_name)
34
- return apiv2.pages.get(ooze_id, stage_id: stg.id).tap do |stage|
35
- if stage
36
- new_target(stage)
37
- logger.info("Got #{object_reference(stage)} from #{object_reference(ooze)}")
38
- else
39
- logger.error("Could not get stage '#{id_name}' in ooze '#{ooze_id}'")
40
- exit(1)
41
- end
42
- end
7
+ def with_fields(type: nil, label: nil)
8
+ flds = target.components
9
+ flds = flds.get_by_type(type) if type
10
+ flds = flds.select do |fld|
11
+ value = (label == :unnamed) ? nil : label
12
+ !label || same_string?(fld.label, value)
13
+ end.each do |field|
14
+ yield(field) if block_given?
43
15
  end
44
- raise "Stage '#{id_name}' doesn't exist in ooze '#{ooze_id}'"
45
16
  end
46
17
 
47
- def ooze
48
- @ooze ||= apiv2.pages.get(ooze_id, stage_id: stage_id).tap do |ooze|
49
- if ooze
50
- new_target(ooze)
51
- logger.info("Got #{object_reference(ooze)}")
52
- else
53
- logger.error("Could not get ooze '#{ooze_id}'")
54
- exit(1)
55
- end
18
+ def with_sections(type: nil, heading: nil)
19
+ secs = target.sections
20
+ secs = secs.get_by_type(type) if type
21
+ secs = secs.select do |sec|
22
+ value = (heading == :unnamed) ? nil : heading
23
+ !heading || same_string?(sec.heading, value)
24
+ end.each do |sec|
25
+ yield(sec) if block_given?
56
26
  end
57
27
  end
58
28
 
59
- def launch_request
60
- prompt_to_confirm!
61
-
62
- apiv2.pages.update(target).tap do |response|
63
- if response.success?
64
- logger.info("All went OK")
65
- else
66
- logger.error(response.body)
67
- end
29
+ def with_stage(name:)
30
+ if stage = target.stages.get_by_name(name)
31
+ yield(stage) if block_given?
68
32
  end
33
+ stage
69
34
  end
70
35
 
71
- def exit_if_no_changes!
72
- unless changes = !!patch_doc["page"]
73
- logger.warn "No Changes!!"
74
- exit(0)
36
+ def add_field(name, type, section, after: nil, side: :left)
37
+ raise "You need to specify a section for a new field. Given: #{section.class}" unless section.is_a?(Ecoportal::API::V2::Page::Section)
38
+ target.components.add(label: name, type: type) do |field|
39
+ section.add_component(field, after: after, side: side)
40
+ end.tap do |field|
41
+ yield(field) if block_given?
75
42
  end
76
43
  end
77
44
 
78
- def apiv2
79
- @apiv2 ||= session.api(version: :oozes)
45
+ def to_field(value)
46
+ fld = nil
47
+ fld ||= value if value.is_a?(Ecoportal::API::V2::Page::Component)
48
+ fld ||= target.components.get_by_id(value)
49
+ fld ||= target.components.select {|fld| same_name?(fld.label, value)}
50
+ #fld ||= value.reference if value.is_a?(Ecoportal::API::V2::Page::Force::Binding)
80
51
  end
81
52
 
82
- def target
83
- @target
84
- end
85
-
86
- def new_target(object)
87
- if @target && patch_doc["page"]
88
- logger.warn "You you are switching to a new target #{object_reference(object)} after doing unsaved changes to #{object_reference(@target)}"
89
- end
90
- @target = object
91
- end
92
-
93
- def object_reference(obj)
94
- return "No reference" unless obj
95
- "".tap do |ref|
96
- case obj
97
- when Ecoportal::API::V2::Page::Stage
98
- ref << "Stage "
99
- when Ecoportal::API::V2::Pages::PageStage
100
- ref << "StagePage "
101
- when Ecoportal::API::V2::Page
102
- ref << "Page "
103
- end
104
- ref << "'#{obj.name}' " if obj.respond_to?(:name)
105
- end
106
- end
107
-
108
-
109
- def patch_doc
110
- apiv2.pages.get_body(target)
111
- end
112
-
113
- def backup_patch!
114
- # store the request
115
- File.open(SAVE_PATCH, "w") do |file|
116
- #file << (patch_doc || {}).to_json
117
- file << JSON.pretty_generate(patch_doc || {})
118
- end
119
- puts "Saved patch at: #{File.expand_path(SAVE_PATCH)}"
120
- end
121
-
122
- def logger
123
- session.logger
124
- end
125
-
126
- def prompt_to_confirm!
127
- micro.prompt_user("Do you want to proceed (y/N)?", default: "Y") do |response|
128
- exit(1) unless response.upcase.start_with?("Y")
129
- end
130
- end
131
53
 
132
54
  end
@@ -0,0 +1,160 @@
1
+ # Use case to update a register
2
+ # @note
3
+ # - You can define methods `filters` and `search` to change the target entries of the register
4
+ # - You need to define the `process_ooze` method
5
+ # This case expects `options[:source][:register_id]`
6
+ class Eco::API::UseCases::OozeSamples::RegisterUpdateCase < Eco::API::UseCases::OozeSamples::OozeBaseCase
7
+
8
+ class << self
9
+ # @return [Integer] the number of pages to be processed in each batch
10
+ def batch_size(size = nil)
11
+ @batch_size ||= 25
12
+ return @batch_size unless size
13
+ @batch_size = size
14
+ end
15
+ end
16
+
17
+ name "register-update-case"
18
+ type :other
19
+
20
+ def main(session, options, usecase, &block)
21
+ super(session, options, usecase) do
22
+ with_each_entry do |ooze|
23
+ process_ooze(&block)
24
+ end
25
+ end
26
+ end
27
+
28
+ def process_ooze(ooze = target)
29
+ raise "You need to define this method"
30
+ end
31
+
32
+ private
33
+
34
+ def before_loading_new_target(ooze_id)
35
+ if pending = queue_shift(ooze_id)
36
+ update_ooze(pending)
37
+ end
38
+ end
39
+
40
+ def new_target(object, warn_pending_changes: false)
41
+ enqueue(object)
42
+ super(object, warn_pending_changes: warn_pending_changes) do |pending|
43
+ #queue(pending)
44
+ end
45
+ end
46
+
47
+ def with_each_entry
48
+ batched_search_results do |page_results|
49
+ page_results.each do |page_result|
50
+ if pending = queue_shift(page_result.id)
51
+ if dirty?(pending)
52
+ msg = "Inconsistent search results. "
53
+ msg << "Launching update on '#{object_reference(pending)}' to be able to queue it back"
54
+ console.warn msg
55
+ update_ooze(pending)
56
+ end
57
+ end
58
+ if ooz = ooze(page_result.id)
59
+ yield(ooz)
60
+ end
61
+ end
62
+ update_oozes
63
+ end
64
+ end
65
+
66
+ def enqueue(object)
67
+ return unless object && object.respond_to?(:id)
68
+ if elem = queue_get(object.id)
69
+ msg = "Something is wrong. Native case 'RegisterUpdateCase' is "
70
+ if (elem != object) && dirty?(elem)
71
+ msg << "trying to queue different objects with same page id:\n"
72
+ msg << " • already queued (changes will go): #{object_reference(elem)}\n"
73
+ msg << " • tried to queue (lost changes): #{object_reference(object)}"
74
+ logger.warn msg
75
+ end
76
+ else
77
+ batch_queue << object unless batch_queue.include?(object)
78
+ end
79
+ end
80
+
81
+ def queue_shift(id = nil)
82
+ if id
83
+ batch_queue.delete(queue_get(id))
84
+ else
85
+ batch_queue.shift
86
+ end
87
+ end
88
+
89
+ def queue_get(id)
90
+ batch_queue.find {|e| e.id == id}
91
+ end
92
+
93
+ def batch_queue
94
+ @batch_queue ||= []
95
+ end
96
+
97
+ def batched_search_results
98
+ raise "Missing block. It yields in slices of #{self.class.batch_size} results" unless block_given?
99
+ results_preview
100
+ results = []
101
+ apiv2.registers.search(register_id, search_options) do |page_result|
102
+ results << page_result
103
+ if results.length >= self.class.batch_size
104
+ yield(results)
105
+ results = []
106
+ end
107
+ end
108
+ yield(results) unless results.empty?
109
+ end
110
+
111
+ def update_oozes(batched_oozes = batch_queue)
112
+ batched_oozes.each do |ooze|
113
+ update_ooze(ooze)
114
+ end
115
+ batched_oozes.clear
116
+ end
117
+
118
+ def backup_patch!(ooze = target)
119
+ unless patch = (patch_doc(ooze) || {})["page"]
120
+ logger.info "No changes to update for #{object_reference(ooze)}."
121
+ return
122
+ end
123
+ end
124
+
125
+ def results_preview
126
+ apiv2.registers.search(register_id, search_options.merge(only_first: true)).tap do |search_results|
127
+ str_results = "Total target entries: #{search_results.total} (out of #{search_results.total_before_filtering})"
128
+ session.prompt_user("Do you want to proceed (y/N):", explanation: str_results, default: "N", timeout: 10) do |res|
129
+ if res.upcase.start_with?("N")
130
+ puts "..."
131
+ logger.info "Aborting script..."
132
+ exit(0)
133
+ end
134
+ end
135
+ end
136
+ end
137
+
138
+ def search_options
139
+ @search_options ||= {}.tap do |opts|
140
+ opts.merge!(sort: "created_at")
141
+ opts.merge!(dir: "asc")
142
+ opts.merge!(query: conf_filters) if conf_search
143
+ opts.merge!(filters: conf_filters)
144
+ end
145
+ end
146
+
147
+ def conf_filters
148
+ return filters if self.respond_to?(:filters)
149
+ []
150
+ end
151
+
152
+ def conf_search
153
+ return search if self.respond_to?(:search)
154
+ end
155
+
156
+ def register_id
157
+ options.dig(:source, :register_id)
158
+ end
159
+
160
+ end
@@ -8,4 +8,9 @@ module Eco
8
8
  end
9
9
  end
10
10
 
11
+ require_relative 'ooze_samples/helpers'
12
+ require_relative 'ooze_samples/ooze_base_case'
13
+ require_relative 'ooze_samples/ooze_run_base_case'
11
14
  require_relative 'ooze_samples/ooze_update_case'
15
+ require_relative 'ooze_samples/ooze_from_doc_case'
16
+ require_relative 'ooze_samples/register_update_case'
data/lib/eco/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Eco
2
- VERSION = "2.0.32"
2
+ VERSION = "2.0.36"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eco-helpers
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.32
4
+ version: 2.0.36
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oscar Segura
@@ -136,7 +136,7 @@ dependencies:
136
136
  requirements:
137
137
  - - ">="
138
138
  - !ruby/object:Gem::Version
139
- version: 0.8.7
139
+ version: 0.8.12
140
140
  - - "<"
141
141
  - !ruby/object:Gem::Version
142
142
  version: '0.9'
@@ -146,7 +146,7 @@ dependencies:
146
146
  requirements:
147
147
  - - ">="
148
148
  - !ruby/object:Gem::Version
149
- version: 0.8.7
149
+ version: 0.8.12
150
150
  - - "<"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0.9'
@@ -350,6 +350,26 @@ dependencies:
350
350
  - - "<"
351
351
  - !ruby/object:Gem::Version
352
352
  version: '1.3'
353
+ - !ruby/object:Gem::Dependency
354
+ name: docx
355
+ requirement: !ruby/object:Gem::Requirement
356
+ requirements:
357
+ - - ">="
358
+ - !ruby/object:Gem::Version
359
+ version: 0.6.2
360
+ - - "<"
361
+ - !ruby/object:Gem::Version
362
+ version: '0.7'
363
+ type: :runtime
364
+ prerelease: false
365
+ version_requirements: !ruby/object:Gem::Requirement
366
+ requirements:
367
+ - - ">="
368
+ - !ruby/object:Gem::Version
369
+ version: 0.6.2
370
+ - - "<"
371
+ - !ruby/object:Gem::Version
372
+ version: '0.7'
353
373
  description:
354
374
  email:
355
375
  - oscar@ecoportal.co.nz
@@ -537,7 +557,13 @@ files:
537
557
  - lib/eco/api/usecases/default_cases/update_details_case.rb
538
558
  - lib/eco/api/usecases/default_cases/upsert_case.rb
539
559
  - lib/eco/api/usecases/ooze_samples.rb
560
+ - lib/eco/api/usecases/ooze_samples/helpers.rb
561
+ - lib/eco/api/usecases/ooze_samples/helpers/shortcuts.rb
562
+ - lib/eco/api/usecases/ooze_samples/ooze_base_case.rb
563
+ - lib/eco/api/usecases/ooze_samples/ooze_from_doc_case.rb
564
+ - lib/eco/api/usecases/ooze_samples/ooze_run_base_case.rb
540
565
  - lib/eco/api/usecases/ooze_samples/ooze_update_case.rb
566
+ - lib/eco/api/usecases/ooze_samples/register_update_case.rb
541
567
  - lib/eco/api/usecases/use_case.rb
542
568
  - lib/eco/api/usecases/use_case_chain.rb
543
569
  - lib/eco/api/usecases/use_case_io.rb