Packages
oban
2.20.2
2.23.0
2.22.1
2.22.0
2.21.1
2.21.0
2.20.3
2.20.2
2.20.1
2.20.0
2.19.4
2.19.3
2.19.2
2.19.1
2.19.0
2.18.3
2.18.2
2.18.1
2.18.0
2.17.12
2.17.11
2.17.10
2.17.9
2.17.8
2.17.7
2.17.6
2.17.5
2.17.4
2.17.3
2.17.2
2.17.1
2.17.0
2.16.3
2.16.2
2.16.1
2.16.0
2.15.4
2.15.3
2.15.2
2.15.1
2.15.0
2.14.2
2.14.1
2.14.0
2.13.6
2.13.5
2.13.4
2.13.3
2.13.2
2.13.1
2.13.0
2.12.1
2.12.0
2.11.3
2.11.2
2.11.1
2.11.0
2.10.1
2.10.0
retired
2.9.2
2.9.1
2.9.0
2.8.0
2.7.2
2.7.1
2.7.0
2.6.1
2.6.0
2.5.0
2.4.3
2.4.2
2.4.1
2.4.0
2.3.4
2.3.3
2.3.2
2.3.1
2.3.0
2.2.0
2.1.0
2.0.0
2.0.0-rc.3
2.0.0-rc.2
2.0.0-rc.1
2.0.0-rc.0
1.2.0
1.1.0
1.0.0
1.0.0-rc.2
1.0.0-rc.1
0.12.1
0.12.0
0.11.1
0.11.0
0.10.1
0.10.0
0.9.0
0.8.1
0.8.0
0.7.1
0.7.0
0.6.0
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
Robust job processing, backed by modern PostgreSQL, SQLite3, and MySQL.
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/oban.install.ex
defmodule Mix.Tasks.Oban.Install.Docs do
@moduledoc false
def short_doc do
"Install and configure Oban for use in an application."
end
def example do
"mix oban.install"
end
def long_doc do
"""
Install and configure Oban for use in an application.
## Example
Install using the default Ecto repo and matching engine:
```bash
mix oban.install
```
Specify a `SQLite3` repo and `Lite` engine explicitly:
```bash
mix oban.install --repo MyApp.LiteRepo --engine Oban.Engines.Lite
```
## Options
* `--engine` or `-e` — Select the engine for your repo, defaults to `Oban.Engines.Postgres`
* `--notifier` or `-n` — Select the pubsub notifier, defaults to `Oban.Notifiers.Postgres`
* `--repo` or `-r` — Specify an Ecto repo for Oban to use
"""
end
end
if Code.ensure_loaded?(Igniter) do
defmodule Mix.Tasks.Oban.Install do
@shortdoc __MODULE__.Docs.short_doc()
@moduledoc __MODULE__.Docs.long_doc()
use Igniter.Mix.Task
@known_repos [Ecto.Repo, AshPostgres.Repo, AshSqlite.Repo]
@impl Igniter.Mix.Task
def info(_argv, _composing_task) do
%Igniter.Mix.Task.Info{
group: :oban,
adds_deps: [],
installs: [],
example: __MODULE__.Docs.example(),
only: nil,
positional: [],
composes: [],
schema: [engine: :string, notifier: :string, repo: :string],
defaults: [],
aliases: [e: :engine, n: :notifier, r: :repo],
required: []
}
end
@impl Igniter.Mix.Task
def igniter(igniter) do
app_name = Igniter.Project.Application.app_name(igniter)
opts = igniter.args.options
case extract_repo(igniter, app_name, opts[:repo]) do
{:ok, repo, adapter} ->
engine = parse_engine(adapter, opts[:engine])
notifier = parse_notifier(adapter, opts[:notifier])
conf_code = [engine: engine, notifier: notifier, queues: [default: 10], repo: repo]
test_code = [testing: :manual]
tree_code =
quote do
Application.fetch_env!(unquote(app_name), Oban)
end
migration = """
def up, do: Oban.Migration.up()
def down, do: Oban.Migration.down(version: 1)
"""
igniter
|> Igniter.Project.Config.configure_new(
"config.exs",
app_name,
[Oban],
{:code, conf_code}
)
|> Igniter.Project.Config.configure_new(
"test.exs",
app_name,
[Oban],
{:code, test_code}
)
|> Igniter.Project.Application.add_new_child({Oban, {:code, tree_code}}, after: [repo])
|> Igniter.Project.Formatter.import_dep(:oban)
|> Igniter.Libs.Ecto.gen_migration(repo, "add_oban", body: migration, on_exists: :skip)
{:error, igniter} ->
igniter
end
end
defp extract_repo(igniter, app_name, nil) do
case Igniter.Libs.Ecto.list_repos(igniter) do
{igniter, [repo | _]} ->
{:ok, repo, extract_adapter(igniter, repo)}
_ ->
issue = """
No ecto repos found for #{inspect(app_name)}.
Ensure `:ecto` is installed and configured for the current application.
"""
{:error, Igniter.add_issue(igniter, issue)}
end
end
defp extract_repo(igniter, _app_name, module) do
repo = Igniter.Project.Module.parse(module)
case Igniter.Project.Module.module_exists(igniter, repo) do
{true, igniter} ->
{:ok, repo, extract_adapter(igniter, repo)}
{false, _} ->
{:error, Igniter.add_issue(igniter, "Provided repo (#{inspect(repo)}) doesn't exist")}
end
end
defp extract_adapter(igniter, repo) do
with {:ok, {_, _, zipper}} <- Igniter.Project.Module.find_module(igniter, repo),
{:ok, zipper} <- Igniter.Code.Module.move_to_module_using(zipper, @known_repos) do
extract_adapter_from_repo(@known_repos, zipper)
end
end
defp extract_adapter_from_repo([], _zipper), do: Ecto.Adapters.Postgres
defp extract_adapter_from_repo([Ecto.Repo | tail], zipper) do
with {:ok, zipper} <- Igniter.Code.Module.move_to_use(zipper, Ecto.Repo),
{:ok, zipper} <- Igniter.Code.Function.move_to_nth_argument(zipper, 1),
{:ok, zipper} <- Igniter.Code.Keyword.get_key(zipper, :adapter),
{:ok, adapter} <- Igniter.Code.Common.expand_literal(zipper) do
adapter
else
_ -> extract_adapter_from_repo(tail, zipper)
end
end
defp extract_adapter_from_repo([AshPostgres.Repo | tail], zipper) do
case Igniter.Code.Module.move_to_use(zipper, AshPostgres.Repo) do
{:ok, _zipper} -> Ecto.Adapters.Postgres
_ -> extract_adapter_from_repo(tail, zipper)
end
end
defp extract_adapter_from_repo([AshSqlite.Repo | tail], zipper) do
case Igniter.Code.Module.move_to_use(zipper, AshSqlite.Repo) do
{:ok, _zipper} -> Ecto.Adapters.SQLite3
_ -> extract_adapter_from_repo(tail, zipper)
end
end
defp parse_engine(adapter, nil) do
case adapter do
Ecto.Adapters.Postgres -> Oban.Engines.Basic
Ecto.Adapters.MyXQL -> Oban.Engines.Dolphin
Ecto.Adapters.SQLite3 -> Oban.Engines.Lite
end
end
defp parse_engine(_, module), do: Igniter.Project.Module.parse(module)
defp parse_notifier(adapter, nil) do
case adapter do
Ecto.Adapters.Postgres -> Oban.Notifiers.Postgres
_ -> Oban.Notifiers.PG
end
end
defp parse_notifier(_, module), do: Igniter.Project.Module.parse(module)
end
else
defmodule Mix.Tasks.Oban.Install do
@shortdoc "Install `igniter` in order to install Oban."
@moduledoc __MODULE__.Docs.long_doc()
use Mix.Task
def run(_argv) do
Mix.shell().error("""
The task 'oban.install' requires igniter. Please install igniter and try again.
For more information, see: https://hexdocs.pm/igniter/readme.html#installation
""")
exit({:shutdown, 1})
end
end
end