diff --git a/lib/juggler.ex b/lib/juggler.ex index 65bdce5..869cbee 100644 --- a/lib/juggler.ex +++ b/lib/juggler.ex @@ -1,11 +1,37 @@ defmodule Juggler do + require Logger + @juggler_dir "juggler" @juggles_file_path "juggles.exs" + @juggles_template """ + # Example for testing against 1.x and 2.x of some dependency + # %{ + # "dep-name-1-0": [{:dep_name, "~> 1.0"}], + # "dep-name-2-0": [{:dep_name, "~> 2.0"}], + # } + """ + + def init do + case File.read(@juggles_file_path) do + {:ok, _} -> + Logger.info("#{@juggles_file_path} file already exists, doing nothing") + {:error, :enoent} -> + File.write(@juggles_file_path, @juggles_template) + Logger.info("Successfully created #{@juggles_file_path} file") + end + end def juggles do - with {:ok, contents} <- File.read(@juggles_file_path), - {%{} = contents, _} <- Code.eval_string(contents) do - contents + case File.read(@juggles_file_path) do + {:ok, contents} -> + case Code.eval_string(contents) do + {%{} = map, _} -> + map + _ -> + raise "Couldn't find a map defining your juggles in #{@juggles_file_path} file" + end + {:error, :enoent} -> + raise "Couldn't find a #{@juggles_file_path} file" end end diff --git a/lib/mix/tasks/juggler/exec.ex b/lib/mix/tasks/juggler/exec.ex new file mode 100644 index 0000000..33ba75a --- /dev/null +++ b/lib/mix/tasks/juggler/exec.ex @@ -0,0 +1,17 @@ +defmodule Mix.Tasks.Juggler.Exec do + use Mix.Task + + @shortdoc "Executes task within a lockfile context" + # @preferred_cli_env :test + + @impl true + def run([juggle_id | [task | args]]) do + Juggler.within( + String.to_atom(juggle_id), + fn -> + # System.put_env("MIX_ENV", "test") + Mix.Task.run(task, args) + end + ) + end +end diff --git a/lib/mix/tasks/juggler/gen.ex b/lib/mix/tasks/juggler/get.ex similarity index 71% rename from lib/mix/tasks/juggler/gen.ex rename to lib/mix/tasks/juggler/get.ex index e0ba164..0815f0b 100644 --- a/lib/mix/tasks/juggler/gen.ex +++ b/lib/mix/tasks/juggler/get.ex @@ -1,16 +1,16 @@ -defmodule Mix.Tasks.Juggler.Gen do +defmodule Mix.Tasks.Juggler.Get do use Mix.Task @shortdoc "Generates lockfiles from juggles.exs" @impl true - def run(_args) do + def run(args) do Juggler.juggles() |> Enum.map(fn {juggle_id, _deps} -> Juggler.within( juggle_id, fn -> - Mix.Task.rerun("deps.get") + Mix.Task.rerun("deps.get", args) end ) end) diff --git a/lib/mix/tasks/juggler/init.ex b/lib/mix/tasks/juggler/init.ex new file mode 100644 index 0000000..1727a6d --- /dev/null +++ b/lib/mix/tasks/juggler/init.ex @@ -0,0 +1,10 @@ +defmodule Mix.Tasks.Juggler.Init do + use Mix.Task + + @shortdoc "Initializes an empty juggles.exs file" + + @impl true + def run(_args) do + Juggler.init() + end +end diff --git a/lib/mix/tasks/juggler/update.ex b/lib/mix/tasks/juggler/update.ex new file mode 100644 index 0000000..88186ce --- /dev/null +++ b/lib/mix/tasks/juggler/update.ex @@ -0,0 +1,18 @@ +defmodule Mix.Tasks.Juggler.Update do + use Mix.Task + + @shortdoc "Updates lockfiles from juggles.exs" + + @impl true + def run(args) do + Juggler.juggles() + |> Enum.map(fn {juggle_id, _deps} -> + Juggler.within( + juggle_id, + fn -> + Mix.Task.rerun("deps.update", args) + end + ) + end) + end +end