Class: DependencyTree::Tree

Inherits:
Hash
  • Object
show all
Defined in:
lib/ids_of_all_dependencies.rb

Instance Method Summary collapse

Constructor Details

#initialize(hash = {}) ⇒ Tree

Returns a new instance of Tree.



61
62
63
64
65
# File 'lib/ids_of_all_dependencies.rb', line 61

def initialize(hash={})
  hash.each do |key, value|
    self[key] = value
  end
end

Instance Method Details

#call_method_recursive(method, *args, &block) ⇒ Object



149
150
151
152
153
# File 'lib/ids_of_all_dependencies.rb', line 149

def call_method_recursive(method, *args, &block)
  do_recursive do |tree|
    tree.send(method, *args, &block)
  end
end

#deep_tree_cloneObject



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/ids_of_all_dependencies.rb', line 127

def deep_tree_clone
  hash = self.clone.map do |key, array|
    next [key, array] unless array.class == Array

    new_array = array.map do |subtree|
      if subtree.class == Tree
        subtree.deep_tree_clone
      else
        subtree
      end
    end

    [key, new_array]
  end

  Tree.new(hash)
end

#delete_key_recursive(key) ⇒ Object



145
146
147
# File 'lib/ids_of_all_dependencies.rb', line 145

def delete_key_recursive(key)
  call_method_recursive(:delete, key)
end

#do_recursive(&block) ⇒ Object



155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/ids_of_all_dependencies.rb', line 155

def do_recursive(&block)
  block.call(self)

  self.each do |key, array|
    next unless array.is_a? Array

    array.each do |subtree|
      subtree.do_recursive(&block) if subtree.is_a? Tree
    end
  end

  self
end

#ids_treeObject



67
68
69
70
# File 'lib/ids_of_all_dependencies.rb', line 67

def ids_tree
  self_cloned = self.deep_tree_clone
  self_cloned.delete_key_recursive(:instance)
end

#last_to_beginning!Object



112
113
114
115
116
117
# File 'lib/ids_of_all_dependencies.rb', line 112

def last_to_beginning!
  arr = self.to_a
  arr.unshift(arr.pop)
  self.clear
  self.merge!(arr.to_h)
end

#root_duplicate_summaryObject



123
124
125
# File 'lib/ids_of_all_dependencies.rb', line 123

def root_duplicate_summary
  root_summary + ", duplicate"
end

#root_summaryObject



119
120
121
# File 'lib/ids_of_all_dependencies.rb', line 119

def root_summary
  "id #{self[:id]}, #{self[:status]}"
end

#status_treeObject



72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/ids_of_all_dependencies.rb', line 72

def status_tree
  self_cloned = self.deep_tree_clone

  self_cloned.do_recursive do |tree|
    begin
      tree[:instance].reload
      tree[:status] = 'present'
    rescue ActiveRecord::RecordNotFound => e
      tree[:status] = 'removed'
    end

    tree.delete(:instance)
  end
end

#status_tree_condensedObject



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/ids_of_all_dependencies.rb', line 87

def status_tree_condensed
  result = status_tree.do_recursive do |tree|
    tree.each do |name, array|
      next unless array.class == Array

      new_array = array.map do |subtree|
        next subtree.root_duplicate_summary if subtree[:duplicate]
        next subtree if subtree.class != Tree || subtree.size > 2

        subtree.root_summary
      end

      array.clear
      array.concat(new_array)
    end
  end

  result.do_recursive do |tree|
    tree[:_] = tree.root_summary
    tree.delete(:id)
    tree.delete(:status)
    tree.last_to_beginning!
  end
end