improvement: show warning when adding dependencies by default
Some checks are pending
CI / ash-ci (push) Waiting to run

This commit is contained in:
Zach Daniel 2024-06-14 20:09:20 -04:00
parent 88aa56ada3
commit afbcb3cd1a
3 changed files with 88 additions and 36 deletions

View file

@ -4,13 +4,21 @@ defmodule Igniter.Deps do
alias Igniter.Code.Common alias Igniter.Code.Common
alias Sourceror.Zipper alias Sourceror.Zipper
def add_dependency(igniter, name, version, yes? \\ false) do @doc """
Adds a dependency to the mix.exs file.
# Options
- `:yes?` - Automatically answer yes to any prompts.
- `:error?` - Returns an error instead of a notice on failure.
"""
def add_dependency(igniter, name, version, opts \\ []) do
if name in List.wrap(igniter.assigns[:manually_installed]) do if name in List.wrap(igniter.assigns[:manually_installed]) do
igniter igniter
else else
case get_dependency_declaration(igniter, name) do case get_dependency_declaration(igniter, name) do
nil -> nil ->
do_add_dependency(igniter, name, version) do_add_dependency(igniter, name, version, opts)
current -> current ->
desired = "`{#{inspect(name)}, #{inspect(version)}}`" desired = "`{#{inspect(name)}, #{inspect(version)}}`"
@ -19,7 +27,7 @@ defmodule Igniter.Deps do
if desired == current do if desired == current do
igniter igniter
else else
if yes? || if opts[:yes?] ||
Mix.shell().yes?(""" Mix.shell().yes?("""
Dependency #{name} is already in mix.exs. Should we replace it? Dependency #{name} is already in mix.exs. Should we replace it?
@ -28,7 +36,7 @@ defmodule Igniter.Deps do
""") do """) do
igniter igniter
|> remove_dependency(name) |> remove_dependency(name)
|> do_add_dependency(name, version) |> do_add_dependency(name, version, opts)
else else
igniter igniter
end end
@ -97,7 +105,7 @@ defmodule Igniter.Deps do
end) end)
end end
defp do_add_dependency(igniter, name, version) do defp do_add_dependency(igniter, name, version, opts) do
igniter igniter
|> Igniter.update_elixir_file("mix.exs", fn zipper -> |> Igniter.update_elixir_file("mix.exs", fn zipper ->
with {:ok, zipper} <- Igniter.Code.Module.move_to_module_using(zipper, Mix.Project), with {:ok, zipper} <- Igniter.Code.Module.move_to_module_using(zipper, Mix.Project),
@ -111,7 +119,26 @@ defmodule Igniter.Deps do
Igniter.Code.List.prepend_to_list(zipper, quoted) Igniter.Code.List.prepend_to_list(zipper, quoted)
else else
_ -> _ ->
{:error, "Failed to add dependency #{inspect({inspect(name), inspect(version)})}"} if opts[:error?] do
{:error,
"""
Could not add dependency #{inspect({inspect(name), inspect(version)})}
`mix.exs` file does not contain a simple list of dependencies in a `deps/0` function.
Please add it manually and run the installer again.
"""}
else
{:warning,
[
"""
Could not add dependency #{inspect({inspect(name), inspect(version)})}
`mix.exs` file does not contain a simple list of dependencies in a `deps/0` function.
Please add it manually.
"""
]}
end
end end
end) end)
end end

View file

@ -80,14 +80,15 @@ defmodule Igniter do
end end
@doc "Adds an issue to the issues list. Any issues will prevent writing and be displayed to the user." @doc "Adds an issue to the issues list. Any issues will prevent writing and be displayed to the user."
@spec add_issue(t, term) :: t() @spec add_issue(t, term | list(term)) :: t()
def add_issue(igniter, issue) do def add_issue(igniter, issue) do
%{igniter | issues: [issue | igniter.issues]} %{igniter | issues: List.wrap(issue) ++ igniter.issues}
end end
@doc "Adds a warning to the warnings list. Warnings will not prevent writing, but will be displayed to the user." @doc "Adds a warning to the warnings list. Warnings will not prevent writing, but will be displayed to the user."
@spec add_warning(t, term | list(term)) :: t()
def add_warning(igniter, warning) do def add_warning(igniter, warning) do
%{igniter | issues: [warning | igniter.warnings]} %{igniter | warnings: List.wrap(warning) ++ igniter.warnings}
end end
@doc "Adds a task to the tasks list. Tasks will be run after all changes have been commited" @doc "Adds a task to the tasks list. Tasks will be run after all changes have been commited"
@ -134,13 +135,10 @@ defmodule Igniter do
@spec update_elixir_file(t(), Path.t(), zipper_updater()) :: Igniter.t() @spec update_elixir_file(t(), Path.t(), zipper_updater()) :: Igniter.t()
def update_elixir_file(igniter, path, func) do def update_elixir_file(igniter, path, func) do
if Rewrite.has_source?(igniter.rewrite, path) do if Rewrite.has_source?(igniter.rewrite, path) do
%{ source = Rewrite.source!(igniter.rewrite, path)
igniter
| rewrite: igniter
Rewrite.update!(igniter.rewrite, path, fn source -> |> apply_func_with_zipper(source, func)
apply_func_with_zipper(source, func)
end)
}
|> format(path) |> format(path)
else else
if File.exists?(path) do if File.exists?(path) do
@ -148,11 +146,7 @@ defmodule Igniter do
%{igniter | rewrite: Rewrite.put!(igniter.rewrite, source)} %{igniter | rewrite: Rewrite.put!(igniter.rewrite, source)}
|> format(path) |> format(path)
|> Map.update!(:rewrite, fn rewrite -> |> apply_func_with_zipper(source, func)
Rewrite.update!(rewrite, path, fn source ->
apply_func_with_zipper(source, func)
end)
end)
else else
add_issue(igniter, "Required #{path} but it did not exist") add_issue(igniter, "Required #{path} but it did not exist")
end end
@ -368,6 +362,20 @@ defmodule Igniter do
:dry_run_with_changes :dry_run_with_changes
end end
if igniter.warnings != [] do
Mix.shell().info("\n#{title} - #{IO.ANSI.yellow()}Notices:#{IO.ANSI.reset()}\n")
igniter.warnings
|> Enum.map_join("\n --- \n", fn error ->
if is_binary(error) do
"* #{IO.ANSI.yellow()}#{error}#{IO.ANSI.reset()}"
else
"* #{IO.ANSI.yellow()}#{Exception.format(:error, error)}#{IO.ANSI.reset()}"
end
end)
|> Mix.shell().info()
end
if igniter.tasks != [] do if igniter.tasks != [] do
message = message =
if result_of_dry_run == :dry_run_with_no_changes do if result_of_dry_run == :dry_run_with_no_changes do
@ -455,7 +463,7 @@ defmodule Igniter do
"* #{Exception.format(:error, error)}" "* #{Exception.format(:error, error)}"
end end
end) end)
|> Mix.shell().info() |> Mix.shell().error()
end) end)
end end
@ -655,29 +663,44 @@ defmodule Igniter do
opts opts
end end
defp apply_func_with_zipper(source, func) do defp apply_func_with_zipper(igniter, source, func) do
quoted = Rewrite.Source.get(source, :quoted) quoted = Rewrite.Source.get(source, :quoted)
zipper = Sourceror.Zipper.zip(quoted) zipper = Sourceror.Zipper.zip(quoted)
case func.(zipper) do case func.(zipper) do
{:ok, %Sourceror.Zipper{} = zipper} -> {:ok, %Sourceror.Zipper{} = zipper} ->
Rewrite.Source.update( Rewrite.update!(
source, igniter.rewrite,
:configure, Rewrite.Source.update(
:quoted, source,
Sourceror.Zipper.root(zipper) :configure,
:quoted,
Sourceror.Zipper.root(zipper)
)
) )
|> then(&Map.put(igniter, :rewrite, &1))
%Sourceror.Zipper{} = zipper -> %Sourceror.Zipper{} = zipper ->
Rewrite.Source.update( Rewrite.update!(
source, igniter.rewrite,
:configure, Rewrite.Source.update(
:quoted, source,
Sourceror.Zipper.root(zipper) :configure,
:quoted,
Sourceror.Zipper.root(zipper)
)
) )
|> then(&Map.put(igniter, :rewrite, &1))
{:error, error} -> {:error, error} ->
Rewrite.Source.add_issues(source, List.wrap(error)) Rewrite.update!(
igniter.rewrite,
Rewrite.Source.add_issues(source, List.wrap(error))
)
|> then(&Map.put(igniter, :rewrite, &1))
{:warning, warning} ->
Igniter.add_warning(igniter, warning)
end end
end end

View file

@ -43,8 +43,10 @@ defmodule Igniter.Install do
{igniter, [install | install_list]} {igniter, [install | install_list]}
else else
{Igniter.Deps.add_dependency(igniter, install, requirement, "--yes" in argv), {Igniter.Deps.add_dependency(igniter, install, requirement,
[install | install_list]} error?: true,
yes?: "--yes" in argv
), [install | install_list]}
end end
:error -> :error ->