diff options
author | Eric Meadows-Jönsson <eric.meadows.jonsson@gmail.com> | 2019-03-20 20:21:36 +0100 |
---|---|---|
committer | Eric Meadows-Jönsson <eric.meadows.jonsson@gmail.com> | 2019-03-20 20:23:24 +0100 |
commit | ee57f0e61b66cda3413376ea4a4b8df860e735dc (patch) | |
tree | d88c98e296471185a4d34b71c7e2e39c8882687f | |
parent | fa64e8c78c4c951eb9f1d1503193816c61cacf01 (diff) | |
download | elixir-emj/dep-misspell.tar.gz |
Improve error message if dependency name is misspelledemj/dep-misspell
-rw-r--r-- | lib/mix/lib/mix/dep.ex | 16 | ||||
-rw-r--r-- | lib/mix/lib/mix/dep/loader.ex | 5 | ||||
-rw-r--r-- | lib/mix/test/mix/dep_test.exs | 54 | ||||
-rw-r--r-- | lib/mix/test/mix/tasks/deps_test.exs | 21 |
4 files changed, 64 insertions, 32 deletions
diff --git a/lib/mix/lib/mix/dep.ex b/lib/mix/lib/mix/dep.ex index a915e1a1f..82e11de1b 100644 --- a/lib/mix/lib/mix/dep.ex +++ b/lib/mix/lib/mix/dep.ex @@ -276,13 +276,21 @@ defmodule Mix.Dep do "ok" end - def format_status(%Mix.Dep{status: {:noappfile, path}}) do + def format_status(%Mix.Dep{status: {:noappfile, {path, nil}}}) do "could not find an app file at #{inspect(Path.relative_to_cwd(path))}. " <> - "This may happen if the dependency was not yet compiled, " <> - "or you specified the wrong application name in your deps, " <> + "This may happen if the dependency was not yet compiled " <> "or the dependency indeed has no app file (then you can pass app: false as option)" end + def format_status(%Mix.Dep{status: {:noappfile, {path, other_path}}}) do + other_app = Path.rootname(Path.basename(other_path)) + + "could not find an app file at #{inspect(Path.relative_to_cwd(path))}. " <> + "Another app file was found in the same directory " <> + "#{inspect(Path.relative_to_cwd(other_path))}, " <> + "try changing the dependency name to :#{other_app}" + end + def format_status(%Mix.Dep{status: {:invalidapp, path}}) do "the app file at #{inspect(Path.relative_to_cwd(path))} is invalid" end @@ -468,7 +476,7 @@ defmodule Mix.Dep do Returns `true` if the dependency is compilable. """ def compilable?(%Mix.Dep{status: {:elixirlock, _}}), do: true - def compilable?(%Mix.Dep{status: {:noappfile, _}}), do: true + def compilable?(%Mix.Dep{status: {:noappfile, {_, _}}}), do: true def compilable?(%Mix.Dep{status: {:scmlock, _}}), do: true def compilable?(%Mix.Dep{status: :compile}), do: true def compilable?(_), do: false diff --git a/lib/mix/lib/mix/dep/loader.ex b/lib/mix/lib/mix/dep/loader.ex index 62aa6feca..2ff597f37 100644 --- a/lib/mix/lib/mix/dep/loader.ex +++ b/lib/mix/lib/mix/dep/loader.ex @@ -422,7 +422,10 @@ defmodule Mix.Dep.Loader do {:invalidapp, app_path} {:error, _} -> - {:noappfile, app_path} + case Path.wildcard(Path.join(Path.dirname(app_path), "*.app")) do + [other_app_path] -> {:noappfile, {app_path, other_app_path}} + _ -> {:noappfile, {app_path, nil}} + end end end end diff --git a/lib/mix/test/mix/dep_test.exs b/lib/mix/test/mix/dep_test.exs index 921d5ae6b..4c9061bb1 100644 --- a/lib/mix/test/mix/dep_test.exs +++ b/lib/mix/test/mix/dep_test.exs @@ -63,7 +63,7 @@ defmodule Mix.DepTest do assert Enum.find(deps, &match?(%Mix.Dep{app: :ok, status: {:ok, _}}, &1)) assert Enum.find(deps, &match?(%Mix.Dep{app: :invalidvsn, status: {:invalidvsn, :ok}}, &1)) assert Enum.find(deps, &match?(%Mix.Dep{app: :invalidapp, status: {:invalidapp, _}}, &1)) - assert Enum.find(deps, &match?(%Mix.Dep{app: :noappfile, status: {:noappfile, _}}, &1)) + assert Enum.find(deps, &match?(%Mix.Dep{app: :noappfile, status: {:noappfile, {_, _}}}, &1)) assert Enum.find(deps, &match?(%Mix.Dep{app: :uncloned, status: {:unavailable, _}}, &1)) assert Enum.find(deps, &match?(%Mix.Dep{app: :optional, status: {:unavailable, _}}, &1)) end) @@ -582,15 +582,15 @@ defmodule Mix.DepTest do in_fixture("deps_status", fn -> loaded = Mix.Dep.load_on_environment([]) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [divergedonly: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [divergedonly: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(env: :dev) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [divergedonly: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [divergedonly: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(env: :test) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [divergedonly: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [divergedonly: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) Mix.Tasks.Deps.run([]) assert_received {:mix_shell, :info, ["* git_repo" <> _]} @@ -613,15 +613,15 @@ defmodule Mix.DepTest do in_fixture("deps_status", fn -> loaded = Mix.Dep.load_on_environment([]) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(env: :dev) assert [:deps_repo] = Enum.map(loaded, & &1.app) - assert [noappfile: _] = Enum.map(loaded, & &1.status) + assert [noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(env: :test) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) end) end) end @@ -637,7 +637,7 @@ defmodule Mix.DepTest do in_fixture("deps_status", fn -> loaded = Mix.Dep.load_on_environment([]) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(env: :dev) assert [] = Enum.map(loaded, & &1.app) @@ -648,7 +648,7 @@ defmodule Mix.DepTest do loaded = Mix.Dep.load_on_environment(env: :prod) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) end) end) end @@ -664,11 +664,11 @@ defmodule Mix.DepTest do in_fixture("deps_status", fn -> loaded = Mix.Dep.load_on_environment([]) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [divergedonly: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [divergedonly: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(env: :dev) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [divergedonly: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [divergedonly: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(env: :test) assert [:git_repo] = Enum.map(loaded, & &1.app) @@ -695,15 +695,15 @@ defmodule Mix.DepTest do in_fixture("deps_status", fn -> loaded = Mix.Dep.load_on_environment([]) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(env: :dev) assert [:deps_repo] = Enum.map(loaded, & &1.app) - assert [noappfile: _] = Enum.map(loaded, & &1.status) + assert [noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(env: :test) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(env: :prod) assert [] = Enum.map(loaded, & &1.app) @@ -857,15 +857,15 @@ defmodule Mix.DepTest do in_fixture("deps_status", fn -> loaded = Mix.Dep.load_on_environment([]) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [divergedtargets: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [divergedtargets: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(target: :host) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [divergedtargets: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [divergedtargets: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(target: :rpi3) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [divergedtargets: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [divergedtargets: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) Mix.Tasks.Deps.run([]) assert_received {:mix_shell, :info, ["* git_repo" <> _]} @@ -888,15 +888,15 @@ defmodule Mix.DepTest do in_fixture("deps_status", fn -> loaded = Mix.Dep.load_on_environment([]) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(target: :host) assert [:deps_repo] = Enum.map(loaded, & &1.app) - assert [noappfile: _] = Enum.map(loaded, & &1.status) + assert [noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(target: :rpi3) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) end) end) end @@ -912,7 +912,7 @@ defmodule Mix.DepTest do in_fixture("deps_status", fn -> loaded = Mix.Dep.load_on_environment([]) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(target: :host) assert [] = Enum.map(loaded, & &1.app) @@ -923,7 +923,7 @@ defmodule Mix.DepTest do loaded = Mix.Dep.load_on_environment(target: :rpi3) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) end) end) end @@ -939,11 +939,11 @@ defmodule Mix.DepTest do in_fixture("deps_status", fn -> loaded = Mix.Dep.load_on_environment([]) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [divergedtargets: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [divergedtargets: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(target: :host) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [divergedtargets: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [divergedtargets: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(target: :rpi3) assert [:git_repo] = Enum.map(loaded, & &1.app) @@ -970,15 +970,15 @@ defmodule Mix.DepTest do in_fixture("deps_status", fn -> loaded = Mix.Dep.load_on_environment([]) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(target: :host) assert [:deps_repo] = Enum.map(loaded, & &1.app) - assert [noappfile: _] = Enum.map(loaded, & &1.status) + assert [noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(target: :bbb) assert [:git_repo, :deps_repo] = Enum.map(loaded, & &1.app) - assert [unavailable: _, noappfile: _] = Enum.map(loaded, & &1.status) + assert [unavailable: _, noappfile: {_, _}] = Enum.map(loaded, & &1.status) loaded = Mix.Dep.load_on_environment(target: :rpi3) assert [] = Enum.map(loaded, & &1.app) diff --git a/lib/mix/test/mix/tasks/deps_test.exs b/lib/mix/test/mix/tasks/deps_test.exs index 467d4af72..d701ce6c1 100644 --- a/lib/mix/test/mix/tasks/deps_test.exs +++ b/lib/mix/test/mix/tasks/deps_test.exs @@ -90,6 +90,27 @@ defmodule Mix.Tasks.DepsTest do end) end + test "prints misspelled dependency name hint" do + Mix.Project.push(DepsApp) + + in_fixture("deps_status", fn -> + other_app_path = Path.join(Mix.Project.build_path(), "lib/noappfile/ebin/other_app.app") + File.mkdir_p!(Path.dirname(other_app_path)) + File.write!(other_app_path, "") + + Mix.Tasks.Deps.run([]) + + message = + " could not find an app file at \"_build/dev/lib/noappfile/ebin/noappfile.app\". " <> + "Another app file was found in the same directory " <> + "\"_build/dev/lib/noappfile/ebin/other_app.app\", " <> + "try changing the dependency name to :other_app" + + assert_received {:mix_shell, :info, ["* noappfile (deps/noappfile)"]} + assert_received {:mix_shell, :info, [^message]} + end) + end + test "prints Elixir req mismatches" do Mix.Project.push(ReqDepsApp) |