diff --git a/.github/workflows/elixir.yml b/.github/workflows/elixir.yml index d8bc4d02..08ca75da 100644 --- a/.github/workflows/elixir.yml +++ b/.github/workflows/elixir.yml @@ -1,6 +1,7 @@ name: Elixir CI on: + workflow_dispatch: push: branches: [ master ] pull_request: diff --git a/lib/display.ex b/lib/display.ex index 0ad89863..1f57c16f 100644 --- a/lib/display.ex +++ b/lib/display.ex @@ -21,15 +21,14 @@ defmodule Display do {:noreply, %{state | clear_screen: false}} end - def handle_cast(:clear_screen, %{clear_screen: true} = state) do - IO.puts(ANSI.clear()) - IO.puts(ANSI.home()) + def handle_call(:clear_screen, _from, %{clear_screen: true} = state) do + ANSI.clear <> ANSI.home |> IO.puts() - {:noreply, state} + {:reply, :ok, state} end - def handle_cast(:clear_screen, state) do - {:noreply, state} + def handle_call(:clear_screen, _from, state) do + {:reply, :ok, state} end def invalid_koan(koan, modules) do @@ -53,15 +52,17 @@ defmodule Display do end def clear_screen do - GenServer.cast(__MODULE__, :clear_screen) + GenServer.call(__MODULE__, :clear_screen) end defp format(failure, module, name) do + progress_bar = ProgressBar.progress_bar(Tracker.summarize()) + progress_bar_underline = String.duplicate("-", String.length(progress_bar)) """ #{Intro.intro(module, Tracker.visited())} Now meditate upon #{format_module(module)} - #{ProgressBar.progress_bar(Tracker.summarize())} - ---------------------------------------- + #{progress_bar} + #{progress_bar_underline} #{name} #{Failure.format_failure(failure)} """ diff --git a/lib/display/progress_bar.ex b/lib/display/progress_bar.ex index 1c029ba4..71c1cdc0 100644 --- a/lib/display/progress_bar.ex +++ b/lib/display/progress_bar.ex @@ -4,14 +4,19 @@ defmodule Display.ProgressBar do def progress_bar(%{current: current, total: total}) do arrow = calculate_progress(current, total) |> build_arrow + progress_percentage = calculate_percentage(current, total) - "|" <> String.pad_trailing(arrow, @progress_bar_length) <> "| #{current} of #{total}" + "|" <> String.pad_trailing(arrow, @progress_bar_length) <> "| #{current} of #{total} -> #{progress_percentage}% complete" end defp calculate_progress(current, total) do round(current / total * @progress_bar_length) end + defp calculate_percentage(current, total) do + Float.round(current / total * 100, 1) + end + defp build_arrow(0), do: "" defp build_arrow(length) do diff --git a/test/display/progress_bar_test.exs b/test/display/progress_bar_test.exs index e080ae1a..f32229d8 100644 --- a/test/display/progress_bar_test.exs +++ b/test/display/progress_bar_test.exs @@ -5,16 +5,16 @@ defmodule ProgressBarTest do test "empty bar" do bar = ProgressBar.progress_bar(%{total: 12, current: 0}) - assert bar == "| | 0 of 12" + assert bar == "| | 0 of 12 -> 0.0% complete" end test "puts counter on the right until half the koans are complete" do bar = ProgressBar.progress_bar(%{total: 12, current: 3}) - assert bar == "|=======> | 3 of 12" + assert bar == "|=======> | 3 of 12 -> 25.0% complete" end test "full bar" do bar = ProgressBar.progress_bar(%{total: 12, current: 12}) - assert bar == "|=============================>| 12 of 12" + assert bar == "|=============================>| 12 of 12 -> 100.0% complete" end end