eco-helpers 2.0.31 → 2.0.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +48 -1
- data/eco-helpers.gemspec +2 -1
- data/lib/eco/api/session/batch/job.rb +3 -3
- data/lib/eco/api/session/batch.rb +1 -0
- data/lib/eco/api/usecases/default_cases/upsert_case.rb +1 -1
- data/lib/eco/api/usecases/ooze_samples/helpers/shortcuts.rb +77 -0
- data/lib/eco/api/usecases/ooze_samples/helpers.rb +13 -0
- data/lib/eco/api/usecases/ooze_samples/ooze_base_case.rb +142 -0
- data/lib/eco/api/usecases/ooze_samples/ooze_from_doc_case.rb +44 -0
- data/lib/eco/api/usecases/ooze_samples/ooze_run_base_case.rb +60 -0
- data/lib/eco/api/usecases/ooze_samples/ooze_update_case.rb +33 -111
- data/lib/eco/api/usecases/ooze_samples/register_update_case.rb +160 -0
- data/lib/eco/api/usecases/ooze_samples.rb +5 -0
- data/lib/eco/version.rb +1 -1
- metadata +29 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b4d6a312dda42afc3e6ba2becccf69d42121024d9b81e2c37276719089521971
|
4
|
+
data.tar.gz: a3536e8fba79c1600135b4c4fd523a9c3a5262d605c39c751a3dc278d096b96e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8fcb26823bc3b6e3d35522c13d410094ea056269c14dea3b47bcaf16991ff36cde9537507a6a21c952aa15f590fb1f5b1fc594e55d08f04782a8e2802c695d0c
|
7
|
+
data.tar.gz: fb2768c6e345da3dec034e7793876ecf25ae1cff76a059d98a38d9328c57884efb2a2f0b449eb28aea686ba074e477875fd8ba30201773170935f1c766fd45ae
|
data/CHANGELOG.md
CHANGED
@@ -1,11 +1,58 @@
|
|
1
1
|
# Change Log
|
2
2
|
All notable changes to this project will be documented in this file.
|
3
3
|
|
4
|
-
## [2.0.
|
4
|
+
## [2.0.35] - 2021-08-30
|
5
5
|
|
6
6
|
### Added
|
7
|
+
- `Eco::API::UseCases::OozeSamples::OozeBaseCase`
|
8
|
+
- `#new_target` optional warning when switching `target`
|
9
|
+
- `block` that is called when switching target and there were unsaved changes
|
10
|
+
- `#dirty?` helper method to check if there are changes
|
11
|
+
- `#before_loading_new_target` hook to allow child classes to anticipate when the `target` is going to change
|
7
12
|
|
8
13
|
### Changed
|
14
|
+
- `Eco::API::UseCases::OozeSamples::Helpers::Shortcuts#object_reference` improved reference text
|
15
|
+
- `Eco::API::UseCases::OozeSamples::RegisterUpdateCase`
|
16
|
+
- added resilience when switching target (i.e. from one stage to another stage in same entry)
|
17
|
+
- added `batch_queue`
|
18
|
+
|
19
|
+
### Fixed
|
20
|
+
- `Eco::API::UseCases::OozeSamples::RegisterUpdateCase`
|
21
|
+
- actual `batch_size` updates
|
22
|
+
- actual safe switch of target (i.e. against another stage of same ooze)
|
23
|
+
|
24
|
+
## [2.0.34] - 2021-08-28
|
25
|
+
|
26
|
+
### Added
|
27
|
+
- `Eco::API::UseCases::OozeSamples::OozeBaseCase` refactored ooze base case
|
28
|
+
- `Eco::API::UseCases::OozeSamples::RegisterUpdateCase` new case for full register update
|
29
|
+
|
30
|
+
### Changed
|
31
|
+
- `Eco::API::UseCases::OozeSamples::OozeRunBaseCase` made child of `OozeBaseCase` and simplified to its essential
|
32
|
+
- `Eco::API::UseCases::OozeSamples::OozeUpdateCase` remove unnecessary code and helpers that are now inherited from `OoozeBaseCase`
|
33
|
+
- `Eco::API::UseCases::OozeSamples::OozeFromDocCase` remove unnecessary code
|
34
|
+
|
35
|
+
|
36
|
+
## [2.0.33] - 2021-08-16
|
37
|
+
|
38
|
+
### Added
|
39
|
+
- `Eco::API::UseCases::OozeSamples::OozeFromDocCase` use case to abstract form from doc
|
40
|
+
- `docx` dependency
|
41
|
+
- A couple more of helpers for the Ooze Cases: `#titleize` & `#normalize_string`
|
42
|
+
|
43
|
+
### Changed
|
44
|
+
- `ecoporta-api-v2` **gem** (upgrade dependency)
|
45
|
+
|
46
|
+
### Fixed
|
47
|
+
- `Eco::API::UseCases::OozeSamples::OozeUpdateCase`, helper `with_stage`
|
48
|
+
|
49
|
+
## [2.0.32] - 2021-07-14
|
50
|
+
|
51
|
+
### Fixed
|
52
|
+
- `Eco::API::UseCases::OozeSamples::OozeUpdateCase` prompting user, fixed typo
|
53
|
+
- `Eco::API::Session::Batch::Job`: `include-excluded` again... typo.
|
54
|
+
|
55
|
+
## [2.0.31] - 2021-07-13
|
9
56
|
|
10
57
|
### Fixed
|
11
58
|
- `Eco::API::Session::Batch::Job`: `include-excluded` was triggering a type error.
|
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.
|
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
|
@@ -252,14 +252,14 @@ module Eco
|
|
252
252
|
# - filter out excluded entries from the api update
|
253
253
|
def api_included(full_queue)
|
254
254
|
return full_queue if type == :create
|
255
|
-
return full_queue unless
|
255
|
+
return full_queue unless excluded_callback = session.config.people.api_excluded
|
256
256
|
excluded = options.dig(:include, :excluded)
|
257
257
|
if excluded.is_a?(Hash) && excluded[:only]
|
258
|
-
full_queue.select {|entry|
|
258
|
+
full_queue.select {|entry| excluded_callback.call(entry, session, options, self)}
|
259
259
|
elsif options.dig(:include, :excluded)
|
260
260
|
full_queue
|
261
261
|
else
|
262
|
-
full_queue.select {|entry| !
|
262
|
+
full_queue.select {|entry| !excluded_callback.call(entry, session, options, self)}
|
263
263
|
end
|
264
264
|
end
|
265
265
|
|
@@ -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
|
@@ -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,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 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::
|
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
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
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
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
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
|
60
|
-
|
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
|
72
|
-
|
73
|
-
|
74
|
-
|
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
|
79
|
-
|
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
|
-
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
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.
|
4
|
+
version: 2.0.35
|
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.
|
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.
|
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
|