Skip to content

Commit 7e39d20

Browse files
authored
Job Config Options (#500)
1 parent 77db89e commit 7e39d20

File tree

4 files changed

+54
-35
lines changed

4 files changed

+54
-35
lines changed

lib/quantum.ex

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,16 @@ defmodule Quantum do
225225

226226
@doc """
227227
Creates a new Job. The job can be added by calling `add_job/1`.
228+
229+
## Supported options
230+
231+
* `name` - see `Quantum.Job.set_name/2`
232+
* `overlap` - see `Quantum.Job.set_overlap/2`
233+
* `run_strategy` - see `Quantum.Job.set_run_strategy/2`
234+
* `schedule` - see `Quantum.Job.set_schedule/2`
235+
* `state` - see `Quantum.Job.set_state/2`
236+
* `task` - see `Quantum.Job.set_task/2`
237+
* `timezone` - see `Quantum.Job.set_timezone/2`
228238
"""
229239
@callback new_job(opts :: Keyword.t()) :: Quantum.Job.t()
230240

@@ -296,7 +306,7 @@ defmodule Quantum do
296306
|> Kernel.then(fn config ->
297307
Keyword.update(config, :jobs, [], fn jobs ->
298308
jobs
299-
|> Enum.map(&Normalizer.normalize(scheduler.new_job(config), &1))
309+
|> Enum.map(&Normalizer.normalize(scheduler.__new_job__([], config), &1))
300310
|> remove_jobs_with_duplicate_names(scheduler)
301311
end)
302312
end)
@@ -376,7 +386,20 @@ defmodule Quantum do
376386
end
377387

378388
@impl behaviour
379-
def new_job(config \\ config()), do: Job.new(config)
389+
def new_job(opts \\ []), do: __new_job__(opts, config())
390+
391+
@doc false
392+
def __new_job__(opts, config) do
393+
config
394+
|> Keyword.take([:overlap, :schedule, :state, :timezone, :run_strategy])
395+
|> Keyword.merge(opts)
396+
|> Keyword.update!(:run_strategy, fn
397+
{module, options} when is_atom(module) -> module.normalize_config!(options)
398+
module when is_atom(module) -> module.normalize_config!(nil)
399+
%_struct{} = run_strategy -> run_strategy
400+
end)
401+
|> Job.new()
402+
end
380403

381404
@impl behaviour
382405
def deactivate_job(server \\ __job_broadcaster__(), name)

lib/quantum/job.ex

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -42,30 +42,26 @@ defmodule Quantum.Job do
4242
}
4343

4444
# Takes some config from a scheduler and returns a new job
45+
# Do not use directly, use `Scheduler.new_job/1` instead.
46+
@doc false
4547
@spec new(config :: Keyword.t()) :: t
4648
def new(config) do
47-
{run_strategy_name, options} =
48-
case Keyword.fetch!(config, :run_strategy) do
49-
{module, option} -> {module, option}
50-
module -> {module, nil}
49+
Enum.reduce(
50+
[
51+
{&set_name/2, Keyword.get(config, :name, make_ref())},
52+
{&set_overlap/2, Keyword.fetch!(config, :overlap)},
53+
{&set_run_strategy/2, Keyword.fetch!(config, :run_strategy)},
54+
{&set_schedule/2, Keyword.get(config, :schedule)},
55+
{&set_state/2, Keyword.fetch!(config, :state)},
56+
{&set_task/2, Keyword.get(config, :task)},
57+
{&set_timezone/2, Keyword.fetch!(config, :timezone)}
58+
],
59+
%__MODULE__{name: nil, run_strategy: nil, overlap: nil, timezone: nil},
60+
fn
61+
{_fun, nil}, acc -> acc
62+
{fun, value}, acc -> fun.(acc, value)
5163
end
52-
53-
with run_strategy <- run_strategy_name.normalize_config!(options),
54-
name <- make_ref(),
55-
overlap when is_boolean(overlap) <- Keyword.fetch!(config, :overlap),
56-
timezone when timezone == :utc or is_binary(timezone) <-
57-
Keyword.fetch!(config, :timezone),
58-
state when is_atom(state) <- Keyword.fetch!(config, :state),
59-
schedule <- Keyword.get(config, :schedule) do
60-
%__MODULE__{
61-
name: name,
62-
overlap: Keyword.fetch!(config, :overlap),
63-
timezone: Keyword.fetch!(config, :timezone),
64-
run_strategy: run_strategy,
65-
schedule: schedule,
66-
state: state
67-
}
68-
end
64+
)
6965
end
7066

7167
@doc """
@@ -86,6 +82,7 @@ defmodule Quantum.Job do
8682
"""
8783
@spec set_name(t, atom) :: t
8884
def set_name(%__MODULE__{} = job, name) when is_atom(name), do: Map.put(job, :name, name)
85+
def set_name(%__MODULE__{} = job, name) when is_reference(name), do: Map.put(job, :name, name)
8986

9087
@doc """
9188
Sets a job's schedule.

test/quantum/run_strategy_test.exs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,22 @@ defmodule Quantum.RunStrategyTest do
1111
end
1212

1313
test "run strategy local" do
14-
job = Job.new(Scheduler.config(run_strategy: Quantum.RunStrategy.Local))
14+
job = Scheduler.new_job(run_strategy: Quantum.RunStrategy.Local)
1515
assert %Job{} = job
1616
assert [Node.self()] == NodeList.nodes(job.run_strategy, job)
1717
end
1818

1919
test "run strategy random" do
2020
node_list = [:node1, :node2]
21-
job = Job.new(Scheduler.config(run_strategy: {Quantum.RunStrategy.Random, node_list}))
21+
job = Scheduler.new_job(run_strategy: {Quantum.RunStrategy.Random, node_list})
2222
assert [node] = NodeList.nodes(job.run_strategy, job)
2323
assert Enum.member?(node_list, node)
2424
end
2525

2626
test "run strategy all" do
2727
node_list = [:node1, :node2]
28-
job = Job.new(Scheduler.config(run_strategy: {Quantum.RunStrategy.All, node_list}))
28+
29+
job = Scheduler.new_job(run_strategy: {Quantum.RunStrategy.All, node_list})
2930
assert [:node1, :node2] == NodeList.nodes(job.run_strategy, job)
3031
end
3132
end

test/quantum_startup_test.exs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ defmodule QuantumStartupTest do
1010
defmodule Scheduler do
1111
@moduledoc false
1212

13-
use Quantum, otp_app: :quantum_startup_test
13+
use Quantum, otp_app: :quantum
1414
end
1515

1616
@tag :startup
@@ -24,17 +24,15 @@ defmodule QuantumStartupTest do
2424
{"4 * * * *", fn -> :ok end}
2525
]
2626

27-
Application.put_env(:quantum_startup_test, QuantumStartupTest.Scheduler, jobs: test_jobs)
27+
Application.put_env(:quantum, QuantumStartupTest.Scheduler, jobs: test_jobs)
2828

29-
capture_log(fn ->
30-
{:ok, _pid} = start_supervised(Scheduler)
29+
start_supervised!(Scheduler)
3130

32-
assert Enum.count(QuantumStartupTest.Scheduler.jobs()) == 4
33-
assert QuantumStartupTest.Scheduler.find_job(:test_job).schedule == ~e[1 * * * *]
34-
assert QuantumStartupTest.Scheduler.find_job(:inactive_job).state == :inactive
31+
assert Enum.count(QuantumStartupTest.Scheduler.jobs()) == 4
32+
assert QuantumStartupTest.Scheduler.find_job(:test_job).schedule == ~e[1 * * * *]
33+
assert QuantumStartupTest.Scheduler.find_job(:inactive_job).state == :inactive
3534

36-
:ok = stop_supervised(Scheduler)
37-
end)
35+
:ok = stop_supervised(Scheduler)
3836
end)
3937
end
4038
end

0 commit comments

Comments
 (0)