diff --git a/lib/mix/tasks/igniter.add.ex b/lib/mix/tasks/igniter.add.ex new file mode 100644 index 00000000..7801df03 --- /dev/null +++ b/lib/mix/tasks/igniter.add.ex @@ -0,0 +1,44 @@ +defmodule Mix.Tasks.Igniter.Add do + use Igniter.Mix.Task + + @example "mix igniter.add dep1 dep2" + + @shortdoc "Adds the provided deps to `mix.exs`" + @moduledoc """ + #{@shortdoc} + + This is only useful when you want to add a dependency without running its installer, since `igniter.install` already adds the dependency to `mix.exs`. + + This task also gets the dependencies after completion. + + ## Example + + ```bash + #{@example} + ``` + """ + + @impl Igniter.Mix.Task + def info(_argv, _composing_task) do + %Igniter.Mix.Task.Info{ + positional: [deps: [rest: true]] + } + end + + @impl Igniter.Mix.Task + def igniter(igniter) do + igniter.args.positional.deps + |> Enum.join(",") + |> String.split(",") + |> Enum.reduce(igniter, fn dep, igniter -> + case Igniter.Project.Deps.determine_dep_type_and_version(dep) do + {name, version} -> + Igniter.Project.Deps.add_dep(igniter, {name, version}) + + :error -> + raise "Could not determine source for requested package #{dep}" + end + end) + |> Igniter.add_task("deps.get") + end +end diff --git a/test/mix/tasks/igniter.add_test.exs b/test/mix/tasks/igniter.add_test.exs new file mode 100644 index 00000000..d853e97c --- /dev/null +++ b/test/mix/tasks/igniter.add_test.exs @@ -0,0 +1,14 @@ +defmodule Mix.Tasks.Igniter.AddTest do + use ExUnit.Case + import Igniter.Test + + test "adds dependencies" do + test_project() + |> apply_igniter!() + |> Igniter.compose_task("igniter.add", ["req"]) + |> assert_has_patch("mix.exs", """ + + | {:req, + """) + |> assert_has_task("deps.get", []) + end +end