class Quality::QualityChecker

Runs a quality-checking, command, checks it agaist the existing number of violations for that command, and decreases that number if possible, or outputs data if the number of violations increased.

Constants

MAX_VIOLATIONS

Public Class Methods

new(cmd, command_options, output_dir, verbose, minimum_threshold, logger: STDOUT, count_file: File, count_io: IO, command_output_processor_class: Quality::CommandOutputProcessor, count_dir: Dir, process_class: Process) click to toggle source
# File lib/quality/quality_checker.rb, line 13
def initialize(cmd, command_options, output_dir, verbose,
               minimum_threshold,
               logger: STDOUT,
               count_file: File,
               count_io: IO,
               command_output_processor_class:
                 Quality::CommandOutputProcessor,
               count_dir: Dir,
               process_class: Process)
  @minimum_threshold = minimum_threshold
  @count_file = count_file
  @count_io = count_io
  @command_output_processor_class = command_output_processor_class
  @logger = logger
  @count_dir = count_dir
  @cmd = cmd
  @command_options = command_options
  @verbose = verbose
  @count_dir.mkdir(output_dir) unless @count_file.exists?(output_dir)
  @threshold = HighWaterMark::Threshold.new(cmd,
                                            count_io: count_io,
                                            count_file: count_file,
                                            output_dir: output_dir)
  @process_class = process_class
end

Public Instance Methods

execute(&count_violations_on_line) click to toggle source
# File lib/quality/quality_checker.rb, line 39
def execute(&count_violations_on_line)
  processor, exit_status = process_command(&count_violations_on_line)
  @violations = processor.violations
  check_exit_status(exit_status)
  ratchet_violations
end

Private Instance Methods

check_exit_status(exit_status) click to toggle source
# File lib/quality/quality_checker.rb, line 65
def check_exit_status(exit_status)
  return if @command_options[:gives_error_code_on_violations] ||
            @command_options[:gives_error_code_on_no_relevant_code]
  return unless exit_status.nonzero?

  raise("Error detected running #{rendered_full_cmd}.  " \
        "Exit status is #{exit_status}.  Output was #{@command_output}")
end
error_too_many_violations!() click to toggle source
# File lib/quality/quality_checker.rb, line 84
def error_too_many_violations!
  raise("Output from:\n\n" \
        "#{rendered_full_cmd}\n\n#{@command_output}\n\n" \
        "Reduce total number of #{@cmd} violations " \
        "to #{existing_violations} or below!")
end
existing_violations() click to toggle source
# File lib/quality/quality_checker.rb, line 76
def existing_violations
  @existing_violations ||= (@threshold.threshold || MAX_VIOLATIONS)
end
full_cmd() click to toggle source
# File lib/quality/quality_checker.rb, line 117
def full_cmd
  args = @command_options[:args] || ''
  @found_output = false
  RubySpawn.new(@cmd, args).invocation
end
process_command(&count_violations_on_line) click to toggle source
# File lib/quality/quality_checker.rb, line 48
def process_command(&count_violations_on_line)
  processor = @command_output_processor_class.new
  processor.emacs_format = @command_options[:emacs_format]
  exit_status = run_command(processor, &count_violations_on_line)
  [processor, exit_status]
end
ratchet_violations() click to toggle source
# File lib/quality/quality_checker.rb, line 102
def ratchet_violations
  report_violations(existing_violations)
  if @violations > [existing_violations, @minimum_threshold].max
    error_too_many_violations!
  elsif violations_to_write != existing_violations
    report_ratchet
    write_violations(violations_to_write)
  end
end
rendered_full_cmd() click to toggle source
# File lib/quality/quality_checker.rb, line 80
def rendered_full_cmd
  full_cmd.scan(/.{1,78}/).join("\\\n")
end
report_ratchet() click to toggle source
# File lib/quality/quality_checker.rb, line 95
def report_ratchet
  if @violations < existing_violations &&
     existing_violations != MAX_VIOLATIONS
    @logger.puts 'Ratcheting quality up...'
  end
end
report_violations(existing) click to toggle source
# File lib/quality/quality_checker.rb, line 112
def report_violations(existing)
  @logger.puts "Existing violations: #{existing}" if existing != MAX_VIOLATIONS
  @logger.puts "Found #{@violations} #{@cmd} violations"
end
run_command(processor, &count_violations_on_line) click to toggle source
# File lib/quality/quality_checker.rb, line 55
def run_command(processor, &count_violations_on_line)
  runner = @process_class.new(full_cmd + ' 2>&1')

  puts rendered_full_cmd if @verbose
  runner.run do |file|
    processor.file = file
    @command_output = processor.process(&count_violations_on_line)
  end
end
violations_to_write() click to toggle source
# File lib/quality/quality_checker.rb, line 91
def violations_to_write
  @violations_to_write ||= [@violations, @minimum_threshold].max
end
write_violations(new_violations) click to toggle source
# File lib/quality/quality_checker.rb, line 123
def write_violations(new_violations)
  @threshold.write_violations(new_violations)
end