class Ducalis::RegexCop

Constants

DEFAULT_EXAMPLE
DETAILS
OFFENSE
SELF_DESCRIPTIVE

Public Instance Methods

on_begin(node) click to toggle source
# File lib/ducalis/cops/regex_cop.rb, line 44
def on_begin(node)
  not_defined_regexes(node).each do |regex|
    next if SELF_DESCRIPTIVE.include?(regex.source) || const_dynamic?(regex)

    add_offense(regex, :expression, format(OFFENSE, present_node(regex)))
  end
end

Private Instance Methods

const_dynamic?(node) click to toggle source
# File lib/ducalis/cops/regex_cop.rb, line 67
def const_dynamic?(node)
  node.child_nodes.any?(&:begin_type?)
end
defined_as_const?(regex, definitions) click to toggle source
# File lib/ducalis/cops/regex_cop.rb, line 63
def defined_as_const?(regex, definitions)
  definitions.any? { |node| const_using(node).any? { |use| use == regex } }
end
not_defined_regexes(node) click to toggle source
# File lib/ducalis/cops/regex_cop.rb, line 57
def not_defined_regexes(node)
  const_using(node).reject do |regex|
    defined_as_const?(regex, const_definition(node))
  end.map(&:parent)
end
present_node(node) click to toggle source
# File lib/ducalis/cops/regex_cop.rb, line 71
def present_node(node)
  {
    constant: node.source,
    fixed_string: node.source_range.source_line
                      .sub(node.source, 'CONST_NAME').lstrip,
    example: regex_sample(node)
  }
end
regex_sample(node) click to toggle source
# File lib/ducalis/cops/regex_cop.rb, line 80
def regex_sample(node)
  Regexp.new(node.to_a.first.to_a.first).examples.sample
rescue RegexpExamples::IllegalSyntaxError
  DEFAULT_EXAMPLE
end