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