lib/eco/api/common/people/supervisor_helpers.rb in eco-helpers-2.6.4 vs lib/eco/api/common/people/supervisor_helpers.rb in eco-helpers-2.7.0
- old
+ new
@@ -16,33 +16,35 @@
# 1. supervisors, people with no supervisor or where their supervisor not present
# 2. subordinates
# @return [Array<PersonEntry>] `values` sorted by supervisors/subordinates
def sort_by_supervisors(values, supervisors_first: true)
raise "Expected non hash Enumerable. Given: #{values.class}" if values.is_a?(Hash)
- return [] unless values && values.is_a?(Enumerable)
- roam = Proc.new do |tree|
+ return [] unless values.is_a?(Enumerable)
+ roam = proc do |tree|
[].tap do |out|
sub_outs = tree.empty?? [] : tree.map {|sup, subtree| roam.call(subtree)}
+
tree.each do |sup, subtree|
- sout = subtree.empty?? [] :roam.call(subtree)
+ sout = subtree.empty?? [] : roam.call(subtree)
supervisors_first ? sout.unshift(sup) : sout.push(sup)
out.concat(sout)
end
end
end
roam.call(supervisors_tree(values))
end
# Identifies all the cyclic supervisor chains
- # @note as `supervisors_tree` will have any entry involved in a cycle at the top, it just checks all the top entries against their offspring
+ # @note as `supervisors_tree` will have any entry involved in a cycle at the top,
+ # it just checks all the top entries against their offspring
# @return [Array<Array>] the sets of entries that are cyclic
def identify_cyclic_chains(values)
raise "Expected non hash Enumerable. Given: #{values.class}" if values.is_a?(Hash)
- return [] unless values && values.is_a?(Enumerable)
+ return [] unless values.is_a?(Enumerable)
- identify = Proc.new do |top_sup, offspring, chain = [top_sup]|
+ identify = proc do |top_sup, offspring, chain = [top_sup]|
next [] if offspring.empty?
offspring.each_with_object([]) do |(sup, subordinates), set|
break set unless set.empty?
if top_sup.supervisor_id == sup.id
set.concat(chain, [sup])
@@ -78,19 +80,19 @@
# * **values** are `Hash` subtree structures of `key` subordinates
# @note it is resilient to cyclic supervisors (it will just add the last at the top)
# @param values [Enumerable<Object>] of objects with methods:
# `id`, `external_id` and `supervisor_id`
# @return [Hash] the tree structure
- def supervisors_tree(values)
+ def supervisors_tree(values) # rubocop:disable Metrics/AbcSize
raise "Expected non hash Enumerable. Given: #{values.class}" if values.is_a?(Hash)
- return {} unless values && values.is_a?(Enumerable)
+ return {} unless values.is_a?(Enumerable)
idx = get_super_indexes(values)
processed = []
- subtree = Proc.new do |entry, level, toptree|
+ subtree = proc do |entry, level, toptree|
if processed.include?(entry)
- next {} unless toptree.key?(entry) && level > 0
+ next {} unless toptree.key?(entry) && level.positive?
# needs to be moved as a child
subnodes = toptree.delete(entry)
processed.delete(entry)
end
@@ -107,11 +109,11 @@
{entry => subnodes}
end
{}.tap do |tree|
idx[:by_sup].keys.each do |sup_id|
- if sup = idx[:supers][sup_id]
+ if (sup = idx[:supers][sup_id])
tree.merge!(subtree.call(sup, 0, tree))
else
idx[:by_sup][sup_id].each do |sub|
tree.merge!(subtree.call(sub, 0, tree))
end
@@ -120,59 +122,56 @@
end
end
private
- def get_super_indexes(values)
+ def get_super_indexes(values) # rubocop:disable Metrics/AbcSize
raise "Expected non hash Enumerable. Given: #{values.class}" if values.is_a?(Hash)
{}.tap do |indexes|
indexes[:by_id] = values.map do |e|
e.id && [e.id, e]
end.compact.to_h
indexes[:by_ext] = values.map do |e|
e.external_id && [e.external_id, e]
end.compact.to_h
indexes[:by_sup] = {}.tap do |by_s|
- values.group_by do |e|
- e.supervisor_id
- end.tap do |by_sup|
+ values.group_by(&:supervisor_id).tap do |by_sup|
by_s[nil] = by_sup.delete(nil) if by_sup.key?(nil)
by_s.merge!(by_sup)
end
end
indexes[:supers] = {}.tap do |sups|
- indexes[:by_ext].select do |ext, e|
+ indexes[:by_ext].select do |ext, _e|
ext && indexes[:by_sup].key?(ext)
end.tap {|found| sups.merge!(found)}
- indexes[:by_id].select do |id, e|
+ indexes[:by_id].select do |id, _e|
id && indexes[:by_sup].key?(id)
end.tap {|found| sups.merge!(found)}
end
- indexes[:is_super] = Proc.new do |entry|
- !!(indexes[:supers][entry.id] || indexes[:supers][entry.external_id])
+ indexes[:is_super] = proc do |entry|
+ is = indexes[:supers][entry.id] || indexes[:supers][entry.external_id]
+ !is.nil?
end
- indexes[:subordinates] = Proc.new do |entry|
+ indexes[:subordinates] = proc do |entry|
subs = nil
- if sup = indexes[:supers][entry.id] || indexes[:supers][entry.external_id]
- subs ||= indexes[:by_sup][sup.id] unless !sup.id
- subs ||= indexes[:by_sup][sup.external_id] unless !sup.external_id
+ sup = indexes[:supers][entry.id] || indexes[:supers][entry.external_id]
+ if sup
+ subs ||= indexes[:by_sup][sup.id] if sup.id
+ subs ||= indexes[:by_sup][sup.external_id] if sup.external_id
end
subs
end
end
-
end
-
end
class << self
include SupervisorHelpers::ClassMethods
end
-
end
end
end
end
end