class ERBLint::Linters::DeprecatedClasses

Checks for deprecated classes in the start tags of HTML elements.

Public Class Methods

new(file_loader, config) click to toggle source
Calls superclass method ERBLint::Linter::new
# File lib/erb_lint/linters/deprecated_classes.rb, line 27
def initialize(file_loader, config)
  super
  @addendum = @config.addendum
end

Public Instance Methods

run(processed_source) click to toggle source
# File lib/erb_lint/linters/deprecated_classes.rb, line 32
def run(processed_source)
  process_nested_offenses(
    source: processed_source,
    offset: 0,
    parent_source: processed_source,
  )
end

Private Instance Methods

class_name_with_loc(processed_source) click to toggle source
# File lib/erb_lint/linters/deprecated_classes.rb, line 57
def class_name_with_loc(processed_source)
  Enumerator.new do |yielder|
    tags(processed_source).each do |tag|
      class_value = tag.attributes["class"]&.value
      next unless class_value
      class_value.split(" ").each do |class_name|
        yielder.yield(class_name, tag.loc)
      end
    end
  end
end
generate_offenses(class_name, range) click to toggle source
# File lib/erb_lint/linters/deprecated_classes.rb, line 94
def generate_offenses(class_name, range)
  violated_rules(class_name).each do |violated_rule|
    suggestion = " #{violated_rule[:suggestion]}".rstrip
    message = "Deprecated class `%s` detected matching the pattern `%s`.%s #{@addendum}".strip

    add_offense(
      range,
      format(message, class_name, violated_rule[:class_expr], suggestion)
    )
  end
end
process_nested_offenses(source:, offset:, parent_source:) click to toggle source
# File lib/erb_lint/linters/deprecated_classes.rb, line 42
def process_nested_offenses(source:, offset:, parent_source:)
  class_name_with_loc(source).each do |class_name, loc|
    range = parent_source.to_source_range(loc).offset(offset)
    generate_offenses(class_name, range)
  end
  text_tags_content(source).each do |content_node|
    sub_source = ProcessedSource.new(source.filename, content_node.loc.source)
    process_nested_offenses(
      source: sub_source,
      offset: offset + content_node.loc.begin_pos,
      parent_source: parent_source
    )
  end
end
script_tags(processed_source) click to toggle source
# File lib/erb_lint/linters/deprecated_classes.rb, line 82
def script_tags(processed_source)
  tags(processed_source).select { |tag| tag.name == "script" }
end
tag_nodes(processed_source) click to toggle source
# File lib/erb_lint/linters/deprecated_classes.rb, line 90
def tag_nodes(processed_source)
  processed_source.parser.nodes_with_type(:tag)
end
tags(processed_source) click to toggle source
# File lib/erb_lint/linters/deprecated_classes.rb, line 86
def tags(processed_source)
  tag_nodes(processed_source).map { |tag_node| BetterHtml::Tree::Tag.from_node(tag_node) }
end
text_tags_content(processed_source) click to toggle source
# File lib/erb_lint/linters/deprecated_classes.rb, line 69
def text_tags_content(processed_source)
  Enumerator.new do |yielder|
    script_tags(processed_source)
      .select { |tag| tag.attributes["type"]&.value == "text/html" }
      .each do |tag|
        index = processed_source.ast.to_a.find_index(tag.node)
        next_node = processed_source.ast.to_a[index + 1]

        yielder.yield(next_node) if next_node.type == :text
      end
  end
end
violated_rules(class_name) click to toggle source
# File lib/erb_lint/linters/deprecated_classes.rb, line 106
def violated_rules(class_name)
  [].tap do |result|
    @config.rule_set.each do |rule|
      rule.deprecated.each do |deprecated|
        next unless /\A#{deprecated}\z/ =~ class_name

        result << {
          suggestion: rule.suggestion,
          class_expr: deprecated,
        }
      end
    end
  end
end