eco-helpers 0.8.3 → 0.8.4

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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/eco-helpers.gemspec +0 -2
  3. data/lib/eco-helpers.rb +0 -1
  4. data/lib/eco/api/common/people/person_entry.rb +67 -30
  5. data/lib/eco/api/common/version_patches.rb +2 -1
  6. data/lib/eco/api/common/version_patches/base_model.rb +27 -0
  7. data/lib/eco/api/organization/people.rb +6 -0
  8. data/lib/eco/api/organization/tag_tree.rb +6 -0
  9. data/lib/eco/api/policies/policy.rb +2 -2
  10. data/lib/eco/api/session.rb +23 -30
  11. data/lib/eco/api/session/batch.rb +3 -2
  12. data/lib/eco/api/session/batch_job.rb +18 -10
  13. data/lib/eco/api/session/batch_status.rb +27 -11
  14. data/lib/eco/api/session/config.rb +20 -7
  15. data/lib/eco/api/usecases/default_cases/change_email_case.rb +2 -6
  16. data/lib/eco/api/usecases/default_cases/refresh_presets_case.rb +3 -2
  17. data/lib/eco/api/usecases/use_case.rb +6 -5
  18. data/lib/eco/api/usecases/use_case_chain.rb +3 -3
  19. data/lib/eco/api/usecases/use_case_io.rb +3 -3
  20. data/lib/eco/assets.rb +3 -1
  21. data/lib/eco/{common → assets}/language.rb +2 -2
  22. data/lib/eco/cli.rb +3 -4
  23. data/lib/eco/cli/config.rb +10 -0
  24. data/lib/eco/cli/config/options.rb +11 -0
  25. data/lib/eco/cli/scripting.rb +23 -0
  26. data/lib/eco/cli/scripting/args_helpers.rb +55 -0
  27. data/lib/eco/cli/scripting/argument.rb +31 -0
  28. data/lib/eco/cli/scripting/arguments.rb +70 -0
  29. data/lib/eco/common.rb +1 -3
  30. data/lib/eco/data/crypto/encryption.rb +2 -2
  31. data/lib/eco/language/models/collection.rb +1 -1
  32. data/lib/eco/version.rb +1 -1
  33. metadata +9 -62
  34. data/lib/eco/cli/api.rb +0 -14
  35. data/lib/eco/cli/root.rb +0 -9
  36. data/lib/eco/cli/session.rb +0 -9
  37. data/lib/eco/cli/session/batch.rb +0 -9
  38. data/lib/eco/common/base_cli.rb +0 -23
  39. data/lib/eco/common/base_cli_backup.rb +0 -120
  40. data/lib/eco/common/meta_thor.rb +0 -111
  41. data/lib/eco/common/meta_thor/command_group.rb +0 -36
  42. data/lib/eco/common/meta_thor/command_unit.rb +0 -48
  43. data/lib/eco/common/meta_thor/input_backup.rb +0 -111
  44. data/lib/eco/common/meta_thor/input_multi_backup.rb +0 -139
  45. data/lib/eco/common/meta_thor/pipe.rb +0 -85
  46. data/lib/eco/common/meta_thor/thor.rb +0 -1
  47. data/lib/eco/common/meta_thor/thor/command.rb +0 -36
  48. data/lib/eco/common/meta_thor/value.rb +0 -54
  49. data/lib/eco/scripting.rb +0 -32
  50. data/lib/eco/scripting/README.md +0 -11
  51. data/lib/eco/scripting/args_helpers.rb +0 -53
  52. data/lib/eco/scripting/argument.rb +0 -29
  53. data/lib/eco/scripting/arguments.rb +0 -68
@@ -5,8 +5,6 @@ module Eco
5
5
  TYPES = [:get, :create, :update, :delete]
6
6
  SETS = [:core, :details, :account]
7
7
 
8
- attr_reader :name, :status
9
-
10
8
  class << self
11
9
  def valid_type?(value)
12
10
  TYPES.include?(value)
@@ -18,15 +16,20 @@ module Eco
18
16
  end
19
17
  end
20
18
 
21
- def initialize(e, name:, type:, sets:)
19
+ attr_reader :name, :status
20
+ attr_reader :usecase
21
+
22
+ def initialize(e, name:, type:, sets:, usecase: nil)
22
23
  raise "A name is required to refer a job. Given: #{name}" if !name
23
24
  raise "Type should be one of #{TYPES}. Given: #{type}" if !self.class.valid_type?(type)
24
25
  raise "Sets should be some of #{SETS}. Given: #{sets}" if !self.class.valid_sets?(sets)
26
+ raise "usecase must be a Eco::API::UseCases::UseCase object. Given: #{usecase.class}" if usecase && !usecase.is_a?(Eco::API::UseCases::UseCase)
25
27
  super(e)
26
28
 
27
- @name = name
28
- @type = type
29
- @sets = [sets].flatten.compact
29
+ @name = name
30
+ @type = type
31
+ @usecase = usecase
32
+ @sets = [sets].flatten.compact
30
33
  reset
31
34
  end
32
35
 
@@ -37,8 +40,12 @@ module Eco
37
40
  @status = nil
38
41
  end
39
42
 
43
+ def usecase?
44
+ !!usecase
45
+ end
46
+
40
47
  def signature
41
- "job \"#{@name}\" ['#{@type.to_s.upcase}': #{sets_title}]"
48
+ "job \"#{name}\" ['#{@type.to_s.upcase}': #{sets_title}]"
42
49
  end
43
50
 
44
51
  def match?(type:, sets:)
@@ -47,7 +54,7 @@ module Eco
47
54
  end
48
55
 
49
56
  def pending?
50
- @queue.length > 0
57
+ !@status
51
58
  end
52
59
 
53
60
  def core?
@@ -124,7 +131,7 @@ module Eco
124
131
  @status.queue.map do |entry|
125
132
  if @status.success?(entry)
126
133
  entry.consolidate! if entry.respond_to?(:consolidate!)
127
- #else # shouldn't probably reset, as the model remains dirty? (well tracaked)
134
+ #else # shouldn't probably reset, as the model should remain dirty? (well tracaked)
128
135
  # entry.reset! if entry.respond_to?(:reset!)
129
136
  end
130
137
  end
@@ -139,7 +146,8 @@ module Eco
139
146
  pre_queue.tap do |entries|
140
147
  policies = session.config.policies
141
148
  unless policies.empty?
142
- policies.launch(people: people(entries), session: session)
149
+ options = usecase?? usecase.options : {}
150
+ policies.launch(people: people(entries), session: session, options: options)
143
151
  end
144
152
  end
145
153
  end
@@ -4,6 +4,7 @@ module Eco
4
4
  class BatchStatus < Common::Session::BaseSession
5
5
  TYPES = [:exact, :search]
6
6
 
7
+ attr_reader :source_queue
7
8
  attr_reader :queue, :method, :type
8
9
  attr_reader :root
9
10
 
@@ -17,9 +18,19 @@ module Eco
17
18
  super(e)
18
19
  fatal("In batch operations you must batch an Enumerable. Received: #{queue}") unless queue && queue.is_a?(Enumerable)
19
20
 
20
- self.type = type
21
- @method = method
21
+ self.type = type
22
+ @method = method
23
+ @source_queue = queue
24
+
25
+ que = queue.to_a
26
+ que = queue if queue.respond_to?(:uniq)
27
+ if que.length != que.uniq.length
28
+ logger.warn("Please, review your entries-to-query builder, you have repeated entries")
29
+ queue = que.uniq
30
+ end
31
+
22
32
  @queue = queue
33
+
23
34
  @hash = @queue.each_with_index.map do |entry, i|
24
35
  [entry, i]
25
36
  end.to_h
@@ -96,12 +107,12 @@ module Eco
96
107
  def error_queries
97
108
  queue.each_with_index.map do |query,i|
98
109
  unless self[i]
99
- pp "Error: query with no response. You might have duplicated entries in your queue.\n"
100
- msg = "Queue length: #{queue.length}\n"
110
+ msg = "Error: query with no response. You might have duplicated entries in your queue.\n"
111
+ msg += "Queue length: #{queue.length}; Queue elements class: #{queue.first.class}\n"
101
112
  msg += "Query with no response. Person: #{person_ref(query)}\n"
102
113
  queue.map do |entry|
103
- if entry.id == query.id || entry.external_id == query.external_id || entry.email == query.email
104
- msg += "It could be this peson entry: #{person_ref(entry)}\n"
114
+ if [:id, :external_id, :email].any? {|attr| (v = get_attr(entry, attr)) && v == get_attr(query, attr)}
115
+ msg += "It could be this peson entry (idx: #{to_index(entry)}): #{person_ref(entry)}\n"
105
116
  end
106
117
  end
107
118
  raise msg
@@ -123,7 +134,7 @@ module Eco
123
134
  msg = ""
124
135
  unless success?(key)
125
136
  i = to_index(key)
126
- entry = queue[i]
137
+ entry = queue.to_a[i]
127
138
  response = self[i]
128
139
  msg = "Error #{response.status}: #{response.body}\n"
129
140
  msg += "-- Failed to batch #{method} (entry #{i+1}). Person: #{person_ref(entry)}"
@@ -165,10 +176,15 @@ module Eco
165
176
  private
166
177
 
167
178
  def person_ref(entry)
168
- is_person = entry.is_a?(Ecoportal::API::Internal::Person) || entry.is_a?(Ecoportal::API::V1::Person)
169
- ref = nil
170
- ref = "'#{entry.name}' ('#{entry.external_id}': '#{entry.email}')" if is_person
171
- ref
179
+ "(id: '#{get_attr(entry, :id)}')'#{get_attr(entry, :name)}' ('#{get_attr(entry, :external_id)}': '#{get_attr(entry, :email)}')"
180
+ end
181
+
182
+ def get_attr(entry, attr)
183
+ if entry.respond_to?(attr.to_sym)
184
+ entry.public_send(attr.to_sym)
185
+ elsif entry.is_a?(Hash)
186
+ entry["#{attr}"]
187
+ end
172
188
  end
173
189
 
174
190
  def to_index(key)
@@ -24,24 +24,28 @@ module Eco
24
24
  yield(self)
25
25
  end
26
26
 
27
+ def cli
28
+ self["cli"] ||= Eco::CLI::Config.new
29
+ end
30
+
27
31
  def apis
28
- self["apis"] ||= Session::Config::Apis.new(config: self)
32
+ self["apis"] ||= Eco::API::Session::Config::Apis.new(config: self)
29
33
  end
30
34
 
31
35
  def logger
32
- self["logger"] ||= Session::Config::Logger.new(config: self)
36
+ self["logger"] ||= Eco::API::Session::Config::Logger.new(config: self)
33
37
  end
34
38
 
35
39
  def s3storage
36
- self["s3_storage"] ||= Session::Config::S3Storage.new(config: self)
40
+ self["s3_storage"] ||= Eco::API::Session::Config::S3Storage.new(config: self)
37
41
  end
38
42
 
39
43
  def files
40
- self["files"] ||= Session::Config::Files.new(config: self)
44
+ self["files"] ||= Eco::API::Session::Config::Files.new(config: self)
41
45
  end
42
46
 
43
47
  def mailer
44
- self["mailer"] ||= Session::Config::Mailer.new(config: self)
48
+ self["mailer"] ||= Eco::API::Session::Config::Mailer.new(config: self)
45
49
  end
46
50
 
47
51
  def org
@@ -49,7 +53,7 @@ module Eco
49
53
  end
50
54
 
51
55
  def people
52
- self["people"] ||= Session::Config::People.new(config: self)
56
+ self["people"] ||= Eco::API::Session::Config::People.new(config: self)
53
57
  end
54
58
 
55
59
  # LOGGER
@@ -163,9 +167,18 @@ module Eco
163
167
  org["tagtree"] = file
164
168
  end
165
169
 
170
+ def tagtree(enviro: nil)
171
+ return @tagtree if instance_variable_defined?(:@tagtree) && @tagtree.enviro == enviro
172
+ if tree_file = org["tagtree"]
173
+ tree = []
174
+ tree = file_manager.load_json(tree_file) unless !tree_file
175
+ @tagtree = Eco::API::Organization::TagTree.new(tree, enviro: enviro)
176
+ end
177
+ end
178
+
166
179
  def policy_groups
167
180
  return @policy_groups if instance_variable_defined?(:@policy_groups)
168
- pgs = api&.policy_groups.to_a
181
+ pgs = api&.policy_groups.to_a
169
182
  @policy_groups = Eco::API::Organization::PolicyGroups.new(pgs)
170
183
  end
171
184
 
@@ -6,8 +6,8 @@ module Eco
6
6
 
7
7
  def process
8
8
  @cases.define("change-email", type: :sync) do |entries, people, session, options|
9
- remove = session.job_group("main").new("remove account", type: :update, sets: :account)
10
- change = session.job_group("main").new("change email", type: :update, sets: :core)
9
+ remove = session.job_group("main").new("remove account", type: :update, sets: :account)
10
+ change = session.job_group("main").new("change email", type: :update, sets: :core)
11
11
  add_account = session.job_group("post").new("add account", type: :update, sets: :account)
12
12
 
13
13
  strict_search = session.config.people.strict_search? && (!options[:search]&.key?(:strict) || options.dig(:search, :strict))
@@ -25,15 +25,11 @@ module Eco
25
25
 
26
26
  new_email = entry.email
27
27
  change.add(person) do |person|
28
- person.sync
29
28
  person.email = new_email
30
- person
31
29
  end
32
30
 
33
31
  add_account.add(person) do |person|
34
- person.sync
35
32
  person.account = account
36
- person
37
33
  end
38
34
  end
39
35
 
@@ -8,8 +8,9 @@ module Eco
8
8
  @cases.define("refresh-presets", type: :transform) do |people, session|
9
9
  job = session.job_group("main").new("update", type: :update, sets: :account)
10
10
 
11
- people = people.users
12
- people.each do |person|
11
+ users = people.users
12
+ session.logger.warn("There are no people with account amoung your #{people.length} people")
13
+ users.each do |person|
13
14
  person.account.permissions_custom = session.new_preset(person)
14
15
  job.add(person)
15
16
  end
@@ -10,9 +10,7 @@ module Eco
10
10
  transform: [:people, :session],
11
11
  export: [:people, :session, :options]
12
12
  }
13
-
14
- attr_reader :name, :type, :times_launched
15
-
13
+
16
14
  class << self
17
15
  def valid_type?(type)
18
16
  TYPES.include?(type)
@@ -24,14 +22,16 @@ module Eco
24
22
  end
25
23
  end
26
24
 
27
- def initialize(name, type:, root:, options: {}, &block)
25
+ attr_reader :name, :type, :times_launched
26
+ attr_reader :options
27
+
28
+ def initialize(name, type:, root:, &block)
28
29
  raise "Undefined usecase type #{type}, when creating '#{name}'. Please, use any of #{TYPES}" unless self.class.valid_type?(type)
29
30
 
30
31
  self.root = root
31
32
  @case = block
32
33
  @name = name
33
34
  @type = type
34
- @options = options
35
35
  @times_launched = 0
36
36
  end
37
37
 
@@ -41,6 +41,7 @@ module Eco
41
41
  end
42
42
 
43
43
  def launch(input: nil, people: nil, session:, options: {})
44
+ @options = options
44
45
  data = UseCaseIO.new(usecase: self, input: input, people: people, session: session, options: options)
45
46
 
46
47
  data.output = @case.call(data.params)
@@ -5,8 +5,8 @@ module Eco
5
5
  MAX_CHAINS = 70
6
6
  @@num_chains = 0
7
7
 
8
- def initialize(name, type:, root:, options: {}, &block)
9
- super(name, type: type, root: root, options: options, &block)
8
+ def initialize(name, type:, root:, &block)
9
+ super(name, type: type, root: root, &block)
10
10
  @chains = []
11
11
  @resolved_chains = nil
12
12
  end
@@ -17,7 +17,7 @@ module Eco
17
17
  end
18
18
 
19
19
  def use(preserve_chains: false, recursive: false)
20
- UseCase.new(@name, type: @type, root: @root, options: @options, &@case).tap do |newcase|
20
+ UseCase.new(@name, type: @type, root: @root, &@case).tap do |newcase|
21
21
  if preserve_chains
22
22
  chain_use = {preserve_chains: recursive, recursive: recursive}
23
23
  @chains = @chains.map do |usecase|
@@ -87,13 +87,13 @@ module Eco
87
87
  when !session.is_a?(Eco::API::Session)
88
88
  raise "A UseCase needs a Session object. Given: #{session}"
89
89
  when input_required? && !input
90
- raise "UseCase of type '#{@type.to_s}' requires a valid input. None given"
90
+ raise "UseCase of type '#{type}' requires a valid input. None given"
91
91
  when people_required? && !people.is_a?(Eco::API::Organization::People)
92
- raise "UseCase of type '#{@type.to_s}' requires a People object. Given: #{people}"
92
+ raise "UseCase of type '#{type}' requires a People object. Given: #{people}"
93
93
  when !options || (options && !options.is_a?(Hash))
94
94
  raise "To inject dependencies via ':options' it should be a Hash object. Given: #{options}"
95
95
  when options_required? && !options
96
- raise "UseCase of type '#{@type.to_s}' requires a Hash ':options' object."
96
+ raise "UseCase of type '#{type}' requires a Hash ':options' object."
97
97
  end
98
98
  true
99
99
  end
data/lib/eco/assets.rb CHANGED
@@ -38,5 +38,7 @@ module Eco
38
38
  end
39
39
  end
40
40
 
41
+ require_relative 'assets/language'
42
+
43
+
41
44
  ASSETS = Eco::Assets.new
42
- #require_relative 'assets/'
@@ -1,9 +1,9 @@
1
1
  module Eco
2
- module Common
2
+ class Assets
3
3
  class Language
4
4
  include Eco::Language
5
5
  end
6
6
  end
7
7
  end
8
8
 
9
- Handy = Eco::Common::Language.new
9
+ Handy = Eco::Assets::Language.new
data/lib/eco/cli.rb CHANGED
@@ -1,8 +1,7 @@
1
1
  module Eco
2
- module CLI
2
+ class CLI
3
3
  end
4
4
  end
5
5
 
6
- require_relative 'cli/api'
7
- require_relative 'cli/root'
8
- require_relative 'cli/session'
6
+ require_relative 'cli/scripting'
7
+ require_relative 'cli/config'
@@ -0,0 +1,10 @@
1
+ module Eco
2
+ class CLI
3
+ class Config
4
+
5
+
6
+ end
7
+ end
8
+ end
9
+
10
+ require_relative 'config/options'
@@ -0,0 +1,11 @@
1
+ module Eco
2
+ class CLI
3
+ class Config
4
+ class Options
5
+
6
+ end
7
+ end
8
+ end
9
+ end
10
+
11
+ #require_relative 'config/options/'
@@ -0,0 +1,23 @@
1
+ require_relative 'scripting/args_helpers'
2
+ require_relative 'scripting/argument'
3
+ require_relative 'scripting/arguments'
4
+
5
+ module Eco
6
+ class CLI
7
+ class Scripting
8
+ include Scripting::ArgsHelpers
9
+
10
+ def args_contain?(*values)
11
+ match?(ARGV, patterns, [:any, :or, :insensitive, :pattern])
12
+ end
13
+
14
+ def modifiers(*values)
15
+ values.select { |arg| is_modifier?(arg) }
16
+ end
17
+
18
+ end
19
+ end
20
+ end
21
+
22
+
23
+ SCR = Eco::CLI::Scripting.new
@@ -0,0 +1,55 @@
1
+ module Eco
2
+ class CLI
3
+ class Scripting
4
+ module ArgsHelpers
5
+
6
+ def is_modifier?(value)
7
+ value&.start_with?("-")
8
+ end
9
+
10
+ def arguments
11
+ @arguments ||= Arguments.new
12
+ end
13
+
14
+ def stop_on_unknown!(exclude: [])
15
+ if arguments.any_unkown?(exclude: exclude)
16
+ raise "There are unknown options in your command line arguments: #{arguments.unknown(exclude: exclude)}"
17
+ end
18
+ end
19
+
20
+ def get_arg(key, with_param: false, valid: true)
21
+ # track what a known option looks like
22
+ arguments.add(key, with_param: with_param)
23
+ return nil if !ARGV.include?(key)
24
+ value = true
25
+ if with_param
26
+ next_i = ARGV.index(key) + 1
27
+ value = ARGV[next_i]
28
+ #puts "modifier argument: #{value}"
29
+ value = nil if valid && is_modifier?(value)
30
+ end
31
+ return value
32
+ end
33
+
34
+ def get_file(key, required: false, should_exist: true)
35
+ filename = get_arg(key, with_param: true)
36
+ if !filename
37
+ if required
38
+ puts "you need to specify a file '#{key} file'"
39
+ exit
40
+ end
41
+ elsif !(File.exists?(filename) || File.exists?(File.expand_path(filename)))
42
+ if should_exist && required
43
+ puts "file doesn't exist #{filename}"
44
+ exit
45
+ end
46
+ end
47
+
48
+ filename = File.expand_path(filename) if filename && should_exist
49
+ filename
50
+ end
51
+
52
+ end
53
+ end
54
+ end
55
+ end