Packages
exvcr
0.10.0
0.17.1
0.17.0
0.16.0
0.15.2
0.15.1
0.15.0
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.3
0.12.2
0.12.1
0.12.0
0.11.2
0.11.1
0.11.0
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.1
0.9.0
0.8.12
0.8.11
0.8.10
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.7
0.1.6
0.1.5
HTTP request/response recording library for elixir, inspired by VCR.
Current section
Files
Jump to
Current section
Files
lib/exvcr/json.ex
defmodule ExVCR.JSON do
@moduledoc """
Provides a feature to store/load cassettes in json format.
"""
@doc """
Save responses into the json file.
"""
def save(file_name, recordings) do
json = recordings
|> Enum.map(&encode_binary_data/1)
|> Enum.reverse()
|> JSX.encode!()
|> JSX.prettify!()
unless File.exists?(path = Path.dirname(file_name)), do: File.mkdir_p!(path)
File.write!(file_name, json)
end
defp encode_binary_data(%{request: _, response: %ExVCR.Response{body: nil}} = recording), do: recording
defp encode_binary_data(%{response: response} = recording) do
case String.valid?(response.body) do
true -> recording
false ->
body = response.body
|> :erlang.term_to_binary()
|> Base.encode64()
%{ recording | response: %{ response | body: body, binary: true } }
end
end
@doc """
Loads the JSON files based on the fixture name and options.
For options, this method just refers to the :custom attribute is set or not.
"""
def load(file_name, custom_mode, adapter) do
case { File.exists?(file_name), custom_mode } do
{ true, _ } -> read_json_file(file_name) |> Enum.map(&adapter.convert_from_string/1)
{ false, true } -> raise ExVCR.FileNotFoundError, message: "cassette file \"#{file_name}\" not found"
{ false, _ } -> []
end
end
@doc """
Reads and parse the json file located at the specified file_name.
"""
def read_json_file(file_name) do
file_name
|> File.read!()
|> JSX.decode!()
|> Enum.map(&load_binary_data/1)
end
defp load_binary_data(%{"response" => %{"body" => body, "binary" => true} = response} = recording) do
body = body
|> Base.decode64!()
|> :erlang.binary_to_term()
%{ recording | "response" => %{ response | "body" => body } }
end
defp load_binary_data(recording), do: recording
end