Sha256: ca5e8636ae6cfd21b3e5210523aade2a4f363e27497e82d2f063eff40a12a6a2

Contents?: true

Size: 1.98 KB

Versions: 105

Compression:

Stored size: 1.98 KB

Contents

module CC
  module Analyzer
    class SourceExtractor
      InvalidLocation = Class.new(StandardError)

      def initialize(source)
        @source = source
      end

      def extract(location)
        validate_location(location)

        if (lines = location["lines"])
          extract_from_lines(lines)
        elsif (positions = location["positions"])
          extract_from_positions(positions)
        end
      end

      private

      attr_reader :source

      def validate_location(location)
        validator = IssueValidations::LocationFormatValidation::Validator.new(location)
        unless validator.valid?
          raise InvalidLocation, validator.message
        end
      end

      def extract_from_lines(lines)
        begin_index = lines.fetch("begin") - 1
        end_index = lines.fetch("end") - 1
        range = (begin_index..end_index)

        source.each_line.with_object("").with_index do |(source_line, memo), index|
          memo << source_line if range.include?(index)
        end
      end

      def extract_from_positions(positions)
        positions = convert_to_offsets(positions)
        begin_offset = positions.fetch("begin").fetch("offset")
        end_offset = positions.fetch("end").fetch("offset")
        length = end_offset - begin_offset

        source[begin_offset, length + 1]
      end

      def convert_to_offsets(positions)
        positions.each_with_object({}) do |(key, value), memo|
          memo[key] =
            if value.key?("offset")
              value
            else
              {
                "offset" => to_offset(value["line"] - 1, value["column"] - 1),
              }
            end
        end
      end

      def to_offset(line, column, offset = 0)
        source.each_line.with_index do |source_line, index|
          offset +=
            if line == index
              column
            else
              source_line.length
            end

          break if index >= line
        end

        offset
      end
    end
  end
end

Version data entries

105 entries across 105 versions & 2 rubygems

Version Path
codeclimate-0.78.0 lib/cc/analyzer/source_extractor.rb
codeclimate-0.77.0 lib/cc/analyzer/source_extractor.rb
codeclimate-0.76.0 lib/cc/analyzer/source_extractor.rb
codeclimate-0.75.0 lib/cc/analyzer/source_extractor.rb
codeclimate-0.74.0 lib/cc/analyzer/source_extractor.rb
codeclimate-0.73.0 lib/cc/analyzer/source_extractor.rb
codeclimate-0.72.0 lib/cc/analyzer/source_extractor.rb
codeclimate-0.71.2 lib/cc/analyzer/source_extractor.rb
codeclimate-0.71.1 lib/cc/analyzer/source_extractor.rb
codeclimate-0.71.0 lib/cc/analyzer/source_extractor.rb
codeclimate-0.70.6 lib/cc/analyzer/source_extractor.rb
codeclimate-0.70.5 lib/cc/analyzer/source_extractor.rb
codeclimate-0.70.4 lib/cc/analyzer/source_extractor.rb
codeclimate-0.70.3 lib/cc/analyzer/source_extractor.rb
codeclimate-0.70.2 lib/cc/analyzer/source_extractor.rb
codeclimate-0.70.1 lib/cc/analyzer/source_extractor.rb
codeclimate-0.70.0 lib/cc/analyzer/source_extractor.rb
codeclimate-0.69.0 lib/cc/analyzer/source_extractor.rb
codeclimate-0.68.0 lib/cc/analyzer/source_extractor.rb
codeclimate-0.67.0 lib/cc/analyzer/source_extractor.rb