Current section

Files

Jump to
shopifex lib mix tasks gen.migration.ex
Raw

lib/mix/tasks/gen.migration.ex

defmodule Mix.Tasks.Shopifex.Gen.Migration do
@shortdoc "Generates Shopifex migration file"
@moduledoc """
Generates migration file.
mix shopifex.gen.migrations -r MyApp.Repo
mix shopifex.gen.migrations -r MyApp.Repo --namespace shopify_app
This generator will add the shopifex migration file in `priv/repo/migrations`.
The repository must be set under `:ecto_repos` in the current app
configuration or given via the `-r` option.
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.
## Arguments
* `-r`, `--repo` - the repo module
* `--binary-id` - use binary id for primary keys
* `--namespace` - namespace to prepend table, schema and controller module name
"""
use Mix.Task
alias Mix.{Ecto, Shopifex, Shopifex.Migration}
@switches [binary_id: :boolean, namespace: :string]
@default_opts [binary_id: false, namespace: "shopify"]
@mix_task "shopifex.gen.migrations"
@impl true
def run(args) do
Shopifex.no_umbrella!(@mix_task)
args
|> Shopifex.parse_options(@switches, @default_opts)
|> parse()
|> create_migration_files(args)
end
defp parse({config, _parsed, _invalid}), do: config
defp create_migration_files(config, args) do
args
|> Ecto.parse_repo()
|> Enum.map(&ensure_repo(&1, args))
|> Enum.map(&Map.put(config, :repo, &1))
|> Enum.each(&create_migration_files/1)
end
defp create_migration_files(%{repo: repo, namespace: namespace} = config) do
name = "Create#{Macro.camelize(namespace)}Tables"
content = Migration.gen(name, namespace, config)
Migration.create_migration_file(repo, name, content)
end
defp ensure_repo(repo, args) do
Ecto.ensure_repo(repo, args ++ ~w(--no-deps-check))
end
end