Current section

Files

Jump to
arangox_ecto lib mix tasks ecto.gen.migration.ex
Raw

lib/mix/tasks/ecto.gen.migration.ex

defmodule Mix.Tasks.Ecto.Gen.Migration do
use Mix.Task
import Mix.Ecto
import Mix.ArangoXEcto
import Mix.Generator
import Macro, only: [camelize: 1, underscore: 1]
@shortdoc "Generates a new migration for a collection"
@moduledoc """
Generates a migration.
The repository must be set under `:ecto_repos` in the current app
configuration or given via the `-r` option.
## Examples
mix ecto.gen.migration create_users
mix ecto.gen.migration create_users -r Custom.Repo
The generated migration filename will be prefixed with the current timestamp
in UTC which is used for versioning and ordering.
By default, the migration will be generated to the
`priv/YOUR_REPO/migrations` directory of the current application but it can
be configured to be any subdirectory of `priv` by specifying the `:priv` key
under the repository configuration.
This generator will automatically open the generated file if you have
`ECTO_EDITOR` set in your environment variable.
## Command line options
* `-r`, `--repo` - the repo to generate migration for
"""
@aliases [
r: :repo
]
@switches [
repo: [:string, :keep]
]
@impl true
def run(args) do
Mix.Task.run("app.start")
repos = parse_repo(args)
for repo <- repos do
case OptionParser.parse!(args, strict: @switches, aliases: @aliases) do
{_, [name]} ->
path = Path.join(path_to_priv_repo(repo), "migrations")
base_name = "#{underscore(name)}.exs"
file = Path.join(path, "#{timestamp()}_#{base_name}")
unless File.dir?(path), do: create_directory(path)
fuzzy_path = Path.join(path, "*_#{base_name}")
if Path.wildcard(fuzzy_path) != [] do
Mix.raise(
"Migration can't be created since there is already a migration file with the name #{
name
}"
)
end
assigns = [
repo: repo,
mod: Module.concat([repo, Migrations, camelize(name)])
]
create_file(file, migration_template(assigns))
{_, _} ->
Mix.raise(
"expected ecto.gen.migration to receive the migration file name, " <>
"got: #{inspect(Enum.join(args, " "))}"
)
end
end
end
embed_template(:migration, """
defmodule <%= inspect @mod %> do
alias <%= @repo %>
def up do
:ok
end
def down do
:ok
end
end
""")
end