class RuboCop::Cop::Team
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).
Attributes
cops[R]
errors[R]
updated_source_file[R]
updated_source_file?[R]
warnings[R]
Public Class Methods
forces_for(cops)
click to toggle source
@return [Array<Force>] needed for the given cops
# File lib/rubocop/cop/team.rb, line 98 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 = {})
click to toggle source
@return [Team] with cops assembled from the given `cop_classes`
# File lib/rubocop/cop/team.rb, line 36 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 = {})
click to toggle source
@return [Array<Cop::Base>]
# File lib/rubocop/cop/team.rb, line 42 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.enabled(config).map do |cop_class| cop_class.new(config, options) end end
new(cops, config = nil, options = {})
click to toggle source
# File lib/rubocop/cop/team.rb, line 17 def initialize(cops, config = nil, options = {}) @cops = cops @config = config @options = options reset @ready = true validate_config end
new(cop_or_classes, config, options = {})
click to toggle source
@return [Team]
Calls superclass method
# File lib/rubocop/cop/team.rb, line 28 def self.new(cop_or_classes, config, options = {}) # Support v0 api: return mobilize(cop_or_classes, config, options) if cop_or_classes.first.is_a?(Class) super end
Public Instance Methods
autocorrect?()
click to toggle source
# File lib/rubocop/cop/team.rb, line 50 def autocorrect? @options[:autocorrect] end
debug?()
click to toggle source
# File lib/rubocop/cop/team.rb, line 54 def debug? @options[:debug] end
external_dependency_checksum()
click to toggle source
# File lib/rubocop/cop/team.rb, line 112 def external_dependency_checksum keys = cops.map(&:external_dependency_checksum).compact Digest::SHA1.hexdigest(keys.join) end
forces()
click to toggle source
@deprecated
# File lib/rubocop/cop/team.rb, line 93 def forces @forces ||= self.class.forces_for(cops) end
inspect_file(processed_source)
click to toggle source
@deprecated. Use investigate @return Array<offenses>
# File lib/rubocop/cop/team.rb, line 60 def inspect_file(processed_source) investigate(processed_source).offenses end
investigate(processed_source)
click to toggle source
@return [Commissioner::InvestigationReport]
# File lib/rubocop/cop/team.rb, line 65 def investigate(processed_source) be_ready # The autocorrection process may have to be repeated multiple times # until there are no corrections left to perform # To speed things up, run autocorrecting cops by themselves, and only # run the other cops when no corrections are left on_duty = roundup_relevant_cops(processed_source.file_path) autocorrect_cops, other_cops = on_duty.partition(&:autocorrect?) report = investigate_partial(autocorrect_cops, processed_source) unless autocorrect(processed_source, report) # If we corrected some errors, another round of inspection will be # done, and any other offenses will be caught then, so only need # to check other_cops if no correction was done report = report.merge(investigate_partial(other_cops, processed_source)) end process_errors(processed_source.path, report.errors) report ensure @ready = false end
Private Instance Methods
autocorrect(processed_source, report)
click to toggle source
# File lib/rubocop/cop/team.rb, line 119 def autocorrect(processed_source, report) @updated_source_file = false return unless autocorrect? return if report.processed_source.parser_error new_source = autocorrect_report(report) return unless new_source if @options[:stdin] # holds source read in from stdin, when --stdin option is used @options[:stdin] = new_source else filename = processed_source.buffer.name File.write(filename, new_source) end @updated_source_file = true end
autocorrect_report(report)
click to toggle source
# File lib/rubocop/cop/team.rb, line 178 def autocorrect_report(report) corrector = collate_corrections(report) corrector.rewrite unless corrector.empty? end
be_ready()
click to toggle source
# File lib/rubocop/cop/team.rb, line 138 def be_ready return if @ready reset @cops.map!(&:ready) @ready = true end
collate_corrections(report)
click to toggle source
# File lib/rubocop/cop/team.rb, line 184 def collate_corrections(report) corrector = Corrector.new(report.processed_source) each_corrector(report) do |to_merge| suppress_clobbering do corrector.merge!(to_merge) end end corrector end
each_corrector(report) { |corrector| ... }
click to toggle source
# File lib/rubocop/cop/team.rb, line 196 def each_corrector(report) skips = Set.new report.cop_reports.each do |cop_report| cop = cop_report.cop corrector = cop_report.corrector next if corrector.nil? || corrector.empty? next if skips.include?(cop.class) yield corrector skips.merge(cop.class.autocorrect_incompatible_with) end end
handle_error(error, location, cop)
click to toggle source
# File lib/rubocop/cop/team.rb, line 246 def handle_error(error, location, cop) message = Rainbow("An error occurred while #{cop.name} cop was inspecting #{location}.").red @errors << message warn message if debug? puts error.message, error.backtrace else warn 'To see the complete backtrace run rubocop -d.' end end
handle_warning(error, location)
click to toggle source
# File lib/rubocop/cop/team.rb, line 238 def handle_warning(error, location) message = Rainbow("#{error.message} (from file: #{location})").yellow @warnings << message warn message puts error.backtrace if debug? end
investigate_partial(cops, processed_source)
click to toggle source
@return [Commissioner::InvestigationReport]
# File lib/rubocop/cop/team.rb, line 152 def investigate_partial(cops, processed_source) commissioner = Commissioner.new(cops, self.class.forces_for(cops), @options) commissioner.investigate(processed_source) end
process_errors(file, errors)
click to toggle source
# File lib/rubocop/cop/team.rb, line 223 def process_errors(file, errors) errors.each do |error| line = ":#{error.line}" if error.line column = ":#{error.column}" if error.column location = "#{file}#{line}#{column}" cause = error.cause if cause.is_a?(Warning) handle_warning(cause, location) else handle_error(cause, location, error.cop) end end end
reset()
click to toggle source
# File lib/rubocop/cop/team.rb, line 146 def reset @errors = [] @warnings = [] end
roundup_relevant_cops(filename)
click to toggle source
@return [Array<cop>]
# File lib/rubocop/cop/team.rb, line 158 def roundup_relevant_cops(filename) cops.reject do |cop| cop.excluded_file?(filename) || !support_target_ruby_version?(cop) || !support_target_rails_version?(cop) end end
support_target_rails_version?(cop)
click to toggle source
# File lib/rubocop/cop/team.rb, line 172 def support_target_rails_version?(cop) return true unless cop.class.respond_to?(:support_target_rails_version?) cop.class.support_target_rails_version?(cop.target_rails_version) end
support_target_ruby_version?(cop)
click to toggle source
# File lib/rubocop/cop/team.rb, line 166 def support_target_ruby_version?(cop) return true unless cop.class.respond_to?(:support_target_ruby_version?) cop.class.support_target_ruby_version?(cop.target_ruby_version) end
suppress_clobbering() { || ... }
click to toggle source
# File lib/rubocop/cop/team.rb, line 211 def suppress_clobbering yield rescue ::Parser::ClobberingError # ignore Clobbering errors end
validate_config()
click to toggle source
# File lib/rubocop/cop/team.rb, line 217 def validate_config cops.each do |cop| cop.validate_config if cop.respond_to?(:validate_config) end end