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