Skip to content

Commit 65f141b

Browse files
committed
Link to the “current” docs from the package page.
1 parent 08ab962 commit 65f141b

File tree

6 files changed

+104
-8
lines changed

6 files changed

+104
-8
lines changed

Sources/App/Controllers/API/API+PackageController+GetRoute+Model.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ extension API.PackageController.GetRoute {
4545
var isArchived: Bool
4646
var hasBinaryTargets: Bool
4747
var homepageUrl: String?
48-
var documentationTarget: DocumentationTarget? = nil
48+
var currentDocumentationTarget: DocumentationTarget? = nil
4949
var weightedKeywords: [WeightedKeyword]
5050
var releaseReferences: [App.Version.Kind: App.Reference]
5151
var fundingLinks: [FundingLink]
@@ -75,7 +75,7 @@ extension API.PackageController.GetRoute {
7575
isArchived: Bool,
7676
hasBinaryTargets: Bool = false,
7777
homepageUrl: String? = nil,
78-
documentationTarget: DocumentationTarget? = nil,
78+
currentDocumentationTarget: DocumentationTarget? = nil,
7979
weightedKeywords: [WeightedKeyword] = [],
8080
defaultBranchReference: App.Reference,
8181
releaseReference: App.Reference?,
@@ -109,7 +109,7 @@ extension API.PackageController.GetRoute {
109109
self.isArchived = isArchived
110110
self.hasBinaryTargets = hasBinaryTargets
111111
self.homepageUrl = homepageUrl
112-
self.documentationTarget = documentationTarget
112+
self.currentDocumentationTarget = currentDocumentationTarget
113113
self.weightedKeywords = weightedKeywords
114114
self.releaseReferences = {
115115
var refs = [App.Version.Kind.defaultBranch: defaultBranchReference]
@@ -171,7 +171,7 @@ extension API.PackageController.GetRoute {
171171
isArchived: repository.isArchived,
172172
hasBinaryTargets: result.defaultBranchVersion.hasBinaryTargets,
173173
homepageUrl: repository.homepageUrl,
174-
documentationTarget: result.canonicalDocumentationTarget(),
174+
currentDocumentationTarget: result.currentDocumentationTarget(),
175175
weightedKeywords: weightedKeywords,
176176
defaultBranchReference: result.defaultBranchVersion.reference,
177177
releaseReference: result.releaseVersion?.reference,

Sources/App/Controllers/PackageController+PackageResult.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,16 @@ extension PackageController.PackageResult {
9090
preReleaseVersion?.model
9191
].canonicalDocumentationTarget()
9292
}
93+
94+
func currentDocumentationTarget() -> DocumentationTarget? {
95+
guard let target = canonicalDocumentationTarget()
96+
else { return nil }
97+
98+
switch target {
99+
case .external:
100+
return target
101+
case .internal(_, let archive):
102+
return .internal(docVersion: .current(referencing: nil), archive: archive)
103+
}
104+
}
93105
}

Sources/App/Views/PackageController/PackageShow+View.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ extension PackageShow {
274274
)
275275
)
276276
},
277-
.unwrap(model.documentationTarget) { target in
277+
.unwrap(model.currentDocumentationTarget) { target in
278278
.li(
279279
.a(
280280
.href(SiteURL.relativeURL(owner: model.repositoryOwner,

Tests/AppTests/API+PackageController+GetRoute+ModelTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class API_PackageController_GetRoute_ModelTests: SnapshotTestCase {
8989
swift6Readiness: nil))
9090

9191
// validate
92-
XCTAssertEqual(model.documentationTarget, .internal(docVersion: .reference("main"), archive: "archive1"))
92+
XCTAssertEqual(model.currentDocumentationTarget, .internal(docVersion: .reference("main"), archive: "archive1"))
9393
}
9494

9595
func test_init_external_documentation() async throws {
@@ -115,7 +115,7 @@ class API_PackageController_GetRoute_ModelTests: SnapshotTestCase {
115115
swift6Readiness: nil))
116116

117117
// validate
118-
XCTAssertEqual(model.documentationTarget, .external(url: "https://example.com/package/documentation"))
118+
XCTAssertEqual(model.currentDocumentationTarget, .external(url: "https://example.com/package/documentation"))
119119
}
120120

121121
func test_gitHubOwnerUrl() throws {

Tests/AppTests/PackageResultTests.swift

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,4 +285,88 @@ class PackageResultTests: AppTestCase {
285285
XCTAssertEqual(res.canonicalDocumentationTarget(), nil)
286286
}
287287
}
288+
289+
func test_currentDocumentationTarget() async throws {
290+
do {
291+
// Test package with branch docs and stable version docs
292+
let pkg = try savePackage(on: app.db, "1".url)
293+
try await Repository(package: pkg,
294+
defaultBranch: "main",
295+
forks: 42,
296+
license: .mit,
297+
name: "bar1",
298+
owner: "foo",
299+
stars: 17,
300+
summary: "summary").save(on: app.db)
301+
try await App.Version(package: pkg,
302+
docArchives: [.init(name: "archive1", title: "Archive 1")],
303+
latest: .defaultBranch,
304+
reference: .branch("main")).save(on: app.db)
305+
try await App.Version(package: pkg,
306+
// Note the name change on the default branch. The current should point to this archive.
307+
docArchives: [.init(name: "archive2", title: "Archive 2")],
308+
latest: .release,
309+
reference: .tag(1, 2, 3)).save(on: app.db)
310+
}
311+
312+
do {
313+
// Test package with only branch docs hosted externally.
314+
let pkg = try savePackage(on: app.db, "2".url)
315+
try await Repository(package: pkg,
316+
defaultBranch: "main",
317+
forks: 42,
318+
license: .mit,
319+
name: "bar2",
320+
owner: "foo",
321+
stars: 17,
322+
summary: "summary").save(on: app.db)
323+
try await App.Version(package: pkg,
324+
latest: .defaultBranch,
325+
reference: .branch("main"),
326+
spiManifest: .init(externalLinks: .init(documentation: "https://example.com"))).save(on: app.db)
327+
}
328+
329+
do {
330+
// Test package with no documentation
331+
let pkg = try savePackage(on: app.db, "3".url)
332+
try await Repository(package: pkg,
333+
defaultBranch: "main",
334+
forks: 42,
335+
license: .mit,
336+
name: "bar3",
337+
owner: "foo",
338+
stars: 17,
339+
summary: "summary").save(on: app.db)
340+
try await App.Version(package: pkg,
341+
latest: .defaultBranch,
342+
reference: .branch("main")).save(on: app.db)
343+
}
344+
345+
do {
346+
// Testing for internally hosted documentation pointing at the "current".
347+
let res = try await PackageController.PackageResult.query(on: app.db, owner: "foo", repository: "bar1")
348+
let currentTarget = try XCTUnwrap(res.currentDocumentationTarget())
349+
350+
// Validaton
351+
XCTAssertEqual(currentTarget, .internal(docVersion: .current(referencing: nil), archive: "archive2"))
352+
}
353+
354+
do {
355+
// Testing for `.external` case pass-through.
356+
let res = try await PackageController.PackageResult.query(on: app.db, owner: "foo", repository: "bar2")
357+
let currentTarget = try XCTUnwrap(res.currentDocumentationTarget())
358+
359+
// Validaton
360+
XCTAssertEqual(currentTarget, .external(url: "https://example.com"))
361+
}
362+
363+
do {
364+
// Testing for "no documentation" pass-through.
365+
let res = try await PackageController.PackageResult.query(on: app.db, owner: "foo", repository: "bar3")
366+
367+
// Validaton
368+
XCTAssertNil(res.currentDocumentationTarget())
369+
}
370+
}
371+
288372
}

Tests/AppTests/WebpageSnapshotTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ class WebpageSnapshotTests: SnapshotTestCase {
176176

177177
func test_PackageShowView_with_documentation_link() throws {
178178
var model = API.PackageController.GetRoute.Model.mock
179-
model.documentationTarget = .internal(docVersion: .reference("main"), archive: "archive")
179+
model.currentDocumentationTarget = .internal(docVersion: .reference("main"), archive: "archive")
180180
let page = { PackageShow.View(path: "", model: model, packageSchema: .mock).document() }
181181

182182
assertSnapshot(of: page, as: .html)

0 commit comments

Comments
 (0)