From 332365d3631ee8798ba88148611e1439d68fa3ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Zapa=C5=9Bnik?= Date: Tue, 9 Apr 2019 14:09:20 +0200 Subject: [PATCH 1/2] Add and run mix formatter --- .formatter.exs | 4 + config/config.exs | 5 +- config/dev.exs | 3 +- lib/verk_web.ex | 12 ++- lib/verk_web/endpoint.ex | 34 ++++--- lib/verk_web/range_paginator.ex | 16 ++-- lib/verk_web/tracking_jobs_handler.ex | 7 +- lib/verk_web/tracking_queues_handler.ex | 9 +- mix.exs | 95 +++++++++++-------- test/controllers/dead_controllers_test.exs | 6 +- test/controllers/page_controller_test.exs | 2 +- test/controllers/queues_controller_test.exs | 27 ++++-- test/controllers/retries_controller_test.exs | 16 ++-- .../controllers/scheduled_controller_test.exs | 16 ++-- test/lib/range_paginator_test.exs | 71 ++++++++++++-- test/lib/tracking_jobs_handler_test.exs | 22 +++-- test/lib/tracking_queues_handler_test.exs | 2 +- test/support/channel_case.ex | 2 - test/test_helper.exs | 5 +- test/views/error_view_test.exs | 9 +- test/views/layout_view_test.exs | 2 +- web/channels/room_channel.ex | 4 +- web/channels/user_socket.ex | 2 +- web/controllers/dead_controller.ex | 14 +-- web/controllers/job_controller.ex | 18 ++-- web/controllers/page_controller.ex | 2 +- web/controllers/queues_controller.ex | 31 +++--- web/controllers/retries_controller.ex | 17 ++-- web/controllers/scheduled_controller.ex | 29 ++++-- web/router.ex | 45 ++++----- web/views/dead_view.ex | 4 +- web/views/error_helpers.ex | 2 +- web/views/error_view.ex | 2 +- web/views/helpers/queues_helpers.ex | 7 +- web/views/job_view.ex | 6 +- web/views/layout_view.ex | 6 +- web/views/page_view.ex | 12 +-- web/views/queues_view.ex | 15 +-- web/views/retries_view.ex | 6 +- web/views/scheduled_view.ex | 4 +- web/views/shared_view.ex | 4 +- 41 files changed, 364 insertions(+), 231 deletions(-) create mode 100644 .formatter.exs diff --git a/.formatter.exs b/.formatter.exs new file mode 100644 index 0000000..046bd6d --- /dev/null +++ b/.formatter.exs @@ -0,0 +1,4 @@ +# Used by "mix format" +[ + inputs: ["{mix,.formatter}.exs", "{config,lib,test,web}/**/*.{ex,exs}"] +] diff --git a/config/config.exs b/config/config.exs index c653d3e..afae872 100644 --- a/config/config.exs +++ b/config/config.exs @@ -10,8 +10,7 @@ config :verk_web, VerkWeb.Endpoint, url: [host: "localhost"], root: Path.dirname(__DIR__), render_errors: [accepts: ~w(html json)], - pubsub: [name: VerkWeb.PubSub, - adapter: Phoenix.PubSub.PG2] + pubsub: [name: VerkWeb.PubSub, adapter: Phoenix.PubSub.PG2] # Configures Elixir's Logger config :logger, :console, @@ -22,4 +21,4 @@ config :phoenix, :json_library, Jason # Import environment specific config. This must remain at the bottom # of this file so it overrides the configuration defined above. -import_config "#{Mix.env}.exs" +import_config "#{Mix.env()}.exs" diff --git a/config/dev.exs b/config/dev.exs index d69af68..f2c6ce5 100644 --- a/config/dev.exs +++ b/config/dev.exs @@ -31,7 +31,8 @@ config :verk_web, VerkWeb.Endpoint, # config :logger, backends: [] # Silent logging for tests -config :verk, queues: [default: 25, priority: 10], +config :verk, + queues: [default: 25, priority: 10], poll_interval: 5000, node_id: "1", redis_url: "redis://127.0.0.1:6379" diff --git a/lib/verk_web.ex b/lib/verk_web.ex index 1be7a65..6061f69 100644 --- a/lib/verk_web.ex +++ b/lib/verk_web.ex @@ -6,11 +6,13 @@ defmodule VerkWeb do import Supervisor.Spec, warn: false children = [supervisor(VerkWeb.Endpoint, [])] - children = if Application.get_env(:verk_web, :link_verk_supervisor, false) do - [supervisor(Verk.Supervisor, []) | children] - else - children - end + + children = + if Application.get_env(:verk_web, :link_verk_supervisor, false) do + [supervisor(Verk.Supervisor, []) | children] + else + children + end :ets.new(:verk_web_session, [:named_table, :public, read_concurrency: true]) opts = [strategy: :one_for_one, name: VerkWeb.Supervisor] diff --git a/lib/verk_web/endpoint.ex b/lib/verk_web/endpoint.ex index 04ec61d..4241c0a 100644 --- a/lib/verk_web/endpoint.ex +++ b/lib/verk_web/endpoint.ex @@ -1,44 +1,50 @@ defmodule VerkWeb.Endpoint do use Phoenix.Endpoint, otp_app: :verk_web - socket "/socket", VerkWeb.UserSocket + socket("/socket", VerkWeb.UserSocket) # Serve at "/" the static files from "priv/static" directory. # # You should set gzip to true if you are running phoenix.digest # when deploying your static files in production. - plug Plug.Static, - at: "/", from: :verk_web, gzip: false, + plug(Plug.Static, + at: "/", + from: :verk_web, + gzip: false, only: ~w(css fonts images js favicon.ico robots.txt) + ) # Code reloading can be explicitly enabled under the # :code_reloader configuration of your endpoint. if code_reloading? do - socket "/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket - plug Phoenix.LiveReloader - plug Phoenix.CodeReloader + socket("/phoenix/live_reload/socket", Phoenix.LiveReloader.Socket) + plug(Phoenix.LiveReloader) + plug(Phoenix.CodeReloader) end - plug Plug.RequestId - plug Plug.Logger + plug(Plug.RequestId) + plug(Plug.Logger) - plug Plug.Parsers, + plug(Plug.Parsers, parsers: [:urlencoded, :multipart, :json], pass: ["*/*"], json_decoder: Jason + ) - plug Plug.MethodOverride - plug Plug.Head + plug(Plug.MethodOverride) + plug(Plug.Head) - plug Plug.Session, + plug(Plug.Session, store: :ets, key: "verk_web_sid", table: :verk_web_session + ) auth_options = Application.get_env(:verk_web, :authorization) + if auth_options do - plug BasicAuth, use_config: {:verk_web, :authorization} + plug(BasicAuth, use_config: {:verk_web, :authorization}) end - plug VerkWeb.Router + plug(VerkWeb.Router) end diff --git a/lib/verk_web/range_paginator.ex b/lib/verk_web/range_paginator.ex index 83c590c..beab197 100644 --- a/lib/verk_web/range_paginator.ex +++ b/lib/verk_web/range_paginator.ex @@ -2,25 +2,25 @@ defmodule VerkWeb.RangePaginator do defstruct [:page, :per_page, :from, :to, :has_next, :has_prev] def new(total_entries, page \\ 1, per_page \\ 20) do - page = to_int(page, 1) + page = to_int(page, 1) per_page = to_int(per_page, 20) - from = if page > 1, do: (page - 1) * per_page, else: 0 - to = if page > 1, do: (from + per_page) - 1, else: per_page - 1 + from = if page > 1, do: (page - 1) * per_page, else: 0 + to = if page > 1, do: from + per_page - 1, else: per_page - 1 has_next = total_entries - 1 > to has_prev = page > 1 %VerkWeb.RangePaginator{ - page: page, + page: page, per_page: per_page, - from: from, - to: to, + from: from, + to: to, has_next: has_next, has_prev: has_prev } end - defp to_int(nil, default), do: default + defp to_int(nil, default), do: default defp to_int(page, _) when is_integer(page), do: page - defp to_int(page, _), do: Integer.parse(page) |> elem(0) + defp to_int(page, _), do: Integer.parse(page) |> elem(0) end diff --git a/lib/verk_web/tracking_jobs_handler.ex b/lib/verk_web/tracking_jobs_handler.ex index c2d688b..2d3056a 100644 --- a/lib/verk_web/tracking_jobs_handler.ex +++ b/lib/verk_web/tracking_jobs_handler.ex @@ -13,22 +13,25 @@ defmodule VerkWeb.TrackingJobsHandler do end def handle_events(events, _from, {pid, stats}) do - stats = Enum.reduce(events, stats, &(handle_event(&1, &2))) + stats = Enum.reduce(events, stats, &handle_event(&1, &2)) {:noreply, [], {pid, stats}} end defp handle_event(%Verk.Events.JobFinished{}, stats) do %{finished: stats[:finished] + 1, failed: stats[:failed]} end + defp handle_event(%Verk.Events.JobFailed{}, stats) do %{finished: stats[:finished], failed: stats[:failed] + 1} end + defp handle_event(_, stats), do: stats def handle_info(:broadcast_stats, {pid, stats}) do - send pid, {:stats, stats} + send(pid, {:stats, stats}) Process.send_after(self(), :broadcast_stats, @broadcast_interval) {:noreply, [], {pid, %{finished: 0, failed: 0}}} end + def handle_info(_, state), do: {:noreply, [], state} end diff --git a/lib/verk_web/tracking_queues_handler.ex b/lib/verk_web/tracking_queues_handler.ex index 333cd91..f23e964 100644 --- a/lib/verk_web/tracking_queues_handler.ex +++ b/lib/verk_web/tracking_queues_handler.ex @@ -15,13 +15,16 @@ defmodule VerkWeb.TrackingQueuesHandler do end defp handle_event(%Verk.Events.QueueRunning{} = event, pid) do - send pid, {:queue_status, %{queue: event.queue, status: "running"}} + send(pid, {:queue_status, %{queue: event.queue, status: "running"}}) end + defp handle_event(%Verk.Events.QueuePausing{} = event, pid) do - send pid, {:queue_status, %{queue: event.queue, status: "pausing"}} + send(pid, {:queue_status, %{queue: event.queue, status: "pausing"}}) end + defp handle_event(%Verk.Events.QueuePaused{} = event, pid) do - send pid, {:queue_status, %{queue: event.queue, status: "paused"}} + send(pid, {:queue_status, %{queue: event.queue, status: "paused"}}) end + defp handle_event(_, _), do: :ok end diff --git a/mix.exs b/mix.exs index 8b53726..bb38801 100644 --- a/mix.exs +++ b/mix.exs @@ -6,54 +6,75 @@ defmodule VerkWeb.Mixfile do """ def project do - [app: :verk_web, - version: "1.5.0", - elixir: "~> 1.6", - elixirc_paths: elixirc_paths(Mix.env), - compilers: [:phoenix, :gettext] ++ Mix.compilers, - build_embedded: Mix.env == :prod, - start_permanent: Mix.env == :prod, - test_coverage: [tool: Coverex.Task, coveralls: true], - name: "Verk Web", - description: @description, - package: package(), - deps: deps()] + [ + app: :verk_web, + version: "1.5.0", + elixir: "~> 1.6", + elixirc_paths: elixirc_paths(Mix.env()), + compilers: [:phoenix, :gettext] ++ Mix.compilers(), + build_embedded: Mix.env() == :prod, + start_permanent: Mix.env() == :prod, + test_coverage: [tool: Coverex.Task, coveralls: true], + name: "Verk Web", + description: @description, + package: package(), + deps: deps() + ] end - @default_config [http: [port: 4000], server: false, - pubsub: [name: VerkWeb.PubSub, adapter: Phoenix.PubSub.PG2]] + @default_config [ + http: [port: 4000], + server: false, + pubsub: [name: VerkWeb.PubSub, adapter: Phoenix.PubSub.PG2] + ] def application do - [mod: {VerkWeb, []}, - env: [{VerkWeb.Endpoint, @default_config}], - applications: [:phoenix, :phoenix_pubsub, :phoenix_html, :cowboy, :logger, :gettext, :verk, :timex, :basic_auth]] + [ + mod: {VerkWeb, []}, + env: [{VerkWeb.Endpoint, @default_config}], + applications: [ + :phoenix, + :phoenix_pubsub, + :phoenix_html, + :cowboy, + :logger, + :gettext, + :verk, + :timex, + :basic_auth + ] + ] end defp elixirc_paths(:test), do: ["lib", "web", "test/support"] - defp elixirc_paths(_), do: ["lib", "web"] + defp elixirc_paths(_), do: ["lib", "web"] defp deps do - [{:phoenix, "~> 1.4.0"}, - {:phoenix_pubsub, "~> 1.0"}, - {:phoenix_html, "~> 2.6"}, - {:gettext, "~> 0.16"}, - {:verk, "~> 1.1"}, - {:plug_cowboy, "~> 2.0"}, - {:plug, "~> 1.7"}, - {:basic_auth, "~> 2.0"}, - {:phoenix_live_reload, "~> 1.0", only: :dev}, - {:earmark, "~> 1.0", only: :dev}, - {:ex_doc, "~> 0.13", only: :dev}, - {:coverex, "~> 1.4", only: :test}, - {:meck, "~> 0.8", only: :test}, - {:timex, "~> 3.3.0"}, - {:jason, "~> 1.1"}] + [ + {:phoenix, "~> 1.4.0"}, + {:phoenix_pubsub, "~> 1.0"}, + {:phoenix_html, "~> 2.6"}, + {:gettext, "~> 0.16"}, + {:verk, "~> 1.1"}, + {:plug_cowboy, "~> 2.0"}, + {:plug, "~> 1.7"}, + {:basic_auth, "~> 2.0"}, + {:phoenix_live_reload, "~> 1.0", only: :dev}, + {:earmark, "~> 1.0", only: :dev}, + {:ex_doc, "~> 0.13", only: :dev}, + {:coverex, "~> 1.4", only: :test}, + {:meck, "~> 0.8", only: :test}, + {:timex, "~> 3.3.0"}, + {:jason, "~> 1.1"} + ] end defp package do - [maintainers: ["Eduardo Gurgel Pinho", "Alisson Sales"], - licenses: ["MIT"], - links: %{"Github" => "https://github.com/edgurgel/verk_web"}, - files: ["lib", "web", "priv", "mix.exs", "README*", "LICENSE*"]] + [ + maintainers: ["Eduardo Gurgel Pinho", "Alisson Sales"], + licenses: ["MIT"], + links: %{"Github" => "https://github.com/edgurgel/verk_web"}, + files: ["lib", "web", "priv", "mix.exs", "README*", "LICENSE*"] + ] end end diff --git a/test/controllers/dead_controllers_test.exs b/test/controllers/dead_controllers_test.exs index b63e551..376ba8b 100644 --- a/test/controllers/dead_controllers_test.exs +++ b/test/controllers/dead_controllers_test.exs @@ -2,18 +2,18 @@ defmodule VerkWeb.DeadControllerTest do use VerkWeb.ConnCase setup do - on_exit fn -> :meck.unload end + on_exit(fn -> :meck.unload() end) :ok end test "DELETE / jobs delete expecific jobs", %{conn: conn} do fake_job_json = "{\"jid\": \"123\"}" :meck.expect(Verk.DeadSet, :delete_job, [fake_job_json], :ok) - delete conn, "/dead", jobs_to_delete: [fake_job_json] + delete(conn, "/dead", jobs_to_delete: [fake_job_json]) end test "DELETE / passing no jobs deletes all jobs", %{conn: conn} do :meck.expect(Verk.DeadSet, :clear, 0, :ok) - delete conn, "/dead" + delete(conn, "/dead") end end diff --git a/test/controllers/page_controller_test.exs b/test/controllers/page_controller_test.exs index 92a2930..efe075a 100644 --- a/test/controllers/page_controller_test.exs +++ b/test/controllers/page_controller_test.exs @@ -2,7 +2,7 @@ defmodule VerkWeb.PageControllerTest do use VerkWeb.ConnCase test "GET /", %{conn: conn} do - conn = get conn, "/" + conn = get(conn, "/") assert html_response(conn, 200) end end diff --git a/test/controllers/queues_controller_test.exs b/test/controllers/queues_controller_test.exs index 18caeb4..da9df6b 100644 --- a/test/controllers/queues_controller_test.exs +++ b/test/controllers/queues_controller_test.exs @@ -4,13 +4,20 @@ defmodule VerkWeb.QueuesControllerTest do alias Verk.QueueStats alias Verk - @stats [%{ queue: "default", running_counter: 1, - finished_counter: 1, failed_counter: 0, status: :running }] + @stats [ + %{ + queue: "default", + running_counter: 1, + finished_counter: 1, + failed_counter: 0, + status: :running + } + ] setup do - new QueueStats - new Verk - on_exit fn -> unload() end + new(QueueStats) + new(Verk) + on_exit(fn -> unload() end) :ok end @@ -18,7 +25,7 @@ defmodule VerkWeb.QueuesControllerTest do test "no query string", %{conn: conn} do expect(QueueStats, :all, [""], @stats) - conn = get conn, "/queues" + conn = get(conn, "/queues") assert html_response(conn, 200) =~ "Queues" validate(QueueStats) @@ -27,7 +34,7 @@ defmodule VerkWeb.QueuesControllerTest do test "with a query string", %{conn: conn} do expect(QueueStats, :all, ["defa"], @stats) - conn = get conn, "/queues?search=defa" + conn = get(conn, "/queues?search=defa") assert html_response(conn, 200) =~ "Queues" validate(QueueStats) @@ -36,7 +43,7 @@ defmodule VerkWeb.QueuesControllerTest do test "with no queues running", %{conn: conn} do expect(QueueStats, :all, [""], []) - conn = get conn, "/queues" + conn = get(conn, "/queues") assert html_response(conn, 200) =~ "No job was started yet" validate(QueueStats) @@ -47,7 +54,7 @@ defmodule VerkWeb.QueuesControllerTest do test "pauses queue", %{conn: conn} do queue = "default" expect(Verk, :pause_queue, [:default], :ok) - conn = post conn, "/queues/#{queue}/pause" + conn = post(conn, "/queues/#{queue}/pause") assert redirected_to(conn) =~ "/queues" validate(Verk) end @@ -57,7 +64,7 @@ defmodule VerkWeb.QueuesControllerTest do test "resumes queue", %{conn: conn} do queue = "default" expect(Verk, :resume_queue, [:default], :ok) - conn = post conn, "/queues/#{queue}/resume" + conn = post(conn, "/queues/#{queue}/resume") assert redirected_to(conn) =~ "/queues" validate(Verk) end diff --git a/test/controllers/retries_controller_test.exs b/test/controllers/retries_controller_test.exs index f490cc1..c157fb4 100644 --- a/test/controllers/retries_controller_test.exs +++ b/test/controllers/retries_controller_test.exs @@ -4,28 +4,28 @@ defmodule VerkWeb.RetriesControllerTest do import :meck, except: [delete: 3] setup do - new RetrySet - on_exit fn -> unload() end + new(RetrySet) + on_exit(fn -> unload() end) :ok end test "POST / action delete jobs delete specific jobs", %{conn: conn} do fake_job_json = "{\"jid\": \"123\"}" expect(RetrySet, :delete_job!, [fake_job_json], :ok) - post conn, "/retries", [jobs_to_modify: [fake_job_json], action: "delete"] - assert validate RetrySet + post(conn, "/retries", jobs_to_modify: [fake_job_json], action: "delete") + assert validate(RetrySet) end test "POST / action retry jobs retries specific jobs", %{conn: conn} do fake_job_json = "{\"jid\": \"123\"}" expect(RetrySet, :requeue_job!, [fake_job_json], :ok) - post conn, "/retries", [jobs_to_modify: [fake_job_json], action: "requeue"] - assert validate RetrySet + post(conn, "/retries", jobs_to_modify: [fake_job_json], action: "requeue") + assert validate(RetrySet) end test "DELETE / passing no jobs deletes all jobs", %{conn: conn} do expect(RetrySet, :clear!, 0, :ok) - delete conn, "/retries" - assert validate RetrySet + delete(conn, "/retries") + assert validate(RetrySet) end end diff --git a/test/controllers/scheduled_controller_test.exs b/test/controllers/scheduled_controller_test.exs index aa413df..f53a5e2 100644 --- a/test/controllers/scheduled_controller_test.exs +++ b/test/controllers/scheduled_controller_test.exs @@ -4,30 +4,30 @@ defmodule VerkWeb.ScheduledControllerTest do import :meck, except: [delete: 3] setup do - new SortedSet - on_exit fn -> unload() end + new(SortedSet) + on_exit(fn -> unload() end) :ok end test "POST / jobs delete specific jobs", %{conn: conn} do fake_job_json = "{\"jid\": \"123\"}" expect(SortedSet, :delete_job!, ["schedule", fake_job_json, Redis], :ok) - conn = post conn, "/scheduled", [jobs_to_modify: [fake_job_json], action: "delete"] - assert validate SortedSet + conn = post(conn, "/scheduled", jobs_to_modify: [fake_job_json], action: "delete") + assert validate(SortedSet) assert redirected_to(conn) == "/scheduled" end test "POST / action scheduled jobs retries specific jobs", %{conn: conn} do fake_job_json = "{\"jid\": \"123\"}" expect(SortedSet, :requeue_job!, ["schedule", fake_job_json, Redis], :ok) - post conn, "/scheduled", [jobs_to_modify: [fake_job_json], action: "requeue"] - assert validate SortedSet + post(conn, "/scheduled", jobs_to_modify: [fake_job_json], action: "requeue") + assert validate(SortedSet) end test "DELETE / passing no jobs deletes all jobs", %{conn: conn} do expect(SortedSet, :clear!, ["schedule", Redis], :ok) - conn = delete conn, "/scheduled" - assert validate SortedSet + conn = delete(conn, "/scheduled") + assert validate(SortedSet) assert redirected_to(conn) == "/scheduled" end end diff --git a/test/lib/range_paginator_test.exs b/test/lib/range_paginator_test.exs index 50c3be8..cd58268 100644 --- a/test/lib/range_paginator_test.exs +++ b/test/lib/range_paginator_test.exs @@ -4,31 +4,86 @@ defmodule VerkWeb.RangePaginatorTest do test 'with default params' do paginator = RangePaginator.new(21) - assert paginator == %RangePaginator{ page: 1, per_page: 20, from: 0, to: 19, has_next: true, has_prev: false } + + assert paginator == %RangePaginator{ + page: 1, + per_page: 20, + from: 0, + to: 19, + has_next: true, + has_prev: false + } end test 'second page' do paginator = RangePaginator.new(2, 2) - assert paginator == %RangePaginator{ page: 2, per_page: 20, from: 20, to: 39, has_next: false, has_prev: true } + + assert paginator == %RangePaginator{ + page: 2, + per_page: 20, + from: 20, + to: 39, + has_next: false, + has_prev: true + } end test 'passing page as string' do paginator = RangePaginator.new(2, "2") - assert paginator == %RangePaginator{ page: 2, per_page: 20, from: 20, to: 39, has_next: false, has_prev: true } + + assert paginator == %RangePaginator{ + page: 2, + per_page: 20, + from: 20, + to: 39, + has_next: false, + has_prev: true + } end test 'custom per page' do paginator = RangePaginator.new(2, "1", "1") - assert paginator == %RangePaginator{ page: 1, per_page: 1, from: 0, to: 0, has_next: true, has_prev: false } + + assert paginator == %RangePaginator{ + page: 1, + per_page: 1, + from: 0, + to: 0, + has_next: true, + has_prev: false + } paginator = RangePaginator.new(2, "2", "1") - assert paginator == %RangePaginator{ page: 2, per_page: 1, from: 1, to: 1, has_next: false, has_prev: true } + + assert paginator == %RangePaginator{ + page: 2, + per_page: 1, + from: 1, + to: 1, + has_next: false, + has_prev: true + } paginator = RangePaginator.new(3, "3", "1") - assert paginator == %RangePaginator{ page: 3, per_page: 1, from: 2, to: 2, has_next: false, has_prev: true } + + assert paginator == %RangePaginator{ + page: 3, + per_page: 1, + from: 2, + to: 2, + has_next: false, + has_prev: true + } paginator = RangePaginator.new(210, "2", "10") - assert paginator == %RangePaginator{ page: 2, per_page: 10, from: 10, to: 19, has_next: true, has_prev: true } + + assert paginator == %RangePaginator{ + page: 2, + per_page: 10, + from: 10, + to: 19, + has_next: true, + has_prev: true + } end end - diff --git a/test/lib/tracking_jobs_handler_test.exs b/test/lib/tracking_jobs_handler_test.exs index 4ac4b5e..2248a4d 100644 --- a/test/lib/tracking_jobs_handler_test.exs +++ b/test/lib/tracking_jobs_handler_test.exs @@ -4,14 +4,16 @@ defmodule VerkWeb.TrackingJobsHandlerTest do import :meck setup do - on_exit fn -> unload() end + on_exit(fn -> unload() end) :ok end describe "init/1" do test "returns correct initial state" do pid = self() - assert {:consumer, {^pid, %{finished: 0, failed: 0}}, subscribe_to: [Verk.EventProducer]} = init(pid) + + assert {:consumer, {^pid, %{finished: 0, failed: 0}}, subscribe_to: [Verk.EventProducer]} = + init(pid) end end @@ -20,16 +22,22 @@ defmodule VerkWeb.TrackingJobsHandlerTest do pid = self() {:consumer, state, subscribe_to: [Verk.EventProducer]} = init(pid) - assert handle_events([%Verk.Events.JobFinished{}], :from, state) == {:noreply, [], {pid, %{ finished: 1, failed: 0 }}} - assert handle_events([%Verk.Events.JobFinished{}], :from, {pid, %{finished: 10, failed: 0}}) == {:noreply, [], {pid, %{ finished: 11, failed: 0 }}} + assert handle_events([%Verk.Events.JobFinished{}], :from, state) == + {:noreply, [], {pid, %{finished: 1, failed: 0}}} + + assert handle_events([%Verk.Events.JobFinished{}], :from, {pid, %{finished: 10, failed: 0}}) == + {:noreply, [], {pid, %{finished: 11, failed: 0}}} end test "with job failed event" do pid = self() {:consumer, state, subscribe_to: [Verk.EventProducer]} = init(pid) - assert handle_events([%Verk.Events.JobFailed{}], :from, state) == {:noreply, [], {pid, %{ finished: 0, failed: 1 }}} - assert handle_events([%Verk.Events.JobFailed{}], :from, {pid, %{finished: 0, failed: 10}}) == {:noreply, [], {pid, %{ finished: 0, failed: 11 }}} + assert handle_events([%Verk.Events.JobFailed{}], :from, state) == + {:noreply, [], {pid, %{finished: 0, failed: 1}}} + + assert handle_events([%Verk.Events.JobFailed{}], :from, {pid, %{finished: 0, failed: 10}}) == + {:noreply, [], {pid, %{finished: 0, failed: 11}}} end test "with unexpected event" do @@ -42,7 +50,7 @@ defmodule VerkWeb.TrackingJobsHandlerTest do describe "handle_info/2" do test "broadcast_stats" do - pid = self() + pid = self() state = {pid, %{finished: 1, failed: 2}} {:noreply, [], new_state} = handle_info(:broadcast_stats, state) diff --git a/test/lib/tracking_queues_handler_test.exs b/test/lib/tracking_queues_handler_test.exs index 7aa2663..77b337f 100644 --- a/test/lib/tracking_queues_handler_test.exs +++ b/test/lib/tracking_queues_handler_test.exs @@ -4,7 +4,7 @@ defmodule VerkWeb.TrackingQueuesHandlerTest do import :meck setup do - on_exit fn -> unload() end + on_exit(fn -> unload() end) :ok end diff --git a/test/support/channel_case.ex b/test/support/channel_case.ex index b8bf26c..aff3af7 100644 --- a/test/support/channel_case.ex +++ b/test/support/channel_case.ex @@ -20,14 +20,12 @@ defmodule VerkWeb.ChannelCase do # Import conveniences for testing with channels use Phoenix.ChannelTest - # The default endpoint for testing @endpoint VerkWeb.Endpoint end end setup _tags do - :ok end end diff --git a/test/test_helper.exs b/test/test_helper.exs index 6bd37e4..dc3f072 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -1,3 +1,2 @@ -ExUnit.start -Verk.Supervisor.start_link - +ExUnit.start() +Verk.Supervisor.start_link() diff --git a/test/views/error_view_test.exs b/test/views/error_view_test.exs index 5bf1829..31266b7 100644 --- a/test/views/error_view_test.exs +++ b/test/views/error_view_test.exs @@ -5,17 +5,14 @@ defmodule VerkWeb.ErrorViewTest do import Phoenix.View test "renders 404.html" do - assert render_to_string(VerkWeb.ErrorView, "404.html", []) == - "Page not found" + assert render_to_string(VerkWeb.ErrorView, "404.html", []) == "Page not found" end test "render 500.html" do - assert render_to_string(VerkWeb.ErrorView, "500.html", []) == - "Server internal error" + assert render_to_string(VerkWeb.ErrorView, "500.html", []) == "Server internal error" end test "render any other" do - assert render_to_string(VerkWeb.ErrorView, "505.html", []) == - "Server internal error" + assert render_to_string(VerkWeb.ErrorView, "505.html", []) == "Server internal error" end end diff --git a/test/views/layout_view_test.exs b/test/views/layout_view_test.exs index 999d858..4e85549 100644 --- a/test/views/layout_view_test.exs +++ b/test/views/layout_view_test.exs @@ -1,3 +1,3 @@ defmodule VerkWeb.LayoutViewTest do use VerkWeb.ConnCase, async: true -end \ No newline at end of file +end diff --git a/web/channels/room_channel.ex b/web/channels/room_channel.ex index ccffa77..97e1054 100644 --- a/web/channels/room_channel.ex +++ b/web/channels/room_channel.ex @@ -20,12 +20,12 @@ defmodule VerkWeb.RoomChannel do end def handle_info({:stats, stats}, socket) do - push socket, "job:stats", stats + push(socket, "job:stats", stats) {:noreply, socket} end def handle_info({:queue_status, msg}, socket) do - push socket, "queue:status", msg + push(socket, "queue:status", msg) {:noreply, socket} end diff --git a/web/channels/user_socket.ex b/web/channels/user_socket.ex index e449f36..7474ffe 100644 --- a/web/channels/user_socket.ex +++ b/web/channels/user_socket.ex @@ -2,7 +2,7 @@ defmodule VerkWeb.UserSocket do use Phoenix.Socket ## Channels - channel "rooms:*", VerkWeb.RoomChannel, websocket: true, longpoll: true + channel("rooms:*", VerkWeb.RoomChannel, websocket: true, longpoll: true) # Socket params are passed from the client and can # be used to verify and authenticate a user. After diff --git a/web/controllers/dead_controller.ex b/web/controllers/dead_controller.ex index fb6b321..536fc3b 100644 --- a/web/controllers/dead_controller.ex +++ b/web/controllers/dead_controller.ex @@ -5,26 +5,28 @@ defmodule VerkWeb.DeadController do require Logger def index(conn, params) do - paginator = VerkWeb.RangePaginator.new(DeadSet.count!, params["page"], params["per_page"]) + paginator = VerkWeb.RangePaginator.new(DeadSet.count!(), params["page"], params["per_page"]) - render conn, "index.html", + render(conn, "index.html", dead_jobs: DeadSet.range!(paginator.from, paginator.to), has_next: paginator.has_next, has_prev: paginator.has_prev, page: paginator.page, per_page: paginator.per_page + ) end - def destroy(conn, %{ "jobs_to_remove" => jobs_to_remove }) do + def destroy(conn, %{"jobs_to_remove" => jobs_to_remove}) do jobs_to_remove = jobs_to_remove || [] for job <- jobs_to_remove, do: DeadSet.delete_job!(job) - redirect conn, to: dead_path(conn, :index) + redirect(conn, to: dead_path(conn, :index)) end + def destroy(conn, _params) do - DeadSet.clear! + DeadSet.clear!() - redirect conn, to: dead_path(conn, :index) + redirect(conn, to: dead_path(conn, :index)) end end diff --git a/web/controllers/job_controller.ex b/web/controllers/job_controller.ex index 82813ee..2db44e9 100644 --- a/web/controllers/job_controller.ex +++ b/web/controllers/job_controller.ex @@ -1,13 +1,19 @@ defmodule VerkWeb.JobController do use VerkWeb.Web, :controller - def show(conn, %{ "queue" => queue, "job_id" => job_id }) do + def show(conn, %{"queue" => queue, "job_id" => job_id}) do case Verk.WorkersManager.inspect_worker(queue, job_id) do - {:ok, %{ info: info, job: job, process: process, started_at: started_at }} -> - render conn, "show.html", queue: queue, job_id: job_id, - job: job, info: info, - started_at: started_at, process: inspect(process) - { :error, _ } -> + {:ok, %{info: info, job: job, process: process, started_at: started_at}} -> + render(conn, "show.html", + queue: queue, + job_id: job_id, + job: job, + info: info, + started_at: started_at, + process: inspect(process) + ) + + {:error, _} -> conn |> put_status(:not_found) |> render(VerkWeb.ErrorView, "404.html") diff --git a/web/controllers/page_controller.ex b/web/controllers/page_controller.ex index 8445ac4..eca802d 100644 --- a/web/controllers/page_controller.ex +++ b/web/controllers/page_controller.ex @@ -3,6 +3,6 @@ defmodule VerkWeb.PageController do use VerkWeb.Web, :controller def index(conn, _params) do - render conn, "index.html" + render(conn, "index.html") end end diff --git a/web/controllers/queues_controller.ex b/web/controllers/queues_controller.ex index 3161423..2b08d6b 100644 --- a/web/controllers/queues_controller.ex +++ b/web/controllers/queues_controller.ex @@ -3,35 +3,40 @@ defmodule VerkWeb.QueuesController do use VerkWeb.Web, :controller def index(conn, params) do - render conn, "index.html", queue_stats: Verk.QueueStats.all(params["search"] || ""), - search: params["search"] + render(conn, "index.html", + queue_stats: Verk.QueueStats.all(params["search"] || ""), + search: params["search"] + ) end - def show(conn, %{ "queue" => queue }) do + def show(conn, %{"queue" => queue}) do params = conn.params - paginator = VerkWeb.RangePaginator.new(Verk.Queue.count!(queue), params["page"], params["per_page"]) - render conn, "show.html", + paginator = + VerkWeb.RangePaginator.new(Verk.Queue.count!(queue), params["page"], params["per_page"]) + + render(conn, "show.html", queue: queue, enqueued_jobs: Verk.Queue.range!(queue, paginator.from, paginator.to), has_next: paginator.has_next, has_prev: paginator.has_prev, page: paginator.page, per_page: paginator.per_page + ) end - def busy(conn, %{ "queue" => queue }) do + def busy(conn, %{"queue" => queue}) do running_jobs = Verk.WorkersManager.running_jobs(queue) - render conn, "busy.html", queue: queue, running_jobs: running_jobs + render(conn, "busy.html", queue: queue, running_jobs: running_jobs) end - def pause(conn, %{ "queue" => queue }) do - queue |> String.to_atom |> Verk.pause_queue - redirect conn, to: queues_path(conn, :index) + def pause(conn, %{"queue" => queue}) do + queue |> String.to_atom() |> Verk.pause_queue() + redirect(conn, to: queues_path(conn, :index)) end - def resume(conn, %{ "queue" => queue }) do - queue |> String.to_atom |> Verk.resume_queue - redirect conn, to: queues_path(conn, :index) + def resume(conn, %{"queue" => queue}) do + queue |> String.to_atom() |> Verk.resume_queue() + redirect(conn, to: queues_path(conn, :index)) end end diff --git a/web/controllers/retries_controller.ex b/web/controllers/retries_controller.ex index 7bca045..b90c7f9 100644 --- a/web/controllers/retries_controller.ex +++ b/web/controllers/retries_controller.ex @@ -5,35 +5,36 @@ defmodule VerkWeb.RetriesController do require Logger def index(conn, params) do - paginator = VerkWeb.RangePaginator.new(RetrySet.count!, params["page"], params["per_page"]) + paginator = VerkWeb.RangePaginator.new(RetrySet.count!(), params["page"], params["per_page"]) - render conn, "index.html", + render(conn, "index.html", failed_jobs: RetrySet.range_with_score!(paginator.from, paginator.to), has_next: paginator.has_next, has_prev: paginator.has_prev, page: paginator.page, per_page: paginator.per_page + ) end def destroy(conn, _params) do - RetrySet.clear! + RetrySet.clear!() - redirect conn, to: retries_path(conn, :index) + redirect(conn, to: retries_path(conn, :index)) end - def modify(conn, %{ "action" => "delete", "jobs_to_modify" => jobs_to_remove }) do + def modify(conn, %{"action" => "delete", "jobs_to_modify" => jobs_to_remove}) do jobs_to_remove = jobs_to_remove || [] for job <- jobs_to_remove, do: RetrySet.delete_job!(job) - redirect conn, to: retries_path(conn, :index) + redirect(conn, to: retries_path(conn, :index)) end - def modify(conn, %{ "action" => "requeue", "jobs_to_modify" => jobs_to_requeue }) do + def modify(conn, %{"action" => "requeue", "jobs_to_modify" => jobs_to_requeue}) do jobs_to_requeue = jobs_to_requeue || [] for job <- jobs_to_requeue, job != "", do: RetrySet.requeue_job!(job) - redirect conn, to: retries_path(conn, :index) + redirect(conn, to: retries_path(conn, :index)) end end diff --git a/web/controllers/scheduled_controller.ex b/web/controllers/scheduled_controller.ex index 098e47b..daedf18 100644 --- a/web/controllers/scheduled_controller.ex +++ b/web/controllers/scheduled_controller.ex @@ -5,36 +5,45 @@ defmodule VerkWeb.ScheduledController do @schedule_key "schedule" def index(conn, params) do - paginator = VerkWeb.RangePaginator.new(SortedSet.count!(@schedule_key, Redis), params["page"], params["per_page"]) - - render conn, "index.html", + paginator = + VerkWeb.RangePaginator.new( + SortedSet.count!(@schedule_key, Redis), + params["page"], + params["per_page"] + ) + + render(conn, "index.html", queue: @schedule_key, - scheduled_jobs: SortedSet.range_with_score!(@schedule_key, paginator.from, paginator.to, Redis), + scheduled_jobs: + SortedSet.range_with_score!(@schedule_key, paginator.from, paginator.to, Redis), has_next: paginator.has_next, has_prev: paginator.has_prev, page: paginator.page, per_page: paginator.per_page + ) end def destroy(conn, _params) do Verk.SortedSet.clear!(@schedule_key, Verk.Redis) - redirect conn, to: scheduled_path(conn, :index) + redirect(conn, to: scheduled_path(conn, :index)) end - def modify(conn, %{ "action" => "delete", "jobs_to_modify" => jobs_to_remove }) do + def modify(conn, %{"action" => "delete", "jobs_to_modify" => jobs_to_remove}) do jobs_to_remove = jobs_to_remove || [] for job <- jobs_to_remove, do: SortedSet.delete_job!(@schedule_key, job, Redis) - redirect conn, to: scheduled_path(conn, :index) + redirect(conn, to: scheduled_path(conn, :index)) end - def modify(conn, %{ "action" => "requeue", "jobs_to_modify" => jobs_to_requeue }) do + def modify(conn, %{"action" => "requeue", "jobs_to_modify" => jobs_to_requeue}) do jobs_to_requeue = jobs_to_requeue || [] - for job <- jobs_to_requeue, job != "", do: Verk.SortedSet.requeue_job!(@schedule_key, job, Redis) + for job <- jobs_to_requeue, + job != "", + do: Verk.SortedSet.requeue_job!(@schedule_key, job, Redis) - redirect conn, to: scheduled_path(conn, :index) + redirect(conn, to: scheduled_path(conn, :index)) end end diff --git a/web/router.ex b/web/router.ex index bc7e7f9..3940846 100644 --- a/web/router.ex +++ b/web/router.ex @@ -2,34 +2,35 @@ defmodule VerkWeb.Router do use VerkWeb.Web, :router pipeline :browser do - plug :accepts, ["html"] - plug :fetch_session - plug :fetch_flash - plug :protect_from_forgery - plug :put_secure_browser_headers + plug(:accepts, ["html"]) + plug(:fetch_session) + plug(:fetch_flash) + plug(:protect_from_forgery) + plug(:put_secure_browser_headers) end pipeline :api do - plug :accepts, ["json"] + plug(:accepts, ["json"]) end scope "/", VerkWeb do - pipe_through :browser # Use the default browser stack + # Use the default browser stack + pipe_through(:browser) - get "/", PageController, :index - get "/queues", QueuesController, :index - get "/queues/:queue", QueuesController, :show - post "/queues/:queue/pause", QueuesController, :pause - post "/queues/:queue/resume", QueuesController, :resume - get "/queues/:queue/busy", QueuesController, :busy - get "/queues/:queue/jobs/:job_id", JobController, :show - get "/retries", RetriesController, :index - post "/retries", RetriesController, :modify - delete "/retries", RetriesController, :destroy - get "/scheduled", ScheduledController, :index - post "/scheduled", ScheduledController, :modify - delete "/scheduled", ScheduledController, :destroy - get "/dead", DeadController, :index - delete "/dead", DeadController, :destroy + get("/", PageController, :index) + get("/queues", QueuesController, :index) + get("/queues/:queue", QueuesController, :show) + post("/queues/:queue/pause", QueuesController, :pause) + post("/queues/:queue/resume", QueuesController, :resume) + get("/queues/:queue/busy", QueuesController, :busy) + get("/queues/:queue/jobs/:job_id", JobController, :show) + get("/retries", RetriesController, :index) + post("/retries", RetriesController, :modify) + delete("/retries", RetriesController, :destroy) + get("/scheduled", ScheduledController, :index) + post("/scheduled", ScheduledController, :modify) + delete("/scheduled", ScheduledController, :destroy) + get("/dead", DeadController, :index) + delete("/dead", DeadController, :destroy) end end diff --git a/web/views/dead_view.ex b/web/views/dead_view.ex index cdc192f..9761653 100644 --- a/web/views/dead_view.ex +++ b/web/views/dead_view.ex @@ -2,7 +2,7 @@ defmodule VerkWeb.DeadView do use VerkWeb.Web, :view def jobs(dead_jobs) do - Enum.map dead_jobs, fn dead_job -> + Enum.map(dead_jobs, fn dead_job -> %{ jid: dead_job.jid, retry_count: dead_job.retry_count, @@ -11,6 +11,6 @@ defmodule VerkWeb.DeadView do original_json: dead_job.original_json, job: dead_job } - end + end) end end diff --git a/web/views/error_helpers.ex b/web/views/error_helpers.ex index 2f006c5..ccdfc54 100644 --- a/web/views/error_helpers.ex +++ b/web/views/error_helpers.ex @@ -10,7 +10,7 @@ defmodule VerkWeb.ErrorHelpers do """ def error_tag(form, field) do if error = form.errors[field] do - content_tag :span, translate_error(error), class: "help-block" + content_tag(:span, translate_error(error), class: "help-block") end end diff --git a/web/views/error_view.ex b/web/views/error_view.ex index 2f45f98..d77604b 100644 --- a/web/views/error_view.ex +++ b/web/views/error_view.ex @@ -12,6 +12,6 @@ defmodule VerkWeb.ErrorView do # In case no render clause matches or no # template is found, let's render it as 500 def template_not_found(_template, assigns) do - render "500.html", assigns + render("500.html", assigns) end end diff --git a/web/views/helpers/queues_helpers.ex b/web/views/helpers/queues_helpers.ex index 3102a4a..9ab9f03 100644 --- a/web/views/helpers/queues_helpers.ex +++ b/web/views/helpers/queues_helpers.ex @@ -3,8 +3,11 @@ defmodule VerkWeb.Queue.Helpers do import VerkWeb.Router.Helpers def pause_button(conn, queue, :paused) do - button "Resume", to: queues_path(conn, :resume, queue), class: "btn btn-sm" + button("Resume", to: queues_path(conn, :resume, queue), class: "btn btn-sm") end + def pause_button(_conn, _queue, :pausing), do: "Pausing..." - def pause_button(conn, queue, _), do: button "Pause", to: queues_path(conn, :pause, queue), class: "btn btn-sm" + + def pause_button(conn, queue, _), + do: button("Pause", to: queues_path(conn, :pause, queue), class: "btn btn-sm") end diff --git a/web/views/job_view.ex b/web/views/job_view.ex index 2a11355..6972362 100644 --- a/web/views/job_view.ex +++ b/web/views/job_view.ex @@ -7,11 +7,11 @@ defmodule VerkWeb.JobView do def current_stacktrace(process_info) do info(process_info, :current_stacktrace) - |> Exception.format_stacktrace - |> Phoenix.HTML.Format.text_to_html + |> Exception.format_stacktrace() + |> Phoenix.HTML.Format.text_to_html() end def utc_format(time) do - time |> DateTime.to_string + time |> DateTime.to_string() end end diff --git a/web/views/layout_view.ex b/web/views/layout_view.ex index 971a775..9bfb426 100644 --- a/web/views/layout_view.ex +++ b/web/views/layout_view.ex @@ -13,9 +13,9 @@ defmodule VerkWeb.LayoutView do """ def js_view_name(conn, view_template) do [view_name(conn), template_name(view_template)] - |> Enum.reverse + |> Enum.reverse() |> Enum.map(&String.capitalize/1) - |> Enum.reverse + |> Enum.reverse() |> Enum.join("") end @@ -24,7 +24,7 @@ defmodule VerkWeb.LayoutView do defp view_name(conn) do conn |> view_module - |> Phoenix.Naming.resource_name + |> Phoenix.Naming.resource_name() |> String.replace("_view", "") end diff --git a/web/views/page_view.ex b/web/views/page_view.ex index 2a58a2e..02bd62b 100644 --- a/web/views/page_view.ex +++ b/web/views/page_view.ex @@ -2,26 +2,26 @@ defmodule VerkWeb.PageView do use VerkWeb.Web, :view def stats(queues_stats) do - Enum.map queues_stats, fn queue_stats -> + Enum.map(queues_stats, fn queue_stats -> Map.put(queue_stats, :enqueued_counter, Verk.Queue.count!(queue_stats.queue)) |> Map.merge(Verk.Stats.queue_total(queue_stats.queue)) - end + end) end def total_processed do - Verk.Stats.total.processed + Verk.Stats.total().processed end def total_failed do - Verk.Stats.total.failed + Verk.Stats.total().failed end def retries_count do - Verk.RetrySet.count! + Verk.RetrySet.count!() end def dead_count do - Verk.DeadSet.count! + Verk.DeadSet.count!() end def uptime do diff --git a/web/views/queues_view.ex b/web/views/queues_view.ex index 990cf1a..40103cb 100644 --- a/web/views/queues_view.ex +++ b/web/views/queues_view.ex @@ -2,33 +2,34 @@ defmodule VerkWeb.QueuesView do use VerkWeb.Web, :view def stats(queues_stats) do - Enum.map queues_stats, fn queue_stats -> + Enum.map(queues_stats, fn queue_stats -> Map.put(queue_stats, :enqueued_counter, Verk.Queue.count!(queue_stats.queue)) |> Map.merge(Verk.Stats.queue_total(queue_stats.queue)) - end + end) end def enqueued_jobs(jobs) do - Enum.map jobs, fn job -> + Enum.map(jobs, fn job -> %{ jid: job.jid, class: job.class, args: job.args |> inspect, job: job } - end + end) end def jobs(running_jobs) do - Enum.map running_jobs, fn running_job -> + Enum.map(running_jobs, fn running_job -> job = running_job.job + %{ jid: job.jid, - started_at: running_job.started_at |> DateTime.to_string, + started_at: running_job.started_at |> DateTime.to_string(), class: job.class, args: job.args |> inspect, job: job } - end + end) end end diff --git a/web/views/retries_view.ex b/web/views/retries_view.ex index 83b0532..729dc21 100644 --- a/web/views/retries_view.ex +++ b/web/views/retries_view.ex @@ -2,16 +2,16 @@ defmodule VerkWeb.RetriesView do use VerkWeb.Web, :view def jobs(failed_jobs) do - Enum.map failed_jobs, fn {failed_job, score} -> + Enum.map(failed_jobs, fn {failed_job, score} -> %{ jid: failed_job.jid, retry_count: failed_job.retry_count, - score: score |> Timex.from_unix |> Timex.format!("{relative}", :relative), + score: score |> Timex.from_unix() |> Timex.format!("{relative}", :relative), class: failed_job.class, args: failed_job.args |> inspect, original_json: failed_job.original_json, job: failed_job } - end + end) end end diff --git a/web/views/scheduled_view.ex b/web/views/scheduled_view.ex index d35a561..56941bf 100644 --- a/web/views/scheduled_view.ex +++ b/web/views/scheduled_view.ex @@ -2,7 +2,7 @@ defmodule VerkWeb.ScheduledView do use VerkWeb.Web, :view def scheduled_jobs(jobs) do - Enum.map jobs, fn {job, perform_at} -> + Enum.map(jobs, fn {job, perform_at} -> %{ perform_at: Timex.from_unix(perform_at), queue: job.queue, @@ -11,7 +11,7 @@ defmodule VerkWeb.ScheduledView do args: job.args |> inspect, job: job } - end + end) end def perform_at(datetime) do diff --git a/web/views/shared_view.ex b/web/views/shared_view.ex index 86885ab..0f60b63 100644 --- a/web/views/shared_view.ex +++ b/web/views/shared_view.ex @@ -2,11 +2,13 @@ defmodule VerkWeb.SharedView do use VerkWeb.Web, :view def enqueued_at(nil), do: "N/A" + def enqueued_at(timestamp) do - timestamp |> round |> Timex.from_unix |> Timex.format!("{relative}", :relative) + timestamp |> round |> Timex.from_unix() |> Timex.format!("{relative}", :relative) end def error_backtrace(nil), do: "N/A" + def error_backtrace(string) do Regex.replace(~r( {2,}), string, "") end From 43dc6beafb8985e0c918474a7d0ab120cfb3f26f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Zapa=C5=9Bnik?= Date: Wed, 10 Apr 2019 23:25:03 +0200 Subject: [PATCH 2/2] Add code formatting check to travis --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index c6880ed..0cffafa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,7 @@ elixir: otp_release: - 21.0 script: + - if [[ `elixir -v` = *"1.7"* ]]; then mix format --check-formatted; fi - MIX_ENV=test mix test --trace --cover services: - redis-server