class RuboCop::Cop::InternalAffairs::CopDescription

Enforces the cop description to start with a word such as verb.

@example

# bad
# This cop checks ....
class SomeCop < Base
  ....
end

# bad
#
# Checks ...
class SomeCop < Base
  ...
end

# good
# Checks ...
class SomeCop < Base
  ...
end

Constants

COP_DESC_OFFENSE_REGEX
EMPTY_COMMENT_LINE_REGEX
MSG_STARTS_WITH_EMPTY_COMMENT_LINE
MSG_STARTS_WITH_WRONG_WORD
REPLACEMENT_REGEX
SPECIAL_WORDS

Public Instance Methods

on_class(node) click to toggle source
# File lib/rubocop/cop/internal_affairs/cop_description.rb, line 42
def on_class(node)
  return unless (module_node = node.parent) && node.parent_class

  description_beginning = first_comment_line(module_node)
  return unless description_beginning

  if description_beginning.match?(EMPTY_COMMENT_LINE_REGEX)
    register_offense_for_empty_comment_line(module_node, description_beginning)
  else
    start_with_subject = description_beginning.match(COP_DESC_OFFENSE_REGEX)
    return unless start_with_subject

    register_offense_for_wrong_word(module_node, description_beginning, start_with_subject)
  end
end

Private Instance Methods

comment_body(comment_line) click to toggle source
# File lib/rubocop/cop/internal_affairs/cop_description.rb, line 107
def comment_body(comment_line)
  comment_line.gsub(/^\s*# /, '')
end
comment_index(node, comment_line) click to toggle source
# File lib/rubocop/cop/internal_affairs/cop_description.rb, line 111
def comment_index(node, comment_line)
  body = comment_body(comment_line)
  node.source.index(body)
end
first_comment_line(node) click to toggle source
# File lib/rubocop/cop/internal_affairs/cop_description.rb, line 103
def first_comment_line(node)
  node.source.lines.find { |line| comment_line?(line) }
end
range(node, comment_line) click to toggle source
# File lib/rubocop/cop/internal_affairs/cop_description.rb, line 85
def range(node, comment_line)
  source_buffer = node.source_range.source_buffer

  begin_pos = node.source_range.begin_pos
  begin_pos += comment_index(node, comment_line)
  end_pos = begin_pos + comment_body(comment_line).length

  Parser::Source::Range.new(source_buffer, begin_pos, end_pos)
end
register_offense_for_empty_comment_line(module_node, description_beginning) click to toggle source
# File lib/rubocop/cop/internal_affairs/cop_description.rb, line 60
def register_offense_for_empty_comment_line(module_node, description_beginning)
  range = range(module_node, description_beginning)
  add_offense(range, message: MSG_STARTS_WITH_EMPTY_COMMENT_LINE) do |corrector|
    corrector.remove(range)
  end
end
register_offense_for_wrong_word(module_node, description_beginning, start_with_subject) click to toggle source
# File lib/rubocop/cop/internal_affairs/cop_description.rb, line 67
def register_offense_for_wrong_word(module_node, description_beginning, start_with_subject)
  suggestion = start_with_subject['word']&.capitalize
  range = range(module_node, description_beginning)
  suggestion_for_message = suggestion_for_message(suggestion, start_with_subject)
  message = format(MSG_STARTS_WITH_WRONG_WORD, suggestion: suggestion_for_message)

  add_offense(range, message: message) do |corrector|
    if suggestion && !start_with_subject['special']
      replace_with_suggestion(corrector, range, suggestion, description_beginning)
    end
  end
end
replace_with_suggestion(corrector, range, suggestion, description_beginning) click to toggle source
# File lib/rubocop/cop/internal_affairs/cop_description.rb, line 80
def replace_with_suggestion(corrector, range, suggestion, description_beginning)
  replacement = description_beginning.gsub(REPLACEMENT_REGEX, "#{suggestion} ")
  corrector.replace(range, replacement)
end
suggestion_for_message(suggestion, match_data) click to toggle source
# File lib/rubocop/cop/internal_affairs/cop_description.rb, line 95
def suggestion_for_message(suggestion, match_data)
  if suggestion && !match_data['special']
    "`#{suggestion}`"
  else
    'a word such as verb'
  end
end