class RuboCop::CachedData

Converts RuboCop objects to and from the serialization format JSON. @api private

Public Class Methods

new(filename) click to toggle source
# File lib/rubocop/cached_data.rb, line 9
def initialize(filename)
  @filename = filename
end

Public Instance Methods

from_json(text) click to toggle source
# File lib/rubocop/cached_data.rb, line 13
def from_json(text)
  deserialize_offenses(JSON.parse(text))
end
to_json(offenses) click to toggle source
# File lib/rubocop/cached_data.rb, line 17
def to_json(offenses)
  JSON.dump(offenses.map { |o| serialize_offense(o) })
end

Private Instance Methods

deserialize_offenses(offenses) click to toggle source

Restore an offense object loaded from a JSON file.

# File lib/rubocop/cached_data.rb, line 47
def deserialize_offenses(offenses)
  offenses.map! do |o|
    location = location_from_source_buffer(o)
    Cop::Offense.new(o['severity'], location, o['message'], o['cop_name'], o['status'].to_sym)
  end
end
location_from_source_buffer(offense) click to toggle source
# File lib/rubocop/cached_data.rb, line 54
def location_from_source_buffer(offense)
  begin_pos = offense['location']['begin_pos']
  end_pos = offense['location']['end_pos']
  if begin_pos.zero? && end_pos.zero?
    Cop::Offense::NO_LOCATION
  else
    Parser::Source::Range.new(source_buffer, begin_pos, end_pos)
  end
end
message(offense) click to toggle source
# File lib/rubocop/cached_data.rb, line 40
def message(offense)
  # JSON.dump will fail if the offense message contains text which is not
  # valid UTF-8
  offense.message.dup.force_encoding(::Encoding::UTF_8).scrub
end
serialize_offense(offense) click to toggle source
# File lib/rubocop/cached_data.rb, line 23
def serialize_offense(offense)
  status = :uncorrected if %i[corrected corrected_with_todo].include?(offense.status)
  {
    # Calling #to_s here ensures that the serialization works when using
    # other json serializers such as Oj. Some of these gems do not call
    # #to_s implicitly.
    severity: offense.severity.to_s,
    location: {
      begin_pos: offense.location.begin_pos,
      end_pos: offense.location.end_pos
    },
    message:  message(offense),
    cop_name: offense.cop_name,
    status:   status || offense.status
  }
end
source_buffer() click to toggle source

Delay creation until needed. Some type of offenses will have no buffer associated with them and be global only. For these, trying to create the buffer will likely fail, for example because of unknown encoding comments.

# File lib/rubocop/cached_data.rb, line 67
def source_buffer
  @source_buffer ||= begin
    source = File.read(@filename, encoding: Encoding::UTF_8)
    Parser::Source::Buffer.new(@filename, source: source)
  end
end