diff --git a/app/models/concerns/group_descendant.rb b/app/models/concerns/group_descendant.rb index 12c16a2cf5bea909e8a185456c7c991250688240..528fcaa1917bef636a9208e1120e7f00e97733fd 100644 --- a/app/models/concerns/group_descendant.rb +++ b/app/models/concerns/group_descendant.rb @@ -1,46 +1,46 @@ module GroupDescendant - def hierarchy(hierarchy_base = nil) - expand_hierarchy_for_child(self, self, hierarchy_base) + def hierarchy(hierarchy_top = nil) + expand_hierarchy_for_child(self, self, hierarchy_top) end - def expand_hierarchy_for_child(child, hierarchy, hierarchy_base) - if child.parent.nil? && hierarchy_base.present? + def expand_hierarchy_for_child(child, hierarchy, hierarchy_top) + if child.parent.nil? && hierarchy_top.present? raise ArgumentError.new('specified base is not part of the tree') end - if child.parent && child.parent != hierarchy_base + if child.parent && child.parent != hierarchy_top expand_hierarchy_for_child(child.parent, { child.parent => hierarchy }, - hierarchy_base) + hierarchy_top) else hierarchy end end - def merge_hierarchy(other_element, hierarchy_base = nil) - GroupDescendant.merge_hierarchies([self, other_element], hierarchy_base) + def merge_hierarchy(other_element, hierarchy_top = nil) + GroupDescendant.build_hierarchy([self, other_element], hierarchy_top) end - def self.merge_hierarchies(hierarchies, hierarchy_base = nil) - hierarchies = Array.wrap(hierarchies) - return if hierarchies.empty? + def self.build_hierarchy(descendants, hierarchy_top = nil) + descendants = Array.wrap(descendants) + return if descendants.empty? - unless hierarchies.all? { |hierarchy| hierarchy.is_a?(GroupDescendant) } + unless descendants.all? { |hierarchy| hierarchy.is_a?(GroupDescendant) } raise ArgumentError.new('element is not a hierarchy') end - first_hierarchy, *other_hierarchies = hierarchies - merged = first_hierarchy.hierarchy(hierarchy_base) + first_descendant, *other_descendants = descendants + merged = first_descendant.hierarchy(hierarchy_top) - other_hierarchies.each do |child| - next_hierarchy = child.hierarchy(hierarchy_base) - merged = merge_values(merged, next_hierarchy) + other_descendants.each do |descendant| + next_descendant = descendant.hierarchy(hierarchy_top) + merged = merge_hash_tree(merged, next_descendant) end merged end - def self.merge_values(first_child, second_child) + def self.merge_hash_tree(first_child, second_child) # When the first is an array, we need to go over every element to see if # we can merge deeper. If no match is found, we add the element to the array # @@ -55,7 +55,7 @@ module GroupDescendant # Handled cases: # [Hash, Hash] elsif first_child.is_a?(Hash) && second_child.is_a?(Hash) - first_child.deep_merge(second_child) { |key, first, second| merge_values(first, second) } + first_child.deep_merge(second_child) { |key, first, second| merge_hash_tree(first, second) } # If only one of them is a hash, and one of them is a GroupHierachy-object # we can check if its already in the hash. If so, we don't need to do anything # @@ -77,7 +77,7 @@ module GroupDescendant def self.merge_hash_into_array(array, new_hash) if mergeable_index = array.index { |element| element.is_a?(Hash) && (element.keys & new_hash.keys).any? } - array[mergeable_index] = merge_values(array[mergeable_index], new_hash) + array[mergeable_index] = merge_hash_tree(array[mergeable_index], new_hash) else array << new_hash end diff --git a/app/serializers/group_child_serializer.rb b/app/serializers/group_child_serializer.rb index f2ec741d32c28f25517bd86f71d313714bf616d1..ba81f99fff454683117a35778c55474ea7de3210 100644 --- a/app/serializers/group_child_serializer.rb +++ b/app/serializers/group_child_serializer.rb @@ -27,7 +27,7 @@ class GroupChildSerializer < BaseSerializer if children.is_a?(GroupDescendant) represent_hierarchy(children.hierarchy(hierarchy_root), opts).first else - hierarchies = GroupDescendant.merge_hierarchies(children, hierarchy_root) + hierarchies = GroupDescendant.build_hierarchy(children, hierarchy_root) represent_hierarchy(hierarchies, opts) end end diff --git a/spec/models/concerns/group_descendant_spec.rb b/spec/models/concerns/group_descendant_spec.rb index 87eee515cdee5c71c4114d883971f596084ae62b..b1578fc593efea3d0cdde3e563c0cf3fa63479de 100644 --- a/spec/models/concerns/group_descendant_spec.rb +++ b/spec/models/concerns/group_descendant_spec.rb @@ -40,7 +40,7 @@ describe GroupDescendant, :nested_groups do end end - describe '.merge_hierarchies' do + describe '.build_hierarchy' do it 'combines hierarchies until the top' do other_subgroup = create(:group, parent: parent) other_subsub_group = create(:group, parent: subgroup) @@ -49,7 +49,7 @@ describe GroupDescendant, :nested_groups do expected_hierarchy = { parent => [other_subgroup, { subgroup => [subsub_group, other_subsub_group] }] } - expect(described_class.merge_hierarchies(groups)).to eq(expected_hierarchy) + expect(described_class.build_hierarchy(groups)).to eq(expected_hierarchy) end it 'combines upto a given parent' do @@ -60,7 +60,7 @@ describe GroupDescendant, :nested_groups do expected_hierarchy = [other_subgroup, { subgroup => [subsub_group, other_subsub_group] }] - expect(described_class.merge_hierarchies(groups, parent)).to eq(expected_hierarchy) + expect(described_class.build_hierarchy(groups, parent)).to eq(expected_hierarchy) end it 'handles building a tree out of order' do @@ -71,7 +71,7 @@ describe GroupDescendant, :nested_groups do groups = [subsub_group, other_subgroup2, other_subsub_group] expected_hierarchy = { parent => [{ subgroup => subsub_group }, other_subgroup2, { other_subgroup => other_subsub_group }] } - expect(described_class.merge_hierarchies(groups)).to eq(expected_hierarchy) + expect(described_class.build_hierarchy(groups)).to eq(expected_hierarchy) end end end @@ -113,7 +113,7 @@ describe GroupDescendant, :nested_groups do end end - describe '.merge_hierarchies' do + describe '.build_hierarchy' do it 'combines hierarchies until the top' do other_project = create(:project, namespace: parent) other_subgroup_project = create(:project, namespace: subgroup) @@ -122,7 +122,7 @@ describe GroupDescendant, :nested_groups do expected_hierarchy = { parent => [other_project, { subgroup => [subsub_group, other_subgroup_project] }] } - expect(described_class.merge_hierarchies(elements)).to eq(expected_hierarchy) + expect(described_class.build_hierarchy(elements)).to eq(expected_hierarchy) end it 'combines upto a given parent' do @@ -133,13 +133,13 @@ describe GroupDescendant, :nested_groups do expected_hierarchy = [other_project, { subgroup => [subsub_group, other_subgroup_project] }] - expect(described_class.merge_hierarchies(elements, parent)).to eq(expected_hierarchy) + expect(described_class.build_hierarchy(elements, parent)).to eq(expected_hierarchy) end it 'merges to elements in the same hierarchy' do expected_hierarchy = { parent => subgroup } - expect(described_class.merge_hierarchies([parent, subgroup])).to eq(expected_hierarchy) + expect(described_class.build_hierarchy([parent, subgroup])).to eq(expected_hierarchy) end it 'merges complex hierarchies' do @@ -164,7 +164,7 @@ describe GroupDescendant, :nested_groups do { other_subgroup => other_subproject } ] - actual_hierarchy = described_class.merge_hierarchies(projects, parent) + actual_hierarchy = described_class.build_hierarchy(projects, parent) expect(actual_hierarchy).to eq(expected_hierarchy) end