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.



74
75
76
77
78
79
80
81
82
83
# File 'lib/rubocop/cop/team.rb', line 74

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

#defer_correctionsObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

When set to true, the corrected source is not written back to the inspected file; it is exposed through #updated_source instead.



65
66
67
# File 'lib/rubocop/cop/team.rb', line 65

def defer_corrections
  @defer_corrections
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_sourceObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

The corrected source of the last investigation, if corrections were made with #defer_corrections enabled.



70
71
72
# File 'lib/rubocop/cop/team.rb', line 70

def updated_source
  @updated_source
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)


85
86
87
# File 'lib/rubocop/cop/team.rb', line 85

def autocorrect?
  @options[:autocorrect]
end

#debug?Boolean

Returns:

  • (Boolean)


89
90
91
# File 'lib/rubocop/cop/team.rb', line 89

def debug?
  @options[:debug]
end

#external_dependency_checksumObject



135
136
137
138
139
140
141
142
# File 'lib/rubocop/cop/team.rb', line 135

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.


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

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

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

#inspect_file(processed_source) ⇒ Object



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

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



104
105
106
107
108
# File 'lib/rubocop/cop/team.rb', line 104

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:



111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/rubocop/cop/team.rb', line 111

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