mirror of
https://github.com/ash-project/igniter.git
synced 2024-09-19 13:02:51 +12:00
improvement: show warning when adding dependencies by default
Some checks are pending
CI / ash-ci (push) Waiting to run
Some checks are pending
CI / ash-ci (push) Waiting to run
This commit is contained in:
parent
88aa56ada3
commit
afbcb3cd1a
3 changed files with 88 additions and 36 deletions
39
lib/deps.ex
39
lib/deps.ex
|
@ -4,13 +4,21 @@ defmodule Igniter.Deps do
|
|||
alias Igniter.Code.Common
|
||||
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
|
||||
igniter
|
||||
else
|
||||
case get_dependency_declaration(igniter, name) do
|
||||
nil ->
|
||||
do_add_dependency(igniter, name, version)
|
||||
do_add_dependency(igniter, name, version, opts)
|
||||
|
||||
current ->
|
||||
desired = "`{#{inspect(name)}, #{inspect(version)}}`"
|
||||
|
@ -19,7 +27,7 @@ defmodule Igniter.Deps do
|
|||
if desired == current do
|
||||
igniter
|
||||
else
|
||||
if yes? ||
|
||||
if opts[:yes?] ||
|
||||
Mix.shell().yes?("""
|
||||
Dependency #{name} is already in mix.exs. Should we replace it?
|
||||
|
||||
|
@ -28,7 +36,7 @@ defmodule Igniter.Deps do
|
|||
""") do
|
||||
igniter
|
||||
|> remove_dependency(name)
|
||||
|> do_add_dependency(name, version)
|
||||
|> do_add_dependency(name, version, opts)
|
||||
else
|
||||
igniter
|
||||
end
|
||||
|
@ -97,7 +105,7 @@ defmodule Igniter.Deps do
|
|||
end)
|
||||
end
|
||||
|
||||
defp do_add_dependency(igniter, name, version) do
|
||||
defp do_add_dependency(igniter, name, version, opts) do
|
||||
igniter
|
||||
|> Igniter.update_elixir_file("mix.exs", fn zipper ->
|
||||
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)
|
||||
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
|
||||
|
|
|
@ -80,14 +80,15 @@ defmodule Igniter do
|
|||
end
|
||||
|
||||
@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
|
||||
%{igniter | issues: [issue | igniter.issues]}
|
||||
%{igniter | issues: List.wrap(issue) ++ igniter.issues}
|
||||
end
|
||||
|
||||
@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
|
||||
%{igniter | issues: [warning | igniter.warnings]}
|
||||
%{igniter | warnings: List.wrap(warning) ++ igniter.warnings}
|
||||
end
|
||||
|
||||
@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()
|
||||
def update_elixir_file(igniter, path, func) do
|
||||
if Rewrite.has_source?(igniter.rewrite, path) do
|
||||
%{
|
||||
igniter
|
||||
| rewrite:
|
||||
Rewrite.update!(igniter.rewrite, path, fn source ->
|
||||
apply_func_with_zipper(source, func)
|
||||
end)
|
||||
}
|
||||
source = Rewrite.source!(igniter.rewrite, path)
|
||||
|
||||
igniter
|
||||
|> apply_func_with_zipper(source, func)
|
||||
|> format(path)
|
||||
else
|
||||
if File.exists?(path) do
|
||||
|
@ -148,11 +146,7 @@ defmodule Igniter do
|
|||
|
||||
%{igniter | rewrite: Rewrite.put!(igniter.rewrite, source)}
|
||||
|> format(path)
|
||||
|> Map.update!(:rewrite, fn rewrite ->
|
||||
Rewrite.update!(rewrite, path, fn source ->
|
||||
apply_func_with_zipper(source, func)
|
||||
end)
|
||||
end)
|
||||
|> apply_func_with_zipper(source, func)
|
||||
else
|
||||
add_issue(igniter, "Required #{path} but it did not exist")
|
||||
end
|
||||
|
@ -368,6 +362,20 @@ defmodule Igniter do
|
|||
:dry_run_with_changes
|
||||
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
|
||||
message =
|
||||
if result_of_dry_run == :dry_run_with_no_changes do
|
||||
|
@ -455,7 +463,7 @@ defmodule Igniter do
|
|||
"* #{Exception.format(:error, error)}"
|
||||
end
|
||||
end)
|
||||
|> Mix.shell().info()
|
||||
|> Mix.shell().error()
|
||||
end)
|
||||
end
|
||||
|
||||
|
@ -655,29 +663,44 @@ defmodule Igniter do
|
|||
opts
|
||||
end
|
||||
|
||||
defp apply_func_with_zipper(source, func) do
|
||||
defp apply_func_with_zipper(igniter, source, func) do
|
||||
quoted = Rewrite.Source.get(source, :quoted)
|
||||
zipper = Sourceror.Zipper.zip(quoted)
|
||||
|
||||
case func.(zipper) do
|
||||
{:ok, %Sourceror.Zipper{} = zipper} ->
|
||||
Rewrite.Source.update(
|
||||
source,
|
||||
:configure,
|
||||
:quoted,
|
||||
Sourceror.Zipper.root(zipper)
|
||||
Rewrite.update!(
|
||||
igniter.rewrite,
|
||||
Rewrite.Source.update(
|
||||
source,
|
||||
:configure,
|
||||
:quoted,
|
||||
Sourceror.Zipper.root(zipper)
|
||||
)
|
||||
)
|
||||
|> then(&Map.put(igniter, :rewrite, &1))
|
||||
|
||||
%Sourceror.Zipper{} = zipper ->
|
||||
Rewrite.Source.update(
|
||||
source,
|
||||
:configure,
|
||||
:quoted,
|
||||
Sourceror.Zipper.root(zipper)
|
||||
Rewrite.update!(
|
||||
igniter.rewrite,
|
||||
Rewrite.Source.update(
|
||||
source,
|
||||
:configure,
|
||||
:quoted,
|
||||
Sourceror.Zipper.root(zipper)
|
||||
)
|
||||
)
|
||||
|> then(&Map.put(igniter, :rewrite, &1))
|
||||
|
||||
{: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
|
||||
|
||||
|
|
|
@ -43,8 +43,10 @@ defmodule Igniter.Install do
|
|||
|
||||
{igniter, [install | install_list]}
|
||||
else
|
||||
{Igniter.Deps.add_dependency(igniter, install, requirement, "--yes" in argv),
|
||||
[install | install_list]}
|
||||
{Igniter.Deps.add_dependency(igniter, install, requirement,
|
||||
error?: true,
|
||||
yes?: "--yes" in argv
|
||||
), [install | install_list]}
|
||||
end
|
||||
|
||||
:error ->
|
||||
|
|
Loading…
Reference in a new issue