eco-helpers 1.5.5 → 1.5.10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e5c38c89a722acd7c4cda02090d342bc5001c172dd81f832b0e61448c71168c1
4
- data.tar.gz: e0d8c5a4bda31d93dd9b0934dc95865a0b0a9dd4c99882dcfbb62f404d09a25d
3
+ metadata.gz: a3074007c647b1ebecc8aac29368f17218d05a57fd918ece4d9531849e6075cd
4
+ data.tar.gz: 85fe74039f69e7cd268250f3cac40cf84a7a69ac52b113be70be8ff504c0deba
5
5
  SHA512:
6
- metadata.gz: 9fc9fdef2f0ffd80d0350f8ba813d48843f036892b9ba390c23bcc7fb4f65c4d6760494b84c5bbc1883c064bc65826a44ded2cfcbd4c74a0161a91dffb2c723f
7
- data.tar.gz: f15c70ea774d4e69b4e6dbb9bda829b1fe08979b6b127979cf5bf7bd953cf258aac5f5e61d6fedb65576af6bcc2ab17d358c29741352b4b75a2284523e74fc60
6
+ metadata.gz: 8baf56c80119b6acbabd979e4d421dbe013f056b68d7ff3b0efb9728b2da6788d3be4b464f3a5054c518befa14408a9ba74d89ff6c164d8da3c70dc09e10c08a
7
+ data.tar.gz: a93465c18b2c153966066e644f5021d07fbb7df00c928010a3f51865b04212764255e70d89047c643c9a48cf8e3387be9d7806e121dbfee177e8654bbc024b5e
@@ -1,11 +1,53 @@
1
1
  # Change Log
2
2
  All notable changes to this project will be documented in this file.
3
3
 
4
- ## [1.5.5] - 2020-12-xx
4
+ ## [1.5.10] - 2021-01-xx
5
5
 
6
6
  ### Added
7
7
  ### Changed
8
8
  ### Fixed
9
+ - `Eco::API::Session::Batch::Errors#print` show the row number of the input data.
10
+
11
+ ## [1.5.9] - 2021-01-08
12
+
13
+ ### Added
14
+ - `Eco::API::Organization::TagTree#subtags` to get all the tags but those of the highest level.
15
+
16
+ ### Changed
17
+ ### Fixed
18
+
19
+
20
+ ## [1.5.8] - 2021-01-05
21
+
22
+ ### Added
23
+ ### Changed
24
+ ### Fixed
25
+ - `Eco::API::Session::Batch::Jobs#job` shouldn't be calling the post-launch callback function on creation.
26
+ - `Eco::API::Session#new_job` should include a `&block` parameter.
27
+ - `Eco::API::UseCases::DefaultCases::RefreshCase`: fixed typo
28
+
29
+ ## [1.5.7] - 2020-12-17
30
+
31
+ ### Added
32
+ ### Changed
33
+ ### Fixed
34
+ - `Eco::API::Sesssion#parse_attribute` was not using phase argument
35
+
36
+ ## [1.5.6] - 2020-12-04
37
+
38
+ ### Added
39
+ ### Changed
40
+ ### Fixed
41
+ - `Eco::API::UseCases::DefaultCases::RestoreDBCase` fixed typo and slightly improved
42
+ - fixed some back-end errors when chaining usecases
43
+ - `Eco::API::UseCases::DefaultCases::OrgDataConvertCase` improved
44
+
45
+ ## [1.5.5] - 2020-12-03
46
+
47
+ ### Added
48
+ ### Changed
49
+ ### Fixed
50
+ - rubies previous to `2.5` do not have `yield_self`
9
51
 
10
52
  ## [1.5.4] - 2020-12-02
11
53
 
@@ -13,6 +13,7 @@ Gem::Specification.new do |s|
13
13
  s.summary = %q{eco-helpers to manage people api cases}
14
14
  s.homepage = "https://www.ecoportal.com"
15
15
  s.licenses = %w[MIT]
16
+ s.required_ruby_version = '>= 2.4.4'
16
17
 
17
18
  s.files = `git ls-files -z`.split("\x0").reject do |f|
18
19
  f.match(%r{^(test|spec|features)/})
@@ -75,7 +75,7 @@ module Eco
75
75
  !parsing?
76
76
  end
77
77
 
78
- # @note `Eco::API::Common::People::EntryFactory#entries` adds this `idx`
78
+ # @note `Eco::API::Common::People::EntryFactory#entries` adds this `idx` (i.e. row number)
79
79
  # @return [Integer] the entry number in the input file
80
80
  def idx
81
81
  final_entry["idx"]
@@ -46,6 +46,10 @@ module Eco
46
46
  @has_tags.empty?
47
47
  end
48
48
 
49
+ # Gets all the tags of the current node tree.
50
+ # @note
51
+ # - this will include the upper level tag(s) as well
52
+ # - to get all but the upper level tag(s) use `subtags` method instead
49
53
  # @param depth [Integer] if empty, returns the list of tag nodes of that level. Otherwise the list of tag nodes of the entire subtree.
50
54
  # @return [Array<String>]
51
55
  def tags(depth: nil)
@@ -58,6 +62,12 @@ module Eco
58
62
  end
59
63
  end
60
64
 
65
+ # Gets all but the upper level tags of the current node tree.
66
+ # @return [Array<String>]
67
+ def subtags
68
+ tags - tags(depth: depth)
69
+ end
70
+
61
71
  # Verifies if a tag exists in the tree.
62
72
  # @param key [String] tag to verify.
63
73
  # @return [Boolean]
@@ -126,7 +126,7 @@ module Eco
126
126
  unless parsers = entry_factory.person_parser
127
127
  raise "There are no parsers defined"
128
128
  end
129
- parsers.parse(attr, source)
129
+ parsers.parse(attr, source, phase)
130
130
  end
131
131
 
132
132
  # @see Eco::API::Common::People::EntryFactory#export
@@ -217,6 +217,7 @@ module Eco
217
217
  @job_groups ||= Batch::JobsGroups.new(enviro)
218
218
  end
219
219
 
220
+ # It retrives the group of `Batch::Jobs` named `name`. It creates it if it doesn't exist.
220
221
  # @return [Eco::API::Session::Batch::Jobs]
221
222
  def job_group(name, order: :last)
222
223
  case
@@ -228,9 +229,10 @@ module Eco
228
229
  end
229
230
 
230
231
  # Shortcut to create a job of certain type within a group
232
+ # @param [see @Eco::API::Session::Batch::Jobs#new]
231
233
  # @return [Eco::API::Session::Batch::Job]
232
- def new_job(group, name, type, usecase, sets = [:core, :details, :account])
233
- job_group(group).new(name, usecase: usecase, type: type, sets: sets)
234
+ def new_job(group, name, type, usecase, sets = [:core, :details, :account], &block)
235
+ job_group(group).new(name, usecase: usecase, type: type, sets: sets, &block)
234
236
  end
235
237
 
236
238
  # @see Eco::API::Session::Batch::JobsGroups#launch
@@ -123,7 +123,7 @@ module Eco
123
123
  entry = queue.to_a[i]
124
124
  response = status[i]
125
125
  msg = "Error #{response.status}: #{response.body}\n"
126
- msg += "-- Failed to batch #{method} (entry #{i+1}). Person: #{person_ref(entry)}"
126
+ msg += "-- Failed to batch #{method}. Person: #{person_ref(entry)}"
127
127
  end
128
128
  msg
129
129
  end
@@ -164,7 +164,8 @@ module Eco
164
164
  private
165
165
 
166
166
  def person_ref(entry)
167
- "(id: '#{get_attr(entry, :id)}') '#{get_attr(entry, :name)}' ('#{get_attr(entry, :external_id)}': '#{get_attr(entry, :email)}')"
167
+ row_str = (row = get_row(entry)) ? "(row: #{row}) " : nil
168
+ "#{row_str}(id: '#{get_attr(entry, :id)}') '#{get_attr(entry, :name)}' ('#{get_attr(entry, :external_id)}': '#{get_attr(entry, :email)}')"
168
169
  end
169
170
 
170
171
  def get_attr(entry, attr)
@@ -175,6 +176,15 @@ module Eco
175
176
  end
176
177
  end
177
178
 
179
+ def get_row(value)
180
+ case value
181
+ when Eco::API::Common::People::PersonEntry
182
+ value.idx
183
+ when Ecoportal::API::V1::Person
184
+ get_row(value.entry)
185
+ end
186
+ end
187
+
178
188
  end
179
189
  end
180
190
  end
@@ -96,7 +96,7 @@ module Eco
96
96
  # @param entry [Ecoportal::API::V1::Person, Enumberable<Person>] the person(s) we want to update, carrying the changes to be done.
97
97
  # @param unique [Boolean] specifies if repeated entries should be avoided in the queue.
98
98
  # @yield [person] callback before launching the batch job request against the server.
99
- # @yieldparam param [Person] current person object that that should be treated by the callback before launching the batch.
99
+ # @yieldparam person [Person] current person object that that should be treated by the callback before launching the batch.
100
100
  # @return [Eco::API::Session::Batch::Job] this `Batch::Job`.
101
101
  def add(entry, unique: true, &block)
102
102
  case entry
@@ -42,13 +42,23 @@ module Eco
42
42
  @jobs.key?(name)
43
43
  end
44
44
 
45
+ # It retrieves an existing job named `name` or creates it if it doesn't exist.
46
+ # @note
47
+ # - the block should only be passed when creating the job
48
+ # @param [see @Eco::API::Session::Batch::Jobs#new]
49
+ # @return [Eco::API::Session::Batch::Job]
45
50
  def job(name, type: nil, sets: nil, usecase: nil, &block)
51
+ fatal "Can't give a job post-launch callback &block to an already existing job" if exists?(name)
46
52
  new(name, type: type, sets: sets, usecase: usecase, &block) unless exists?(name)
47
- self[name].tap do |job|
48
- block.call(job) if block
49
- end
53
+ self[name]
50
54
  end
51
55
 
56
+ # Creates a new `Batch::Job` included as part of this `Batch::Jobs`.
57
+ # @param [see Eco::API::Session::Job#new]
58
+ # @yield [job, status] callback after launching the batch job request against the server.
59
+ # @yieldparam job [Eco::API::Session::Batch::Job] the job we have launched against the server.
60
+ # @yieldparam status [Eco::API::Session::Batch::Status] the status of the batch job launch.
61
+ # @return [Eco::API::Session::Batch::Job]
52
62
  def new(name, type:, sets:, usecase: nil, &block)
53
63
  fatal "Can't create job named '#{name}' because it already exists." if exists?(name)
54
64
 
@@ -57,6 +67,11 @@ module Eco
57
67
  end
58
68
  end
59
69
 
70
+ # @param job [Eco::API::Session::Batch::Job] the `Batch::Job` to add.
71
+ # @yield [job, status] callback after launching the batch job request against the server.
72
+ # @yieldparam job [Eco::API::Session::Batch::Job] the job we have launched against the server.
73
+ # @yieldparam status [Eco::API::Session::Batch::Status] the status of the batch job launch.
74
+ # @return [Eco::API::Session::Batch::Job]
60
75
  def add(job)
61
76
  fatal "Expected Eco::API::Session::Batch::Job object. Given #{job.class}" unless job.is_a?(Eco::API::Session::Batch::Job)
62
77
  @jobs[job.name] = job
@@ -67,6 +82,10 @@ module Eco
67
82
  any? {|job| job.pending?}
68
83
  end
69
84
 
85
+ # Launches every `Batch::Job` in the group.
86
+ # @note
87
+ # - if there was post-launch callback for a `Batch::Job`, it calls it.
88
+ # @return [Hash<Eco::API::Session::Batch::Job, Eco::API::Session::Batch::Status>]
70
89
  def launch(simulate: false)
71
90
  each do |job|
72
91
  if job.pending?
@@ -58,6 +58,11 @@ module Eco
58
58
  @groups.key?(name)
59
59
  end
60
60
 
61
+ # Creates a new group of `Batch::Jobs` named `name`.
62
+ # @yield [group, group_status] callback after launching the batch job request against the server.
63
+ # @yieldparam group [Eco::API::Session::Batch::Jobs] the group of jobs we have launched against the server.
64
+ # @yieldparam group_status [Hash<Eco::API::Session::Batch::Job, Eco::API::Session::Batch::Status>] the status of the launched batch jobs.
65
+ # @return [Eco::API::Session::Batch::Jobs] the group of jobs.
61
66
  def new(name, order: :last)
62
67
  fatal "Can't create job group named '#{name}' because it already exists." if exists?(name)
63
68
 
@@ -78,6 +83,10 @@ module Eco
78
83
  any? {|group| group.pending?}
79
84
  end
80
85
 
86
+ # Launches every `Batch::Jobs` group in the current `Batch::JobGroups`
87
+ # @note
88
+ # - if there was post-launch callback for a `Batch::Jobs` groups, it calls it.
89
+ # @return [Hash<Eco::API::Session::Batch::Jobs,Hash<Eco::API::Session::Batch::Job, Eco::API::Session::Batch::Status>>]
81
90
  def launch(simulate: false)
82
91
  @order.each_with_index do |group, idx|
83
92
  if group.pending?
@@ -2,6 +2,8 @@ class Eco::API::UseCases::DefaultCases::OrgDataConvertCase < Eco::API::Common::L
2
2
  name "org-data-convert"
3
3
  type :import
4
4
 
5
+ attr_reader :session, :options
6
+
5
7
  def org_data_convert(people)
6
8
  pp "Going to convert data from '#{source_enviro}' to '#{ASSETS.active_config}'"
7
9
  puts "\n"
@@ -50,27 +52,43 @@ class Eco::API::UseCases::DefaultCases::OrgDataConvertCase < Eco::API::Common::L
50
52
 
51
53
  def policy_groups_convert(ids)
52
54
  ids.map do |id|
53
- unless name = source_config.policy_groups.to_name(id)
54
- error("Ops, do not know #{id} usergroup for source environment")
55
+ unless name = source_policy_groups.to_name(id) || ignore_missing_policy_groups?
56
+ msg = "Ops, do not know #{id} usergroup for source environment"
57
+ msg += "\nUse the option -ignore-missing-policy-groups if you do not care"
58
+ error(msg)
55
59
  end
56
60
  session.policy_groups.to_id(name).tap do |new_id|
57
- unless new_id
58
- error("Ops, do not know #{name} usergroup for destination environment")
61
+ unless new_id || ignore_missing_policy_groups?
62
+ msg = "Ops, do not know #{name} usergroup for destination environment"
63
+ msg += "\nUse the option -ignore-missing-policy-groups if you do not care"
64
+ error(msg)
59
65
  end
60
66
  end
61
- end
67
+ end.compact
68
+ end
69
+
70
+ def source_policy_groups
71
+ source_config.policy_groups
62
72
  end
63
73
 
64
74
  def source_config
65
- @source_config ||= ASSETS.config(key: source_enviro, update_active: false)
75
+ @source_config ||= ASSETS.config(key: source_enviro, update_active: false).tap do |config|
76
+ unless config
77
+ error("The source environment '#{source_enviro}' does not exit or is not configured")
78
+ end
79
+ end
66
80
  end
67
81
 
68
82
  def source_enviro
69
83
  @source_enviro ||= options.dig(:source_enviro).tap do |enviro|
70
- error("A source organization is required to migrate data") unless enviro
84
+ error("A source environment is required to migrate data from") unless enviro
71
85
  end
72
86
  end
73
87
 
88
+ def ignore_missing_policy_groups?
89
+ options.dig(:ignore, :missing, :policy_groups)
90
+ end
91
+
74
92
  def logger
75
93
  @session.logger
76
94
  end
@@ -4,7 +4,7 @@ class Eco::API::UseCases::DefaultCases::RefreshCase < Eco::API::Common::Loaders:
4
4
 
5
5
  def main(people, session, options, usecase)
6
6
  update = session.new_job("main", "update", :update, usecase)
7
- people.each {|person| job.add(person)}
7
+ people.each {|person| update.add(person)}
8
8
  end
9
9
 
10
10
  end
@@ -2,7 +2,11 @@ class Eco::API::UseCases::DefaultCases::RestoreDBCase < Eco::API::Common::Loader
2
2
  name "restore-db"
3
3
  type :sync
4
4
 
5
+ attr_reader :session, :options
6
+
5
7
  def main(entries, people, session, options, usecase)
8
+ @session = session; @options = options
9
+
6
10
  micro = session.micro
7
11
  require_people_as_entries!(entries)
8
12
 
@@ -26,21 +30,21 @@ class Eco::API::UseCases::DefaultCases::RestoreDBCase < Eco::API::Common::Loader
26
30
 
27
31
  person.new? ? restart.add(person) : update.add(person)
28
32
 
29
- core_copy(entry, person, options) unless options.dig(:exclude, :core)
30
- person.details = entry.details unless options.dig(:exclude, :details)
33
+ core_copy(entry, person) unless options.dig(:exclude, :core)
34
+ person.details = entry.details unless options.dig(:exclude, :details)
31
35
 
32
36
  unless options.dig(:exclude, :account) || !entry.account
33
37
  person.account ||= {}
34
- account_copy(entry.account, person.account, options)
38
+ account_copy(entry.account, person.account)
35
39
  end
36
40
  end
37
41
 
38
- report_re_starters(re_starters, session.logger)
42
+ report_re_starters(re_starters)
39
43
  end
40
44
 
41
45
  private
42
46
 
43
- def core_copy(entry, person, options)
47
+ def core_copy(entry, person)
44
48
  person.external_id = entry.external_id unless options.dig(:exclude, :external_id)
45
49
  person.name = entry.name unless options.dig(:exclude, :name)
46
50
  person.email = entry.email unless options.dig(:exclude, :email)
@@ -49,8 +53,8 @@ class Eco::API::UseCases::DefaultCases::RestoreDBCase < Eco::API::Common::Loader
49
53
  person.freemium = entry.freemium
50
54
  end
51
55
 
52
- def account_copy(src, dst, options)
53
- if src = entry.account
56
+ def account_copy(src, dst)
57
+ if src
54
58
  dst.default_tag = src.default_tag unless options.dig(:exclude, :filter_tags)
55
59
  dst.policy_group_ids = src.policy_group_ids unless options.dig(:exclude, :policy_groups)
56
60
 
@@ -59,27 +63,31 @@ class Eco::API::UseCases::DefaultCases::RestoreDBCase < Eco::API::Common::Loader
59
63
  dst.permissions_custom = src.permissions_custom
60
64
  end
61
65
 
62
- dst.login_provider_ids = src.login_provider_ids
63
- dst.accept_eula = src.accept_eula
66
+ unless options.dig(:exclude, :login_providers) || options.dig(:source_enviro)
67
+ dst.login_provider_ids = src.login_provider_ids
68
+ end
64
69
 
65
70
  if src.preferences
66
71
  dst.doc["preferences"] = JSON.parse((src.doc["preferences"] || {}).to_json)
67
72
  end
68
73
 
69
- dst.starred_ids = src.starred_ids
70
- dst.landing_page_id = src.landing_page_id
74
+ unless options.dig(:source_enviro)
75
+ dst.starred_ids = src.starred_ids
76
+ dst.landing_page_id = src.landing_page_id
77
+ end
78
+
71
79
  dst&.send_invites = options[:send_invites] if options.key?(:send_invites)
72
80
  end
73
81
  end
74
82
 
75
- def require_people_as_entries!(entries, logger)
83
+ def require_people_as_entries!(entries)
76
84
  unless entries.is_a?(Eco::API::Organization::People)
77
85
  logger.error("Your input should be an 'Eco::API::Organization::People' object. Got: #{entries.class}")
78
86
  exit(1)
79
87
  end
80
88
  end
81
89
 
82
- def report_re_starters(re_starters, logger)
90
+ def report_re_starters(re_starters)
83
91
  unless re_starters.empty?
84
92
  logger.error("There were #{re_starters.length} entries of the backup that do not exist in the (filtered?) people manager")
85
93
  logger.error("Some examples:")
@@ -89,4 +97,8 @@ class Eco::API::UseCases::DefaultCases::RestoreDBCase < Eco::API::Common::Loader
89
97
  end
90
98
  end
91
99
 
100
+ def logger
101
+ session.logger
102
+ end
103
+
92
104
  end
@@ -36,7 +36,7 @@ module Eco
36
36
  # @option kargs [Eco::API:Session] :session
37
37
  # @option kargs [Hash] :options hash with symbol keys (i.e. behaviour modifiers, cli trackers, filters, etc.)
38
38
  def launch(io: nil, **kargs)
39
- params = io&.params(keyed: true) || {}
39
+ params = io&.params(keyed: true, all: true) || {}
40
40
  kargs = params.merge(kargs).merge(usecase: self)
41
41
 
42
42
  UseCaseIO.new(**kargs).tap do |uio|
@@ -65,7 +65,6 @@ module Eco
65
65
  #kargs = aux_io.params(keyed: true)
66
66
  kargs = params(keyed: true, all: true).merge(usecase: usecase)
67
67
  kargs.delete(:job)
68
-
69
68
  case self.type
70
69
  when :import
71
70
  kargs[:input] = output
@@ -55,6 +55,27 @@ ASSETS.cli.config do |cnf|
55
55
  options.deep_merge!(super: {new: new_id})
56
56
  end
57
57
 
58
+ desc = "Usage '-org-data-convert backup.json -restore-db-from'."
59
+ desc += " Transforms an input .json file to the values of the destination environment "
60
+ desc += " (names missmatch won't solve: i.e. usergroups)"
61
+ cases.add("-org-data-convert", :import, desc, case_name: "org-data-convert") do |input, session, options|
62
+ unless input && input.is_a?(Eco::API::Organization::People)
63
+ file = SCR.get_file("-org-data-convert", required: true)
64
+ input = Eco::API::Organization::People.new(JSON.parse(File.read(file)))
65
+ session.logger.info("Source DB: loaded #{input.length} entries.")
66
+ end
67
+
68
+ if source_enviro = SCR.get_arg("-source-enviro", with_param: true)
69
+ options.merge!(source_enviro: source_enviro)
70
+ else
71
+ session.logger.error("You need to specify a -source-enviro for the conversion to work out")
72
+ exit(1)
73
+ end
74
+
75
+ options.deep_merge!(ignore: {missing: {policy_groups: true}}) if SCR.get_arg("-ignore-missing-policy-groups")
76
+
77
+ end
78
+
58
79
  desc = "Restores the people manager by using a backup.json file"
59
80
  cases.add("-restore-db-from", :sync, desc, case_name: "restore-db") do |input, people, session, options|
60
81
  unless input && input.is_a?(Eco::API::Organization::People)
@@ -122,7 +122,7 @@ ASSETS.cli.config do |config|
122
122
 
123
123
  wf.on(:report) do |wf_report, io|
124
124
  #config.reports.active(io: io)
125
- #io.session.reports
125
+ #io.session.reports
126
126
  io
127
127
  end
128
128
 
@@ -94,7 +94,7 @@ module Eco
94
94
  when Eco::API::UseCases::UseCaseIO
95
95
  io.chain(usecase: usecase)
96
96
  when Eco::API::UseCases::BaseIO
97
- params = io.params(keyed: true).merge(usecase: usecase)
97
+ params = io.params(keyed: true, all: true).merge(usecase: usecase)
98
98
  Eco::API::UseCases::UseCaseIO.new(**params)
99
99
  end
100
100
  end
@@ -1,3 +1,3 @@
1
1
  module Eco
2
- VERSION = "1.5.5"
2
+ VERSION = "1.5.10"
3
3
  end
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: 1.5.5
4
+ version: 1.5.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oscar Segura
@@ -474,7 +474,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
474
474
  requirements:
475
475
  - - ">="
476
476
  - !ruby/object:Gem::Version
477
- version: '0'
477
+ version: 2.4.4
478
478
  required_rubygems_version: !ruby/object:Gem::Requirement
479
479
  requirements:
480
480
  - - ">="