Sha256: b91afff7e069881a389bbbaa2e3a320b3ac2c1ecf898be2da0ec4ead4d3e16e2

Contents?: true

Size: 1.84 KB

Versions: 7

Compression:

Stored size: 1.84 KB

Contents

module RepoAnalyzer
  class RubocopExtractor < ProjectInfoExtractor
    private

    def extracted_info
      { offenses: grouped_offenses_by_severit_and_cop }
    end

    def grouped_offenses_by_severit_and_cop
      result = {}

      grouped_offenses_by_severity.each do |severity, offenses|
        result[severity] = offenses.group_by do |offense|
          offense.delete(:severity)
          offense.delete(:cop)
        end
      end

      result
    end

    def grouped_offenses_by_severity
      offenses.group_by do |offense|
        offense[:severity]
      end
    end

    def offenses
      rubocop_json["files"].inject([]) do |memo, file_data|
        file_data["offenses"].each do |offense|
          memo << {
            path: offense_file_name(file_data["path"], offense),
            cop: offense["cop_name"],
            message: get_message(offense["message"]),
            severity: offense["severity"]
          }
        end
        memo
      end
    end

    def get_message(message)
      parts = message.to_s.split(": ")
      return parts.first if parts.size == 1

      parts.shift
      parts.join(": ")
    end

    def offense_file_name(file_path, offense)
      [
        file_path.gsub(%r{\A\D*#{project_data_bridge.project_path}/}, ""),
        offense['location']['line'].to_s,
        offense['location']['column'].to_s
      ].join(':')
    end

    def rubocop_json
      options, paths = RuboCop::Options.new.parse(
        [
          "--format", "json",
          "--config", Rails.root.join(".rubocop.yml").to_s,
          project_data_bridge.project_path
        ]
      )

      runner = RuboCop::Runner.new(options, RuboCop::ConfigStore.new)
      rubocop_result_content = OutputUtils.with_captured_stdout { runner.run(paths) }
      JSON.parse(rubocop_result_content)
    rescue RuboCop::Error
      { "files" => [] }
    end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
repo_analyzer-1.6.0 app/extractors/repo_analyzer/rubocop_extractor.rb
repo_analyzer-1.5.0 app/extractors/repo_analyzer/rubocop_extractor.rb
repo_analyzer-1.4.0 app/extractors/repo_analyzer/rubocop_extractor.rb
repo_analyzer-1.3.0 app/extractors/repo_analyzer/rubocop_extractor.rb
repo_analyzer-1.2.0 app/extractors/repo_analyzer/rubocop_extractor.rb
repo_analyzer-1.1.0 app/extractors/repo_analyzer/rubocop_extractor.rb
repo_analyzer-1.0.0 app/extractors/repo_analyzer/rubocop_extractor.rb