mirror of
https://github.com/ash-project/igniter.git
synced 2024-09-20 05:22:52 +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 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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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 ->
|
||||||
|
|
Loading…
Reference in a new issue