Skip to main content

lib/pi/project.ex

defmodule Pi.Project do
  @moduledoc "Project metadata helpers for eval sessions."

  def info do
    config = Mix.Project.config()
    app = Keyword.fetch!(config, :app)

    %{
      app: app,
      root: File.cwd!(),
      mix_env: Mix.env(),
      elixir: System.version(),
      otp: System.otp_release(),
      deps: deps(),
      applications: applications(app)
    }
  end

  defp deps do
    Mix.Project.deps_paths()
    |> Enum.map(fn {app, path} ->
      %{app: app, path: Path.relative_to_cwd(path), vsn: app_vsn(app)}
    end)
    |> Enum.sort_by(& &1.app)
  end

  defp applications(app) do
    Application.load(app)

    app
    |> Application.spec(:applications)
    |> List.wrap()
    |> Enum.sort()
  end

  defp app_vsn(app) do
    case Application.spec(app, :vsn) do
      nil -> nil
      vsn -> List.to_string(vsn)
    end
  end
end