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 # good # Checks ... class SomeCop < Base ... end
Constants
- COP_DESC_OFFENSE_REGEX
- MSG
- REPLACEMENT_REGEX
- SPECIAL_WORDS
Public Instance Methods
on_class(node)
click to toggle source
# File lib/rubocop/cop/internal_affairs/cop_description.rb, line 31 def on_class(node) return unless (module_node = node.parent) description_beginning = first_comment_line(module_node) return unless description_beginning start_with_subject = description_beginning.match(COP_DESC_OFFENSE_REGEX) return unless 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, 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
Private Instance Methods
comment_body(comment_line)
click to toggle source
# File lib/rubocop/cop/internal_affairs/cop_description.rb, line 81 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 85 def comment_index(node, comment_line) body = comment_body(comment_line) node.loc.expression.source.index(body) end
first_comment_line(node)
click to toggle source
# File lib/rubocop/cop/internal_affairs/cop_description.rb, line 77 def first_comment_line(node) node.loc.expression.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 59 def range(node, comment_line) source_buffer = node.loc.expression.source_buffer begin_pos = node.loc.expression.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
relevant_file?(file)
click to toggle source
# File lib/rubocop/cop/internal_affairs/cop_description.rb, line 90 def relevant_file?(file) file.match?(%r{/cop/.*\.rb\z}) end
replace_with_suggestion(corrector, range, suggestion, description_beginning)
click to toggle source
# File lib/rubocop/cop/internal_affairs/cop_description.rb, line 54 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 69 def suggestion_for_message(suggestion, match_data) if suggestion && !match_data['special'] "`#{suggestion}`" else 'a word such as verb' end end