defmodule Divo do
@moduledoc File.read!("README.md")
defdelegate run(opts), to: Divo.Compose, as: :run
defdelegate stop(), to: Divo.Compose, as: :stop
defdelegate kill(), to: Divo.Compose, as: :kill
@doc """
Implements a macro for including directly in integration
test files. Add `use Divo` to an integration test file to
automatically add the Start and Kill commands for your
dependent service definitions to a `setup_all` block of
your tests.
"""
defmacro __using__(opts \\ []) do
quote do
import Divo
import Divo.Compose
setup_all do
start(unquote(opts))
on_exit(fn ->
cleanup(unquote(opts))
end)
end
end
end
def start(opts \\ []) do
auto_start = Keyword.get(opts, :auto_start, true)
post_docker_run = Keyword.get(opts, :post_docker_run, [])
Divo.Compose.run(opts)
Enum.each(post_docker_run, & &1.())
app = Mix.Project.config() |> Keyword.get(:app)
if auto_start, do: Application.ensure_all_started(app)
end
def cleanup(opts \\ []) do
auto_start = Keyword.get(opts, :auto_start, true)
app = Mix.Project.config() |> Keyword.get(:app)
if auto_start do
dependent_apps =
Application.spec(app, :applications) --
[:kernel, :stdlib, :elixir, :ex_unit, :logger, :divo, :placebo]
Logger.remove_backend(:console)
[app | dependent_apps]
|> Enum.each(&Application.stop/1)
Logger.add_backend(:console)
end
Divo.Compose.kill()
end
end