eco-helpers 0.6.4 → 0.6.5

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
  SHA1:
3
- metadata.gz: 4a9a891a431684fe13200bdd2b55d92c418fdd09
4
- data.tar.gz: badc9350ac7b4f8b1061a7f7ab25393af5bace7c
3
+ metadata.gz: aa7eb2714d4b0510dcc62b6b42b50835d4f5db4c
4
+ data.tar.gz: 0d241a6411f68297029028633051e818e08b1d2b
5
5
  SHA512:
6
- metadata.gz: 0df330e81d17f875c120dcd0abc87f142a478e91b186cf4f70a4634ce513ad69a6d16fd4e5eea9da17ef7b366c84b129758d38a001627134f488ba35181bfdc2
7
- data.tar.gz: 7154d3081842a3efc237bdbd80e8a5fc310a079eee2e71861456b5e47fc64c6fedaa15e880d5a97a10be2fc50059896fc328e630702976ee9672c87d5c2d266a
6
+ metadata.gz: 9d8d8b78d842472624a89de3c4a78095417f83f42b89c797a0fdd1124aaea9718dc614a448d2391c99bc2ca0a5a2b91f491d6b8656e3f5306a37a191d542b49b
7
+ data.tar.gz: 66eda21ef4862e5cf470312e4dbec32540287c8a3a5b8be34b56cd0b92301f0bfd22732d2f41f5714cc0d19cdd795f419d6d07e13b21d6432f93d26243119874
data/.yardopts ADDED
@@ -0,0 +1,10 @@
1
+ --readme README.md
2
+ --charset utf-8
3
+ --markup-provider redcarpet
4
+ --markup markdown
5
+ --no-private
6
+ --output-dir ./doc
7
+ 'lib/**/*.rb'
8
+ -
9
+ CHANGELOG.md
10
+ LICENSE
data/eco-helpers.gemspec CHANGED
@@ -22,8 +22,8 @@ Gem::Specification.new do |s|
22
22
  #s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
23
  s.require_paths = ["lib"]
24
24
 
25
- s.add_development_dependency "rspec", "~> 3", ">= 3.8"
26
- s.add_development_dependency "yard", "~> 0.9", ">= 0.9.18"
25
+ s.add_development_dependency "rspec", "~> 3", ">= 3.8"
26
+ s.add_development_dependency "yard", "~> 0.9", ">= 0.9.18"
27
27
  s.add_development_dependency "redcarpet", "~> 3.4", ">= 3.4.0"
28
28
 
29
29
  s.add_dependency 'ecoportal-api', '~> 0.3', '>= 0.3.6'
@@ -13,7 +13,7 @@ module Eco
13
13
  # [[Node], ...]
14
14
  # @example Input format example:
15
15
  # tree = [{"tag" => "AUSTRALIA", "nodes" => [
16
- # {"tag" => "SYNDEY", "nodes" => []}
16
+ # {"tag" => "SYDNEY", "nodes" => []}
17
17
  # ]}]
18
18
  # tree = TagTree.new(tree.to_json)
19
19
  # @param tagtree [String] representation of the tagtree in json.
@@ -69,8 +69,8 @@ module Eco
69
69
  list.select {|str| tag?(str)}
70
70
  end
71
71
 
72
- # Finds the path from a node `key` to the its root node in the tree.
73
- # If `key` is not specified, returns the path from current node to root.
72
+ # Finds the path from a node `key` to its root node in the tree.
73
+ # If `key` is not specified, returns the path from current node to root.
74
74
  # @note the `path` is not relative to the subtree, but absolute to the entire tree.
75
75
  # @param key [String] tag to find the path to.
76
76
  # @return [Array<String>]
@@ -84,18 +84,18 @@ module Eco
84
84
  #
85
85
  # @example Usage example:
86
86
  # tree = [{"tag" => "Australia", "nodes" => [
87
- # {"tag" => "SYNDEY", "nodes" => []},
88
- # {"tag" => "MELMOURNE", "nodes" => []}
87
+ # {"tag" => "SYDNEY", "nodes" => []},
88
+ # {"tag" => "MELBOURNE", "nodes" => []}
89
89
  # ]}]
90
90
  #
91
91
  # tree = TagTree.new(tree.to_json)
92
- # original = ["SYNDEY", "RISK"]
93
- # final = ["MELMOURNE", "EVENT"]
92
+ # original = ["SYDNEY", "RISK"]
93
+ # final = ["MELBOURNE", "EVENT"]
94
94
  #
95
- # tree.user_tags(initial: original, final: final) # out: ["MELMOURNE", "RISK"]
96
- # tree.user_tags(initial: original, final: final, preserve_custom: false) # out: ["MELMOURNE"]
97
- # tree.user_tags(initial: original, final: final, add_custom: true) # out: ["MELMOURNE", "RISK", "EVENT"]
98
- # tree.user_tags(initial: original, final: final, preserve_custom: false, add_custom: true) # out: ["MELMOURNE", "EVENT"]
95
+ # tree.user_tags(initial: original, final: final) # out: ["MELBOURNE", "RISK"]
96
+ # tree.user_tags(initial: original, final: final, preserve_custom: false) # out: ["MELBOURNE"]
97
+ # tree.user_tags(initial: original, final: final, add_custom: true) # out: ["MELBOURNE", "RISK", "EVENT"]
98
+ # tree.user_tags(initial: original, final: final, preserve_custom: false, add_custom: true) # out: ["MELBOURNE", "EVENT"]
99
99
  #
100
100
  # @param initial [Array<String>] original tags a person has in their account.
101
101
  # @param final [Array<String>] target tags the person should have in their account afterwards.
@@ -24,15 +24,10 @@ module Eco
24
24
  batch_from(people, method, api || self.api, params: params)
25
25
  end
26
26
 
27
- def valid_methods
28
- VALID_METHODS
29
- end
30
-
31
27
  def valid_method?(value)
32
28
  VALID_METHODS.include?(value)
33
29
  end
34
30
 
35
-
36
31
  private
37
32
 
38
33
  def new_status(queue, method)
@@ -49,7 +44,7 @@ module Eco
49
44
  params = {per_page: DEFAULT_BATCH_BLOCK}.merge(params)
50
45
  client = people_api.client
51
46
  people = [];
52
- if (page = params.fetch(:page, false))
47
+ if page = params[:page]
53
48
  res, response = get(client, params: params)
54
49
  people +=res
55
50
  logger.info("page number: #{page}, got num people #{people.length}")
@@ -79,7 +74,7 @@ module Eco
79
74
  end
80
75
  people = []
81
76
  response.body["results"].each do |person_hash|
82
- person = INTERNAL::Person.new(person_hash)
77
+ person = Ecoportal::API::Internal::Person.new(person_hash)
83
78
  yield person if block_given?
84
79
  people.push(person)
85
80
  end
@@ -102,7 +97,7 @@ module Eco
102
97
  per_page = params.fetch(:per_page)
103
98
 
104
99
  iteration = 1; done = 0
105
- iterations = (people.length / per_page).ceil
100
+ iterations = (people.length.to_f / per_page).ceil
106
101
 
107
102
  people.each_slice(per_page) do |slice|
108
103
  msg = "starting batch '#{method}' iteration #{iteration}/#{iterations}, with #{slice.length} entries of #{people.length} -- #{done} done"
@@ -27,7 +27,9 @@ module Eco
27
27
  RefreshPresets.new(self).process
28
28
  ChangeEMailCase.new(self).process
29
29
  SetDefaultTagCase.new(self).process
30
- UpsertAccountCase.new(self).process
30
+ CreateCase.new(self).process
31
+ UpdateCase.new(self).process
32
+ UpsertCase.new(self).process
31
33
  HrisCase.new(self).process
32
34
  end
33
35
  end
@@ -51,5 +53,7 @@ require_relative 'default_cases/remove_account_case'
51
53
  require_relative 'default_cases/refresh_presets'
52
54
  require_relative 'default_cases/change_email_case'
53
55
  require_relative 'default_cases/set_default_tag_case'
54
- require_relative 'default_cases/upsert_account_case'
56
+ require_relative 'default_cases/create_case'
57
+ require_relative 'default_cases/update_case'
58
+ require_relative 'default_cases/upsert_case'
55
59
  require_relative 'default_cases/hris_case'
@@ -0,0 +1,60 @@
1
+ module Eco
2
+ module API
3
+ module UseCases
4
+ class DefaultCases
5
+ class CreateCase < UseCases::BaseCase
6
+
7
+ def process
8
+ @cases.define("create", type: :sync) do |entries, people, session, options|
9
+ creation = session.job_group("main").new("create", type: :create, sets: [:core, :details, :account])
10
+
11
+ pgs = session.policy_groups
12
+
13
+ entries.each.with_index do |entry, i|
14
+ if person = people.find(entry)
15
+ session.logger.error("Entry(#{i}) - this person (id: '#{person.id}') already exists: #{entry.to_s(:identify)}")
16
+ else
17
+ person = session.new_person
18
+ core_excluded = ["supervisor_id"]
19
+ entry.set_core(person, exclude: core_excluded)
20
+ entry.set_details(person) unless options.dig(:exclude, :details)
21
+
22
+ unless options.dig(:exclude, :account)
23
+ ini_pg_ids = person.account&.policy_group_ids || []
24
+ ini_tags = person.account&.filter_tags || []
25
+ entry.set_account(person)
26
+
27
+ person.account.send_invites = false if options.key?(:send_invites) && !options(:send_invites)
28
+
29
+ person.account.policy_group_ids = pgs.user_pg_ids(
30
+ initial: ini_pg_ids,
31
+ final: person.account.policy_group_ids
32
+ )
33
+
34
+ person.account.permissions_custom = session.new_preset(person) unless options.dig(:exclude, :abilities)
35
+
36
+ if session.tagtree
37
+ person.account.filter_tags = session.tagtree.user_tags(
38
+ initial: ini_tags,
39
+ final: person.account.filter_tags,
40
+ preserve_custom: true,
41
+ add_custom: true
42
+ )
43
+ person.account.default_tag = session.tagtree.default_tag(*person.account.filter_tags)
44
+ else
45
+ tags = person.account.filter_tags
46
+ person.account.default_tag = tags.first unless tags.length > 1
47
+ end
48
+ end
49
+
50
+ creation.add(person)
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -18,16 +18,15 @@ module Eco
18
18
  exit
19
19
  end
20
20
 
21
- pp old_id
22
- pp new_id = options.dig(:super, :new)
21
+ new_id = options.dig(:super, :new)
23
22
 
24
23
  unless old_sup = people.person(id: old_id, external_id: old_id, email: old_id)
25
- session.logger.error("Couldn't find any user with that id: '#{old_id}'. Aborting...")
24
+ session.logger.error("Couldn't find any user with that id (old-super): '#{old_id}'. Aborting...")
26
25
  exit
27
26
  end
28
27
 
29
28
  unless new_sup = people.person(id: new_id, external_id: new_id, email: new_id)
30
- session.logger.error("Couldn't find any user with that id: '#{new_id}'. Aborting...")
29
+ session.logger.error("Couldn't find any user with that id (new-super): '#{new_id}'. Aborting...")
31
30
  exit
32
31
  end
33
32
 
@@ -0,0 +1,58 @@
1
+ module Eco
2
+ module API
3
+ module UseCases
4
+ class DefaultCases
5
+ class UpdateCase < BaseCase
6
+
7
+ def process
8
+ @cases.define("update", type: :sync) do |entries, people, session, options|
9
+ update = session.job_group("main").new("update", type: :update, sets: [:core, :details, :account])
10
+
11
+ pgs = session.policy_groups
12
+
13
+ entries.each.with_index do |entry, i|
14
+ if person = people.find(entry)
15
+ core_excluded = ["supervisor_id"]
16
+ core_excluded.push("email") if options.dig(:exclude, :email)
17
+ entry.set_core(person, exclude: core_excluded) unless options.dig(:exclude, :core)
18
+ entry.set_details(person) unless options.dig(:exclude, :details)
19
+
20
+ unless options.dig(:exclude, :account)
21
+ ini_pg_ids = person.account&.policy_group_ids || []
22
+ ini_tags = person.account&.filter_tags || []
23
+ entry.set_account(person)
24
+
25
+ person.account.policy_group_ids = pgs.user_pg_ids(
26
+ initial: ini_pg_ids,
27
+ final: person.account.policy_group_ids
28
+ )
29
+
30
+ person.account.permissions_custom = session.new_preset(person) unless options.dig(:exclude, :abilities)
31
+
32
+ if session.tagtree
33
+ person.account.filter_tags = session.tagtree.user_tags(
34
+ initial: ini_tags,
35
+ final: person.account.filter_tags,
36
+ preserve_custom: true,
37
+ add_custom: true
38
+ )
39
+ person.account.default_tag = session.tagtree.default_tag(*person.account.filter_tags)
40
+ else
41
+ tags = person.account.filter_tags
42
+ person.account.default_tag = tags.first unless tags.length > 1
43
+ end
44
+ end
45
+ update.add(person)
46
+ else
47
+ session.logger.error("Entry(#{i}) - this person does not exist: #{entry.to_s(:identify)}")
48
+ end
49
+ end
50
+ end
51
+
52
+ end
53
+
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,61 @@
1
+ module Eco
2
+ module API
3
+ module UseCases
4
+ class DefaultCases
5
+ class UpsertCase < BaseCase
6
+
7
+ def process
8
+ @cases.define("upsert", type: :sync) do |entries, people, session, options|
9
+ creation = session.job_group("main").new("create", type: :create, sets: [:core, :details, :account])
10
+ update = session.job_group("main").new("update", type: :update, sets: [:core, :details, :account])
11
+
12
+ pgs = session.policy_groups
13
+
14
+ entries.each.with_index do |entry, i|
15
+ create = ! (person = people.find(entry))
16
+ person = session.new_person if create
17
+
18
+ core_excluded = ["supervisor_id"]
19
+ core_excluded.push("email") if options.dig(:exclude, :email) && !create
20
+ entry.set_core(person, exclude: core_excluded) unless options.dig(:exclude, :core) && !create
21
+ entry.set_details(person) unless options.dig(:exclude, :details)
22
+
23
+ unless options.dig(:exclude, :account)
24
+ ini_pg_ids = person.account&.policy_group_ids || []
25
+ ini_tags = person.account&.filter_tags || []
26
+ entry.set_account(person)
27
+
28
+ person.account.send_invites = false if options.key?(:send_invites) && !options(:send_invites)
29
+
30
+ person.account.policy_group_ids = pgs.user_pg_ids(
31
+ initial: ini_pg_ids,
32
+ final: person.account.policy_group_ids
33
+ )
34
+
35
+ person.account.permissions_custom = session.new_preset(person) unless options.dig(:exclude, :abilities)
36
+
37
+ if session.tagtree
38
+ person.account.filter_tags = session.tagtree.user_tags(
39
+ initial: ini_tags,
40
+ final: person.account.filter_tags,
41
+ preserve_custom: true,
42
+ add_custom: true
43
+ )
44
+ person.account.default_tag = session.tagtree.default_tag(*person.account.filter_tags)
45
+ else
46
+ tags = person.account.filter_tags
47
+ person.account.default_tag = tags.first unless tags.length > 1
48
+ end
49
+ end
50
+
51
+ creation.add(person) if create
52
+ update.add(person) unless create
53
+ end
54
+ end
55
+ end
56
+
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
data/lib/eco/cli.rb CHANGED
@@ -3,7 +3,6 @@ module Eco
3
3
  end
4
4
  end
5
5
 
6
+ require_relative 'cli/api'
6
7
  require_relative 'cli/root'
7
- require_relative 'cli/input'
8
- require_relative 'cli/input_multi'
9
8
  require_relative 'cli/session'
@@ -0,0 +1,14 @@
1
+ module Eco
2
+ module CLI
3
+ class API < Eco::Common::BaseCLI
4
+ class_option :csv_in, :type => :string, :banner => "FILE", :desc => "CSV input file"
5
+ class_option :csv_out, :type => :string, :banner => "FILE", :desc => "CSV output file"
6
+ class_option :json_in, :type => :string, :banner => "FILE", :desc => "CSV input file"
7
+ class_option :json_out, :type => :string, :banner => "FILE", :desc => "CSV input file"
8
+
9
+ class_option :config_file, :aliases => "o", :type => :string,
10
+ :banner => "FILE", :desc => "specifes the session configuration file"
11
+ #class_option :csv_in, :alisaes =>
12
+ end
13
+ end
14
+ end
data/lib/eco/cli/root.rb CHANGED
@@ -3,6 +3,7 @@ module Eco
3
3
  class Root < Eco::Common::BaseCLI
4
4
  class_option :config_file, :aliases => "o", :type => :string,
5
5
  :banner => "FILE", :desc => "specifes the session configuration file"
6
+ #class_option :csv_in, :alisaes =>
6
7
  end
7
8
  end
8
9
  end
data/lib/eco/common.rb CHANGED
@@ -3,5 +3,6 @@ module Eco
3
3
  end
4
4
  end
5
5
 
6
+ require_relative 'common/meta_thor'
6
7
  require_relative 'common/base_cli'
7
8
  require_relative 'common/language'
@@ -1,114 +1,21 @@
1
- require 'thor'
2
-
3
1
  module Eco
4
2
  module Common
5
- class BaseCLI < Thor
6
- PIPE = "!"
3
+ class BaseCLI < MetaThor
7
4
  CUSTOM_HELP_MAPPINGS = ["?", "help"]
8
5
  ALL_HELP_MAPPINGS = Thor::HELP_MAPPINGS + CUSTOM_HELP_MAPPINGS
9
6
 
10
7
  class_option :simulate, type: :boolean, aliases: :s, desc: "do not launch updates or rewrite files"
11
- class_option :verbosity, type: :numeric, default: 0, desc: "defines the level of verbosity to show feedback"
12
-
13
- class_option :input, type: :hash, default: {}, required: false, desc: "--input=json:STRING"
14
-
15
- def self.start(given_args = ARGV, config = {})
16
- #given_args = splat_namespaces(given_args)
17
- given_args = BaseCLI.parse_help(given_args)
18
- super(given_args, config)
19
- end
20
-
21
- # incompatible with options / arguments of Hash type
22
- # see: parse_hash here: https://github.com/erikhuda/thor/blob/master/lib/thor/parser/arguments.rb
23
- def self.splat_namespaces(args)
24
- args.reduce([]) do |done, arg|
25
- done.concat(arg.split(":"))
26
- end
27
- end
8
+ #class_option :verbosity, type: :numeric, default: 0, desc: "defines the level of verbosity to show feedback"
28
9
 
29
- def self.parse_help(args)
30
- # Help enhancement. Adapted from: https://stackoverflow.com/a/49044225/4352306
31
- last = args.last
32
- if args.length > 1 && help?(last)
33
- # switch last and second last position
34
- last = "help" if custom_help?(last)
35
- args.insert(args.length - 2, last).pop
36
- puts "> #{args.join(" ")}"
10
+ class << self
11
+ def start(given_args = ARGV, config = {})
12
+ super(given_args, config)
37
13
  end
38
- args
39
14
  end
40
-
41
- def self.help?(value)
42
- case value
43
- when String
44
- ALL_HELP_MAPPINGS.include?(value)
45
- when Symbol
46
- help?(value.to_s)
47
- when Array
48
- value.any? { |v| help?(v) }
49
- when Hash
50
- value.keys.any { |k| help?(v) }
51
- end
52
- end
53
-
54
- def self.custom_help?(value)
55
- CUSTOM_HELP_MAPPINGS.include?(value)
56
- end
57
-
15
+
58
16
  protected
59
17
 
60
18
  no_commands do
61
- def input?(options)
62
- options&.key?("input") || options&.key?(:input)
63
- end
64
-
65
- def input_object(input)
66
- Eco::CLI::Input.new(input)
67
- end
68
-
69
- def input(value)
70
- case
71
- when value.is_a?(Eco::CLI::Input)
72
- value.value
73
- when value.is_a?(Eco::CLI::MultiInput)
74
- value.to_h
75
- when value.is_a?(String)
76
- input(JSON.parse(value))
77
- when value&.key?("input")
78
- input(value["input"])
79
- when value&.key?(:input)
80
- input(value[:input])
81
- when value&.key?("json")
82
- JSON.parse(value["json"])
83
- when value&.key?(:json)
84
- JSON.parse(value[:json])
85
- end
86
- end
87
-
88
- def pipe(input, args)
89
- command, args, pipe = parse_pipe(args)
90
- invoke command, args, {input: input_object(input)} if pipe
91
- pipe
92
- end
93
-
94
- def parse_pipe(args)
95
- args.shift if pipe = (args.first == PIPE)
96
- subcommand = ""
97
- if pipe
98
- raise "Error: bad usage of pipe ('|'). Expected: '| command' " unless subcommand = args.slice!(0)
99
- if help?(subcommand)
100
- # Idea adapted from: https://stackoverflow.com/a/46167300/4352306
101
- self.class.command_help(Thor::Base.shell.new, args.first)
102
- exit
103
- end
104
- end
105
- [subcommand, args, pipe]
106
- end
107
-
108
- def help?(value)
109
- BaseCLI.help?(value)
110
- end
111
-
112
19
  end
113
20
 
114
21
  end