Packages

A run-once database seeder using Ecto

Current section

Files

Jump to
botanist lib mix botanist.ex
Raw

lib/mix/botanist.ex

defmodule Mix.Botanist do
@moduledoc false
require Logger
def repo do
case Mix.env() do
:test ->
Botanist.Repo
_ ->
case Application.get_env(:botanist, :ecto_repo, nil) do
nil ->
Mix.raise(
"A repo must be added to your Botanist config. Check your config.exs for the 'ecto_repo' field under botanist"
)
repo ->
repo
end
end
end
def seed_path do
seed_path =
case Application.get_env(:botanist, :seeds_path, nil) do
nil -> Path.join(["priv", "repo", "seeds"])
seed_path -> seed_path
end
Path.join([File.cwd!(), seed_path])
end
def gather_seed_files() do
Path.wildcard(Path.join(Mix.Botanist.seed_path(), "*.exs"))
end
def run_seed(seed_file) do
basename = Path.basename(seed_file)
case Code.load_file(seed_file) |> List.first() do
{mod, _bin} ->
case run_module(mod) do
{:ok, _} ->
Logger.info("#{basename} ran successfully")
nil
{:repeat, _} ->
Logger.info("#{basename} has already run")
nil
{:error, error} ->
Logger.error("Failed to run #{basename}")
%{file: basename, msg: error}
end
_ ->
Logger.error("Error loading #{seed_file}")
end
end
defp run_module(mod) do
try do
mod.planter()
rescue
error -> {:error, Exception.message(error)}
catch
error when is_binary(error) -> {:error, error}
error -> {:error, Exception.message(error)}
end
end
end