defmodule Mix.Tasks.ServerLogger.Gen.Migration do @shortdoc "Generates a migration for the ServerLogger tables" @moduledoc """ Generates a migration file that creates the server_logs partitioned table. $ mix server_logger.gen.migration The generated migration delegates to `ServerLogger.Migration.up/0` and `ServerLogger.Migration.down/0`. ## Options * `--repo` - the repo to generate the migration for (defaults to the app's repo) """ use Mix.Task import Mix.Ecto import Mix.EctoSQL import Mix.Generator @impl true def run(args) do [repo | _] = parse_repo(args) ensure_repo(repo, args) adapter = repo.__adapter__() unless adapter == Ecto.Adapters.Postgres do Mix.raise( "ServerLogger only supports PostgreSQL. " <> "Expected Ecto.Adapters.Postgres, got: #{inspect(adapter)}" ) end path = Path.join(source_repo_priv(repo), "migrations") file = Path.join(path, "#{timestamp()}_create_server_logs.exs") create_directory(path) create_file(file, migration_template(repo: repo)) Mix.shell().info(""" Migration generated! Run the migration with: $ mix ecto.migrate """) end defp timestamp do {{y, m, d}, {hh, mm, ss}} = :calendar.universal_time() "#{y}#{pad(m)}#{pad(d)}#{pad(hh)}#{pad(mm)}#{pad(ss)}" end defp pad(i) when i < 10, do: "0#{i}" defp pad(i), do: "#{i}" embed_template(:migration, """ defmodule <%= inspect @repo %>.Migrations.CreateServerLogs do use Ecto.Migration def up, do: ServerLogger.Migration.up() def down, do: ServerLogger.Migration.down() end """) end