Add Asciicasts.stdout_stream/2 (for gzipped files)

ex-snapshot
Marcin Kulik 7 years ago
parent 618cc93601
commit a81a74b18d

@ -105,4 +105,36 @@ defmodule Asciinema.Asciicasts do
defp generate_poster(asciicast) do
PosterGenerator.generate(asciicast)
end
def stdout_stream(stdout_timing_path, stdout_data_path) do
Stream.resource(
fn ->
{File.open!(stdout_timing_path, [:read, :compressed]),
File.open!(stdout_data_path, [:read, :compressed])}
end,
fn {timing_file, data_file} = files ->
case IO.read(timing_file, :line) do
line when is_binary(line) ->
{delay, count} = parse_line(line)
case IO.read(data_file, count) do
text when is_binary(text) ->
{[{delay, text}], files}
otherwise ->
{:error, otherwise}
end
_ ->
{:halt, files}
end
end,
fn {timing_file, data_file} ->
File.close(timing_file)
File.close(data_file)
end
)
end
defp parse_line(line) do
[delay_s, bytes_s] = line |> String.trim_trailing |> String.split(" ")
{String.to_float(delay_s), String.to_integer(bytes_s)}
end
end

@ -108,4 +108,13 @@ defmodule Asciinema.AsciicastsTest do
assert {:error, :parse_error} = Asciicasts.create_asciicast(user, upload)
end
end
describe "stdout_stream/2" do
test "with gzipped files" do
stream = Asciicasts.stdout_stream("spec/fixtures/0.9.9/stdout.time",
"spec/fixtures/0.9.9/stdout")
assert :ok == Stream.run(stream)
assert [{1.234567, "foobar"}, {0.123456, "baz"}] == Enum.take(stream, 2)
end
end
end

Loading…
Cancel
Save