summaryrefslogtreecommitdiff
path: root/rubocop/cop_todo.rb
blob: a36afc08673a3378a396e4cf9c2498bbcebce3c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# frozen_string_literal: true

require_relative 'formatter/graceful_formatter'

module RuboCop
  class CopTodo
    attr_accessor :previously_disabled, :grace_period

    attr_reader :cop_name, :files, :offense_count

    def initialize(cop_name)
      @cop_name = cop_name
      @files = Set.new
      @offense_count = 0
      @cop_class = self.class.find_cop_by_name(cop_name)
      @previously_disabled = false
      @grace_period = false
    end

    def record(file, offense_count)
      @files << file
      @offense_count += offense_count
    end

    def autocorrectable?
      @cop_class&.support_autocorrect?
    end

    def to_yaml
      yaml = []
      yaml << '---'
      yaml << '# Cop supports --auto-correct.' if autocorrectable?
      yaml << "#{cop_name}:"

      if previously_disabled
        yaml << "  # Offense count: #{offense_count}"
        yaml << '  # Temporarily disabled due to too many offenses'
        yaml << '  Enabled: false'
      end

      yaml << "  #{RuboCop::Formatter::GracefulFormatter.grace_period_key_value}" if grace_period
      yaml << '  Exclude:'
      yaml.concat files.sort.map { |file| "    - '#{file}'" }
      yaml << ''

      yaml.join("\n")
    end

    def self.find_cop_by_name(cop_name)
      RuboCop::Cop::Registry.global.find_by_cop_name(cop_name)
    end
  end
end