eco-helpers 0.6.4 → 0.6.5
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/.yardopts +10 -0
- data/eco-helpers.gemspec +2 -2
- data/lib/eco/api/organization/tag_tree.rb +11 -11
- data/lib/eco/api/session/batch.rb +3 -8
- data/lib/eco/api/usecases/default_cases.rb +6 -2
- data/lib/eco/api/usecases/default_cases/create_case.rb +60 -0
- data/lib/eco/api/usecases/default_cases/switch_supervisor_case.rb +3 -4
- data/lib/eco/api/usecases/default_cases/update_case.rb +58 -0
- data/lib/eco/api/usecases/default_cases/upsert_case.rb +61 -0
- data/lib/eco/cli.rb +1 -2
- data/lib/eco/cli/api.rb +14 -0
- data/lib/eco/cli/root.rb +1 -0
- data/lib/eco/common.rb +1 -0
- data/lib/eco/common/base_cli.rb +6 -99
- data/lib/eco/common/base_cli_backup.rb +119 -0
- data/lib/eco/common/meta_thor.rb +111 -0
- data/lib/eco/common/meta_thor/command_group.rb +36 -0
- data/lib/eco/common/meta_thor/command_unit.rb +48 -0
- data/lib/eco/common/meta_thor/input_backup.rb +111 -0
- data/lib/eco/common/meta_thor/input_multi_backup.rb +139 -0
- data/lib/eco/common/meta_thor/pipe.rb +85 -0
- data/lib/eco/common/meta_thor/thor.rb +1 -0
- data/lib/eco/common/meta_thor/thor/command.rb +36 -0
- data/lib/eco/common/meta_thor/value.rb +54 -0
- data/lib/eco/version.rb +1 -1
- metadata +16 -4
- data/lib/eco/api/usecases/default_cases/upsert_account_case.rb +0 -35
- data/lib/eco/cli/input.rb +0 -109
- data/lib/eco/cli/input_multi.rb +0 -137
@@ -0,0 +1,85 @@
|
|
1
|
+
module Eco
|
2
|
+
module Common
|
3
|
+
class MetaThor
|
4
|
+
class Pipe
|
5
|
+
SYM = "!"
|
6
|
+
SYMS = [SYM]
|
7
|
+
|
8
|
+
class << self
|
9
|
+
#def rex_pipes
|
10
|
+
# alternatives = Regex.escape(SYMS).join("|")
|
11
|
+
# /(#{alternatives})/g
|
12
|
+
#end
|
13
|
+
|
14
|
+
def type(str)
|
15
|
+
case str
|
16
|
+
when SYM
|
17
|
+
:standard
|
18
|
+
else
|
19
|
+
:unkown
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def pipe?(str)
|
24
|
+
SYMS.include?(str)
|
25
|
+
end
|
26
|
+
|
27
|
+
def piped?(args)
|
28
|
+
args.any? do |arg|
|
29
|
+
pipe?(arg)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def split(args, pipe_to_sym: false)
|
34
|
+
args = (args && [args].flatten) || []
|
35
|
+
if piped?(args)
|
36
|
+
args.reduce([[]]) do |groups,arg|
|
37
|
+
cg = []
|
38
|
+
cg = pipe?(arg) ? cg : groups.last
|
39
|
+
cg.push(arg) if arg
|
40
|
+
|
41
|
+
groups.push(cg) if pipe?(arg)
|
42
|
+
groups
|
43
|
+
end
|
44
|
+
else
|
45
|
+
[].push(args)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
attr_reader :type, :command
|
51
|
+
|
52
|
+
def initialize(command:)
|
53
|
+
@command = command
|
54
|
+
args = @command.source_args
|
55
|
+
@type = self.class.type(args.shift)
|
56
|
+
end
|
57
|
+
|
58
|
+
def standard?
|
59
|
+
@type == :standard
|
60
|
+
end
|
61
|
+
|
62
|
+
def command_group
|
63
|
+
command.group
|
64
|
+
end
|
65
|
+
|
66
|
+
def index
|
67
|
+
command.index
|
68
|
+
end
|
69
|
+
|
70
|
+
def input_index
|
71
|
+
return nil unless index > 0
|
72
|
+
case type
|
73
|
+
when :standard
|
74
|
+
index - 1
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def input
|
79
|
+
command_group[input_index].output if input_index
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require_relative 'thor/command'
|
@@ -0,0 +1,36 @@
|
|
1
|
+
class Thor
|
2
|
+
class Command
|
3
|
+
|
4
|
+
# By default, a command invokes a method in the thor class. You can change this
|
5
|
+
# implementation to create custom commands.
|
6
|
+
# Source: https://github.com/erikhuda/thor/blob/master/lib/thor/command.rb
|
7
|
+
# Trace:
|
8
|
+
# 1. Base_Class.start
|
9
|
+
# 2. Thor_Class.dispatch
|
10
|
+
# - (new) Base.initialize -> with options
|
11
|
+
# 3. Base_Instance.invoke_command (invocation.rb)
|
12
|
+
# 4. Command_Instance.run
|
13
|
+
# @note: modified so it integrates input/output for custom Pipe
|
14
|
+
def run(instance, args = [])
|
15
|
+
arity = nil
|
16
|
+
|
17
|
+
if private_method?(instance)
|
18
|
+
result = instance.class.handle_no_command_error(name)
|
19
|
+
elsif public_method?(instance)
|
20
|
+
arity = instance.method(name).arity
|
21
|
+
result = instance.__send__(name, *args)
|
22
|
+
elsif local_method?(instance, :method_missing)
|
23
|
+
result = instance.__send__(:method_missing, name.to_sym, *args)
|
24
|
+
else
|
25
|
+
result = instance.class.handle_no_command_error(name)
|
26
|
+
end
|
27
|
+
|
28
|
+
result
|
29
|
+
rescue ArgumentError => e
|
30
|
+
handle_argument_error?(instance, e, caller) ? instance.class.handle_argument_error(self, e, args, arity) : (raise e)
|
31
|
+
rescue NoMethodError => e
|
32
|
+
handle_no_method_error?(instance, e, caller) ? instance.class.handle_no_command_error(name) : (raise e)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Eco
|
2
|
+
module Common
|
3
|
+
class MetaThor
|
4
|
+
class Value
|
5
|
+
KEY = "MetaThorValue"
|
6
|
+
KEY_OPTION = "MetaThorJSON"
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def to_value(doc)
|
10
|
+
case
|
11
|
+
when doc.is_a?(Hash)
|
12
|
+
case
|
13
|
+
when doc.key?(KEY_OPTION)
|
14
|
+
to_value(doc[KEY_OPTION])
|
15
|
+
when doc.key?(KEY)
|
16
|
+
doc[KEY]
|
17
|
+
else
|
18
|
+
doc
|
19
|
+
end
|
20
|
+
when doc.is_a?(String)
|
21
|
+
to_value(JSON.parse(doc))
|
22
|
+
when doc.is_a?(Value)
|
23
|
+
value.value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def key?(object)
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
attr_reader :value
|
33
|
+
|
34
|
+
def initialize(value)
|
35
|
+
@doc = {"#{KEY}" => value}
|
36
|
+
end
|
37
|
+
|
38
|
+
def value
|
39
|
+
@doc[KEY]
|
40
|
+
end
|
41
|
+
|
42
|
+
def as_input_option
|
43
|
+
"--#{INPUT_OPTION}=#{KEY_OPTION}:#{@doc.to_json}"
|
44
|
+
end
|
45
|
+
|
46
|
+
def as_option
|
47
|
+
{"#{INPUT_SYM}" => self}
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
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: 0.6.
|
4
|
+
version: 0.6.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Oscar Segura
|
@@ -219,6 +219,7 @@ extra_rdoc_files: []
|
|
219
219
|
files:
|
220
220
|
- ".gitignore"
|
221
221
|
- ".rspec"
|
222
|
+
- ".yardopts"
|
222
223
|
- README.md
|
223
224
|
- eco-helpers.gemspec
|
224
225
|
- lib/eco-helpers.rb
|
@@ -278,6 +279,7 @@ files:
|
|
278
279
|
- lib/eco/api/usecases/case_data.rb
|
279
280
|
- lib/eco/api/usecases/default_cases.rb
|
280
281
|
- lib/eco/api/usecases/default_cases/change_email_case.rb
|
282
|
+
- lib/eco/api/usecases/default_cases/create_case.rb
|
281
283
|
- lib/eco/api/usecases/default_cases/create_details_case.rb
|
282
284
|
- lib/eco/api/usecases/default_cases/create_details_with_supervisor_case.rb
|
283
285
|
- lib/eco/api/usecases/default_cases/delete_case.rb
|
@@ -293,19 +295,29 @@ files:
|
|
293
295
|
- lib/eco/api/usecases/default_cases/set_supervisor_case.rb
|
294
296
|
- lib/eco/api/usecases/default_cases/switch_supervisor_case.rb
|
295
297
|
- lib/eco/api/usecases/default_cases/to_csv_case.rb
|
298
|
+
- lib/eco/api/usecases/default_cases/update_case.rb
|
296
299
|
- lib/eco/api/usecases/default_cases/update_details_case.rb
|
297
|
-
- lib/eco/api/usecases/default_cases/
|
300
|
+
- lib/eco/api/usecases/default_cases/upsert_case.rb
|
298
301
|
- lib/eco/api/usecases/use_case.rb
|
299
302
|
- lib/eco/api/usecases/use_group.rb
|
300
303
|
- lib/eco/cli.rb
|
301
|
-
- lib/eco/cli/
|
302
|
-
- lib/eco/cli/input_multi.rb
|
304
|
+
- lib/eco/cli/api.rb
|
303
305
|
- lib/eco/cli/root.rb
|
304
306
|
- lib/eco/cli/session.rb
|
305
307
|
- lib/eco/cli/session/batch.rb
|
306
308
|
- lib/eco/common.rb
|
307
309
|
- lib/eco/common/base_cli.rb
|
310
|
+
- lib/eco/common/base_cli_backup.rb
|
308
311
|
- lib/eco/common/language.rb
|
312
|
+
- lib/eco/common/meta_thor.rb
|
313
|
+
- lib/eco/common/meta_thor/command_group.rb
|
314
|
+
- lib/eco/common/meta_thor/command_unit.rb
|
315
|
+
- lib/eco/common/meta_thor/input_backup.rb
|
316
|
+
- lib/eco/common/meta_thor/input_multi_backup.rb
|
317
|
+
- lib/eco/common/meta_thor/pipe.rb
|
318
|
+
- lib/eco/common/meta_thor/thor.rb
|
319
|
+
- lib/eco/common/meta_thor/thor/command.rb
|
320
|
+
- lib/eco/common/meta_thor/value.rb
|
309
321
|
- lib/eco/data.rb
|
310
322
|
- lib/eco/data/crypto.rb
|
311
323
|
- lib/eco/data/crypto/encryption.rb
|
@@ -1,35 +0,0 @@
|
|
1
|
-
module Eco
|
2
|
-
module API
|
3
|
-
module UseCases
|
4
|
-
class DefaultCases
|
5
|
-
class UpsertAccountCase < BaseCase
|
6
|
-
|
7
|
-
def process
|
8
|
-
@cases.define("upsert-account", type: :sync) do |entries, people, session, options|
|
9
|
-
creation = session.job_group("main").new("create", type: :create, sets: [:core, :account])
|
10
|
-
update = session.job_group("main").new("update", type: :update, sets: [:core, :account])
|
11
|
-
|
12
|
-
entries.each.with_index do |entry, i|
|
13
|
-
create = false
|
14
|
-
unless person = people.find(entry)
|
15
|
-
create = true
|
16
|
-
person = session.new_person
|
17
|
-
entry.set_core(person)
|
18
|
-
#entry.set_details(person)
|
19
|
-
end
|
20
|
-
|
21
|
-
entry.set_account(person)
|
22
|
-
person.account.permissions_custom = session.new_preset(person)
|
23
|
-
person.account.send_invites = false if options.key?(:send_invites) && !options(:send_invites)
|
24
|
-
|
25
|
-
creation.add(person) if create
|
26
|
-
update.add(person) unless create
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/lib/eco/cli/input.rb
DELETED
@@ -1,109 +0,0 @@
|
|
1
|
-
module Eco
|
2
|
-
module CLI
|
3
|
-
class Input
|
4
|
-
MODES = [:both, :json, :value]
|
5
|
-
|
6
|
-
attr_reader :mode
|
7
|
-
|
8
|
-
def initialize(value, mode = :both)
|
9
|
-
@mode = mode
|
10
|
-
@mode = :both unless MODES.include?(mode)
|
11
|
-
|
12
|
-
@doc = {}
|
13
|
-
@doc['value'] = {} if self.value?
|
14
|
-
@doc['json'] = {} if self.json?
|
15
|
-
|
16
|
-
self.value = value
|
17
|
-
end
|
18
|
-
|
19
|
-
def to_h
|
20
|
-
@doc
|
21
|
-
end
|
22
|
-
|
23
|
-
def json?
|
24
|
-
@mode == :json || @mode = :both
|
25
|
-
end
|
26
|
-
|
27
|
-
def value?
|
28
|
-
@mode == :value || @mode = :both
|
29
|
-
end
|
30
|
-
|
31
|
-
def json
|
32
|
-
@doc['json'] if self.json?
|
33
|
-
end
|
34
|
-
|
35
|
-
def parse
|
36
|
-
JSON.parse(self.json) if self.json?
|
37
|
-
end
|
38
|
-
|
39
|
-
def json=(value)
|
40
|
-
@doc['value'] = value if self.value?
|
41
|
-
@doc['json'] = to_json(value) if self.json?
|
42
|
-
end
|
43
|
-
|
44
|
-
def value
|
45
|
-
return @doc['value'] if self.value?
|
46
|
-
self.parse
|
47
|
-
end
|
48
|
-
|
49
|
-
def value=(value)
|
50
|
-
@doc['value'] = value if self.value?
|
51
|
-
@doc['json'] = to_json(value) if self.json?
|
52
|
-
end
|
53
|
-
|
54
|
-
def present?(key)
|
55
|
-
self[key]&.present?
|
56
|
-
end
|
57
|
-
|
58
|
-
def empty?
|
59
|
-
return @doc['value'].keys.length == 0 if self.value?
|
60
|
-
@doc['json'].keys.length == 0
|
61
|
-
end
|
62
|
-
|
63
|
-
# merging implies that @mode is equalized to the lesser
|
64
|
-
# => :both.merge(:json) == :json ; :value.merge(:both) == :value mode
|
65
|
-
# => :json.merge(:value) will raise an exception
|
66
|
-
def merge(value)
|
67
|
-
merge_hash(hash(value))
|
68
|
-
self
|
69
|
-
end
|
70
|
-
|
71
|
-
private
|
72
|
-
|
73
|
-
def to_json(value)
|
74
|
-
if value.respond_to?(:as_json)
|
75
|
-
input.as_json
|
76
|
-
elsif value.respond_to?(:to_json)
|
77
|
-
value.to_json
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
def doc_mode(doc)
|
82
|
-
case doc
|
83
|
-
when String
|
84
|
-
doc = JSON.parse(doc)
|
85
|
-
return nil unless doc.is_a?(Hash)
|
86
|
-
doc_mode(doc)
|
87
|
-
when CliInput
|
88
|
-
doc.mode
|
89
|
-
when Hash
|
90
|
-
mod_json = doc.key?('json')
|
91
|
-
mod_value = doc.key?('value')
|
92
|
-
mod_json ? (mod_value ? :both : :json) : (mod_value ? :value : nil)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
def hash(value)
|
97
|
-
case value
|
98
|
-
when String
|
99
|
-
JSON.parse(value)
|
100
|
-
when CliInput
|
101
|
-
value.to_h
|
102
|
-
when Hash
|
103
|
-
value
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
data/lib/eco/cli/input_multi.rb
DELETED
@@ -1,137 +0,0 @@
|
|
1
|
-
module Eco
|
2
|
-
module CLI
|
3
|
-
class MultiInput
|
4
|
-
MODES = [:both, :json, :value]
|
5
|
-
|
6
|
-
attr_reader :mode
|
7
|
-
|
8
|
-
def initialize(doc = {}, mode = :both)
|
9
|
-
@mode = doc_mode(doc) || mode
|
10
|
-
@mode = :both unless MODES.include?(@mode)
|
11
|
-
|
12
|
-
@doc = {}
|
13
|
-
@doc['value'] = {} if self.value?
|
14
|
-
@doc['json'] = {} if self.json?
|
15
|
-
|
16
|
-
self.merge(doc) unless doc.empty?
|
17
|
-
end
|
18
|
-
|
19
|
-
def to_h
|
20
|
-
@doc
|
21
|
-
end
|
22
|
-
|
23
|
-
def json?
|
24
|
-
@mode == :json || @mode = :both
|
25
|
-
end
|
26
|
-
|
27
|
-
def value?
|
28
|
-
@mode == :value || @mode = :both
|
29
|
-
end
|
30
|
-
|
31
|
-
def json(key)
|
32
|
-
@doc.dig('json', key)
|
33
|
-
end
|
34
|
-
|
35
|
-
def [](key)
|
36
|
-
return @doc.dig('value', key) if self.value?
|
37
|
-
JSON.parse(@doc.dig('json', key))
|
38
|
-
end
|
39
|
-
|
40
|
-
def []=(key, value)
|
41
|
-
@doc['value'][key] = value if self.value?
|
42
|
-
@doc['json'][key] = to_json(value) if self.json?
|
43
|
-
end
|
44
|
-
|
45
|
-
def delete(key)
|
46
|
-
if self.key?(key)
|
47
|
-
value = @doc['value'].delete(key) if self.value?
|
48
|
-
value2 = JSON.parse(@doc['json'].delete(key)) if self.json?
|
49
|
-
return value if self.value?
|
50
|
-
value2
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def key?(key)
|
55
|
-
return @doc['value'].key?(key) if self.value?
|
56
|
-
@doc['json'].key?(key)
|
57
|
-
end
|
58
|
-
|
59
|
-
def present?(key)
|
60
|
-
self[key]&.present?
|
61
|
-
end
|
62
|
-
|
63
|
-
def empty?
|
64
|
-
return @doc['value'].keys.length == 0 if self.value?
|
65
|
-
@doc['json'].keys.length == 0
|
66
|
-
end
|
67
|
-
|
68
|
-
# merging implies that @mode is equalized to the lesser
|
69
|
-
# => :both.merge(:json) == :json ; :value.merge(:both) == :value mode
|
70
|
-
# => :json.merge(:value) will raise an exception
|
71
|
-
def merge(value)
|
72
|
-
merge_hash(hash(value))
|
73
|
-
self
|
74
|
-
end
|
75
|
-
|
76
|
-
private
|
77
|
-
|
78
|
-
def to_json(value)
|
79
|
-
if value.respond_to?(:as_json)
|
80
|
-
input.as_json
|
81
|
-
elsif value.respond_to?(:to_json)
|
82
|
-
value.to_json
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
def doc_mode(doc)
|
87
|
-
case doc
|
88
|
-
when String
|
89
|
-
doc = JSON.parse(doc)
|
90
|
-
return nil unless doc.is_a?(Hash)
|
91
|
-
doc_mode(doc)
|
92
|
-
when CliInput
|
93
|
-
doc.mode
|
94
|
-
when Hash
|
95
|
-
mod_json = doc.key?('json')
|
96
|
-
mod_value = doc.key?('value')
|
97
|
-
mod_json ? (mod_value ? :both : :json) : (mod_value ? :value : nil)
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def hash(value)
|
102
|
-
case value
|
103
|
-
when String
|
104
|
-
JSON.parse(value)
|
105
|
-
when CliInput
|
106
|
-
value.to_h
|
107
|
-
when Hash
|
108
|
-
value
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
def merge_hash(value)
|
113
|
-
err_input = "Error: merge requires a correct Hashable value or a #{self.class.name} instance."
|
114
|
-
err_incompatible = "Error: can't merge value mode with json mode."
|
115
|
-
raise err_input unless value.is_a?(Hash)
|
116
|
-
return unless !value.empty?
|
117
|
-
|
118
|
-
raise err_input if ! (mode = doc_mode(value))
|
119
|
-
raise err_incompatible if ! (new_mode = resolve_mode(mode))
|
120
|
-
@mode = new_mode
|
121
|
-
|
122
|
-
@doc.delete('json') unless self.json?
|
123
|
-
@doc.delete('value') unless self.value?
|
124
|
-
|
125
|
-
@doc['json'].merge(value['json']) if self.json?
|
126
|
-
@doc['value'].merge(value['value']) if self.value?
|
127
|
-
end
|
128
|
-
|
129
|
-
def resolve_mode(mode)
|
130
|
-
return mode if @mode == :both
|
131
|
-
return @mode if mode == :both
|
132
|
-
return mode if @mode == mode
|
133
|
-
end
|
134
|
-
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|