Skip to content

Commit 38c9b8a

Browse files
Fix wrong role assigned to technology-root articles (#744)
Fix the role of the Technology Root of Single Article-Only or Article-Only catalogs without any manual curation at the technology root. (closes #743). Previously, the article role was assigned to the technology root instead of the collection role in the corresponding JSON file of the documentation archive. * Added tests to validate the correct assignment of roles for this type of case. rdar://116419389
1 parent 81e3bf5 commit 38c9b8a

File tree

6 files changed

+83
-49
lines changed

6 files changed

+83
-49
lines changed

Sources/SwiftDocC/Model/Rendering/DocumentationContentRenderer.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,9 @@ public class DocumentationContentRenderer {
141141
default: break
142142
}
143143

144-
if article.topics?.taskGroups.isEmpty == false {
144+
let isTechnologyRoot = article.metadata?.technologyRoot != nil
145+
if article.topics?.taskGroups.isEmpty == false || isTechnologyRoot {
145146
// The documentation includes a "Topics" section, it's a collection or a group
146-
let isTechnologyRoot = article.metadata?.technologyRoot != nil
147147
return role(for: (isTechnologyRoot) ? .collection : .collectionGroup)
148148
} else {
149149
// The documentation is a plain article

Tests/SwiftDocCTests/Rendering/PageKindTests.swift

Lines changed: 41 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,12 @@ import XCTest
1414
@testable import SwiftDocC
1515

1616
class PageKindTests: XCTestCase {
17-
func testPageKindSampleCode() throws {
18-
let (bundle, context) = try testBundleAndContext(named: "SampleBundle")
17+
18+
private func generateRenderNodeFromBundle(bundleName: String, resolvedTopicPath: String) throws -> RenderNode {
19+
let (bundle, context) = try testBundleAndContext(named: bundleName)
1920
let reference = ResolvedTopicReference(
2021
bundleIdentifier: bundle.identifier,
21-
path: "/documentation/SampleBundle/MyLocalSample",
22+
path: resolvedTopicPath,
2223
sourceLanguage: .swift
2324
)
2425
let article = try XCTUnwrap(context.entity(with: reference).semantic as? Article)
@@ -28,70 +29,43 @@ class PageKindTests: XCTestCase {
2829
identifier: reference,
2930
source: nil
3031
)
31-
let renderNode = try XCTUnwrap(translator.visitArticle(article) as? RenderNode)
32-
32+
return try XCTUnwrap(translator.visitArticle(article) as? RenderNode)
33+
}
34+
35+
func testPageKindSampleCode() throws {
36+
let renderNode = try generateRenderNodeFromBundle(
37+
bundleName: "SampleBundle",
38+
resolvedTopicPath: "/documentation/SampleBundle/MyLocalSample"
39+
)
3340
XCTAssertEqual(renderNode.metadata.role, RenderMetadata.Role.sampleCode.rawValue)
3441
XCTAssertEqual(renderNode.metadata.roleHeading, Metadata.PageKind.Kind.sampleCode.titleHeading)
3542
}
3643

3744
func testPageKindArticle() throws {
38-
let (bundle, context) = try testBundleAndContext(named: "SampleBundle")
39-
let reference = ResolvedTopicReference(
40-
bundleIdentifier: bundle.identifier,
41-
path: "/documentation/SampleBundle/MySample",
42-
sourceLanguage: .swift
45+
let renderNode = try generateRenderNodeFromBundle(
46+
bundleName: "SampleBundle",
47+
resolvedTopicPath: "/documentation/SampleBundle/MySample"
4348
)
44-
let article = try XCTUnwrap(context.entity(with: reference).semantic as? Article)
45-
var translator = RenderNodeTranslator(
46-
context: context,
47-
bundle: bundle,
48-
identifier: reference,
49-
source: nil
50-
)
51-
let renderNode = try XCTUnwrap(translator.visitArticle(article) as? RenderNode)
5249

5350
XCTAssertEqual(renderNode.metadata.role, RenderMetadata.Role.article.rawValue)
5451
XCTAssertEqual(renderNode.metadata.roleHeading, Metadata.PageKind.Kind.article.titleHeading)
5552
}
5653

5754
func testPageKindDefault() throws {
58-
let (bundle, context) = try testBundleAndContext(named: "AvailabilityBundle")
59-
let reference = ResolvedTopicReference(
60-
bundleIdentifier: bundle.identifier,
61-
path: "/documentation/AvailabilityBundle/ComplexAvailable",
62-
sourceLanguage: .swift
55+
let renderNode = try generateRenderNodeFromBundle(
56+
bundleName: "AvailabilityBundle",
57+
resolvedTopicPath: "/documentation/AvailabilityBundle/ComplexAvailable"
6358
)
64-
let article = try XCTUnwrap(context.entity(with: reference).semantic as? Article)
65-
var translator = RenderNodeTranslator(
66-
context: context,
67-
bundle: bundle,
68-
identifier: reference,
69-
source: nil
70-
)
71-
let renderNode = try XCTUnwrap(translator.visitArticle(article) as? RenderNode)
72-
7359
XCTAssertEqual(renderNode.metadata.role, "article")
7460
XCTAssertEqual(renderNode.metadata.roleHeading, "Article")
7561
}
7662

7763
func testPageKindReference() throws {
78-
let (bundle, context) = try testBundleAndContext(named: "SampleBundle")
79-
let reference = ResolvedTopicReference(
80-
bundleIdentifier: bundle.identifier,
81-
path: "/documentation/SomeSample",
82-
sourceLanguage: .swift
83-
)
84-
let article = try XCTUnwrap(context.entity(with: reference).semantic as? Article)
85-
var translator = RenderNodeTranslator(
86-
context: context,
87-
bundle: bundle,
88-
identifier: reference,
89-
source: nil
64+
let renderNode = try generateRenderNodeFromBundle(
65+
bundleName: "SampleBundle",
66+
resolvedTopicPath: "/documentation/SomeSample"
9067
)
91-
let renderNode = try XCTUnwrap(translator.visitArticle(article) as? RenderNode)
92-
9368
let sampleReference = try XCTUnwrap(renderNode.references["doc://org.swift.docc.sample/documentation/SampleBundle/MyLocalSample"] as? TopicRenderReference)
94-
9569
XCTAssertEqual(sampleReference.role, RenderMetadata.Role.sampleCode.rawValue)
9670
}
9771

@@ -118,4 +92,24 @@ class PageKindTests: XCTestCase {
11892
XCTAssert(problems.isEmpty)
11993
}
12094
}
95+
96+
// Verify that we assign the `Collection` role to the root article of a
97+
// documentation catalog that contains only one article.
98+
func testRoleForSingleArticleCatalog() throws {
99+
let renderNode = try generateRenderNodeFromBundle(
100+
bundleName: "BundleWithSingleArticle",
101+
resolvedTopicPath: "/documentation/Article"
102+
)
103+
XCTAssertEqual(renderNode.metadata.role, RenderMetadata.Role.collection.rawValue)
104+
}
105+
106+
// Verify we assign the `Collection` role to the root article of an article-only
107+
// documentation catalog that doesn't include manual curation
108+
func testRoleForArticleOnlyCatalogWithNoCuration() throws {
109+
let renderNode = try generateRenderNodeFromBundle(
110+
bundleName: "BundleWithArticlesNoCurated",
111+
resolvedTopicPath: "/documentation/Article"
112+
)
113+
XCTAssertEqual(renderNode.metadata.role, RenderMetadata.Role.collection.rawValue)
114+
}
121115
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Article
2+
3+
@Metadata {
4+
@TechnologyRoot
5+
}
6+
7+
Add a single sentence or sentence fragment, which DocC uses as the page’s abstract or summary.
8+
9+
## Overview
10+
11+
Add one or more paragraphs that introduce your content overview.
12+
13+
<!-- Copyright (c) 2023 Apple Inc and the Swift Project authors. All Rights Reserved. -->
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# Getting Started
2+
3+
Summary
4+
5+
Overview
6+
7+
<!-- Copyright (c) 2023 Apple Inc and the Swift Project authors. All Rights Reserved. -->
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# More Information
2+
3+
Summary
4+
5+
Overview
6+
7+
<!-- Copyright (c) 2023 Apple Inc and the Swift Project authors. All Rights Reserved. -->
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Article
2+
3+
@Metadata {
4+
@TechnologyRoot
5+
}
6+
7+
This is an article.
8+
9+
## Overview
10+
11+
Overview
12+
13+
<!-- Copyright (c) 2023 Apple Inc and the Swift Project authors. All Rights Reserved. -->

0 commit comments

Comments
 (0)