diff --git a/lib/ex_unit_notifier.ex b/lib/ex_unit_notifier.ex index 5b16aab..82ae642 100644 --- a/lib/ex_unit_notifier.ex +++ b/lib/ex_unit_notifier.ex @@ -5,7 +5,6 @@ defmodule ExUnitNotifier do To enable notifications, add `ExUnitNotifier` as a formatter in your `test_helper.exs`: ExUnit.configure formatters: [ExUnit.CLIFormatter, ExUnitNotifier] - """ use GenServer @@ -13,13 +12,6 @@ defmodule ExUnitNotifier do alias ExUnitNotifier.Counter alias ExUnitNotifier.MessageFormatter - @notifiers [ - ExUnitNotifier.Notifiers.TerminalNotifier, - ExUnitNotifier.Notifiers.NotifySend, - ExUnitNotifier.Notifiers.TmuxNotifier, - ExUnitNotifier.Notifiers.TerminalTitle - ] - def init(_opts), do: {:ok, %Counter{}} def handle_cast({:test_finished, %ExUnit.Test{state: nil}}, counter), @@ -39,40 +31,43 @@ defmodule ExUnitNotifier do # Elixir version < 1.12.0 def handle_cast({:suite_finished, run_us, load_us}, counter) do - apply(notifier(), :notify, [ - status(counter), + Ding.send( + "ExUnit", MessageFormatter.format(counter, run_us, load_us), - opts() - ]) + message_opts(counter) + ) {:noreply, counter} end # Elixir version >= 1.12.0, see https://hexdocs.pm/ex_unit/1.12.0/ExUnit.Formatter.html def handle_cast({:suite_finished, %{run: run_us, async: _async_us, load: load_us}}, counter) do - apply(notifier(), :notify, [ - status(counter), + Ding.send( + "ExUnit", MessageFormatter.format(counter, run_us, load_us), - opts() - ]) + message_opts(counter) + ) {:noreply, counter} end def handle_cast(_, counter), do: {:noreply, counter} - defp status(%Counter{failures: failures, invalid: invalid}) when failures > 0 or invalid > 0, - do: :error - + defp status( + %Counter{failures: failures, invalid: invalid} + ) when failures > 0 or invalid > 0, do: :error defp status(_), do: :ok - defp opts, - do: %{ - clear_history: Application.get_env(:ex_unit_notifier, :clear_history, false) - } + defp color(:error), do: "red" + defp color(_status), do: "green" - defp notifier, do: Application.get_env(:ex_unit_notifier, :notifier, first_available_notifier()) + defp message_opts counter do %{ + clear_history: Application.get_env(:ex_unit_notifier, :clear_history, false), + color: color(status(counter)), + icon_png: icon_png(status(counter)), + icon_icns: icon_icns(status(counter)), + } end - defp first_available_notifier, - do: @notifiers |> Enum.find(fn notifier -> notifier.available? end) + defp icon_png(status), do: Application.app_dir(:ex_unit_notifier, "priv/icons/#{status}.png") + defp icon_icns(status), do: Application.app_dir(:ex_unit_notifier, "priv/icons/#{status}.icns") end diff --git a/lib/ex_unit_notifier/notifiers/notify_send.ex b/lib/ex_unit_notifier/notifiers/notify_send.ex deleted file mode 100644 index 6017e4b..0000000 --- a/lib/ex_unit_notifier/notifiers/notify_send.ex +++ /dev/null @@ -1,30 +0,0 @@ -defmodule ExUnitNotifier.Notifiers.NotifySend do - @moduledoc false - - def notify(status, message, opts) do - System.cmd(executable(), build_args(status, message, opts)) - end - - def available?, do: executable() != nil - - defp executable, do: System.find_executable("notify-send") - - defp build_args(status, message, %{clear_history: clear_history}) do - args = [ - "--app-name=ExUnit", - "--icon=#{get_icon(status)}", - "ExUnit", - message - ] - - maybe_add_clear_history(args, clear_history) - end - - defp maybe_add_clear_history(args, true), - do: List.insert_at(args, 2, "--hint=int:transient:1") - - defp maybe_add_clear_history(args, _clear_history), do: args - - defp get_icon(status), - do: Application.app_dir(:ex_unit_notifier, "priv/icons/#{status |> Atom.to_string()}.png") -end diff --git a/lib/ex_unit_notifier/notifiers/terminal_notifier.ex b/lib/ex_unit_notifier/notifiers/terminal_notifier.ex deleted file mode 100644 index 18131fd..0000000 --- a/lib/ex_unit_notifier/notifiers/terminal_notifier.ex +++ /dev/null @@ -1,28 +0,0 @@ -defmodule ExUnitNotifier.Notifiers.TerminalNotifier do - @moduledoc false - - def notify(status, message, _opts) do - System.cmd(executable(), [ - "-group", - "ex-unit-notifier", - "-title", - "ExUnit", - "-message", - message, - "-appIcon", - get_icon(status), - "-contentImage", - content_image(status) - ]) - end - - def available?, do: executable() != nil - - defp executable, do: System.find_executable("terminal-notifier") - - defp get_icon(status), - do: Application.app_dir(:ex_unit_notifier, "priv/icons/#{status}.icns") - - defp content_image(status), - do: Application.app_dir(:ex_unit_notifier, "priv/icons/#{status}.png") -end diff --git a/lib/ex_unit_notifier/notifiers/terminal_title.ex b/lib/ex_unit_notifier/notifiers/terminal_title.ex deleted file mode 100644 index 0df1e5f..0000000 --- a/lib/ex_unit_notifier/notifiers/terminal_title.ex +++ /dev/null @@ -1,7 +0,0 @@ -defmodule ExUnitNotifier.Notifiers.TerminalTitle do - @moduledoc false - - def notify(_status, message, _opts), do: IO.puts(:stderr, "\e]2;ExUnit - #{message} \a") - - def available?, do: true -end diff --git a/lib/ex_unit_notifier/notifiers/tmux_notifier.ex b/lib/ex_unit_notifier/notifiers/tmux_notifier.ex deleted file mode 100644 index 4750e2f..0000000 --- a/lib/ex_unit_notifier/notifiers/tmux_notifier.ex +++ /dev/null @@ -1,29 +0,0 @@ -defmodule ExUnitNotifier.Notifiers.TmuxNotifier do - @moduledoc false - - def notify(status, _message, _opts) do - if pane() do - # tmux set-window-option -t"$TMUX_PANE" window-status-style bg=red - System.cmd(executable(), [ - "set-window-option", - "-t#{pane()}", - "window-status-style", - style(status) - ]) - end - end - - def available?, do: executable() != nil && pane() != nil - - defp executable, do: System.find_executable("tmux") - - defp pane, do: System.get_env("TMUX_PANE") - - defp style(status) do - if status == :error do - "bg=red" - else - "bg=green" - end - end -end diff --git a/mix.exs b/mix.exs index 733591a..7c3ce48 100644 --- a/mix.exs +++ b/mix.exs @@ -26,7 +26,8 @@ defmodule ExUnitNotifier.MixProject do defp deps do [ {:ex_doc, ">= 0.0.0", only: :dev, runtime: false}, - {:mix_test_watch, "~> 1.0", only: :dev} + {:mix_test_watch, "~> 1.0", only: :dev}, + {:ding, "~> 0.0" }, ] end diff --git a/mix.lock b/mix.lock index 1e49f71..c95959f 100644 --- a/mix.lock +++ b/mix.lock @@ -1,4 +1,5 @@ %{ + "ding": {:hex, :ding, "0.0.1", "39544ed9d32f9ff9f20ea86566c1cee67dd4a5678f364591c70b8107df1969b5", [:mix], [], "hexpm", "e1791c3b89e52e70ad04583d1e181d185dffbeebe683e37cf734294d66a4e484"}, "earmark": {:hex, :earmark, "1.4.15", "2c7f924bf495ec1f65bd144b355d0949a05a254d0ec561740308a54946a67888", [:mix], [{:earmark_parser, ">= 1.4.13", [hex: :earmark_parser, repo: "hexpm", optional: false]}], "hexpm", "3b1209b85bc9f3586f370f7c363f6533788fb4e51db23aa79565875e7f9999ee"}, "earmark_parser": {:hex, :earmark_parser, "1.4.31", "a93921cdc6b9b869f519213d5bc79d9e218ba768d7270d46fdcf1c01bacff9e2", [:mix], [], "hexpm", "317d367ee0335ef037a87e46c91a2269fef6306413f731e8ec11fc45a7efd059"}, "ex_doc": {:hex, :ex_doc, "0.29.4", "6257ecbb20c7396b1fe5accd55b7b0d23f44b6aa18017b415cb4c2b91d997729", [:mix], [{:earmark_parser, "~> 1.4.31", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "2c6699a737ae46cb61e4ed012af931b57b699643b24dabe2400a8168414bc4f5"},