Encapsulate formula desc offense checking logic into methods

This commit is contained in:
Gautham Goli 2017-03-12 02:55:21 +08:00
parent 4e57f4279a
commit febc108598

View File

@ -13,6 +13,9 @@ module RuboCop
# - Checks if `desc` contains the formula name
class FormulaDesc < FormulaCop
attr_accessor :formula_name, :description, :source_buffer, :line_number, :line_begin_pos,
:desc_begin_pos, :call_node
def audit_formula(node, class_node, _parent_class_node, body)
check(node, body, class_node.const_name)
end
@ -23,55 +26,58 @@ module RuboCop
body.each_child_node(:send) do |call_node|
_receiver, call_name, args = *call_node
next if call_name != :desc || args.children[0].empty?
description = args.children[0]
@formula_name = formula_name
@description = args.children[0]
@source_buffer = call_node.source_range.source_buffer
@line_number = call_node.loc.line
@line_begin_pos = call_node.source_range.source_buffer.line_range(call_node.loc.line).begin_pos
@desc_begin_pos = call_node.children[2].source_range.begin_pos
@call_node = call_node
source_buffer = call_node.source_range.source_buffer
line_number = call_node.loc.line
line_begin_pos = call_node.source_range.source_buffer.line_range(call_node.loc.line).begin_pos
desc_begin_pos = call_node.children[2].source_range.begin_pos
check_for_desc_length_offense
linelength = "#{formula_name}: #{description}".length
if linelength > 80
column = desc_begin_pos - line_begin_pos
length = call_node.children[2].source_range.size
sourcerange = source_range(source_buffer, line_number, column, length)
message = <<-EOS.undent
Description is too long. "name: desc" should be less than 80 characters.
Length is calculated as #{formula_name} + desc. (currently #{linelength})
EOS
add_offense(call_node, sourcerange, message)
end
check_for_offense(/(command ?line)/i,
"Description should use \"command-line\" instead of \"%s\"")
match_object = description.match(/(command ?line)/i)
if match_object
column = desc_begin_pos+match_object.begin(0)-line_begin_pos+1
length = match_object.to_s.length
sourcerange = source_range(source_buffer, line_number, column, length)
message = "Description should use \"command-line\" instead of \"#{match_object}\""
add_offense(call_node, sourcerange, message)
end
check_for_offense(/^(an?)\s/i,
"Description shouldn't start with an indefinite article (%s)")
match_object = description.match(/^(an?)\s/i)
if match_object
column = desc_begin_pos+match_object.begin(0)-line_begin_pos+1
length = match_object.to_s.length
sourcerange = source_range(source_buffer, line_number, column, length)
message = "Description shouldn't start with an indefinite article (#{match_object})"
add_offense(call_node, sourcerange, message)
end
match_object = description.match(/^#{formula_name}/i)
if match_object
column = desc_begin_pos+match_object.begin(0)-line_begin_pos+1
length = match_object.to_s.length
sourcerange = source_range(source_buffer, line_number, column, length)
message = "Description shouldn't include the formula name"
add_offense(call_node, sourcerange, message)
end
check_for_offense(/^#{formula_name}/i,
"Description shouldn't include the formula name")
return nil
end
add_offense(node, node.source_range, "Formula should have a desc (Description).")
end
def check_for_offense(regex, offense_msg)
# This method checks if particular regex has a match within formula's desc
# If so, adds a violation
match_object = @description.match(regex)
if match_object
column = @desc_begin_pos + match_object.begin(0) - @line_begin_pos + 1
length = match_object.to_s.length
offense_source_range = source_range(source_buffer, @line_number, column, length)
offense_msg = offense_msg % [match_object]
add_offense(@call_node, offense_source_range, offense_msg)
end
end
def check_for_desc_length_offense
# This method checks if desc length > max_desc_length
# If so, adds a violation
desc_length = "#{@formula_name}: #{@description}".length
max_desc_length = 80
if desc_length > max_desc_length
column = @desc_begin_pos - @line_begin_pos
length = @call_node.children[2].source_range.size
offense_source_range = source_range(source_buffer, @line_number, column, length)
desc_length_offense_msg = <<-EOS.undent
Description is too long. "name: desc" should be less than #{max_desc_length} characters.
Length is calculated as #{@formula_name} + desc. (currently #{"#{@formula_name}: #{@description}".length})
EOS
add_offense(@call_node, offense_source_range, desc_length_offense_msg)
end
end
end
end
end