Packages

A run-once database seeder using Ecto

Current section

Files

Jump to
botanist lib mix tasks ecto.seed.ex
Raw

lib/mix/tasks/ecto.seed.ex

defmodule Mix.Tasks.Ecto.Seed do
require Logger
@shortdoc "runs all pending seeds"
@moduledoc """
Runs all pending seeds in `priv/repo/seeds` or, if configured, the `seeds_path` directory.
If a seed has already run, it cannot be rerun. Failed seeds however, can be rerun.
The generated migration filename will be prefixed with the current timestamp in UTC which is used for versioning and ordering.
### Example
```elixir
mix ecto.seed
```
"""
@doc false
def run(_args) do
Logger.configure(level: :info)
Mix.Task.run("app.start", [])
case run_seeds() do
{:ok, failed_seeds} ->
cond do
length(failed_seeds) > 0 ->
Logger.error("The following seeds failed to run:")
Enum.each(failed_seeds, fn fs -> Logger.error(fs) end)
true ->
Logger.info("All seeds ran successfully.")
end
end
end
defp run_seeds() do
{
:ok,
Enum.reject(
Enum.map(Mix.Botanist.gather_seed_files(), fn seed_file ->
Logger.info("Running seed #{seed_file}")
run_seed(seed_file)
end),
&is_nil/1
)
}
end
defp run_seed(seed_file) do
case Code.eval_file(seed_file) do
{{:ok, _}, _} ->
Logger.info("#{seed_file} ran successfully")
nil
{{:repeat, _}, _} ->
Logger.info("#{seed_file} has already run")
nil
{{:error, error}, _} ->
Logger.error("Error running #{seed_file}", error: error)
seed_file
end
end
end