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