class VcrBetterBinary::Serializer

Constants

BIN_KEY

Attributes

base_serializer[R]

Public Class Methods

new(base_serializer: VCR::Cassette::Serializers::YAML) click to toggle source
# File lib/vcr_better_binary/serializer.rb, line 10
def initialize(base_serializer: VCR::Cassette::Serializers::YAML)
  @base_serializer = base_serializer
end

Public Instance Methods

deserialize(string) click to toggle source
# File lib/vcr_better_binary/serializer.rb, line 26
def deserialize(string)
  data = base_serializer.deserialize(string)

  yield_http_bodies(data) do |body|
    restore_binary_body_data(body)
  end

  data
end
file_extension() click to toggle source
# File lib/vcr_better_binary/serializer.rb, line 14
def file_extension
  base_serializer.file_extension
end
prune_bin_data() click to toggle source
# File lib/vcr_better_binary/serializer.rb, line 36
def prune_bin_data
  Pruner.new.prune_bin_data(
    bin_data_dir: bin_data_dir,
    cassette_http_bodies: all_cassette_http_bodies
  )
end
serialize(data) click to toggle source
# File lib/vcr_better_binary/serializer.rb, line 18
def serialize(data)
  yield_http_bodies(data) do |body|
    stash_binary_body_data(body)
  end

  base_serializer.serialize(data)
end

Private Instance Methods

all_cassette_http_bodies() click to toggle source
# File lib/vcr_better_binary/serializer.rb, line 101
def all_cassette_http_bodies
  Enumerator::Lazy.new(cassette_paths) do |yielder, cassette_path|
    data = base_serializer.deserialize(File.read(cassette_path))

    yield_http_bodies(data) do |body|
      yielder << body
    end
  end
end
bin_data_dir() click to toggle source
# File lib/vcr_better_binary/serializer.rb, line 79
def bin_data_dir
  File.expand_path("bin_data", cassette_dir).tap do |dir|
    FileUtils.mkdir_p(dir)
  end
end
cassette_dir() click to toggle source
# File lib/vcr_better_binary/serializer.rb, line 89
def cassette_dir
  VCR.configuration.cassette_library_dir
end
cassette_paths() click to toggle source
# File lib/vcr_better_binary/serializer.rb, line 111
def cassette_paths
  Dir.glob(File.expand_path("*.#{file_extension}", cassette_dir))
end
filename_safe_digest(content) click to toggle source
# File lib/vcr_better_binary/serializer.rb, line 85
def filename_safe_digest(content)
  Digest::SHA256.bubblebabble(content)
end
read_binary_data(path) click to toggle source
# File lib/vcr_better_binary/serializer.rb, line 93
def read_binary_data(path)
  File.open(path, "rb") { |file| file.read }
end
restore_binary_body_data(body) click to toggle source
# File lib/vcr_better_binary/serializer.rb, line 71
def restore_binary_body_data(body)
  return unless body.key?(BIN_KEY)

  bin_storage_path = File.expand_path(body[BIN_KEY], bin_data_dir)
  body["string"] = read_binary_data(bin_storage_path)
  body.delete(BIN_KEY)
end
stash_binary_body_data(body) click to toggle source
# File lib/vcr_better_binary/serializer.rb, line 57
def stash_binary_body_data(body)
  return unless body["encoding"] == Encoding::BINARY.name
  return if body["string"].nil? || body["string"].empty?

  bin_key = filename_safe_digest(body["string"])
  bin_storage_path = File.expand_path(bin_key, bin_data_dir)

  write_binary_data(bin_storage_path, body["string"])
  body[BIN_KEY] = bin_key
  body.delete("string")

  bin_key
end
write_binary_data(path, data) click to toggle source
# File lib/vcr_better_binary/serializer.rb, line 97
def write_binary_data(path, data)
  File.open(path, "wb") { |file| file.write(data) }
end
yield_http_bodies(data) { |request_body| ... } click to toggle source
# File lib/vcr_better_binary/serializer.rb, line 47
def yield_http_bodies(data)
  data.fetch("http_interactions").each do |interaction|
    request_body = interaction.dig("request", "body")
    yield(request_body) unless request_body.nil?

    response_body = interaction.dig("response", "body")
    yield(response_body) unless response_body.nil?
  end
end