Packages
quantum
2.0.0-beta.1
3.5.3
3.5.2
retired
3.5.1
retired
3.5.0
3.4.0
3.3.0
3.2.0
3.1.0
3.0.2
3.0.1
3.0.0
3.0.0-rc.3
3.0.0-rc.2
3.0.0-rc.1
2.4.0
2.3.4
2.3.3
2.3.2
2.3.1
retired
2.3.0
retired
2.2.7
2.2.6
2.2.5
retired
2.2.4
retired
2.2.3
retired
2.2.2
retired
2.2.1
retired
2.2.0
retired
2.1.3
retired
2.1.2
retired
2.1.1
retired
2.1.0
retired
2.1.0-beta.1
retired
2.0.4
retired
2.0.3
retired
2.0.2
retired
2.0.1
retired
2.0.0
retired
2.0.0-beta.2
retired
2.0.0-beta.1
retired
1.9.3
retired
1.9.2
retired
1.9.1
retired
1.9.0
retired
1.8.1
retired
1.8.0
retired
1.7.1
retired
1.7.0
retired
1.6.1
retired
1.6.0
retired
1.5.0
retired
1.4.0
retired
1.3.2
retired
1.3.1
retired
1.3.0
retired
1.2.4
retired
1.2.3
retired
1.2.2
retired
1.2.1
retired
1.2.0
retired
1.1.0
retired
1.0.4
retired
1.0.3
retired
1.0.2
retired
1.0.1
retired
1.0.0
retired
Cron-like job scheduler for Elixir.
Retired package: It is possible that tasks are skipped if the execution takes too long
Current section
Files
Jump to
Current section
Files
lib/quantum/normalizer.ex
defmodule Quantum.Normalizer do
@moduledoc """
Normalize Config values into a `Quantum.Job`.
"""
alias Quantum.Job
alias Crontab.CronExpression.Parser, as: CronExpressionParser
@fields [:name,
:schedule,
:task,
:overlap,
:run_strategy]
@type config_short_notation :: {config_schedule, config_task}
# TODO: remove any and fix dialyzer
@type config_full_notation :: {config_name | nil, Keyword.t | struct | any}
@typep field :: :name | :schedule | :task | :overlap
@type config_schedule :: Crontab.CronExpression.t | String.t | {:cron, String.t} | {:extended, String.t}
@type config_task :: {module, fun, [any]} | (() -> any)
@type config_name :: String.t | atom
@doc """
Normalize Config Input into `Quantum.Job`.
### Parameters:
* `base` - Empty `Quantum.Job`
* `job` - The Job To Normalize
"""
@spec normalize(Job.t, config_full_notation | config_short_notation) :: Quantum.Job.t
def normalize(base, job) when is_list(job) do
normalize(base, {Keyword.get(job, :name), job})
end
def normalize(base, {job_name, opts}) when is_list(opts) do
opts = opts
|> Enum.reduce(%{}, fn {key, value}, acc -> Map.put(acc, key, value) end)
normalize(base, {job_name, opts})
end
def normalize(base, {job_name, opts}) when is_map(opts) do
opts = Map.put(opts, :name, job_name)
base
|> normalize_options(opts, @fields)
end
def normalize(base, {schedule, task}) do
normalize(base, {nil, %{schedule: normalize_schedule(schedule), task: normalize_task(task)}})
end
@spec normalize_options(Quantum.Job.t, struct, [field]) :: Quantum.Job.t
defp normalize_options(job, options = %{name: name}, [:name | tail]) do
normalize_options(Job.set_name(job, normalize_name(name)), options, tail)
end
defp normalize_options(job, options, [:name | tail]) do
normalize_options(job, options, tail)
end
defp normalize_options(job, options = %{schedule: schedule}, [:schedule | tail]) do
normalize_options(Job.set_schedule(job, normalize_schedule(schedule)), options, tail)
end
defp normalize_options(job, options, [:schedule | tail]) do
normalize_options(job, options, tail)
end
defp normalize_options(job, options = %{task: task}, [:task | tail]) do
normalize_options(Job.set_task(job, normalize_task(task)), options, tail)
end
defp normalize_options(job, options, [:task | tail]) do
normalize_options(job, options, tail)
end
defp normalize_options(job, options = %{run_strategy: run_strategy}, [:run_strategy | tail]) do
normalize_options(Job.set_run_strategy(job, normalize_run_strategy(run_strategy)), options, tail)
end
defp normalize_options(job, options, [:run_strategy | tail]) do
normalize_options(job, options, tail)
end
defp normalize_options(job, options = %{overlap: overlap}, [:overlap | tail]) do
normalize_options(Job.set_overlap(job, overlap), options, tail)
end
defp normalize_options(job, options, [:overlap | tail]) do
normalize_options(job, options, tail)
end
defp normalize_options(job, _, []), do: job
@spec normalize_task(config_task) :: Job.task
defp normalize_task({mod, fun, args}), do: {mod, fun, args}
defp normalize_task(fun) when is_function(fun, 0), do: fun
defp normalize_task(fun) when is_function(fun), do: raise "Only 0 arity functions are supported via the short syntax."
@doc false
@spec normalize_schedule(config_schedule) :: Job.schedule
def normalize_schedule(e = %Crontab.CronExpression{}), do: e
def normalize_schedule(e) when is_binary(e), do: e |> String.downcase |> CronExpressionParser.parse!
def normalize_schedule({:cron, e}) when is_binary(e), do: e |> String.downcase |> CronExpressionParser.parse!
def normalize_schedule({:extended, e}) when is_binary(e), do: e |> String.downcase |> CronExpressionParser.parse!(true)
@spec normalize_name(atom | String.t) :: atom
defp normalize_name(name) when is_binary(name), do: String.to_atom(name)
defp normalize_name(name) when is_atom(name), do: name
@spec normalize_run_strategy({Module.t, any}) :: Quantum.RunStrategy.NodeList
defp normalize_run_strategy({strategy, options}) when is_atom(strategy) do
strategy.normalize_config!(options)
end
end