Skip to content

Commit 0e84d5d

Browse files
committed
Fix docs generation with multiple source beams
1 parent a27002e commit 0e84d5d

File tree

7 files changed

+31
-30
lines changed

7 files changed

+31
-30
lines changed

lib/ex_doc.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ defmodule ExDoc do
2222
end
2323

2424
{module_nodes, filtered_nodes} = config.retriever.docs_from_dir(config.source_beam, config)
25-
find_formatter(config.formatter).run({module_nodes, filtered_nodes}, config)
25+
find_formatter(config.formatter).run(module_nodes, filtered_nodes, config)
2626
end
2727

2828
# Short path for programmatic interface

lib/ex_doc/formatter/epub.ex

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,8 @@ defmodule ExDoc.Formatter.EPUB do
88
@doc """
99
Generate EPUB documentation for the given modules.
1010
"""
11-
@spec run(list, ExDoc.Config.t()) :: String.t()
12-
def run(project_nodes, config) when is_list(project_nodes) and is_map(config) do
13-
run({project_nodes, []}, config)
14-
end
15-
16-
def run({project_nodes, filtered_modules}, config) when is_map(config) do
11+
@spec run([ExDoc.ModuleNode.t()], [ExDoc.ModuleNode.t()], ExDoc.Config.t()) :: String.t()
12+
def run(project_nodes, filtered_modules, config) when is_map(config) do
1713
parent = config.output
1814
config = normalize_config(config)
1915

lib/ex_doc/formatter/html.ex

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,8 @@ defmodule ExDoc.Formatter.HTML do
1010
@doc """
1111
Generate HTML documentation for the given modules.
1212
"""
13-
@spec run(
14-
[ExDoc.ModuleNode.t()]
15-
| {[ExDoc.ModuleNode.t()], [ExDoc.ModuleNode.t()]},
16-
ExDoc.Config.t()
17-
) :: String.t()
18-
19-
def run(project_nodes, config) when is_list(project_nodes) and is_map(config) do
20-
run({project_nodes, []}, config)
21-
end
22-
23-
def run({project_nodes, filtered_modules}, config) when is_map(config) do
13+
@spec run([ExDoc.ModuleNode.t()], [ExDoc.ModuleNode.t()], ExDoc.Config.t()) :: String.t()
14+
def run(project_nodes, filtered_modules, config) when is_map(config) do
2415
config = normalize_config(config)
2516
config = %{config | output: Path.expand(config.output)}
2617

lib/ex_doc/retriever.ex

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,25 @@ defmodule ExDoc.Retriever do
1919
@spec docs_from_dir(Path.t() | [Path.t()], ExDoc.Config.t()) ::
2020
{[ExDoc.ModuleNode.t()], [ExDoc.ModuleNode.t()]}
2121
def docs_from_dir(dir, config) when is_binary(dir) do
22-
files = Path.wildcard(Path.expand("*.beam", dir))
23-
24-
files
25-
|> Enum.map(&filename_to_module/1)
26-
|> docs_from_modules(config)
22+
dir
23+
|> docs_from_dir({[], []}, config)
24+
|> sort_modules(config)
2725
end
2826

2927
def docs_from_dir(dirs, config) when is_list(dirs) do
30-
Enum.flat_map(dirs, &docs_from_dir(&1, config))
28+
dirs
29+
|> Enum.reduce({[], []}, &docs_from_dir(&1, &2, config))
3130
|> sort_modules(config)
3231
end
3332

33+
defp docs_from_dir(dir, acc, config) do
34+
files = Path.wildcard(Path.expand("*.beam", dir))
35+
36+
files
37+
|> Enum.map(&filename_to_module/1)
38+
|> docs_from_modules(acc, config)
39+
end
40+
3441
@doc """
3542
Extract documentation from all modules and returns a tuple containing
3643
`{modules, filtered}`, two lists of modules that were extracted and filtered
@@ -39,8 +46,11 @@ defmodule ExDoc.Retriever do
3946
@spec docs_from_modules([atom], ExDoc.Config.t()) ::
4047
{[ExDoc.ModuleNode.t()], [ExDoc.ModuleNode.t()]}
4148
def docs_from_modules(modules, config) when is_list(modules) do
42-
modules
43-
|> Enum.reduce({[], []}, fn module_name, {modules, filtered} = acc ->
49+
modules |> docs_from_modules({[], []}, config) |> sort_modules(config)
50+
end
51+
52+
defp docs_from_modules(modules, acc, config) do
53+
Enum.reduce(modules, acc, fn module_name, {modules, filtered} = acc ->
4454
case get_module(module_name, config) do
4555
{:error, _module} ->
4656
acc
@@ -51,7 +61,6 @@ defmodule ExDoc.Retriever do
5161
else: {modules, [module_node | filtered]}
5262
end
5363
end)
54-
|> sort_modules(config)
5564
end
5665

5766
defp sort_modules({modules, filtered}, config) do

test/ex_doc/formatter/html/search_data_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ defmodule ExDoc.Formatter.HTML.SearchDataTest do
245245
defp search_data(modules, config) do
246246
{modules, []} = ExDoc.Retriever.docs_from_modules(modules, config)
247247

248-
ExDoc.Formatter.HTML.run(modules, config)
248+
ExDoc.Formatter.HTML.run(modules, [], config)
249249
[path] = Path.wildcard(Path.join([config.output, "dist", "search_data-*.js"]))
250250
"searchData=" <> json = File.read!(path)
251251
Jason.decode!(json)

test/ex_doc/retriever_test.exs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,11 @@ defmodule ExDoc.RetrieverTest do
206206
[%{id: "A"}, %{id: "A.A"}],
207207
[%{id: "B"}]
208208
} = Retriever.docs_from_dir(ebin_dir, config)
209+
210+
assert {
211+
[%{id: "A"}, %{id: "A.A"}],
212+
[%{id: "B"}]
213+
} = Retriever.docs_from_dir([ebin_dir], config)
209214
end
210215

211216
test "natural sorting", c do

test/ex_doc_test.exs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ defmodule ExDocTest do
1212

1313
# Simple formatter that returns whatever is passed into it
1414
defmodule IdentityFormatter do
15-
def run(modules, config) do
15+
def run(modules, _filtered, config) do
1616
{modules, config}
1717
end
1818
end
@@ -63,7 +63,7 @@ defmodule ExDocTest do
6363
source_beam: "beam_dir"
6464
]
6565

66-
assert {{source_dir, _retr_config}, _config} = ExDoc.generate_docs("Elixir", "1", options)
66+
assert {source_dir, _config} = ExDoc.generate_docs("Elixir", "1", options)
6767
assert source_dir == options[:source_beam]
6868
end
6969

0 commit comments

Comments
 (0)