Skip to content

Commit e3e0dcc

Browse files
committed
Add optional dependency load
1 parent 378ee4c commit e3e0dcc

File tree

2 files changed

+83
-4
lines changed

2 files changed

+83
-4
lines changed

mix.exs

Lines changed: 49 additions & 4 deletions
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
@@ -49,8 +49,53 @@ defmodule Pow.MixProject do
4949
]
5050
end
5151

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

55100
defp package do
56101
[

test/mix_test.exs

Lines changed: 34 additions & 0 deletions
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)