From 85d53ef123194a5f6ce257aac31371e6854c3a49 Mon Sep 17 00:00:00 2001 From: Thomas Timmer Date: Tue, 11 Jun 2024 18:20:12 +0200 Subject: [PATCH] feat: add lossy option --- lib/mix/tasks/edit/add.ex | 1 + lib/mix/tasks/edit/update.ex | 1 + lib/mix_edit.ex | 13 ++++++++++++- lib/mix_edit/general_task.ex | 5 ++++- test/mix_add_test.exs | 20 +++++++++++++++++++- test/support/fake_package.ex | 4 ++-- 6 files changed, 39 insertions(+), 5 deletions(-) diff --git a/lib/mix/tasks/edit/add.ex b/lib/mix/tasks/edit/add.ex index 7f49d33..73f2e0f 100644 --- a/lib/mix/tasks/edit/add.ex +++ b/lib/mix/tasks/edit/add.ex @@ -12,6 +12,7 @@ defmodule Mix.Tasks.Edit.Add do OPTS: --version Set the version for the DEP + --lossy Fetch the latest version without patch (example '~> 1.2') --path Set the path for the DEP --git Set the git repo for the DEP --only Setting the only flag, example 'test' or 'test+dev' diff --git a/lib/mix/tasks/edit/update.ex b/lib/mix/tasks/edit/update.ex index 12d6310..6da8f19 100644 --- a/lib/mix/tasks/edit/update.ex +++ b/lib/mix/tasks/edit/update.ex @@ -10,6 +10,7 @@ defmodule Mix.Tasks.Edit.Update do OPTS: --version Set the version for the DEP + --lossy Fetch the latest version without patch (example '~> 1.2') --path Set the path for the DEP --git Set the git repo for the DEP --only Setting the only flag, example 'test' or 'test+dev' diff --git a/lib/mix_edit.ex b/lib/mix_edit.ex index 054d66c..f6f3ea2 100644 --- a/lib/mix_edit.ex +++ b/lib/mix_edit.ex @@ -28,8 +28,9 @@ defmodule MixEdit do auth = Mix.Tasks.Hex.auth_info(:read, auth_inline: false) hex_version = - get_version_fetcher().get(extra_requirements[:org], package, auth) + get_version_fetcher().get(opts[:org], package, auth) |> get_latest_package_version!(package) + |> remove_patch_version(opts[:lossy]) |> add_prefix() [version: hex_version] @@ -49,6 +50,13 @@ defmodule MixEdit do "~> #{version}" end + defp remove_patch_version(version, true) do + version_struct = Version.parse!(version) + "#{version_struct.major}.#{version_struct.minor}" + end + + defp remove_patch_version(version, _), do: version + @doc """ Convert elixir text to quoted term """ @@ -229,6 +237,9 @@ defmodule MixEdit do {:only, []} -> [] + {:lossy, _} -> + [] + {:only, value} -> [ {{:__block__, [format: :keyword], [:only]}, diff --git a/lib/mix_edit/general_task.ex b/lib/mix_edit/general_task.ex index 3a4c8c0..e3b6204 100644 --- a/lib/mix_edit/general_task.ex +++ b/lib/mix_edit/general_task.ex @@ -15,6 +15,7 @@ defmodule MixEdit.GeneralTask do only: :string, org: :string, override: :boolean, + lossy: :boolean, runtime: :boolean ] @@ -48,7 +49,9 @@ defmodule MixEdit.GeneralTask do [{String.to_atom(dep), MixEdit.fetch_version_or_option(dep, opts)}] deps -> - Enum.map(deps, fn dep -> {String.to_atom(dep), MixEdit.fetch_version_or_option(dep)} end) + Enum.map(deps, fn dep -> + {String.to_atom(dep), MixEdit.fetch_version_or_option(dep, lossy: opts[:lossy])} + end) end app_paths = diff --git a/test/mix_add_test.exs b/test/mix_add_test.exs index eaca1c1..4170e9e 100644 --- a/test/mix_add_test.exs +++ b/test/mix_add_test.exs @@ -4,7 +4,7 @@ defmodule MixEditTest do describe "fetch_version_or_option" do test "fetches from hex" do - assert [version: "~> 735.7"] == MixEdit.fetch_version_or_option("testing") + assert [version: "~> 735.7.6"] == MixEdit.fetch_version_or_option("testing") end test "not exists raises" do @@ -14,6 +14,23 @@ defmodule MixEditTest do end test "fetches from hex with options" do + assert [ + version: "~> 1.23.6", + override: true, + runtime: false, + only: [:test, :dev, :prod], + org: "myorg" + ] == + MixEdit.fetch_version_or_option("testing", + override: true, + runtime: false, + only: "test+dev+prod", + org: "myorg", + extra_fields: :ignored + ) + end + + test "fetches from hex with options, lossy" do assert [ version: "~> 1.23", override: true, @@ -26,6 +43,7 @@ defmodule MixEditTest do runtime: false, only: "test+dev+prod", org: "myorg", + lossy: true, extra_fields: :ignored ) end diff --git a/test/support/fake_package.ex b/test/support/fake_package.ex index 39c1f65..92302d3 100644 --- a/test/support/fake_package.ex +++ b/test/support/fake_package.ex @@ -1,10 +1,10 @@ defmodule MixEdit.FakePackage do def get(nil, "testing", _) do - {:ok, {200, %{"latest_stable_version" => "735.7"}, []}} + {:ok, {200, %{"latest_stable_version" => "735.7.6"}, []}} end def get("myorg", "testing", _) do - {:ok, {200, %{"latest_stable_version" => "1.23"}, []}} + {:ok, {200, %{"latest_stable_version" => "1.23.6"}, []}} end def get(nil, "not_existing", _) do