Skip to content

Commit effe15c

Browse files
committed
Add optional dependency load
1 parent b5d5547 commit effe15c

File tree

2 files changed

+83
-4
lines changed

2 files changed

+83
-4
lines changed

mix.exs

+49-4
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ defmodule Pow.MixProject do
88
app: :pow,
99
version: @version,
1010
elixir: "~> 1.6",
11-
elixirc_paths: elixirc_paths(Mix.env()),
11+
elixirc_paths: elixirc_paths(Mix.env(), optional_deps()),
1212
start_permanent: Mix.env() == :prod,
13-
compilers: [:phoenix] ++ Mix.compilers(),
13+
compilers: compilers(optional_deps()),
1414
deps: deps(),
1515

1616
# Hex
@@ -52,8 +52,53 @@ defmodule Pow.MixProject do
5252
]
5353
end
5454

55-
defp elixirc_paths(:test), do: ["lib", "test/support"]
56-
defp elixirc_paths(_), do: ["lib"]
55+
def elixirc_paths(:test, _optional_deps), do: ["lib", "test/support"]
56+
def elixirc_paths(_, optional_deps) do
57+
case optional_deps_missing?(optional_deps) do
58+
true -> paths_without_missing_optional_deps(optional_deps)
59+
false -> ["lib"]
60+
end
61+
end
62+
63+
def compilers(optional_deps) do
64+
case phoenix_missing?(optional_deps) do
65+
true -> [:phoenix] ++ Mix.compilers
66+
_ -> Mix.compilers()
67+
end
68+
end
69+
70+
defp phoenix_missing?(optional_deps) do
71+
Keyword.get(optional_deps, :phoenix)
72+
end
73+
74+
defp optional_deps_missing?(optional_deps) do
75+
not Enum.empty?(optional_deps_missing(optional_deps))
76+
end
77+
78+
defp optional_deps_missing(optional_deps) do
79+
Enum.reject(optional_deps, &elem(&1, 1))
80+
end
81+
82+
defp optional_deps do
83+
for dep <- [:phoenix, :phoenix_html, :ecto, :plug] do
84+
case Mix.ProjectStack.peek() do
85+
%{config: config} -> {dep, Keyword.has_key?(config[:deps], dep)}
86+
_ -> {dep, true}
87+
end
88+
end
89+
end
90+
91+
defp paths_without_missing_optional_deps(optional_deps) do
92+
deps = optional_deps_missing(optional_deps)
93+
94+
"lib/**/*.ex"
95+
|> Path.wildcard()
96+
|> Enum.reject(&reject_deps_path?(deps, &1))
97+
end
98+
99+
defp reject_deps_path?(deps, path) do
100+
Enum.any?(deps, &String.contains?(path, "/#{elem(&1, 0)}"))
101+
end
57102

58103
defp package do
59104
[

test/mix_test.exs

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
defmodule Pow.MixTest do
2+
use ExUnit.Case
3+
4+
alias Pow.MixProject
5+
6+
test "elixirc_paths/1" do
7+
assert MixProject.elixirc_paths(:test, []) == ["lib", "test/support"]
8+
assert MixProject.elixirc_paths(:test, [phoenix: false]) == ["lib", "test/support"]
9+
10+
assert MixProject.elixirc_paths(:dev, []) == ["lib"]
11+
12+
assert paths = MixProject.elixirc_paths(:dev, [phoenix: false])
13+
refute some_paths?(paths, "/phoenix")
14+
assert some_paths?(paths, "/ecto")
15+
assert some_paths?(paths, "/plug")
16+
17+
assert paths = MixProject.elixirc_paths(:dev, [ecto: false, plug: false])
18+
assert some_paths?(paths, "/phoenix")
19+
refute some_paths?(paths, "/ecto")
20+
refute some_paths?(paths, "/plug")
21+
end
22+
23+
test "compilers/1" do
24+
compilers = [:yecc, :leex, :erlang, :elixir, :xref, :app]
25+
26+
assert MixProject.compilers([]) == compilers
27+
assert MixProject.compilers([{:phoenix, false}]) == compilers
28+
assert MixProject.compilers([{:phoenix, true}]) == [:phoenix] ++ compilers
29+
end
30+
31+
defp some_paths?(paths, path) do
32+
Enum.any?(paths, &(String.contains?(&1, path)))
33+
end
34+
end

0 commit comments

Comments
 (0)