diff --git a/app/models/concerns/group_descendant.rb b/app/models/concerns/group_descendant.rb index 7bc555e11a6..7d8f051d2eb 100644 --- a/app/models/concerns/group_descendant.rb +++ b/app/models/concerns/group_descendant.rb @@ -3,28 +3,6 @@ module GroupDescendant expand_hierarchy_for_child(self, self, hierarchy_top, preloaded) end - def expand_hierarchy_for_child(child, hierarchy, hierarchy_top, preloaded = []) - parent = preloaded.detect { |possible_parent| possible_parent.is_a?(Group) && possible_parent.id == child.parent_id } - parent ||= child.parent - - if parent.nil? && hierarchy_top.present? - raise ArgumentError.new('specified base is not part of the tree') - end - - if parent && parent != hierarchy_top - expand_hierarchy_for_child(parent, - { parent => hierarchy }, - hierarchy_top, - preloaded) - else - hierarchy - end - end - - def merge_hierarchy(other_element, hierarchy_top = nil) - GroupDescendant.build_hierarchy([self, other_element], hierarchy_top) - end - def self.build_hierarchy(descendants, hierarchy_top = nil) descendants = Array.wrap(descendants) return if descendants.empty? @@ -44,7 +22,27 @@ module GroupDescendant merged end - def self.merge_hash_tree(first_child, second_child) + private + + def expand_hierarchy_for_child(child, hierarchy, hierarchy_top, preloaded = []) + parent = preloaded.detect { |possible_parent| possible_parent.is_a?(Group) && possible_parent.id == child.parent_id } + parent ||= child.parent + + if parent.nil? && hierarchy_top.present? + raise ArgumentError.new('specified base is not part of the tree') + end + + if parent && parent != hierarchy_top + expand_hierarchy_for_child(parent, + { parent => hierarchy }, + hierarchy_top, + preloaded) + else + hierarchy + end + end + + private_class_method 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 # @@ -79,7 +77,7 @@ module GroupDescendant end end - def self.merge_hash_into_array(array, new_hash) + private_class_method 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_hash_tree(array[mergeable_index], new_hash) else diff --git a/spec/models/concerns/group_descendant_spec.rb b/spec/models/concerns/group_descendant_spec.rb index b1578fc593e..f3a0c342d35 100644 --- a/spec/models/concerns/group_descendant_spec.rb +++ b/spec/models/concerns/group_descendant_spec.rb @@ -24,22 +24,6 @@ describe GroupDescendant, :nested_groups do end end - describe '#parent' do - it 'returns the correct parent' do - expect(subsub_group.parent).to eq(subgroup) - end - end - - describe '#merge_hierarchy' do - it 'combines hierarchies' do - other_subgroup = create(:group, parent: parent) - - expected_hierarchy = { parent => [{ subgroup => subsub_group }, other_subgroup] } - - expect(subsub_group.merge_hierarchy(other_subgroup)).to eq(expected_hierarchy) - end - end - describe '.build_hierarchy' do it 'combines hierarchies until the top' do other_subgroup = create(:group, parent: parent) @@ -97,22 +81,6 @@ describe GroupDescendant, :nested_groups do end end - describe '#parent' do - it 'returns the correct parent' do - expect(project.parent).to eq(subsub_group) - end - end - - describe '#merge_hierarchy' do - it 'combines hierarchies' do - project = create(:project, namespace: parent) - - expected_hierarchy = { parent => [{ subgroup => subsub_group }, project] } - - expect(subsub_group.merge_hierarchy(project)).to eq(expected_hierarchy) - end - end - describe '.build_hierarchy' do it 'combines hierarchies until the top' do other_project = create(:project, namespace: parent)