• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

camatcode / basenji / 4e6ab01ab8578dff199cf92f5b41a9c641c12b53

03 Aug 2025 05:03PM UTC coverage: 84.192%. Remained the same
4e6ab01ab8578dff199cf92f5b41a9c641c12b53

Pull #85

github

camatcode
refactor: Reader behaviour
Pull Request #85: refactor: Reader behaviour

46 of 46 new or added lines in 6 files covered. (100.0%)

16 existing lines in 8 files now uncovered.

1209 of 1436 relevant lines covered (84.19%)

487.59 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

71.43
/lib/basenji/reader/process/jpeg_optimizer.ex
1
defmodule Basenji.Reader.Process.JPEGOptimizer do
2
  @moduledoc false
3
  use Basenji.TelemetryHelpers
4

5
  import Basenji.Reader
6

7
  def optimize(jpeg_bytes, opts \\ [])
2✔
8

9
  def optimize(list, opts) when is_list(list) do
10
    :binary.list_to_bin(list) |> optimize(opts)
332✔
11
  end
12

13
  def optimize(<<0xFF, 0xD8, 0xFF, _::binary>> = jpeg_bytes, opts), do: optimize_impl(jpeg_bytes, opts)
392✔
14

15
  def optimize(not_jpeg_bytes, _) when is_binary(not_jpeg_bytes), do: {:ok, not_jpeg_bytes}
1✔
16

17
  def optimize!(jpeg_bytes, opts \\ []) do
18
    with {:ok, optimized_bytes} <- optimize(jpeg_bytes, opts) do
391✔
19
      optimized_bytes
391✔
20
    end
21
  end
22

23
  defp optimize_impl(bytes, _opts) when is_binary(bytes) do
24
    meter_duration [:basenji, :process], "optimize_jpeg" do
392✔
25
      # Use file-based approach in CI environments to avoid epipe issues
26
      # GitHub Actions and other CI systems can have issues with stdin/stdout pipes
27
      use_file_mode =
392✔
28
        System.get_env("CI") == "true" or
392✔
29
          System.get_env("GITHUB_ACTIONS") == "true" or
×
UNCOV
30
          System.get_env("BASENJI_JPEG_FILE_MODE") == "true"
×
31

32
      if use_file_mode do
392✔
33
        optimize_with_file(bytes)
392✔
34
      else
35
        # Try stdin first for local development (more efficient), fallback to file on error
36
        case optimize_with_stdin(bytes) do
×
37
          {:ok, result} -> {:ok, result}
×
UNCOV
38
          {:error, _} -> optimize_with_file(bytes)
×
39
        end
40
      end
41
    end
42
  end
43

44
  defp optimize_with_stdin(bytes) do
45
    cmd = "jpegoptim"
×
46
    cmd_opts = ["-f", "--stdout", "-q", "--stdin"]
×
UNCOV
47
    exec(cmd, cmd_opts, in: bytes)
×
48
  end
49

50
  defp optimize_with_file(bytes) do
51
    cmd = "jpegoptim"
392✔
52

53
    tmp_dir = System.tmp_dir!() |> Path.join("basenji") |> Path.join("jpeg_optimize")
392✔
54
    :ok = File.mkdir_p!(tmp_dir)
392✔
55
    path = Path.join(tmp_dir, "#{System.monotonic_time(:nanosecond)}.jpg")
392✔
56

57
    try do
392✔
58
      :ok = File.write!(path, bytes)
392✔
59
      cmd_opts = ["-f", "--stdout", "-q", path]
392✔
60
      exec(cmd, cmd_opts)
392✔
61
    after
62
      # Ensure cleanup even if exec fails
63
      File.rm(path)
392✔
64
    end
65
  end
66
end
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc