class Codeowners::Checker::LineGrouper

Create groups and subgroups structure for the lines in the CODEOWNERS file.

Attributes

group_buffer[R]

rubocop:enable Metrics/AbcSize rubocop:enable Metrics/CyclomaticComplexity rubocop:enable Metrics/MethodLength

lines[R]

rubocop:enable Metrics/AbcSize rubocop:enable Metrics/CyclomaticComplexity rubocop:enable Metrics/MethodLength

Public Class Methods

call(group, lines) click to toggle source
# File lib/codeowners/checker/line_grouper.rb, line 7
def self.call(group, lines)
  new(group, lines).call
end
new(group, lines) click to toggle source
# File lib/codeowners/checker/line_grouper.rb, line 11
def initialize(group, lines)
  @group_buffer = [group]
  @lines = lines
end

Public Instance Methods

call() click to toggle source

rubocop:disable Metrics/AbcSize rubocop:disable Metrics/CyclomaticComplexity rubocop:disable Metrics/MethodLength

# File lib/codeowners/checker/line_grouper.rb, line 19
def call
  lines.each_with_index do |line, index|
    case line
    when Codeowners::Checker::Group::Empty
      ensure_groups_structure
    when Codeowners::Checker::Group::GroupBeginComment
      trim_groups(line.level)
      create_groups_structure(line.level)
    when Codeowners::Checker::Group::GroupEndComment
      trim_subgroups(line.level)
      create_groups_structure(line.level)
    when Codeowners::Checker::Group::Comment
      if previous_line_empty?(index)
        trim_groups(line.level)
      else
        trim_subgroups(line.level)
      end
      create_groups_structure(line.level)
    when Codeowners::Checker::Group::Pattern
      if new_owner?(line, index)
        trim_groups(current_level)
        new_group
      end
      ensure_groups_structure
    when Codeowners::Checker::Group::UnrecognizedLine
      ensure_groups_structure
    else
      raise "Do not know how to handle line: #{line.inspect}"
    end
    current_group.add(line)
  end
  group_buffer.first
end

Private Instance Methods

create_groups_structure(level) click to toggle source
# File lib/codeowners/checker/line_grouper.rb, line 99
def create_groups_structure(level)
  new_group while current_level < level
end
current_group() click to toggle source
# File lib/codeowners/checker/line_grouper.rb, line 82
def current_group
  group_buffer.last
end
current_level() click to toggle source
# File lib/codeowners/checker/line_grouper.rb, line 86
def current_level
  group_buffer.length - 1
end
ensure_groups_structure() click to toggle source
# File lib/codeowners/checker/line_grouper.rb, line 95
def ensure_groups_structure
  new_group if current_level.zero?
end
new_group() click to toggle source
# File lib/codeowners/checker/line_grouper.rb, line 90
def new_group
  group = current_group.create_subgroup
  group_buffer << group
end
new_owner?(line, index) click to toggle source
# File lib/codeowners/checker/line_grouper.rb, line 64
def new_owner?(line, index) # rubocop:disable Metrics/MethodLength
  if previous_line_empty?(index)
    offset = 2
    while (index - offset).positive?
      case lines[index - offset]
      when Codeowners::Checker::Group::GroupEndComment
        nil
      when Codeowners::Checker::Group::Comment
        return false
      when Codeowners::Checker::Group::Pattern
        return line.owner != lines[index - offset].owner
      end
      offset += 1
    end
  end
  false
end
previous_line_empty?(index) click to toggle source
# File lib/codeowners/checker/line_grouper.rb, line 60
def previous_line_empty?(index)
  index.positive? && lines[index - 1].is_a?(Codeowners::Checker::Group::Empty)
end
trim_groups(level) click to toggle source
# File lib/codeowners/checker/line_grouper.rb, line 103
def trim_groups(level)
  group_buffer.slice!(level..-1)
end
trim_subgroups(level) click to toggle source
# File lib/codeowners/checker/line_grouper.rb, line 107
def trim_subgroups(level)
  trim_groups(level + 1)
end