Packages

Elixir library to manage database seeds.

Current section

Files

Jump to
db_seeds lib db_seeds seed runner.ex
Raw

lib/db_seeds/seed/runner.ex

defmodule DbSeeds.Seed.Runner do
@moduledoc false
require Logger
@doc """
Runs the given seeds.
"""
def run(repo, module, direction, operation, _migrator_direction, opts) do
log(opts[:log], "== Running #{inspect(module)}.#{operation}/0 #{direction}")
run_seed(repo, module, operation, opts)
end
defp run_seed(repo, mod, operation, opts) do
:timer.tc(mod, operation, [repo])
|> handle_run_seed(opts)
end
defp handle_run_seed({time, {:ok, artifacts}}, opts) do
createds = Map.get(artifacts, :createds, [])
updateds = Map.get(artifacts, :updateds, [])
errors = Map.get(artifacts, :errors, [])
existings = Map.get(artifacts, :existings, [])
Enum.each(existings, fn existing ->
log(
opts[:log],
"Existing parent #{inspect(existing.__struct__)}{id: #{inspect(existing.id)}}"
)
end)
Enum.each(createds, fn created ->
log(opts[:log], "Created #{inspect(created.__struct__)}{id: #{inspect(created.id)}}")
end)
Enum.each(updateds, fn {updated, changes} ->
log(
opts[:log],
"Updated #{inspect(updated.__struct__)}{id: #{inspect(updated.id)}} with changes: #{inspect(changes)}"
)
end)
Enum.each(errors, fn changeset ->
log(
opts[:log],
"ERROR #{inspect(changeset.errors)} on #{changeset.model.__struct__}{id: #{inspect(changeset.model.id)}} with changes #{inspect(changeset.changes)}"
)
end)
if Enum.count(errors) > 0, do: raise("failed due to errors")
log(opts[:log], "== Seeded in #{inspect(div(time, 10000) / 10)}s")
end
defp handle_run_seed({_time, {:error, %{model: %{id: nil} = model} = changeset}}, _opts) do
raise DbSeeds.SeedError,
"Failed to create #{inspect(model.__struct__)} due to #{inspect(changeset.errors)} with changes #{inspect(changeset.changes)}"
end
defp handle_run_seed({_time, {:error, %{model: model} = changeset}}, _opts) do
raise DbSeeds.SeedError,
"Failed to update #{inspect(model.__struct__)} due to #{inspect(changeset.errors)} with changes #{inspect(changeset.changes)}"
end
defp handle_run_seed(_any, _opts) do
end
defp log(false, _msg), do: :ok
defp log(nil, msg), do: Logger.log(:debug, msg)
defp log(level, msg), do: Logger.log(level, msg)
end