Skip to content

Commit aed460e

Browse files
committed
compute grouped docs summary in retriever
1 parent b5fcc4d commit aed460e

File tree

10 files changed

+54
-88
lines changed

10 files changed

+54
-88
lines changed

Diff for: lib/ex_doc/formatter/epub/templates/module_template.eex

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818
<%= if summary != [] do %>
1919
<section id="summary" class="details-list">
2020
<h1 class="section-heading">Summary</h1>
21-
<%= for {group, nodes} <- summary, do: H.summary_template(group.title, nodes) %>
21+
<%= for group <- summary, do: H.summary_template(group.title, group.docs) %>
2222
</section>
2323
<% end %>
2424

25-
<%= for {group, nodes} <- summary, key = text_to_id(group.title) do %>
25+
<%= for group <- summary, key = text_to_id(group.title) do %>
2626
<section id="<%= key %>" class="details-list">
2727
<h1 class="section-heading"><%=h to_string(group.title) %></h1>
2828
<%= if doc = group.rendered_doc do %>
@@ -31,7 +31,7 @@
3131
</div>
3232
<% end %>
3333
<div class="<%= key %>-list">
34-
<%= for node <- nodes, do: H.detail_template(node, module) %>
34+
<%= for node <- group.docs, do: H.detail_template(node, module) %>
3535
</div>
3636
</section>
3737
<% end %>

Diff for: lib/ex_doc/formatter/html.ex

+20-21
Original file line numberDiff line numberDiff line change
@@ -93,33 +93,32 @@ defmodule ExDoc.Formatter.HTML do
9393
language: language
9494
] ++ base
9595

96-
docs =
97-
for child_node <- node.docs do
98-
id = id(node, child_node)
99-
100-
autolink_opts =
101-
autolink_opts ++
102-
[
103-
id: id,
104-
line: child_node.doc_line,
105-
file: child_node.doc_file,
106-
current_kfa: {child_node.type, child_node.name, child_node.arity}
107-
]
108-
109-
specs = Enum.map(child_node.specs, &language.autolink_spec(&1, autolink_opts))
110-
child_node = %{child_node | specs: specs}
111-
render_doc(child_node, language, autolink_opts, opts)
112-
end
113-
11496
docs_groups =
11597
for group <- node.docs_groups do
116-
render_doc(group, language, autolink_opts, opts)
98+
docs =
99+
for child_node <- group.docs do
100+
id = id(node, child_node)
101+
102+
autolink_opts =
103+
autolink_opts ++
104+
[
105+
id: id,
106+
line: child_node.doc_line,
107+
file: child_node.doc_file,
108+
current_kfa: {child_node.type, child_node.name, child_node.arity}
109+
]
110+
111+
specs = Enum.map(child_node.specs, &language.autolink_spec(&1, autolink_opts))
112+
child_node = %{child_node | specs: specs}
113+
render_doc(child_node, language, autolink_opts, opts)
114+
end
115+
116+
%{render_doc(group, language, autolink_opts, opts) | docs: docs}
117117
end
118118

119119
%{
120120
render_doc(node, language, [{:id, node.id} | autolink_opts], opts)
121-
| docs: docs,
122-
docs_groups: docs_groups
121+
| docs_groups: docs_groups
123122
}
124123
end,
125124
timeout: :infinity

Diff for: lib/ex_doc/formatter/html/templates.ex

+3-13
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,9 @@ defmodule ExDoc.Formatter.HTML.Templates do
115115
{id, modules}
116116
end
117117

118-
defp sidebar_entries({group, nodes}) do
118+
defp sidebar_entries(group) do
119119
nodes =
120-
for node <- nodes do
120+
for node <- group.docs do
121121
id =
122122
if "struct" in node.annotations do
123123
node.signature
@@ -167,17 +167,7 @@ defmodule ExDoc.Formatter.HTML.Templates do
167167
|> Enum.map(&%{id: &1, anchor: URI.encode(text_to_id(&1))})
168168
end
169169

170-
def module_summary(module_node) do
171-
# TODO: Maybe it should be moved to retriever and it already returned grouped metadata
172-
173-
group_titles = Enum.map(module_node.docs_groups, & &1.title)
174-
groups_index = Map.new(module_node.docs_groups, &{&1.title, &1})
175-
docs_groups = ExDoc.GroupMatcher.group_by(group_titles, module_node.docs, & &1.group)
176-
177-
Enum.map(docs_groups, fn {group_title, nodes} ->
178-
{Map.fetch!(groups_index, group_title), nodes}
179-
end)
180-
end
170+
def module_summary(module_node), do: module_node.docs_groups
181171

182172
defp favicon_path(%{favicon: nil}), do: nil
183173
defp favicon_path(%{favicon: favicon}), do: "assets/favicon#{Path.extname(favicon)}"

Diff for: lib/ex_doc/formatter/html/templates/module_template.eex

+3-3
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@
3939
</a>
4040
<span class="text">Summary</span>
4141
</h1>
42-
<%= for {group, nodes} <- summary, do: summary_template(group.title, nodes) %>
42+
<%= for group <- summary, do: summary_template(group.title, group.docs) %>
4343
</section>
4444
<% end %>
4545

46-
<%= for {group, nodes} <- summary, key = text_to_id(group.title) do %>
46+
<%= for group <- summary, key = text_to_id(group.title) do %>
4747
<section id="<%= key %>" class="details-list">
4848
<h1 class="section-heading">
4949
<a class="hover-link" href="#<%= key %>">
@@ -57,7 +57,7 @@
5757
</div>
5858
<% end %>
5959
<div class="<%= key %>-list">
60-
<%= for node <- nodes, do: detail_template(node, module) %>
60+
<%= for node <- group.docs, do: detail_template(node, module) %>
6161
</div>
6262
</section>
6363
<% end %>

Diff for: lib/ex_doc/group_matcher.ex

-17
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,6 @@ defmodule ExDoc.GroupMatcher do
1414
Enum.find_index(groups, fn {k, _v} -> k == group end) || -1
1515
end
1616

17-
@doc """
18-
Group the following entries while preserving the order in `groups`.
19-
"""
20-
def group_by(groups, entries, by) do
21-
entries = Enum.group_by(entries, by)
22-
23-
{groups, leftovers} =
24-
Enum.flat_map_reduce(groups, entries, fn group, grouped_nodes ->
25-
case Map.pop(grouped_nodes, group, []) do
26-
{[], grouped_nodes} -> {[], grouped_nodes}
27-
{entries, grouped_nodes} -> {[{group, entries}], grouped_nodes}
28-
end
29-
end)
30-
31-
groups ++ Enum.sort(leftovers)
32-
end
33-
3417
@doc """
3518
Finds a matching group for the given module name, id, and metadata.
3619
"""

Diff for: lib/ex_doc/nodes.ex

+4-3
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ defmodule ExDoc.DocNode do
8787
rendered_doc: String.t() | nil,
8888
type: atom(),
8989
signature: String.t(),
90-
specs: [ExDoc.Language.spec_ast()],
90+
specs: [ExDoc.Language.spec_ast() | String.t()],
9191
annotations: [annotation()],
9292
group: String.t() | nil,
9393
doc_file: String.t(),
@@ -97,12 +97,13 @@ defmodule ExDoc.DocNode do
9797
end
9898

9999
defmodule ExDoc.DocGroupNode do
100-
defstruct title: nil, description: nil, doc: nil, rendered_doc: nil
100+
defstruct title: nil, description: nil, doc: nil, rendered_doc: nil, docs: []
101101

102102
@type t :: %__MODULE__{
103103
title: String.t() | atom(),
104104
description: String.t() | nil,
105105
doc: ExDoc.DocAST.t() | nil,
106-
rendered_doc: String.t() | nil
106+
rendered_doc: String.t() | nil,
107+
docs: [ExDoc.DocNode.t()]
107108
}
108109
end

Diff for: lib/ex_doc/retriever.ex

+18-8
Original file line numberDiff line numberDiff line change
@@ -140,14 +140,16 @@ defmodule ExDoc.Retriever do
140140
group_for_doc = config.group_for_doc
141141
annotations_for_docs = config.annotations_for_docs
142142

143-
{docs, docs_groups} = get_docs(module_data, source, group_for_doc, annotations_for_docs)
143+
{docs, nodes_groups} = get_docs(module_data, source, group_for_doc, annotations_for_docs)
144+
docs = ExDoc.Utils.natural_sort_by(docs, &"#{&1.name}/#{&1.arity}")
144145

145146
moduledoc_groups = Map.get(metadata, :groups, [])
146147

147148
docs_groups =
148149
get_docs_groups(
149150
moduledoc_groups ++ config.docs_groups ++ module_data.default_groups,
150-
docs_groups
151+
nodes_groups,
152+
docs
151153
)
152154

153155
metadata = Map.put(metadata, :kind, module_data.type)
@@ -164,7 +166,7 @@ defmodule ExDoc.Retriever do
164166
type: module_data.type,
165167
deprecated: metadata[:deprecated],
166168
docs_groups: docs_groups,
167-
docs: ExDoc.Utils.natural_sort_by(docs, &"#{&1.name}/#{&1.arity}"),
169+
docs: docs,
168170
doc_format: format,
169171
doc: doc,
170172
source_doc: source_doc,
@@ -274,13 +276,14 @@ defmodule ExDoc.Retriever do
274276
end)
275277
end
276278

277-
defp get_docs_groups(module_groups, nodes_groups) do
279+
defp get_docs_groups(module_groups, nodes_groups, doc_nodes) do
278280
module_groups = Enum.map(module_groups, &normalize_group/1)
279281

280282
# Doc nodes already have normalized groups
281283
nodes_groups_descriptions = Map.new(nodes_groups, &{&1.title, &1.description})
282284

283285
normal_groups = module_groups ++ nodes_groups
286+
nodes_by_group_title = Enum.group_by(doc_nodes, & &1.group)
284287

285288
{docs_groups, _} =
286289
Enum.flat_map_reduce(normal_groups, %{}, fn
@@ -289,14 +292,21 @@ defmodule ExDoc.Retriever do
289292

290293
group, seen ->
291294
seen = Map.put(seen, group.title, true)
292-
group = finalize_group(group, nodes_groups_descriptions)
293-
{[group], seen}
295+
296+
case Map.get(nodes_by_group_title, group.title, []) do
297+
[] ->
298+
{[], seen}
299+
300+
child_nodes ->
301+
group = finalize_group(group, child_nodes, nodes_groups_descriptions)
302+
{[group], seen}
303+
end
294304
end)
295305

296306
docs_groups
297307
end
298308

299-
defp finalize_group(group, description_fallbacks) do
309+
defp finalize_group(group, doc_nodes, description_fallbacks) do
300310
description =
301311
case group.description do
302312
nil -> Map.get(description_fallbacks, group.title)
@@ -313,7 +323,7 @@ defmodule ExDoc.Retriever do
313323
title: group.title,
314324
description: description,
315325
doc: doc_ast,
316-
rendered_doc: nil
326+
docs: doc_nodes
317327
}
318328
end
319329

Diff for: test/ex_doc/group_matcher_test.exs

-10
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,6 @@ defmodule ExDoc.GroupMatcherTest do
22
use ExUnit.Case, async: true
33
import ExDoc.GroupMatcher
44

5-
describe "group_by" do
6-
test "group by given data with leftovers" do
7-
assert group_by([1, 3, 5], [%{key: 1}, %{key: 3}, %{key: 2}], & &1.key) == [
8-
{1, [%{key: 1}]},
9-
{3, [%{key: 3}]},
10-
{2, [%{key: 2}]}
11-
]
12-
end
13-
end
14-
155
describe "module matching" do
166
test "by atom names" do
177
patterns = [

Diff for: test/ex_doc/retriever/erlang_test.exs

+2-2
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ defmodule ExDoc.Retriever.ErlangTest do
5959
moduledoc_line: 2,
6060
moduledoc_file: moduledoc_file,
6161
docs: [equiv_function2, function1, function2],
62-
docs_groups: [%{title: "Types"}, %{title: "Callbacks"}, %{title: "Functions"}],
62+
docs_groups: [%{title: "Functions"}],
6363
group: nil,
6464
id: "mod",
6565
language: ExDoc.Language.Erlang,
@@ -397,7 +397,7 @@ defmodule ExDoc.Retriever.ErlangTest do
397397
deprecated: nil,
398398
moduledoc_line: _,
399399
docs: [function1, function2],
400-
docs_groups: [%{title: "Types"}, %{title: "Callbacks"}, %{title: "Functions"}],
400+
docs_groups: [%{title: "Functions"}],
401401
group: nil,
402402
id: "mod",
403403
language: ExDoc.Language.Erlang,

Diff for: test/ex_doc/retriever_test.exs

+1-8
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ defmodule ExDoc.RetrieverTest do
140140

141141
{[mod], []} = Retriever.docs_from_modules([A], config)
142142

143-
assert [c, b, types, callbacks, functions, a] = mod.docs_groups
143+
assert [c, b, a] = mod.docs_groups
144144

145145
# Description returned by the function should override nil
146146
assert %{title: "c", description: "for c"} = c
@@ -149,10 +149,6 @@ defmodule ExDoc.RetrieverTest do
149149
# description from @moduledoc
150150
assert %{title: "b", description: "predefined b"} = b
151151

152-
assert %{title: "Types", description: nil} = types
153-
assert %{title: "Callbacks", description: nil} = callbacks
154-
assert %{title: "Functions", description: nil} = functions
155-
156152
# Description returned by th function should define a description
157153
# for leftover groups
158154
assert %{title: "a", description: "for a"} = a
@@ -189,9 +185,6 @@ defmodule ExDoc.RetrieverTest do
189185
assert [
190186
%{description: nil, title: "c"},
191187
%{description: "text for b", title: "b"},
192-
%{description: nil, title: "Types"},
193-
%{description: nil, title: "Callbacks"},
194-
%{description: nil, title: "Functions"},
195188
%{description: nil, title: "a"}
196189
] = mod.docs_groups
197190
end

0 commit comments

Comments
 (0)