eco-helpers 0.8.3 → 0.8.4

Sign up to get free protection for your applications and to get access to all the features.
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