quality 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -7
- data/lib/quality/command_output_processor.rb +53 -0
- data/lib/quality/quality_checker.rb +108 -0
- data/lib/quality/rake/task.rb +114 -147
- data/lib/quality/version.rb +1 -1
- data/quality.gemspec +1 -1
- metadata +6 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: b5685a2d62cde5dfe205d5a86d1291a6c194bfd5
         | 
| 4 | 
            +
              data.tar.gz: ee00ee02ea7878fa1c292b1143b39c1ae4328cd1
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 155a536e9accec95840cd873704efeb53aac9ef31f4f92e2da2a60c31af7532944e57c9ea140c04225811befc6f008755dca411cbae7fce355df9ce29303b1b7
         | 
| 7 | 
            +
              data.tar.gz: 2fb571730ecfad52008c969ba5b64e0d99f4583f4b49035ed8e01dd8a4afff7eb4b05e884d187ee75a1c619f271c21f52809d99e33c5a933e941963c6f977d9f
         | 
    
        data/README.md
    CHANGED
    
    | @@ -61,13 +61,6 @@ Quality::Rake::Task.new { |t| | |
| 61 61 | 
             
            }
         | 
| 62 62 | 
             
            ```
         | 
| 63 63 |  | 
| 64 | 
            -
             | 
| 65 | 
            -
            ## Optional tools
         | 
| 66 | 
            -
             | 
| 67 | 
            -
            The 'reek' gem is supported, but not by default.  To support it, add the 'reek' gem to your Gemspec.  Once reek supports Ruby 2.0, it will presumably support newer versions of the 'ruby_parser' gem.  Currently it will disable Ruby 2.0 supports in other quality-check gems by forcing them to a lower version.
         | 
| 68 | 
            -
             | 
| 69 | 
            -
            https://github.com/troessner/reek/issues/165
         | 
| 70 | 
            -
             | 
| 71 64 | 
             
            ## Contributing
         | 
| 72 65 |  | 
| 73 66 | 
             
            * Fork the repo
         | 
| @@ -82,6 +75,7 @@ Quality makes use of the following other gems, which do the actual checking: | |
| 82 75 | 
             
            * cane
         | 
| 83 76 | 
             
            * flog
         | 
| 84 77 | 
             
            * flay
         | 
| 78 | 
            +
            * rubocop
         | 
| 85 79 |  | 
| 86 80 | 
             
            ### Learn More
         | 
| 87 81 |  | 
| @@ -0,0 +1,53 @@ | |
| 1 | 
            +
            module Quality
         | 
| 2 | 
            +
              # Class processes output from a code quality command, tweaking it
         | 
| 3 | 
            +
              # for editor output and counting the number of violations found
         | 
| 4 | 
            +
              class CommandOutputProcessor
         | 
| 5 | 
            +
                attr_accessor :emacs_format
         | 
| 6 | 
            +
                attr_accessor :file
         | 
| 7 | 
            +
                attr_reader :found_output
         | 
| 8 | 
            +
                attr_reader :violations
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                def initialize
         | 
| 11 | 
            +
                  @emacs_format = false
         | 
| 12 | 
            +
                  @found_output = false
         | 
| 13 | 
            +
                  @violations = 0
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def process!(&count_violations_on_line)
         | 
| 17 | 
            +
                  process_file(file, &count_violations_on_line)
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                private
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                def process_file(file, &count_violations_on_line)
         | 
| 23 | 
            +
                  out = ''
         | 
| 24 | 
            +
                  while (@current_line = file.gets)
         | 
| 25 | 
            +
                    out <<
         | 
| 26 | 
            +
                      process_line(&count_violations_on_line)
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                  out
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                def process_line(&count_violations_on_line)
         | 
| 32 | 
            +
                  output =
         | 
| 33 | 
            +
                    if emacs_format
         | 
| 34 | 
            +
                      preprocess_line_for_emacs
         | 
| 35 | 
            +
                    else
         | 
| 36 | 
            +
                      @current_line
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
                  @found_output = true
         | 
| 39 | 
            +
                  @violations += yield @current_line
         | 
| 40 | 
            +
                  output
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                def preprocess_line_for_emacs
         | 
| 44 | 
            +
                  if @current_line =~ /^ *(\S*.rb:[0-9]*) *(.*)/
         | 
| 45 | 
            +
                    $1 + ': ' + $2 + "\n"
         | 
| 46 | 
            +
                  elsif @current_line =~ /^ *(.*) +(\S*.rb:[0-9]*) *(.*)/
         | 
| 47 | 
            +
                    $2 + ': ' + $1 + "\n"
         | 
| 48 | 
            +
                  else
         | 
| 49 | 
            +
                    @current_line
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
                end
         | 
| 52 | 
            +
              end
         | 
| 53 | 
            +
            end
         | 
| @@ -0,0 +1,108 @@ | |
| 1 | 
            +
            require_relative 'command_output_processor'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module Quality
         | 
| 4 | 
            +
              # Runs a quality-checking, command, checks it agaist the existing
         | 
| 5 | 
            +
              # number of violations for that command, and decreases that number
         | 
| 6 | 
            +
              # if possible, or outputs data if the number of violations increased.
         | 
| 7 | 
            +
              class QualityChecker
         | 
| 8 | 
            +
                def initialize(cmd, command_options, output_dir, dependencies = {})
         | 
| 9 | 
            +
                  @popener = dependencies[:popener] || IO
         | 
| 10 | 
            +
                  @count_file = dependencies[:count_file] || File
         | 
| 11 | 
            +
                  @count_io = dependencies[:count_io] || IO
         | 
| 12 | 
            +
                  @command_output_processor_class =
         | 
| 13 | 
            +
                    dependencies[:command_output_processor_class] ||
         | 
| 14 | 
            +
                    Quality::CommandOutputProcessor
         | 
| 15 | 
            +
                  @cmd = cmd
         | 
| 16 | 
            +
                  @command_options = command_options
         | 
| 17 | 
            +
                  @filename = File.join(output_dir, "#{cmd}_high_water_mark")
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def execute(&count_violations_on_line)
         | 
| 21 | 
            +
                  processor, exit_status = process_command(&count_violations_on_line)
         | 
| 22 | 
            +
                  @violations = processor.violations
         | 
| 23 | 
            +
                  check_exit_status(exit_status)
         | 
| 24 | 
            +
                  ratchet_violations
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                private
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                def process_command(&count_violations_on_line)
         | 
| 30 | 
            +
                  processor = @command_output_processor_class.new
         | 
| 31 | 
            +
                  processor.emacs_format = @command_options[:emacs_format]
         | 
| 32 | 
            +
                  exit_status = run_command(processor, &count_violations_on_line)
         | 
| 33 | 
            +
                  [processor, $?.exitstatus]
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def run_command(processor, &count_violations_on_line)
         | 
| 37 | 
            +
                  @popener.popen(full_cmd) do |file|
         | 
| 38 | 
            +
                    processor.file = file
         | 
| 39 | 
            +
                    @command_output = processor.process!(&count_violations_on_line)
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                def check_exit_status(exit_status)
         | 
| 44 | 
            +
                  unless @command_options[:gives_error_code_on_violations]
         | 
| 45 | 
            +
                    if exit_status != 0
         | 
| 46 | 
            +
                      fail("Error detected running #{full_cmd}.  " +
         | 
| 47 | 
            +
                           "Exit status is #{exit_status}, output is [#{out}]")
         | 
| 48 | 
            +
                    end
         | 
| 49 | 
            +
                  end
         | 
| 50 | 
            +
                end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                def existing_violations
         | 
| 53 | 
            +
                  if @count_file.exist?(@filename)
         | 
| 54 | 
            +
                    @count_io.read(@filename).to_i
         | 
| 55 | 
            +
                  else
         | 
| 56 | 
            +
                    9_999_999_999
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                def ratchet_violations
         | 
| 61 | 
            +
                  existing = existing_violations
         | 
| 62 | 
            +
                  report_violations(existing)
         | 
| 63 | 
            +
                  if @violations > existing
         | 
| 64 | 
            +
                    fail("Output from #{@cmd}\n\n#{@command_output}\n\n" +
         | 
| 65 | 
            +
                         "Reduce total number of #{@cmd} violations " +
         | 
| 66 | 
            +
                         "to #{existing} or below!")
         | 
| 67 | 
            +
                  elsif @violations < existing
         | 
| 68 | 
            +
                    puts 'Ratcheting quality up...'
         | 
| 69 | 
            +
                    write_violations(@violations)
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                def report_violations(existing)
         | 
| 74 | 
            +
                  puts "Existing violations: #{existing}"
         | 
| 75 | 
            +
                  puts "Found #{@violations} #{@cmd} violations"
         | 
| 76 | 
            +
                end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                private
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                def full_cmd
         | 
| 81 | 
            +
                  args = @command_options[:args]
         | 
| 82 | 
            +
                  args ||= ''
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                  @found_output = false
         | 
| 85 | 
            +
                  if args.size > 0
         | 
| 86 | 
            +
                    "#{get_cmd_with_ruby_hack_prefix} #{args}"
         | 
| 87 | 
            +
                  else
         | 
| 88 | 
            +
                    "#{get_cmd_with_ruby_hack_prefix}"
         | 
| 89 | 
            +
                  end
         | 
| 90 | 
            +
                end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                def get_cmd_with_ruby_hack_prefix
         | 
| 93 | 
            +
                  if defined?(RUBY_ENGINE) && (RUBY_ENGINE == 'jruby')
         | 
| 94 | 
            +
                    "jruby -S #{@cmd}"
         | 
| 95 | 
            +
                  elsif RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
         | 
| 96 | 
            +
                    "#{@cmd}.bat"
         | 
| 97 | 
            +
                  else
         | 
| 98 | 
            +
                    @cmd
         | 
| 99 | 
            +
                  end
         | 
| 100 | 
            +
                end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                def write_violations(new_violations)
         | 
| 103 | 
            +
                  @count_file.open(@filename, 'w') do |file|
         | 
| 104 | 
            +
                    file.write(new_violations.to_s)
         | 
| 105 | 
            +
                  end
         | 
| 106 | 
            +
                end
         | 
| 107 | 
            +
              end
         | 
| 108 | 
            +
            end
         | 
    
        data/lib/quality/rake/task.rb
    CHANGED
    
    | @@ -3,13 +3,12 @@ | |
| 3 3 | 
             
            require 'rake'
         | 
| 4 4 | 
             
            require 'rake/tasklib'
         | 
| 5 5 | 
             
            require 'rbconfig'
         | 
| 6 | 
            +
            require_relative '../quality_checker'
         | 
| 6 7 |  | 
| 7 8 | 
             
            module Quality
         | 
| 8 9 |  | 
| 9 10 | 
             
              #
         | 
| 10 11 | 
             
              # Defines a task library for running quality's various tools
         | 
| 11 | 
            -
              # (Classes here will be configured via the Rakefile, and therefore will
         | 
| 12 | 
            -
              # possess a :reek:attribute or two.)
         | 
| 13 12 | 
             
              #
         | 
| 14 13 | 
             
              module Rake
         | 
| 15 14 |  | 
| @@ -26,7 +25,6 @@ module Quality | |
| 26 25 | 
             
                # This will create a task that can be run with:
         | 
| 27 26 | 
             
                #
         | 
| 28 27 | 
             
                #   rake quality
         | 
| 29 | 
            -
                #
         | 
| 30 28 | 
             
                class Task < ::Rake::TaskLib
         | 
| 31 29 |  | 
| 32 30 | 
             
                  # Name of quality task.
         | 
| @@ -62,14 +60,11 @@ module Quality | |
| 62 60 |  | 
| 63 61 | 
             
                    # allow unit tests to override the class that Rake DSL
         | 
| 64 62 | 
             
                    # messages are sent to.
         | 
| 65 | 
            -
                    @dsl = args[:dsl]
         | 
| 63 | 
            +
                    @dsl = args[:dsl] || ::Rake::Task
         | 
| 66 64 |  | 
| 67 65 | 
             
                    # likewise, but for system()
         | 
| 68 66 | 
             
                    @cmd_runner = args[:cmd_runner] || Kernel
         | 
| 69 67 |  | 
| 70 | 
            -
                    # likewise, but for IO.popen()
         | 
| 71 | 
            -
                    @popener = args[:popener] || IO
         | 
| 72 | 
            -
             | 
| 73 68 | 
             
                    # likewise, but for File.open() on the count files
         | 
| 74 69 | 
             
                    @count_file = args[:count_file] || File
         | 
| 75 70 |  | 
| @@ -79,149 +74,110 @@ module Quality | |
| 79 74 | 
             
                    # likewise, but for Dir.glob() on target Ruby files
         | 
| 80 75 | 
             
                    @globber = args[:globber] || Dir
         | 
| 81 76 |  | 
| 77 | 
            +
                    # likewise, but for checking whether a gem is installed
         | 
| 78 | 
            +
                    @gem_spec = args[:gem_spec] || Gem::Specification
         | 
| 79 | 
            +
             | 
| 82 80 | 
             
                    # uses exist?() and open() to write out configuration files
         | 
| 83 81 | 
             
                    # for tools if needed (e.g., .cane file)
         | 
| 84 82 | 
             
                    @configuration_writer = args[:configuration_writer] || File
         | 
| 85 83 |  | 
| 86 | 
            -
                     | 
| 87 | 
            -
                    @ | 
| 88 | 
            -
             | 
| 89 | 
            -
             | 
| 90 | 
            -
                    @ | 
| 91 | 
            -
             | 
| 92 | 
            -
                    @ | 
| 84 | 
            +
                    # Class which actually runs the quality check commands
         | 
| 85 | 
            +
                    @quality_checker_class =
         | 
| 86 | 
            +
                      args[:quality_checker_class] || Quality::QualityChecker
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                    @skip_tools = []
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                    @output_dir = '.'
         | 
| 93 91 |  | 
| 94 92 | 
             
                    yield self if block_given?
         | 
| 95 | 
            -
             | 
| 96 | 
            -
                    @source_files ||= 'lib/**/*.rb'
         | 
| 97 | 
            -
                    @output_dir   ||= "."
         | 
| 93 | 
            +
             | 
| 98 94 | 
             
                    define
         | 
| 99 95 | 
             
                  end
         | 
| 100 96 |  | 
| 101 | 
            -
             | 
| 97 | 
            +
                  private
         | 
| 102 98 |  | 
| 103 99 | 
             
                  def define # :nodoc:
         | 
| 104 100 | 
             
                    desc 'Verify quality has increased or stayed ' +
         | 
| 105 101 | 
             
                      'the same' unless ::Rake.application.last_comment
         | 
| 106 | 
            -
                     | 
| 107 | 
            -
             | 
| 108 | 
            -
                      task(ratchet_name) { run_ratchet }
         | 
| 109 | 
            -
                    else
         | 
| 110 | 
            -
                      @dsl.task(quality_name) { run_quality }
         | 
| 111 | 
            -
                      @dsl.task(ratchet_name) { run_ratchet }
         | 
| 112 | 
            -
                    end
         | 
| 102 | 
            +
                    @dsl.define_task(quality_name) { run_quality }
         | 
| 103 | 
            +
                    @dsl.define_task(ratchet_name) { run_ratchet }
         | 
| 113 104 | 
             
                  end
         | 
| 114 105 |  | 
| 115 106 | 
             
                  def run_quality
         | 
| 116 107 | 
             
                    tools = ['cane', 'flog', 'flay', 'reek', 'rubocop']
         | 
| 117 108 | 
             
                    tools.each do |tool|
         | 
| 118 | 
            -
                       | 
| 119 | 
            -
             | 
| 109 | 
            +
                      run_quality_with_tool(tool)
         | 
| 110 | 
            +
                    end
         | 
| 111 | 
            +
                  end
         | 
| 120 112 |  | 
| 121 | 
            -
             | 
| 122 | 
            -
             | 
| 123 | 
            -
             | 
| 124 | 
            -
             | 
| 125 | 
            -
             | 
| 126 | 
            -
             | 
| 127 | 
            -
             | 
| 113 | 
            +
                  def run_quality_with_tool(tool)
         | 
| 114 | 
            +
                    installed = @gem_spec.find_all_by_name(tool).any?
         | 
| 115 | 
            +
                    suppressed = @skip_tools.include? tool
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                    if !installed
         | 
| 118 | 
            +
                      puts "#{tool} not installed"
         | 
| 119 | 
            +
                    elsif suppressed
         | 
| 120 | 
            +
                      puts "Suppressing use of #{tool}"
         | 
| 121 | 
            +
                    else
         | 
| 122 | 
            +
                      method("quality_#{tool}".to_sym).call
         | 
| 128 123 | 
             
                    end
         | 
| 129 124 | 
             
                  end
         | 
| 130 125 |  | 
| 131 126 | 
             
                  def run_ratchet
         | 
| 132 | 
            -
                    @globber.glob( | 
| 133 | 
            -
                       | 
| 134 | 
            -
             | 
| 135 | 
            -
                      if existing_violations < 0
         | 
| 136 | 
            -
                        raise "Problem with file #{filename}"
         | 
| 137 | 
            -
                      end
         | 
| 138 | 
            -
                      new_violations = [0, existing_violations - 1].max
         | 
| 139 | 
            -
                      @count_file.open(filename, 'w') {|f| f.write(new_violations.to_s) }
         | 
| 140 | 
            -
                      if new_violations != existing_violations
         | 
| 141 | 
            -
                        @cmd_runner.system("git commit -m 'tighten quality standard' #{filename}")
         | 
| 142 | 
            -
                      end
         | 
| 143 | 
            -
                    }
         | 
| 127 | 
            +
                    @globber.glob('*_high_water_mark').each do |filename|
         | 
| 128 | 
            +
                      run_ratchet_on_file(filename)
         | 
| 129 | 
            +
                    end
         | 
| 144 130 | 
             
                  end
         | 
| 145 131 |  | 
| 146 | 
            -
                  def  | 
| 147 | 
            -
             | 
| 148 | 
            -
             | 
| 149 | 
            -
             | 
| 150 | 
            -
                     | 
| 151 | 
            -
             | 
| 152 | 
            -
             | 
| 153 | 
            -
                    emacs_format ||= options[:emacs_format]
         | 
| 132 | 
            +
                  def run_ratchet_on_file(filename)
         | 
| 133 | 
            +
                    puts "Processing #{filename}"
         | 
| 134 | 
            +
                    existing_violations = count_existing_violations(filename)
         | 
| 135 | 
            +
                    new_violations = [0, existing_violations - 1].max
         | 
| 136 | 
            +
                    write_violations(filename, new_violations)
         | 
| 137 | 
            +
                    tighten_standard(filename) if new_violations != existing_violations
         | 
| 138 | 
            +
                  end
         | 
| 154 139 |  | 
| 155 | 
            -
             | 
| 156 | 
            -
                     | 
| 157 | 
            -
             | 
| 158 | 
            -
                    if defined?(RUBY_ENGINE) && (RUBY_ENGINE == 'jruby')
         | 
| 159 | 
            -
                      full_cmd = "jruby -S #{cmd}"
         | 
| 160 | 
            -
                    elsif RbConfig::CONFIG['host_os'] =~ /mswin|mingw/
         | 
| 161 | 
            -
                      full_cmd = "#{cmd}.bat"
         | 
| 162 | 
            -
                    else
         | 
| 163 | 
            -
                      full_cmd = cmd
         | 
| 140 | 
            +
                  def write_violations(filename, new_violations)
         | 
| 141 | 
            +
                    @count_file.open(filename, 'w') do |file|
         | 
| 142 | 
            +
                      file.write(new_violations.to_s)
         | 
| 164 143 | 
             
                    end
         | 
| 144 | 
            +
                  end
         | 
| 165 145 |  | 
| 166 | 
            -
             | 
| 167 | 
            -
             | 
| 168 | 
            -
                     | 
| 146 | 
            +
                  def count_existing_violations(filename)
         | 
| 147 | 
            +
                    existing_violations = @count_io.read(filename).to_i
         | 
| 148 | 
            +
                    fail("Problem with file #{filename}") if existing_violations < 0
         | 
| 149 | 
            +
                    existing_violations
         | 
| 150 | 
            +
                  end
         | 
| 169 151 |  | 
| 170 | 
            -
             | 
| 171 | 
            -
             | 
| 172 | 
            -
             | 
| 173 | 
            -
             | 
| 174 | 
            -
             | 
| 175 | 
            -
             | 
| 176 | 
            -
             | 
| 177 | 
            -
             | 
| 178 | 
            -
             | 
| 179 | 
            -
             | 
| 180 | 
            -
             | 
| 181 | 
            -
             | 
| 182 | 
            -
                        end
         | 
| 183 | 
            -
                        found_output = true
         | 
| 184 | 
            -
                        violations += yield line
         | 
| 185 | 
            -
                      end
         | 
| 186 | 
            -
                    end
         | 
| 187 | 
            -
                    exit_status = $?.exitstatus
         | 
| 188 | 
            -
                    if !gives_error_code_on_violations
         | 
| 189 | 
            -
                      if exit_status != 0
         | 
| 190 | 
            -
                        fail "Error detected running #{full_cmd}.  Exit status is #{exit_status}, output is [#{out}]"
         | 
| 191 | 
            -
                      end
         | 
| 192 | 
            -
                    end
         | 
| 193 | 
            -
                    filename = File.join(@output_dir, "#{cmd}_high_water_mark")
         | 
| 194 | 
            -
                    if @count_file.exist?(filename)
         | 
| 195 | 
            -
                      existing_violations = @count_io.read(filename).to_i
         | 
| 196 | 
            -
                    else
         | 
| 197 | 
            -
                      existing_violations = 9999999999
         | 
| 198 | 
            -
                    end
         | 
| 199 | 
            -
                    puts "Existing violations: #{existing_violations}"
         | 
| 200 | 
            -
                    puts "Found #{violations} #{cmd} violations"
         | 
| 201 | 
            -
                    if violations > existing_violations
         | 
| 202 | 
            -
                      fail "Output from #{cmd}\n\n#{out}\n\n" +
         | 
| 203 | 
            -
                        "Reduce total number of #{cmd} violations to #{existing_violations} or below!"
         | 
| 204 | 
            -
                    elsif violations < existing_violations
         | 
| 205 | 
            -
                      puts "Ratcheting quality up..."
         | 
| 206 | 
            -
                      @count_file.open(filename, 'w') do |f|
         | 
| 207 | 
            -
                        f.write(violations.to_s)
         | 
| 208 | 
            -
                      end
         | 
| 209 | 
            -
                    end
         | 
| 152 | 
            +
                  def tighten_standard(filename)
         | 
| 153 | 
            +
                    @cmd_runner
         | 
| 154 | 
            +
                      .system("git commit -m 'tighten quality standard' #{filename}")
         | 
| 155 | 
            +
                  end
         | 
| 156 | 
            +
             | 
| 157 | 
            +
                  def ratchet_quality_cmd(cmd,
         | 
| 158 | 
            +
                                          command_options,
         | 
| 159 | 
            +
                                          &count_violations_on_line)
         | 
| 160 | 
            +
                    quality_checker = @quality_checker_class.new(cmd,
         | 
| 161 | 
            +
                                                                 command_options,
         | 
| 162 | 
            +
                                                                 @output_dir)
         | 
| 163 | 
            +
                    quality_checker.execute(&count_violations_on_line)
         | 
| 210 164 | 
             
                  end
         | 
| 211 165 |  | 
| 212 166 | 
             
                  def quality_cane
         | 
| 213 | 
            -
                     | 
| 214 | 
            -
                      @configuration_writer.open( | 
| 167 | 
            +
                    unless @configuration_writer.exist?('.cane')
         | 
| 168 | 
            +
                      @configuration_writer.open('.cane', 'w') do |file|
         | 
| 169 | 
            +
                        file.write('-f **/*.rb')
         | 
| 170 | 
            +
                      end
         | 
| 215 171 | 
             
                    end
         | 
| 216 | 
            -
                    ratchet_quality_cmd( | 
| 172 | 
            +
                    ratchet_quality_cmd('cane',
         | 
| 217 173 | 
             
                                        gives_error_code_on_violations: true,
         | 
| 218 | 
            -
                                        emacs_format: true)  | 
| 174 | 
            +
                                        emacs_format: true) do |line|
         | 
| 219 175 | 
             
                      if line =~ /\(([0-9]*)\):$/
         | 
| 220 176 | 
             
                        $1.to_i
         | 
| 221 177 | 
             
                      else
         | 
| 222 178 | 
             
                        0
         | 
| 223 179 | 
             
                      end
         | 
| 224 | 
            -
                     | 
| 180 | 
            +
                    end
         | 
| 225 181 | 
             
                  end
         | 
| 226 182 |  | 
| 227 183 | 
             
                  def ruby_dirs
         | 
| @@ -229,68 +185,79 @@ module Quality | |
| 229 185 | 
             
                  end
         | 
| 230 186 |  | 
| 231 187 | 
             
                  def ruby_files
         | 
| 232 | 
            -
                    @globber.glob('*.rb') | 
| 188 | 
            +
                    @globber.glob('*.rb')
         | 
| 189 | 
            +
                      .concat(@globber.glob(File.join("{#{ruby_dirs.join(',')}}",
         | 
| 190 | 
            +
                                                      '**', '*.rb'))).join(' ')
         | 
| 233 191 | 
             
                  end
         | 
| 234 192 |  | 
| 235 193 | 
             
                  def quality_reek
         | 
| 236 | 
            -
                    args = "--line | 
| 237 | 
            -
                    ratchet_quality_cmd( | 
| 194 | 
            +
                    args = "--single-line #{ruby_files}"
         | 
| 195 | 
            +
                    ratchet_quality_cmd('reek',
         | 
| 238 196 | 
             
                                        args: args,
         | 
| 239 197 | 
             
                                        emacs_format: true,
         | 
| 240 | 
            -
                                        gives_error_code_on_violations: true)  | 
| 241 | 
            -
                       | 
| 242 | 
            -
             | 
| 243 | 
            -
             | 
| 244 | 
            -
             | 
| 245 | 
            -
             | 
| 246 | 
            -
                     | 
| 198 | 
            +
                                        gives_error_code_on_violations: true) do |line|
         | 
| 199 | 
            +
                      self.class.count_reek_violations(line)
         | 
| 200 | 
            +
                    end
         | 
| 201 | 
            +
                  end
         | 
| 202 | 
            +
             | 
| 203 | 
            +
                  def self.count_reek_violations(line)
         | 
| 204 | 
            +
                    if line =~ /^  .* (.*)$/
         | 
| 205 | 
            +
                      1
         | 
| 206 | 
            +
                    else
         | 
| 207 | 
            +
                      0
         | 
| 208 | 
            +
                    end
         | 
| 247 209 | 
             
                  end
         | 
| 248 210 |  | 
| 249 211 | 
             
                  def quality_flog
         | 
| 250 | 
            -
                     | 
| 251 | 
            -
             | 
| 252 | 
            -
             | 
| 253 | 
            -
             | 
| 254 | 
            -
             | 
| 255 | 
            -
             | 
| 256 | 
            -
             | 
| 257 | 
            -
             | 
| 258 | 
            -
             | 
| 259 | 
            -
             | 
| 260 | 
            -
             | 
| 261 | 
            -
             | 
| 262 | 
            -
             | 
| 263 | 
            -
                         | 
| 212 | 
            +
                    ratchet_quality_cmd('flog',
         | 
| 213 | 
            +
                                   args: "--all --continue --methods-only #{ruby_files}",
         | 
| 214 | 
            +
                                   emacs_format: true) do |line|
         | 
| 215 | 
            +
                      self.class.count_violations_in_flog_output(line)
         | 
| 216 | 
            +
                    end
         | 
| 217 | 
            +
                  end
         | 
| 218 | 
            +
             | 
| 219 | 
            +
                  def self.count_violations_in_flog_output(line, threshold = 50)
         | 
| 220 | 
            +
                    if line =~ /^ *([0-9.]*): flog total$/
         | 
| 221 | 
            +
                      0
         | 
| 222 | 
            +
                    elsif line =~ /^ *([0-9.]*): (.*) .*.rb:[0-9]*$/
         | 
| 223 | 
            +
                      score = $1.to_i
         | 
| 224 | 
            +
                      if score > threshold
         | 
| 225 | 
            +
                        1
         | 
| 264 226 | 
             
                      else
         | 
| 265 227 | 
             
                        0
         | 
| 266 228 | 
             
                      end
         | 
| 267 | 
            -
                     | 
| 229 | 
            +
                    else
         | 
| 230 | 
            +
                      0
         | 
| 231 | 
            +
                    end
         | 
| 268 232 | 
             
                  end
         | 
| 269 233 |  | 
| 270 234 | 
             
                  def quality_flay
         | 
| 271 | 
            -
                    ratchet_quality_cmd( | 
| 235 | 
            +
                    ratchet_quality_cmd('flay',
         | 
| 272 236 | 
             
                                        args: "-m 75 -t 99999 #{ruby_files}",
         | 
| 273 | 
            -
                                        emacs_format: true)  | 
| 237 | 
            +
                                        emacs_format: true) do |line|
         | 
| 274 238 | 
             
                      if line =~ /^[0-9]*\).* \(mass = ([0-9]*)\)$/
         | 
| 275 239 | 
             
                        $1.to_i
         | 
| 276 240 | 
             
                      else
         | 
| 277 241 | 
             
                        0
         | 
| 278 242 | 
             
                      end
         | 
| 279 | 
            -
                     | 
| 243 | 
            +
                    end
         | 
| 280 244 | 
             
                  end
         | 
| 281 245 |  | 
| 282 246 | 
             
                  def quality_rubocop
         | 
| 283 | 
            -
                    ratchet_quality_cmd( | 
| 247 | 
            +
                    ratchet_quality_cmd('rubocop',
         | 
| 284 248 | 
             
                                        gives_error_code_on_violations: true,
         | 
| 285 | 
            -
                                        args: "--format emacs #{ruby_files}")  | 
| 286 | 
            -
                       | 
| 287 | 
            -
             | 
| 288 | 
            -
                      else
         | 
| 289 | 
            -
                        1
         | 
| 290 | 
            -
                      end
         | 
| 291 | 
            -
                    }
         | 
| 249 | 
            +
                                        args: "--format emacs #{ruby_files}") do |line|
         | 
| 250 | 
            +
                      self.class.count_rubocop_violations(line)
         | 
| 251 | 
            +
                    end
         | 
| 292 252 | 
             
                  end
         | 
| 293 253 |  | 
| 254 | 
            +
                  def self.count_rubocop_violations(line)
         | 
| 255 | 
            +
                    if line =~ /^.* file[s|] inspected, (.*) offence[s|] detected$/
         | 
| 256 | 
            +
                      0
         | 
| 257 | 
            +
                    else
         | 
| 258 | 
            +
                      1
         | 
| 259 | 
            +
                    end
         | 
| 260 | 
            +
                  end
         | 
| 294 261 | 
             
                end
         | 
| 295 262 | 
             
              end
         | 
| 296 263 | 
             
            end
         | 
    
        data/lib/quality/version.rb
    CHANGED
    
    
    
        data/quality.gemspec
    CHANGED
    
    | @@ -29,7 +29,7 @@ your numbers don't get any worse over time. | |
| 29 29 | 
             
              s.summary = %q{Code quality tools for Ruby}
         | 
| 30 30 |  | 
| 31 31 | 
             
              s.add_runtime_dependency(%q<cane>, [">= 2.6"])
         | 
| 32 | 
            -
              s.add_runtime_dependency(%q<reek>, [">= 1.3. | 
| 32 | 
            +
              s.add_runtime_dependency(%q<reek>, [">= 1.3.4"])
         | 
| 33 33 | 
             
              s.add_runtime_dependency(%q<flog>, [">= 4.1.1"])
         | 
| 34 34 | 
             
              s.add_runtime_dependency(%q<flay>, [">= 2.4"])
         | 
| 35 35 | 
             
              s.add_runtime_dependency(%q<rubocop>)
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: quality
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.1.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Vince Broz
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2013-10- | 
| 11 | 
            +
            date: 2013-10-14 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: cane
         | 
| @@ -30,14 +30,14 @@ dependencies: | |
| 30 30 | 
             
                requirements:
         | 
| 31 31 | 
             
                - - '>='
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            -
                    version: 1.3. | 
| 33 | 
            +
                    version: 1.3.4
         | 
| 34 34 | 
             
              type: :runtime
         | 
| 35 35 | 
             
              prerelease: false
         | 
| 36 36 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 37 | 
             
                requirements:
         | 
| 38 38 | 
             
                - - '>='
         | 
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            -
                    version: 1.3. | 
| 40 | 
            +
                    version: 1.3.4
         | 
| 41 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 42 | 
             
              name: flog
         | 
| 43 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -190,6 +190,8 @@ files: | |
| 190 190 | 
             
            - License.txt
         | 
| 191 191 | 
             
            - README.md
         | 
| 192 192 | 
             
            - Rakefile
         | 
| 193 | 
            +
            - lib/quality/command_output_processor.rb
         | 
| 194 | 
            +
            - lib/quality/quality_checker.rb
         | 
| 193 195 | 
             
            - lib/quality/rake/task.rb
         | 
| 194 196 | 
             
            - lib/quality/version.rb
         | 
| 195 197 | 
             
            - quality.gemspec
         |