Drill behaviour (drill v1.1.0)

Drill is an elixir seeder library inspired by Seed Fu and Phinx.

usage

Usage

  1. Create your seeder modules. The directory where the seeder modules should be located is described on mix drill documentation.

In my_app/priv/repo/seeds/user.exs:

defmodule MyApp.Seeds.User do
use Drill, key: :users, source: MyApp.Accounts.User

def factory do
  %{
    first_name: Person.first_name(),
    last_name: Person.last_name()
  }
end

def run(_context) do
  [
    seed(email: "email1@example.com"),
    seed(email: "email2@example.com"),
    seed(email: "email3@example.com")
  ]
end
end

In my_app/priv/repo/seeds/post.exs:

defmodule MyApp.Seeds.Post do
use Drill, key: :posts, source: MyApp.Blogs.Post
alias Faker.Lorem

def deps do
  [MyApp.Seeds.User]
end

def factory do
  %{content: Lorem.paragraph()}
end

def run(%Drill.Context{seeds: %{users: [user1, user2, user3 | _]}}) do
  [
    seed(user_id: user1.id),
    seed(user_id: user2.id),
    seed(user_id: user3.id)
  ]
end
end
  1. Run mix drill -r MyApp.Repo in the terminal with your project root as the current working directory

installation

Installation

This project is not yet published on Hex so for the meantime you can add it to the list of dependencies in mix.exs as a github path:

def deps do
  [
    {:drill, git: "git@github.com:dgigafox/drill.git"}
  ]
end

configurations

Configurations

timeout

Timeout

Default timeout is 600 seconds or 10 minutes. You may configure the task timeout in your config.exs file e.g.: config :drill, :timeout, 10_000

use-drill-options

use Drill options

  • source - source is the schema module
  • key - once the seeder module runs, the inserted result will be saved to %Drill.Context{}.seeds[key]. Drill.Context struct is passed to one of Drill's callback which is run/1 to be discussed in the Callback section below.

callbacks

Callbacks

  • constraints/0 (optional) - returns a list of column names to verify for conflicts. If a conflict occurs all fields will just be updated. This prevents insertion of new records based on the constraints when drill is run again.
  • on_conflict/0 (optional) - returns the conflict strategy. The default is :replace_all. Only works when constraints/0 returns a non-empty list. See Ecto.Repo.insert_all/4 for more details.
  • deps/0 (optional) - returns a list of seeder modules that should be run prior to the current seeder
  • run/1 (required) - returns a list of maps which keys are fields of the :source schema. Autogenerated fields such as :inserted_at or :updated_at may not be defined. The first argument is the Drill.Context struct, which you can use to get the inserted records from previously run seeder modules (see Usage section above).
  • factory/0 (required) - set default values for the fields. This is used when you call build/1 from the seeder module.

Link to this section Summary

Link to this section Callbacks

@callback constraints() :: [atom()]
@callback deps() :: [atom()]
@callback factory() :: map()
@callback on_conflict() ::
  :raise
  | :nothing
  | :replace_all
  | {:replace_all_except, [atom()]}
  | {:replace, [atom()]}
@callback run(Drill.Context.t()) :: [Drill.Seed.t()]

Link to this section Functions

Link to this function

build_entries(seeder, ctx)