Skip to content

Commit 80679ae

Browse files
committed
Accept groups descriptions from callback
1 parent e81a31b commit 80679ae

File tree

2 files changed

+78
-5
lines changed

2 files changed

+78
-5
lines changed

lib/ex_doc/retriever.ex

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -209,16 +209,29 @@ defmodule ExDoc.Retriever do
209209

210210
# Doc nodes already have normalized groups
211211
nodes_groups = Enum.map(doc_nodes, & &1.group)
212+
nodes_groups_descriptions = Map.new(nodes_groups, &{&1.title, &1.description})
212213

213214
normal_groups = module_groups ++ nodes_groups
214215

215216
{docs_groups, _} =
216-
Enum.flat_map_reduce(normal_groups, %{}, fn group, seen ->
217-
if is_map_key(seen, group.title) do
217+
Enum.flat_map_reduce(normal_groups, %{}, fn
218+
group, seen when is_map_key(seen, group.title) ->
218219
{[], seen}
219-
else
220-
{[group], Map.put(seen, group.title, true)}
221-
end
220+
221+
group, seen ->
222+
seen = Map.put(seen, group.title, group.description)
223+
224+
group =
225+
case group do
226+
%{description: nil} ->
227+
description = Map.get(nodes_groups_descriptions, group.title, nil)
228+
Map.put(group, :description, description)
229+
230+
_ ->
231+
group
232+
end
233+
234+
{[group], seen}
222235
end)
223236

224237
# We do not need the full group data in each doc node anymore, only the
@@ -351,6 +364,10 @@ defmodule ExDoc.Retriever do
351364
when is_binary(title) and (is_binary(description) or is_nil(description)) ->
352365
group
353366

367+
kw when is_list(kw) ->
368+
true = Keyword.keyword?(kw)
369+
%{title: Keyword.fetch!(kw, :title), description: kw[:description]}
370+
354371
title when is_binary(title) when is_atom(title) ->
355372
%{title: title, description: nil}
356373
end

test/ex_doc/retriever_test.exs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,62 @@ defmodule ExDoc.RetrieverTest do
108108
assert %{id: "baz/0", group: "c"} = baz
109109
end
110110

111+
test "default_group_for_doc can return group description from @moduledoc", c do
112+
elixirc(c, ~S"""
113+
defmodule A do
114+
115+
@moduledoc groups: [
116+
"c",
117+
%{title: "b", description: "predefined b"}
118+
]
119+
120+
@doc test_group: "a"
121+
@callback foo() :: :ok
122+
123+
@doc test_group: "b"
124+
def bar(), do: :ok
125+
126+
@doc test_group: "c"
127+
def baz(), do: :ok
128+
end
129+
""")
130+
131+
config = %ExDoc.Config{
132+
group_for_doc: fn meta ->
133+
case meta[:test_group] do
134+
"a" -> [title: "a", description: "for a"]
135+
"b" -> [title: "b", description: "ignored description"]
136+
"c" -> [title: "c", description: "for c"]
137+
end
138+
end
139+
}
140+
141+
{[mod], []} = Retriever.docs_from_modules([A], config)
142+
143+
assert [c, b, types, callbacks, functions, a] = mod.docs_groups
144+
145+
# Description returned by the function should override nil
146+
assert %{title: "c", description: "for c"} = c
147+
148+
# Description returned by the function should not override a
149+
# description from @moduledoc
150+
assert %{title: "b", description: "predefined b"} = b
151+
152+
assert %{title: "Types", description: nil} = types
153+
assert %{title: "Callbacks", description: nil} = callbacks
154+
assert %{title: "Functions", description: nil} = functions
155+
156+
# Description returned by th function should define a description
157+
# for leftover groups
158+
assert %{title: "a", description: "for a"} = a
159+
160+
[bar, baz, foo] = mod.docs
161+
162+
assert %{id: "c:foo/0", group: "a"} = foo
163+
assert %{id: "bar/0", group: "b"} = bar
164+
assert %{id: "baz/0", group: "c"} = baz
165+
end
166+
111167
test "function groups description use moduledoc :groups metadata", c do
112168
elixirc(c, ~S"""
113169
defmodule A do

0 commit comments

Comments
 (0)