Class: RuboCop::Cop::Team

Inherits:
Object
  • Object
show all
Defined in:
lib/rubocop/cop/team.rb

Overview

A group of cops, ready to be called on duty to inspect files. Team is responsible for selecting only relevant cops to be sent on duty, as well as insuring that the needed forces are sent along with them.

For performance reasons, Team will first dispatch cops & forces in two groups, first the ones needed for autocorrection (if any), then the rest (unless autocorrections happened). rubocop:disable Metrics/ClassLength

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(cops, config = nil, options = {}) ⇒ Team

Returns a new instance of Team.



64
65
66
67
68
69
70
71
72
73
# File 'lib/rubocop/cop/team.rb', line 64

def initialize(cops, config = nil, options = {})
  @cops = cops
  @config = config
  @options = options
  reset
  @ready = true
  @registry = Registry.new(cops, options.dup)

  validate_config
end

Instance Attribute Details

#copsObject (readonly)

Returns the value of attribute cops.



60
61
62
# File 'lib/rubocop/cop/team.rb', line 60

def cops
  @cops
end

#errorsObject (readonly)

Returns the value of attribute errors.



60
61
62
# File 'lib/rubocop/cop/team.rb', line 60

def errors
  @errors
end

#updated_source_fileObject (readonly) Also known as: updated_source_file?

Returns the value of attribute updated_source_file.



60
61
62
# File 'lib/rubocop/cop/team.rb', line 60

def updated_source_file
  @updated_source_file
end

#warningsObject (readonly)

Returns the value of attribute warnings.



60
61
62
# File 'lib/rubocop/cop/team.rb', line 60

def warnings
  @warnings
end

Class Method Details

.forces_for(cops) ⇒ Array<Force>

Returns needed for the given cops.

Returns:

  • (Array<Force>)

    needed for the given cops



46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/rubocop/cop/team.rb', line 46

def self.forces_for(cops)
  needed = Hash.new { |h, k| h[k] = [] }
  cops.each do |cop|
    forces = cop.class.joining_forces
    if forces.is_a?(Array)
      forces.each { |force| needed[force] << cop }
    elsif forces
      needed[forces] << cop
    end
  end

  needed.map { |force_class, joining_cops| force_class.new(joining_cops) }
end

.mobilize(cop_classes, config, options = {}) ⇒ Team

Returns with cops assembled from the given ‘cop_classes`.

Returns:

  • (Team)

    with cops assembled from the given ‘cop_classes`



31
32
33
34
# File 'lib/rubocop/cop/team.rb', line 31

def self.mobilize(cop_classes, config, options = {})
  cops = mobilize_cops(cop_classes, config, options)
  new(cops, config, options)
end

.mobilize_cops(cop_classes, config, options = {}) ⇒ Array<Cop::Base>

Returns:



37
38
39
40
41
42
43
# File 'lib/rubocop/cop/team.rb', line 37

def self.mobilize_cops(cop_classes, config, options = {})
  cop_classes = Registry.new(cop_classes.to_a, options) unless cop_classes.is_a?(Registry)

  cop_classes.map do |cop_class|
    cop_class.new(config, options)
  end
end

.new(cop_or_classes, config, options = {}) ⇒ Team

Returns:



18
19
20
21
22
23
24
25
26
27
28
# File 'lib/rubocop/cop/team.rb', line 18

def self.new(cop_or_classes, config, options = {})
  # Support v0 api:
  if cop_or_classes.first.is_a?(Class)
    warn Rainbow(<<~WARNING).yellow, uplevel: 1
      `Team.new` with cop classes is deprecated. Use `Team.mobilize` instead.
    WARNING
    return mobilize(cop_or_classes, config, options)
  end

  super
end

Instance Method Details

#autocorrect?Boolean

Returns:

  • (Boolean)


75
76
77
# File 'lib/rubocop/cop/team.rb', line 75

def autocorrect?
  @options[:autocorrect]
end

#debug?Boolean

Returns:

  • (Boolean)


79
80
81
# File 'lib/rubocop/cop/team.rb', line 79

def debug?
  @options[:debug]
end

#external_dependency_checksumObject



125
126
127
128
129
130
131
132
# File 'lib/rubocop/cop/team.rb', line 125

def external_dependency_checksum
  # The external dependency checksums are cached per RuboCop team so that
  # the checksums don't need to be recomputed for each file.
  @external_dependency_checksum ||= begin
    keys = cops.filter_map(&:external_dependency_checksum)
    Digest::SHA1.hexdigest(keys.join)
  end
end

#forcesObject

Deprecated.


117
118
119
120
121
122
123
# File 'lib/rubocop/cop/team.rb', line 117

def forces
  warn Rainbow(<<~WARNING).yellow, uplevel: 1
    `forces` is deprecated.
  WARNING

  @forces ||= self.class.forces_for(cops)
end

#inspect_file(processed_source) ⇒ Object



85
86
87
88
89
90
91
# File 'lib/rubocop/cop/team.rb', line 85

def inspect_file(processed_source)
  warn Rainbow(<<~WARNING).yellow, uplevel: 1
    `inspect_file` is deprecated. Use `investigate` instead.
  WARNING

  investigate(processed_source).offenses
end

#investigate(processed_source, offset: 0, original: processed_source) ⇒ Commissioner::InvestigationReport



94
95
96
97
98
# File 'lib/rubocop/cop/team.rb', line 94

def investigate(processed_source, offset: 0, original: processed_source)
  result = investigate_with_corrector(processed_source, offset: offset, original: original)
  autocorrect(processed_source, result.corrector)
  result.report
end

#investigate_fragments(fragments, original:) ⇒ Array<Offense>

Returns:



101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/rubocop/cop/team.rb', line 101

def investigate_fragments(fragments, original:)
  @updated_source_file = false

  offenses, errors, warnings, corrector =
    fragments.each_with_object([[], [], [], nil]) do |fragment, data|
      investigate_fragment(fragment, original, data)
    end

  autocorrect(original, corrector)
  @errors = errors
  @warnings = warnings

  offenses
end