eco-helpers 0.6.17 → 0.7.1
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/.gitignore +19 -0
- data/.yardopts +2 -2
- data/Gemfile +6 -0
- data/Rakefile +27 -0
- data/eco-helpers.gemspec +9 -6
- data/lib/eco/api.rb +2 -1
- data/lib/eco/api/common/people.rb +1 -1
- data/lib/eco/api/common/people/base_parser.rb +31 -1
- data/lib/eco/api/common/people/default_parsers.rb +5 -1
- data/lib/eco/api/common/people/default_parsers/csv_parser.rb +37 -0
- data/lib/eco/api/common/people/default_parsers/numeric_parser.rb +0 -1
- data/lib/eco/api/common/people/entries.rb +14 -18
- data/lib/eco/api/common/people/entry_factory.rb +97 -9
- data/lib/eco/api/common/people/person_entry.rb +147 -206
- data/lib/eco/api/common/people/person_entry_attribute_mapper.rb +212 -0
- data/lib/eco/api/common/people/person_factory.rb +10 -12
- data/lib/eco/api/common/people/person_parser.rb +97 -37
- data/lib/eco/api/common/session/base_session.rb +1 -2
- data/lib/eco/api/common/session/file_manager.rb +1 -1
- data/lib/eco/api/organization.rb +2 -1
- data/lib/eco/api/organization/people.rb +54 -22
- data/lib/eco/api/organization/person_schemas.rb +54 -0
- data/lib/eco/api/organization/policy_groups.rb +5 -9
- data/lib/eco/api/organization/{presets.rb → presets_factory.rb} +1 -1
- data/lib/eco/api/policies.rb +10 -0
- data/lib/eco/api/policies/base_policy.rb +14 -0
- data/lib/eco/api/policies/policy.rb +20 -0
- data/lib/eco/api/policies/used_policies.rb +37 -0
- data/lib/eco/api/session.rb +36 -34
- data/lib/eco/api/session/batch.rb +94 -44
- data/lib/eco/api/session/batch_job.rb +108 -48
- data/lib/eco/api/session/batch_jobs.rb +4 -5
- data/lib/eco/api/session/batch_status.rb +70 -11
- data/lib/eco/api/session/config.rb +22 -5
- data/lib/eco/api/session/config/files.rb +10 -1
- data/lib/eco/api/session/config/people.rb +18 -5
- data/lib/eco/api/session/config/policies.rb +29 -0
- data/lib/eco/api/session/config/use_cases.rb +3 -7
- data/lib/eco/api/session/job_groups.rb +9 -10
- data/lib/eco/api/usecases.rb +2 -1
- data/lib/eco/api/usecases/base_case.rb +7 -2
- data/lib/eco/api/usecases/default_cases/change_email_case.rb +4 -2
- data/lib/eco/api/usecases/default_cases/create_case.rb +2 -1
- data/lib/eco/api/usecases/default_cases/create_details_case.rb +3 -1
- data/lib/eco/api/usecases/default_cases/create_details_with_supervisor_case.rb +4 -2
- data/lib/eco/api/usecases/default_cases/hris_case.rb +20 -13
- data/lib/eco/api/usecases/default_cases/new_email_case.rb +3 -1
- data/lib/eco/api/usecases/default_cases/new_id_case.rb +4 -2
- data/lib/eco/api/usecases/default_cases/recover_db_case.rb +9 -5
- data/lib/eco/api/usecases/default_cases/remove_account_case.rb +4 -2
- data/lib/eco/api/usecases/default_cases/set_supervisor_case.rb +4 -2
- data/lib/eco/api/usecases/default_cases/to_csv_case.rb +2 -2
- data/lib/eco/api/usecases/default_cases/to_csv_detailed_case.rb +2 -2
- data/lib/eco/api/usecases/default_cases/update_case.rb +16 -2
- data/lib/eco/api/usecases/default_cases/update_details_case.rb +3 -1
- data/lib/eco/api/usecases/default_cases/upsert_case.rb +25 -3
- data/lib/eco/api/usecases/use_case.rb +23 -140
- data/lib/eco/api/usecases/use_case_chain.rb +95 -0
- data/lib/eco/api/usecases/use_case_io.rb +117 -0
- data/lib/eco/api/usecases/use_group.rb +25 -5
- data/lib/eco/common/base_cli_backup.rb +1 -0
- data/lib/eco/language/models.rb +1 -1
- data/lib/eco/language/models/collection.rb +42 -31
- data/lib/eco/language/models/parser_serializer.rb +68 -0
- data/lib/eco/version.rb +1 -1
- metadata +93 -38
- data/lib/eco/api/common/people/types.rb +0 -47
- data/lib/eco/api/usecases/case_data.rb +0 -13
- data/lib/eco/language/models/attribute_parser.rb +0 -38
- data/lib/eco/lexic/dictionary.rb +0 -33
- data/lib/eco/lexic/dictionary/dictionary.txt +0 -355484
- data/lib/eco/lexic/dictionary/tags.json +0 -38
@@ -8,8 +8,10 @@ module Eco
|
|
8
8
|
@cases.define("new-email", type: :sync) do |entries, people, session, options|
|
9
9
|
job = session.job_group("main").new("update", type: :update, sets: :core)
|
10
10
|
|
11
|
+
strict_search = session.config.people.strict_search? || options.dig(:search, :strict)
|
12
|
+
|
11
13
|
entries.each.with_index do |entry, i|
|
12
|
-
if person = people.find(entry)
|
14
|
+
if person = people.find(entry, strict: strict_search)
|
13
15
|
person.email = entry.email
|
14
16
|
job.add(person)
|
15
17
|
else
|
@@ -5,11 +5,13 @@ module Eco
|
|
5
5
|
class NewIdCase < BaseCase
|
6
6
|
|
7
7
|
def process
|
8
|
-
@cases.define("new-id", type: :sync) do |entries, people, session|
|
8
|
+
@cases.define("new-id", type: :sync) do |entries, people, session, options|
|
9
9
|
job = session.job_group("main").new("update", type: :update, sets: :core)
|
10
10
|
|
11
|
+
strict_search = session.config.people.strict_search? || options.dig(:search, :strict)
|
12
|
+
|
11
13
|
entries.each.with_index do |entry, i|
|
12
|
-
if person = people.find(entry)
|
14
|
+
if person = people.find(entry, strict: strict_search)
|
13
15
|
person.external_id = entry.external_id
|
14
16
|
job.add(person)
|
15
17
|
else
|
@@ -14,15 +14,15 @@ module Eco
|
|
14
14
|
update = session.job_group("main").new("update", type: :update, sets: [:core, :details, :account])
|
15
15
|
remove = session.job_group("main").new("remove", type: :delete, sets: [:core, :details, :account])
|
16
16
|
|
17
|
+
strict_search = session.config.people.strict_search? || options.dig(:search, :strict)
|
17
18
|
pgs = session.policy_groups
|
18
19
|
|
19
20
|
if options.dig(:include, :delete)
|
20
21
|
people.exclude(entries).map {|person| remove.add(person)}
|
21
22
|
end
|
22
23
|
|
23
|
-
|
24
24
|
entries.each.with_index do |entry, i|
|
25
|
-
create = ! (person = people.find(entry))
|
25
|
+
create = ! (person = people.find(entry, strict: strict_search))
|
26
26
|
|
27
27
|
if create && !options.dig(:include, :create)
|
28
28
|
session.logger.error("Entry(#{i}) - this person does not exist: #{entry.email}")
|
@@ -32,11 +32,15 @@ module Eco
|
|
32
32
|
unless options.dig(:exclude, :core)
|
33
33
|
person.external_id = entry.external_id
|
34
34
|
person.name = entry.name
|
35
|
-
person.email = entry.email unless
|
36
|
-
person.supervisor_id = entry.supervisor_id
|
35
|
+
person.email = entry.email unless options.dig(:exclude, :email)
|
36
|
+
person.supervisor_id = entry.supervisor_id unless options.dig(:exclude, :supervisor)
|
37
|
+
end
|
38
|
+
|
39
|
+
unless options.dig(:exclude, :account)
|
40
|
+
person.account = entry.account
|
41
|
+
person.account&.send_invites = options[:send_invites] if options.key?(:send_invites)
|
37
42
|
end
|
38
43
|
|
39
|
-
person.account = entry.account unless options.dig(:exclude, :account)
|
40
44
|
person.details = entry.details unless options.dig(:exclude, :details)
|
41
45
|
|
42
46
|
creation.add(person) if create
|
@@ -14,11 +14,13 @@ module Eco
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
@cases.define("remove-account", type: :sync) do |entries, people, session|
|
17
|
+
@cases.define("remove-account", type: :sync) do |entries, people, session, options|
|
18
18
|
update = session.job_group("main").new("update", type: :update, sets: [:core, :account])
|
19
19
|
|
20
|
+
strict_search = session.config.people.strict_search? || options.dig(:search, :strict)
|
21
|
+
|
20
22
|
entries.each.with_index do |entry, i|
|
21
|
-
if person = people.find(entry)
|
23
|
+
if person = people.find(entry, strict: strict_search)
|
22
24
|
person.account = nil
|
23
25
|
update.add(person)
|
24
26
|
else
|
@@ -5,11 +5,13 @@ module Eco
|
|
5
5
|
class SetSupervisorCase < BaseCase
|
6
6
|
|
7
7
|
def process
|
8
|
-
@cases.define("set-supervisor", type: :sync) do |entries, people, session|
|
8
|
+
@cases.define("set-supervisor", type: :sync) do |entries, people, session, options|
|
9
9
|
job = session.job_group("main").new("update", type: :update, sets: :core)
|
10
10
|
|
11
|
+
strict_search = session.config.people.strict_search? || options.dig(:search, :strict)
|
12
|
+
|
11
13
|
entries.each.with_index do |entry, i|
|
12
|
-
person = people.find(entry)
|
14
|
+
person = people.find(entry, strict: strict_search)
|
13
15
|
|
14
16
|
if !person
|
15
17
|
session.logger.error("Entry(#{i}) - this person does not exist: #{entry.to_s(:identify)}")
|
@@ -18,8 +18,8 @@ module Eco
|
|
18
18
|
|
19
19
|
session.logger.info("going to create file: #{file}")
|
20
20
|
CSV.open(file, "w") do |csv|
|
21
|
-
deps
|
22
|
-
entry
|
21
|
+
deps = {"supervisor_id" => {people: people}}
|
22
|
+
entry = session.new_entry(people.first, dependencies: deps)
|
23
23
|
header = entry.to_hash.keys
|
24
24
|
|
25
25
|
if options.dig(:nice_header)
|
@@ -20,8 +20,8 @@ module Eco
|
|
20
20
|
|
21
21
|
session.logger.info("going to create file: #{file}")
|
22
22
|
CSV.open(file, "w") do |csv|
|
23
|
-
deps
|
24
|
-
header
|
23
|
+
deps = {"supervisor_id" => {people: people}}
|
24
|
+
header = session.new_entry(people.first, dependencies: deps).to_hash.keys
|
25
25
|
header += abilities
|
26
26
|
|
27
27
|
csv << header
|
@@ -5,13 +5,24 @@ module Eco
|
|
5
5
|
class UpdateCase < BaseCase
|
6
6
|
|
7
7
|
def process
|
8
|
+
#opts = CLI::Options.new do |p|
|
9
|
+
# p.option :exclude, "Allows to exclude certain options"
|
10
|
+
# p.suboption :exclude, :core, "Excludes core details from the update.", optional: true
|
11
|
+
# p.suboption :exclude, :details, "Excludes schema details from the update.", optional: true
|
12
|
+
# p.suboption :exclude, :account, "Excludes account details from the update.", optional: true
|
13
|
+
# p.suboption :exclude, :email, "Excludes core email from the update.", optional: true
|
14
|
+
# p.suboption :exclude, :supervisor, "Excludes supervisor_id from the update.", optional: true
|
15
|
+
# p.suboption :exclude, :abilities, "Excludes the abilities from the update.", optional: true
|
16
|
+
#end
|
17
|
+
|
8
18
|
@cases.define("update", type: :sync) do |entries, people, session, options|
|
9
19
|
update = session.job_group("main").new("update", type: :update, sets: [:core, :details, :account])
|
10
20
|
|
21
|
+
strict_search = session.config.people.strict_search? || options.dig(:search, :strict)
|
11
22
|
pgs = session.policy_groups
|
12
23
|
|
13
24
|
entries.each.with_index do |entry, i|
|
14
|
-
if person = people.find(entry)
|
25
|
+
if person = people.find(entry, strict: strict_search)
|
15
26
|
core_excluded = ["supervisor_id"]
|
16
27
|
core_excluded.push("email") if options.dig(:exclude, :email)
|
17
28
|
entry.set_core(person, exclude: core_excluded) unless options.dig(:exclude, :core)
|
@@ -27,7 +38,7 @@ module Eco
|
|
27
38
|
final: person.account.policy_group_ids
|
28
39
|
)
|
29
40
|
|
30
|
-
person.account.permissions_custom = session.new_preset(person) unless options.dig(:exclude, :abilities)
|
41
|
+
person.account.permissions_custom = session.new_preset(person) unless !create && options.dig(:exclude, :abilities)
|
31
42
|
|
32
43
|
if session.tagtree
|
33
44
|
person.account.filter_tags = session.tagtree.user_tags(
|
@@ -41,6 +52,9 @@ module Eco
|
|
41
52
|
tags = person.account.filter_tags
|
42
53
|
person.account.default_tag = tags.first unless tags.length > 1
|
43
54
|
end
|
55
|
+
|
56
|
+
person.account&.send_invites = options[:send_invites] if options.key?(:send_invites)
|
57
|
+
|
44
58
|
end
|
45
59
|
update.add(person)
|
46
60
|
else
|
@@ -8,8 +8,10 @@ module Eco
|
|
8
8
|
@cases.define("update-details", type: :sync) do |entries, people, session, options|
|
9
9
|
job = session.job_group("main").new("update", type: :update, sets: [:core, :details])
|
10
10
|
|
11
|
+
strict_search = session.config.people.strict_search? || options.dig(:search, :strict)
|
12
|
+
|
11
13
|
entries.each.with_index do |entry, i|
|
12
|
-
if person = people.find(entry)
|
14
|
+
if person = people.find(entry, strict: strict_search)
|
13
15
|
core_excluded = ["supervisor_id"]
|
14
16
|
core_excluded.push("email") if options.dig(:exclude, :email)
|
15
17
|
entry.set_core(person, exclude: core_excluded) unless options.dig(:exclude, :core)
|
@@ -8,11 +8,13 @@ module Eco
|
|
8
8
|
@cases.define("upsert", type: :sync) do |entries, people, session, options|
|
9
9
|
creation = session.job_group("main").new("create", type: :create, sets: [:core, :details, :account])
|
10
10
|
update = session.job_group("main").new("update", type: :update, sets: [:core, :details, :account])
|
11
|
+
supers = session.job_group("post").new("supers", type: :update, sets: :core)
|
11
12
|
|
13
|
+
strict_search = session.config.people.strict_search? || options.dig(:search, :strict)
|
12
14
|
pgs = session.policy_groups
|
13
15
|
|
14
16
|
entries.each.with_index do |entry, i|
|
15
|
-
create = ! (person = people.find(entry))
|
17
|
+
create = ! (person = people.find(entry, strict: strict_search))
|
16
18
|
person = session.new_person if create
|
17
19
|
|
18
20
|
core_excluded = ["supervisor_id"]
|
@@ -25,14 +27,14 @@ module Eco
|
|
25
27
|
ini_tags = person.account&.filter_tags || []
|
26
28
|
entry.set_account(person)
|
27
29
|
|
28
|
-
person.account.send_invites =
|
30
|
+
person.account.send_invites = options[:send_invites] if options.key?(:send_invites)
|
29
31
|
|
30
32
|
person.account.policy_group_ids = pgs.user_pg_ids(
|
31
33
|
initial: ini_pg_ids,
|
32
34
|
final: person.account.policy_group_ids
|
33
35
|
)
|
34
36
|
|
35
|
-
person.account.permissions_custom = session.new_preset(person) unless options.dig(:exclude, :abilities)
|
37
|
+
person.account.permissions_custom = session.new_preset(person) unless !create && options.dig(:exclude, :abilities)
|
36
38
|
|
37
39
|
if session.tagtree
|
38
40
|
person.account.filter_tags = session.tagtree.user_tags(
|
@@ -46,10 +48,30 @@ module Eco
|
|
46
48
|
tags = person.account.filter_tags
|
47
49
|
person.account.default_tag = tags.first unless tags.length > 1
|
48
50
|
end
|
51
|
+
|
49
52
|
end
|
50
53
|
|
51
54
|
creation.add(person) if create
|
52
55
|
update.add(person) unless create
|
56
|
+
|
57
|
+
# set supervisor
|
58
|
+
unless options.dig(:exclude, :core) || options.dig(:exclude, :supervisor)
|
59
|
+
if !(sup_id = entry.supervisor_id)
|
60
|
+
person.supervisor_id = nil
|
61
|
+
else
|
62
|
+
if supervisor = people.person(id: sup_id, external_id: sup_id, email: sup_id)
|
63
|
+
person.supervisor_id = supervisor.id
|
64
|
+
else
|
65
|
+
# delay setting supervisor if does not exit
|
66
|
+
supers.add(person) do |person|
|
67
|
+
person.consolidate!
|
68
|
+
person.supervisor_id = sup_id
|
69
|
+
person
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
53
75
|
end
|
54
76
|
end
|
55
77
|
end
|
@@ -10,164 +10,47 @@ module Eco
|
|
10
10
|
transform: [:people, :session],
|
11
11
|
export: [:people, :session, :options]
|
12
12
|
}
|
13
|
-
MAX_CHAINS = 70
|
14
|
-
@@num_chains = 0
|
15
13
|
|
16
|
-
attr_reader :name, :type, :
|
14
|
+
attr_reader :name, :type, :times_launched
|
15
|
+
|
16
|
+
class << self
|
17
|
+
def valid_type?(type)
|
18
|
+
TYPES.include?(type)
|
19
|
+
end
|
20
|
+
|
21
|
+
def type_params(type)
|
22
|
+
raise "Invalid type '#{type.to_s}'" if !valid_type?(type)
|
23
|
+
TYPE_PARAMS[type]
|
24
|
+
end
|
25
|
+
end
|
17
26
|
|
18
27
|
def initialize(name, type:, root:, options: {}, &block)
|
28
|
+
raise "Undefine usecase type #{type}. Please, use any of #{TYPES}" unless self.class.valid_type?(type)
|
19
29
|
|
20
30
|
self.root = root
|
21
|
-
@case
|
22
|
-
@name
|
23
|
-
@type
|
24
|
-
@options
|
25
|
-
|
26
|
-
@chains = []
|
27
|
-
@resolved_chains = nil
|
28
|
-
@times_used = 0
|
31
|
+
@case = block
|
32
|
+
@name = name
|
33
|
+
@type = type
|
34
|
+
@options = options
|
35
|
+
@times_launched = 0
|
29
36
|
end
|
30
37
|
|
31
38
|
def root=(value)
|
32
|
-
raise "You cannot change root UseGroup once the chains have been resolved" if @resolved_chains
|
33
39
|
raise "Root should be a UseGroup. Given: #{value}" if !value.is_a?(UseGroup)
|
34
40
|
@root = value
|
35
41
|
end
|
36
42
|
|
37
|
-
def
|
38
|
-
|
39
|
-
if preserve_chains
|
40
|
-
chain_use = {preserve_chains: recursive, recursive: recursive}
|
41
|
-
@chains = @chains.map do |usecase|
|
42
|
-
if usecase.respond_to? :call
|
43
|
-
Proc.new do |usegroup|
|
44
|
-
usecase = usecase.call(usegroup)
|
45
|
-
usecase.use(chain_use).chain_to(newcase)
|
46
|
-
usecase
|
47
|
-
end
|
48
|
-
else
|
49
|
-
usecase.use(chain_use).chain_to(newcase)
|
50
|
-
usecase
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
newcase
|
55
|
-
end
|
56
|
-
|
57
|
-
def process(input: nil, people: nil, session:, options: {})
|
58
|
-
raise "This case has been already used. To create multiple instances of same use case, use 'use' method" if @done
|
59
|
-
validate_args(input: input, people: people, session: session, options: options)
|
60
|
-
|
61
|
-
opts = options&.dup
|
62
|
-
opts = @options.merge(opts || {})
|
43
|
+
def launch(input: nil, people: nil, session:, options: {})
|
44
|
+
data = UseCaseIO.new(usecase: self, input: input, people: people, session: session, options: options)
|
63
45
|
|
64
|
-
|
65
|
-
|
66
|
-
out = input = @case.call(input, session, opts)
|
67
|
-
when :filter
|
68
|
-
out = people = @case.call(people, session, opts)
|
69
|
-
when :transform
|
70
|
-
out = jobs = into_a(@case.call(people, session, opts))
|
71
|
-
when :sync
|
72
|
-
out = jobs = into_a(@case.call(input, people, session, opts))
|
73
|
-
when :export
|
74
|
-
out = stat = @case.call(people, session, opts)
|
75
|
-
end
|
76
|
-
@times_used += 1
|
46
|
+
data.output = @case.call(data.params)
|
47
|
+
@times_launched += 1
|
77
48
|
|
78
49
|
data_model = {
|
79
50
|
self => {
|
80
|
-
|
51
|
+
io: data
|
81
52
|
}
|
82
53
|
}
|
83
|
-
post_usecase(data_model)
|
84
|
-
end
|
85
|
-
|
86
|
-
def chain(usecase = nil)
|
87
|
-
@@num_chains += 1
|
88
|
-
raise "Reached maximum number of chained use cases (#{MAX_CHAINS}). Looks like a recursive cyclic chain 'use'" if @@num_chains >= MAX_CHAINS
|
89
|
-
raise "A UseCase can only be chained with another UseCase" if usecase && !usecase.is_a?(UseCase)
|
90
|
-
raise "Missuse. Please use either parameter or block but not both" if block_given? && usecase
|
91
|
-
usecase = block_given?? Proc.new : usecase
|
92
|
-
@chains.push(usecase)
|
93
|
-
self
|
94
|
-
end
|
95
|
-
|
96
|
-
def self.valid_type(type)
|
97
|
-
TYPES.include?(type)
|
98
|
-
end
|
99
|
-
|
100
|
-
def self.type_params(type)
|
101
|
-
raise "Invalid type '#{type.to_s}'" if !valid_type?(type)
|
102
|
-
TYPE_PARAMS[type]
|
103
|
-
end
|
104
|
-
|
105
|
-
protected
|
106
|
-
|
107
|
-
def chain_to(usecase)
|
108
|
-
raise "A UseCase can only be chained with another UseCase" if usecase && !usecase.is_a?(UseCase)
|
109
|
-
usecase.chain(self)
|
110
|
-
end
|
111
|
-
|
112
|
-
def resolved_chains(use_group = nil)
|
113
|
-
return @resolved_chains if @resolved_chains
|
114
|
-
raise "Only UseGroup object can resolve chains. Given: #{use_group} " if use_group && !use_group.is_a?(UseGroup)
|
115
|
-
|
116
|
-
use_group = use_group || @root
|
117
|
-
@resolved_chains = @chains.map do |usecase|
|
118
|
-
usecase = usecase.call(use_group) if usecase.respond_to? :call
|
119
|
-
raise "A UseCase can only be chained with another UseCase" if usecase && !usecase.is_a?(UseCase)
|
120
|
-
usecase.resolved_chains(use_group)
|
121
|
-
usecase
|
122
|
-
end
|
123
|
-
@resolved_chains
|
124
|
-
end
|
125
|
-
|
126
|
-
private
|
127
|
-
|
128
|
-
def post_usecase(data_model)
|
129
|
-
return data_model if resolved_chains.empty?
|
130
|
-
data_model[self][:chains] = {} unless data_model[self][:chains]
|
131
|
-
|
132
|
-
resolved_chains.each do |usecase|
|
133
|
-
# chained cases use same params as parent case (out of simplicity)
|
134
|
-
params = data_model[self][:data].slice(*ALL_PARAMS) #TYPE_PARAMS[usecase.type])
|
135
|
-
data_model[self][:chains].merge(usecase.process(params))
|
136
|
-
end
|
137
|
-
data_model
|
138
|
-
end
|
139
|
-
|
140
|
-
def validate_args(input:, people:, session:, options:)
|
141
|
-
case
|
142
|
-
when !session.is_a?(Eco::API::Session)
|
143
|
-
raise "A UseCase needs a Session object. Given: #{session}"
|
144
|
-
when input_required? && !input
|
145
|
-
raise "UseCase of type '#{@type.to_s}' requires a valid input. None given"
|
146
|
-
when people_required? && !people.is_a?(Eco::API::Organization::People)
|
147
|
-
raise "UseCase of type '#{@type.to_s}' requires a People object. Given: #{people}"
|
148
|
-
when !options || (options && !options.is_a?(Hash))
|
149
|
-
raise "To inject dependencies via ':options' it should be a Hash object. Given: #{options}"
|
150
|
-
when options_required? && !options
|
151
|
-
raise "UseCase of type '#{@type.to_s}' requires a Hash ':options' object."
|
152
|
-
end
|
153
|
-
true
|
154
|
-
end
|
155
|
-
|
156
|
-
def input_required?
|
157
|
-
[:import, :sync].include?(@type)
|
158
|
-
end
|
159
|
-
|
160
|
-
def people_required?
|
161
|
-
[:filter, :transform, :sync, :export].include?(@type)
|
162
|
-
end
|
163
|
-
|
164
|
-
def options_required?
|
165
|
-
[:filter].include?(@type)
|
166
|
-
end
|
167
|
-
|
168
|
-
def into_a(value)
|
169
|
-
value = [].push(value) unless value.is_a?(Array)
|
170
|
-
value
|
171
54
|
end
|
172
55
|
|
173
56
|
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module Eco
|
2
|
+
module API
|
3
|
+
module UseCases
|
4
|
+
class UseCaseChain < UseCase
|
5
|
+
MAX_CHAINS = 70
|
6
|
+
@@num_chains = 0
|
7
|
+
|
8
|
+
def initialize(name, type:, root:, options: {}, &block)
|
9
|
+
super(name, type: type, root: root, options: options, &block)
|
10
|
+
@chains = []
|
11
|
+
@resolved_chains = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def root=(value)
|
15
|
+
raise "You cannot change root UseGroup once the chains have been resolved" if @resolved_chains
|
16
|
+
super(value)
|
17
|
+
end
|
18
|
+
|
19
|
+
def use(preserve_chains: false, recursive: false)
|
20
|
+
UseCase.new(@name, type: @type, root: @root, options: @options, &@case).tap do |newcase|
|
21
|
+
if preserve_chains
|
22
|
+
chain_use = {preserve_chains: recursive, recursive: recursive}
|
23
|
+
@chains = @chains.map do |usecase|
|
24
|
+
if usecase.respond_to? :call
|
25
|
+
Proc.new do |usegroup|
|
26
|
+
usecase = usecase.call(usegroup)
|
27
|
+
usecase.use(chain_use).chain_to(newcase)
|
28
|
+
usecase
|
29
|
+
end
|
30
|
+
elsif usecase.is_a?(UseCase)
|
31
|
+
usecase.use(chain_use).chain_to(newcase)
|
32
|
+
usecase
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def launch(input: nil, people: nil, session:, options: {})
|
40
|
+
data_model = super(input: input, people: people, session: session, options: options)
|
41
|
+
launch_chain(data_model)
|
42
|
+
end
|
43
|
+
|
44
|
+
def chain(usecase = nil)
|
45
|
+
@@num_chains += 1
|
46
|
+
raise "Reached maximum number of chained use cases (#{MAX_CHAINS}). Looks like a recursive cyclic chain 'use'" if @@num_chains >= MAX_CHAINS
|
47
|
+
raise "A UseCase can only be chained with another UseCase" if usecase && !usecase.is_a?(UseCase)
|
48
|
+
raise "Missuse. Please use either parameter or block but not both" if block_given? && usecase
|
49
|
+
usecase = block_given?? Proc.new : usecase
|
50
|
+
@chains.push(usecase)
|
51
|
+
self
|
52
|
+
end
|
53
|
+
|
54
|
+
protected
|
55
|
+
|
56
|
+
def chain_to(usecase)
|
57
|
+
raise "A UseCase can only be chained with another UseCase" if usecase && !usecase.is_a?(UseCase)
|
58
|
+
usecase.chain(self)
|
59
|
+
end
|
60
|
+
|
61
|
+
def resolved_chains(use_group = nil)
|
62
|
+
return @resolved_chains if @resolved_chains
|
63
|
+
raise "Only UseGroup object can resolve chains. Given: #{use_group} " if use_group && !use_group.is_a?(UseGroup)
|
64
|
+
|
65
|
+
use_group = use_group || @root
|
66
|
+
@resolved_chains = @chains.map do |usecase|
|
67
|
+
usecase = usecase.call(use_group) if usecase.respond_to? :call
|
68
|
+
raise "A UseCase can only be chained with another UseCase" if usecase && !usecase.is_a?(UseCase)
|
69
|
+
usecase.resolved_chains(use_group)
|
70
|
+
usecase
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def launch_chain(data_model)
|
77
|
+
return data_model if resolved_chains.empty?
|
78
|
+
|
79
|
+
data_model.tap do |dm|
|
80
|
+
dm[self][:chains] ||= {}
|
81
|
+
|
82
|
+
resolved_chains.each do |usecase|
|
83
|
+
# chained cases use same params as parent case (out of simplicity)
|
84
|
+
data_chain = dm[self][:io].chain(usecase: usecase)
|
85
|
+
keyed_data = data_chain.params(keyed: true)
|
86
|
+
dm[self][:chains].merge(usecase.launch(keyed_data))
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|