Module: Eco::API::Common::People::SupervisorHelpers
- Included in:
- Entries
- Defined in:
- lib/eco/api/common/people/supervisor_helpers.rb
Overview
Used with Enumerable of objects that have the following methods:
supervisor_idexternal_idid
Instance Method Summary collapse
- #print_tree(tree, lev: 0) ⇒ Object
-
#sort_by_supervisors(values, supervisors_first: true) ⇒ Object
Reorders as follows: 1.
-
#supervisors_tree(values) ⇒ Hash
Generates a
Hashtree structure, where: * keys are nodes * values areHashsubtree structures ofkeysubordinates. - #tree_to_str(tree, lev: 0) ⇒ Object
Instance Method Details
#print_tree(tree, lev: 0) ⇒ Object
41 42 43 |
# File 'lib/eco/api/common/people/supervisor_helpers.rb', line 41 def print_tree(tree, lev: 0) puts tree_to_str(tree) end |
#sort_by_supervisors(values, supervisors_first: true) ⇒ Object
Reorders as follows:
- supervisors, people with no supervisor or where their supervisor not present
- subordinates
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/eco/api/common/people/supervisor_helpers.rb', line 14 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| [].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) supervisors_first ? sout.unshift(sup) : sout.push(sup) out.concat(sout) end end end roam.call(supervisors_tree(values)) end |
#supervisors_tree(values) ⇒ Hash
Note:
it is resilient to cyclic supervisors (it will just add the last at the top)
Generates a Hash tree structure, where:
- keys are nodes
- values are
Hashsubtree structures ofkeysubordinates
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/eco/api/common/people/supervisor_helpers.rb', line 52 def supervisors_tree(values) raise "Expected non hash Enumerable. Given: #{values.class}" if values.is_a?(Hash) return {} unless values && values.is_a?(Enumerable) idx = get_super_indexes(values) processed = [] subtree = Proc.new do |entry, level, toptree| if processed.include?(entry) next {} unless toptree.key?(entry) && level > 0 # needs to be moved as a child subnodes = toptree.delete(entry) processed.delete(entry) end subnodes ||= {}.tap do |tree| subs = idx[:subordinates].call(entry) processed.push(entry) next nil unless subs && !subs.empty? subs.each do |sub| sub_tree = subtree.call(sub, level + 1, toptree) tree.merge!(sub_tree) end end {entry => subnodes} end {}.tap do |tree| idx[:by_sup].keys.each do |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 end end end end |
#tree_to_str(tree, lev: 0) ⇒ Object
31 32 33 34 35 36 37 38 39 |
# File 'lib/eco/api/common/people/supervisor_helpers.rb', line 31 def tree_to_str(tree, lev: 0) raise "Required Hash tree structure. Given: #{tree.class}" unless tree.is_a?(Hash) "".tap do |str| tree.each do |entry, subtree| str << "#{" " * lev}+-- #{entry.id || entry.external_id}\n" str << tree_to_str(subtree, lev: lev + 1) unless !subtree || subtree.empty? end end end |