Skip to content

Commit 36eb55f

Browse files
committed
compute grouped docs summary in retriever
1 parent 1f9803c commit 36eb55f

File tree

10 files changed

+56
-89
lines changed

10 files changed

+56
-89
lines changed

lib/ex_doc/formatter/epub/templates/module_template.eex

Lines changed: 3 additions & 3 deletions
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 %>

lib/ex_doc/formatter/html.ex

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -87,33 +87,32 @@ defmodule ExDoc.Formatter.HTML do
8787
language: language
8888
] ++ base
8989

90-
docs =
91-
for child_node <- node.docs do
92-
id = id(node, child_node)
93-
94-
autolink_opts =
95-
autolink_opts ++
96-
[
97-
id: id,
98-
line: child_node.doc_line,
99-
file: child_node.doc_file,
100-
current_kfa: {child_node.type, child_node.name, child_node.arity}
101-
]
102-
103-
specs = Enum.map(child_node.specs, &language.autolink_spec(&1, autolink_opts))
104-
child_node = %{child_node | specs: specs}
105-
render_doc(child_node, language, autolink_opts, opts)
106-
end
107-
10890
docs_groups =
10991
for group <- node.docs_groups do
110-
render_doc(group, language, autolink_opts, opts)
92+
docs =
93+
for child_node <- group.docs do
94+
id = id(node, child_node)
95+
96+
autolink_opts =
97+
autolink_opts ++
98+
[
99+
id: id,
100+
line: child_node.doc_line,
101+
file: child_node.doc_file,
102+
current_kfa: {child_node.type, child_node.name, child_node.arity}
103+
]
104+
105+
specs = Enum.map(child_node.specs, &language.autolink_spec(&1, autolink_opts))
106+
child_node = %{child_node | specs: specs}
107+
render_doc(child_node, language, autolink_opts, opts)
108+
end
109+
110+
%{render_doc(group, language, autolink_opts, opts) | docs: docs}
111111
end
112112

113113
%{
114114
render_doc(node, language, [{:id, node.id} | autolink_opts], opts)
115-
| docs: docs,
116-
docs_groups: docs_groups
115+
| docs_groups: docs_groups
117116
}
118117
end,
119118
timeout: :infinity

lib/ex_doc/formatter/html/templates.ex

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,9 @@ defmodule ExDoc.Formatter.HTML.Templates do
123123
{id, modules}
124124
end
125125

126-
defp sidebar_entries({group, nodes}) do
126+
defp sidebar_entries(group) do
127127
nodes =
128-
for node <- nodes do
128+
for node <- group.docs do
129129
id =
130130
if "struct" in node.annotations do
131131
node.signature
@@ -153,17 +153,7 @@ defmodule ExDoc.Formatter.HTML.Templates do
153153
end)
154154
end
155155

156-
def module_summary(module_node) do
157-
# TODO: Maybe it should be moved to retriever and it already returned grouped metadata
158-
159-
group_titles = Enum.map(module_node.docs_groups, & &1.title)
160-
groups_index = Map.new(module_node.docs_groups, &{&1.title, &1})
161-
docs_groups = ExDoc.GroupMatcher.group_by(group_titles, module_node.docs, & &1.group)
162-
163-
Enum.map(docs_groups, fn {group_title, nodes} ->
164-
{Map.fetch!(groups_index, group_title), nodes}
165-
end)
166-
end
156+
def module_summary(module_node), do: module_node.docs_groups
167157

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

lib/ex_doc/formatter/html/templates/module_template.eex

Lines changed: 3 additions & 3 deletions
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 %>

lib/ex_doc/group_matcher.ex

Lines changed: 0 additions & 17 deletions
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
"""

lib/ex_doc/nodes.ex

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ defmodule ExDoc.DocNode do
8383
source_doc: term() | nil,
8484
type: atom(),
8585
signature: String.t(),
86-
specs: [ExDoc.Language.spec_ast()],
86+
specs: [ExDoc.Language.spec_ast() | String.t()],
8787
annotations: [annotation()],
8888
group: String.t() | nil,
8989
doc_file: String.t(),
@@ -93,12 +93,13 @@ defmodule ExDoc.DocNode do
9393
end
9494

9595
defmodule ExDoc.DocGroupNode do
96-
defstruct title: nil, description: nil, doc: nil, rendered_doc: nil
96+
defstruct title: nil, description: nil, doc: nil, rendered_doc: nil, docs: []
9797

9898
@type t :: %__MODULE__{
9999
title: String.t() | atom(),
100100
description: String.t() | nil,
101101
doc: ExDoc.DocAST.t() | nil,
102-
rendered_doc: String.t() | nil
102+
rendered_doc: String.t() | nil,
103+
docs: [ExDoc.DocNode.t()]
103104
}
104105
end

lib/ex_doc/retriever.ex

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -141,14 +141,16 @@ defmodule ExDoc.Retriever do
141141
group_for_doc = config.group_for_doc
142142
annotations_for_docs = config.annotations_for_docs
143143

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

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

148149
docs_groups =
149150
get_docs_groups(
150151
moduledoc_groups ++ config.docs_groups ++ module_data.default_groups,
151-
docs_groups
152+
nodes_groups,
153+
docs
152154
)
153155

154156
metadata = Map.put(metadata, :kind, module_data.type)
@@ -165,8 +167,9 @@ defmodule ExDoc.Retriever do
165167
type: module_data.type,
166168
deprecated: metadata[:deprecated],
167169
docs_groups: docs_groups,
168-
docs: ExDoc.Utils.natural_sort_by(docs, &"#{&1.name}/#{&1.arity}"),
169-
doc: normalize_doc_ast(doc_ast, "module-"),
170+
docs: docs,
171+
doc_format: format,
172+
doc: doc,
170173
source_doc: source_doc,
171174
source_format: format,
172175
moduledoc_line: doc_line,
@@ -281,13 +284,14 @@ defmodule ExDoc.Retriever do
281284
end)
282285
end
283286

284-
defp get_docs_groups(module_groups, nodes_groups) do
287+
defp get_docs_groups(module_groups, nodes_groups, doc_nodes) do
285288
module_groups = Enum.map(module_groups, &normalize_group/1)
286289

287290
# Doc nodes already have normalized groups
288291
nodes_groups_descriptions = Map.new(nodes_groups, &{&1.title, &1.description})
289292

290293
normal_groups = module_groups ++ nodes_groups
294+
nodes_by_group_title = Enum.group_by(doc_nodes, & &1.group)
291295

292296
{docs_groups, _} =
293297
Enum.flat_map_reduce(normal_groups, %{}, fn
@@ -296,14 +300,21 @@ defmodule ExDoc.Retriever do
296300

297301
group, seen ->
298302
seen = Map.put(seen, group.title, true)
299-
group = finalize_group(group, nodes_groups_descriptions)
300-
{[group], seen}
303+
304+
case Map.get(nodes_by_group_title, group.title, []) do
305+
[] ->
306+
{[], seen}
307+
308+
child_nodes ->
309+
group = finalize_group(group, child_nodes, nodes_groups_descriptions)
310+
{[group], seen}
311+
end
301312
end)
302313

303314
docs_groups
304315
end
305316

306-
defp finalize_group(group, description_fallbacks) do
317+
defp finalize_group(group, doc_nodes, description_fallbacks) do
307318
description =
308319
case group.description do
309320
nil -> Map.get(description_fallbacks, group.title)
@@ -320,7 +331,7 @@ defmodule ExDoc.Retriever do
320331
title: group.title,
321332
description: description,
322333
doc: doc_ast,
323-
rendered_doc: nil
334+
docs: doc_nodes
324335
}
325336
end
326337

test/ex_doc/group_matcher_test.exs

Lines changed: 0 additions & 10 deletions
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 = [

test/ex_doc/retriever/erlang_test.exs

Lines changed: 2 additions & 2 deletions
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,
@@ -393,7 +393,7 @@ defmodule ExDoc.Retriever.ErlangTest do
393393
deprecated: nil,
394394
moduledoc_line: _,
395395
docs: [function1, function2],
396-
docs_groups: [%{title: "Types"}, %{title: "Callbacks"}, %{title: "Functions"}],
396+
docs_groups: [%{title: "Functions"}],
397397
group: nil,
398398
id: "mod",
399399
language: ExDoc.Language.Erlang,

test/ex_doc/retriever_test.exs

Lines changed: 1 addition & 8 deletions
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)