Packages

Manage Data Migrations with Ecto and Phoenix LiveDashboard

Current section

Files

Jump to
Raw

mix.exs

defmodule DataMigration.MixProject do
  use Mix.Project
  @version "0.2.0"
  @source_url "https://github.com/tv-labs/data-migration"
  @adapters ~w[pg myxql tds sqlite]

  def project do
    [
      app: :data_migration,
      version: @version,
      elixir: "~> 1.15",
      elixirc_paths: elixirc_paths(Mix.env()),
      start_permanent: Mix.env() == :prod,
      description: "Manage Data Migrations with Ecto and Phoenix LiveDashboard",
      package: [
        licenses: ["Apache-2.0"],
        links: %{
          "GitHub" => @source_url,
          "Changelog" => "https://github.com/tv-labs/data-migration/blob/#{@version}/CHANGELOG.md"
        }
      ],
      docs: [
        main: "DataMigration.LiveDashboard.Page",
        source_ref: @version,
        source_url: @source_url,
        assets: %{"assets" => "assets"},
        extras: ["CHANGELOG.md"]
      ],
      deps: deps(),
      aliases: aliases(),
      dialyzer: [
        plt_add_apps: [:ex_unit, :mix],
        plt_file: {:no_warn, "priv/plts/data_migration.plt"}
      ]
    ]
  end

  def cli do
    [preferred_envs: ["test.all": :test, "test.adapters": :test]]
  end

  # Run "mix help compile.app" to learn about applications.
  def application do
    [
      extra_applications: [:logger]
    ]
  end

  # Run "mix help deps" to learn about dependencies.
  defp deps do
    [
      {:ecto, "~> 3.8"},
      {:phoenix_live_dashboard, "~> 0.8"},
      {:phoenix_live_view, "~> 1.0"},
      {:phoenix_pubsub, "~> 2.1"},

      # Adapters for testing
      {:ecto_sqlite3, "~> 0.17", optional: true},
      {:myxql, "~> 0.8", optional: true},
      {:postgrex, "~> 0.19 or ~> 1.0", optional: true},
      {:tds, "~> 2.2", optional: true},

      # Dev/Test
      {:bandit, "~> 1.0", only: [:dev]},
      {:dialyxir, "~> 1.4", only: [:dev, :test], runtime: false},
      {:ex_doc, "~> 0.34", only: [:dev], runtime: false, warn_if_outdated: true},
      {:lazy_html, "~> 0.1", only: [:test]},
      {:tidewave, "~> 0.4", only: [:dev]}
    ]
  end

  defp elixirc_paths(:test), do: ["lib", "test/support"]
  defp elixirc_paths(_), do: ["lib"]

  defp test_adapters(args) do
    for adapter <- @adapters, do: env_run(adapter, args)
  end

  defp env_run(adapter, args) do
    IO.puts([
      IO.ANSI.blue(),
      "==> Running tests for ECTO_ADAPTER=#{adapter} mix test",
      IO.ANSI.reset()
    ])

    mix_cmd_with_status_check(
      ["test", if(IO.ANSI.enabled?(), do: "--color", else: "--no-color") | args],
      env: [{"ECTO_ADAPTER", adapter}]
    )
  end

  defp mix_cmd_with_status_check(args, opts) do
    case System.cmd("mix", args, [into: IO.binstream(:stdio, :line)] ++ opts) do
      {_, result} when result > 0 -> System.at_exit(fn _ -> exit({:shutdown, 1}) end)
      _ -> :ok
    end
  end

  defp aliases do
    [
      "test.all": &test_adapters/1,
      tidewave:
        "run --no-halt -e 'Agent.start(fn -> Bandit.start_link(plug: Tidewave, port: 4011) end)'"
    ]
  end
end