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

akira / exq / 16bf7540e38e434e6ed4fadc1f40894960dd12db-PR-500

07 Aug 2025 11:50AM UTC coverage: 90.805% (-1.6%) from 92.382%
16bf7540e38e434e6ed4fadc1f40894960dd12db-PR-500

Pull #500

github

ananthakumaran
Run coveralls on one build only
Pull Request #500: Add ability to snooze job

15 of 15 new or added lines in 2 files covered. (100.0%)

18 existing lines in 13 files now uncovered.

1195 of 1316 relevant lines covered (90.81%)

706.93 hits per line

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

81.82
/lib/exq/middleware/server.ex
1
defmodule Exq.Middleware.Server do
2
  @moduledoc """
3
  Middleware Server is responsible for storing middleware chain that is evaluated
4
  when performing particular job.
5

6
  Middleware chain defaults to Stats, Job and Manager middlewares.
7

8
  To push new middleware you must create module with common interface. Interface is similar to `Plug`
9
  implementation. It has three functions, every function receives `Exq.Middlewares.Pipeline` structure
10
  and every function must return the same structure, modified or not.
11

12
  Basically, `before_work/1` function may update worker state, while `after_processed_work/1` and
13
  `after_failed_work/1` are for cleanup and notification stuff.
14

15
  For example, here is a valid middleware module:
16

17
      defmodule MyMiddleware do
18
        @behaiour Exq.Middleware.Behaviour
19

20
        def before_work(pipeline) do
21
          # some functionality goes here...
22
          pipeline
23
        end
24

25
        def after_processed_work(pipeline) do
26
          # some functionality goes here...
27
          pipeline
28
        end
29

30
        def after_failed_work(pipeline) do
31
          # some functionality goes here...
32
          pipeline
33
        end
34
      end
35

36
  To add this module to middleware chain:
37

38
      Exq.Middleware.Server.push(middleware_server_pid, MyMiddleware)
39

40
  """
41

42
  use GenServer
43

44
  @doc """
45
  Starts middleware server.
46
  """
47
  def start_link(opts \\ []) do
48
    GenServer.start_link(__MODULE__, default_middleware(opts), name: server_name(opts[:name]))
122✔
49
  end
50

51
  @doc """
52
  Adds specified `middleware` module into the end of middleware list.
53

54
  `middleware` should have `Exq.Middleware.Behaviour` behaviour.
55
  """
56
  def push(pid, middleware) do
57
    GenServer.cast(pid, {:push, middleware})
94✔
58
  end
59

60
  @doc """
61
  Retrieves list of middleware modules.
62
  """
63
  def all(pid) do
64
    GenServer.call(pid, :all)
1,333✔
65
  end
66

67
  @doc """
68
  Returns middleware server name.
69
  """
70
  def server_name(name) do
71
    name = name || Exq.Support.Config.get(:name)
249✔
72
    "#{name}.Middleware.Server" |> String.to_atom()
249✔
73
  end
74

75
  @doc false
UNCOV
76
  def terminate(_reason, _state) do
×
77
    :ok
78
  end
79

80
  ## ===========================================================
81
  ## GenServer callbacks
82
  ## ===========================================================
83

84
  def handle_cast({:push, middleware}, state) do
94✔
85
    {:noreply, List.insert_at(state, -1, middleware)}
86
  end
87

88
  def handle_call(:all, _from, state) do
89
    {:reply, state, state}
1,333✔
90
  end
91

92
  def init(args) do
145✔
93
    {:ok, args}
94
  end
95

96
  ## ===========================================================
97
  ## Internal Functions
98
  ## ===========================================================
99

UNCOV
100
  defp default_middleware([]), do: []
×
101
  defp default_middleware(opts), do: opts[:default_middleware]
122✔
102
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

© 2025 Coveralls, Inc